Projects
Games
libretro-mame2003
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 4
View file
libretro-mame2003.changes
Changed
@@ -1,4 +1,240 @@ ------------------------------------------------------------------- +Tue Jun 01 13:22:46 UTC 2021 - i@guoyunhe.me + +- Update to version 0~git20210529: + * resync + * Contra protection improvements (#482) + * Remove libflac and zlib parts that we don't need + * OpenDingux support (#481) + * resync libretro-common + * mip3 + * tms34010 + * TMNT audio decoding + * umk3 bootstrapped + * Whitespaces + * Pal5bit color (#480) + * pal5bit midtunit + * Remove extra eob + * Fix for Sega's Hang-On (#478) + * A small fix for Hang-On Sprites (#479) + * List compatibility table + * White space + * Spacing cleanup + * Add ios-arm64/tvos-arm64 + * patch umk3p coin glitch + * Cclimbr2 (#476) + * Diverboy (#475) + * Cheekyms sound improvements (#474) + * Remove tag + * Update .gitlab-ci.yml + * Update .gitlab-ci.yml + * (MSVC) Embed MSVCR runtime + * Format make + * Add MSVC 2005/2010 targets + * Format Makefile + * Rot180 confirmed [Corrado Tomaselli] (#473) + * Shallow dips / inputs + * Journey inputs / dips + * (macOS) Set up CROSS_COMPILE for ARM 64bit + * Add MacOS PowerPC 32-bit (#472) + * White space removal + * (Mac) Detection of 'lesser than Mavericks' was wrong + * Add rule to only add this compatibility flag is OSX version is below Mavericks + * (macOS) Add x64 and arm64 targets + * Update .gitlab-ci.yml + * fix videoram oob access + * Update mame2003.xml + * add imperfect graphics + * Add Raspberry Pi 4 (AArch64) + * Update .gitlab-ci.yml + * Remove extra comment + * Update Makefile + * Format make + * Add psp build + * Only match when found in driver list + * Clean up + * house keeping + * precompile + * comment out imago + * clean up + * Getstar (#471) + * Update .gitlab-ci.yml + * Cheekyms color (#470) + * Galaxian star color range (#469) + * Pull wii + * Update .gitlab-ci.yml + * Cleanup + * apply_RC_filter audio fix + * Light cleanup + * Remove mwup for wiiu + * Update .gitlab-ci.yml + * Update .gitlab-ci.yml + * Speedspn fixed + * Speedspn fix garbage sprites + * Funybubl sound and color fix + * Sbowling color fix + * Res_net upgrades + * Findout fix colors + * Newsin7 color fix + * Comment out mac for now + * Try to fix yet another implicit declaration error on OSX + * Update + * Use auto_strdup + * Update + * Update + * Push even further + * Compile as C99 for OSX - strdup is not available in C89 and it makes little sense to compile it as C89 for Mac anyway + * Use sprintf here to get around the compilation errors + * Update safarir.c + * Update mame2003.c + * Update mame2003.c + * Update .gitlab-ci.yml + * add samples back in + * List samples for now + * M92 temp fix + * Revert 1 color change. + * fix array bounds issue + * fix array bounds issue + * Update flicker + * Update note + * Fix colors and clock statriv2.c + * Bagman is 4way + * Set default + * Configure pedals + * Configure pedals + * Platforms specific rpi0 rpi1 + * Fix + * offroadc bootstrap enhancement + * crusnusa bootstrap enhancement + * vroom vroom gas pedal sensitivity + * Update mame2003.xml + * Fix mistake + * Space, ost + * Update common.c + * Dat improvements + * Ost tag + * bootstrap crusnu21 crusnu40 + * offroadc update, working, bootstrapped. - arcadeez + * Fix overflows + * crusnusa bootstrap + * Brake is pedal2 + * Reduce volume some + * Set default + * Record time speed + * live pipeline + * Update README.md + * Update README.md + * Max players allowed. 4 players + * Thunder Cross Fix collisions - port from plus - arcadeez + * update naming convention to 2003 + * space + * Superior Soldiers sound reset m92 + * Update palette.h + * Fix sound FX in Chouji Meikyuu Legion [Nichibutsu] + * ports from plus + * Update + * Add .gitlab-ci.yml + * libretro-common sync + * viostorm hiscore.dat names + * Max players + * 3 players on + * max players allowed + * viostorm viostrmj viostrma bootstrap blood + * fcommon vita / libnx + * Sync to plus + * Don't remove slash at root + * X-Men Euro description + * format spacing + * Popeye video fix - arcadeez port from plus + * carnevil bootstrap + * nslashers blood bootstrap + * revert + * Update mame2003.xml + * reduce sensitivity of start trog controls + * declare / meta + * night slashers fixup + * shimpact shimpacp working + * hiimpact shimpact shimpacp bootstrap + * Enhancement to fileio + * fix wiiu directory creation + * Add slash removal for windows + * lib-common update + * updates for libretro common + * libretro common + * Small fix Athena + * typo + * Update mame2003.xml + * CHD ERRORS + * more logging + * add logging + * Typo + * Pointer doesn't need return + * Remove condition - trailing slash removal beta + * wii path altered + * Log new line + * trailing slash beta + * fileio spacing sync to plus + * precompile + * Small fix + * fix trailing slash in path + * Port from 2003plus + * Update catver.ini + * Update driver.c + * success joe added + * rom name dadandrn + * Fix speech and sfx sample playback for Ashita no Joe [arcadez ported] + * luckywld bootstrapped and port fix + * Update mame2003.xml + * mmaulers is now parent + * Update mame2003.xml + * Update midwunit.c + * Update mame2003.xml + * mk2p / umk3p bootstrap + * Umk3 graphics fix dink / arcadez2003 + * Description + * Update midtunit.c + * mk2p and umk3p support + * nbajam bootstrap + * totcarn bootstrap + * Update midyunit.c + * use correct bindings + * trog bootstrap support + * Remove gauntlet from dat + * Captcomm + * ddsom bootstrap + * Update README.md + * Lgtm + * Lgtm + * Loop bug fix + * Update midwunit.c + * wwfmania volume + * 8 new bootstraps + * Update midxunit.c + * Update midyunit.c + * Update midyunit.c + * Update midyunit.c + * Update mame2003.xml + * Update mystwarr.c + * mmaulers + * Update bootstrap.c + * Update bootstrap.c + * dcs reset set actice low + * rmpgwt bootstrap + * Update bootstrap.c + * Update taito_f3.c + * Update midtunit.c + * Update avengrgs.c + * Update qix.c + * Update foodf.c + * Update eeprom.c + * Update rungun.c + * Update mystwarr.c + * Update midyunit.c + * Update midxunit.c + * Update bootstrap.h + * Update bootstrap.c + +------------------------------------------------------------------- Sun Aug 09 11:18:23 UTC 2020 - i@guoyunhe.me - Update to version 0~git20200805:
View file
libretro-mame2003.spec
Changed
@@ -17,7 +17,7 @@ Name: libretro-mame2003 -Version: 0~git20200805 +Version: 0~git20210529 Release: 0 Summary: MAME 2003 libretro core for arcade emulation License: NonFree
View file
_servicedata
Changed
@@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/libretro/mame2003-libretro.git</param> - <param name="changesrevision">6e3f0bc76a7b60737826fa09714ea182d0cddb55</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">4be24e363b4979692046a6620dd20e3156568f97</param></service></servicedata> \ No newline at end of file
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/zlib/compress.c
Deleted
@@ -1,70 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include <zlib.h> - -/* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. - */ -int ZEXPORT compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) -{ - z_stream stream; - int err; - - stream.next_in = (Bytef *)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = Z_NULL; - stream.zfree = Z_NULL; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== -*/ -int ZEXPORT compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} - -/* =========================================================================== - If the default memLevel or windowBits for deflateInit() is changed, then - this function needs to be updated. - */ -uLong ZEXPORT compressBound (uLong sourceLen) -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13; -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/zlib/gzclose.c
Deleted
@@ -1,27 +0,0 @@ -/* gzclose.c -- zlib gzclose() function - * Copyright (C) 2004, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -extern int gzclose_w(gzFile file); -extern int gzclose_r(gzFile file); - -/* gzclose() is in a separate file so that it is linked in only if it is used. - That way the other gzclose functions can be used instead to avoid linking in - unneeded compression or decompression routines. */ -int gzclose(gzFile file) -{ -#ifndef NO_GZCOMPRESS - gz_statep state; - - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); -#else - return gzclose_r(file); -#endif -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/zlib/gzlib.c
Deleted
@@ -1,604 +0,0 @@ -/* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -#if defined(_WIN32) && !defined(__BORLANDC__) -# define LSEEK _lseeki64 -#else -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 -# define LSEEK lseek64 -#else -# define LSEEK lseek -#endif -#endif - -/* Forward declarations */ -z_off_t ZEXPORT gzoffset(gzFile file); -int ZEXPORT gzbuffer(gzFile file, unsigned size); - -/* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); - -#if defined UNDER_CE - -/* Map the Windows error number in ERROR to a locale-dependent error message - string and return a pointer to it. Typically, the values for ERROR come - from GetLastError. - - The string pointed to shall not be modified by the application, but may be - overwritten by a subsequent call to gz_strwinerror - - The gz_strwinerror function does not change the current setting of - GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror (error) - DWORD error; -{ - static char buf[1024]; - - wchar_t *msgbuf; - DWORD lasterr = GetLastError(); - DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_ALLOCATE_BUFFER, - NULL, - error, - 0, /* Default language */ - (LPVOID)&msgbuf, - 0, - NULL); - if (chars != 0) { - /* If there is an \r\n appended, zap it. */ - if (chars >= 2 - && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { - chars -= 2; - msgbuf[chars] = 0; - } - - if (chars > sizeof (buf) - 1) { - chars = sizeof (buf) - 1; - msgbuf[chars] = 0; - } - - wcstombs(buf, msgbuf, chars + 1); - LocalFree(msgbuf); - } - else { - sprintf(buf, "unknown win32 error (%ld)", error); - } - - SetLastError(lasterr); - return buf; -} - -#endif /* UNDER_CE */ - -/* Reset gzip file state */ -local void gz_reset(gz_statep state) -{ - state->x.have = 0; /* no output data available */ - if (state->mode == GZ_READ) { /* for reading ... */ - state->eof = 0; /* not at end of file */ - state->past = 0; /* have not read past end yet */ - state->how = LOOK; /* look for gzip header */ - } - state->seek = 0; /* no seek request pending */ - gz_error(state, Z_OK, NULL); /* clear error */ - state->x.pos = 0; /* no uncompressed data yet */ - state->strm.avail_in = 0; /* no input data yet */ -} - -/* Open a gzip file either by name or file descriptor. */ -local gzFile gz_open(const void *path, int fd, const char *mode) -{ - gz_statep state; - size_t len; - int oflag; -#ifdef O_CLOEXEC - int cloexec = 0; -#endif -#ifdef O_EXCL - int exclusive = 0; -#endif - - /* check input */ - if (path == NULL) - return NULL; - - /* allocate gzFile structure to return */ - state = (gz_statep)malloc(sizeof(gz_state)); - if (state == NULL) - return NULL; - state->size = 0; /* no buffers allocated yet */ - state->want = GZBUFSIZE; /* requested buffer size */ - state->msg = NULL; /* no error message yet */ - - /* interpret mode */ - state->mode = GZ_NONE; - state->level = Z_DEFAULT_COMPRESSION; - state->strategy = Z_DEFAULT_STRATEGY; - state->direct = 0; - while (*mode) { - if (*mode >= '0' && *mode <= '9') - state->level = *mode - '0'; - else - switch (*mode) { - case 'r': - state->mode = GZ_READ; - break; -#ifndef NO_GZCOMPRESS - case 'w': - state->mode = GZ_WRITE; - break; - case 'a': - state->mode = GZ_APPEND; - break; -#endif - case '+': /* can't read and write at the same time */ - free(state); - return NULL; - case 'b': /* ignore -- will request binary anyway */ - break; -#ifdef O_CLOEXEC - case 'e': - cloexec = 1; - break; -#endif -#ifdef O_EXCL - case 'x': - exclusive = 1; - break; -#endif - case 'f': - state->strategy = Z_FILTERED; - break; - case 'h': - state->strategy = Z_HUFFMAN_ONLY; - break; - case 'R': - state->strategy = Z_RLE; - break; - case 'F': - state->strategy = Z_FIXED; - break; - case 'T': - state->direct = 1; - break; - default: /* could consider as an error, but just ignore */ - ; - } - mode++; - } - - /* must provide an "r", "w", or "a" */ - if (state->mode == GZ_NONE) { - free(state); - return NULL; - } - - /* can't force transparent read */ - if (state->mode == GZ_READ) { - if (state->direct) { - free(state); - return NULL; - } - state->direct = 1; /* for empty file */ - } - - /* save the path name for error messages */ -#ifdef _WIN32 - if (fd == -2) { - len = wcstombs(NULL, (const wchar_t*)path, 0); - if (len == (size_t)-1) - len = 0; - } - else -#endif - len = strlen((const char *)path); - state->path = (char *)malloc(len + 1); - if (state->path == NULL) { - free(state); - return NULL; - } -#ifdef _WIN32 - if (fd == -2) - if (len) - wcstombs(state->path, (const wchar_t*)path, len + 1); - else - *(state->path) = 0; - else -#endif -#if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(state->path, len + 1, "%s", (const char *)path); -#else - strlcpy(state->path, path, sizeof(state->path)); -#endif - - /* compute the flags for open() */ - oflag = -#ifdef O_LARGEFILE - O_LARGEFILE | -#endif -#ifdef O_BINARY - O_BINARY | -#endif -#ifdef O_CLOEXEC - (cloexec ? O_CLOEXEC : 0) | -#endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | -#ifdef O_EXCL - (exclusive ? O_EXCL : 0) | -#endif - (state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))); - - /* open the file with the appropriate flags (or just use fd) */ - state->fd = fd > -1 ? fd : ( -#ifdef _WIN32 - fd == -2 ? _wopen((const wchar_t*)path, oflag, 0666) : -#endif - open((const char *)path, oflag, 0666)); - if (state->fd == -1) { - free(state->path); - free(state); - return NULL; - } - if (state->mode == GZ_APPEND) - state->mode = GZ_WRITE; /* simplify later checks */ - - /* save the current position for rewinding (only if reading) */ - if (state->mode == GZ_READ) { - state->start = LSEEK(state->fd, 0, SEEK_CUR); - if (state->start == -1) state->start = 0; - } - - /* initialize stream */ - gz_reset(state); - - /* return stream */ - return (gzFile)state; -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzopen(const char *path, const char *mode) -{ - return gz_open(path, -1, mode); -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzopen64(const char *path, const char *mode) -{ - return gz_open(path, -1, mode); -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzdopen(int fd, const char *mode) -{ - char *path; /* identifier for error messages */ - gzFile gz; - - if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) - return NULL; -#if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */ -#else - sprintf(path, "<fd:%d>", fd); /* for debugging */ -#endif - gz = gz_open(path, fd, mode); - free(path); - return gz; -} - -/* -- see zlib.h -- */ -#ifdef _WIN32 -gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) -{ - return gz_open(path, -2, mode); -} -#endif - -/* -- see zlib.h -- */ -int ZEXPORT gzbuffer(gzFile file, unsigned size) -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* make sure we haven't already allocated memory */ - if (state->size != 0) - return -1; - - /* check and set requested size */ - if (size < 2) - size = 2; /* need two bytes to check magic header */ - state->want = size; - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzrewind(gzFile file) -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* back up and start over */ - if (LSEEK(state->fd, state->start, SEEK_SET) == -1) - return -1; - gz_reset(state); - return 0; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) -{ - unsigned n; - z_off64_t ret; - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* check that there's no error */ - if (state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - - /* can only seek from start or relative to current position */ - if (whence != SEEK_SET && whence != SEEK_CUR) - return -1; - - /* normalize offset to a SEEK_CUR specification */ - if (whence == SEEK_SET) - offset -= state->x.pos; - else if (state->seek) - offset += state->skip; - state->seek = 0; - - /* if within raw area while reading, just go there */ - if (state->mode == GZ_READ && state->how == MODE_COPY && - state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); - if (ret == -1) - return -1; - state->x.have = 0; - state->eof = 0; - state->past = 0; - state->seek = 0; - gz_error(state, Z_OK, NULL); - state->strm.avail_in = 0; - state->x.pos += offset; - return state->x.pos; - } - - /* calculate skip amount, rewinding if needed for back seek when reading */ - if (offset < 0) { - if (state->mode != GZ_READ) /* writing -- can't go backwards */ - return -1; - offset += state->x.pos; - if (offset < 0) /* before start of file! */ - return -1; - if (gzrewind(file) == -1) /* rewind, then skip to offset */ - return -1; - } - - /* if reading, skip what's in output buffer (one less gzgetc() check) */ - if (state->mode == GZ_READ) { - n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? - (unsigned)offset : state->x.have; - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - offset -= n; - } - - /* request skip (if not zero) */ - if (offset) { - state->seek = 1; - state->skip = offset; - } - return state->x.pos + offset; -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) -{ - z_off64_t ret; - - ret = gzseek64(file, (z_off64_t)offset, whence); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gztell64(gzFile file) -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* return position */ - return state->x.pos + (state->seek ? state->skip : 0); -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gztell(gzFile file) -{ - z_off64_t ret; - - ret = gztell64(file); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gzoffset64(gzFile file) -{ - z_off64_t offset; - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* compute and return effective offset in file */ - offset = LSEEK(state->fd, 0, SEEK_CUR); - if (offset == -1) - return -1; - if (state->mode == GZ_READ) /* reading */ - offset -= state->strm.avail_in; /* don't count buffered input */ - return offset; -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gzoffset(gzFile file) -{ - z_off64_t ret = gzoffset64(file); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzeof(gzFile file) -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return 0; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return 0; - - /* return end-of-file state */ - return state->mode == GZ_READ ? state->past : 0; -} - -/* -- see zlib.h -- */ -const char * ZEXPORT gzerror(gzFile file, int *errnum) -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return NULL; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return NULL; - - /* return error information */ - if (errnum != NULL) - *errnum = state->err; - return state->err == Z_MEM_ERROR ? "out of memory" : - (state->msg == NULL ? "" : state->msg); -} - -/* -- see zlib.h -- */ -void ZEXPORT gzclearerr(gzFile file) -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return; - - /* clear error and end-of-file */ - if (state->mode == GZ_READ) { - state->eof = 0; - state->past = 0; - } - gz_error(state, Z_OK, NULL); -} - -/* Create an error message in allocated memory and set state->err and - state->msg accordingly. Free any previous error message already there. Do - not try to free or allocate space if the error is Z_MEM_ERROR (out of - memory). Simply save the error message as a static string. If there is an - allocation failure constructing the error message, then convert the error to - out of memory. */ -void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) -{ - /* free previously allocated message and clear */ - if (state->msg != NULL) { - if (state->err != Z_MEM_ERROR) - free(state->msg); - state->msg = NULL; - } - - /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ - if (err != Z_OK && err != Z_BUF_ERROR) - state->x.have = 0; - - /* set error code, and if no message, then done */ - state->err = err; - if (msg == NULL) - return; - - /* for an out of memory error, return literal string when requested */ - if (err == Z_MEM_ERROR) - return; - - /* construct error message with path */ - if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == - NULL) { - state->err = Z_MEM_ERROR; - return; - } -#if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, - "%s%s%s", state->path, ": ", msg); -#else - strlcpy(state->msg, state->path, sizeof(state->msg)); - strlcat(state->msg, ": ", sizeof(state->msg)); - strlcat(state->msg, msg, sizeof(state->msg)); -#endif - return; -} - -#ifndef INT_MAX -/* portably return maximum value for an int (when limits.h presumed not - available) -- we need to do this to cover cases where 2's complement not - used, since C standard permits 1's complement and sign-bit representations, - otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax() -{ - unsigned p, q; - - p = 1; - do { - q = p; - p <<= 1; - p++; - } while (p > q); - return q >> 1; -} -#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/zlib/gzread.c
Deleted
@@ -1,575 +0,0 @@ -/* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); - -int ZEXPORT gzgetc_(gzFile file); - -/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from - state->fd, and update state->eof, state->err, and state->msg as appropriate. - This function needs to loop on read(), since read() is not guaranteed to - read the number of bytes requested, depending on the type of descriptor. */ -local int gz_load(gz_statep state, unsigned char *buf, unsigned len, unsigned *have) -{ - int ret; - - *have = 0; - do { - ret = read(state->fd, buf + *have, len - *have); - if (ret <= 0) - break; - *have += ret; - } while (*have < len); - if (ret < 0) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - if (ret == 0) - state->eof = 1; - return 0; -} - -/* Load up input buffer and set eof flag if last data loaded -- return -1 on - error, 0 otherwise. Note that the eof flag is set when the end of the input - file is reached, even though there may be unused data in the buffer. Once - that data has been used, no more attempts will be made to read the file. - If strm->avail_in != 0, then the current data is moved to the beginning of - the input buffer, and then the remainder of the buffer is loaded with the - available data from the input file. */ -local int gz_avail(gz_statep state) -{ - unsigned got; - z_streamp strm = &(state->strm); - - if (state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - if (state->eof == 0) { - if (strm->avail_in) { /* copy what's there to the start */ - unsigned char *p = state->in; - unsigned const char *q = strm->next_in; - unsigned n = strm->avail_in; - do { - *p++ = *q++; - } while (--n); - } - if (gz_load(state, state->in + strm->avail_in, - state->size - strm->avail_in, &got) == -1) - return -1; - strm->avail_in += got; - strm->next_in = state->in; - } - return 0; -} - -/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. - If this is the first time in, allocate required memory. state->how will be - left unchanged if there is no more input data available, will be set to COPY - if there is no gzip header and direct copying will be performed, or it will - be set to GZIP for decompression. If direct copying, then leftover input - data from the input buffer will be copied to the output buffer. In that - case, all further file reads will be directly to either the output buffer or - a user buffer. If decompressing, the inflate state will be initialized. - gz_look() will return 0 on success or -1 on failure. */ -local int gz_look(gz_statep state) -{ - z_streamp strm = &(state->strm); - - /* allocate read buffers and inflate memory */ - if (state->size == 0) { - /* allocate buffers */ - state->in = (unsigned char *)malloc(state->want); - state->out = (unsigned char *)malloc(state->want << 1); - if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - state->size = state->want; - - /* allocate inflate memory */ - state->strm.zalloc = Z_NULL; - state->strm.zfree = Z_NULL; - state->strm.opaque = Z_NULL; - state->strm.avail_in = 0; - state->strm.next_in = Z_NULL; - if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ - free(state->out); - free(state->in); - state->size = 0; - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - } - - /* get at least the magic bytes in the input buffer */ - if (strm->avail_in < 2) { - if (gz_avail(state) == -1) - return -1; - if (strm->avail_in == 0) - return 0; - } - - /* look for gzip magic bytes -- if there, do gzip decoding (note: there is - a logical dilemma here when considering the case of a partially written - gzip file, to wit, if a single 31 byte is written, then we cannot tell - whether this is a single-byte file, or just a partially written gzip - file -- for here we assume that if a gzip file is being written, then - the header will be written in a single operation, so that reading a - single byte is sufficient indication that it is not a gzip file) */ - if (strm->avail_in > 1 && - strm->next_in[0] == 31 && strm->next_in[1] == 139) { - inflateReset(strm); - state->how = MODE_GZIP; - state->direct = 0; - return 0; - } - - /* no gzip header -- if we were decoding gzip before, then this is trailing - garbage. Ignore the trailing garbage and finish. */ - if (state->direct == 0) { - strm->avail_in = 0; - state->eof = 1; - state->x.have = 0; - return 0; - } - - /* doing raw i/o, copy any leftover input to output -- this assumes that - the output buffer is larger than the input buffer, which also assures - space for gzungetc() */ - state->x.next = state->out; - if (strm->avail_in) { - memcpy(state->x.next, strm->next_in, strm->avail_in); - state->x.have = strm->avail_in; - strm->avail_in = 0; - } - state->how = MODE_COPY; - state->direct = 1; - return 0; -} - -/* Decompress from input to the provided next_out and avail_out in the state. - On return, state->x.have and state->x.next point to the just decompressed - data. If the gzip stream completes, state->how is reset to LOOK to look for - the next gzip stream or raw data, once state->x.have is depleted. Returns 0 - on success, -1 on failure. */ -local int gz_decomp(gz_statep state) -{ - int ret = Z_OK; - unsigned had; - z_streamp strm = &(state->strm); - - /* fill output buffer up to end of deflate stream */ - had = strm->avail_out; - do { - /* get more input for inflate() */ - if (strm->avail_in == 0 && gz_avail(state) == -1) - return -1; - if (strm->avail_in == 0) { - gz_error(state, Z_BUF_ERROR, "unexpected end of file"); - break; - } - - /* decompress and handle errors */ - ret = inflate(strm, Z_NO_FLUSH); - if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { - gz_error(state, Z_STREAM_ERROR, - "internal error: inflate stream corrupt"); - return -1; - } - if (ret == Z_MEM_ERROR) { - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ - gz_error(state, Z_DATA_ERROR, - strm->msg == NULL ? "compressed data error" : strm->msg); - return -1; - } - } while (strm->avail_out && ret != Z_STREAM_END); - - /* update available output */ - state->x.have = had - strm->avail_out; - state->x.next = strm->next_out - state->x.have; - - /* if the gzip stream completed successfully, look for another */ - if (ret == Z_STREAM_END) - state->how = LOOK; - - /* good decompression */ - return 0; -} - -/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. - Data is either copied from the input file or decompressed from the input - file depending on state->how. If state->how is LOOK, then a gzip header is - looked for to determine whether to copy or decompress. Returns -1 on error, - otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the - end of the input file has been reached and all data has been processed. */ -local int gz_fetch(gz_statep state) -{ - z_streamp strm = &(state->strm); - - do { - switch(state->how) { - case LOOK: /* -> LOOK, MODE_COPY (only if never GZIP), or MODE_GZIP */ - if (gz_look(state) == -1) - return -1; - if (state->how == LOOK) - return 0; - break; - case MODE_COPY: /* -> MODE_COPY */ - if (gz_load(state, state->out, state->size << 1, &(state->x.have)) - == -1) - return -1; - state->x.next = state->out; - return 0; - case MODE_GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ - strm->avail_out = state->size << 1; - strm->next_out = state->out; - if (gz_decomp(state) == -1) - return -1; - } - } while (state->x.have == 0 && (!state->eof || strm->avail_in)); - return 0; -} - -/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ -local int gz_skip(gz_statep state, z_off64_t len) -{ - unsigned n; - - /* skip over len bytes or reach end-of-file, whichever comes first */ - while (len) - /* skip over whatever is in output buffer */ - if (state->x.have) { - n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? - (unsigned)len : state->x.have; - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - len -= n; - } - - /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && state->strm.avail_in == 0) - break; - - /* need more data to skip -- load up output buffer */ - else { - /* get more output, looking for header if required */ - if (gz_fetch(state) == -1) - return -1; - } - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) -{ - unsigned got, n; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return -1; - } - - /* if len is zero, avoid unnecessary operations */ - if (len == 0) - return 0; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return -1; - } - - /* get len bytes to buf, or less than len if at the end */ - got = 0; - n = 0; - do { - /* first just try copying data from the output buffer */ - if (state->x.have) { - n = state->x.have > len ? len : state->x.have; - memcpy(buf, state->x.next, n); - state->x.next += n; - state->x.have -= n; - } - - /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) { - state->past = 1; /* tried to read past end */ - break; - } - - /* need output data -- for small len or new stream load up our output - buffer */ - else if (state->how == LOOK || len < (state->size << 1)) { - /* get more output, looking for header if required */ - if (gz_fetch(state) == -1) - return -1; - continue; /* no progress yet -- go back to copy above */ - /* the copy above assures that we will leave with space in the - output buffer, allowing at least one gzungetc() to succeed */ - } - - /* large len -- read directly into user buffer */ - else if (state->how == MODE_COPY) { /* read directly */ - if (gz_load(state, (unsigned char *)buf, len, &n) == -1) - return -1; - } - - /* large len -- decompress directly into user buffer */ - else { /* state->how == GZIP */ - strm->avail_out = len; - strm->next_out = (unsigned char *)buf; - if (gz_decomp(state) == -1) - return -1; - n = state->x.have; - state->x.have = 0; - } - - /* update progress */ - len -= n; - buf = (char *)buf + n; - got += n; - state->x.pos += n; - } while (len); - - /* return number of bytes read into user buffer (will fit in int) */ - return (int)got; -} - -/* -- see zlib.h -- */ -#ifdef Z_PREFIX_SET -# undef z_gzgetc -#else -# undef gzgetc -#endif -int ZEXPORT gzgetc(gzFile file) -{ - int ret; - unsigned char buf[1]; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* try output buffer (no need to check for skip request) */ - if (state->x.have) { - state->x.have--; - state->x.pos++; - return *(state->x.next)++; - } - - /* nothing there -- try gzread() */ - ret = gzread(file, buf, 1); - return ret < 1 ? -1 : buf[0]; -} - -int ZEXPORT gzgetc_(gzFile file) -{ - return gzgetc(file); -} - -/* -- see zlib.h -- */ -int ZEXPORT gzungetc(int c, gzFile file) -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return -1; - } - - /* can't push EOF */ - if (c < 0) - return -1; - - /* if output buffer empty, put byte at end (allows more pushing) */ - if (state->x.have == 0) { - state->x.have = 1; - state->x.next = state->out + (state->size << 1) - 1; - state->x.next[0] = c; - state->x.pos--; - state->past = 0; - return c; - } - - /* if no room, give up (must have already done a gzungetc()) */ - if (state->x.have == (state->size << 1)) { - gz_error(state, Z_DATA_ERROR, "out of room to push characters"); - return -1; - } - - /* slide output data if needed and insert byte before existing data */ - if (state->x.next == state->out) { - unsigned char *src = state->out + state->x.have; - unsigned char *dest = state->out + (state->size << 1); - while (src > state->out) - *--dest = *--src; - state->x.next = dest; - } - state->x.have++; - state->x.next--; - state->x.next[0] = c; - state->x.pos--; - state->past = 0; - return c; -} - -/* -- see zlib.h -- */ -char * ZEXPORT gzgets(gzFile file, char *buf, int len) -{ - unsigned left, n; - char *str; - unsigned char *eol; - gz_statep state; - - /* check parameters and get internal structure */ - if (file == NULL || buf == NULL || len < 1) - return NULL; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return NULL; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return NULL; - } - - /* copy output bytes up to new line or len - 1, whichever comes first -- - append a terminating zero to the string (we don't check for a zero in - the contents, let the user worry about that) */ - str = buf; - left = (unsigned)len - 1; - if (left) do { - /* assure that something is in the output buffer */ - if (state->x.have == 0 && gz_fetch(state) == -1) - return NULL; /* error */ - if (state->x.have == 0) { /* end of file */ - state->past = 1; /* read past end */ - break; /* return what we have */ - } - - /* look for end-of-line in current output buffer */ - n = state->x.have > left ? left : state->x.have; - eol = (unsigned char *)memchr(state->x.next, '\n', n); - if (eol != NULL) - n = (unsigned)(eol - state->x.next) + 1; - - /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->x.next, n); - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - left -= n; - buf += n; - } while (left && eol == NULL); - - /* return terminated string, or if nothing, end of file */ - if (buf == str) - return NULL; - buf[0] = 0; - return str; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzdirect(gzFile file) -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - - /* if the state is not known, but we can find out, then do so (this is - mainly for right after a gzopen() or gzdopen()) */ - if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) - (void)gz_look(state); - - /* return 1 if transparent, 0 if processing a gzip stream */ - return state->direct; -} - -/* -- see zlib.h -- */ -int gzclose_r(gzFile file) -{ - int ret, err; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're reading */ - if (state->mode != GZ_READ) - return Z_STREAM_ERROR; - - /* free memory and close file */ - if (state->size) { - inflateEnd(&(state->strm)); - free(state->out); - free(state->in); - } - err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; - gz_error(state, Z_OK, NULL); - free(state->path); - ret = close(state->fd); - free(state); - return ret ? Z_ERRNO : err; -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/zlib/gzwrite.c
Deleted
@@ -1,557 +0,0 @@ -/* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); - -int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va); - -/* Initialize state for writing a gzip file. Mark initialization by setting - state->size to non-zero. Return -1 on failure or 0 on success. */ -local int gz_init(gz_statep state) -{ - int ret; - z_streamp strm = &(state->strm); - - /* allocate input buffer */ - state->in = (unsigned char *)malloc(state->want); - if (state->in == NULL) { - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - - /* only need output buffer and deflate state if compressing */ - if (!state->direct) { - /* allocate output buffer */ - state->out = (unsigned char *)malloc(state->want); - if (state->out == NULL) { - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - - /* allocate deflate memory, set up for gzip compression */ - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit2(strm, state->level, Z_DEFLATED, - MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); - if (ret != Z_OK) { - free(state->out); - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - } - - /* mark state as initialized */ - state->size = state->want; - - /* initialize write buffer if compressing */ - if (!state->direct) { - strm->avail_out = state->size; - strm->next_out = state->out; - state->x.next = strm->next_out; - } - return 0; -} - -/* Compress whatever is at avail_in and next_in and write to the output file. - Return -1 if there is an error writing to the output file, otherwise 0. - flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. If gz->direct - is true, then simply write to the output file without compressing, and - ignore flush. */ -local int gz_comp(gz_statep state, int flush) -{ - int ret, got; - unsigned have; - z_streamp strm = &(state->strm); - - /* allocate memory if this is the first time through */ - if (state->size == 0 && gz_init(state) == -1) - return -1; - - /* write directly if requested */ - if (state->direct) { - got = write(state->fd, strm->next_in, strm->avail_in); - if (got < 0 || (unsigned)got != strm->avail_in) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - strm->avail_in = 0; - return 0; - } - - /* run deflate() on provided input until it produces no more output */ - ret = Z_OK; - do { - /* write out current buffer contents if full, or if flushing, but if - doing Z_FINISH then don't write until we get to Z_STREAM_END */ - if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && - (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->x.next); - if (have && ((got = write(state->fd, state->x.next, have)) < 0 || - (unsigned)got != have)) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - if (strm->avail_out == 0) { - strm->avail_out = state->size; - strm->next_out = state->out; - } - state->x.next = strm->next_out; - } - - /* compress */ - have = strm->avail_out; - ret = deflate(strm, flush); - if (ret == Z_STREAM_ERROR) { - gz_error(state, Z_STREAM_ERROR, - "internal error: deflate stream corrupt"); - return -1; - } - have -= strm->avail_out; - } while (have); - - /* if that completed a deflate stream, allow another to start */ - if (flush == Z_FINISH) - deflateReset(strm); - - /* all done, no errors */ - return 0; -} - -/* Compress len zeros to output. Return -1 on error, 0 on success. */ -local int gz_zero(gz_statep state, z_off64_t len) -{ - int first; - unsigned n; - z_streamp strm = &(state->strm); - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return -1; - - /* compress len zeros (len guaranteed > 0) */ - first = 1; - while (len) { - n = GT_OFF(state->size) || (z_off64_t)state->size > len ? - (unsigned)len : state->size; - if (first) { - memset(state->in, 0, n); - first = 0; - } - strm->avail_in = n; - strm->next_in = state->in; - state->x.pos += n; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return -1; - len -= n; - } - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) -{ - unsigned put = len; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return 0; - } - - /* if len is zero, avoid unnecessary operations */ - if (len == 0) - return 0; - - /* allocate memory if this is the first time through */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* for small len, copy to input buffer, otherwise compress directly */ - if (len < state->size) { - /* copy to input buffer, compress when full */ - do { - unsigned have, copy; - - if (strm->avail_in == 0) - strm->next_in = state->in; - have = (unsigned)((strm->next_in + strm->avail_in) - state->in); - copy = state->size - have; - if (copy > len) - copy = len; - memcpy(state->in + have, buf, copy); - strm->avail_in += copy; - state->x.pos += copy; - buf = (const char *)buf + copy; - len -= copy; - if (len && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - } while (len); - } - else { - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* directly compress user buffer to file */ - strm->avail_in = len; - strm->next_in = (Bytef *)buf; - state->x.pos += len; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - } - - /* input was all buffered or compressed (put will fit in int) */ - return (int)put; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzputc(gzFile file, int c) -{ - unsigned have; - unsigned char buf[1]; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return -1; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* try writing to input buffer for speed (state->size == 0 if buffer not - initialized) */ - if (state->size) { - if (strm->avail_in == 0) - strm->next_in = state->in; - have = (unsigned)((strm->next_in + strm->avail_in) - state->in); - if (have < state->size) { - state->in[have] = c; - strm->avail_in++; - state->x.pos++; - return c & 0xff; - } - } - - /* no room in buffer or not initialized, use gz_write() */ - buf[0] = c; - if (gzwrite(file, buf, 1) != 1) - return -1; - return c & 0xff; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzputs(gzFile file, const char *str) -{ - int ret; - unsigned len; - - /* write string */ - len = (unsigned)strlen(str); - ret = gzwrite(file, str, len); - return ret == 0 && len != 0 ? -1 : ret; -} - -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -#include <stdarg.h> - -/* -- see zlib.h -- */ -int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) -{ - int size, len; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf((char *)(state->in), format, va); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; -# else - len = vsprintf((char *)(state->in), format, va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf((char *)(state->in), size, format, va); - len = strlen((char *)(state->in)); -# else - len = vsnprintf((char *)(state->in), size, format, va); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) - return 0; - - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; - state->x.pos += len; - return len; -} - -int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) -{ - va_list va; - int ret; - - va_start(va, format); - ret = gzvprintf(file, format, va); - va_end(va); - return ret; -} - -#else /* !STDC && !Z_HAVE_STDARG_H */ - -/* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (gzFile file, const char *format, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, - int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20) -{ - int size, len; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that can really pass pointer in ints */ - if (sizeof(int) != sizeof(void *)) - return 0; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; -# else - len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen((char *)(state->in)); -# else - len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, - a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, - a19, a20); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) - return 0; - - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; - state->x.pos += len; - return len; -} - -#endif - -/* -- see zlib.h -- */ -int ZEXPORT gzflush(gzFile file, int flush) -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* check flush parameter */ - if (flush < 0 || flush > Z_FINISH) - return Z_STREAM_ERROR; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* compress remaining data with requested flush */ - gz_comp(state, flush); - return state->err; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzsetparams(gzFile file, int level, int strategy) -{ - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* if no change is requested, then do nothing */ - if (level == state->level && strategy == state->strategy) - return Z_OK; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* change compression parameters for subsequent input */ - if (state->size) { - /* flush previous input with previous parameters before changing */ - if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) - return state->err; - deflateParams(strm, level, strategy); - } - state->level = level; - state->strategy = strategy; - return Z_OK; -} - -/* -- see zlib.h -- */ -int gzclose_w(gzFile file) -{ - int ret = Z_OK; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're writing */ - if (state->mode != GZ_WRITE) - return Z_STREAM_ERROR; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - ret = state->err; - } - - /* flush, free memory, and close file */ - if (gz_comp(state, Z_FINISH) == -1) - ret = state->err; - if (state->size) { - if (!state->direct) { - (void)deflateEnd(&(state->strm)); - free(state->out); - } - free(state->in); - } - gz_error(state, Z_OK, NULL); - free(state->path); - if (close(state->fd) == -1) - ret = Z_ERRNO; - free(state); - return ret; -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/hash/rhash.c
Deleted
@@ -1,561 +0,0 @@ -/* Copyright (C) 2010-2018 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (rhash.c). - * --------------------------------------------------------------------------------------- - * - * Permission is hereby granted, free of charge, - * to any person obtaining a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include <string.h> -#include <stdio.h> -#ifdef _WIN32 -#include <io.h> -#else -#include <unistd.h> -#endif -#include <rhash.h> -#include <retro_miscellaneous.h> -#include <retro_endianness.h> -#include <streams/file_stream.h> - -#define LSL32(x, n) ((uint32_t)(x) << (n)) -#define LSR32(x, n) ((uint32_t)(x) >> (n)) -#define ROR32(x, n) (LSR32(x, n) | LSL32(x, 32 - (n))) - -/* First 32 bits of the fractional parts of the square roots of the first 8 primes 2..19 */ -static const uint32_t T_H[8] = { - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, -}; - -/* First 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311 */ -static const uint32_t T_K[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, -}; - -/* SHA256 implementation from bSNES. Written by valditx. */ - -struct sha256_ctx -{ - union - { - uint8_t u8[64]; - uint32_t u32[16]; - } in; - unsigned inlen; - - uint32_t w[64]; - uint32_t h[8]; - uint64_t len; -}; - -static void sha256_init(struct sha256_ctx *p) -{ - memset(p, 0, sizeof(struct sha256_ctx)); - memcpy(p->h, T_H, sizeof(T_H)); -} - -static void sha256_block(struct sha256_ctx *p) -{ - unsigned i; - uint32_t s0, s1; - uint32_t a, b, c, d, e, f, g, h; - - for (i = 0; i < 16; i++) - p->w[i] = load32be(p->in.u32 + i); - - for (i = 16; i < 64; i++) - { - s0 = ROR32(p->w[i - 15], 7) ^ ROR32(p->w[i - 15], 18) ^ LSR32(p->w[i - 15], 3); - s1 = ROR32(p->w[i - 2], 17) ^ ROR32(p->w[i - 2], 19) ^ LSR32(p->w[i - 2], 10); - p->w[i] = p->w[i - 16] + s0 + p->w[i - 7] + s1; - } - - a = p->h[0]; b = p->h[1]; c = p->h[2]; d = p->h[3]; - e = p->h[4]; f = p->h[5]; g = p->h[6]; h = p->h[7]; - - for (i = 0; i < 64; i++) - { - uint32_t t1, t2, maj, ch; - - s0 = ROR32(a, 2) ^ ROR32(a, 13) ^ ROR32(a, 22); - maj = (a & b) ^ (a & c) ^ (b & c); - t2 = s0 + maj; - s1 = ROR32(e, 6) ^ ROR32(e, 11) ^ ROR32(e, 25); - ch = (e & f) ^ (~e & g); - t1 = h + s1 + ch + T_K[i] + p->w[i]; - - h = g; - g = f; - f = e; - e = d + t1; - d = c; - c = b; - b = a; - a = t1 + t2; - } - - p->h[0] += a; p->h[1] += b; p->h[2] += c; p->h[3] += d; - p->h[4] += e; p->h[5] += f; p->h[6] += g; p->h[7] += h; - - /* Next block */ - p->inlen = 0; -} - -static void sha256_chunk(struct sha256_ctx *p, - const uint8_t *s, unsigned len) -{ - p->len += len; - - while (len) - { - unsigned l = 64 - p->inlen; - - if (len < l) - l = len; - - memcpy(p->in.u8 + p->inlen, s, l); - - s += l; - p->inlen += l; - len -= l; - - if (p->inlen == 64) - sha256_block(p); - } -} - -static void sha256_final(struct sha256_ctx *p) -{ - uint64_t len; - p->in.u8[p->inlen++] = 0x80; - - if (p->inlen > 56) - { - memset(p->in.u8 + p->inlen, 0, 64 - p->inlen); - sha256_block(p); - } - - memset(p->in.u8 + p->inlen, 0, 56 - p->inlen); - - len = p->len << 3; - store32be(p->in.u32 + 14, (uint32_t)(len >> 32)); - store32be(p->in.u32 + 15, (uint32_t)len); - sha256_block(p); -} - -static void sha256_subhash(struct sha256_ctx *p, uint32_t *t) -{ - unsigned i; - for (i = 0; i < 8; i++) - store32be(t++, p->h[i]); -} - -/** - * sha256_hash: - * @s : Output. - * @in : Input. - * @size : Size of @s. - * - * Hashes SHA256 and outputs a human readable string. - **/ -void sha256_hash(char *s, const uint8_t *in, size_t size) -{ - unsigned i; - struct sha256_ctx sha; - - union - { - uint32_t u32[8]; - uint8_t u8[32]; - } shahash; - - sha256_init(&sha); - sha256_chunk(&sha, in, (unsigned)size); - sha256_final(&sha); - sha256_subhash(&sha, shahash.u32); - - for (i = 0; i < 32; i++) - snprintf(s + 2 * i, 3, "%02x", (unsigned)shahash.u8[i]); -} - -#ifndef HAVE_ZLIB -/* Zlib CRC32. */ -static const uint32_t crc32_hash_table[256] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -uint32_t crc32_adjust(uint32_t checksum, uint8_t input) -{ - return ((checksum >> 8) & 0x00ffffff) ^ crc32_hash_table[(checksum ^ input) & 0xff]; -} - -uint32_t crc32_calculate(const uint8_t *data, size_t length) -{ - size_t i; - uint32_t checksum = ~0; - for (i = 0; i < length; i++) - checksum = crc32_adjust(checksum, data[i]); - return ~checksum; -} -#endif - -/* SHA-1 implementation. */ - -/* - * sha1.c - * - * Copyright (C) 1998, 2009 - * Paul E. Jones <paulej@packetizer.com> - * All Rights Reserved - * - ***************************************************************************** - * $Id: sha1.c 12 2009-06-22 19:34:25Z paulej $ - ***************************************************************************** - * - * Description: - * This file implements the Secure Hashing Standard as defined - * in FIPS PUB 180-1 published April 17, 1995. - * - * The Secure Hashing Standard, which uses the Secure Hashing - * Algorithm (SHA), produces a 160-bit message digest for a - * given data stream. In theory, it is highly improbable that - * two messages will produce the same message digest. Therefore, - * this algorithm can serve as a means of providing a "fingerprint" - * for a message. - * - * Portability Issues: - * SHA-1 is defined in terms of 32-bit "words". This code was - * written with the expectation that the processor has at least - * a 32-bit machine word size. If the machine word size is larger, - * the code should still function properly. One caveat to that - * is that the input functions taking characters and character - * arrays assume that only 8 bits of information are stored in each - * character. - * - * Caveats: - * SHA-1 is designed to work with messages less than 2^64 bits - * long. Although SHA-1 allows a message digest to be generated for - * messages of any number of bits less than 2^64, this - * implementation only works with messages with a length that is a - * multiple of the size of an 8-bit character. - * - */ - -/* Define the circular shift macro */ -#define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF) | ((word) >> (32-(bits)))) - -static void SHA1Reset(SHA1Context *context) -{ - if (!context) - return; - - context->Length_Low = 0; - context->Length_High = 0; - context->Message_Block_Index = 0; - - context->Message_Digest[0] = 0x67452301; - context->Message_Digest[1] = 0xEFCDAB89; - context->Message_Digest[2] = 0x98BADCFE; - context->Message_Digest[3] = 0x10325476; - context->Message_Digest[4] = 0xC3D2E1F0; - - context->Computed = 0; - context->Corrupted = 0; -} - -static void SHA1ProcessMessageBlock(SHA1Context *context) -{ - const unsigned K[] = /* Constants defined in SHA-1 */ - { - 0x5A827999, - 0x6ED9EBA1, - 0x8F1BBCDC, - 0xCA62C1D6 - }; - int t; /* Loop counter */ - unsigned temp; /* Temporary word value */ - unsigned W[80]; /* Word sequence */ - unsigned A, B, C, D, E; /* Word buffers */ - - /* Initialize the first 16 words in the array W */ - for(t = 0; t < 16; t++) - { - W[t] = ((unsigned) context->Message_Block[t * 4]) << 24; - W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16; - W[t] |= ((unsigned) context->Message_Block[t * 4 + 2]) << 8; - W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]); - } - - for(t = 16; t < 80; t++) - W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); - - A = context->Message_Digest[0]; - B = context->Message_Digest[1]; - C = context->Message_Digest[2]; - D = context->Message_Digest[3]; - E = context->Message_Digest[4]; - - for(t = 0; t < 20; t++) - { - temp = SHA1CircularShift(5,A) + - ((B & C) | ((~B) & D)) + E + W[t] + K[0]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - for(t = 20; t < 40; t++) - { - temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - for(t = 40; t < 60; t++) - { - temp = SHA1CircularShift(5,A) + - ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - for(t = 60; t < 80; t++) - { - temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; - temp &= 0xFFFFFFFF; - E = D; - D = C; - C = SHA1CircularShift(30,B); - B = A; - A = temp; - } - - context->Message_Digest[0] = - (context->Message_Digest[0] + A) & 0xFFFFFFFF; - context->Message_Digest[1] = - (context->Message_Digest[1] + B) & 0xFFFFFFFF; - context->Message_Digest[2] = - (context->Message_Digest[2] + C) & 0xFFFFFFFF; - context->Message_Digest[3] = - (context->Message_Digest[3] + D) & 0xFFFFFFFF; - context->Message_Digest[4] = - (context->Message_Digest[4] + E) & 0xFFFFFFFF; - - context->Message_Block_Index = 0; -} - -static void SHA1PadMessage(SHA1Context *context) -{ - if (!context) - return; - - /* - * Check to see if the current message block is too small to hold - * the initial padding bits and length. If so, we will pad the - * block, process it, and then continue padding into a second - * block. - */ - context->Message_Block[context->Message_Block_Index++] = 0x80; - - if (context->Message_Block_Index > 55) - { - while(context->Message_Block_Index < 64) - context->Message_Block[context->Message_Block_Index++] = 0; - - SHA1ProcessMessageBlock(context); - } - - while(context->Message_Block_Index < 56) - context->Message_Block[context->Message_Block_Index++] = 0; - - /* Store the message length as the last 8 octets */ - context->Message_Block[56] = (context->Length_High >> 24) & 0xFF; - context->Message_Block[57] = (context->Length_High >> 16) & 0xFF; - context->Message_Block[58] = (context->Length_High >> 8) & 0xFF; - context->Message_Block[59] = (context->Length_High) & 0xFF; - context->Message_Block[60] = (context->Length_Low >> 24) & 0xFF; - context->Message_Block[61] = (context->Length_Low >> 16) & 0xFF; - context->Message_Block[62] = (context->Length_Low >> 8) & 0xFF; - context->Message_Block[63] = (context->Length_Low) & 0xFF; - - SHA1ProcessMessageBlock(context); -} - -static int SHA1Result(SHA1Context *context) -{ - if (context->Corrupted) - return 0; - - if (!context->Computed) - { - SHA1PadMessage(context); - context->Computed = 1; - } - - return 1; -} - -static void SHA1Input(SHA1Context *context, - const unsigned char *message_array, - unsigned length) -{ - if (!length) - return; - - if (context->Computed || context->Corrupted) - { - context->Corrupted = 1; - return; - } - - while(length-- && !context->Corrupted) - { - context->Message_Block[context->Message_Block_Index++] = - (*message_array & 0xFF); - - context->Length_Low += 8; - /* Force it to 32 bits */ - context->Length_Low &= 0xFFFFFFFF; - if (context->Length_Low == 0) - { - context->Length_High++; - /* Force it to 32 bits */ - context->Length_High &= 0xFFFFFFFF; - if (context->Length_High == 0) - context->Corrupted = 1; /* Message is too long */ - } - - if (context->Message_Block_Index == 64) - SHA1ProcessMessageBlock(context); - - message_array++; - } -} - -int sha1_calculate(const char *path, char *result) -{ - SHA1Context sha; - unsigned char buff[4096]; - int rv = 1; - RFILE *fd = filestream_open(path, - RETRO_VFS_FILE_ACCESS_READ, - RETRO_VFS_FILE_ACCESS_HINT_NONE); - - if (!fd) - goto error; - - buff[0] = '\0'; - - SHA1Reset(&sha); - - do - { - rv = (int)filestream_read(fd, buff, 4096); - if (rv < 0) - goto error; - - SHA1Input(&sha, buff, rv); - }while(rv); - - if (!SHA1Result(&sha)) - goto error; - - sprintf(result, "%08X%08X%08X%08X%08X", - sha.Message_Digest[0], - sha.Message_Digest[1], - sha.Message_Digest[2], - sha.Message_Digest[3], sha.Message_Digest[4]); - - filestream_close(fd); - return 0; - -error: - if (fd) - filestream_close(fd); - return -1; -} - -uint32_t djb2_calculate(const char *str) -{ - const unsigned char *aux = (const unsigned char*)str; - uint32_t hash = 5381; - - while ( *aux ) - hash = ( hash << 5 ) + hash + *aux++; - - return hash; -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/rhash.h
Deleted
@@ -1,132 +0,0 @@ -/* Copyright (C) 2010-2018 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (rhash.h). - * --------------------------------------------------------------------------------------- - * - * Permission is hereby granted, free of charge, - * to any person obtaining a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * sha1.h - * - * Copyright (C) 1998, 2009 - * Paul E. Jones <paulej@packetizer.com> - * All Rights Reserved - * - ***************************************************************************** - * $Id: sha1.h 12 2009-06-22 19:34:25Z paulej $ - ***************************************************************************** - * - * Description: - * This class implements the Secure Hashing Standard as defined - * in FIPS PUB 180-1 published April 17, 1995. - * - * Many of the variable names in the SHA1Context, especially the - * single character names, were used because those were the names - * used in the publication. - * - * Please read the file sha1.c for more information. - * - */ - -#ifndef __RARCH_HASH_H -#define __RARCH_HASH_H - -#include <stdint.h> -#include <stddef.h> - -#include <compat/msvc.h> -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <retro_inline.h> - -#include <retro_common_api.h> - -RETRO_BEGIN_DECLS - -/** - * sha256_hash: - * @out : Output. - * @in : Input. - * @size : Size of @out. - * - * Hashes SHA256 and outputs a human readable string. - **/ -void sha256_hash(char *out, const uint8_t *in, size_t size); - -typedef struct SHA1Context -{ - unsigned Message_Digest[5]; /* Message Digest (output) */ - - unsigned Length_Low; /* Message length in bits */ - unsigned Length_High; /* Message length in bits */ - - unsigned char Message_Block[64]; /* 512-bit message blocks */ - int Message_Block_Index; /* Index into message block array */ - - int Computed; /* Is the digest computed? */ - int Corrupted; /* Is the message digest corruped? */ -} SHA1Context; - -int sha1_calculate(const char *path, char *result); - -uint32_t djb2_calculate(const char *str); - -/* Any 32-bit or wider unsigned integer data type will do */ -typedef unsigned int MD5_u32plus; - -typedef struct { - MD5_u32plus lo, hi; - MD5_u32plus a, b, c, d; - unsigned char buffer[64]; - MD5_u32plus block[16]; -} MD5_CTX; - -/* - * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. - * MD5 Message-Digest Algorithm (RFC 1321). - * - * Homepage: - * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 - * - * Author: - * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> - * - * This software was written by Alexander Peslyak in 2001. No copyright is - * claimed, and the software is hereby placed in the public domain. - * In case this attempt to disclaim copyright and place the software in the - * public domain is deemed null and void, then the software is - * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the - * general public under the following terms: - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted. - * - * There's ABSOLUTELY NO WARRANTY, express or implied. - * - * See md5.c for more information. - */ - -void MD5_Init(MD5_CTX *ctx); -void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); -void MD5_Final(unsigned char *result, MD5_CTX *ctx); - -RETRO_END_DECLS - -#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/rthreads/rsemaphore.h
Deleted
@@ -1,54 +0,0 @@ -/* Copyright (C) 2010-2015 The RetroArch team - * - * --------------------------------------------------------------------------------------- - * The following license statement only applies to this file (rsemaphore.h). - * --------------------------------------------------------------------------------------- - * - * Permission is hereby granted, free of charge, - * to any person obtaining a copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef __LIBRETRO_SDK_SEMAPHORE_H -#define __LIBRETRO_SDK_SEMAPHORE_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct ssem ssem_t; - -/** - * ssem_create: - * @value : initial value for the semaphore - * - * Create a new semaphore. - * - * Returns: pointer to new semaphore if successful, otherwise NULL. - */ -ssem_t *ssem_new(int value); - -void ssem_free(ssem_t *semaphore); - -int ssem_get(ssem_t *semaphore); - -void ssem_wait(ssem_t *semaphore); - -void ssem_signal(ssem_t *semaphore); - -#ifdef __cplusplus -} -#endif - -#endif /* __LIBRETRO_SDK_SEMAPHORE_H */
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/rthreads/rsemaphore.c
Deleted
@@ -1,116 +0,0 @@ -/* - Copyright 2005 Allen B. Downey - - This file contains an example program from The Little Book of - Semaphores, available from Green Tea Press, greenteapress.com - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see http://www.gnu.org/licenses/gpl.html - or write to the Free Software Foundation, Inc., 51 Franklin St, - Fifth Floor, Boston, MA 02110-1301 USA -*/ - -/* Code taken from http://greenteapress.com/semaphores/semaphore.c - * and changed to use libretro-common's mutexes and conditions. - */ - -#include <stdlib.h> - -#include <rthreads/rthreads.h> -#include <rthreads/rsemaphore.h> - -struct ssem -{ - int value; - int wakeups; - slock_t *mutex; - scond_t *cond; -}; - -ssem_t *ssem_new(int value) -{ - ssem_t *semaphore = (ssem_t*)calloc(1, sizeof(*semaphore)); - - if (!semaphore) - goto error; - - semaphore->value = value; - semaphore->wakeups = 0; - semaphore->mutex = slock_new(); - - if (!semaphore->mutex) - goto error; - - semaphore->cond = scond_new(); - - if (!semaphore->cond) - goto error; - - return semaphore; - -error: - if (semaphore->mutex) - slock_free(semaphore->mutex); - semaphore->mutex = NULL; - if (semaphore) - free((void*)semaphore); - return NULL; -} - -void ssem_free(ssem_t *semaphore) -{ - if (!semaphore) - return; - - scond_free(semaphore->cond); - slock_free(semaphore->mutex); - free((void*)semaphore); -} - -void ssem_wait(ssem_t *semaphore) -{ - if (!semaphore) - return; - - slock_lock(semaphore->mutex); - semaphore->value--; - - if (semaphore->value < 0) - { - do - { - scond_wait(semaphore->cond, semaphore->mutex); - }while (semaphore->wakeups < 1); - - semaphore->wakeups--; - } - - slock_unlock(semaphore->mutex); -} - -void ssem_signal(ssem_t *semaphore) -{ - if (!semaphore) - return; - - slock_lock(semaphore->mutex); - semaphore->value++; - - if (semaphore->value <= 0) - { - semaphore->wakeups++; - scond_signal(semaphore->cond); - } - - slock_unlock(semaphore->mutex); -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/utils/sha1_main.c
Deleted
@@ -1,189 +0,0 @@ -/* - * sha.cpp - * - * Copyright (C) 1998, 2009 - * Paul E. Jones <paulej@packetizer.com> - * All Rights Reserved - * - ***************************************************************************** - * $Id: sha.c 12 2009-06-22 19:34:25Z paulej $ - ***************************************************************************** - * - * Description: - * This utility will display the message digest (fingerprint) for - * the specified file(s). - * - * Portability Issues: - * None. - */ - -#include <stdio.h> -#include <string.h> -#ifdef WIN32 -#include <io.h> -#endif -#include <fcntl.h> -#include <string/stdstring.h> -/*#include "sha1.h"*/ - -/* - * Function prototype - */ -void usage(void); - -/* - * main - * - * Description: - * This is the entry point for the program - * - * Parameters: - * argc: [in] - * This is the count of arguments in the argv array - * argv: [in] - * This is an array of filenames for which to compute message - * digests - * - * Returns: - * Nothing. - * - * Comments: - * - */ -typedef struct SHA1Context -{ - unsigned Message_Digest[5]; /* Message Digest (output) */ - - unsigned Length_Low; /* Message length in bits */ - unsigned Length_High; /* Message length in bits */ - - unsigned char Message_Block[64]; /* 512-bit message blocks */ - int Message_Block_Index; /* Index into message block array */ - - int Computed; /* Is the digest computed? */ - int Corrupted; /* Is the message digest corruped? */ -} SHA1Context; - -int main(int argc, char *argv[]) -{ - struct SHA1Context sha; /* SHA-1 context */ - FILE *fp; /* File pointer for reading files*/ - char c; /* Character read from file */ - int i; /* Counter */ - int reading_stdin; /* Are we reading standard in? */ - int read_stdin = 0; /* Have we read stdin? */ - - /* - * Check the program arguments and print usage information if -? - * or --help is passed as the first argument. - */ - if (argc > 1 && (string_is_equal(argv[1],"-?") || - string_is_equal(argv[1],"--help"))) - { - usage(); - return 1; - } - - /* - * For each filename passed in on the command line, calculate the - * SHA-1 value and display it. - */ - for(i = 0; i < argc; i++) - { - /* - * We start the counter at 0 to guarantee entry into the for - * loop. So if 'i' is zero, we will increment it now. If there - * is no argv[1], we will use STDIN below. - */ - if (i == 0) - i++; - - if (argc == 1 || string_is_equal(argv[i],"-")) - { -#ifdef WIN32 - setmode(fileno(stdin), _O_BINARY); -#endif - fp = stdin; - reading_stdin = 1; - } - else - { - if (!(fp = fopen(argv[i],"rb"))) - { - fprintf(stderr, - "sha: unable to open file %s\n", - argv[i]); - return 2; - } - reading_stdin = 0; - } - - /* - * We do not want to read STDIN multiple times - */ - if (reading_stdin) - { - if (read_stdin) - continue; - - read_stdin = 1; - } - - /* - * Reset the SHA-1 context and process input - */ - SHA1Reset(&sha); - - c = fgetc(fp); - while(!feof(fp)) - { - SHA1Input(&sha, &c, 1); - c = fgetc(fp); - } - - if (!reading_stdin) - fclose(fp); - - if (!SHA1Result(&sha)) - { - fprintf(stderr, - "sha: could not compute message digest for %s\n", - reading_stdin?"STDIN":argv[i]); - } - else - { - printf( "%08X %08X %08X %08X %08X - %s\n", - sha.Message_Digest[0], - sha.Message_Digest[1], - sha.Message_Digest[2], - sha.Message_Digest[3], - sha.Message_Digest[4], - reading_stdin?"STDIN":argv[i]); - } - } - - return 0; -} - -/* - * usage - * - * Description: - * This function will display program usage information to the - * user. - * - * Parameters: - * None. - * - * Returns: - * Nothing. - * - * Comments: - * - */ -void usage(void) -{ - printf("usage: sha <file> [<file> ...]\n"); - printf("\tThis program will display the message digest\n"); - printf("\tfor files using the Secure Hashing Algorithm (SHA-1).\n"); -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/bitmath.c
Deleted
@@ -1,110 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "private/bitmath.h" -#include "FLAC/assert.h" - -/* An example of what FLAC__bitmath_silog2() computes: - * - * silog2(-10) = 5 - * silog2(- 9) = 5 - * silog2(- 8) = 4 - * silog2(- 7) = 4 - * silog2(- 6) = 4 - * silog2(- 5) = 4 - * silog2(- 4) = 3 - * silog2(- 3) = 3 - * silog2(- 2) = 2 - * silog2(- 1) = 2 - * silog2( 0) = 0 - * silog2( 1) = 2 - * silog2( 2) = 3 - * silog2( 3) = 3 - * silog2( 4) = 4 - * silog2( 5) = 4 - * silog2( 6) = 4 - * silog2( 7) = 4 - * silog2( 8) = 5 - * silog2( 9) = 5 - * silog2( 10) = 5 - */ -unsigned FLAC__bitmath_silog2(int v) -{ - while(1) { - if(v == 0) { - return 0; - } - else if(v > 0) { - unsigned l = 0; - while(v) { - l++; - v >>= 1; - } - return l+1; - } - else if(v == -1) { - return 2; - } - else { - v++; - v = -v; - } - } -} - -unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) -{ - while(1) { - if(v == 0) { - return 0; - } - else if(v > 0) { - unsigned l = 0; - while(v) { - l++; - v >>= 1; - } - return l+1; - } - else if(v == -1) { - return 2; - } - else { - v++; - v = -v; - } - } -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/bitwriter.c
Deleted
@@ -1,846 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdlib.h> -#include <string.h> -#include "private/bitwriter.h" -#include "private/crc.h" -#include "private/macros.h" -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "share/compat.h" -#include "share/endswap.h" - -#include <retro_inline.h> -#include <retro_miscellaneous.h> - -/* Things should be fastest when this matches the machine word size */ -/* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ -/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ -#define FLAC__BYTES_PER_WORD 4 -#define FLAC__BITS_PER_WORD 32 -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ -#ifdef MSB_FIRST -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) -#endif - -/* - * The default capacity here doesn't matter too much. The buffer always grows - * to hold whatever is written to it. Usually the encoder will stop adding at - * a frame or metadata block, then write that out and clear the buffer for the - * next one. - */ -static const unsigned FLAC__BITWRITER_DEFAULT_CAPACITY = 32768u / sizeof(uint32_t); /* size in words */ -/* When growing, increment 4K at a time */ -static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(uint32_t); /* size in words */ - -#define FLAC__WORDS_TO_BITS(words) ((words) * FLAC__BITS_PER_WORD) -#define FLAC__TOTAL_BITS(bw) (FLAC__WORDS_TO_BITS((bw)->words) + (bw)->bits) - -struct FLAC__BitWriter { - uint32_t *buffer; - uint32_t accum; /* accumulator; bits are right-justified; when full, accum is appended to buffer */ - unsigned capacity; /* capacity of buffer in words */ - unsigned words; /* # of complete words in buffer */ - unsigned bits; /* # of used bits in accum */ -}; - -/* * WATCHOUT: The current implementation only grows the buffer. */ -#ifndef __SUNPRO_C -static -#endif -FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) -{ - unsigned new_capacity; - uint32_t *new_buffer; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - /* calculate total words needed to store 'bits_to_add' additional bits */ - new_capacity = bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD); - - /* it's possible (due to pessimism in the growth estimation that - * leads to this call) that we don't actually need to grow - */ - if(bw->capacity >= new_capacity) - return true; - - /* round up capacity increase to the nearest FLAC__BITWRITER_DEFAULT_INCREMENT */ - if((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT) - new_capacity += FLAC__BITWRITER_DEFAULT_INCREMENT - ((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); - /* make sure we got everything right */ - FLAC__ASSERT(0 == (new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); - FLAC__ASSERT(new_capacity > bw->capacity); - FLAC__ASSERT(new_capacity >= bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD)); - - new_buffer = (uint32_t*)safe_realloc_mul_2op_(bw->buffer, sizeof(uint32_t), /*times*/new_capacity); - if(new_buffer == 0) - return false; - bw->buffer = new_buffer; - bw->capacity = new_capacity; - return true; -} - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -FLAC__BitWriter *FLAC__bitwriter_new(void) -{ - FLAC__BitWriter *bw = (FLAC__BitWriter*)calloc(1, sizeof(FLAC__BitWriter)); - /* note that calloc() sets all members to 0 for us */ - return bw; -} - -void FLAC__bitwriter_delete(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - FLAC__bitwriter_free(bw); - free(bw); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - bw->words = bw->bits = 0; - bw->capacity = FLAC__BITWRITER_DEFAULT_CAPACITY; - bw->buffer = (uint32_t*)malloc(sizeof(uint32_t) * bw->capacity); - if(bw->buffer == 0) - return false; - - return true; -} - -void FLAC__bitwriter_free(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - if(0 != bw->buffer) - free(bw->buffer); - bw->buffer = 0; - bw->capacity = 0; - bw->words = bw->bits = 0; -} - -void FLAC__bitwriter_clear(FLAC__BitWriter *bw) -{ - bw->words = bw->bits = 0; -} - -void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out) -{ - unsigned i, j; - if(bw == 0) { - fprintf(out, "bitwriter is NULL\n"); - } - else { - fprintf(out, "bitwriter: capacity=%u words=%u bits=%u total_bits=%u\n", bw->capacity, bw->words, bw->bits, FLAC__TOTAL_BITS(bw)); - - for(i = 0; i < bw->words; i++) { - fprintf(out, "%08X: ", i); - for(j = 0; j < FLAC__BITS_PER_WORD; j++) - fprintf(out, "%01u", bw->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); - fprintf(out, "\n"); - } - if(bw->bits > 0) { - fprintf(out, "%08X: ", i); - for(j = 0; j < bw->bits; j++) - fprintf(out, "%01u", bw->accum & (1 << (bw->bits-j-1)) ? 1:0); - fprintf(out, "\n"); - } - } -} - -FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ - - if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) - return false; - - *crc = (FLAC__uint16)FLAC__crc16(buffer, bytes); - FLAC__bitwriter_release_buffer(bw); - return true; -} - -FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ - - if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) - return false; - - *crc = FLAC__crc8(buffer, bytes); - FLAC__bitwriter_release_buffer(bw); - return true; -} - -FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw) -{ - return ((bw->bits & 7) == 0); -} - -unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw) -{ - return FLAC__TOTAL_BITS(bw); -} - -FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes) -{ - FLAC__ASSERT((bw->bits & 7) == 0); - /* double protection */ - if(bw->bits & 7) - return false; - /* if we have bits in the accumulator we have to flush those to the buffer first */ - if(bw->bits) { - FLAC__ASSERT(bw->words <= bw->capacity); - if(bw->words == bw->capacity && !bitwriter_grow_(bw, FLAC__BITS_PER_WORD)) - return false; - /* append bits as complete word to buffer, but don't change bw->accum or bw->bits */ - bw->buffer[bw->words] = SWAP_BE_WORD_TO_HOST(bw->accum << (FLAC__BITS_PER_WORD-bw->bits)); - } - /* now we can just return what we have */ - *buffer = (FLAC__byte*)bw->buffer; - *bytes = (FLAC__BYTES_PER_WORD * bw->words) + (bw->bits >> 3); - return true; -} - -void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw) -{ - /* nothing to do. in the future, strict checking of a 'writer-is-in- - * get-mode' flag could be added everywhere and then cleared here - */ - (void)bw; -} - -FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits) -{ - unsigned n; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - if(bits == 0) - return true; - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) - return false; - /* first part gets to word alignment */ - if(bw->bits) { - n = MIN(FLAC__BITS_PER_WORD - bw->bits, bits); - bw->accum <<= n; - bits -= n; - bw->bits += n; - if(bw->bits == FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - } - else - return true; - } - /* do whole words */ - while(bits >= FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = 0; - bits -= FLAC__BITS_PER_WORD; - } - /* do any leftovers */ - if(bits > 0) { - bw->accum = 0; - bw->bits = bits; - } - return true; -} - -FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits) -{ - register unsigned left; - - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(bits <= 32); - if(bits == 0) - return true; - - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) - return false; - - left = FLAC__BITS_PER_WORD - bw->bits; - if(bits < left) { - bw->accum <<= bits; - bw->accum |= val; - bw->bits += bits; - } - else if(bw->bits) { /* WATCHOUT: if bw->bits == 0, left==FLAC__BITS_PER_WORD and bw->accum<<=left is a NOP instead of setting to 0 */ - bw->accum <<= left; - bw->accum |= val >> (bw->bits = bits - left); - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->accum = val; - } - else { - bw->accum = val; - bw->bits = 0; - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(val); - } - - return true; -} - -FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits) -{ - /* zero-out unused bits */ - if(bits < 32) - val &= (~(0xffffffff << bits)); - - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); -} - -FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits) -{ - /* this could be a little faster but it's not used for much */ - if(bits > 32) { - return - FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(val>>32), bits-32) && - FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 32); - } - else - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); -} - -FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val) -{ - /* this doesn't need to be that fast as currently it is only used for vorbis comments */ - - if(!FLAC__bitwriter_write_raw_uint32(bw, val & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>8) & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>16) & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, val>>24, 8)) - return false; - - return true; -} - -FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals) -{ - unsigned i; - - /* this could be faster but currently we don't need it to be since it's only used for writing metadata */ - for(i = 0; i < nvals; i++) { - if(!FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(vals[i]), 8)) - return false; - } - - return true; -} - -FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val) -{ - if(val < 32) - return FLAC__bitwriter_write_raw_uint32(bw, 1, ++val); - else - return - FLAC__bitwriter_write_zeroes(bw, val) && - FLAC__bitwriter_write_raw_uint32(bw, 1, 1); -} - -unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter) -{ - FLAC__uint32 uval; - - FLAC__ASSERT(parameter < sizeof(unsigned)*8); - - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (val<<1) ^ (val>>31); - - return 1 + parameter + (uval >> parameter); -} - -#if 0 /* UNUSED */ -unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter) -{ - unsigned bits, msbs, uval; - unsigned k; - - FLAC__ASSERT(parameter > 0); - - /* fold signed to unsigned */ - if(val < 0) - uval = (unsigned)(((-(++val)) << 1) + 1); - else - uval = (unsigned)(val << 1); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<<k) { - FLAC__ASSERT(k <= 30); - - msbs = uval >> k; - bits = 1 + k + msbs; - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - - bits = 1 + q + k; - if(r >= d) - bits++; - } - return bits; -} - -unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned uval, unsigned parameter) -{ - unsigned bits, msbs; - unsigned k; - - FLAC__ASSERT(parameter > 0); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<<k) { - FLAC__ASSERT(k <= 30); - - msbs = uval >> k; - bits = 1 + k + msbs; - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - - bits = 1 + q + k; - if(r >= d) - bits++; - } - return bits; -} -#endif /* UNUSED */ - -FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter) -{ - unsigned total_bits, interesting_bits, msbs; - FLAC__uint32 uval, pattern; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter < 8*sizeof(uval)); - - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (val<<1) ^ (val>>31); - - msbs = uval >> parameter; - interesting_bits = 1 + parameter; - total_bits = interesting_bits + msbs; - pattern = 1 << parameter; /* the unary end bit */ - pattern |= (uval & ((1<<parameter)-1)); /* the binary LSBs */ - - if(total_bits <= 32) - return FLAC__bitwriter_write_raw_uint32(bw, pattern, total_bits); - else - return - FLAC__bitwriter_write_zeroes(bw, msbs) && /* write the unary MSBs */ - FLAC__bitwriter_write_raw_uint32(bw, pattern, interesting_bits); /* write the unary end bit and binary LSBs */ -} - -FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter) -{ - const FLAC__uint32 mask1 = FLAC__WORD_ALL_ONES << parameter; /* we val|=mask1 to set the stop bit above it... */ - const FLAC__uint32 mask2 = FLAC__WORD_ALL_ONES >> (31-parameter); /* ...then mask off the bits above the stop bit with val&=mask2*/ - FLAC__uint32 uval; - unsigned left; - const unsigned lsbits = 1 + parameter; - unsigned msbits; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter < 8*sizeof(uint32_t)-1); - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - while(nvals) { - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (*vals<<1) ^ (*vals>>31); - - msbits = uval >> parameter; - - if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ - /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ - bw->bits = bw->bits + msbits + lsbits; - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - bw->accum <<= msbits + lsbits; - bw->accum |= uval; - } - else { - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */ - if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 uint32_t*/ && !bitwriter_grow_(bw, msbits+lsbits)) - return false; - - if(msbits) { - /* first part gets to word alignment */ - if(bw->bits) { - left = FLAC__BITS_PER_WORD - bw->bits; - if(msbits < left) { - bw->accum <<= msbits; - bw->bits += msbits; - goto break1; - } - else { - bw->accum <<= left; - msbits -= left; - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - } - } - /* do whole words */ - while(msbits >= FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = 0; - msbits -= FLAC__BITS_PER_WORD; - } - /* do any leftovers */ - if(msbits > 0) { - bw->accum = 0; - bw->bits = msbits; - } - } -break1: - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - - left = FLAC__BITS_PER_WORD - bw->bits; - if(lsbits < left) { - bw->accum <<= lsbits; - bw->accum |= uval; - bw->bits += lsbits; - } - else { - /* if bw->bits == 0, left==FLAC__BITS_PER_WORD which will always - * be > lsbits (because of previous assertions) so it would have - * triggered the (lsbits<left) case above. - */ - FLAC__ASSERT(bw->bits); - FLAC__ASSERT(left < FLAC__BITS_PER_WORD); - bw->accum <<= left; - bw->accum |= uval >> (bw->bits = lsbits - left); - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->accum = uval; - } - } - vals++; - nvals--; - } - return true; -} - -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter) -{ - unsigned total_bits, msbs, uval; - unsigned k; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter > 0); - - /* fold signed to unsigned */ - if(val < 0) - uval = (unsigned)(((-(++val)) << 1) + 1); - else - uval = (unsigned)(val << 1); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<<k) { - unsigned pattern; - - FLAC__ASSERT(k <= 30); - - msbs = uval >> k; - total_bits = 1 + k + msbs; - pattern = 1 << k; /* the unary end bit */ - pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */ - - if(total_bits <= 32) { - if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, total_bits)) - return false; - } - else { - /* write the unary MSBs */ - if(!FLAC__bitwriter_write_zeroes(bw, msbs)) - return false; - /* write the unary end bit and binary LSBs */ - if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, k+1)) - return false; - } - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - /* write the unary MSBs */ - if(!FLAC__bitwriter_write_zeroes(bw, q)) - return false; - /* write the unary end bit */ - if(!FLAC__bitwriter_write_raw_uint32(bw, 1, 1)) - return false; - /* write the binary LSBs */ - if(r >= d) { - if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) - return false; - } - } - return true; -} - -FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned uval, unsigned parameter) -{ - unsigned total_bits, msbs; - unsigned k; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter > 0); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<<k) { - unsigned pattern; - - FLAC__ASSERT(k <= 30); - - msbs = uval >> k; - total_bits = 1 + k + msbs; - pattern = 1 << k; /* the unary end bit */ - pattern |= (uval & ((1u<<k)-1)); /* the binary LSBs */ - - if(total_bits <= 32) { - if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, total_bits)) - return false; - } - else { - /* write the unary MSBs */ - if(!FLAC__bitwriter_write_zeroes(bw, msbs)) - return false; - /* write the unary end bit and binary LSBs */ - if(!FLAC__bitwriter_write_raw_uint32(bw, pattern, k+1)) - return false; - } - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - /* write the unary MSBs */ - if(!FLAC__bitwriter_write_zeroes(bw, q)) - return false; - /* write the unary end bit */ - if(!FLAC__bitwriter_write_raw_uint32(bw, 1, 1)) - return false; - /* write the binary LSBs */ - if(r >= d) { - if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) - return false; - } - } - return true; -} -#endif /* UNUSED */ - -FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val) -{ - FLAC__bool ok = 1; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */ - - if(val < 0x80) { - return FLAC__bitwriter_write_raw_uint32(bw, val, 8); - } - else if(val < 0x800) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (val>>6), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x10000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (val>>12), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x200000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (val>>18), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x4000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (val>>24), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (val>>30), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - - return ok; -} - -FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val) -{ - FLAC__bool ok = 1; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */ - - if(val < 0x80) { - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 8); - } - else if(val < 0x800) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (FLAC__uint32)(val>>6), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x10000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (FLAC__uint32)(val>>12), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x200000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (FLAC__uint32)(val>>18), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x4000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (FLAC__uint32)(val>>24), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x80000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (FLAC__uint32)(val>>30), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFE, 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - - return ok; -} - -FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) -{ - /* 0-pad to byte boundary */ - if(bw->bits & 7u) - return FLAC__bitwriter_write_zeroes(bw, 8 - (bw->bits & 7u)); - else - return true; -} - -/* These functions are declared inline in this file but are also callable as - * externs from elsewhere. - * According to the C99 spec, section 6.7.4, simply providing a function - * prototype in a header file without 'inline' and making the function inline - * in this file should be sufficient. - * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To - * fix that we add extern declarations here. - */ -extern FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); -extern FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/metadata_iterators.c
Deleted
@@ -1,3351 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> - -#include <sys/stat.h> /* for stat(), maybe chmod() */ - -#include "private/metadata.h" - -#include "FLAC/assert.h" -#include "FLAC/stream_decoder.h" -#include "share/alloc.h" -#include "share/compat.h" -#include "share/macros.h" -#include "share/safe_str.h" -#include "private/macros.h" -#include "private/memory.h" - -#include <retro_miscellaneous.h> - -/* Alias the first (in share/alloc.h) to the second (in src/libFLAC/memory.c). */ -#define safe_malloc_mul_2op_ safe_malloc_mul_2op_p - -/**************************************************************************** - * - * Local function declarations - * - ***************************************************************************/ - -static void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes); -static void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes); -static void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes); -static FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes); -static FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes); -static FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes); - -static FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator); -static FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block); -static FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length); - -static FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block); -static FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length); -static FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length); -static FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block); -static FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block); -static FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block); -static FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block); -static FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length); - -static FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last); -static FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append); - -static void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator); -static FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator); - -static unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb); -static unsigned seek_to_first_metadata_block_(FILE *f); - -static FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append); -static FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, FLAC__off_t fixup_is_last_flag_offset, FLAC__bool backup); - -static FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status); - -static FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status); -static void cleanup_tempfile_(FILE **tempfile, char **tempfilename); - -static FLAC__bool get_file_stats_(const char *filename, struct flac_stat_s *stats); -static void set_file_stats_(const char *filename, struct flac_stat_s *stats); - -static int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence); -static FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle); - -static FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status); - - -#ifdef FLAC__VALGRIND_TESTING -static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) -{ - size_t ret = fwrite(ptr, size, nmemb, stream); - if(!ferror(stream)) - fflush(stream); - return ret; -} -#else -#define local__fwrite fwrite -#endif - -/**************************************************************************** - * - * Level 0 implementation - * - ***************************************************************************/ - -static FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -static void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -static void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - -typedef struct { - FLAC__bool got_error; - FLAC__StreamMetadata *object; -} level0_client_data; - -static FLAC__StreamMetadata *get_one_metadata_block_(const char *filename, FLAC__MetadataType type) -{ - level0_client_data cd; - FLAC__StreamDecoder *decoder; - - FLAC__ASSERT(0 != filename); - - cd.got_error = false; - cd.object = 0; - - decoder = FLAC__stream_decoder_new(); - - if(0 == decoder) - return 0; - - FLAC__stream_decoder_set_md5_checking(decoder, false); - FLAC__stream_decoder_set_metadata_ignore_all(decoder); - FLAC__stream_decoder_set_metadata_respond(decoder, type); - - if(FLAC__stream_decoder_init_file(decoder, filename, write_callback_, metadata_callback_, error_callback_, &cd) != FLAC__STREAM_DECODER_INIT_STATUS_OK || cd.got_error) { - (void)FLAC__stream_decoder_finish(decoder); - FLAC__stream_decoder_delete(decoder); - return 0; - } - - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder) || cd.got_error) { - (void)FLAC__stream_decoder_finish(decoder); - FLAC__stream_decoder_delete(decoder); - if(0 != cd.object) - FLAC__metadata_object_delete(cd.object); - return 0; - } - - (void)FLAC__stream_decoder_finish(decoder); - FLAC__stream_decoder_delete(decoder); - - return cd.object; -} - -FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo) -{ - FLAC__StreamMetadata *object; - - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != streaminfo); - - object = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_STREAMINFO); - - if (object) { - /* can just copy the contents since STREAMINFO has no internal structure */ - *streaminfo = *object; - FLAC__metadata_object_delete(object); - return true; - } - else { - return false; - } -} - -FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != tags); - - *tags = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_VORBIS_COMMENT); - - return 0 != *tags; -} - -FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != cuesheet); - - *cuesheet = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_CUESHEET); - - return 0 != *cuesheet; -} - -FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - (void)decoder, (void)frame, (void)buffer, (void)client_data; - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; -} - -void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - level0_client_data *cd = (level0_client_data *)client_data; - (void)decoder; - - /* - * we assume we only get here when the one metadata block we were - * looking for was passed to us - */ - if(!cd->got_error && 0 == cd->object) { - if(0 == (cd->object = FLAC__metadata_object_clone(metadata))) - cd->got_error = true; - } -} - -void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - level0_client_data *cd = (level0_client_data *)client_data; - (void)decoder; - - if(status != FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC) - cd->got_error = true; -} - -FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors) -{ - FLAC__Metadata_SimpleIterator *it; - FLAC__uint64 max_area_seen = 0; - FLAC__uint64 max_depth_seen = 0; - - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != picture); - - *picture = 0; - - it = FLAC__metadata_simple_iterator_new(); - if(0 == it) - return false; - if(!FLAC__metadata_simple_iterator_init(it, filename, /*read_only=*/true, /*preserve_file_stats=*/true)) { - FLAC__metadata_simple_iterator_delete(it); - return false; - } - do { - if(FLAC__metadata_simple_iterator_get_block_type(it) == FLAC__METADATA_TYPE_PICTURE) { - FLAC__StreamMetadata *obj = FLAC__metadata_simple_iterator_get_block(it); - FLAC__uint64 area = (FLAC__uint64)obj->data.picture.width * (FLAC__uint64)obj->data.picture.height; - /* check constraints */ - if( - (type == (FLAC__StreamMetadata_Picture_Type)(-1) || type == obj->data.picture.type) && - (mime_type == 0 || !strcmp(mime_type, obj->data.picture.mime_type)) && - (description == 0 || !strcmp((const char *)description, (const char *)obj->data.picture.description)) && - obj->data.picture.width <= max_width && - obj->data.picture.height <= max_height && - obj->data.picture.depth <= max_depth && - obj->data.picture.colors <= max_colors && - (area > max_area_seen || (area == max_area_seen && obj->data.picture.depth > max_depth_seen)) - ) { - if(*picture) - FLAC__metadata_object_delete(*picture); - *picture = obj; - max_area_seen = area; - max_depth_seen = obj->data.picture.depth; - } - else { - FLAC__metadata_object_delete(obj); - } - } - } while(FLAC__metadata_simple_iterator_next(it)); - - FLAC__metadata_simple_iterator_delete(it); - - return (0 != *picture); -} - - -/**************************************************************************** - * - * Level 1 implementation - * - ***************************************************************************/ - -#define SIMPLE_ITERATOR_MAX_PUSH_DEPTH (1+4) -/* 1 for initial offset, +4 for our own personal use */ - -struct FLAC__Metadata_SimpleIterator { - FILE *file; - char *filename, *tempfile_path_prefix; - struct flac_stat_s stats; - FLAC__bool has_stats; - FLAC__bool is_writable; - FLAC__Metadata_SimpleIteratorStatus status; - FLAC__off_t offset[SIMPLE_ITERATOR_MAX_PUSH_DEPTH]; - FLAC__off_t first_offset; /* this is the offset to the STREAMINFO block */ - unsigned depth; - /* this is the metadata block header of the current block we are pointing to: */ - FLAC__bool is_last; - FLAC__MetadataType type; - unsigned length; -}; - -FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[] = { - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR" -}; - - -FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void) -{ - FLAC__Metadata_SimpleIterator *iterator = calloc(1, sizeof(FLAC__Metadata_SimpleIterator)); - - if(0 != iterator) { - iterator->file = 0; - iterator->filename = 0; - iterator->tempfile_path_prefix = 0; - iterator->has_stats = false; - iterator->is_writable = false; - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; - iterator->first_offset = iterator->offset[0] = -1; - iterator->depth = 0; - } - - return iterator; -} - -static void simple_iterator_free_guts_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - if(0 != iterator->file) { - fclose(iterator->file); - iterator->file = 0; - if(iterator->has_stats) - set_file_stats_(iterator->filename, &iterator->stats); - } - if(0 != iterator->filename) { - free(iterator->filename); - iterator->filename = 0; - } - if(0 != iterator->tempfile_path_prefix) { - free(iterator->tempfile_path_prefix); - iterator->tempfile_path_prefix = 0; - } -} - -FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - simple_iterator_free_guts_(iterator); - free(iterator); -} - -FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__Metadata_SimpleIteratorStatus status; - - FLAC__ASSERT(0 != iterator); - - status = iterator->status; - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; - return status; -} - -static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool read_only) -{ - unsigned ret; - - FLAC__ASSERT(0 != iterator); - - if(read_only || 0 == (iterator->file = flac_fopen(iterator->filename, "r+b"))) { - iterator->is_writable = false; - if(read_only || errno == EACCES) { - if(0 == (iterator->file = flac_fopen(iterator->filename, "rb"))) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; - return false; - } - } - else { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; - return false; - } - } - else { - iterator->is_writable = true; - } - - ret = seek_to_first_metadata_block_(iterator->file); - switch(ret) { - case 0: - iterator->depth = 0; - iterator->first_offset = iterator->offset[iterator->depth] = ftello(iterator->file); - return read_metadata_block_header_(iterator); - case 1: - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - case 2: - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - case 3: - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE; - return false; - default: - FLAC__ASSERT(0); - return false; - } -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats) -{ - const char *tempfile_path_prefix = 0; /*@@@ search for comments near 'flac_rename(...)' for what it will take to finish implementing this */ - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != filename); - - simple_iterator_free_guts_(iterator); - - if(!read_only && preserve_file_stats) - iterator->has_stats = get_file_stats_(filename, &iterator->stats); - - if(0 == (iterator->filename = strdup(filename))) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - if(0 != tempfile_path_prefix && 0 == (iterator->tempfile_path_prefix = strdup(tempfile_path_prefix))) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - return simple_iterator_prime_input_(iterator, read_only); -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->is_writable; -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(iterator->is_last) - return false; - - if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - iterator->offset[iterator->depth] = ftello(iterator->file); - - return read_metadata_block_header_(iterator); -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__off_t this_offset; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(iterator->offset[iterator->depth] == iterator->first_offset) - return false; - - if(0 != fseeko(iterator->file, iterator->first_offset, SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - this_offset = iterator->first_offset; - if(!read_metadata_block_header_(iterator)) - return false; - - /* we ignore any error from ftello() and catch it in fseeko() */ - while(ftello(iterator->file) + (FLAC__off_t)iterator->length < iterator->offset[iterator->depth]) { - if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - this_offset = ftello(iterator->file); - if(!read_metadata_block_header_(iterator)) - return false; - } - - iterator->offset[iterator->depth] = this_offset; - - return true; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->is_last; -} - -/*@@@@add to tests*/ -FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->offset[iterator->depth]; -} - -FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->type; -} - -/*@@@@add to tests*/ -FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->length; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id) -{ - const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - FLAC__ASSERT(0 != id); - - if(iterator->type != FLAC__METADATA_TYPE_APPLICATION) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - - if(fread(id, 1, id_bytes, iterator->file) != id_bytes) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - - /* back up */ - if(0 != fseeko(iterator->file, -((int)id_bytes), SEEK_CUR)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return true; -} - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__StreamMetadata *block = FLAC__metadata_object_new(iterator->type); - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(0 != block) { - block->is_last = iterator->is_last; - block->length = iterator->length; - - if(!read_metadata_block_data_(iterator, block)) { - FLAC__metadata_object_delete(block); - return 0; - } - - /* back up to the beginning of the block data to stay consistent */ - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH, SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - FLAC__metadata_object_delete(block); - return 0; - } - } - else - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - return block; -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding) -{ - FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth];) - FLAC__bool ret; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - FLAC__ASSERT(0 != block); - - if(!iterator->is_writable) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE; - return false; - } - - if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO || block->type == FLAC__METADATA_TYPE_STREAMINFO) { - if(iterator->type != block->type) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - } - - block->is_last = iterator->is_last; - - if(iterator->length == block->length) - return write_metadata_block_stationary_(iterator, block); - else if(iterator->length > block->length) { - if(use_padding && iterator->length >= FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) { - ret = write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - FLAC__STREAM_METADATA_HEADER_LENGTH - block->length, block->is_last); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - else { - ret = rewrite_whole_file_(iterator, block, /*append=*/false); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } - else /* iterator->length < block->length */ { - unsigned padding_leftover = 0; - FLAC__bool padding_is_last = false; - if(use_padding) { - /* first see if we can even use padding */ - if(iterator->is_last) { - use_padding = false; - } - else { - const unsigned extra_padding_bytes_required = block->length - iterator->length; - simple_iterator_push_(iterator); - if(!FLAC__metadata_simple_iterator_next(iterator)) { - (void)simple_iterator_pop_(iterator); - return false; - } - if(iterator->type != FLAC__METADATA_TYPE_PADDING) { - use_padding = false; - } - else { - if(FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length == extra_padding_bytes_required) { - padding_leftover = 0; - block->is_last = iterator->is_last; - } - else if(iterator->length < extra_padding_bytes_required) - use_padding = false; - else { - padding_leftover = FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length - extra_padding_bytes_required; - padding_is_last = iterator->is_last; - block->is_last = false; - } - } - if(!simple_iterator_pop_(iterator)) - return false; - } - } - if(use_padding) { - if(padding_leftover == 0) { - ret = write_metadata_block_stationary_(iterator, block); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - else { - FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH); - ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } - else { - ret = rewrite_whole_file_(iterator, block, /*append=*/false); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding) -{ - unsigned padding_leftover = 0; - FLAC__bool padding_is_last = false; - - FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length;) - FLAC__bool ret; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - FLAC__ASSERT(0 != block); - - if(!iterator->is_writable) - return false; - - if(block->type == FLAC__METADATA_TYPE_STREAMINFO) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - - block->is_last = iterator->is_last; - - if(use_padding) { - /* first see if we can even use padding */ - if(iterator->is_last) { - use_padding = false; - } - else { - simple_iterator_push_(iterator); - if(!FLAC__metadata_simple_iterator_next(iterator)) { - (void)simple_iterator_pop_(iterator); - return false; - } - if(iterator->type != FLAC__METADATA_TYPE_PADDING) { - use_padding = false; - } - else { - if(iterator->length == block->length) { - padding_leftover = 0; - block->is_last = iterator->is_last; - } - else if(iterator->length < FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) - use_padding = false; - else { - padding_leftover = iterator->length - block->length; - padding_is_last = iterator->is_last; - block->is_last = false; - } - } - if(!simple_iterator_pop_(iterator)) - return false; - } - } - if(use_padding) { - /* move to the next block, which is suitable padding */ - if(!FLAC__metadata_simple_iterator_next(iterator)) - return false; - if(padding_leftover == 0) { - ret = write_metadata_block_stationary_(iterator, block); - FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - else { - FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH); - ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last); - FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } - else { - ret = rewrite_whole_file_(iterator, block, /*append=*/true); - FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding) -{ - FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth];) - FLAC__bool ret; - - if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - - if(use_padding) { - FLAC__StreamMetadata *padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING); - if(0 == padding) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - padding->length = iterator->length; - if(!FLAC__metadata_simple_iterator_set_block(iterator, padding, false)) { - FLAC__metadata_object_delete(padding); - return false; - } - FLAC__metadata_object_delete(padding); - if(!FLAC__metadata_simple_iterator_prev(iterator)) - return false; - FLAC__ASSERT(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) + (FLAC__off_t)iterator->length == debug_target_offset); - return true; - } - else { - ret = rewrite_whole_file_(iterator, 0, /*append=*/false); - FLAC__ASSERT(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) + (FLAC__off_t)iterator->length == debug_target_offset); - return ret; - } -} - - - -/**************************************************************************** - * - * Level 2 implementation - * - ***************************************************************************/ - - -typedef struct FLAC__Metadata_Node { - FLAC__StreamMetadata *data; - struct FLAC__Metadata_Node *prev, *next; -} FLAC__Metadata_Node; - -struct FLAC__Metadata_Chain { - char *filename; /* will be NULL if using callbacks */ - FLAC__bool is_ogg; - FLAC__Metadata_Node *head; - FLAC__Metadata_Node *tail; - unsigned nodes; - FLAC__Metadata_ChainStatus status; - FLAC__off_t first_offset, last_offset; - /* - * This is the length of the chain initially read from the FLAC file. - * it is used to compare against the current length to decide whether - * or not the whole file has to be rewritten. - */ - FLAC__off_t initial_length; - /* @@@ hacky, these are currently only needed by ogg reader */ - FLAC__IOHandle handle; - FLAC__IOCallback_Read read_cb; -}; - -struct FLAC__Metadata_Iterator { - FLAC__Metadata_Chain *chain; - FLAC__Metadata_Node *current; -}; - -FLAC_API const char * const FLAC__Metadata_ChainStatusString[] = { - "FLAC__METADATA_CHAIN_STATUS_OK", - "FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT", - "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE", - "FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE", - "FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE", - "FLAC__METADATA_CHAIN_STATUS_BAD_METADATA", - "FLAC__METADATA_CHAIN_STATUS_READ_ERROR", - "FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR", - "FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR", - "FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR", - "FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR", - "FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR", - "FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR", - "FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS", - "FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH", - "FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL" -}; - - -static FLAC__Metadata_Node *node_new_(void) -{ - return calloc(1, sizeof(FLAC__Metadata_Node)); -} - -static void node_delete_(FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != node); - if(0 != node->data) - FLAC__metadata_object_delete(node->data); - free(node); -} - -static void chain_init_(FLAC__Metadata_Chain *chain) -{ - FLAC__ASSERT(0 != chain); - - chain->filename = 0; - chain->is_ogg = false; - chain->head = chain->tail = 0; - chain->nodes = 0; - chain->status = FLAC__METADATA_CHAIN_STATUS_OK; - chain->initial_length = 0; - chain->read_cb = 0; -} - -static void chain_clear_(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_Node *node, *next; - - FLAC__ASSERT(0 != chain); - - for(node = chain->head; node; ) { - next = node->next; - node_delete_(node); - node = next; - } - - if(0 != chain->filename) - free(chain->filename); - - chain_init_(chain); -} - -static void chain_append_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != node); - FLAC__ASSERT(0 != node->data); - - node->next = node->prev = 0; - node->data->is_last = true; - if(0 != chain->tail) - chain->tail->data->is_last = false; - - if(0 == chain->head) - chain->head = node; - else { - FLAC__ASSERT(0 != chain->tail); - chain->tail->next = node; - node->prev = chain->tail; - } - chain->tail = node; - chain->nodes++; -} - -static void chain_remove_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != node); - - if(node == chain->head) - chain->head = node->next; - else - node->prev->next = node->next; - - if(node == chain->tail) - chain->tail = node->prev; - else - node->next->prev = node->prev; - - if(0 != chain->tail) - chain->tail->data->is_last = true; - - chain->nodes--; -} - -static void chain_delete_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - chain_remove_node_(chain, node); - node_delete_(node); -} - -static FLAC__off_t chain_calculate_length_(FLAC__Metadata_Chain *chain) -{ - const FLAC__Metadata_Node *node; - FLAC__off_t length = 0; - for(node = chain->head; node; node = node->next) - length += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); - return length; -} - -static void iterator_insert_node_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != node); - FLAC__ASSERT(0 != node->data); - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != iterator->chain); - FLAC__ASSERT(0 != iterator->chain->head); - FLAC__ASSERT(0 != iterator->chain->tail); - - node->data->is_last = false; - - node->prev = iterator->current->prev; - node->next = iterator->current; - - if(0 == node->prev) - iterator->chain->head = node; - else - node->prev->next = node; - - iterator->current->prev = node; - - iterator->chain->nodes++; -} - -static void iterator_insert_node_after_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != node); - FLAC__ASSERT(0 != node->data); - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != iterator->chain); - FLAC__ASSERT(0 != iterator->chain->head); - FLAC__ASSERT(0 != iterator->chain->tail); - - iterator->current->data->is_last = false; - - node->prev = iterator->current; - node->next = iterator->current->next; - - if(0 == node->next) - iterator->chain->tail = node; - else - node->next->prev = node; - - node->prev->next = node; - - iterator->chain->tail->data->is_last = true; - - iterator->chain->nodes++; -} - -/* return true iff node and node->next are both padding */ -static FLAC__bool chain_merge_adjacent_padding_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - if(node->data->type == FLAC__METADATA_TYPE_PADDING && 0 != node->next && node->next->data->type == FLAC__METADATA_TYPE_PADDING) { - const unsigned growth = FLAC__STREAM_METADATA_HEADER_LENGTH + node->next->data->length; - node->data->length += growth; - - chain_delete_node_(chain, node->next); - return true; - } - else - return false; -} - -/* Returns the new length of the chain, or 0 if there was an error. */ -/* WATCHOUT: This can get called multiple times before a write, so - * it should still work when this happens. - */ -/* WATCHOUT: Make sure to also update the logic in - * FLAC__metadata_chain_check_if_tempfile_needed() if the logic here changes. - */ -static FLAC__off_t chain_prepare_for_write_(FLAC__Metadata_Chain *chain, FLAC__bool use_padding) -{ - FLAC__off_t current_length = chain_calculate_length_(chain); - - if(use_padding) { - /* if the metadata shrank and the last block is padding, we just extend the last padding block */ - if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { - const FLAC__off_t delta = chain->initial_length - current_length; - chain->tail->data->length += delta; - current_length += delta; - FLAC__ASSERT(current_length == chain->initial_length); - } - /* if the metadata shrank more than 4 bytes then there's room to add another padding block */ - else if(current_length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) { - FLAC__StreamMetadata *padding; - FLAC__Metadata_Node *node; - if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return 0; - } - padding->length = chain->initial_length - (FLAC__STREAM_METADATA_HEADER_LENGTH + current_length); - if(0 == (node = node_new_())) { - FLAC__metadata_object_delete(padding); - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return 0; - } - node->data = padding; - chain_append_node_(chain, node); - current_length = chain_calculate_length_(chain); - FLAC__ASSERT(current_length == chain->initial_length); - } - /* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */ - else if(current_length > chain->initial_length) { - const FLAC__off_t delta = current_length - chain->initial_length; - if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { - /* if the delta is exactly the size of the last padding block, remove the padding block */ - if((FLAC__off_t)chain->tail->data->length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) { - chain_delete_node_(chain, chain->tail); - current_length = chain_calculate_length_(chain); - FLAC__ASSERT(current_length == chain->initial_length); - } - /* if there is at least 'delta' bytes of padding, trim the padding down */ - else if((FLAC__off_t)chain->tail->data->length >= delta) { - chain->tail->data->length -= delta; - current_length -= delta; - FLAC__ASSERT(current_length == chain->initial_length); - } - } - } - } - - return current_length; -} - -static FLAC__bool chain_read_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Tell tell_cb) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - - /* we assume we're already at the beginning of the file */ - - switch(seek_to_first_metadata_block_cb_(handle, read_cb, seek_cb)) { - case 0: - break; - case 1: - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - case 2: - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - case 3: - chain->status = FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE; - return false; - default: - FLAC__ASSERT(0); - return false; - } - - { - FLAC__int64 pos = tell_cb(handle); - if(pos < 0) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - } - chain->first_offset = (FLAC__off_t)pos; - } - - { - FLAC__bool is_last; - FLAC__MetadataType type; - unsigned length; - - do { - node = node_new_(); - if(0 == node) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - if(!read_metadata_block_header_cb_(handle, read_cb, &is_last, &type, &length)) { - node_delete_(node); - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - } - - node->data = FLAC__metadata_object_new(type); - if(0 == node->data) { - node_delete_(node); - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - node->data->is_last = is_last; - node->data->length = length; - - chain->status = get_equivalent_status_(read_metadata_block_data_cb_(handle, read_cb, seek_cb, node->data)); - if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) { - node_delete_(node); - return false; - } - chain_append_node_(chain, node); - } while(!is_last); - } - - { - FLAC__int64 pos = tell_cb(handle); - if(pos < 0) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - } - chain->last_offset = (FLAC__off_t)pos; - } - - chain->initial_length = chain_calculate_length_(chain); - - return true; -} - -static FLAC__StreamDecoderReadStatus chain_read_ogg_read_cb_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; - (void)decoder; - if(*bytes > 0 && chain->status == FLAC__METADATA_CHAIN_STATUS_OK) { - *bytes = chain->read_cb(buffer, sizeof(FLAC__byte), *bytes, chain->handle); - if(*bytes == 0) - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - else - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - } - else - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; -} - -static FLAC__StreamDecoderWriteStatus chain_read_ogg_write_cb_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - (void)decoder, (void)frame, (void)buffer, (void)client_data; - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; -} - -static void chain_read_ogg_metadata_cb_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; - FLAC__Metadata_Node *node; - - (void)decoder; - - node = node_new_(); - if(0 == node) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return; - } - - node->data = FLAC__metadata_object_clone(metadata); - if(0 == node->data) { - node_delete_(node); - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return; - } - - chain_append_node_(chain, node); -} - -static void chain_read_ogg_error_cb_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; - (void)decoder, (void)status; - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ -} - -static FLAC__bool chain_read_ogg_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb) -{ - FLAC__StreamDecoder *decoder; - - FLAC__ASSERT(0 != chain); - - /* we assume we're already at the beginning of the file */ - - chain->handle = handle; - chain->read_cb = read_cb; - if(0 == (decoder = FLAC__stream_decoder_new())) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - FLAC__stream_decoder_set_metadata_respond_all(decoder); - if(FLAC__stream_decoder_init_ogg_stream(decoder, chain_read_ogg_read_cb_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, chain_read_ogg_write_cb_, chain_read_ogg_metadata_cb_, chain_read_ogg_error_cb_, chain) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { - FLAC__stream_decoder_delete(decoder); - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ - return false; - } - - chain->first_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */ - - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ - if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) { - FLAC__stream_decoder_delete(decoder); - return false; - } - - FLAC__stream_decoder_delete(decoder); - - chain->last_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */ - - chain->initial_length = chain_calculate_length_(chain); - - return true; -} - -static FLAC__bool chain_rewrite_metadata_in_place_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, FLAC__IOCallback_Seek seek_cb) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != chain->head); - - if(0 != seek_cb(handle, chain->first_offset, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - - for(node = chain->head; node; node = node->next) { - if(!write_metadata_block_header_cb_(handle, write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - if(!write_metadata_block_data_cb_(handle, write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - } - - /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ - - chain->status = FLAC__METADATA_CHAIN_STATUS_OK; - return true; -} - -static FLAC__bool chain_rewrite_metadata_in_place_(FLAC__Metadata_Chain *chain) -{ - FILE *file; - FLAC__bool ret; - - FLAC__ASSERT(0 != chain->filename); - - if(0 == (file = flac_fopen(chain->filename, "r+b"))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - return false; - } - - /* chain_rewrite_metadata_in_place_cb_() sets chain->status for us */ - ret = chain_rewrite_metadata_in_place_cb_(chain, (FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, fseek_wrapper_); - - fclose(file); - - return ret; -} - -static FLAC__bool chain_rewrite_file_(FLAC__Metadata_Chain *chain, const char *tempfile_path_prefix) -{ - FILE *f, *tempfile = NULL; - char *tempfilename; - FLAC__Metadata_SimpleIteratorStatus status; - const FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != chain->filename); - FLAC__ASSERT(0 != chain->head); - - /* copy the file prefix (data up to first metadata block */ - if(0 == (f = flac_fopen(chain->filename, "rb"))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - return false; - } - if(!open_tempfile_(chain->filename, tempfile_path_prefix, &tempfile, &tempfilename, &status)) { - chain->status = get_equivalent_status_(status); - goto err; - } - if(!copy_n_bytes_from_file_(f, tempfile, chain->first_offset, &status)) { - chain->status = get_equivalent_status_(status); - goto err; - } - - /* write the metadata */ - for(node = chain->head; node; node = node->next) { - if(!write_metadata_block_header_(tempfile, &status, node->data)) { - chain->status = get_equivalent_status_(status); - goto err; - } - if(!write_metadata_block_data_(tempfile, &status, node->data)) { - chain->status = get_equivalent_status_(status); - goto err; - } - } - /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ - - /* copy the file postfix (everything after the metadata) */ - if(0 != fseeko(f, chain->last_offset, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - goto err; - } - if(!copy_remaining_bytes_from_file_(f, tempfile, &status)) { - chain->status = get_equivalent_status_(status); - goto err; - } - - /* move the tempfile on top of the original */ - (void)fclose(f); - if(!transport_tempfile_(chain->filename, &tempfile, &tempfilename, &status)) - return false; - - return true; - -err: - (void)fclose(f); - cleanup_tempfile_(&tempfile, &tempfilename); - return false; -} - -/* assumes 'handle' is already at beginning of file */ -static FLAC__bool chain_rewrite_file_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb) -{ - FLAC__Metadata_SimpleIteratorStatus status; - const FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 == chain->filename); - FLAC__ASSERT(0 != chain->head); - - /* copy the file prefix (data up to first metadata block */ - if(!copy_n_bytes_from_file_cb_(handle, read_cb, temp_handle, temp_write_cb, chain->first_offset, &status)) { - chain->status = get_equivalent_status_(status); - return false; - } - - /* write the metadata */ - for(node = chain->head; node; node = node->next) { - if(!write_metadata_block_header_cb_(temp_handle, temp_write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - if(!write_metadata_block_data_cb_(temp_handle, temp_write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - } - /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ - - /* copy the file postfix (everything after the metadata) */ - if(0 != seek_cb(handle, chain->last_offset, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - if(!copy_remaining_bytes_from_file_cb_(handle, read_cb, eof_cb, temp_handle, temp_write_cb, &status)) { - chain->status = get_equivalent_status_(status); - return false; - } - - return true; -} - -FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void) -{ - FLAC__Metadata_Chain *chain = calloc(1, sizeof(FLAC__Metadata_Chain)); - - if(0 != chain) - chain_init_(chain); - - return chain; -} - -FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain) -{ - FLAC__ASSERT(0 != chain); - - chain_clear_(chain); - - free(chain); -} - -FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_ChainStatus status; - - FLAC__ASSERT(0 != chain); - - status = chain->status; - chain->status = FLAC__METADATA_CHAIN_STATUS_OK; - return status; -} - -static FLAC__bool chain_read_(FLAC__Metadata_Chain *chain, const char *filename, FLAC__bool is_ogg) -{ - FILE *file; - FLAC__bool ret; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != filename); - - chain_clear_(chain); - - if(0 == (chain->filename = strdup(filename))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - chain->is_ogg = is_ogg; - - if(0 == (file = flac_fopen(filename, "rb"))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - return false; - } - - /* the function also sets chain->status for us */ - ret = is_ogg? - chain_read_ogg_cb_(chain, file, (FLAC__IOCallback_Read)fread) : - chain_read_cb_(chain, file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, ftell_wrapper_) - ; - - fclose(file); - - return ret; -} - -FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename) -{ - return chain_read_(chain, filename, /*is_ogg=*/false); -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename) -{ - return chain_read_(chain, filename, /*is_ogg=*/true); -} - -static FLAC__bool chain_read_with_callbacks_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__bool is_ogg) -{ - FLAC__bool ret; - - FLAC__ASSERT(0 != chain); - - chain_clear_(chain); - - if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.tell) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - - chain->is_ogg = is_ogg; - - /* rewind */ - if(0 != callbacks.seek(handle, 0, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - - /* the function also sets chain->status for us */ - ret = is_ogg? - chain_read_ogg_cb_(chain, handle, callbacks.read) : - chain_read_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.tell) - ; - - return ret; -} - -FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) -{ - return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/false); -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) -{ - return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/true); -} - -FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding) -{ - /* This does all the same checks that are in chain_prepare_for_write_() - * but doesn't actually alter the chain. Make sure to update the logic - * here if chain_prepare_for_write_() changes. - */ - const FLAC__off_t current_length = chain_calculate_length_(chain); - - FLAC__ASSERT(0 != chain); - - if(use_padding) { - /* if the metadata shrank and the last block is padding, we just extend the last padding block */ - if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) - return false; - /* if the metadata shrank more than 4 bytes then there's room to add another padding block */ - else if(current_length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) - return false; - /* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */ - else if(current_length > chain->initial_length) { - const FLAC__off_t delta = current_length - chain->initial_length; - if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { - /* if the delta is exactly the size of the last padding block, remove the padding block */ - if((FLAC__off_t)chain->tail->data->length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) - return false; - /* if there is at least 'delta' bytes of padding, trim the padding down */ - else if((FLAC__off_t)chain->tail->data->length >= delta) - return false; - } - } - } - - return (current_length != chain->initial_length); -} - -FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats) -{ - struct flac_stat_s stats; - const char *tempfile_path_prefix = 0; - FLAC__off_t current_length; - - FLAC__ASSERT(0 != chain); - - if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - return false; - } - - if (0 == chain->filename) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; - return false; - } - - current_length = chain_prepare_for_write_(chain, use_padding); - - /* a return value of 0 means there was an error; chain->status is already set */ - if (0 == current_length) - return false; - - if(preserve_file_stats) - get_file_stats_(chain->filename, &stats); - - if(current_length == chain->initial_length) { - if(!chain_rewrite_metadata_in_place_(chain)) - return false; - } - else { - if(!chain_rewrite_file_(chain, tempfile_path_prefix)) - return false; - - /* recompute lengths and offsets */ - { - const FLAC__Metadata_Node *node; - chain->initial_length = current_length; - chain->last_offset = chain->first_offset; - for(node = chain->head; node; node = node->next) - chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); - } - } - - if(preserve_file_stats) - set_file_stats_(chain->filename, &stats); - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) -{ - FLAC__off_t current_length; - - FLAC__ASSERT(0 != chain); - - if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - return false; - } - - if (0 != chain->filename) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; - return false; - } - - if (0 == callbacks.write || 0 == callbacks.seek) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - - if (FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL; - return false; - } - - current_length = chain_prepare_for_write_(chain, use_padding); - - /* a return value of 0 means there was an error; chain->status is already set */ - if (0 == current_length) - return false; - - FLAC__ASSERT(current_length == chain->initial_length); - - return chain_rewrite_metadata_in_place_cb_(chain, handle, callbacks.write, callbacks.seek); -} - -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks) -{ - FLAC__off_t current_length; - - FLAC__ASSERT(0 != chain); - - if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - return false; - } - - if (0 != chain->filename) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; - return false; - } - - if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.eof) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - if (0 == temp_callbacks.write) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - - if (!FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL; - return false; - } - - current_length = chain_prepare_for_write_(chain, use_padding); - - /* a return value of 0 means there was an error; chain->status is already set */ - if (0 == current_length) - return false; - - FLAC__ASSERT(current_length != chain->initial_length); - - /* rewind */ - if(0 != callbacks.seek(handle, 0, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - - if(!chain_rewrite_file_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.eof, temp_handle, temp_callbacks.write)) - return false; - - /* recompute lengths and offsets */ - { - const FLAC__Metadata_Node *node; - chain->initial_length = current_length; - chain->last_offset = chain->first_offset; - for(node = chain->head; node; node = node->next) - chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); - } - - return true; -} - -FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - - for(node = chain->head; node; ) { - if(!chain_merge_adjacent_padding_(chain, node)) - node = node->next; - } -} - -FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_Node *node, *save; - unsigned i; - - FLAC__ASSERT(0 != chain); - - /* - * Don't try and be too smart... this simple algo is good enough for - * the small number of nodes that we deal with. - */ - for(i = 0, node = chain->head; i < chain->nodes; i++) { - if(node->data->type == FLAC__METADATA_TYPE_PADDING) { - save = node->next; - chain_remove_node_(chain, node); - chain_append_node_(chain, node); - node = save; - } - else { - node = node->next; - } - } - - FLAC__metadata_chain_merge_padding(chain); -} - - -FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void) -{ - FLAC__Metadata_Iterator *iterator = calloc(1, sizeof(FLAC__Metadata_Iterator)); - - /* calloc() implies: - iterator->current = 0; - iterator->chain = 0; - */ - - return iterator; -} - -FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - free(iterator); -} - -FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != chain->head); - - iterator->chain = chain; - iterator->current = chain->head; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - if(0 == iterator->current || 0 == iterator->current->next) - return false; - - iterator->current = iterator->current->next; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - if(0 == iterator->current || 0 == iterator->current->prev) - return false; - - iterator->current = iterator->current->prev; - return true; -} - -FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != iterator->current->data); - - return iterator->current->data->type; -} - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - - return iterator->current->data; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != block); - return FLAC__metadata_iterator_delete_block(iterator, false) && FLAC__metadata_iterator_insert_block_after(iterator, block); -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding) -{ - FLAC__Metadata_Node *save; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - - if(0 == iterator->current->prev) { - FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO); - return false; - } - - save = iterator->current->prev; - - if(replace_with_padding) { - FLAC__metadata_object_delete_data(iterator->current->data); - iterator->current->data->type = FLAC__METADATA_TYPE_PADDING; - } - else { - chain_delete_node_(iterator->chain, iterator->current); - } - - iterator->current = save; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != block); - - if(block->type == FLAC__METADATA_TYPE_STREAMINFO) - return false; - - if(0 == iterator->current->prev) { - FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO); - return false; - } - - if(0 == (node = node_new_())) - return false; - - node->data = block; - iterator_insert_node_(iterator, node); - iterator->current = node; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != block); - - if(block->type == FLAC__METADATA_TYPE_STREAMINFO) - return false; - - if(0 == (node = node_new_())) - return false; - - node->data = block; - iterator_insert_node_after_(iterator, node); - iterator->current = node; - return true; -} - - -/**************************************************************************** - * - * Local function definitions - * - ***************************************************************************/ - -void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes) -{ - unsigned i; - - b += bytes; - - for(i = 0; i < bytes; i++) { - *(--b) = (FLAC__byte)(val & 0xff); - val >>= 8; - } -} - -void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes) -{ - unsigned i; - - for(i = 0; i < bytes; i++) { - *(b++) = (FLAC__byte)(val & 0xff); - val >>= 8; - } -} - -void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes) -{ - unsigned i; - - b += bytes; - - for(i = 0; i < bytes; i++) { - *(--b) = (FLAC__byte)(val & 0xff); - val >>= 8; - } -} - -FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes) -{ - FLAC__uint32 ret = 0; - unsigned i; - - for(i = 0; i < bytes; i++) - ret = (ret << 8) | (FLAC__uint32)(*b++); - - return ret; -} - -FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes) -{ - FLAC__uint32 ret = 0; - unsigned i; - - b += bytes; - - for(i = 0; i < bytes; i++) - ret = (ret << 8) | (FLAC__uint32)(*--b); - - return ret; -} - -FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes) -{ - FLAC__uint64 ret = 0; - unsigned i; - - for(i = 0; i < bytes; i++) - ret = (ret << 8) | (FLAC__uint64)(*b++); - - return ret; -} - -FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(!read_metadata_block_header_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, &iterator->is_last, &iterator->type, &iterator->length)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - - return true; -} - -FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - iterator->status = read_metadata_block_data_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, block); - - return (iterator->status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK); -} - -FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length) -{ - FLAC__byte raw_header[FLAC__STREAM_METADATA_HEADER_LENGTH]; - - if(read_cb(raw_header, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH) - return false; - - *is_last = raw_header[0] & 0x80? true : false; - *type = (FLAC__MetadataType)(raw_header[0] & 0x7f); - *length = unpack_uint32_(raw_header + 1, 3); - - /* Note that we don't check: - * if(iterator->type >= FLAC__METADATA_TYPE_UNDEFINED) - * we just will read in an opaque block - */ - - return true; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block) -{ - switch(block->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - return read_metadata_block_data_streaminfo_cb_(handle, read_cb, &block->data.stream_info); - case FLAC__METADATA_TYPE_PADDING: - return read_metadata_block_data_padding_cb_(handle, seek_cb, &block->data.padding, block->length); - case FLAC__METADATA_TYPE_APPLICATION: - return read_metadata_block_data_application_cb_(handle, read_cb, &block->data.application, block->length); - case FLAC__METADATA_TYPE_SEEKTABLE: - return read_metadata_block_data_seektable_cb_(handle, read_cb, &block->data.seek_table, block->length); - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - return read_metadata_block_data_vorbis_comment_cb_(handle, read_cb, &block->data.vorbis_comment); - case FLAC__METADATA_TYPE_CUESHEET: - return read_metadata_block_data_cuesheet_cb_(handle, read_cb, &block->data.cue_sheet); - case FLAC__METADATA_TYPE_PICTURE: - return read_metadata_block_data_picture_cb_(handle, read_cb, &block->data.picture); - default: - return read_metadata_block_data_unknown_cb_(handle, read_cb, &block->data.unknown, block->length); - } -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block) -{ - FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH], *b; - - if(read_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - b = buffer; - - /* we are using hardcoded numbers for simplicity but we should - * probably eventually write a bit-level unpacker and use the - * _STREAMINFO_ constants. - */ - block->min_blocksize = unpack_uint32_(b, 2); b += 2; - block->max_blocksize = unpack_uint32_(b, 2); b += 2; - block->min_framesize = unpack_uint32_(b, 3); b += 3; - block->max_framesize = unpack_uint32_(b, 3); b += 3; - block->sample_rate = (unpack_uint32_(b, 2) << 4) | ((unsigned)(b[2] & 0xf0) >> 4); - block->channels = (unsigned)((b[2] & 0x0e) >> 1) + 1; - block->bits_per_sample = ((((unsigned)(b[2] & 0x01)) << 4) | (((unsigned)(b[3] & 0xf0)) >> 4)) + 1; - block->total_samples = (((FLAC__uint64)(b[3] & 0x0f)) << 32) | unpack_uint64_(b+4, 4); - memcpy(block->md5sum, b+8, 16); - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length) -{ - (void)block; /* nothing to do; we don't care about reading the padding bytes */ - - if(0 != seek_cb(handle, block_length, SEEK_CUR)) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length) -{ - const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - - if(read_cb(block->id, 1, id_bytes, handle) != id_bytes) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - if(block_length < id_bytes) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - block_length -= id_bytes; - - if(block_length == 0) { - block->data = 0; - } - else { - if(0 == (block->data = malloc(block_length))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(read_cb(block->data, 1, block_length, handle) != block_length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length) -{ - unsigned i; - FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; - - FLAC__ASSERT(block_length % FLAC__STREAM_METADATA_SEEKPOINT_LENGTH == 0); - - block->num_points = block_length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; - - if(block->num_points == 0) - block->points = 0; - else if(0 == (block->points = safe_malloc_mul_2op_p(block->num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < block->num_points; i++) { - if(read_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - /* some MAGIC NUMBERs here */ - block->points[i].sample_number = unpack_uint64_(buffer, 8); - block->points[i].stream_offset = unpack_uint64_(buffer+8, 8); - block->points[i].frame_samples = unpack_uint32_(buffer+16, 2); - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry) -{ - const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8 == sizeof(buffer)); - - if(read_cb(buffer, 1, entry_length_len, handle) != entry_length_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - entry->length = unpack_uint32_little_endian_(buffer, entry_length_len); - - if(0 != entry->entry) - free(entry->entry); - - if(entry->length == 0) { - entry->entry = 0; - } - else { - if(0 == (entry->entry = safe_malloc_add_2op_(entry->length, /*+*/1))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(read_cb(entry->entry, 1, entry->length, handle) != entry->length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - entry->entry[entry->length] = '\0'; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment *block) -{ - unsigned i; - FLAC__Metadata_SimpleIteratorStatus status; - const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8 == sizeof(buffer)); - - if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, &(block->vendor_string)))) - return status; - - if(read_cb(buffer, 1, num_comments_len, handle) != num_comments_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->num_comments = unpack_uint32_little_endian_(buffer, num_comments_len); - - if(block->num_comments == 0) { - block->comments = 0; - } - else if(0 == (block->comments = calloc(block->num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < block->num_comments; i++) { - if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, block->comments + i))) - return status; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track) -{ - unsigned i, len; - FLAC__byte buffer[32]; /* asserted below that this is big enough */ - - FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64)); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->offset = unpack_uint64_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->number = (FLAC__byte)unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8; - if(read_cb(track->isrc, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN == 1); - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN == 1); - track->type = buffer[0] >> 7; - track->pre_emphasis = (buffer[0] >> 6) & 1; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->num_indices = (FLAC__byte)unpack_uint32_(buffer, len); - - if(track->num_indices == 0) { - track->indices = 0; - } - else if(0 == (track->indices = calloc(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < track->num_indices; i++) { - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->indices[i].offset = unpack_uint64_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->indices[i].number = (FLAC__byte)unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block) -{ - unsigned i, len; - FLAC__Metadata_SimpleIteratorStatus status; - FLAC__byte buffer[1024]; /* MSVC needs a constant expression so we put a magic number and assert */ - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)/8 <= sizeof(buffer)); - FLAC__ASSERT(sizeof(FLAC__uint64) <= sizeof(buffer)); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8; - if(read_cb(block->media_catalog_number, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->lead_in = unpack_uint64_(buffer, len); - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->is_cd = buffer[0]&0x80? true : false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->num_tracks = unpack_uint32_(buffer, len); - - if(block->num_tracks == 0) { - block->tracks = 0; - } - else if(0 == (block->tracks = calloc(block->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < block->num_tracks; i++) { - if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_cuesheet_track_cb_(handle, read_cb, block->tracks + i))) - return status; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cstring_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__byte **data, FLAC__uint32 *length, FLAC__uint32 length_len) -{ - FLAC__byte buffer[sizeof(FLAC__uint32)]; - - FLAC__ASSERT(0 != data); - FLAC__ASSERT(length_len%8 == 0); - - length_len /= 8; /* convert to bytes */ - - FLAC__ASSERT(sizeof(buffer) >= length_len); - - if(read_cb(buffer, 1, length_len, handle) != length_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - *length = unpack_uint32_(buffer, length_len); - - if(0 != *data) - free(*data); - - if(0 == (*data = safe_malloc_add_2op_(*length, /*+*/1))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(*length > 0) { - if(read_cb(*data, 1, *length, handle) != *length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - (*data)[*length] = '\0'; - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block) -{ - FLAC__Metadata_SimpleIteratorStatus status; - FLAC__byte buffer[4]; /* asserted below that this is big enough */ - FLAC__uint32 len; - - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_TYPE_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->type = (FLAC__StreamMetadata_Picture_Type)unpack_uint32_(buffer, len); - - if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, (FLAC__byte**)(&(block->mime_type)), &len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - - if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->description), &len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->width = unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->height = unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->depth = unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_COLORS_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->colors = unpack_uint32_(buffer, len); - - /* for convenience we use read_metadata_block_data_picture_cstring_cb_() even though it adds an extra terminating NUL we don't use */ - if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->data), &(block->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length) -{ - if(block_length == 0) { - block->data = 0; - } - else { - if(0 == (block->data = malloc(block_length))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(read_cb(block->data, 1, block_length, handle) != block_length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != file); - FLAC__ASSERT(0 != status); - - if(!write_metadata_block_header_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - - return true; -} - -FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != file); - FLAC__ASSERT(0 != status); - - if (write_metadata_block_data_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; - return true; - } - else { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } -} - -FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block) -{ - FLAC__byte buffer[FLAC__STREAM_METADATA_HEADER_LENGTH]; - - FLAC__ASSERT(block->length < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); - - buffer[0] = (block->is_last? 0x80 : 0) | (FLAC__byte)block->type; - pack_uint32_(block->length, buffer + 1, 3); - - if(write_cb(buffer, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != block); - - switch(block->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - return write_metadata_block_data_streaminfo_cb_(handle, write_cb, &block->data.stream_info); - case FLAC__METADATA_TYPE_PADDING: - return write_metadata_block_data_padding_cb_(handle, write_cb, &block->data.padding, block->length); - case FLAC__METADATA_TYPE_APPLICATION: - return write_metadata_block_data_application_cb_(handle, write_cb, &block->data.application, block->length); - case FLAC__METADATA_TYPE_SEEKTABLE: - return write_metadata_block_data_seektable_cb_(handle, write_cb, &block->data.seek_table); - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - return write_metadata_block_data_vorbis_comment_cb_(handle, write_cb, &block->data.vorbis_comment); - case FLAC__METADATA_TYPE_CUESHEET: - return write_metadata_block_data_cuesheet_cb_(handle, write_cb, &block->data.cue_sheet); - case FLAC__METADATA_TYPE_PICTURE: - return write_metadata_block_data_picture_cb_(handle, write_cb, &block->data.picture); - default: - return write_metadata_block_data_unknown_cb_(handle, write_cb, &block->data.unknown, block->length); - } -} - -FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block) -{ - FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH]; - const unsigned channels1 = block->channels - 1; - const unsigned bps1 = block->bits_per_sample - 1; - - /* we are using hardcoded numbers for simplicity but we should - * probably eventually write a bit-level packer and use the - * _STREAMINFO_ constants. - */ - pack_uint32_(block->min_blocksize, buffer, 2); - pack_uint32_(block->max_blocksize, buffer+2, 2); - pack_uint32_(block->min_framesize, buffer+4, 3); - pack_uint32_(block->max_framesize, buffer+7, 3); - buffer[10] = (block->sample_rate >> 12) & 0xff; - buffer[11] = (block->sample_rate >> 4) & 0xff; - buffer[12] = ((block->sample_rate & 0x0f) << 4) | (channels1 << 1) | (bps1 >> 4); - buffer[13] = (FLAC__byte)(((bps1 & 0x0f) << 4) | ((block->total_samples >> 32) & 0x0f)); - pack_uint32_((FLAC__uint32)block->total_samples, buffer+14, 4); - memcpy(buffer+18, block->md5sum, 16); - - if(write_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length) -{ - unsigned i, n = block_length; - FLAC__byte buffer[1024]; - - (void)block; - - memset(buffer, 0, 1024); - - for(i = 0; i < n/1024; i++) - if(write_cb(buffer, 1, 1024, handle) != 1024) - return false; - - n %= 1024; - - if(write_cb(buffer, 1, n, handle) != n) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length) -{ - const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - - if(write_cb(block->id, 1, id_bytes, handle) != id_bytes) - return false; - - block_length -= id_bytes; - - if(write_cb(block->data, 1, block_length, handle) != block_length) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block) -{ - unsigned i; - FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; - - for(i = 0; i < block->num_points; i++) { - /* some MAGIC NUMBERs here */ - pack_uint64_(block->points[i].sample_number, buffer, 8); - pack_uint64_(block->points[i].stream_offset, buffer+8, 8); - pack_uint32_(block->points[i].frame_samples, buffer+16, 2); - if(write_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) - return false; - } - - return true; -} - -FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block) -{ - unsigned i; - const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8; - const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(MAX(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN, FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8 == sizeof(buffer)); - - pack_uint32_little_endian_(block->vendor_string.length, buffer, entry_length_len); - if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len) - return false; - if(write_cb(block->vendor_string.entry, 1, block->vendor_string.length, handle) != block->vendor_string.length) - return false; - - pack_uint32_little_endian_(block->num_comments, buffer, num_comments_len); - if(write_cb(buffer, 1, num_comments_len, handle) != num_comments_len) - return false; - - for(i = 0; i < block->num_comments; i++) { - pack_uint32_little_endian_(block->comments[i].length, buffer, entry_length_len); - if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len) - return false; - if(write_cb(block->comments[i].entry, 1, block->comments[i].length, handle) != block->comments[i].length) - return false; - } - - return true; -} - -FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block) -{ - unsigned i, j, len; - FLAC__byte buffer[1024]; /* asserted below that this is big enough */ - - FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64)); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8; - if(write_cb(block->media_catalog_number, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8; - pack_uint64_(block->lead_in, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8; - memset(buffer, 0, len); - if(block->is_cd) - buffer[0] |= 0x80; - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8; - pack_uint32_(block->num_tracks, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - for(i = 0; i < block->num_tracks; i++) { - FLAC__StreamMetadata_CueSheet_Track *track = block->tracks + i; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8; - pack_uint64_(track->offset, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8; - pack_uint32_(track->number, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8; - if(write_cb(track->isrc, 1, len, handle) != len) - return false; - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8; - memset(buffer, 0, len); - buffer[0] = (track->type << 7) | (track->pre_emphasis << 6); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8; - pack_uint32_(track->num_indices, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - for(j = 0; j < track->num_indices; j++) { - FLAC__StreamMetadata_CueSheet_Index *indx = track->indices + j; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8; - pack_uint64_(indx->offset, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8; - pack_uint32_(indx->number, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8; - memset(buffer, 0, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - } - } - - return true; -} - -FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block) -{ - unsigned len; - size_t slen; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_TYPE_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_COLORS_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN%8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8); - - len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8; - pack_uint32_(block->type, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8; - slen = strlen(block->mime_type); - pack_uint32_(slen, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - if(write_cb(block->mime_type, 1, slen, handle) != slen) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8; - slen = strlen((const char *)block->description); - pack_uint32_(slen, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - if(write_cb(block->description, 1, slen, handle) != slen) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8; - pack_uint32_(block->width, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8; - pack_uint32_(block->height, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8; - pack_uint32_(block->depth, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8; - pack_uint32_(block->colors, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8; - pack_uint32_(block->data_length, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - if(write_cb(block->data, 1, block->data_length, handle) != block->data_length) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length) -{ - if(write_cb(block->data, 1, block_length, handle) != block_length) - return false; - - return true; -} - -FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block) -{ - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - if(!write_metadata_block_header_(iterator->file, &iterator->status, block)) - return false; - - if(!write_metadata_block_data_(iterator->file, &iterator->status, block)) - return false; - - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return read_metadata_block_header_(iterator); -} - -FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last) -{ - FLAC__StreamMetadata *padding; - - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - block->is_last = false; - - if(!write_metadata_block_header_(iterator->file, &iterator->status, block)) - return false; - - if(!write_metadata_block_data_(iterator->file, &iterator->status, block)) - return false; - - if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - padding->is_last = padding_is_last; - padding->length = padding_length; - - if(!write_metadata_block_header_(iterator->file, &iterator->status, padding)) { - FLAC__metadata_object_delete(padding); - return false; - } - - if(!write_metadata_block_data_(iterator->file, &iterator->status, padding)) { - FLAC__metadata_object_delete(padding); - return false; - } - - FLAC__metadata_object_delete(padding); - - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return read_metadata_block_header_(iterator); -} - -FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append) -{ - FILE *tempfile = NULL; - char *tempfilename = NULL; - int fixup_is_last_code = 0; /* 0 => no need to change any is_last flags */ - FLAC__off_t fixup_is_last_flag_offset = -1; - - FLAC__ASSERT(0 != block || append == false); - - if(iterator->is_last) { - if(append) { - fixup_is_last_code = 1; /* 1 => clear the is_last flag at the following offset */ - fixup_is_last_flag_offset = iterator->offset[iterator->depth]; - } - else if(0 == block) { - simple_iterator_push_(iterator); - if(!FLAC__metadata_simple_iterator_prev(iterator)) { - (void)simple_iterator_pop_(iterator); - return false; - } - fixup_is_last_code = -1; /* -1 => set the is_last the flag at the following offset */ - fixup_is_last_flag_offset = iterator->offset[iterator->depth]; - if(!simple_iterator_pop_(iterator)) - return false; - } - } - - if(!simple_iterator_copy_file_prefix_(iterator, &tempfile, &tempfilename, append)) - return false; - - if(0 != block) { - if(!write_metadata_block_header_(tempfile, &iterator->status, block)) { - cleanup_tempfile_(&tempfile, &tempfilename); - return false; - } - - if(!write_metadata_block_data_(tempfile, &iterator->status, block)) { - cleanup_tempfile_(&tempfile, &tempfilename); - return false; - } - } - - if(!simple_iterator_copy_file_postfix_(iterator, &tempfile, &tempfilename, fixup_is_last_code, fixup_is_last_flag_offset, block==0)) - return false; - - if(append) - return FLAC__metadata_simple_iterator_next(iterator); - - return true; -} - -void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(iterator->depth+1 < SIMPLE_ITERATOR_MAX_PUSH_DEPTH); - iterator->offset[iterator->depth+1] = iterator->offset[iterator->depth]; - iterator->depth++; -} - -FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(iterator->depth > 0); - iterator->depth--; - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return read_metadata_block_header_(iterator); -} - -/* return meanings: - * 0: ok - * 1: read error - * 2: seek error - * 3: not a FLAC file - */ -unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb) -{ - FLAC__byte buffer[4]; - size_t n; - unsigned i; - - FLAC__ASSERT(FLAC__STREAM_SYNC_LENGTH == sizeof(buffer)); - - /* skip any id3v2 tag */ - errno = 0; - n = read_cb(buffer, 1, 4, handle); - if(errno) - return 1; - else if(n != 4) - return 3; - else if(0 == memcmp(buffer, "ID3", 3)) { - unsigned tag_length = 0; - - /* skip to the tag length */ - if(seek_cb(handle, 2, SEEK_CUR) < 0) - return 2; - - /* read the length */ - for(i = 0; i < 4; i++) { - if(read_cb(buffer, 1, 1, handle) < 1 || buffer[0] & 0x80) - return 1; - tag_length <<= 7; - tag_length |= (buffer[0] & 0x7f); - } - - /* skip the rest of the tag */ - if(seek_cb(handle, tag_length, SEEK_CUR) < 0) - return 2; - - /* read the stream sync code */ - errno = 0; - n = read_cb(buffer, 1, 4, handle); - if(errno) - return 1; - else if(n != 4) - return 3; - } - - /* check for the fLaC signature */ - if(0 == memcmp(FLAC__STREAM_SYNC_STRING, buffer, FLAC__STREAM_SYNC_LENGTH)) - return 0; - else - return 3; -} - -unsigned seek_to_first_metadata_block_(FILE *f) -{ - return seek_to_first_metadata_block_cb_((FLAC__IOHandle)f, (FLAC__IOCallback_Read)fread, fseek_wrapper_); -} - -FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append) -{ - const FLAC__off_t offset_end = append? iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length : iterator->offset[iterator->depth]; - - if(0 != fseeko(iterator->file, 0, SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(!open_tempfile_(iterator->filename, iterator->tempfile_path_prefix, tempfile, tempfilename, &iterator->status)) { - cleanup_tempfile_(tempfile, tempfilename); - return false; - } - if(!copy_n_bytes_from_file_(iterator->file, *tempfile, offset_end, &iterator->status)) { - cleanup_tempfile_(tempfile, tempfilename); - return false; - } - - return true; -} - -FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, FLAC__off_t fixup_is_last_flag_offset, FLAC__bool backup) -{ - FLAC__off_t save_offset = iterator->offset[iterator->depth]; - FLAC__ASSERT(0 != *tempfile); - - if(0 != fseeko(iterator->file, save_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length, SEEK_SET)) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(!copy_remaining_bytes_from_file_(iterator->file, *tempfile, &iterator->status)) { - cleanup_tempfile_(tempfile, tempfilename); - return false; - } - - if(fixup_is_last_code != 0) { - /* - * if code == 1, it means a block was appended to the end so - * we have to clear the is_last flag of the previous block - * if code == -1, it means the last block was deleted so - * we have to set the is_last flag of the previous block - */ - /* MAGIC NUMBERs here; we know the is_last flag is the high bit of the byte at this location */ - FLAC__byte x; - if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(fread(&x, 1, 1, *tempfile) != 1) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(fixup_is_last_code > 0) { - FLAC__ASSERT(x & 0x80); - x &= 0x7f; - } - else { - FLAC__ASSERT(!(x & 0x80)); - x |= 0x80; - } - if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(local__fwrite(&x, 1, 1, *tempfile) != 1) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - } - - (void)fclose(iterator->file); - - if(!transport_tempfile_(iterator->filename, tempfile, tempfilename, &iterator->status)) - return false; - - if(iterator->has_stats) - set_file_stats_(iterator->filename, &iterator->stats); - - if(!simple_iterator_prime_input_(iterator, !iterator->is_writable)) - return false; - if(backup) { - while(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length < save_offset) - if(!FLAC__metadata_simple_iterator_next(iterator)) - return false; - return true; - } - else { - /* move the iterator to it's original block faster by faking a push, then doing a pop_ */ - FLAC__ASSERT(iterator->depth == 0); - iterator->offset[0] = save_offset; - iterator->depth++; - return simple_iterator_pop_(iterator); - } -} - -FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - FLAC__ASSERT(bytes >= 0); - while(bytes > 0) { - n = MIN(sizeof(buffer), (size_t)bytes); - if(fread(buffer, 1, n, file) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(local__fwrite(buffer, 1, n, tempfile) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - bytes -= n; - } - - return true; -} - -FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - FLAC__ASSERT(bytes >= 0); - while(bytes > 0) { - n = MIN(sizeof(buffer), (size_t)bytes); - if(read_cb(buffer, 1, n, handle) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(temp_write_cb(buffer, 1, n, temp_handle) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - bytes -= n; - } - - return true; -} - -FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - while(!feof(file)) { - n = fread(buffer, 1, sizeof(buffer), file); - if(n == 0 && !feof(file)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(n > 0 && local__fwrite(buffer, 1, n, tempfile) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - } - - return true; -} - -FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - while(!eof_cb(handle)) { - n = read_cb(buffer, 1, sizeof(buffer), handle); - if(n == 0 && !eof_cb(handle)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(n > 0 && temp_write_cb(buffer, 1, n, temp_handle) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - } - - return true; -} - -static int -local_snprintf(char *str, size_t size, const char *fmt, ...) -{ - va_list va; - int rc ; - - va_start (va, fmt); - -#ifdef _MSC_VER - rc = vsnprintf_s (str, size, _TRUNCATE, fmt, va); - rc = (rc > 0) ? rc : (size == 0 ? 1024 : size * 2); -#else - rc = vsnprintf (str, size, fmt, va); -#endif - va_end (va); - - return rc; -} - -FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status) -{ - static const char *tempfile_suffix = ".metadata_edit"; - if(0 == tempfile_path_prefix) { - size_t dest_len = strlen(filename) + strlen(tempfile_suffix) + 1; - if(0 == (*tempfilename = safe_malloc_(dest_len))) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - local_snprintf(*tempfilename, dest_len, "%s%s", filename, tempfile_suffix); - } - else { - const char *p = strrchr(filename, '/'); - size_t dest_len; - if(0 == p) - p = filename; - else - p++; - - dest_len = strlen(tempfile_path_prefix) + strlen(p) + strlen(tempfile_suffix) + 2; - - if(0 == (*tempfilename = safe_malloc_(dest_len))) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - local_snprintf(*tempfilename, dest_len, "%s/%s%s", tempfile_path_prefix, p, tempfile_suffix); - } - - if(0 == (*tempfile = flac_fopen(*tempfilename, "w+b"))) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; - return false; - } - - return true; -} - -FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != tempfile); - FLAC__ASSERT(0 != *tempfile); - FLAC__ASSERT(0 != tempfilename); - FLAC__ASSERT(0 != *tempfilename); - FLAC__ASSERT(0 != status); - - (void)fclose(*tempfile); - *tempfile = 0; - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ || defined __EMX__ - /* on some flavors of windows, flac_rename() will fail if the destination already exists */ - if(flac_unlink(filename) < 0) { - cleanup_tempfile_(tempfile, tempfilename); - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR; - return false; - } -#endif - - /*@@@ to fully support the tempfile_path_prefix we need to update this piece to actually copy across filesystems instead of just flac_rename(): */ - if(0 != flac_rename(*tempfilename, filename)) { - cleanup_tempfile_(tempfile, tempfilename); - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR; - return false; - } - - cleanup_tempfile_(tempfile, tempfilename); - - return true; -} - -void cleanup_tempfile_(FILE **tempfile, char **tempfilename) -{ - if(0 != *tempfile) { - (void)fclose(*tempfile); - *tempfile = 0; - } - - if(0 != *tempfilename) { - (void)flac_unlink(*tempfilename); - free(*tempfilename); - *tempfilename = 0; - } -} - -FLAC__bool get_file_stats_(const char *filename, struct flac_stat_s *stats) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != stats); - return (0 == flac_stat(filename, stats)); -} - -void set_file_stats_(const char *filename, struct flac_stat_s *stats) -{ - struct utimbuf srctime; - - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != stats); - - srctime.actime = stats->st_atime; - srctime.modtime = stats->st_mtime; - (void)flac_chmod(filename, stats->st_mode); - (void)flac_utime(filename, &srctime); -#if !defined _MSC_VER && !defined __BORLANDC__ && !defined __MINGW32__ - FLAC_CHECK_RETURN(chown(filename, stats->st_uid, -1)); - FLAC_CHECK_RETURN(chown(filename, -1, stats->st_gid)); -#endif -} - -int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence) -{ - return fseeko((FILE*)handle, (FLAC__off_t)offset, whence); -} - -FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle) -{ - return ftello((FILE*)handle); -} - -FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status) -{ - switch(status) { - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK: - return FLAC__METADATA_CHAIN_STATUS_OK; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT: - return FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE: - return FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE: - return FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE: - return FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA: - return FLAC__METADATA_CHAIN_STATUS_BAD_METADATA; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR: - return FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR: - return FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR: - return FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR: - return FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR: - return FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR: - return FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR: - default: - return FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - } -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/metadata_object.c
Deleted
@@ -1,1824 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdlib.h> -#include <string.h> - -#include "private/metadata.h" -#include "private/memory.h" - -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "share/compat.h" - -/* Alias the first (in share/alloc.h) to the second (in src/libFLAC/memory.c). */ -#define safe_malloc_mul_2op_ safe_malloc_mul_2op_p - - -/**************************************************************************** - * - * Local routines - * - ***************************************************************************/ - -/* copy bytes: - * from = NULL && bytes = 0 - * to <- NULL - * from != NULL && bytes > 0 - * to <- copy of from - * else ASSERT - * malloc error leaves 'to' unchanged - */ -static FLAC__bool copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes) -{ - FLAC__ASSERT(0 != to); - if(bytes > 0 && 0 != from) { - FLAC__byte *x; - if(0 == (x = safe_malloc_(bytes))) - return false; - memcpy(x, from, bytes); - *to = x; - } - else { - FLAC__ASSERT(0 == from); - FLAC__ASSERT(bytes == 0); - *to = 0; - } - return true; -} - -#if 0 /* UNUSED */ -/* like copy_bytes_(), but free()s the original '*to' if the copy succeeds and the original '*to' is non-NULL */ -static FLAC__bool free_copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes) -{ - FLAC__byte *copy; - FLAC__ASSERT(0 != to); - if(copy_bytes_(©, from, bytes)) { - if(*to) - free(*to); - *to = copy; - return true; - } - else - return false; -} -#endif - -/* reallocate entry to 1 byte larger and add a terminating NUL */ -/* realloc() failure leaves entry unchanged */ -static FLAC__bool ensure_null_terminated_(FLAC__byte **entry, unsigned length) -{ - FLAC__byte *x = safe_realloc_add_2op_(*entry, length, /*+*/1); - if(0 != x) { - x[length] = '\0'; - *entry = x; - return true; - } - else - return false; -} - -/* copies the NUL-terminated C-string 'from' to '*to', leaving '*to' - * unchanged if malloc fails, free()ing the original '*to' if it - * succeeds and the original '*to' was not NULL - */ -static FLAC__bool copy_cstring_(char **to, const char *from) -{ - char *copy = strdup(from); - FLAC__ASSERT(to); - if(copy) { - if(*to) - free(*to); - *to = copy; - return true; - } - else - return false; -} - -static FLAC__bool copy_vcentry_(FLAC__StreamMetadata_VorbisComment_Entry *to, const FLAC__StreamMetadata_VorbisComment_Entry *from) -{ - to->length = from->length; - if(0 == from->entry) { - FLAC__ASSERT(from->length == 0); - to->entry = 0; - } - else { - FLAC__byte *x; - FLAC__ASSERT(from->length > 0); - if(0 == (x = safe_malloc_add_2op_(from->length, /*+*/1))) - return false; - memcpy(x, from->entry, from->length); - x[from->length] = '\0'; - to->entry = x; - } - return true; -} - -static FLAC__bool copy_track_(FLAC__StreamMetadata_CueSheet_Track *to, const FLAC__StreamMetadata_CueSheet_Track *from) -{ - memcpy(to, from, sizeof(FLAC__StreamMetadata_CueSheet_Track)); - if(0 == from->indices) { - FLAC__ASSERT(from->num_indices == 0); - } - else { - FLAC__StreamMetadata_CueSheet_Index *x; - FLAC__ASSERT(from->num_indices > 0); - if(0 == (x = safe_malloc_mul_2op_p(from->num_indices, /*times*/sizeof(FLAC__StreamMetadata_CueSheet_Index)))) - return false; - memcpy(x, from->indices, from->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index)); - to->indices = x; - } - return true; -} - -static void seektable_calculate_length_(FLAC__StreamMetadata *object) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - object->length = object->data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; -} - -static FLAC__StreamMetadata_SeekPoint *seekpoint_array_new_(unsigned num_points) -{ - FLAC__StreamMetadata_SeekPoint *object_array; - - FLAC__ASSERT(num_points > 0); - - object_array = safe_malloc_mul_2op_p(num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)); - - if(0 != object_array) { - unsigned i; - for(i = 0; i < num_points; i++) { - object_array[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - object_array[i].stream_offset = 0; - object_array[i].frame_samples = 0; - } - } - - return object_array; -} - -static void vorbiscomment_calculate_length_(FLAC__StreamMetadata *object) -{ - unsigned i; - - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - object->length = (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN) / 8; - object->length += object->data.vorbis_comment.vendor_string.length; - object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8; - for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { - object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8); - object->length += object->data.vorbis_comment.comments[i].length; - } -} - -static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_new_(unsigned num_comments) -{ - FLAC__ASSERT(num_comments > 0); - - return safe_calloc_(num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry)); -} - -static void vorbiscomment_entry_array_delete_(FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments) -{ - unsigned i; - - FLAC__ASSERT(0 != object_array && num_comments > 0); - - for(i = 0; i < num_comments; i++) - if(0 != object_array[i].entry) - free(object_array[i].entry); - - if(0 != object_array) - free(object_array); -} - -static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_copy_(const FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments) -{ - FLAC__StreamMetadata_VorbisComment_Entry *return_array; - - FLAC__ASSERT(0 != object_array); - FLAC__ASSERT(num_comments > 0); - - return_array = vorbiscomment_entry_array_new_(num_comments); - - if(0 != return_array) { - unsigned i; - - for(i = 0; i < num_comments; i++) { - if(!copy_vcentry_(return_array+i, object_array+i)) { - vorbiscomment_entry_array_delete_(return_array, num_comments); - return 0; - } - } - } - - return return_array; -} - -static FLAC__bool vorbiscomment_set_entry_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry *dest, const FLAC__StreamMetadata_VorbisComment_Entry *src, FLAC__bool copy) -{ - FLAC__byte *save; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(0 != dest); - FLAC__ASSERT(0 != src); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT((0 != src->entry && src->length > 0) || (0 == src->entry && src->length == 0)); - - save = dest->entry; - - if(0 != src->entry) { - if(copy) { - /* do the copy first so that if we fail we leave the dest object untouched */ - if(!copy_vcentry_(dest, src)) - return false; - } - else { - /* we have to make sure that the string we're taking over is null-terminated */ - - /* - * Stripping the const from src->entry is OK since we're taking - * ownership of the pointer. This is a hack around a deficiency - * in the API where the same function is used for 'copy' and - * 'own', but the source entry is a const pointer. If we were - * precise, the 'own' flavor would be a separate function with a - * non-const source pointer. But it's not, so we hack away. - */ - if(!ensure_null_terminated_((FLAC__byte**)(&src->entry), src->length)) - return false; - *dest = *src; - } - } - else { - /* the src is null */ - *dest = *src; - } - - if(0 != save) - free(save); - - vorbiscomment_calculate_length_(object); - return true; -} - -static int vorbiscomment_find_entry_from_(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name, unsigned field_name_length) -{ - unsigned i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT(0 != field_name); - - for(i = offset; i < object->data.vorbis_comment.num_comments; i++) { - if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) - return (int)i; - } - - return -1; -} - -static void cuesheet_calculate_length_(FLAC__StreamMetadata *object) -{ - unsigned i; - - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - object->length = ( - FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN + - FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN + - FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + - FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN + - FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN - ) / 8; - - object->length += object->data.cue_sheet.num_tracks * ( - FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN - ) / 8; - - for(i = 0; i < object->data.cue_sheet.num_tracks; i++) { - object->length += object->data.cue_sheet.tracks[i].num_indices * ( - FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN + - FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN + - FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN - ) / 8; - } -} - -static FLAC__StreamMetadata_CueSheet_Index *cuesheet_track_index_array_new_(unsigned num_indices) -{ - FLAC__ASSERT(num_indices > 0); - - return safe_calloc_(num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)); -} - -static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_new_(unsigned num_tracks) -{ - FLAC__ASSERT(num_tracks > 0); - - return safe_calloc_(num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)); -} - -static void cuesheet_track_array_delete_(FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks) -{ - unsigned i; - - FLAC__ASSERT(0 != object_array && num_tracks > 0); - - for(i = 0; i < num_tracks; i++) { - if(0 != object_array[i].indices) { - FLAC__ASSERT(object_array[i].num_indices > 0); - free(object_array[i].indices); - } - } - - if(0 != object_array) - free(object_array); -} - -static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_copy_(const FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks) -{ - FLAC__StreamMetadata_CueSheet_Track *return_array; - - FLAC__ASSERT(0 != object_array); - FLAC__ASSERT(num_tracks > 0); - - return_array = cuesheet_track_array_new_(num_tracks); - - if(0 != return_array) { - unsigned i; - - for(i = 0; i < num_tracks; i++) { - if(!copy_track_(return_array+i, object_array+i)) { - cuesheet_track_array_delete_(return_array, num_tracks); - return 0; - } - } - } - - return return_array; -} - -static FLAC__bool cuesheet_set_track_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_CueSheet_Track *dest, const FLAC__StreamMetadata_CueSheet_Track *src, FLAC__bool copy) -{ - FLAC__StreamMetadata_CueSheet_Index *save; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(0 != dest); - FLAC__ASSERT(0 != src); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT((0 != src->indices && src->num_indices > 0) || (0 == src->indices && src->num_indices == 0)); - - save = dest->indices; - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(!copy_track_(dest, src)) - return false; - } - else { - *dest = *src; - } - - if(0 != save) - free(save); - - cuesheet_calculate_length_(object); - return true; -} - - -/**************************************************************************** - * - * Metadata object routines - * - ***************************************************************************/ - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type) -{ - FLAC__StreamMetadata *object; - - if(type > FLAC__MAX_METADATA_TYPE) - return 0; - - object = calloc(1, sizeof(FLAC__StreamMetadata)); - if(0 != object) { - object->is_last = false; - object->type = type; - switch(type) { - case FLAC__METADATA_TYPE_STREAMINFO: - object->length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; - break; - case FLAC__METADATA_TYPE_PADDING: - /* calloc() took care of this for us: - object->length = 0; - */ - break; - case FLAC__METADATA_TYPE_APPLICATION: - object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - /* calloc() took care of this for us: - object->data.application.data = 0; - */ - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - /* calloc() took care of this for us: - object->length = 0; - object->data.seek_table.num_points = 0; - object->data.seek_table.points = 0; - */ - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - object->data.vorbis_comment.vendor_string.length = (unsigned)strlen(FLAC__VENDOR_STRING); - if(!copy_bytes_(&object->data.vorbis_comment.vendor_string.entry, (const FLAC__byte*)FLAC__VENDOR_STRING, object->data.vorbis_comment.vendor_string.length+1)) { - free(object); - return 0; - } - vorbiscomment_calculate_length_(object); - break; - case FLAC__METADATA_TYPE_CUESHEET: - cuesheet_calculate_length_(object); - break; - case FLAC__METADATA_TYPE_PICTURE: - object->length = ( - FLAC__STREAM_METADATA_PICTURE_TYPE_LEN + - FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* empty mime_type string */ - FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* empty description string */ - FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN + - FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN + - FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN + - FLAC__STREAM_METADATA_PICTURE_COLORS_LEN + - FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN + - 0 /* no data */ - ) / 8; - object->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER; - object->data.picture.mime_type = 0; - object->data.picture.description = 0; - /* calloc() took care of this for us: - object->data.picture.width = 0; - object->data.picture.height = 0; - object->data.picture.depth = 0; - object->data.picture.colors = 0; - object->data.picture.data_length = 0; - object->data.picture.data = 0; - */ - /* now initialize mime_type and description with empty strings to make things easier on the client */ - if(!copy_cstring_(&object->data.picture.mime_type, "")) { - free(object); - return 0; - } - if(!copy_cstring_((char**)(&object->data.picture.description), "")) { - if(object->data.picture.mime_type) - free(object->data.picture.mime_type); - free(object); - return 0; - } - break; - default: - /* calloc() took care of this for us: - object->length = 0; - object->data.unknown.data = 0; - */ - break; - } - } - - return object; -} - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object) -{ - FLAC__StreamMetadata *to; - - FLAC__ASSERT(0 != object); - - if(0 != (to = FLAC__metadata_object_new(object->type))) { - to->is_last = object->is_last; - to->type = object->type; - to->length = object->length; - switch(to->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - memcpy(&to->data.stream_info, &object->data.stream_info, sizeof(FLAC__StreamMetadata_StreamInfo)); - break; - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(to->length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) { /* underflow check */ - FLAC__metadata_object_delete(to); - return 0; - } - memcpy(&to->data.application.id, &object->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8); - if(!copy_bytes_(&to->data.application.data, object->data.application.data, object->length - FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - to->data.seek_table.num_points = object->data.seek_table.num_points; - if(to->data.seek_table.num_points > UINT32_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) { /* overflow check */ - FLAC__metadata_object_delete(to); - return 0; - } - if(!copy_bytes_((FLAC__byte**)&to->data.seek_table.points, (FLAC__byte*)object->data.seek_table.points, object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint))) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != to->data.vorbis_comment.vendor_string.entry) { - free(to->data.vorbis_comment.vendor_string.entry); - to->data.vorbis_comment.vendor_string.entry = 0; - } - if(!copy_vcentry_(&to->data.vorbis_comment.vendor_string, &object->data.vorbis_comment.vendor_string)) { - FLAC__metadata_object_delete(to); - return 0; - } - if(object->data.vorbis_comment.num_comments == 0) { - FLAC__ASSERT(0 == object->data.vorbis_comment.comments); - to->data.vorbis_comment.comments = 0; - } - else { - FLAC__ASSERT(0 != object->data.vorbis_comment.comments); - to->data.vorbis_comment.comments = vorbiscomment_entry_array_copy_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments); - if(0 == to->data.vorbis_comment.comments) { - FLAC__metadata_object_delete(to); - return 0; - } - } - to->data.vorbis_comment.num_comments = object->data.vorbis_comment.num_comments; - break; - case FLAC__METADATA_TYPE_CUESHEET: - memcpy(&to->data.cue_sheet, &object->data.cue_sheet, sizeof(FLAC__StreamMetadata_CueSheet)); - if(object->data.cue_sheet.num_tracks == 0) { - FLAC__ASSERT(0 == object->data.cue_sheet.tracks); - } - else { - FLAC__ASSERT(0 != object->data.cue_sheet.tracks); - to->data.cue_sheet.tracks = cuesheet_track_array_copy_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks); - if(0 == to->data.cue_sheet.tracks) { - FLAC__metadata_object_delete(to); - return 0; - } - } - break; - case FLAC__METADATA_TYPE_PICTURE: - to->data.picture.type = object->data.picture.type; - if(!copy_cstring_(&to->data.picture.mime_type, object->data.picture.mime_type)) { - FLAC__metadata_object_delete(to); - return 0; - } - if(!copy_cstring_((char**)(&to->data.picture.description), (const char*)object->data.picture.description)) { - FLAC__metadata_object_delete(to); - return 0; - } - to->data.picture.width = object->data.picture.width; - to->data.picture.height = object->data.picture.height; - to->data.picture.depth = object->data.picture.depth; - to->data.picture.colors = object->data.picture.colors; - to->data.picture.data_length = object->data.picture.data_length; - if(!copy_bytes_((&to->data.picture.data), object->data.picture.data, object->data.picture.data_length)) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - default: - if(!copy_bytes_(&to->data.unknown.data, object->data.unknown.data, object->length)) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - } - } - - return to; -} - -void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object) -{ - FLAC__ASSERT(0 != object); - - switch(object->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(0 != object->data.application.data) { - free(object->data.application.data); - object->data.application.data = 0; - } - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - if(0 != object->data.seek_table.points) { - free(object->data.seek_table.points); - object->data.seek_table.points = 0; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != object->data.vorbis_comment.vendor_string.entry) { - free(object->data.vorbis_comment.vendor_string.entry); - object->data.vorbis_comment.vendor_string.entry = 0; - } - if(0 != object->data.vorbis_comment.comments) { - FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0); - vorbiscomment_entry_array_delete_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments); - } - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(0 != object->data.cue_sheet.tracks) { - FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); - cuesheet_track_array_delete_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks); - } - break; - case FLAC__METADATA_TYPE_PICTURE: - if(0 != object->data.picture.mime_type) { - free(object->data.picture.mime_type); - object->data.picture.mime_type = 0; - } - if(0 != object->data.picture.description) { - free(object->data.picture.description); - object->data.picture.description = 0; - } - if(0 != object->data.picture.data) { - free(object->data.picture.data); - object->data.picture.data = 0; - } - break; - default: - if(0 != object->data.unknown.data) { - free(object->data.unknown.data); - object->data.unknown.data = 0; - } - break; - } -} - -FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object) -{ - FLAC__metadata_object_delete_data(object); - free(object); -} - -static FLAC__bool compare_block_data_streaminfo_(const FLAC__StreamMetadata_StreamInfo *block1, const FLAC__StreamMetadata_StreamInfo *block2) -{ - if(block1->min_blocksize != block2->min_blocksize) - return false; - if(block1->max_blocksize != block2->max_blocksize) - return false; - if(block1->min_framesize != block2->min_framesize) - return false; - if(block1->max_framesize != block2->max_framesize) - return false; - if(block1->sample_rate != block2->sample_rate) - return false; - if(block1->channels != block2->channels) - return false; - if(block1->bits_per_sample != block2->bits_per_sample) - return false; - if(block1->total_samples != block2->total_samples) - return false; - if(0 != memcmp(block1->md5sum, block2->md5sum, 16)) - return false; - return true; -} - -static FLAC__bool compare_block_data_application_(const FLAC__StreamMetadata_Application *block1, const FLAC__StreamMetadata_Application *block2, unsigned block_length) -{ - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - FLAC__ASSERT(block_length >= sizeof(block1->id)); - - if(0 != memcmp(block1->id, block2->id, sizeof(block1->id))) - return false; - if(0 != block1->data && 0 != block2->data) - return 0 == memcmp(block1->data, block2->data, block_length - sizeof(block1->id)); - else - return block1->data == block2->data; -} - -static FLAC__bool compare_block_data_seektable_(const FLAC__StreamMetadata_SeekTable *block1, const FLAC__StreamMetadata_SeekTable *block2) -{ - unsigned i; - - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - - if(block1->num_points != block2->num_points) - return false; - - if(0 != block1->points && 0 != block2->points) { - for(i = 0; i < block1->num_points; i++) { - if(block1->points[i].sample_number != block2->points[i].sample_number) - return false; - if(block1->points[i].stream_offset != block2->points[i].stream_offset) - return false; - if(block1->points[i].frame_samples != block2->points[i].frame_samples) - return false; - } - return true; - } - else - return block1->points == block2->points; -} - -static FLAC__bool compare_block_data_vorbiscomment_(const FLAC__StreamMetadata_VorbisComment *block1, const FLAC__StreamMetadata_VorbisComment *block2) -{ - unsigned i; - - if(block1->vendor_string.length != block2->vendor_string.length) - return false; - - if(0 != block1->vendor_string.entry && 0 != block2->vendor_string.entry) { - if(0 != memcmp(block1->vendor_string.entry, block2->vendor_string.entry, block1->vendor_string.length)) - return false; - } - else if(block1->vendor_string.entry != block2->vendor_string.entry) - return false; - - if(block1->num_comments != block2->num_comments) - return false; - - for(i = 0; i < block1->num_comments; i++) { - if(0 != block1->comments[i].entry && 0 != block2->comments[i].entry) { - if(0 != memcmp(block1->comments[i].entry, block2->comments[i].entry, block1->comments[i].length)) - return false; - } - else if(block1->comments[i].entry != block2->comments[i].entry) - return false; - } - return true; -} - -static FLAC__bool compare_block_data_cuesheet_(const FLAC__StreamMetadata_CueSheet *block1, const FLAC__StreamMetadata_CueSheet *block2) -{ - unsigned i, j; - - if(0 != strcmp(block1->media_catalog_number, block2->media_catalog_number)) - return false; - - if(block1->lead_in != block2->lead_in) - return false; - - if(block1->is_cd != block2->is_cd) - return false; - - if(block1->num_tracks != block2->num_tracks) - return false; - - if(0 != block1->tracks && 0 != block2->tracks) { - FLAC__ASSERT(block1->num_tracks > 0); - for(i = 0; i < block1->num_tracks; i++) { - if(block1->tracks[i].offset != block2->tracks[i].offset) - return false; - if(block1->tracks[i].number != block2->tracks[i].number) - return false; - if(0 != memcmp(block1->tracks[i].isrc, block2->tracks[i].isrc, sizeof(block1->tracks[i].isrc))) - return false; - if(block1->tracks[i].type != block2->tracks[i].type) - return false; - if(block1->tracks[i].pre_emphasis != block2->tracks[i].pre_emphasis) - return false; - if(block1->tracks[i].num_indices != block2->tracks[i].num_indices) - return false; - if(0 != block1->tracks[i].indices && 0 != block2->tracks[i].indices) { - FLAC__ASSERT(block1->tracks[i].num_indices > 0); - for(j = 0; j < block1->tracks[i].num_indices; j++) { - if(block1->tracks[i].indices[j].offset != block2->tracks[i].indices[j].offset) - return false; - if(block1->tracks[i].indices[j].number != block2->tracks[i].indices[j].number) - return false; - } - } - else if(block1->tracks[i].indices != block2->tracks[i].indices) - return false; - } - } - else if(block1->tracks != block2->tracks) - return false; - return true; -} - -static FLAC__bool compare_block_data_picture_(const FLAC__StreamMetadata_Picture *block1, const FLAC__StreamMetadata_Picture *block2) -{ - if(block1->type != block2->type) - return false; - if(block1->mime_type != block2->mime_type && (0 == block1->mime_type || 0 == block2->mime_type || strcmp(block1->mime_type, block2->mime_type))) - return false; - if(block1->description != block2->description && (0 == block1->description || 0 == block2->description || strcmp((const char *)block1->description, (const char *)block2->description))) - return false; - if(block1->width != block2->width) - return false; - if(block1->height != block2->height) - return false; - if(block1->depth != block2->depth) - return false; - if(block1->colors != block2->colors) - return false; - if(block1->data_length != block2->data_length) - return false; - if(block1->data != block2->data && (0 == block1->data || 0 == block2->data || memcmp(block1->data, block2->data, block1->data_length))) - return false; - return true; -} - -static FLAC__bool compare_block_data_unknown_(const FLAC__StreamMetadata_Unknown *block1, const FLAC__StreamMetadata_Unknown *block2, unsigned block_length) -{ - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - - if(0 != block1->data && 0 != block2->data) - return 0 == memcmp(block1->data, block2->data, block_length); - else - return block1->data == block2->data; -} - -FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2) -{ - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - - if(block1->type != block2->type) { - return false; - } - if(block1->is_last != block2->is_last) { - return false; - } - if(block1->length != block2->length) { - return false; - } - switch(block1->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - return compare_block_data_streaminfo_(&block1->data.stream_info, &block2->data.stream_info); - case FLAC__METADATA_TYPE_PADDING: - return true; /* we don't compare the padding guts */ - case FLAC__METADATA_TYPE_APPLICATION: - return compare_block_data_application_(&block1->data.application, &block2->data.application, block1->length); - case FLAC__METADATA_TYPE_SEEKTABLE: - return compare_block_data_seektable_(&block1->data.seek_table, &block2->data.seek_table); - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - return compare_block_data_vorbiscomment_(&block1->data.vorbis_comment, &block2->data.vorbis_comment); - case FLAC__METADATA_TYPE_CUESHEET: - return compare_block_data_cuesheet_(&block1->data.cue_sheet, &block2->data.cue_sheet); - case FLAC__METADATA_TYPE_PICTURE: - return compare_block_data_picture_(&block1->data.picture, &block2->data.picture); - default: - return compare_block_data_unknown_(&block1->data.unknown, &block2->data.unknown, block1->length); - } -} - -FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy) -{ - FLAC__byte *save; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_APPLICATION); - FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false)); - - save = object->data.application.data; - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(!copy_bytes_(&object->data.application.data, data, length)) - return false; - } - else { - object->data.application.data = data; - } - - if(0 != save) - free(save); - - object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8 + length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - if(0 == object->data.seek_table.points) { - FLAC__ASSERT(object->data.seek_table.num_points == 0); - if(0 == new_num_points) - return true; - else if(0 == (object->data.seek_table.points = seekpoint_array_new_(new_num_points))) - return false; - } - else { - const size_t old_size = object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint); - const size_t new_size = new_num_points * sizeof(FLAC__StreamMetadata_SeekPoint); - - /* overflow check */ - if(new_num_points > UINT32_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) - return false; - - FLAC__ASSERT(object->data.seek_table.num_points > 0); - - if(new_size == 0) { - free(object->data.seek_table.points); - object->data.seek_table.points = 0; - } - else if(0 == (object->data.seek_table.points = realloc(object->data.seek_table.points, new_size))) - return false; - - /* if growing, set new elements to placeholders */ - if(new_size > old_size) { - unsigned i; - for(i = object->data.seek_table.num_points; i < new_num_points; i++) { - object->data.seek_table.points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - object->data.seek_table.points[i].stream_offset = 0; - object->data.seek_table.points[i].frame_samples = 0; - } - } - } - - object->data.seek_table.num_points = new_num_points; - - seektable_calculate_length_(object); - return true; -} - -FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(point_num < object->data.seek_table.num_points); - - object->data.seek_table.points[point_num] = point; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point) -{ - int i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(point_num <= object->data.seek_table.num_points); - - if(!FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points+1)) - return false; - - /* move all points >= point_num forward one space */ - for(i = (int)object->data.seek_table.num_points-1; i > (int)point_num; i--) - object->data.seek_table.points[i] = object->data.seek_table.points[i-1]; - - FLAC__metadata_object_seektable_set_point(object, point_num, point); - seektable_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num) -{ - unsigned i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(point_num < object->data.seek_table.num_points); - - /* move all points > point_num backward one space */ - for(i = point_num; i < object->data.seek_table.num_points-1; i++) - object->data.seek_table.points[i] = object->data.seek_table.points[i+1]; - - return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points-1); -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - return FLAC__format_seektable_is_legal(&object->data.seek_table); -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - if(num > 0) - /* WATCHOUT: we rely on the fact that growing the array adds PLACEHOLDERS at the end */ - return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points + num); - else - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number) -{ - FLAC__StreamMetadata_SeekTable *seek_table; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - seek_table = &object->data.seek_table; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + 1)) - return false; - - seek_table->points[seek_table->num_points - 1].sample_number = sample_number; - seek_table->points[seek_table->num_points - 1].stream_offset = 0; - seek_table->points[seek_table->num_points - 1].frame_samples = 0; - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(0 != sample_numbers || num == 0); - - if(num > 0) { - FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; - unsigned i, j; - - i = seek_table->num_points; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num)) - return false; - - for(j = 0; j < num; i++, j++) { - seek_table->points[i].sample_number = sample_numbers[j]; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(total_samples > 0); - - if(num > 0 && total_samples > 0) { - FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; - unsigned i, j; - - i = seek_table->num_points; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num)) - return false; - - for(j = 0; j < num; i++, j++) { - seek_table->points[i].sample_number = total_samples * (FLAC__uint64)j / (FLAC__uint64)num; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(samples > 0); - FLAC__ASSERT(total_samples > 0); - - if(samples > 0 && total_samples > 0) { - FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; - unsigned i, j; - FLAC__uint64 num, sample; - - num = 1 + total_samples / samples; /* 1+ for the first sample at 0 */ - /* now account for the fact that we don't place a seekpoint at "total_samples" since samples are number from 0: */ - if(total_samples % samples == 0) - num--; - - i = seek_table->num_points; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + (unsigned)num)) - return false; - - sample = 0; - for(j = 0; j < num; i++, j++, sample += samples) { - seek_table->points[i].sample_number = sample; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact) -{ - unsigned unique; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - unique = FLAC__format_seektable_sort(&object->data.seek_table); - - return !compact || FLAC__metadata_object_seektable_resize_points(object, unique); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - if(!FLAC__format_vorbiscomment_entry_value_is_legal(entry.entry, entry.length)) - return false; - return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.vendor_string, &entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - if(0 == object->data.vorbis_comment.comments) { - FLAC__ASSERT(object->data.vorbis_comment.num_comments == 0); - if(0 == new_num_comments) - return true; - else if(0 == (object->data.vorbis_comment.comments = vorbiscomment_entry_array_new_(new_num_comments))) - return false; - } - else { - const size_t old_size = object->data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry); - const size_t new_size = new_num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry); - - /* overflow check */ - if(new_num_comments > UINT32_MAX / sizeof(FLAC__StreamMetadata_VorbisComment_Entry)) - return false; - - FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0); - - /* if shrinking, free the truncated entries */ - if(new_num_comments < object->data.vorbis_comment.num_comments) { - unsigned i; - for(i = new_num_comments; i < object->data.vorbis_comment.num_comments; i++) - if(0 != object->data.vorbis_comment.comments[i].entry) - free(object->data.vorbis_comment.comments[i].entry); - } - - if(new_size == 0) { - free(object->data.vorbis_comment.comments); - object->data.vorbis_comment.comments = 0; - } - else if(0 == (object->data.vorbis_comment.comments = realloc(object->data.vorbis_comment.comments, new_size))) - return false; - - /* if growing, zero all the length/pointers of new elements */ - if(new_size > old_size) - memset(object->data.vorbis_comment.comments + object->data.vorbis_comment.num_comments, 0, new_size - old_size); - } - - object->data.vorbis_comment.num_comments = new_num_comments; - - vorbiscomment_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.comments[comment_num], &entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - FLAC__StreamMetadata_VorbisComment *vc; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT(comment_num <= object->data.vorbis_comment.num_comments); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - - vc = &object->data.vorbis_comment; - - if(!FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments+1)) - return false; - - /* move all comments >= comment_num forward one space */ - memmove(&vc->comments[comment_num+1], &vc->comments[comment_num], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-1-comment_num)); - vc->comments[comment_num].length = 0; - vc->comments[comment_num].entry = 0; - - return FLAC__metadata_object_vorbiscomment_set_comment(object, comment_num, entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - return FLAC__metadata_object_vorbiscomment_insert_comment(object, object->data.vorbis_comment.num_comments, entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy) -{ - FLAC__ASSERT(0 != entry.entry && entry.length > 0); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - - { - int i; - size_t field_name_length; - const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); - - FLAC__ASSERT(0 != eq); - - if(0 == eq) - return false; /* double protection */ - - field_name_length = eq-entry.entry; - - i = vorbiscomment_find_entry_from_(object, 0, (const char *)entry.entry, field_name_length); - if(i >= 0) { - unsigned indx = (unsigned)i; - if(!FLAC__metadata_object_vorbiscomment_set_comment(object, indx, entry, copy)) - return false; - entry = object->data.vorbis_comment.comments[indx]; - indx++; /* skip over replaced comment */ - if(all && indx < object->data.vorbis_comment.num_comments) { - i = vorbiscomment_find_entry_from_(object, indx, (const char *)entry.entry, field_name_length); - while(i >= 0) { - indx = (unsigned)i; - if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, indx)) - return false; - if(indx < object->data.vorbis_comment.num_comments) - i = vorbiscomment_find_entry_from_(object, indx, (const char *)entry.entry, field_name_length); - else - i = -1; - } - } - return true; - } - else - return FLAC__metadata_object_vorbiscomment_append_comment(object, entry, copy); - } -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num) -{ - FLAC__StreamMetadata_VorbisComment *vc; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments); - - vc = &object->data.vorbis_comment; - - /* free the comment at comment_num */ - if(0 != vc->comments[comment_num].entry) - free(vc->comments[comment_num].entry); - - /* move all comments > comment_num backward one space */ - memmove(&vc->comments[comment_num], &vc->comments[comment_num+1], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-comment_num-1)); - vc->comments[vc->num_comments-1].length = 0; - vc->comments[vc->num_comments-1].entry = 0; - - return FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments-1); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value) -{ - FLAC__ASSERT(0 != entry); - FLAC__ASSERT(0 != field_name); - FLAC__ASSERT(0 != field_value); - - if(!FLAC__format_vorbiscomment_entry_name_is_legal(field_name)) - return false; - if(!FLAC__format_vorbiscomment_entry_value_is_legal((const FLAC__byte *)field_value, (unsigned)(-1))) - return false; - - { - const size_t nn = strlen(field_name); - const size_t nv = strlen(field_value); - entry->length = nn + 1 /*=*/ + nv; - if(0 == (entry->entry = safe_malloc_add_4op_(nn, /*+*/1, /*+*/nv, /*+*/1))) - return false; - memcpy(entry->entry, field_name, nn); - entry->entry[nn] = '='; - memcpy(entry->entry+nn+1, field_value, nv); - entry->entry[entry->length] = '\0'; - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value) -{ - FLAC__ASSERT(0 != entry.entry && entry.length > 0); - FLAC__ASSERT(0 != field_name); - FLAC__ASSERT(0 != field_value); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - - { - const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); - const size_t nn = eq-entry.entry; - const size_t nv = entry.length-nn-1; /* -1 for the '=' */ - FLAC__ASSERT(0 != eq); - if(0 == eq) - return false; /* double protection */ - if(0 == (*field_name = safe_malloc_add_2op_(nn, /*+*/1))) - return false; - if(0 == (*field_value = safe_malloc_add_2op_(nv, /*+*/1))) { - free(*field_name); - return false; - } - memcpy(*field_name, entry.entry, nn); - memcpy(*field_value, entry.entry+nn+1, nv); - (*field_name)[nn] = '\0'; - (*field_value)[nv] = '\0'; - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length) -{ - FLAC__ASSERT(0 != entry.entry && entry.length > 0); - { - const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); - return (0 != eq && (unsigned)(eq-entry.entry) == field_name_length && 0 == FLAC__STRNCASECMP(field_name, (const char *)entry.entry, field_name_length)); - } -} - -FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name) -{ - FLAC__ASSERT(0 != field_name); - - return vorbiscomment_find_entry_from_(object, offset, field_name, strlen(field_name)); -} - -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name) -{ - const unsigned field_name_length = strlen(field_name); - unsigned i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { - if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { - if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, i)) - return -1; - else - return 1; - } - } - - return 0; -} - -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name) -{ - FLAC__bool ok = true; - unsigned matching = 0; - const unsigned field_name_length = strlen(field_name); - int i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - /* must delete from end to start otherwise it will interfere with our iteration */ - for(i = (int)object->data.vorbis_comment.num_comments - 1; ok && i >= 0; i--) { - if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { - matching++; - ok &= FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i); - } - } - - return ok? (int)matching : -1; -} - -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void) -{ - return calloc(1, sizeof(FLAC__StreamMetadata_CueSheet_Track)); -} - -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object) -{ - FLAC__StreamMetadata_CueSheet_Track *to; - - FLAC__ASSERT(0 != object); - - if(0 != (to = FLAC__metadata_object_cuesheet_track_new())) { - if(!copy_track_(to, object)) { - FLAC__metadata_object_cuesheet_track_delete(to); - return 0; - } - } - - return to; -} - -void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object) -{ - FLAC__ASSERT(0 != object); - - if(0 != object->indices) { - FLAC__ASSERT(object->num_indices > 0); - free(object->indices); - } -} - -FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object) -{ - FLAC__metadata_object_cuesheet_track_delete_data(object); - free(object); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices) -{ - FLAC__StreamMetadata_CueSheet_Track *track; - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - - track = &object->data.cue_sheet.tracks[track_num]; - - if(0 == track->indices) { - FLAC__ASSERT(track->num_indices == 0); - if(0 == new_num_indices) - return true; - else if(0 == (track->indices = cuesheet_track_index_array_new_(new_num_indices))) - return false; - } - else { - const size_t old_size = track->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); - const size_t new_size = new_num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); - - /* overflow check */ - if(new_num_indices > UINT32_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Index)) - return false; - - FLAC__ASSERT(track->num_indices > 0); - - if(new_size == 0) { - free(track->indices); - track->indices = 0; - } - else if(0 == (track->indices = realloc(track->indices, new_size))) - return false; - - /* if growing, zero all the lengths/pointers of new elements */ - if(new_size > old_size) - memset(track->indices + track->num_indices, 0, new_size - old_size); - } - - track->num_indices = new_num_indices; - - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index indx) -{ - FLAC__StreamMetadata_CueSheet_Track *track; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - FLAC__ASSERT(index_num <= object->data.cue_sheet.tracks[track_num].num_indices); - - track = &object->data.cue_sheet.tracks[track_num]; - - if(!FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices+1)) - return false; - - /* move all indices >= index_num forward one space */ - memmove(&track->indices[index_num+1], &track->indices[index_num], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-1-index_num)); - - track->indices[index_num] = indx; - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num) -{ - FLAC__StreamMetadata_CueSheet_Index indx; - memset(&indx, 0, sizeof(indx)); - return FLAC__metadata_object_cuesheet_track_insert_index(object, track_num, index_num, indx); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num) -{ - FLAC__StreamMetadata_CueSheet_Track *track; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - FLAC__ASSERT(index_num < object->data.cue_sheet.tracks[track_num].num_indices); - - track = &object->data.cue_sheet.tracks[track_num]; - - /* move all indices > index_num backward one space */ - memmove(&track->indices[index_num], &track->indices[index_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-index_num-1)); - - FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices-1); - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - if(0 == object->data.cue_sheet.tracks) { - FLAC__ASSERT(object->data.cue_sheet.num_tracks == 0); - if(0 == new_num_tracks) - return true; - else if(0 == (object->data.cue_sheet.tracks = cuesheet_track_array_new_(new_num_tracks))) - return false; - } - else { - const size_t old_size = object->data.cue_sheet.num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); - const size_t new_size = new_num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); - - /* overflow check */ - if(new_num_tracks > UINT32_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Track)) - return false; - - FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); - - /* if shrinking, free the truncated entries */ - if(new_num_tracks < object->data.cue_sheet.num_tracks) { - unsigned i; - for(i = new_num_tracks; i < object->data.cue_sheet.num_tracks; i++) - if(0 != object->data.cue_sheet.tracks[i].indices) - free(object->data.cue_sheet.tracks[i].indices); - } - - if(new_size == 0) { - free(object->data.cue_sheet.tracks); - object->data.cue_sheet.tracks = 0; - } - else if(0 == (object->data.cue_sheet.tracks = realloc(object->data.cue_sheet.tracks, new_size))) - return false; - - /* if growing, zero all the lengths/pointers of new elements */ - if(new_size > old_size) - memset(object->data.cue_sheet.tracks + object->data.cue_sheet.num_tracks, 0, new_size - old_size); - } - - object->data.cue_sheet.num_tracks = new_num_tracks; - - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - - return cuesheet_set_track_(object, object->data.cue_sheet.tracks + track_num, track, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy) -{ - FLAC__StreamMetadata_CueSheet *cs; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num <= object->data.cue_sheet.num_tracks); - - cs = &object->data.cue_sheet; - - if(!FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks+1)) - return false; - - /* move all tracks >= track_num forward one space */ - memmove(&cs->tracks[track_num+1], &cs->tracks[track_num], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-1-track_num)); - cs->tracks[track_num].num_indices = 0; - cs->tracks[track_num].indices = 0; - - return FLAC__metadata_object_cuesheet_set_track(object, track_num, track, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num) -{ - FLAC__StreamMetadata_CueSheet_Track track; - memset(&track, 0, sizeof(track)); - return FLAC__metadata_object_cuesheet_insert_track(object, track_num, &track, /*copy=*/false); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num) -{ - FLAC__StreamMetadata_CueSheet *cs; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - - cs = &object->data.cue_sheet; - - /* free the track at track_num */ - if(0 != cs->tracks[track_num].indices) - free(cs->tracks[track_num].indices); - - /* move all tracks > track_num backward one space */ - memmove(&cs->tracks[track_num], &cs->tracks[track_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-track_num-1)); - cs->tracks[cs->num_tracks-1].num_indices = 0; - cs->tracks[cs->num_tracks-1].indices = 0; - - return FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks-1); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - return FLAC__format_cuesheet_is_legal(&object->data.cue_sheet, check_cd_da_subset, violation); -} - -static FLAC__uint64 get_index_01_offset_(const FLAC__StreamMetadata_CueSheet *cs, unsigned track) -{ - if (track >= (cs->num_tracks-1) || cs->tracks[track].num_indices < 1) - return 0; - else if (cs->tracks[track].indices[0].number == 1) - return cs->tracks[track].indices[0].offset + cs->tracks[track].offset + cs->lead_in; - else if (cs->tracks[track].num_indices < 2) - return 0; - else if (cs->tracks[track].indices[1].number == 1) - return cs->tracks[track].indices[1].offset + cs->tracks[track].offset + cs->lead_in; - else - return 0; -} - -static FLAC__uint32 cddb_add_digits_(FLAC__uint32 x) -{ - FLAC__uint32 n = 0; - while (x) { - n += (x%10); - x /= 10; - } - return n; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object) -{ - const FLAC__StreamMetadata_CueSheet *cs; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - cs = &object->data.cue_sheet; - - if (cs->num_tracks < 2) /* need at least one real track and the lead-out track */ - return 0; - - { - FLAC__uint32 i, length, sum = 0; - for (i = 0; i < (cs->num_tracks-1); i++) /* -1 to avoid counting the lead-out */ - sum += cddb_add_digits_((FLAC__uint32)(get_index_01_offset_(cs, i) / 44100)); - length = (FLAC__uint32)((cs->tracks[cs->num_tracks-1].offset+cs->lead_in) / 44100) - (FLAC__uint32)(get_index_01_offset_(cs, 0) / 44100); - - return (sum % 0xFF) << 24 | length << 8 | (FLAC__uint32)(cs->num_tracks-1); - } -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy) -{ - char *old; - size_t old_length, new_length; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - FLAC__ASSERT(0 != mime_type); - - old = object->data.picture.mime_type; - old_length = old? strlen(old) : 0; - new_length = strlen(mime_type); - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(new_length >= SIZE_MAX) /* overflow check */ - return false; - if(!copy_bytes_((FLAC__byte**)(&object->data.picture.mime_type), (FLAC__byte*)mime_type, new_length+1)) - return false; - } - else { - object->data.picture.mime_type = mime_type; - } - - if(0 != old) - free(old); - - object->length -= old_length; - object->length += new_length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy) -{ - FLAC__byte *old; - size_t old_length, new_length; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - FLAC__ASSERT(0 != description); - - old = object->data.picture.description; - old_length = old? strlen((const char *)old) : 0; - new_length = strlen((const char *)description); - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(new_length >= SIZE_MAX) /* overflow check */ - return false; - if(!copy_bytes_(&object->data.picture.description, description, new_length+1)) - return false; - } - else { - object->data.picture.description = description; - } - - if(0 != old) - free(old); - - object->length -= old_length; - object->length += new_length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy) -{ - FLAC__byte *old; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false)); - - old = object->data.picture.data; - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(!copy_bytes_(&object->data.picture.data, data, length)) - return false; - } - else { - object->data.picture.data = data; - } - - if(0 != old) - free(old); - - object->length -= object->data.picture.data_length; - object->data.picture.data_length = length; - object->length += length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - - return FLAC__format_picture_is_legal(&object->data.picture, violation); -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/ogg_helper.c
Deleted
@@ -1,210 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdlib.h> /* for malloc() */ -#include <string.h> /* for memcmp(), memcpy() */ -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "private/ogg_helper.h" -#include "protected/stream_encoder.h" - - -static FLAC__bool full_read_(FLAC__StreamEncoder *encoder, FLAC__byte *buffer, size_t bytes, FLAC__StreamEncoderReadCallback read_callback, void *client_data) -{ - while(bytes > 0) { - size_t bytes_read = bytes; - switch(read_callback(encoder, buffer, &bytes_read, client_data)) { - case FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE: - bytes -= bytes_read; - buffer += bytes_read; - break; - case FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM: - if(bytes_read == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - bytes -= bytes_read; - buffer += bytes_read; - break; - case FLAC__STREAM_ENCODER_READ_STATUS_ABORT: - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - case FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED: - return false; - default: - /* double protection: */ - FLAC__ASSERT(0); - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - } - - return true; -} - -void simple_ogg_page__init(ogg_page *page) -{ - page->header = 0; - page->header_len = 0; - page->body = 0; - page->body_len = 0; -} - -void simple_ogg_page__clear(ogg_page *page) -{ - if(page->header) - free(page->header); - if(page->body) - free(page->body); - simple_ogg_page__init(page); -} - -FLAC__bool simple_ogg_page__get_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderReadCallback read_callback, void *client_data) -{ - static const unsigned OGG_HEADER_FIXED_PORTION_LEN = 27; - static const unsigned OGG_MAX_HEADER_LEN = 27/*OGG_HEADER_FIXED_PORTION_LEN*/ + 255; - FLAC__byte crc[4]; - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(page->header == 0); - FLAC__ASSERT(page->header_len == 0); - FLAC__ASSERT(page->body == 0); - FLAC__ASSERT(page->body_len == 0); - - /* move the stream pointer to the supposed beginning of the page */ - if(0 == seek_callback) - return false; - if((seek_status = seek_callback((FLAC__StreamEncoder*)encoder, position, client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - /* allocate space for the page header */ - if(0 == (page->header = safe_malloc_(OGG_MAX_HEADER_LEN))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* read in the fixed part of the page header (up to but not including - * the segment table */ - if(!full_read_(encoder, page->header, OGG_HEADER_FIXED_PORTION_LEN, read_callback, client_data)) - return false; - - page->header_len = OGG_HEADER_FIXED_PORTION_LEN + page->header[26]; - - /* check to see if it's a correct, "simple" page (one packet only) */ - if( - memcmp(page->header, "OggS", 4) || /* doesn't start with OggS */ - (page->header[5] & 0x01) || /* continued packet */ - memcmp(page->header+6, "\0\0\0\0\0\0\0\0", 8) || /* granulepos is non-zero */ - page->header[26] == 0 /* packet is 0-size */ - ) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - - /* read in the segment table */ - if(!full_read_(encoder, page->header + OGG_HEADER_FIXED_PORTION_LEN, page->header[26], read_callback, client_data)) - return false; - - { - unsigned i; - - /* check to see that it specifies a single packet */ - for(i = 0; i < (unsigned)page->header[26] - 1; i++) { - if(page->header[i + OGG_HEADER_FIXED_PORTION_LEN] != 255) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - } - - page->body_len = 255 * i + page->header[i + OGG_HEADER_FIXED_PORTION_LEN]; - } - - /* allocate space for the page body */ - if(0 == (page->body = safe_malloc_(page->body_len))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* read in the page body */ - if(!full_read_(encoder, page->body, page->body_len, read_callback, client_data)) - return false; - - /* check the CRC */ - memcpy(crc, page->header+22, 4); - ogg_page_checksum_set(page); - if(memcmp(crc, page->header+22, 4)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - - return true; -} - -FLAC__bool simple_ogg_page__set_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderWriteCallback write_callback, void *client_data) -{ - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(page->header != 0); - FLAC__ASSERT(page->header_len != 0); - FLAC__ASSERT(page->body != 0); - FLAC__ASSERT(page->body_len != 0); - - /* move the stream pointer to the supposed beginning of the page */ - if(0 == seek_callback) - return false; - if((seek_status = seek_callback((FLAC__StreamEncoder*)encoder, position, client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - ogg_page_checksum_set(page); - - /* re-write the page */ - if(write_callback((FLAC__StreamEncoder*)encoder, page->header, page->header_len, 0, 0, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - if(write_callback((FLAC__StreamEncoder*)encoder, page->body, page->body_len, 0, 0, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - return true; -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/stream_encoder.c
Deleted
@@ -1,4468 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <limits.h> -#include <stdio.h> -#include <stdlib.h> /* for malloc() */ -#include <string.h> /* for memcpy() */ -#include <sys/types.h> /* for off_t */ -#include "share/compat.h" -#include "FLAC/assert.h" -#include "FLAC/stream_decoder.h" -#include "protected/stream_encoder.h" -#include "private/bitwriter.h" -#include "private/bitmath.h" -#include "private/crc.h" -#include "private/cpu.h" -#include "private/fixed.h" -#include "private/format.h" -#include "private/lpc.h" -#include "private/md5.h" -#include "private/memory.h" -#include "private/macros.h" -#if FLAC__HAS_OGG -#include "private/ogg_helper.h" -#include "private/ogg_mapping.h" -#endif -#include "private/stream_encoder.h" -#include "private/stream_encoder_framing.h" -#include "private/window.h" -#include "share/alloc.h" -#include "share/private.h" - -#include <retro_inline.h> -#include <retro_miscellaneous.h> - - -/* Exact Rice codeword length calculation is off by default. The simple - * (and fast) estimation (of how many bits a residual value will be - * encoded with) in this encoder is very good, almost always yielding - * compression within 0.1% of exact calculation. - */ -#undef EXACT_RICE_BITS_CALCULATION -/* Rice parameter searching is off by default. The simple (and fast) - * parameter estimation in this encoder is very good, almost always - * yielding compression within 0.1% of the optimal parameters. - */ -#undef ENABLE_RICE_PARAMETER_SEARCH - - -typedef struct { - FLAC__int32 *data[FLAC__MAX_CHANNELS]; - unsigned size; /* of each data[] in samples */ - unsigned tail; -} verify_input_fifo; - -typedef struct { - const FLAC__byte *data; - unsigned capacity; - unsigned bytes; -} verify_output; - -typedef enum { - ENCODER_IN_MAGIC = 0, - ENCODER_IN_METADATA = 1, - ENCODER_IN_AUDIO = 2 -} EncoderStateHint; - -static struct CompressionLevels { - FLAC__bool do_mid_side_stereo; - FLAC__bool loose_mid_side_stereo; - unsigned max_lpc_order; - unsigned qlp_coeff_precision; - FLAC__bool do_qlp_coeff_prec_search; - FLAC__bool do_escape_coding; - FLAC__bool do_exhaustive_model_search; - unsigned min_residual_partition_order; - unsigned max_residual_partition_order; - unsigned rice_parameter_search_dist; -} compression_levels_[] = { - { false, false, 0, 0, false, false, false, 0, 3, 0 }, - { true , true , 0, 0, false, false, false, 0, 3, 0 }, - { true , false, 0, 0, false, false, false, 0, 3, 0 }, - { false, false, 6, 0, false, false, false, 0, 4, 0 }, - { true , true , 8, 0, false, false, false, 0, 4, 0 }, - { true , false, 8, 0, false, false, false, 0, 5, 0 }, - { true , false, 8, 0, false, false, false, 0, 6, 0 }, - { true , false, 8, 0, false, false, true , 0, 6, 0 }, - { true , false, 12, 0, false, false, true , 0, 6, 0 } -}; - - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_(FLAC__StreamEncoder *encoder); -static void free_(FLAC__StreamEncoder *encoder); -static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize); -static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block); -static FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block); -static void update_metadata_(const FLAC__StreamEncoder *encoder); -#if FLAC__HAS_OGG -static void update_ogg_metadata_(FLAC__StreamEncoder *encoder); -#endif -static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block); -static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block); - -static FLAC__bool process_subframe_( - FLAC__StreamEncoder *encoder, - unsigned min_partition_order, - unsigned max_partition_order, - const FLAC__FrameHeader *frame_header, - unsigned subframe_bps, - const FLAC__int32 integer_signal[], - FLAC__Subframe *subframe[2], - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], - FLAC__int32 *residual[2], - unsigned *best_subframe, - unsigned *best_bits -); - -static FLAC__bool add_subframe_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - FLAC__BitWriter *frame -); - -static unsigned evaluate_constant_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal, - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -); - -static unsigned evaluate_fixed_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -); - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -static unsigned evaluate_lpc_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - const FLAC__real lp_coeff[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned qlp_coeff_precision, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -); -#endif - -static unsigned evaluate_verbatim_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -); - -static unsigned find_best_partition_order_( - struct FLAC__StreamEncoderPrivate *private_, - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__EntropyCodingMethod *best_ecm -); - -static void precompute_partition_info_sums_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps -); - -static void precompute_partition_info_escapes_( - const FLAC__int32 residual[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -); - -static FLAC__bool set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - const FLAC__int32 residual[], -#endif - const FLAC__uint64 abs_residual_partition_sums[], - const unsigned raw_bits_per_partition[], - const unsigned residual_samples, - const unsigned predictor_order, - const unsigned suggested_rice_parameter, - const unsigned rice_parameter_limit, - const unsigned rice_parameter_search_dist, - const unsigned partition_order, - const FLAC__bool search_for_escapes, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, - unsigned *bits -); - -static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples); - -/* verify-related routines: */ -static void append_to_verify_fifo_( - verify_input_fifo *fifo, - const FLAC__int32 * const input[], - unsigned input_offset, - unsigned channels, - unsigned wide_samples -); - -static void append_to_verify_fifo_interleaved_( - verify_input_fifo *fifo, - const FLAC__int32 input[], - unsigned input_offset, - unsigned channels, - unsigned wide_samples -); - -static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - -static FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); -static FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); -static FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); -static FILE *get_binary_stdout_(void); - - -/*********************************************************************** - * - * Private class data - * - ***********************************************************************/ - -typedef struct FLAC__StreamEncoderPrivate { - unsigned input_capacity; /* current size (in samples) of the signal and residual buffers */ - FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS]; /* the integer version of the input signal */ - FLAC__int32 *integer_signal_mid_side[2]; /* the integer version of the mid-side input signal (stereo only) */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real *real_signal[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) the floating-point version of the input signal */ - FLAC__real *real_signal_mid_side[2]; /* (@@@ currently unused) the floating-point version of the mid-side input signal (stereo only) */ - FLAC__real *window[FLAC__MAX_APODIZATION_FUNCTIONS]; /* the pre-computed floating-point window for each apodization function */ - FLAC__real *windowed_signal; /* the integer_signal[] * current window[] */ -#endif - unsigned subframe_bps[FLAC__MAX_CHANNELS]; /* the effective bits per sample of the input signal (stream bps - wasted bits) */ - unsigned subframe_bps_mid_side[2]; /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */ - FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */ - FLAC__int32 *residual_workspace_mid_side[2][2]; - FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2]; - FLAC__Subframe subframe_workspace_mid_side[2][2]; - FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2]; - FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2]; - unsigned best_subframe[FLAC__MAX_CHANNELS]; /* index (0 or 1) into 2nd dimension of the above workspaces */ - unsigned best_subframe_mid_side[2]; - unsigned best_subframe_bits[FLAC__MAX_CHANNELS]; /* size in bits of the best subframe for each channel */ - unsigned best_subframe_bits_mid_side[2]; - FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */ - unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */ - FLAC__BitWriter *frame; /* the current frame being worked on */ - unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */ - unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */ - FLAC__ChannelAssignment last_channel_assignment; - FLAC__StreamMetadata streaminfo; /* scratchpad for STREAMINFO as it is built */ - FLAC__StreamMetadata_SeekTable *seek_table; /* pointer into encoder->protected_->metadata_ where the seek table is */ - unsigned current_sample_number; - unsigned current_frame_number; - FLAC__MD5Context md5context; - FLAC__CPUInfo cpuinfo; - void (*local_precompute_partition_info_sums)(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); - unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#else - unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); - unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#endif -#ifndef FLAC__INTEGER_ONLY_LIBRARY - void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); - void (*local_lpc_compute_residual_from_qlp_coefficients)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); - void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); - void (*local_lpc_compute_residual_from_qlp_coefficients_16bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -#endif - FLAC__bool use_wide_by_block; /* use slow 64-bit versions of some functions because of the block size */ - FLAC__bool use_wide_by_partition; /* use slow 64-bit versions of some functions because of the min partition order and blocksize */ - FLAC__bool use_wide_by_order; /* use slow 64-bit versions of some functions because of the lpc order */ - FLAC__bool disable_constant_subframes; - FLAC__bool disable_fixed_subframes; - FLAC__bool disable_verbatim_subframes; -#if FLAC__HAS_OGG - FLAC__bool is_ogg; -#endif - FLAC__StreamEncoderReadCallback read_callback; /* currently only needed for Ogg FLAC */ - FLAC__StreamEncoderSeekCallback seek_callback; - FLAC__StreamEncoderTellCallback tell_callback; - FLAC__StreamEncoderWriteCallback write_callback; - FLAC__StreamEncoderMetadataCallback metadata_callback; - FLAC__StreamEncoderProgressCallback progress_callback; - void *client_data; - unsigned first_seekpoint_to_check; - FILE *file; /* only used when encoding to a file */ - FLAC__uint64 bytes_written; - FLAC__uint64 samples_written; - unsigned frames_written; - unsigned total_frames_estimate; - /* unaligned (original) pointers to allocated data */ - FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS]; - FLAC__int32 *integer_signal_mid_side_unaligned[2]; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) */ - FLAC__real *real_signal_mid_side_unaligned[2]; /* (@@@ currently unused) */ - FLAC__real *window_unaligned[FLAC__MAX_APODIZATION_FUNCTIONS]; - FLAC__real *windowed_signal_unaligned; -#endif - FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2]; - FLAC__int32 *residual_workspace_mid_side_unaligned[2][2]; - FLAC__uint64 *abs_residual_partition_sums_unaligned; - unsigned *raw_bits_per_partition_unaligned; - /* - * These fields have been moved here from private function local - * declarations merely to save stack space during encoding. - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */ -#endif - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */ - /* - * The data for the verify section - */ - struct { - FLAC__StreamDecoder *decoder; - EncoderStateHint state_hint; - FLAC__bool needs_magic_hack; - verify_input_fifo input_fifo; - verify_output output; - struct { - FLAC__uint64 absolute_sample; - unsigned frame_number; - unsigned channel; - unsigned sample; - FLAC__int32 expected; - FLAC__int32 got; - } error_stats; - } verify; - FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */ -} FLAC__StreamEncoderPrivate; - -/*********************************************************************** - * - * Public static class data - * - ***********************************************************************/ - -FLAC_API const char * const FLAC__StreamEncoderStateString[] = { - "FLAC__STREAM_ENCODER_OK", - "FLAC__STREAM_ENCODER_UNINITIALIZED", - "FLAC__STREAM_ENCODER_OGG_ERROR", - "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR", - "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA", - "FLAC__STREAM_ENCODER_CLIENT_ERROR", - "FLAC__STREAM_ENCODER_IO_ERROR", - "FLAC__STREAM_ENCODER_FRAMING_ERROR", - "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR" -}; - -FLAC_API const char * const FLAC__StreamEncoderInitStatusString[] = { - "FLAC__STREAM_ENCODER_INIT_STATUS_OK", - "FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR", - "FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION", - "FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER", - "FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA", - "FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamEncoderReadStatusString[] = { - "FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE", - "FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM", - "FLAC__STREAM_ENCODER_READ_STATUS_ABORT", - "FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = { - "FLAC__STREAM_ENCODER_WRITE_STATUS_OK", - "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR" -}; - -FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[] = { - "FLAC__STREAM_ENCODER_SEEK_STATUS_OK", - "FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR", - "FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamEncoderTellStatusString[] = { - "FLAC__STREAM_ENCODER_TELL_STATUS_OK", - "FLAC__STREAM_ENCODER_TELL_STATUS_ERROR", - "FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED" -}; - -/* Number of samples that will be overread to watch for end of stream. By - * 'overread', we mean that the FLAC__stream_encoder_process*() calls will - * always try to read blocksize+1 samples before encoding a block, so that - * even if the stream has a total sample count that is an integral multiple - * of the blocksize, we will still notice when we are encoding the last - * block. This is needed, for example, to correctly set the end-of-stream - * marker in Ogg FLAC. - * - * WATCHOUT: some parts of the code assert that OVERREAD_ == 1 and there's - * not really any reason to change it. - */ -static const unsigned OVERREAD_ = 1; - -/*********************************************************************** - * - * Class constructor/destructor - * - */ -FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void) -{ - FLAC__StreamEncoder *encoder; - unsigned i; - - FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ - - encoder = (FLAC__StreamEncoder*)calloc(1, sizeof(FLAC__StreamEncoder)); - if(encoder == 0) { - return 0; - } - - encoder->protected_ = (FLAC__StreamEncoderProtected*)calloc(1, sizeof(FLAC__StreamEncoderProtected)); - if(encoder->protected_ == 0) { - free(encoder); - return 0; - } - - encoder->private_ = (FLAC__StreamEncoderPrivate*)calloc(1, sizeof(FLAC__StreamEncoderPrivate)); - if(encoder->private_ == 0) { - free(encoder->protected_); - free(encoder); - return 0; - } - - encoder->private_->frame = FLAC__bitwriter_new(); - if(encoder->private_->frame == 0) { - free(encoder->private_); - free(encoder->protected_); - free(encoder); - return 0; - } - - encoder->private_->file = 0; - - set_defaults_(encoder); - - encoder->private_->is_being_deleted = false; - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0]; - encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1]; - } - for(i = 0; i < 2; i++) { - encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0]; - encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1]; - } - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0]; - encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1]; - } - for(i = 0; i < 2; i++) { - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]; - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]; - } - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]); - } - for(i = 0; i < 2; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); - } - for(i = 0; i < 2; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]); - - encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; - - return encoder; -} - -FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder) -{ - unsigned i; - - if (encoder == NULL) - return ; - - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->private_->frame); - - encoder->private_->is_being_deleted = true; - - (void)FLAC__stream_encoder_finish(encoder); - - if(0 != encoder->private_->verify.decoder) - FLAC__stream_decoder_delete(encoder->private_->verify.decoder); - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]); - } - for(i = 0; i < 2; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); - } - for(i = 0; i < 2; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]); - - FLAC__bitwriter_delete(encoder->private_->frame); - free(encoder->private_); - free(encoder->protected_); - free(encoder); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -static FLAC__StreamEncoderInitStatus init_stream_internal_( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderReadCallback read_callback, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - unsigned i; - FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment, metadata_picture_has_type1, metadata_picture_has_type2; - - FLAC__ASSERT(0 != encoder); - - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - -#if !FLAC__HAS_OGG - if(is_ogg) - return FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER; -#endif - - if(0 == write_callback || (seek_callback && 0 == tell_callback)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS; - - if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS; - - if(encoder->protected_->channels != 2) { - encoder->protected_->do_mid_side_stereo = false; - encoder->protected_->loose_mid_side_stereo = false; - } - else if(!encoder->protected_->do_mid_side_stereo) - encoder->protected_->loose_mid_side_stereo = false; - - if(encoder->protected_->bits_per_sample >= 32) - encoder->protected_->do_mid_side_stereo = false; /* since we currenty do 32-bit math, the side channel would have 33 bps and overflow */ - - if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE; - - if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE; - - if(encoder->protected_->blocksize == 0) { - if(encoder->protected_->max_lpc_order == 0) - encoder->protected_->blocksize = 1152; - else - encoder->protected_->blocksize = 4096; - } - - if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE; - - if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER; - - if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order) - return FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER; - - if(encoder->protected_->qlp_coeff_precision == 0) { - if(encoder->protected_->bits_per_sample < 16) { - /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */ - /* @@@ until then we'll make a guess */ - encoder->protected_->qlp_coeff_precision = MAX(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2); - } - else if(encoder->protected_->bits_per_sample == 16) { - if(encoder->protected_->blocksize <= 192) - encoder->protected_->qlp_coeff_precision = 7; - else if(encoder->protected_->blocksize <= 384) - encoder->protected_->qlp_coeff_precision = 8; - else if(encoder->protected_->blocksize <= 576) - encoder->protected_->qlp_coeff_precision = 9; - else if(encoder->protected_->blocksize <= 1152) - encoder->protected_->qlp_coeff_precision = 10; - else if(encoder->protected_->blocksize <= 2304) - encoder->protected_->qlp_coeff_precision = 11; - else if(encoder->protected_->blocksize <= 4608) - encoder->protected_->qlp_coeff_precision = 12; - else - encoder->protected_->qlp_coeff_precision = 13; - } - else { - if(encoder->protected_->blocksize <= 384) - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2; - else if(encoder->protected_->blocksize <= 1152) - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1; - else - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; - } - FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION); - } - else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION; - - if(encoder->protected_->streamable_subset) { - if(!FLAC__format_blocksize_is_subset(encoder->protected_->blocksize, encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if(!FLAC__format_sample_rate_is_subset(encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if( - encoder->protected_->bits_per_sample != 8 && - encoder->protected_->bits_per_sample != 12 && - encoder->protected_->bits_per_sample != 16 && - encoder->protected_->bits_per_sample != 20 && - encoder->protected_->bits_per_sample != 24 - ) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if( - encoder->protected_->sample_rate <= 48000 && - ( - encoder->protected_->blocksize > FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ || - encoder->protected_->max_lpc_order > FLAC__SUBSET_MAX_LPC_ORDER_48000HZ - ) - ) { - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - } - } - - if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1; - if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order) - encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order; - -#if FLAC__HAS_OGG - /* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */ - if(is_ogg && 0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 1) { - unsigned i1; - for(i1 = 1; i1 < encoder->protected_->num_metadata_blocks; i1++) { - if(0 != encoder->protected_->metadata[i1] && encoder->protected_->metadata[i1]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__StreamMetadata *vc = encoder->protected_->metadata[i1]; - for( ; i1 > 0; i1--) - encoder->protected_->metadata[i1] = encoder->protected_->metadata[i1-1]; - encoder->protected_->metadata[0] = vc; - break; - } - } - } -#endif - /* keep track of any SEEKTABLE block */ - if(0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) { - unsigned i2; - for(i2 = 0; i2 < encoder->protected_->num_metadata_blocks; i2++) { - if(0 != encoder->protected_->metadata[i2] && encoder->protected_->metadata[i2]->type == FLAC__METADATA_TYPE_SEEKTABLE) { - encoder->private_->seek_table = &encoder->protected_->metadata[i2]->data.seek_table; - break; /* take only the first one */ - } - } - } - - /* validate metadata */ - if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_seektable = false; - metadata_has_vorbis_comment = false; - metadata_picture_has_type1 = false; - metadata_picture_has_type2 = false; - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - const FLAC__StreamMetadata *m = encoder->protected_->metadata[i]; - if(m->type == FLAC__METADATA_TYPE_STREAMINFO) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - else if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) { - if(metadata_has_seektable) /* only one is allowed */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_seektable = true; - if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - if(metadata_has_vorbis_comment) /* only one is allowed */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_vorbis_comment = true; - } - else if(m->type == FLAC__METADATA_TYPE_CUESHEET) { - if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->type == FLAC__METADATA_TYPE_PICTURE) { - if(!FLAC__format_picture_is_legal(&m->data.picture, /*violation=*/0)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) { - if(metadata_picture_has_type1) /* there should only be 1 per stream */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_picture_has_type1 = true; - /* standard icon must be 32x32 pixel PNG */ - if( - m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD && - ( - (strcmp(m->data.picture.mime_type, "image/png") && strcmp(m->data.picture.mime_type, "-->")) || - m->data.picture.width != 32 || - m->data.picture.height != 32 - ) - ) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) { - if(metadata_picture_has_type2) /* there should only be 1 per stream */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_picture_has_type2 = true; - } - } - } - - encoder->private_->input_capacity = 0; - for(i = 0; i < encoder->protected_->channels; i++) { - encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0; -#endif - } - for(i = 0; i < 2; i++) { - encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0; -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - for(i = 0; i < encoder->protected_->num_apodizations; i++) - encoder->private_->window_unaligned[i] = encoder->private_->window[i] = 0; - encoder->private_->windowed_signal_unaligned = encoder->private_->windowed_signal = 0; -#endif - for(i = 0; i < encoder->protected_->channels; i++) { - encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0; - encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0; - encoder->private_->best_subframe[i] = 0; - } - for(i = 0; i < 2; i++) { - encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0; - encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0; - encoder->private_->best_subframe_mid_side[i] = 0; - } - encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0; - encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5); -#else - /* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */ - /* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply÷ by hand */ - FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350); - FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535); - FLAC__ASSERT(encoder->protected_->sample_rate <= 655350); - FLAC__ASSERT(encoder->protected_->blocksize <= 65535); - encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF); -#endif - if(encoder->private_->loose_mid_side_stereo_frames == 0) - encoder->private_->loose_mid_side_stereo_frames = 1; - encoder->private_->loose_mid_side_stereo_frame_count = 0; - encoder->private_->current_sample_number = 0; - encoder->private_->current_frame_number = 0; - - encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30); - encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(MAX(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */ - encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */ - - /* - * get the CPU info and set the function pointers - */ - FLAC__cpu_info(&encoder->private_->cpuinfo); - /* first default to the non-asm routines */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; -#endif - encoder->private_->local_precompute_partition_info_sums = precompute_partition_info_sums_; - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients; -#endif - /* now override with asm where appropriate */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -# ifndef FLAC__NO_ASM - if(encoder->private_->cpuinfo.use_asm) { -# ifdef FLAC__CPU_IA32 - FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); -# ifdef FLAC__HAS_NASM - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32; - if(encoder->private_->cpuinfo.ia32.sse) { - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - } - else if(encoder->private_->cpuinfo.ia32._3dnow) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - if(encoder->private_->cpuinfo.ia32.mmx) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx; - } - else { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - } - if(encoder->private_->cpuinfo.ia32.mmx && encoder->private_->cpuinfo.ia32.cmov) - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; -# endif /* FLAC__HAS_NASM */ -# ifdef FLAC__HAS_X86INTRIN -# if defined FLAC__SSE_SUPPORTED && !defined FLAC__HAS_NASM - if(encoder->private_->cpuinfo.ia32.sse) { - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; - } -# endif -# ifdef FLAC__SSE2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; - } -# ifdef FLAC__SSSE3_SUPPORTED - if (encoder->private_->cpuinfo.ia32.ssse3) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; - } - else -# endif - if (encoder->private_->cpuinfo.ia32.sse2) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; - } -# endif -# ifdef FLAC__SSE4_1_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse41) - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41; -# endif -# endif /* FLAC__HAS_X86INTRIN */ -# elif defined FLAC__CPU_X86_64 - FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); -# ifdef FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE_SUPPORTED - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; -# endif -# ifdef FLAC__SSE2_SUPPORTED - /* encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2; // OPT: not faster than C; TODO: more tests on different CPUs */ - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; -# ifdef FLAC__SSSE3_SUPPORTED - if (encoder->private_->cpuinfo.x86_64.ssse3) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; - } - else -# endif - { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; - } -# endif -# endif /* FLAC__HAS_X86INTRIN */ -# endif /* FLAC__CPU_... */ - } -# endif /* !FLAC__NO_ASM */ -#endif /* !FLAC__INTEGER_ONLY_LIBRARY */ -#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN - if(encoder->private_->cpuinfo.use_asm) { -# if defined FLAC__CPU_IA32 -# ifdef FLAC__SSE2_SUPPORTED -# ifdef FLAC__SSSE3_SUPPORTED - if(encoder->private_->cpuinfo.ia32.ssse3) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; - else -# endif - if(encoder->private_->cpuinfo.ia32.sse2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; -# endif -# elif defined FLAC__CPU_X86_64 -# ifdef FLAC__SSE2_SUPPORTED -# ifdef FLAC__SSSE3_SUPPORTED - if(encoder->private_->cpuinfo.x86_64.ssse3) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; - else -# endif - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; -# endif -# endif /* FLAC__CPU_... */ - } -#endif /* !FLAC__NO_ASM && FLAC__HAS_X86INTRIN */ - /* finally override based on wide-ness if necessary */ - if(encoder->private_->use_wide_by_block) { - encoder->private_->local_fixed_compute_best_predictor = encoder->private_->local_fixed_compute_best_predictor_wide; - } - - /* set state to OK; from here on, errors are fatal and we'll override the state then */ - encoder->protected_->state = FLAC__STREAM_ENCODER_OK; - -#if FLAC__HAS_OGG - encoder->private_->is_ogg = is_ogg; - if(is_ogg && !FLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } -#endif - - encoder->private_->read_callback = read_callback; - encoder->private_->write_callback = write_callback; - encoder->private_->seek_callback = seek_callback; - encoder->private_->tell_callback = tell_callback; - encoder->private_->metadata_callback = metadata_callback; - encoder->private_->client_data = client_data; - - if(!resize_buffers_(encoder, encoder->protected_->blocksize)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - if(!FLAC__bitwriter_init(encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * Set up the verify stuff if necessary - */ - if(encoder->protected_->verify) { - /* - * First, set up the fifo which will hold the - * original signal to compare against - */ - encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize+OVERREAD_; - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*)safe_malloc_mul_2op_p(sizeof(FLAC__int32), /*times*/encoder->private_->verify.input_fifo.size))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - encoder->private_->verify.input_fifo.tail = 0; - - /* - * Now set up a stream decoder for verification - */ - if(0 == encoder->private_->verify.decoder) { - encoder->private_->verify.decoder = FLAC__stream_decoder_new(); - if(0 == encoder->private_->verify.decoder) { - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - if(FLAC__stream_decoder_init_stream(encoder->private_->verify.decoder, verify_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, verify_write_callback_, verify_metadata_callback_, verify_error_callback_, /*client_data=*/encoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - encoder->private_->verify.error_stats.absolute_sample = 0; - encoder->private_->verify.error_stats.frame_number = 0; - encoder->private_->verify.error_stats.channel = 0; - encoder->private_->verify.error_stats.sample = 0; - encoder->private_->verify.error_stats.expected = 0; - encoder->private_->verify.error_stats.got = 0; - - /* - * These must be done before we write any metadata, because that - * calls the write_callback, which uses these values. - */ - encoder->private_->first_seekpoint_to_check = 0; - encoder->private_->samples_written = 0; - encoder->protected_->streaminfo_offset = 0; - encoder->protected_->seektable_offset = 0; - encoder->protected_->audio_offset = 0; - - /* - * write the stream header - */ - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_MAGIC; - if(!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * write the STREAMINFO metadata block - */ - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_METADATA; - encoder->private_->streaminfo.type = FLAC__METADATA_TYPE_STREAMINFO; - encoder->private_->streaminfo.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */ - encoder->private_->streaminfo.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; - encoder->private_->streaminfo.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */ - encoder->private_->streaminfo.data.stream_info.max_blocksize = encoder->protected_->blocksize; - encoder->private_->streaminfo.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */ - encoder->private_->streaminfo.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */ - encoder->private_->streaminfo.data.stream_info.sample_rate = encoder->protected_->sample_rate; - encoder->private_->streaminfo.data.stream_info.channels = encoder->protected_->channels; - encoder->private_->streaminfo.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample; - encoder->private_->streaminfo.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */ - memset(encoder->private_->streaminfo.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */ - if(encoder->protected_->do_md5) - FLAC__MD5Init(&encoder->private_->md5context); - if(!FLAC__add_metadata_block(&encoder->private_->streaminfo, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * Now that the STREAMINFO block is written, we can init this to an - * absurdly-high value... - */ - encoder->private_->streaminfo.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1; - /* ... and clear this to 0 */ - encoder->private_->streaminfo.data.stream_info.total_samples = 0; - - /* - * Check to see if the supplied metadata contains a VORBIS_COMMENT; - * if not, we will write an empty one (FLAC__add_metadata_block() - * automatically supplies the vendor string). - * - * WATCHOUT: the Ogg FLAC mapping requires us to write this block after - * the STREAMINFO. (In the case that metadata_has_vorbis_comment is - * true it will have already insured that the metadata list is properly - * ordered.) - */ - if(!metadata_has_vorbis_comment) { - FLAC__StreamMetadata vorbis_comment; - vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT; - vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0); - vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */ - vorbis_comment.data.vorbis_comment.vendor_string.length = 0; - vorbis_comment.data.vorbis_comment.vendor_string.entry = 0; - vorbis_comment.data.vorbis_comment.num_comments = 0; - vorbis_comment.data.vorbis_comment.comments = 0; - if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - /* - * write the user's metadata blocks - */ - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1); - if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - /* now that all the metadata is written, we save the stream offset */ - if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &encoder->protected_->audio_offset, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_AUDIO; - - return FLAC__STREAM_ENCODER_INIT_STATUS_OK; -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data -) -{ - return init_stream_internal_( - encoder, - /*read_callback=*/0, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/false - ); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderReadCallback read_callback, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data -) -{ - return init_stream_internal_( - encoder, - read_callback, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/true - ); -} - -static FLAC__StreamEncoderInitStatus init_FILE_internal_( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__StreamEncoderInitStatus init_status; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != file); - - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - - /* double protection */ - if(file == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * To make sure that our file does not go unclosed after an error, we - * must assign the FILE pointer before any further error can occur in - * this routine. - */ - if(file == stdout) - file = get_binary_stdout_(); /* just to be safe */ - - encoder->private_->file = file; - - encoder->private_->progress_callback = progress_callback; - encoder->private_->bytes_written = 0; - encoder->private_->samples_written = 0; - encoder->private_->frames_written = 0; - - init_status = init_stream_internal_( - encoder, - encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_ : 0, - file_write_callback_, - encoder->private_->file == stdout? 0 : file_seek_callback_, - encoder->private_->file == stdout? 0 : file_tell_callback_, - /*metadata_callback=*/0, - client_data, - is_ogg - ); - if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { - /* the above function sets the state for us in case of an error */ - return init_status; - } - - { - unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); - - FLAC__ASSERT(blocksize != 0); - encoder->private_->total_frames_estimate = (unsigned)((FLAC__stream_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize); - } - - return init_status; -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/true); -} - -static FLAC__StreamEncoderInitStatus init_file_internal_( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FILE *file; - - FLAC__ASSERT(0 != encoder); - - /* - * To make sure that our file does not go unclosed after an error, we - * have to do the same entrance checks here that are later performed - * in FLAC__stream_encoder_init_FILE() before the FILE* is assigned. - */ - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - - file = filename? flac_fopen(filename, "w+b") : stdout; - - if(file == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - return init_FILE_internal_(encoder, file, progress_callback, client_data, is_ogg); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/true); -} - -FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder) -{ - FLAC__bool error = false; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - - if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED) - return true; - - if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) { - if(encoder->private_->current_sample_number != 0) { - const FLAC__bool is_fractional_block = encoder->protected_->blocksize != encoder->private_->current_sample_number; - encoder->protected_->blocksize = encoder->private_->current_sample_number; - if(!process_frame_(encoder, is_fractional_block, /*is_last_block=*/true)) - error = true; - } - } - - if(encoder->protected_->do_md5) - FLAC__MD5Final(encoder->private_->streaminfo.data.stream_info.md5sum, &encoder->private_->md5context); - - if(!encoder->private_->is_being_deleted) { - if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK) { - if(encoder->private_->seek_callback) { -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) - update_ogg_metadata_(encoder); - else -#endif - update_metadata_(encoder); - - /* check if an error occurred while updating metadata */ - if(encoder->protected_->state != FLAC__STREAM_ENCODER_OK) - error = true; - } - if(encoder->private_->metadata_callback) - encoder->private_->metadata_callback(encoder, &encoder->private_->streaminfo, encoder->private_->client_data); - } - - if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder && !FLAC__stream_decoder_finish(encoder->private_->verify.decoder)) { - if(!error) - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; - error = true; - } - } - - if(0 != encoder->private_->file) { - if(encoder->private_->file != stdout) - fclose(encoder->private_->file); - encoder->private_->file = 0; - } - -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) - FLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect); -#endif - - free_(encoder); - set_defaults_(encoder); - - if(!error) - encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; - - return !error; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if FLAC__HAS_OGG - /* can't check encoder->private_->is_ogg since that's not set until init time */ - FLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value); - return true; -#else - (void)value; - return false; -#endif -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#ifndef FLAC__MANDATORY_VERIFY_WHILE_ENCODING - encoder->protected_->verify = value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->streamable_subset = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_md5 = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->channels = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->bits_per_sample = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->sample_rate = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__bool ok = true; - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - if(value >= sizeof(compression_levels_)/sizeof(compression_levels_[0])) - value = sizeof(compression_levels_)/sizeof(compression_levels_[0]) - 1; - ok &= FLAC__stream_encoder_set_do_mid_side_stereo (encoder, compression_levels_[value].do_mid_side_stereo); - ok &= FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, compression_levels_[value].loose_mid_side_stereo); -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 - /* was: */ - ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); - /* but it's too hard to specify the string in a locale-specific way */ -#else - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; -#endif -#endif - ok &= FLAC__stream_encoder_set_max_lpc_order (encoder, compression_levels_[value].max_lpc_order); - ok &= FLAC__stream_encoder_set_qlp_coeff_precision (encoder, compression_levels_[value].qlp_coeff_precision); - ok &= FLAC__stream_encoder_set_do_qlp_coeff_prec_search (encoder, compression_levels_[value].do_qlp_coeff_prec_search); - ok &= FLAC__stream_encoder_set_do_escape_coding (encoder, compression_levels_[value].do_escape_coding); - ok &= FLAC__stream_encoder_set_do_exhaustive_model_search (encoder, compression_levels_[value].do_exhaustive_model_search); - ok &= FLAC__stream_encoder_set_min_residual_partition_order(encoder, compression_levels_[value].min_residual_partition_order); - ok &= FLAC__stream_encoder_set_max_residual_partition_order(encoder, compression_levels_[value].max_residual_partition_order); - ok &= FLAC__stream_encoder_set_rice_parameter_search_dist (encoder, compression_levels_[value].rice_parameter_search_dist); - return ok; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->blocksize = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_mid_side_stereo = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->loose_mid_side_stereo = value; - return true; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(0 != specification); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#ifdef FLAC__INTEGER_ONLY_LIBRARY - (void)specification; /* silently ignore since we haven't integerized; will always use a rectangular window */ -#else - encoder->protected_->num_apodizations = 0; - while(1) { - const char *s = strchr(specification, ';'); - const size_t n = s? (size_t)(s - specification) : strlen(specification); - if (n==8 && 0 == strncmp("bartlett" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT; - else if(n==13 && 0 == strncmp("bartlett_hann", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT_HANN; - else if(n==8 && 0 == strncmp("blackman" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN; - else if(n==26 && 0 == strncmp("blackman_harris_4term_92db", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE; - else if(n==6 && 0 == strncmp("connes" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_CONNES; - else if(n==7 && 0 == strncmp("flattop" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_FLATTOP; - else if(n>7 && 0 == strncmp("gauss(" , specification, 6)) { - FLAC__real stddev = (FLAC__real)strtod(specification+6, 0); - if (stddev > 0.0 && stddev <= 0.5) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.gauss.stddev = stddev; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_GAUSS; - } - } - else if(n==7 && 0 == strncmp("hamming" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HAMMING; - else if(n==4 && 0 == strncmp("hann" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HANN; - else if(n==13 && 0 == strncmp("kaiser_bessel", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_KAISER_BESSEL; - else if(n==7 && 0 == strncmp("nuttall" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_NUTTALL; - else if(n==9 && 0 == strncmp("rectangle" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_RECTANGLE; - else if(n==8 && 0 == strncmp("triangle" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TRIANGLE; - else if(n>7 && 0 == strncmp("tukey(" , specification, 6)) { - FLAC__real p = (FLAC__real)strtod(specification+6, 0); - if (p >= 0.0 && p <= 1.0) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - } - } - else if(n==5 && 0 == strncmp("welch" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH; - if (encoder->protected_->num_apodizations == 32) - break; - if (s) - specification = s+1; - else - break; - } - if(encoder->protected_->num_apodizations == 0) { - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; - } -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->max_lpc_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->qlp_coeff_precision = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_qlp_coeff_prec_search = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if 0 - /*@@@ deprecated: */ - encoder->protected_->do_escape_coding = value; -#else - (void)value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_exhaustive_model_search = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->min_residual_partition_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->max_residual_partition_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if 0 - /*@@@ deprecated: */ - encoder->protected_->rice_parameter_search_dist = value; -#else - (void)value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->total_samples_estimate = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - if(0 == metadata) - num_blocks = 0; - if(0 == num_blocks) - metadata = 0; - /* realloc() does not do exactly what we want so... */ - if(encoder->protected_->metadata) { - free(encoder->protected_->metadata); - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - } - if(num_blocks) { - FLAC__StreamMetadata **m; - if(0 == (m = safe_malloc_mul_2op_p(sizeof(m[0]), /*times*/num_blocks))) - return false; - memcpy(m, metadata, sizeof(m[0]) * num_blocks); - encoder->protected_->metadata = m; - encoder->protected_->num_metadata_blocks = num_blocks; - } -#if FLAC__HAS_OGG - if(!FLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks)) - return false; -#endif - return true; -} - -/* - * These three functions are not static, but not publically exposed in - * include/FLAC/ either. They are used by the test suite. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_constant_subframes = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_fixed_subframes = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_verbatim_subframes = value; - return true; -} - -FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->state; -} - -FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->verify) - return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder); - else - return FLAC__STREAM_DECODER_UNINITIALIZED; -} - -FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) - return FLAC__StreamEncoderStateString[encoder->protected_->state]; - else - return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder); -} - -FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(0 != absolute_sample) - *absolute_sample = encoder->private_->verify.error_stats.absolute_sample; - if(0 != frame_number) - *frame_number = encoder->private_->verify.error_stats.frame_number; - if(0 != channel) - *channel = encoder->private_->verify.error_stats.channel; - if(0 != sample) - *sample = encoder->private_->verify.error_stats.sample; - if(0 != expected) - *expected = encoder->private_->verify.error_stats.expected; - if(0 != got) - *got = encoder->private_->verify.error_stats.got; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->verify; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->streamable_subset; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_md5; -} - -FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->channels; -} - -FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->bits_per_sample; -} - -FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->sample_rate; -} - -FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->blocksize; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_mid_side_stereo; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->loose_mid_side_stereo; -} - -FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->max_lpc_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->qlp_coeff_precision; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_qlp_coeff_prec_search; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_escape_coding; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_exhaustive_model_search; -} - -FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->min_residual_partition_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->max_residual_partition_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->rice_parameter_search_dist; -} - -FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->total_samples_estimate; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples) -{ - unsigned i, j = 0, channel; - const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - do { - const unsigned n = MIN(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j); - - if(encoder->protected_->verify) - append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n); - - for(channel = 0; channel < channels; channel++) - memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n); - - if(encoder->protected_->do_mid_side_stereo) { - FLAC__ASSERT(channels == 2); - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - encoder->private_->integer_signal_mid_side[1][i] = buffer[0][j] - buffer[1][j]; - encoder->private_->integer_signal_mid_side[0][i] = (buffer[0][j] + buffer[1][j]) >> 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */ - } - } - else - j += n; - - encoder->private_->current_sample_number += n; - - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(encoder->private_->current_sample_number > blocksize) { - FLAC__ASSERT(encoder->private_->current_sample_number == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; - if(encoder->protected_->do_mid_side_stereo) { - encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; - encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; - } - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples) -{ - unsigned i, j, k, channel; - FLAC__int32 x, mid, side; - const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - j = k = 0; - /* - * we have several flavors of the same basic loop, optimized for - * different conditions: - */ - if(encoder->protected_->do_mid_side_stereo && channels == 2) { - /* - * stereo coding: unroll channel loop - */ - do { - if(encoder->protected_->verify) - append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, MIN(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); - - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - encoder->private_->integer_signal[0][i] = mid = side = buffer[k++]; - x = buffer[k++]; - encoder->private_->integer_signal[1][i] = x; - mid += x; - side -= x; - mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */ - encoder->private_->integer_signal_mid_side[1][i] = side; - encoder->private_->integer_signal_mid_side[0][i] = mid; - } - encoder->private_->current_sample_number = i; - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(i > blocksize) { - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - FLAC__ASSERT(i == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - encoder->private_->integer_signal[0][0] = encoder->private_->integer_signal[0][blocksize]; - encoder->private_->integer_signal[1][0] = encoder->private_->integer_signal[1][blocksize]; - encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; - encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - } - else { - /* - * independent channel coding: buffer each channel in inner loop - */ - do { - if(encoder->protected_->verify) - append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, MIN(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); - - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][i] = buffer[k++]; - } - encoder->private_->current_sample_number = i; - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(i > blocksize) { - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - FLAC__ASSERT(i == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - } - - return true; -} - -/*********************************************************************** - * - * Private class methods - * - ***********************************************************************/ - -void set_defaults_(FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - -#ifdef FLAC__MANDATORY_VERIFY_WHILE_ENCODING - encoder->protected_->verify = true; -#else - encoder->protected_->verify = false; -#endif - encoder->protected_->streamable_subset = true; - encoder->protected_->do_md5 = true; - encoder->protected_->do_mid_side_stereo = false; - encoder->protected_->loose_mid_side_stereo = false; - encoder->protected_->channels = 2; - encoder->protected_->bits_per_sample = 16; - encoder->protected_->sample_rate = 44100; - encoder->protected_->blocksize = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; -#endif - encoder->protected_->max_lpc_order = 0; - encoder->protected_->qlp_coeff_precision = 0; - encoder->protected_->do_qlp_coeff_prec_search = false; - encoder->protected_->do_exhaustive_model_search = false; - encoder->protected_->do_escape_coding = false; - encoder->protected_->min_residual_partition_order = 0; - encoder->protected_->max_residual_partition_order = 0; - encoder->protected_->rice_parameter_search_dist = 0; - encoder->protected_->total_samples_estimate = 0; - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - - encoder->private_->seek_table = 0; - encoder->private_->disable_constant_subframes = false; - encoder->private_->disable_fixed_subframes = false; - encoder->private_->disable_verbatim_subframes = false; -#if FLAC__HAS_OGG - encoder->private_->is_ogg = false; -#endif - encoder->private_->read_callback = 0; - encoder->private_->write_callback = 0; - encoder->private_->seek_callback = 0; - encoder->private_->tell_callback = 0; - encoder->private_->metadata_callback = 0; - encoder->private_->progress_callback = 0; - encoder->private_->client_data = 0; - -#if FLAC__HAS_OGG - FLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect); -#endif - - FLAC__stream_encoder_set_compression_level(encoder, 5); -} - -void free_(FLAC__StreamEncoder *encoder) -{ - unsigned i, channel; - - FLAC__ASSERT(0 != encoder); - if(encoder->protected_->metadata) { - free(encoder->protected_->metadata); - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - } - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 != encoder->private_->integer_signal_unaligned[i]) { - free(encoder->private_->integer_signal_unaligned[i]); - encoder->private_->integer_signal_unaligned[i] = 0; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(0 != encoder->private_->real_signal_unaligned[i]) { - free(encoder->private_->real_signal_unaligned[i]); - encoder->private_->real_signal_unaligned[i] = 0; - } -#endif - } - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) { - free(encoder->private_->integer_signal_mid_side_unaligned[i]); - encoder->private_->integer_signal_mid_side_unaligned[i] = 0; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) { - free(encoder->private_->real_signal_mid_side_unaligned[i]); - encoder->private_->real_signal_mid_side_unaligned[i] = 0; - } -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - for(i = 0; i < encoder->protected_->num_apodizations; i++) { - if(0 != encoder->private_->window_unaligned[i]) { - free(encoder->private_->window_unaligned[i]); - encoder->private_->window_unaligned[i] = 0; - } - } - if(0 != encoder->private_->windowed_signal_unaligned) { - free(encoder->private_->windowed_signal_unaligned); - encoder->private_->windowed_signal_unaligned = 0; - } -#endif - for(channel = 0; channel < encoder->protected_->channels; channel++) { - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) { - free(encoder->private_->residual_workspace_unaligned[channel][i]); - encoder->private_->residual_workspace_unaligned[channel][i] = 0; - } - } - } - for(channel = 0; channel < 2; channel++) { - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) { - free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]); - encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0; - } - } - } - if(0 != encoder->private_->abs_residual_partition_sums_unaligned) { - free(encoder->private_->abs_residual_partition_sums_unaligned); - encoder->private_->abs_residual_partition_sums_unaligned = 0; - } - if(0 != encoder->private_->raw_bits_per_partition_unaligned) { - free(encoder->private_->raw_bits_per_partition_unaligned); - encoder->private_->raw_bits_per_partition_unaligned = 0; - } - if(encoder->protected_->verify) { - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 != encoder->private_->verify.input_fifo.data[i]) { - free(encoder->private_->verify.input_fifo.data[i]); - encoder->private_->verify.input_fifo.data[i] = 0; - } - } - } - FLAC__bitwriter_free(encoder->private_->frame); -} - -FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) -{ - FLAC__bool ok; - unsigned i, channel; - - FLAC__ASSERT(new_blocksize > 0); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - FLAC__ASSERT(encoder->private_->current_sample_number == 0); - - /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */ - if(new_blocksize <= encoder->private_->input_capacity) - return true; - - ok = true; - - /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() and ..._intrin_sse2() - * require that the input arrays (in our case the integer signals) - * have a buffer of up to 3 zeroes in front (at negative indices) for - * alignment purposes; we use 4 in front to keep the data well-aligned. - */ - - for(i = 0; ok && i < encoder->protected_->channels; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]); - memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4); - encoder->private_->integer_signal[i] += 4; -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 /* @@@ currently unused */ - if(encoder->protected_->max_lpc_order > 0) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]); -#endif -#endif - } - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]); - memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4); - encoder->private_->integer_signal_mid_side[i] += 4; -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 /* @@@ currently unused */ - if(encoder->protected_->max_lpc_order > 0) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]); -#endif -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(ok && encoder->protected_->max_lpc_order > 0) { - for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->window_unaligned[i], &encoder->private_->window[i]); - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->windowed_signal_unaligned, &encoder->private_->windowed_signal); - } -#endif - for(channel = 0; ok && channel < encoder->protected_->channels; channel++) { - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]); - } - } - for(channel = 0; ok && channel < 2; channel++) { - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]); - } - } - /* the *2 is an approximation to the series 1 + 1/2 + 1/4 + ... that sums tree occupies in a flat array */ - /*@@@ new_blocksize*2 is too pessimistic, but to fix, we need smarter logic because a smaller new_blocksize can actually increase the # of partitions; would require moving this out into a separate function, then checking its capacity against the need of the current blocksize&min/max_partition_order (and maybe predictor order) */ - ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_blocksize * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums); - if(encoder->protected_->do_escape_coding) - ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_blocksize * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition); - - /* now adjust the windows if the blocksize has changed */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(ok && new_blocksize != encoder->private_->input_capacity && encoder->protected_->max_lpc_order > 0) { - for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) { - switch(encoder->protected_->apodizations[i].type) { - case FLAC__APODIZATION_BARTLETT: - FLAC__window_bartlett(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BARTLETT_HANN: - FLAC__window_bartlett_hann(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BLACKMAN: - FLAC__window_blackman(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE: - FLAC__window_blackman_harris_4term_92db_sidelobe(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_CONNES: - FLAC__window_connes(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_FLATTOP: - FLAC__window_flattop(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_GAUSS: - FLAC__window_gauss(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.gauss.stddev); - break; - case FLAC__APODIZATION_HAMMING: - FLAC__window_hamming(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_HANN: - FLAC__window_hann(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_KAISER_BESSEL: - FLAC__window_kaiser_bessel(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_NUTTALL: - FLAC__window_nuttall(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_RECTANGLE: - FLAC__window_rectangle(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_TRIANGLE: - FLAC__window_triangle(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_TUKEY: - FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); - break; - case FLAC__APODIZATION_WELCH: - FLAC__window_welch(encoder->private_->window[i], new_blocksize); - break; - default: - FLAC__ASSERT(0); - /* double protection */ - FLAC__window_hann(encoder->private_->window[i], new_blocksize); - break; - } - } - } -#endif - - if(ok) - encoder->private_->input_capacity = new_blocksize; - else - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - - return ok; -} - -FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); - - if(!FLAC__bitwriter_get_buffer(encoder->private_->frame, &buffer, &bytes)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - if(encoder->protected_->verify) { - encoder->private_->verify.output.data = buffer; - encoder->private_->verify.output.bytes = bytes; - if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) { - encoder->private_->verify.needs_magic_hack = true; - } - else { - if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) { - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return false; - } - } - } - - if(write_frame_(encoder, buffer, bytes, samples, is_last_block) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - - if(samples > 0) { - encoder->private_->streaminfo.data.stream_info.min_framesize = MIN(bytes, encoder->private_->streaminfo.data.stream_info.min_framesize); - encoder->private_->streaminfo.data.stream_info.max_framesize = MAX(bytes, encoder->private_->streaminfo.data.stream_info.max_framesize); - } - - return true; -} - -FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block) -{ - FLAC__StreamEncoderWriteStatus status; - FLAC__uint64 output_position = 0; - -#if FLAC__HAS_OGG == 0 - (void)is_last_block; -#endif - - /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ - if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &output_position, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - - /* - * Watch for the STREAMINFO block and first SEEKTABLE block to go by and store their offsets. - */ - if(samples == 0) { - FLAC__MetadataType type = (buffer[0] & 0x7f); - if(type == FLAC__METADATA_TYPE_STREAMINFO) - encoder->protected_->streaminfo_offset = output_position; - else if(type == FLAC__METADATA_TYPE_SEEKTABLE && encoder->protected_->seektable_offset == 0) - encoder->protected_->seektable_offset = output_position; - } - - /* - * Mark the current seek point if hit (if audio_offset == 0 that - * means we're still writing metadata and haven't hit the first - * frame yet) - */ - if(0 != encoder->private_->seek_table && encoder->protected_->audio_offset > 0 && encoder->private_->seek_table->num_points > 0) { - const unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); - const FLAC__uint64 frame_first_sample = encoder->private_->samples_written; - const FLAC__uint64 frame_last_sample = frame_first_sample + (FLAC__uint64)blocksize - 1; - FLAC__uint64 test_sample; - unsigned i; - for(i = encoder->private_->first_seekpoint_to_check; i < encoder->private_->seek_table->num_points; i++) { - test_sample = encoder->private_->seek_table->points[i].sample_number; - if(test_sample > frame_last_sample) { - break; - } - else if(test_sample >= frame_first_sample) { - encoder->private_->seek_table->points[i].sample_number = frame_first_sample; - encoder->private_->seek_table->points[i].stream_offset = output_position - encoder->protected_->audio_offset; - encoder->private_->seek_table->points[i].frame_samples = blocksize; - encoder->private_->first_seekpoint_to_check++; - /* DO NOT: "break;" and here's why: - * The seektable template may contain more than one target - * sample for any given frame; we will keep looping, generating - * duplicate seekpoints for them, and we'll clean it up later, - * just before writing the seektable back to the metadata. - */ - } - else { - encoder->private_->first_seekpoint_to_check++; - } - } - } - -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) { - status = FLAC__ogg_encoder_aspect_write_callback_wrapper( - &encoder->protected_->ogg_encoder_aspect, - buffer, - bytes, - samples, - encoder->private_->current_frame_number, - is_last_block, - (FLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback, - encoder, - encoder->private_->client_data - ); - } - else -#endif - status = encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data); - - if(status == FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->private_->bytes_written += bytes; - encoder->private_->samples_written += samples; - /* we keep a high watermark on the number of frames written because - * when the encoder goes back to write metadata, 'current_frame' - * will drop back to 0. - */ - encoder->private_->frames_written = MAX(encoder->private_->frames_written, encoder->private_->current_frame_number+1); - } - else - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - - return status; -} - -/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ -void update_metadata_(const FLAC__StreamEncoder *encoder) -{ - FLAC__byte b[MAX(6u, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; - const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; - const FLAC__uint64 samples = metadata->data.stream_info.total_samples; - const unsigned min_framesize = metadata->data.stream_info.min_framesize; - const unsigned max_framesize = metadata->data.stream_info.max_framesize; - const unsigned bps = metadata->data.stream_info.bits_per_sample; - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); - - /* All this is based on intimate knowledge of the stream header - * layout, but a change to the header format that would break this - * would also break all streams encoded in the previous format. - */ - - /* - * Write MD5 signature - */ - { - const unsigned md5_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN - ) / 8; - - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + md5_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, metadata->data.stream_info.md5sum, 16, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write total samples - */ - { - const unsigned total_samples_byte_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN - - 4 - ) / 8; - - b[0] = ((FLAC__byte)(bps-1) << 4) | (FLAC__byte)((samples >> 32) & 0x0F); - b[1] = (FLAC__byte)((samples >> 24) & 0xFF); - b[2] = (FLAC__byte)((samples >> 16) & 0xFF); - b[3] = (FLAC__byte)((samples >> 8) & 0xFF); - b[4] = (FLAC__byte)(samples & 0xFF); - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + total_samples_byte_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, b, 5, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write min/max framesize - */ - { - const unsigned min_framesize_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN - ) / 8; - - b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); - b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); - b[2] = (FLAC__byte)(min_framesize & 0xFF); - b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); - b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); - b[5] = (FLAC__byte)(max_framesize & 0xFF); - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + min_framesize_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, b, 6, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write seektable - */ - if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { - unsigned i; - - FLAC__format_seektable_sort(encoder->private_->seek_table); - - FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); - - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->seektable_offset + FLAC__STREAM_METADATA_HEADER_LENGTH, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - - for(i = 0; i < encoder->private_->seek_table->num_points; i++) { - FLAC__uint64 xx; - unsigned x; - xx = encoder->private_->seek_table->points[i].sample_number; - b[7] = (FLAC__byte)xx; xx >>= 8; - b[6] = (FLAC__byte)xx; xx >>= 8; - b[5] = (FLAC__byte)xx; xx >>= 8; - b[4] = (FLAC__byte)xx; xx >>= 8; - b[3] = (FLAC__byte)xx; xx >>= 8; - b[2] = (FLAC__byte)xx; xx >>= 8; - b[1] = (FLAC__byte)xx; xx >>= 8; - b[0] = (FLAC__byte)xx; xx >>= 8; - xx = encoder->private_->seek_table->points[i].stream_offset; - b[15] = (FLAC__byte)xx; xx >>= 8; - b[14] = (FLAC__byte)xx; xx >>= 8; - b[13] = (FLAC__byte)xx; xx >>= 8; - b[12] = (FLAC__byte)xx; xx >>= 8; - b[11] = (FLAC__byte)xx; xx >>= 8; - b[10] = (FLAC__byte)xx; xx >>= 8; - b[9] = (FLAC__byte)xx; xx >>= 8; - b[8] = (FLAC__byte)xx; xx >>= 8; - x = encoder->private_->seek_table->points[i].frame_samples; - b[17] = (FLAC__byte)x; x >>= 8; - b[16] = (FLAC__byte)x; x >>= 8; - if(encoder->private_->write_callback(encoder, b, 18, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - } -} - -#if FLAC__HAS_OGG -/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ -void update_ogg_metadata_(FLAC__StreamEncoder *encoder) -{ - /* the # of bytes in the 1st packet that precede the STREAMINFO */ - static const unsigned FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH = - FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + - FLAC__OGG_MAPPING_MAGIC_LENGTH + - FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + - FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + - FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH + - FLAC__STREAM_SYNC_LENGTH - ; - FLAC__byte b[MAX(6u, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; - const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; - const FLAC__uint64 samples = metadata->data.stream_info.total_samples; - const unsigned min_framesize = metadata->data.stream_info.min_framesize; - const unsigned max_framesize = metadata->data.stream_info.max_framesize; - ogg_page page; - - FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); - FLAC__ASSERT(0 != encoder->private_->seek_callback); - - /* Pre-check that client supports seeking, since we don't want the - * ogg_helper code to ever have to deal with this condition. - */ - if(encoder->private_->seek_callback(encoder, 0, encoder->private_->client_data) == FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED) - return; - - /* All this is based on intimate knowledge of the stream header - * layout, but a change to the header format that would break this - * would also break all streams encoded in the previous format. - */ - - /** - ** Write STREAMINFO stats - **/ - simple_ogg_page__init(&page); - if(!simple_ogg_page__get_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - - /* - * Write MD5 signature - */ - { - const unsigned md5_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN - ) / 8; - - if(md5_offset + 16 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - memcpy(page.body + md5_offset, metadata->data.stream_info.md5sum, 16); - } - - /* - * Write total samples - */ - { - const unsigned total_samples_byte_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN - - 4 - ) / 8; - - if(total_samples_byte_offset + 5 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - b[0] = (FLAC__byte)page.body[total_samples_byte_offset] & 0xF0; - b[0] |= (FLAC__byte)((samples >> 32) & 0x0F); - b[1] = (FLAC__byte)((samples >> 24) & 0xFF); - b[2] = (FLAC__byte)((samples >> 16) & 0xFF); - b[3] = (FLAC__byte)((samples >> 8) & 0xFF); - b[4] = (FLAC__byte)(samples & 0xFF); - memcpy(page.body + total_samples_byte_offset, b, 5); - } - - /* - * Write min/max framesize - */ - { - const unsigned min_framesize_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN - ) / 8; - - if(min_framesize_offset + 6 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); - b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); - b[2] = (FLAC__byte)(min_framesize & 0xFF); - b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); - b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); - b[5] = (FLAC__byte)(max_framesize & 0xFF); - memcpy(page.body + min_framesize_offset, b, 6); - } - if(!simple_ogg_page__set_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - simple_ogg_page__clear(&page); - - /* - * Write seektable - */ - if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { - unsigned i; - FLAC__byte *p; - - FLAC__format_seektable_sort(encoder->private_->seek_table); - - FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); - - simple_ogg_page__init(&page); - if(!simple_ogg_page__get_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - - if((FLAC__STREAM_METADATA_HEADER_LENGTH + 18*encoder->private_->seek_table->num_points) != (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - - for(i = 0, p = page.body + FLAC__STREAM_METADATA_HEADER_LENGTH; i < encoder->private_->seek_table->num_points; i++, p += 18) { - FLAC__uint64 xx; - unsigned x; - xx = encoder->private_->seek_table->points[i].sample_number; - b[7] = (FLAC__byte)xx; xx >>= 8; - b[6] = (FLAC__byte)xx; xx >>= 8; - b[5] = (FLAC__byte)xx; xx >>= 8; - b[4] = (FLAC__byte)xx; xx >>= 8; - b[3] = (FLAC__byte)xx; xx >>= 8; - b[2] = (FLAC__byte)xx; xx >>= 8; - b[1] = (FLAC__byte)xx; xx >>= 8; - b[0] = (FLAC__byte)xx; xx >>= 8; - xx = encoder->private_->seek_table->points[i].stream_offset; - b[15] = (FLAC__byte)xx; xx >>= 8; - b[14] = (FLAC__byte)xx; xx >>= 8; - b[13] = (FLAC__byte)xx; xx >>= 8; - b[12] = (FLAC__byte)xx; xx >>= 8; - b[11] = (FLAC__byte)xx; xx >>= 8; - b[10] = (FLAC__byte)xx; xx >>= 8; - b[9] = (FLAC__byte)xx; xx >>= 8; - b[8] = (FLAC__byte)xx; xx >>= 8; - x = encoder->private_->seek_table->points[i].frame_samples; - b[17] = (FLAC__byte)x; x >>= 8; - b[16] = (FLAC__byte)x; x >>= 8; - memcpy(p, b, 18); - } - - if(!simple_ogg_page__set_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - simple_ogg_page__clear(&page); - } -} -#endif - -FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block) -{ - FLAC__uint16 crc; - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - /* - * Accumulate raw signal to the MD5 signature - */ - if(encoder->protected_->do_md5 && !FLAC__MD5Accumulate(&encoder->private_->md5context, (const FLAC__int32 * const *)encoder->private_->integer_signal, encoder->protected_->channels, encoder->protected_->blocksize, (encoder->protected_->bits_per_sample+7) / 8)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * Process the frame header and subframes into the frame bitbuffer - */ - if(!process_subframes_(encoder, is_fractional_block)) { - /* the above function sets the state for us in case of an error */ - return false; - } - - /* - * Zero-pad the frame to a byte_boundary - */ - if(!FLAC__bitwriter_zero_pad_to_byte_boundary(encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * CRC-16 the whole thing - */ - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); - if( - !FLAC__bitwriter_get_write_crc16(encoder->private_->frame, &crc) || - !FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, crc, FLAC__FRAME_FOOTER_CRC_LEN) - ) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * Write it - */ - if(!write_bitbuffer_(encoder, encoder->protected_->blocksize, is_last_block)) { - /* the above function sets the state for us in case of an error */ - return false; - } - - /* - * Get ready for the next frame - */ - encoder->private_->current_sample_number = 0; - encoder->private_->current_frame_number++; - encoder->private_->streaminfo.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize; - - return true; -} - -FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block) -{ - FLAC__FrameHeader frame_header; - unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order; - FLAC__bool do_independent, do_mid_side; - - /* - * Calculate the min,max Rice partition orders - */ - if(is_fractional_block) { - max_partition_order = 0; - } - else { - max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize); - max_partition_order = MIN(max_partition_order, encoder->protected_->max_residual_partition_order); - } - min_partition_order = MIN(min_partition_order, max_partition_order); - - /* - * Setup the frame - */ - frame_header.blocksize = encoder->protected_->blocksize; - frame_header.sample_rate = encoder->protected_->sample_rate; - frame_header.channels = encoder->protected_->channels; - frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */ - frame_header.bits_per_sample = encoder->protected_->bits_per_sample; - frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; - frame_header.number.frame_number = encoder->private_->current_frame_number; - - /* - * Figure out what channel assignments to try - */ - if(encoder->protected_->do_mid_side_stereo) { - if(encoder->protected_->loose_mid_side_stereo) { - if(encoder->private_->loose_mid_side_stereo_frame_count == 0) { - do_independent = true; - do_mid_side = true; - } - else { - do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT); - do_mid_side = !do_independent; - } - } - else { - do_independent = true; - do_mid_side = true; - } - } - else { - do_independent = true; - do_mid_side = false; - } - - FLAC__ASSERT(do_independent || do_mid_side); - - /* - * Check for wasted bits; set effective bps for each subframe - */ - if(do_independent) { - for(channel = 0; channel < encoder->protected_->channels; channel++) { - const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize); - encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w; - encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w; - } - } - if(do_mid_side) { - FLAC__ASSERT(encoder->protected_->channels == 2); - for(channel = 0; channel < 2; channel++) { - const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize); - encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w; - encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1); - } - } - - /* - * First do a normal encoding pass of each independent channel - */ - if(do_independent) { - for(channel = 0; channel < encoder->protected_->channels; channel++) { - if(! - process_subframe_( - encoder, - min_partition_order, - max_partition_order, - &frame_header, - encoder->private_->subframe_bps[channel], - encoder->private_->integer_signal[channel], - encoder->private_->subframe_workspace_ptr[channel], - encoder->private_->partitioned_rice_contents_workspace_ptr[channel], - encoder->private_->residual_workspace[channel], - encoder->private_->best_subframe+channel, - encoder->private_->best_subframe_bits+channel - ) - ) - return false; - } - } - - /* - * Now do mid and side channels if requested - */ - if(do_mid_side) { - FLAC__ASSERT(encoder->protected_->channels == 2); - - for(channel = 0; channel < 2; channel++) { - if(! - process_subframe_( - encoder, - min_partition_order, - max_partition_order, - &frame_header, - encoder->private_->subframe_bps_mid_side[channel], - encoder->private_->integer_signal_mid_side[channel], - encoder->private_->subframe_workspace_ptr_mid_side[channel], - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel], - encoder->private_->residual_workspace_mid_side[channel], - encoder->private_->best_subframe_mid_side+channel, - encoder->private_->best_subframe_bits_mid_side+channel - ) - ) - return false; - } - } - - /* - * Compose the frame bitbuffer - */ - if(do_mid_side) { - unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */ - FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */ - FLAC__ChannelAssignment channel_assignment; - - FLAC__ASSERT(encoder->protected_->channels == 2); - - if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) { - channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE); - } - else { - unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */ - unsigned min_bits; - int ca; - - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT == 0); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE == 1); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE == 2); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_MID_SIDE == 3); - FLAC__ASSERT(do_independent && do_mid_side); - - /* We have to figure out which channel assignent results in the smallest frame */ - bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits [1]; - bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE ] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits_mid_side[1]; - bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits [1] + encoder->private_->best_subframe_bits_mid_side[1]; - bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1]; - - channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; - min_bits = bits[channel_assignment]; - for(ca = 1; ca <= 3; ca++) { - if(bits[ca] < min_bits) { - min_bits = bits[ca]; - channel_assignment = (FLAC__ChannelAssignment)ca; - } - } - } - - frame_header.channel_assignment = channel_assignment; - - if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - - switch(channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; - right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; - right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - left_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]]; - right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - break; - default: - FLAC__ASSERT(0); - } - - switch(channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - left_bps = encoder->private_->subframe_bps [0]; - right_bps = encoder->private_->subframe_bps [1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - left_bps = encoder->private_->subframe_bps [0]; - right_bps = encoder->private_->subframe_bps_mid_side[1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - left_bps = encoder->private_->subframe_bps_mid_side[1]; - right_bps = encoder->private_->subframe_bps [1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - left_bps = encoder->private_->subframe_bps_mid_side[0]; - right_bps = encoder->private_->subframe_bps_mid_side[1]; - break; - default: - FLAC__ASSERT(0); - } - - /* note that encoder_add_subframe_ sets the state for us in case of an error */ - if(!add_subframe_(encoder, frame_header.blocksize, left_bps , left_subframe , encoder->private_->frame)) - return false; - if(!add_subframe_(encoder, frame_header.blocksize, right_bps, right_subframe, encoder->private_->frame)) - return false; - } - else { - if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - - for(channel = 0; channel < encoder->protected_->channels; channel++) { - if(!add_subframe_(encoder, frame_header.blocksize, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) { - /* the above function sets the state for us in case of an error */ - return false; - } - } - } - - if(encoder->protected_->loose_mid_side_stereo) { - encoder->private_->loose_mid_side_stereo_frame_count++; - if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames) - encoder->private_->loose_mid_side_stereo_frame_count = 0; - } - - encoder->private_->last_channel_assignment = frame_header.channel_assignment; - - return true; -} - -FLAC__bool process_subframe_( - FLAC__StreamEncoder *encoder, - unsigned min_partition_order, - unsigned max_partition_order, - const FLAC__FrameHeader *frame_header, - unsigned subframe_bps, - const FLAC__int32 integer_signal[], - FLAC__Subframe *subframe[2], - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], - FLAC__int32 *residual[2], - unsigned *best_subframe, - unsigned *best_bits -) -{ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; -#else - FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; -#endif -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__double lpc_residual_bits_per_sample; - FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm and x86 intrinsic routines need all the space */ - FLAC__double lpc_error[FLAC__MAX_LPC_ORDER]; - unsigned min_lpc_order, max_lpc_order, lpc_order; - unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision; -#endif - unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order; - unsigned rice_parameter; - unsigned _candidate_bits, _best_bits; - unsigned _best_subframe; - /* only use RICE2 partitions if stream bps > 16 */ - const unsigned rice_parameter_limit = FLAC__stream_encoder_get_bits_per_sample(encoder) > 16? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - FLAC__ASSERT(frame_header->blocksize > 0); - - /* verbatim subframe is the baseline against which we measure other compressed subframes */ - _best_subframe = 0; - if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) - _best_bits = UINT_MAX; - else - _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); - - if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) { - unsigned signal_is_constant = false; - guess_fixed_order = encoder->private_->local_fixed_compute_best_predictor(integer_signal+FLAC__MAX_FIXED_ORDER, frame_header->blocksize-FLAC__MAX_FIXED_ORDER, fixed_residual_bits_per_sample); - /* check for constant subframe */ - if( - !encoder->private_->disable_constant_subframes && -#ifndef FLAC__INTEGER_ONLY_LIBRARY - fixed_residual_bits_per_sample[1] == 0.0 -#else - fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO -#endif - ) { - /* the above means it's possible all samples are the same value; now double-check it: */ - unsigned i; - signal_is_constant = true; - for(i = 1; i < frame_header->blocksize; i++) { - if(integer_signal[0] != integer_signal[i]) { - signal_is_constant = false; - break; - } - } - } - if(signal_is_constant) { - _candidate_bits = evaluate_constant_subframe_(encoder, integer_signal[0], frame_header->blocksize, subframe_bps, subframe[!_best_subframe]); - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - else { - if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) { - /* encode fixed */ - if(encoder->protected_->do_exhaustive_model_search) { - min_fixed_order = 0; - max_fixed_order = FLAC__MAX_FIXED_ORDER; - } - else { - min_fixed_order = max_fixed_order = guess_fixed_order; - } - if(max_fixed_order >= frame_header->blocksize) - max_fixed_order = frame_header->blocksize - 1; - for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) { -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps) - continue; /* don't even try */ - rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > 0.0)? (unsigned)(fixed_residual_bits_per_sample[fixed_order]+0.5) : 0; /* 0.5 is for rounding */ -#else - if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps) - continue; /* don't even try */ - rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */ -#endif - rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - _candidate_bits = - evaluate_fixed_subframe_( - encoder, - integer_signal, - residual[!_best_subframe], - encoder->private_->abs_residual_partition_sums, - encoder->private_->raw_bits_per_partition, - frame_header->blocksize, - subframe_bps, - fixed_order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - encoder->protected_->do_escape_coding, - encoder->protected_->rice_parameter_search_dist, - subframe[!_best_subframe], - partitioned_rice_contents[!_best_subframe] - ); - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - } - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - /* encode lpc */ - if(encoder->protected_->max_lpc_order > 0) { - if(encoder->protected_->max_lpc_order >= frame_header->blocksize) - max_lpc_order = frame_header->blocksize-1; - else - max_lpc_order = encoder->protected_->max_lpc_order; - if(max_lpc_order > 0) { - unsigned a; - for (a = 0; a < encoder->protected_->num_apodizations; a++) { - FLAC__lpc_window_data(integer_signal, encoder->private_->window[a], encoder->private_->windowed_signal, frame_header->blocksize); - encoder->private_->local_lpc_compute_autocorrelation(encoder->private_->windowed_signal, frame_header->blocksize, max_lpc_order+1, autoc); - /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */ - if(autoc[0] != 0.0) { - FLAC__lpc_compute_lp_coefficients(autoc, &max_lpc_order, encoder->private_->lp_coeff, lpc_error); - if(encoder->protected_->do_exhaustive_model_search) { - min_lpc_order = 1; - } - else { - const unsigned guess_lpc_order = - FLAC__lpc_compute_best_order( - lpc_error, - max_lpc_order, - frame_header->blocksize, - subframe_bps + ( - encoder->protected_->do_qlp_coeff_prec_search? - FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */ - encoder->protected_->qlp_coeff_precision - ) - ); - min_lpc_order = max_lpc_order = guess_lpc_order; - } - if(max_lpc_order >= frame_header->blocksize) - max_lpc_order = frame_header->blocksize - 1; - for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) { - lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order); - if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps) - continue; /* don't even try */ - rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */ - rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - if(encoder->protected_->do_qlp_coeff_prec_search) { - min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; - /* try to ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */ - if(subframe_bps <= 17) { - max_qlp_coeff_precision = MIN(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION); - max_qlp_coeff_precision = MAX(max_qlp_coeff_precision, min_qlp_coeff_precision); - } - else - max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; - } - else { - min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision; - } - for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) { - _candidate_bits = - evaluate_lpc_subframe_( - encoder, - integer_signal, - residual[!_best_subframe], - encoder->private_->abs_residual_partition_sums, - encoder->private_->raw_bits_per_partition, - encoder->private_->lp_coeff[lpc_order-1], - frame_header->blocksize, - subframe_bps, - lpc_order, - qlp_coeff_precision, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - encoder->protected_->do_escape_coding, - encoder->protected_->rice_parameter_search_dist, - subframe[!_best_subframe], - partitioned_rice_contents[!_best_subframe] - ); - if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */ - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - } - } - } - } - } - } -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - } - } - - /* under rare circumstances this can happen when all but lpc subframe types are disabled: */ - if(_best_bits == UINT_MAX) { - FLAC__ASSERT(_best_subframe == 0); - _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); - } - - *best_subframe = _best_subframe; - *best_bits = _best_bits; - - return true; -} - -FLAC__bool add_subframe_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - FLAC__BitWriter *frame -) -{ - switch(subframe->type) { - case FLAC__SUBFRAME_TYPE_CONSTANT: - if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_FIXED: - if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_LPC: - if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_VERBATIM: - if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), blocksize, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -#define SPOTCHECK_ESTIMATE 0 -#if SPOTCHECK_ESTIMATE -static void spotcheck_subframe_estimate_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - unsigned estimate -) -{ - FLAC__bool ret; - FLAC__BitWriter *frame = FLAC__bitwriter_new(); - if(frame == 0) { - fprintf(stderr, "EST: can't allocate frame\n"); - return; - } - if(!FLAC__bitwriter_init(frame)) { - fprintf(stderr, "EST: can't init frame\n"); - return; - } - ret = add_subframe_(encoder, blocksize, subframe_bps, subframe, frame); - FLAC__ASSERT(ret); - { - const unsigned actual = FLAC__bitwriter_get_input_bits_unconsumed(frame); - if(estimate != actual) - fprintf(stderr, "EST: bad, frame#%u sub#%%d type=%8s est=%u, actual=%u, delta=%d\n", encoder->private_->current_frame_number, FLAC__SubframeTypeString[subframe->type], estimate, actual, (int)actual-(int)estimate); - } - FLAC__bitwriter_delete(frame); -} -#endif - -unsigned evaluate_constant_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal, - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -) -{ - unsigned estimate; - subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT; - subframe->data.constant.value = signal; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + subframe_bps; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#else - (void)encoder, (void)blocksize; -#endif - - return estimate; -} - -unsigned evaluate_fixed_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -) -{ - unsigned i, residual_bits, estimate; - const unsigned residual_samples = blocksize - order; - - FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual); - - subframe->type = FLAC__SUBFRAME_TYPE_FIXED; - - subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; - subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; - subframe->data.fixed.residual = residual; - - residual_bits = - find_best_partition_order_( - encoder->private_, - residual, - abs_residual_partition_sums, - raw_bits_per_partition, - residual_samples, - order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - subframe_bps, - do_escape_coding, - rice_parameter_search_dist, - &subframe->data.fixed.entropy_coding_method - ); - - subframe->data.fixed.order = order; - for(i = 0; i < order; i++) - subframe->data.fixed.warmup[i] = signal[i]; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (order * subframe_bps) + residual_bits; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#endif - - return estimate; -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned evaluate_lpc_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - const FLAC__real lp_coeff[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned qlp_coeff_precision, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -) -{ - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; /* WATCHOUT: the size is important; some x86 intrinsic routines need more than lpc order elements */ - unsigned i, residual_bits, estimate; - int quantization, ret; - const unsigned residual_samples = blocksize - order; - - /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ - if(subframe_bps <= 16) { - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER); - qlp_coeff_precision = MIN(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order)); - } - - ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization); - if(ret != 0) - return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */ - - if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) - if(subframe_bps <= 16 && qlp_coeff_precision <= 16) - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - else - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - else - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - - subframe->type = FLAC__SUBFRAME_TYPE_LPC; - - subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; - subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; - subframe->data.lpc.residual = residual; - - residual_bits = - find_best_partition_order_( - encoder->private_, - residual, - abs_residual_partition_sums, - raw_bits_per_partition, - residual_samples, - order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - subframe_bps, - do_escape_coding, - rice_parameter_search_dist, - &subframe->data.lpc.entropy_coding_method - ); - - subframe->data.lpc.order = order; - subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision; - subframe->data.lpc.quantization_level = quantization; - memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER); - for(i = 0; i < order; i++) - subframe->data.lpc.warmup[i] = signal[i]; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#endif - - return estimate; -} -#endif - -unsigned evaluate_verbatim_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -) -{ - unsigned estimate; - - subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM; - - subframe->data.verbatim.data = signal; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (blocksize * subframe_bps); - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#else - (void)encoder; -#endif - - return estimate; -} - -unsigned find_best_partition_order_( - FLAC__StreamEncoderPrivate *private_, - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__EntropyCodingMethod *best_ecm -) -{ - unsigned residual_bits, best_residual_bits = 0; - unsigned best_parameters_index = 0; - unsigned best_partition_order = 0; - const unsigned blocksize = residual_samples + predictor_order; - - max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order); - min_partition_order = MIN(min_partition_order, max_partition_order); - - private_->local_precompute_partition_info_sums(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); - - if(do_escape_coding) - precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order); - - { - int partition_order; - unsigned sum; - - for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) { - if(! - set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - residual, -#endif - abs_residual_partition_sums+sum, - raw_bits_per_partition+sum, - residual_samples, - predictor_order, - rice_parameter, - rice_parameter_limit, - rice_parameter_search_dist, - (unsigned)partition_order, - do_escape_coding, - &private_->partitioned_rice_contents_extra[!best_parameters_index], - &residual_bits - ) - ) - { - FLAC__ASSERT(best_residual_bits != 0); - break; - } - sum += 1u << partition_order; - if(best_residual_bits == 0 || residual_bits < best_residual_bits) { - best_residual_bits = residual_bits; - best_parameters_index = !best_parameters_index; - best_partition_order = partition_order; - } - } - } - - best_ecm->data.partitioned_rice.order = best_partition_order; - - { - /* - * We are allowed to de-const the pointer based on our special - * knowledge; it is const to the outside world. - */ - FLAC__EntropyCodingMethod_PartitionedRiceContents* prc = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_ecm->data.partitioned_rice.contents; - unsigned partition; - - /* save best parameters and raw_bits */ - FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(prc, MAX(6u, best_partition_order)); - memcpy(prc->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partition_order))); - if(do_escape_coding) - memcpy(prc->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partition_order))); - /* - * Now need to check if the type should be changed to - * FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 based on the - * size of the rice parameters. - */ - for(partition = 0; partition < (1u<<best_partition_order); partition++) { - if(prc->parameters[partition] >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { - best_ecm->type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2; - break; - } - } - } - - return best_residual_bits; -} - -#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM && 0 -extern void FLAC__precompute_partition_info_sums_32bit_asm_ia32_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned blocksize, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -); -#endif - -void precompute_partition_info_sums_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps -) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - -#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM && 0 - /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ - /* previously the condition was: if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) */ - /* see http://git.xiph.org/?p=flac.git;a=commit;h=6f7ec60c7e7f05f5ab0b1cf6b7b0945e44afcd4b */ - if(bps <= 16) { - FLAC__precompute_partition_info_sums_32bit_asm_ia32_(residual, abs_residual_partition_sums, residual_samples + predictor_order, predictor_order, min_partition_order, max_partition_order); - return; - } -#endif - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ - /* previously the condition was: if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) */ - /* see http://git.xiph.org/?p=flac.git;a=commit;h=6f7ec60c7e7f05f5ab0b1cf6b7b0945e44afcd4b */ - if(bps <= 16) { - FLAC__uint32 abs_residual_partition_sum; - - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - abs_residual_partition_sum = 0; - for( ; residual_sample < end; residual_sample++) - abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - abs_residual_partition_sums[partition] = abs_residual_partition_sum; - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - FLAC__uint64 abs_residual_partition_sum; - - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - abs_residual_partition_sum = 0; - for( ; residual_sample < end; residual_sample++) - abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - abs_residual_partition_sums[partition] = abs_residual_partition_sum; - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -void precompute_partition_info_escapes_( - const FLAC__int32 residual[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -) -{ - int partition_order; - unsigned from_partition, to_partition = 0; - const unsigned blocksize = residual_samples + predictor_order; - - /* first do max_partition_order */ - for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) { - FLAC__int32 r; - FLAC__uint32 rmax; - unsigned partition, partition_sample, partition_samples, residual_sample; - const unsigned partitions = 1u << partition_order; - const unsigned default_partition_samples = blocksize >> partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - for(partition = residual_sample = 0; partition < partitions; partition++) { - partition_samples = default_partition_samples; - if(partition == 0) - partition_samples -= predictor_order; - rmax = 0; - for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) { - r = residual[residual_sample++]; - /* OPT: maybe faster: rmax |= r ^ (r>>31) */ - if(r < 0) - rmax |= ~r; - else - rmax |= r; - } - /* now we know all residual values are in the range [-rmax-1,rmax] */ - raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1; - } - to_partition = partitions; - break; /*@@@ yuck, should remove the 'for' loop instead */ - } - - /* now merge partitions for lower orders */ - for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) { - unsigned m; - unsigned i; - const unsigned partitions = 1u << partition_order; - for(i = 0; i < partitions; i++) { - m = raw_bits_per_partition[from_partition]; - from_partition++; - raw_bits_per_partition[to_partition] = MAX(m, raw_bits_per_partition[from_partition]); - from_partition++; - to_partition++; - } - } -} - -#ifdef EXACT_RICE_BITS_CALCULATION -static INLINE unsigned count_rice_bits_in_partition_( - const unsigned rice_parameter, - const unsigned partition_samples, - const FLAC__int32 *residual -) -{ - unsigned i, partition_bits = - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ - (1+rice_parameter) * partition_samples /* 1 for unary stop bit + rice_parameter for the binary portion */ - ; - for(i = 0; i < partition_samples; i++) - partition_bits += ( (FLAC__uint32)((residual[i]<<1)^(residual[i]>>31)) >> rice_parameter ); - return partition_bits; -} -#else -static INLINE unsigned count_rice_bits_in_partition_( - const unsigned rice_parameter, - const unsigned partition_samples, - const FLAC__uint64 abs_residual_partition_sum -) -{ - return - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ - (1+rice_parameter) * partition_samples + /* 1 for unary stop bit + rice_parameter for the binary portion */ - ( - rice_parameter? - (unsigned)(abs_residual_partition_sum >> (rice_parameter-1)) /* rice_parameter-1 because the real coder sign-folds instead of using a sign bit */ - : (unsigned)(abs_residual_partition_sum << 1) /* can't shift by negative number, so reverse */ - ) - - (partition_samples >> 1) - /* -(partition_samples>>1) to subtract out extra contributions to the abs_residual_partition_sum. - * The actual number of bits used is closer to the sum(for all i in the partition) of abs(residual[i])>>(rice_parameter-1) - * By using the abs_residual_partition sum, we also add in bits in the LSBs that would normally be shifted out. - * So the subtraction term tries to guess how many extra bits were contributed. - * If the LSBs are randomly distributed, this should average to 0.5 extra bits per sample. - */ - ; -} -#endif - -FLAC__bool set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - const FLAC__int32 residual[], -#endif - const FLAC__uint64 abs_residual_partition_sums[], - const unsigned raw_bits_per_partition[], - const unsigned residual_samples, - const unsigned predictor_order, - const unsigned suggested_rice_parameter, - const unsigned rice_parameter_limit, - const unsigned rice_parameter_search_dist, - const unsigned partition_order, - const FLAC__bool search_for_escapes, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, - unsigned *bits -) -{ - unsigned rice_parameter, partition_bits; - unsigned best_partition_bits, best_rice_parameter = 0; - unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; - unsigned *parameters, *raw_bits; -#ifdef ENABLE_RICE_PARAMETER_SEARCH - unsigned min_rice_parameter, max_rice_parameter; -#else - (void)rice_parameter_search_dist; -#endif - - FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); - FLAC__ASSERT(rice_parameter_limit <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); - - FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, MAX(6u, partition_order)); - parameters = partitioned_rice_contents->parameters; - raw_bits = partitioned_rice_contents->raw_bits; - - if(partition_order == 0) { - best_partition_bits = (unsigned)(-1); -#ifdef ENABLE_RICE_PARAMETER_SEARCH - if(rice_parameter_search_dist) { - if(suggested_rice_parameter < rice_parameter_search_dist) - min_rice_parameter = 0; - else - min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist; - max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist; - if(max_rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, rice_parameter_limit - 1); -#endif - max_rice_parameter = rice_parameter_limit - 1; - } - } - else - min_rice_parameter = max_rice_parameter = suggested_rice_parameter; - - for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { -#else - rice_parameter = suggested_rice_parameter; -#endif -#ifdef EXACT_RICE_BITS_CALCULATION - partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, residual); -#else - partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, abs_residual_partition_sums[0]); -#endif - if(partition_bits < best_partition_bits) { - best_rice_parameter = rice_parameter; - best_partition_bits = partition_bits; - } -#ifdef ENABLE_RICE_PARAMETER_SEARCH - } -#endif - if(search_for_escapes) { - partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples; - if(partition_bits <= best_partition_bits) { - raw_bits[0] = raw_bits_per_partition[0]; - best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ - best_partition_bits = partition_bits; - } - else - raw_bits[0] = 0; - } - parameters[0] = best_rice_parameter; - bits_ += best_partition_bits; - } - else { - unsigned partition, residual_sample; - unsigned partition_samples; - FLAC__uint64 mean, k; - const unsigned partitions = 1u << partition_order; - for(partition = residual_sample = 0; partition < partitions; partition++) { - partition_samples = (residual_samples+predictor_order) >> partition_order; - if(partition == 0) { - if(partition_samples <= predictor_order) - return false; - else - partition_samples -= predictor_order; - } - mean = abs_residual_partition_sums[partition]; - /* we are basically calculating the size in bits of the - * average residual magnitude in the partition: - * rice_parameter = floor(log2(mean/partition_samples)) - * 'mean' is not a good name for the variable, it is - * actually the sum of magnitudes of all residual values - * in the partition, so the actual mean is - * mean/partition_samples - */ -#if 0 /* old simple code */ - for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) - ; -#else -#if defined FLAC__CPU_X86_64 /* and other 64-bit arch, too */ - if(mean <= 0x80000000/512) { /* 512: more or less optimal for both 16- and 24-bit input */ -#else - if(mean <= 0x80000000/8) { /* 32-bit arch: use 32-bit math if possible */ -#endif - FLAC__uint32 k2, mean2 = (FLAC__uint32) mean; - rice_parameter = 0; k2 = partition_samples; - while(k2*8 < mean2) { /* requires: mean <= (2^31)/8 */ - rice_parameter += 4; k2 <<= 4; /* tuned for 16-bit input */ - } - while(k2 < mean2) { /* requires: mean <= 2^31 */ - rice_parameter++; k2 <<= 1; - } - } - else { - rice_parameter = 0; k = partition_samples; - if(mean <= FLAC__U64L(0x8000000000000000)/128) /* usually mean is _much_ smaller than this value */ - while(k*128 < mean) { /* requires: mean <= (2^63)/128 */ - rice_parameter += 8; k <<= 8; /* tuned for 24-bit input */ - } - while(k < mean) { /* requires: mean <= 2^63 */ - rice_parameter++; k <<= 1; - } - } -#endif - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - - best_partition_bits = (unsigned)(-1); -#ifdef ENABLE_RICE_PARAMETER_SEARCH - if(rice_parameter_search_dist) { - if(rice_parameter < rice_parameter_search_dist) - min_rice_parameter = 0; - else - min_rice_parameter = rice_parameter - rice_parameter_search_dist; - max_rice_parameter = rice_parameter + rice_parameter_search_dist; - if(max_rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, rice_parameter_limit - 1); -#endif - max_rice_parameter = rice_parameter_limit - 1; - } - } - else - min_rice_parameter = max_rice_parameter = rice_parameter; - - for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { -#endif -#ifdef EXACT_RICE_BITS_CALCULATION - partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, residual+residual_sample); -#else - partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, abs_residual_partition_sums[partition]); -#endif - if(partition_bits < best_partition_bits) { - best_rice_parameter = rice_parameter; - best_partition_bits = partition_bits; - } -#ifdef ENABLE_RICE_PARAMETER_SEARCH - } -#endif - if(search_for_escapes) { - partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples; - if(partition_bits <= best_partition_bits) { - raw_bits[partition] = raw_bits_per_partition[partition]; - best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ - best_partition_bits = partition_bits; - } - else - raw_bits[partition] = 0; - } - parameters[partition] = best_rice_parameter; - bits_ += best_partition_bits; - residual_sample += partition_samples; - } - } - - *bits = bits_; - return true; -} - -unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples) -{ - unsigned i, shift; - FLAC__int32 x = 0; - - for(i = 0; i < samples && !(x&1); i++) - x |= signal[i]; - - if(x == 0) { - shift = 0; - } - else { - for(shift = 0; !(x&1); shift++) - x >>= 1; - } - - if(shift > 0) { - for(i = 0; i < samples; i++) - signal[i] >>= shift; - } - - return shift; -} - -void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples) -{ - unsigned channel; - - for(channel = 0; channel < channels; channel++) - memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples); - - fifo->tail += wide_samples; - - FLAC__ASSERT(fifo->tail <= fifo->size); -} - -void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples) -{ - unsigned channel; - unsigned sample, wide_sample; - unsigned tail = fifo->tail; - - sample = input_offset * channels; - for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) { - for(channel = 0; channel < channels; channel++) - fifo->data[channel][tail] = input[sample++]; - tail++; - } - fifo->tail = tail; - - FLAC__ASSERT(fifo->tail <= fifo->size); -} - -FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; - const size_t encoded_bytes = encoder->private_->verify.output.bytes; - (void)decoder; - - if(encoder->private_->verify.needs_magic_hack) { - FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH); - *bytes = FLAC__STREAM_SYNC_LENGTH; - memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes); - encoder->private_->verify.needs_magic_hack = false; - } - else { - if(encoded_bytes == 0) { - /* - * If we get here, a FIFO underflow has occurred, - * which means there is a bug somewhere. - */ - FLAC__ASSERT(0); - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - } - else if(encoded_bytes < *bytes) - *bytes = encoded_bytes; - memcpy(buffer, encoder->private_->verify.output.data, *bytes); - encoder->private_->verify.output.data += *bytes; - encoder->private_->verify.output.bytes -= *bytes; - } - - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; -} - -FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data; - unsigned channel; - const unsigned channels = frame->header.channels; - const unsigned blocksize = frame->header.blocksize; - const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize; - - (void)decoder; - - for(channel = 0; channel < channels; channel++) { - if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) { - unsigned i, sample = 0; - FLAC__int32 expect = 0, got = 0; - - for(i = 0; i < blocksize; i++) { - if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) { - sample = i; - expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i]; - got = (FLAC__int32)buffer[channel][i]; - break; - } - } - FLAC__ASSERT(i < blocksize); - FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample; - encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize); - encoder->private_->verify.error_stats.channel = channel; - encoder->private_->verify.error_stats.sample = sample; - encoder->private_->verify.error_stats.expected = expect; - encoder->private_->verify.error_stats.got = got; - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - } - /* dequeue the frame from the fifo */ - encoder->private_->verify.input_fifo.tail -= blocksize; - FLAC__ASSERT(encoder->private_->verify.input_fifo.tail <= OVERREAD_); - for(channel = 0; channel < channels; channel++) - memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail * sizeof(encoder->private_->verify.input_fifo.data[0][0])); - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; -} - -void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - (void)decoder, (void)metadata, (void)client_data; -} - -void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; - (void)decoder, (void)status; - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; -} - -FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - (void)client_data; - - *bytes = fread(buffer, 1, *bytes, encoder->private_->file); - if (*bytes == 0) { - if (feof(encoder->private_->file)) - return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; - else if (ferror(encoder->private_->file)) - return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - } - return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; -} - -FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; -#ifdef __CELLOS_LV2__ - if(fseek(encoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) -#else - if(fseeko(encoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) -#endif - return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; - else - return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; -} - -FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - FLAC__off_t offset; - - (void)client_data; -#ifdef __CELLOS_LV2__ - offset = ftell(encoder->private_->file); -#else - offset = ftello(encoder->private_->file); -#endif - - if(offset < 0) { - return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; - } - else { - *absolute_byte_offset = (FLAC__uint64)offset; - return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - } -} - -#ifdef FLAC__VALGRIND_TESTING -static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) -{ - size_t ret = fwrite(ptr, size, nmemb, stream); - if(!ferror(stream)) - fflush(stream); - return ret; -} -#else -#define local__fwrite fwrite -#endif - -FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) -{ - (void)client_data, (void)current_frame; - - if(local__fwrite(buffer, sizeof(FLAC__byte), bytes, encoder->private_->file) == bytes) { - FLAC__bool call_it = 0 != encoder->private_->progress_callback && ( -#if FLAC__HAS_OGG - /* We would like to be able to use 'samples > 0' in the - * clause here but currently because of the nature of our - * Ogg writing implementation, 'samples' is always 0 (see - * ogg_encoder_aspect.c). The downside is extra progress - * callbacks. - */ - encoder->private_->is_ogg? true : -#endif - samples > 0 - ); - if(call_it) { - /* NOTE: We have to add +bytes, +samples, and +1 to the stats - * because at this point in the callback chain, the stats - * have not been updated. Only after we return and control - * gets back to write_frame_() are the stats updated - */ - encoder->private_->progress_callback(encoder, encoder->private_->bytes_written+bytes, encoder->private_->samples_written+samples, encoder->private_->frames_written+(samples?1:0), encoder->private_->total_frames_estimate, encoder->private_->client_data); - } - return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; - } - else - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; -} - -/* - * This will forcibly set stdout to binary mode (for OSes that require it) - */ -FILE *get_binary_stdout_(void) -{ - /* if something breaks here it is probably due to the presence or - * absence of an underscore before the identifiers 'setmode', - * 'fileno', and/or 'O_BINARY'; check your system header files. - */ -#if defined _MSC_VER || defined __MINGW32__ - _setmode(_fileno(stdout), _O_BINARY); -#elif defined __CYGWIN__ - /* almost certainly not needed for any modern Cygwin, but let's be safe... */ - setmode(_fileno(stdout), _O_BINARY); -#elif defined __EMX__ - setmode(fileno(stdout), O_BINARY); -#endif - - return stdout; -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/stream_encoder_framing.c
Deleted
@@ -1,549 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdio.h> -#include <string.h> /* for strlen() */ -#include "private/stream_encoder_framing.h" -#include "private/crc.h" -#include "FLAC/assert.h" - -static FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method); -static FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended); - -FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw) -{ - unsigned i, j; - const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING); - - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->is_last, FLAC__STREAM_METADATA_IS_LAST_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->type, FLAC__STREAM_METADATA_TYPE_LEN)) - return false; - - /* - * First, for VORBIS_COMMENTs, adjust the length to reflect our vendor string - */ - i = metadata->length; - if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__ASSERT(metadata->data.vorbis_comment.vendor_string.length == 0 || 0 != metadata->data.vorbis_comment.vendor_string.entry); - i -= metadata->data.vorbis_comment.vendor_string.length; - i += vendor_string_length; - } - FLAC__ASSERT(i < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, i, FLAC__STREAM_METADATA_LENGTH_LEN)) - return false; - - switch(metadata->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - FLAC__ASSERT(metadata->data.stream_info.min_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.max_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.min_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_framesize, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.max_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_framesize, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) - return false; - FLAC__ASSERT(FLAC__format_sample_rate_is_valid(metadata->data.stream_info.sample_rate)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.sample_rate, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.channels > 0); - FLAC__ASSERT(metadata->data.stream_info.channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.channels-1, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.bits_per_sample > 0); - FLAC__ASSERT(metadata->data.stream_info.bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.bits_per_sample-1, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.stream_info.md5sum, 16)) - return false; - break; - case FLAC__METADATA_TYPE_PADDING: - if(!FLAC__bitwriter_write_zeroes(bw, metadata->length * 8)) - return false; - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.data, metadata->length - (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) - return false; - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - for(i = 0; i < metadata->data.seek_table.num_points; i++) { - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].sample_number, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].stream_offset, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.seek_table.points[i].frame_samples, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) - return false; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, vendor_string_length)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)FLAC__VENDOR_STRING, vendor_string_length)) - return false; - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.num_comments)) - return false; - for(i = 0; i < metadata->data.vorbis_comment.num_comments; i++) { - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.comments[i].length)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length)) - return false; - } - break; - case FLAC__METADATA_TYPE_CUESHEET: - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.cue_sheet.media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.cue_sheet.lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.is_cd? 1 : 0, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.num_tracks, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) - return false; - for(i = 0; i < metadata->data.cue_sheet.num_tracks; i++) { - const FLAC__StreamMetadata_CueSheet_Track *track = metadata->data.cue_sheet.tracks + i; - - if(!FLAC__bitwriter_write_raw_uint64(bw, track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->number, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) - return false; - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->type, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->pre_emphasis, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->num_indices, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) - return false; - for(j = 0; j < track->num_indices; j++) { - const FLAC__StreamMetadata_CueSheet_Index *indx = track->indices + j; - - if(!FLAC__bitwriter_write_raw_uint64(bw, indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, indx->number, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) - return false; - } - } - break; - case FLAC__METADATA_TYPE_PICTURE: - { - size_t len; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.type, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) - return false; - len = strlen(metadata->data.picture.mime_type); - if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.picture.mime_type, len)) - return false; - len = strlen((const char *)metadata->data.picture.description); - if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.description, len)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.data_length, FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.data, metadata->data.picture.data_length)) - return false; - } - break; - default: - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.unknown.data, metadata->length)) - return false; - break; - } - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); - return true; -} - -FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw) -{ - unsigned u, blocksize_hint, sample_rate_hint; - FLAC__byte crc; - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_RESERVED_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, (header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER)? 0 : 1, FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN)) - return false; - - FLAC__ASSERT(header->blocksize > 0 && header->blocksize <= FLAC__MAX_BLOCK_SIZE); - /* when this assertion holds true, any legal blocksize can be expressed in the frame header */ - FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535u); - blocksize_hint = 0; - switch(header->blocksize) { - case 192: u = 1; break; - case 576: u = 2; break; - case 1152: u = 3; break; - case 2304: u = 4; break; - case 4608: u = 5; break; - case 256: u = 8; break; - case 512: u = 9; break; - case 1024: u = 10; break; - case 2048: u = 11; break; - case 4096: u = 12; break; - case 8192: u = 13; break; - case 16384: u = 14; break; - case 32768: u = 15; break; - default: - if(header->blocksize <= 0x100) - blocksize_hint = u = 6; - else - blocksize_hint = u = 7; - break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BLOCK_SIZE_LEN)) - return false; - - FLAC__ASSERT(FLAC__format_sample_rate_is_valid(header->sample_rate)); - sample_rate_hint = 0; - switch(header->sample_rate) { - case 88200: u = 1; break; - case 176400: u = 2; break; - case 192000: u = 3; break; - case 8000: u = 4; break; - case 16000: u = 5; break; - case 22050: u = 6; break; - case 24000: u = 7; break; - case 32000: u = 8; break; - case 44100: u = 9; break; - case 48000: u = 10; break; - case 96000: u = 11; break; - default: - if(header->sample_rate <= 255000 && header->sample_rate % 1000 == 0) - sample_rate_hint = u = 12; - else if(header->sample_rate % 10 == 0) - sample_rate_hint = u = 14; - else if(header->sample_rate <= 0xffff) - sample_rate_hint = u = 13; - else - u = 0; - break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_SAMPLE_RATE_LEN)) - return false; - - FLAC__ASSERT(header->channels > 0 && header->channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN) && header->channels <= FLAC__MAX_CHANNELS); - switch(header->channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - u = header->channels - 1; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 8; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 9; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 10; - break; - default: - FLAC__ASSERT(0); - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN)) - return false; - - FLAC__ASSERT(header->bits_per_sample > 0 && header->bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); - switch(header->bits_per_sample) { - case 8 : u = 1; break; - case 12: u = 2; break; - case 16: u = 4; break; - case 20: u = 5; break; - case 24: u = 6; break; - default: u = 0; break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_ZERO_PAD_LEN)) - return false; - - if(header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { - if(!FLAC__bitwriter_write_utf8_uint32(bw, header->number.frame_number)) - return false; - } - else { - if(!FLAC__bitwriter_write_utf8_uint64(bw, header->number.sample_number)) - return false; - } - - if(blocksize_hint) - if(!FLAC__bitwriter_write_raw_uint32(bw, header->blocksize-1, (blocksize_hint==6)? 8:16)) - return false; - - switch(sample_rate_hint) { - case 12: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 1000, 8)) - return false; - break; - case 13: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate, 16)) - return false; - break; - case 14: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 10, 16)) - return false; - break; - } - - /* write the CRC */ - if(!FLAC__bitwriter_get_write_crc8(bw, &crc)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, crc, FLAC__FRAME_HEADER_CRC_LEN)) - return false; - - return true; -} - -FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - FLAC__bool ok; - - ok = - FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN) && - (wasted_bits? FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1) : true) && - FLAC__bitwriter_write_raw_int32(bw, subframe->value, subframe_bps) - ; - - return ok; -} - -FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK | (subframe->order<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) - return false; - - if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) - return false; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!add_residual_partitioned_rice_( - bw, - subframe->residual, - residual_samples, - subframe->order, - subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, - subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, - subframe->entropy_coding_method.data.partitioned_rice.order, - /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 - )) - return false; - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK | ((subframe->order-1)<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, subframe->qlp_coeff_precision-1, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->quantization_level, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) - return false; - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->qlp_coeff[i], subframe->qlp_coeff_precision)) - return false; - - if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) - return false; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!add_residual_partitioned_rice_( - bw, - subframe->residual, - residual_samples, - subframe->order, - subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, - subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, - subframe->entropy_coding_method.data.partitioned_rice.order, - /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 - )) - return false; - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - const FLAC__int32 *signal = subframe->data; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < samples; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, signal[i], subframe_bps)) - return false; - - return true; -} - -FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method) -{ - if(!FLAC__bitwriter_write_raw_uint32(bw, method->type, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; - switch(method->type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitwriter_write_raw_uint32(bw, method->data.partitioned_rice.order, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; - break; - default: - FLAC__ASSERT(0); - } - return true; -} - -FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended) -{ - const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; - const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - if(partition_order == 0) { - unsigned i; - - if(raw_bits[0] == 0) { - if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[0], plen)) - return false; - if(!FLAC__bitwriter_write_rice_signed_block(bw, residual, residual_samples, rice_parameters[0])) - return false; - } - else { - FLAC__ASSERT(rice_parameters[0] == 0); - if(!FLAC__bitwriter_write_raw_uint32(bw, pesc, plen)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; - for(i = 0; i < residual_samples; i++) { - if(!FLAC__bitwriter_write_raw_int32(bw, residual[i], raw_bits[0])) - return false; - } - } - return true; - } - else { - unsigned i, j, k = 0, k_last = 0; - unsigned partition_samples; - const unsigned default_partition_samples = (residual_samples+predictor_order) >> partition_order; - for(i = 0; i < (1u<<partition_order); i++) { - partition_samples = default_partition_samples; - if(i == 0) - partition_samples -= predictor_order; - k += partition_samples; - if(raw_bits[i] == 0) { - if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[i], plen)) - return false; - if(!FLAC__bitwriter_write_rice_signed_block(bw, residual+k_last, k-k_last, rice_parameters[i])) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, pesc, plen)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[i], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; - for(j = k_last; j < k; j++) { - if(!FLAC__bitwriter_write_raw_int32(bw, residual[j], raw_bits[i])) - return false; - } - } - k_last = k; - } - return true; - } -}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/stream_encoder_intrin_sse2.c
Deleted
@@ -1,158 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/stream_encoder.h" -#ifdef FLAC__SSE2_SUPPORTED - -#include <stdlib.h> /* for abs() */ -#include <emmintrin.h> /* SSE2 */ -#include "FLAC/assert.h" - -FLAC__SSE_TARGET("sse2") -void FLAC__precompute_partition_info_sums_intrin_sse2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - unsigned e1, e3; - __m128i mm_res, mm_sum, mm_mask; - - if(bps <= 16) { - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 3) & ~3; e3 = end & ~3; - if(e1 > end) - e1 = end; /* try flac -l 1 -b 16 and you'll be here */ - - /* assumption: residual[] is properly aligned so (residual + e1) is properly aligned too and _mm_loadu_si128() is fast */ - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=4) { - mm_res = _mm_loadu_si128((const __m128i*)(residual+residual_sample)); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - mm_sum = _mm_add_epi32(mm_sum, _mm_srli_si128(mm_sum, 8)); - mm_sum = _mm_add_epi32(mm_sum, _mm_srli_si128(mm_sum, 4)); - abs_residual_partition_sums[partition] = _mm_cvtsi128_si32(mm_sum); - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 1) & ~1; e3 = end & ~1; - FLAC__ASSERT(e1 <= end); - - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); /* 0 0 0 r0 */ - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); /* 0 0 0 |r0| == 00 |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=2) { - mm_res = _mm_loadl_epi64((const __m128i*)(residual+residual_sample)); /* 0 0 r1 r0 */ - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); /* 0 0 |r1| |r0| */ - mm_res = _mm_shuffle_epi32(mm_res, _MM_SHUFFLE(3,1,2,0)); /* 0 |r1| 0 |r0| == |r1_64| |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - mm_sum = _mm_add_epi64(mm_sum, _mm_srli_si128(mm_sum, 8)); - _mm_storel_epi64((__m128i*)(abs_residual_partition_sums+partition), mm_sum); - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -#endif /* FLAC__SSE2_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/stream_encoder_intrin_ssse3.c
Deleted
@@ -1,146 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/stream_encoder.h" -#ifdef FLAC__SSSE3_SUPPORTED - -#include <stdlib.h> /* for abs() */ -#include <tmmintrin.h> /* SSSE3 */ -#include "FLAC/assert.h" - -FLAC__SSE_TARGET("ssse3") -void FLAC__precompute_partition_info_sums_intrin_ssse3(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - unsigned e1, e3; - __m128i mm_res, mm_sum; - - if(bps <= 16) { - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 3) & ~3; e3 = end & ~3; - if(e1 > end) - e1 = end; /* try flac -l 1 -b 16 and you'll be here */ - - /* assumption: residual[] is properly aligned so (residual + e1) is properly aligned too and _mm_loadu_si128() is fast */ - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_res = _mm_abs_epi32(mm_res); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=4) { - mm_res = _mm_loadu_si128((const __m128i*)(residual+residual_sample)); - mm_res = _mm_abs_epi32(mm_res); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_res = _mm_abs_epi32(mm_res); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - mm_sum = _mm_hadd_epi32(mm_sum, mm_sum); - mm_sum = _mm_hadd_epi32(mm_sum, mm_sum); - abs_residual_partition_sums[partition] = _mm_cvtsi128_si32(mm_sum); - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 1) & ~1; e3 = end & ~1; - FLAC__ASSERT(e1 <= end); - - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); /* 0 0 0 r0 */ - mm_res = _mm_abs_epi32(mm_res); /* 0 0 0 |r0| == 00 |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=2) { - mm_res = _mm_loadl_epi64((const __m128i*)(residual+residual_sample)); /* 0 0 r1 r0 */ - mm_res = _mm_abs_epi32(mm_res); /* 0 0 |r1| |r0| */ - mm_res = _mm_shuffle_epi32(mm_res, _MM_SHUFFLE(3,1,2,0)); /* 0 |r1| 0 |r0| == |r1_64| |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_res = _mm_abs_epi32(mm_res); - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - mm_sum = _mm_add_epi64(mm_sum, _mm_srli_si128(mm_sum, 8)); - _mm_storel_epi64((__m128i*)(abs_residual_partition_sums+partition), mm_sum); - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -#endif /* FLAC__SSSE3_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */
View file
libretro-mame2003-0~git20210529.tar.xz/.gitlab-ci.yml
Added
@@ -0,0 +1,269 @@ +# DESCRIPTION: GitLab CI/CD for libRetro (NOT FOR GitLab-proper) + +############################################################################## +################################# BOILERPLATE ################################ +############################################################################## + +# Core definitions +.core-defs: + variables: + JNI_PATH: . + CORENAME: mame2003 + +# Inclusion templates, required for the build to work +include: + ################################## DESKTOPS ################################ + # Windows 64-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-x64-mingw.yml' + + # Windows 32-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-i686-mingw.yml' + + # Windows msvc10 64-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-x64-msvc10-msys2.yml' + + # Windows msvc10 32-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-i686-msvc10-msys2.yml' + + # Windows msvc05 32-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-i686-msvc05-msys2.yml' + + # Linux 64-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/linux-x64.yml' + + # Linux 32-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/linux-i686.yml' + + # MacOS 64-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/osx-x64.yml' + + # MacOS ARM 64-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/osx-arm64.yml' + + # MacOS PowerPC 32-bit + - project: 'libretro-infrastructure/ci-templates' + file: '/osx-ppc.yml' + + ################################## CELLULAR ################################ + # Android + - project: 'libretro-infrastructure/ci-templates' + file: '/android-jni.yml' + + # iOS + - project: 'libretro-infrastructure/ci-templates' + file: '/ios-arm64.yml' + + # iOS (armv7) + - project: 'libretro-infrastructure/ci-templates' + file: '/ios9.yml' + + ################################## CONSOLES ################################ + # PlayStation Portable + - project: 'libretro-infrastructure/ci-templates' + file: '/psp-static.yml' + + # PlayStation Vita + - project: 'libretro-infrastructure/ci-templates' + file: '/vita-static.yml' + + # Nintendo 3DS + - project: 'libretro-infrastructure/ci-templates' + file: '/ctr-static.yml' + + # Nintendo WiiU + - project: 'libretro-infrastructure/ci-templates' + file: '/wiiu-static.yml' + + # Nintendo Switch + - project: 'libretro-infrastructure/ci-templates' + file: '/libnx-static.yml' + + # OpenDingux + - project: 'libretro-infrastructure/ci-templates' + file: '/dingux-mips32.yml' + + # tvOS (AppleTV) + - project: 'libretro-infrastructure/ci-templates' + file: '/tvos-arm64.yml' + + #################################### MISC ################################## + # Emscripten + - project: 'libretro-infrastructure/ci-templates' + file: '/emscripten-static.yml' + +# Stages for building +stages: + - build-prepare + - build-shared + - build-static + +############################################################################## +#################################### STAGES ################################## +############################################################################## + +################################### DESKTOPS ################################# +# Windows 64-bit +libretro-build-windows-x64: + extends: + - .libretro-windows-x64-mingw-make-default + - .core-defs + +# Windows 32-bit +libretro-build-windows-i686: + extends: + - .libretro-windows-i686-mingw-make-default + - .core-defs + +# Windows msvc10 64-bit +libretro-build-windows-msvc10-x64: + extends: + - .libretro-windows-x64-msvc10-msys2-make-default + - .core-defs + +# Windows msvc10 32-bit +libretro-build-windows-msvc10-i686: + extends: + - .libretro-windows-i686-msvc10-msys2-make-default + - .core-defs + +# Windows msvc05 32-bit +libretro-build-windows-msvc05-i686: + extends: + - .libretro-windows-i686-msvc05-msys2-make-default + - .core-defs + +# Linux 64-bit +libretro-build-linux-x64: + extends: + - .libretro-linux-x64-make-default + - .core-defs + +# Linux 32-bit +libretro-build-linux-i686: + extends: + - .libretro-linux-i686-make-default + - .core-defs + +# MacOS 64-bit +libretro-build-osx-x64: + tags: + - macosx-packaging + extends: + - .libretro-osx-x64-make-default + - .core-defs + +# MacOS ARM 64-bit +libretro-build-osx-arm64: + tags: + - macosx-packaging + extends: + - .libretro-osx-arm64-make-default + - .core-defs + +# MacOS PowerPC 32-bit +libretro-build-osx-ppc: + extends: + - .libretro-osx-ppc-make-default + - .core-defs + +################################### CELLULAR ################################# +# Android ARMv7a +android-armeabi-v7a: + extends: + - .libretro-android-jni-armeabi-v7a + - .core-defs + +# Android ARMv8a +android-arm64-v8a: + extends: + - .libretro-android-jni-arm64-v8a + - .core-defs + +# Android 64-bit x86 +android-x86_64: + extends: + - .libretro-android-jni-x86_64 + - .core-defs + +# Android 32-bit x86 +android-x86: + extends: + - .libretro-android-jni-x86 + - .core-defs + +# iOS +libretro-build-ios-arm64: + extends: + - .libretro-ios-arm64-make-default + - .core-defs + +# iOS (armv7) [iOS 9 and up] +libretro-build-ios9: + extends: + - .libretro-ios9-make-default + - .core-defs + +# tvOS +libretro-build-tvos-arm64: + extends: + - .libretro-tvos-arm64-make-default + - .core-defs + +################################### CONSOLES ################################# +# PlayStation Portable +libretro-build-psp: + extends: + - .libretro-psp-static-retroarch-master + - .core-defs + +# PlayStation Vita +libretro-build-vita: + extends: + - .libretro-vita-static-retroarch-master + - .core-defs + +# Nintendo 3DS +libretro-build-ctr: + extends: + - .libretro-ctr-static-retroarch-master + - .core-defs + +# Nintendo WiiU +libretro-build-wiiu: + extends: + - .libretro-wiiu-static-retroarch-master + - .core-defs + +# Nintendo Switch +libretro-build-libnx-aarch64: + extends: + - .libretro-libnx-static-retroarch-master + - .core-defs + +# OpenDingux +libretro-build-dingux-mips32: + extends: + - .libretro-dingux-mips32-make-default + - .core-defs + +# OpenDingux Beta +libretro-build-dingux-odbeta-mips32: + extends: + - .libretro-dingux-odbeta-mips32-make-default + - .core-defs + +#################################### MISC #################################### +# Emscripten +libretro-build-emscripten: + extends: + - .libretro-emscripten-static-retroarch-master + - .core-defs
View file
libretro-mame2003-0~git20200805.tar.xz/Makefile -> libretro-mame2003-0~git20210529.tar.xz/Makefile
Changed
@@ -10,9 +10,9 @@ LIBS ?= ifneq ($(SANITIZER),) - CFLAGS := -fsanitize=$(SANITIZER) $(CFLAGS) - CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS) - LDFLAGS := -fsanitize=$(SANITIZER) $(LDFLAGS) + CFLAGS := -fsanitize=$(SANITIZER) $(CFLAGS) + CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS) + LDFLAGS := -fsanitize=$(SANITIZER) $(LDFLAGS) endif GIT_VERSION ?= " $(shell git rev-parse --short HEAD || echo unknown)" @@ -32,32 +32,32 @@ ifeq ($(platform),) system_platform = unix platform = unix -ifeq ($(shell uname -a),) - system_platform = win - platform = win -else ifneq ($(findstring MINGW,$(shell uname -a)),) - system_platform = win - platform = win -else ifneq ($(findstring Darwin,$(shell uname -a)),) - system_platform = osx - platform = osx -else ifneq ($(findstring win,$(shell uname -a)),) - system_platform = win - platform = win -endif + ifeq ($(shell uname -a),) + system_platform = win + platform = win + else ifneq ($(findstring MINGW,$(shell uname -a)),) + system_platform = win + platform = win + else ifneq ($(findstring Darwin,$(shell uname -a)),) + system_platform = osx + platform = osx + else ifneq ($(findstring win,$(shell uname -a)),) + system_platform = win + platform = win + endif endif #Windows and wsl need to have their linking split up due to cmd length limits ifneq ($(findstring Microsoft,$(shell uname -a)),) - SPLIT_UP_LINK=1 + SPLIT_UP_LINK=1 endif ifneq ($(findstring MINGW,$(shell uname -a)),) - SPLIT_UP_LINK=1 + SPLIT_UP_LINK=1 endif ifeq ($(system_platform), win) - SPLIT_UP_LINK=1 + SPLIT_UP_LINK=1 endif @@ -66,150 +66,182 @@ X86_MIPS3_DRC = # don't use x86 DRC MIPS3 engine by default; set to 1 to enable ifeq ($(ARCH),) - # no architecture value passed make; try to determine host platform - UNAME_P = $(shell uname -p) -ifneq ($(findstring powerpc,$(UNAME_P)),) - ARCH = ppc -else ifneq ($(findstring x86_64,$(UNAME_P)),) - # catch "x86_64" first to avoid 64-bit architecture being caught by our next search for "86" - # no commands for x86_x64 only at this point - # we could help compile an x86_64 dynarec here or something like that -else ifneq ($(findstring 86,$(UNAME_P)),) - ARCH = x86 # if "86" is found now it must be i386 or i686 -endif + # no architecture value passed make; try to determine host platform + UNAME_P = $(shell uname -p) + ifneq ($(findstring powerpc,$(UNAME_P)),) + ARCH = ppc + else ifneq ($(findstring x86_64,$(UNAME_P)),) + # catch "x86_64" first to avoid 64-bit architecture being caught by our next search for "86" + # no commands for x86_x64 only at this point + # we could help compile an x86_64 dynarec here or something like that + else ifneq ($(findstring 86,$(UNAME_P)),) + ARCH = x86 # if "86" is found now it must be i386 or i686 + endif endif ifeq ($(ARCH), x86) - X86_MIPS3_DRC = 1 + X86_MIPS3_DRC = 1 endif ifeq (,$(findstring msvc,$(platform))) - LIBS += -lm + LIBS += -lm endif ifneq (,$(findstring msvc,$(platform))) - system_platform = win + system_platform = win endif +# Unix ifeq ($(platform), unix) - TARGET = $(TARGET_NAME)_libretro.so - fpic = -fPIC - CFLAGS += $(fpic) - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T +# Linux Portable else ifeq ($(platform), linux-portable) - TARGET = $(TARGET_NAME)_libretro.so - fpic = -fPIC -nostdlib - CFLAGS += $(fpic) - LIBS = - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC -nostdlib + CFLAGS += $(fpic) + LIBS = + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T +# MacOS X else ifeq ($(platform), osx) - TARGET = $(TARGET_NAME)_libretro.dylib - fpic = -fPIC - -ifeq ($(ARCH),ppc) - BIGENDIAN = 1 - PLATCFLAGS += -D__ppc__ -D__POWERPC__ -endif - LDFLAGS += $(fpic) -dynamiclib - OSXVER = `sw_vers -productVersion | cut -c 4` - fpic += -mmacosx-version-min=10.1 + TARGET = $(TARGET_NAME)_libretro.dylib + PLATCFLAGS += -Wno-error=implicit-function-declaration + fpic = -fPIC + ifeq ($(ARCH),ppc) + BIGENDIAN = 1 + PLATCFLAGS += -D__ppc__ -D__POWERPC__ + endif + LDFLAGS += $(fpic) -dynamiclib + OSXVER = `sw_vers -productVersion | cut -c 4` + OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"` + ifeq ($(OSX_LT_MAVERICKS), YES) + fpic += -mmacosx-version-min=10.1 + endif + ifeq ($(CROSS_COMPILE),1) + TARGET_RULE = -target $(LIBRETRO_APPLE_PLATFORM) -isysroot $(LIBRETRO_APPLE_ISYSROOT) + CFLAGS += $(TARGET_RULE) + CPPFLAGS += $(TARGET_RULE) + CXXFLAGS += $(TARGET_RULE) + LDFLAGS += $(TARGET_RULE) + endif # iOS else ifneq (,$(findstring ios,$(platform))) - TARGET = $(TARGET_NAME)_libretro_ios.dylib - fpic = -fPIC - LDFLAGS += $(fpic) -dynamiclib - PLATCFLAGS += -D__IOS__ -std=c99 -Wno-error=implicit-function-declaration -ifeq ($(IOSSDK),) - IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) -endif -ifeq ($(platform),ios-arm64) - CC = cc -arch arm64 -isysroot $(IOSSDK) - LD = cc -arch arm64 -isysroot $(IOSSDK) -else - CC = cc -arch armv7 -isysroot $(IOSSDK) - LD = cc -arch armv7 -isysroot $(IOSSDK) -endif -ifeq ($(platform),ios9) - fpic += -miphoneos-version-min=8.0 - CC += -miphoneos-version-min=8.0 - LD += -miphoneos-version-min=8.0 -else - fpic += -miphoneos-version-min=5.0 - CC += -miphoneos-version-min=5.0 - LD += -miphoneos-version-min=5.0 -endif + TARGET = $(TARGET_NAME)_libretro_ios.dylib + fpic = -fPIC + LDFLAGS += $(fpic) -dynamiclib + PLATCFLAGS += -D__IOS__ -Wcast-align -Wall -Wno-error=implicit-function-declaration + MINVERSION := + ifeq ($(IOSSDK),) + IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) + endif + ifeq ($(platform),ios-arm64) + CC = cc -arch arm64 -isysroot $(IOSSDK) + LD = cc -arch arm64 -isysroot $(IOSSDK) + else + CC = cc -arch armv7 -isysroot $(IOSSDK) + LD = cc -arch armv7 -isysroot $(IOSSDK) + endif + ifeq ($(platform),$(filter $(platform),ios9 ios-arm64)) + MINVERSION = -miphoneos-version-min=8.0 + else + MINVERSION = -miphoneos-version-min=5.0 + endif + CFLAGS += $(MINVERSION) + LDFLAGS += $(MINVERSION) # tvOS else ifeq ($(platform), tvos-arm64) - TARGET = $(TARGET_NAME)_libretro_tvos.dylib - fpic = -fPIC - LDFLAGS += $(fpic) -dynamiclib - PLATCFLAGS += -D__IOS__ -std=c99 -Wno-error=implicit-function-declaration -ifeq ($(IOSSDK),) - IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) -endif - -# 3DS -else ifeq ($(platform), ctr) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - CC = $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT) - CXX = $(DEVKITARM)/bin/arm-none-eabi-g++$(EXE_EXT) - AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT) - PLATCFLAGS += -DARM11 -D_3DS - PLATCFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard -mfpu=vfp - PLATCFLAGS += -Wall -mword-relocations - PLATCFLAGS += -fomit-frame-pointer -ffast-math - CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 - CPU_ARCH := arm - STATIC_LINKING = 1 - + TARGET = $(TARGET_NAME)_libretro_tvos.dylib + fpic = -fPIC + LDFLAGS += $(fpic) -dynamiclib + PLATCFLAGS += -D__IOS__ -Wcast-align -Wall -Wno-error=implicit-function-declaration + ifeq ($(IOSSDK),) + IOSSDK := $(shell xcodebuild -version -sdk appletvos Path) + endif + CC = cc -arch arm64 -isysroot $(IOSSDK) + +# Raspberry Pi 0 +else ifeq ($(platform), rpi0) + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + CPU_ARCH := arm + ARM = 1 + +# Raspberry Pi 1 +else ifeq ($(platform), rpi1) + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + CPU_ARCH := arm + ARM = 1 + +# Raspberry Pi 2 else ifeq ($(platform), rpi2) - TARGET = $(TARGET_NAME)_libretro.so - fpic = -fPIC - CFLAGS += $(fpic) - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T - PLATCFLAGS += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard - PLATCFLAGS += -fomit-frame-pointer -ffast-math - CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions - CPU_ARCH := arm - ARM = 1 - + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + CPU_ARCH := arm + ARM = 1 + +# Raspberry Pi 3 else ifeq ($(platform), rpi3) - TARGET = $(TARGET_NAME)_libretro.so - fpic = -fPIC - CFLAGS += $(fpic) - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T - PLATCFLAGS += -marm -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard - PLATCFLAGS += -fomit-frame-pointer -ffast-math - CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions - CPU_ARCH := arm - ARM = 1 - + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -marm -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + CPU_ARCH := arm + ARM = 1 + +# Raspberry Pi 4 else ifeq ($(platform), rpi4) - TARGET = $(TARGET_NAME)_libretro.so - fpic = -fPIC - CFLAGS += $(fpic) - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T - PLATCFLAGS += -marm -mcpu=cortex-a72 -mfpu=neon-fp-armv8 -mfloat-abi=hard - PLATCFLAGS += -fomit-frame-pointer -ffast-math - CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions - CPU_ARCH := arm - ARM = 1 - -# Classic Platforms #################### -# Platform affix = classic_<ISA>_<µARCH> -# Help at https://modmyclassic.com/comp - -# (armv7 a7, hard point, neon based) ### -# NESC, SNESC, C64 mini + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -marm -mcpu=cortex-a72 -mfpu=neon-fp-armv8 -mfloat-abi=hard + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + CPU_ARCH := arm + ARM = 1 + +# Raspberry Pi 4 (AArch64) +else ifeq ($(platform), rpi4_64) + TARGET = $(TARGET_NAME)_libretro.so + fpic = -fPIC + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -mcpu=cortex-a72 -mtune=cortex-a72 + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + CPU_ARCH := arm64 + +# Classic Platforms - NESC, SNESC, C64 mini else ifeq ($(platform), classic_armv7_a7) TARGET := $(TARGET_NAME)_libretro.so fpic := -fPIC - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T CFLAGS += -Ofast \ -flto=4 -fwhole-program -fuse-linker-plugin \ -fdata-sections -ffunction-sections -Wl,--gc-sections \ @@ -225,74 +257,127 @@ ARCH = arm BUILTIN_GPU = neon USE_DYNAREC = 1 - CPU_ARCH := arm - ARM = 1 + CPU_ARCH := arm + ARM = 1 ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1) - CFLAGS += -march=armv7-a + CFLAGS += -march=armv7-a else - CFLAGS += -march=armv7ve - # If gcc is 5.0 or later - ifeq ($(shell echo `$(CC) -dumpversion` ">= 5" | bc -l), 1) - LDFLAGS += -static-libgcc -static-libstdc++ - endif + CFLAGS += -march=armv7ve + # If gcc is 5.0 or later + ifeq ($(shell echo `$(CC) -dumpversion` ">= 5" | bc -l), 1) + LDFLAGS += -static-libgcc -static-libstdc++ + endif endif -####################################### -# generic armhf######################## +# Playstation Classic +else ifeq ($(platform), classic_armv8_a35) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + CFLAGS += -Ofast \ + -flto=4 -fwhole-program -fuse-linker-plugin \ + -fdata-sections -ffunction-sections -Wl,--gc-sections \ + -fno-stack-protector -fno-ident -fomit-frame-pointer \ + -falign-functions=1 -falign-jumps=1 -falign-loops=1 \ + -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \ + -fmerge-all-constants -fno-math-errno \ + -marm -mtune=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard + CXXFLAGS += $(CFLAGS) + CPPFLAGS += $(CFLAGS) + ASFLAGS += $(CFLAGS) + HAVE_NEON = 1 + ARCH = arm + BUILTIN_GPU = neon + USE_DYNAREC = 1 + CPU_ARCH := arm + ARM = 1 + CFLAGS += -march=armv8-a + LDFLAGS += -static-libgcc -static-libstdc++ + +# Generic ARM-hf else ifeq ($(platform), armhf) - CFLAGS += $(fpic) - LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T - PLATCFLAGS += -march=armv6 -mfloat-abi=hard -mfpu=vfp - PLATCFLAGS += -fomit-frame-pointer -ffast-math + CFLAGS += $(fpic) + LDFLAGS += $(fpic) -shared -Wl,--version-script=link.T + PLATCFLAGS += -march=armv6 -mfloat-abi=hard -mfpu=vfp + PLATCFLAGS += -fomit-frame-pointer -ffast-math +# Android ARM-v7 else ifeq ($(platform), android-armv7) - TARGET = $(TARGET_NAME)_libretro_android.so - CFLAGS += -fPIC - PLATCFLAGS += -march=armv7-a -mfloat-abi=softfp - LDFLAGS += -fPIC -shared -Wl,--version-script=link.T - CC = arm-linux-androideabi-gcc - AR = arm-linux-androideabi-ar - LD = arm-linux-androideabi-gcc - + TARGET = $(TARGET_NAME)_libretro_android.so + CFLAGS += -fPIC + PLATCFLAGS += -march=armv7-a -mfloat-abi=softfp + LDFLAGS += -fPIC -shared -Wl,--version-script=link.T + CC = arm-linux-androideabi-gcc + AR = arm-linux-androideabi-ar + LD = arm-linux-androideabi-gcc + +# QNX else ifeq ($(platform), qnx) - TARGET = $(TARGET_NAME)_libretro_$(platform).so - CFLAGS += -fPIC - PLATCFLAGS += -march=armv7-a - LDFLAGS += -fPIC -shared -Wl,--version-script=link.T - CC = qcc -Vgcc_ntoarmv7le - AR = qcc -Vgcc_ntoarmv7le - LD = QCC -Vgcc_ntoarmv7le - + TARGET = $(TARGET_NAME)_libretro_$(platform).so + CFLAGS += -fPIC + PLATCFLAGS += -march=armv7-a + LDFLAGS += -fPIC -shared -Wl,--version-script=link.T + CC = qcc -Vgcc_ntoarmv7le + AR = qcc -Vgcc_ntoarmv7le + LD = QCC -Vgcc_ntoarmv7le + +# Nintendo 3DS +else ifeq ($(platform), ctr) + TARGET = $(TARGET_NAME)_libretro_$(platform).a + CC = $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT) + CXX = $(DEVKITARM)/bin/arm-none-eabi-g++$(EXE_EXT) + AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT) + PLATCFLAGS += -DARM11 -D_3DS + PLATCFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard -mfpu=vfp + PLATCFLAGS += -Wall -mword-relocations + PLATCFLAGS += -fomit-frame-pointer -ffast-math + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + CPU_ARCH := arm + STATIC_LINKING = 1 + +# Nintendo GameCube +else ifeq ($(platform), ngc) + TARGET := $(TARGET_NAME)_libretro_$(platform).a + BIGENDIAN = 1 + CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) + CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT) + AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) + PLATCFLAGS += -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float + PLATCFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int + STATIC_LINKING = 1 + +# Nintendo Wii else ifeq ($(platform), wii) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - BIGENDIAN = 1 - CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) - AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) - PLATCFLAGS += -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float -D__ppc__ -D__POWERPC__ - PLATCFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int - STATIC_LINKING = 1 - + TARGET = $(TARGET_NAME)_libretro_$(platform).a + BIGENDIAN = 1 + CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) + AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) + PLATCFLAGS += -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float -D__ppc__ -D__POWERPC__ + PLATCFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int + STATIC_LINKING = 1 + +# Nintendo WiiU else ifeq ($(platform), wiiu) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - BIGENDIAN = 1 - CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) - AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) - PLATCFLAGS += -DGEKKO -DWIIU -mwup -mcpu=750 -meabi -mhard-float -D__ppc__ -D__POWERPC__ - PLATCFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int - STATIC_LINKING = 1 + TARGET = $(TARGET_NAME)_libretro_$(platform).a + BIGENDIAN = 1 + CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT) + AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT) + PLATCFLAGS += -DGEKKO -DWIIU -mcpu=750 -meabi -mhard-float -D__ppc__ -D__POWERPC__ + PLATCFLAGS += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int + STATIC_LINKING = 1 # Nintendo Switch (libnx) else ifeq ($(platform), libnx) - include $(DEVKITPRO)/libnx/switch_rules - EXT=a - TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT) - DEFINES := -DSWITCH=1 -U__linux__ -U__linux -DRARCH_INTERNAL -DHAVE_LIBNX - CFLAGS := $(DEFINES) -g -O3 -ffast-math -fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -ftls-model=local-exec -Wl,--allow-multiple-definition -specs=$(LIBNX)/switch.specs - CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 - CFLAGS += -std=gnu11 - PLATCFLAGS += -D__SWITCH__ -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE - CPU_ARCH := arm64 - STATIC_LINKING = 1 + include $(DEVKITPRO)/libnx/switch_rules + EXT=a + TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT) + DEFINES := -DSWITCH=1 -U__linux__ -U__linux -DRARCH_INTERNAL -DHAVE_LIBNX + CFLAGS := $(DEFINES) -g -O3 -ffast-math -fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -fcommon -ftls-model=local-exec -Wl,--allow-multiple-definition -specs=$(LIBNX)/switch.specs + CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + CFLAGS += -std=gnu11 + PLATCFLAGS += -D__SWITCH__ -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE + CPU_ARCH := arm64 + STATIC_LINKING = 1 # Nintendo Switch (libtransistor) else ifeq ($(platform), switch) @@ -302,159 +387,177 @@ include $(LIBTRANSISTOR_HOME)/libtransistor.mk STATIC_LINKING=1 +# PS2 +else ifeq ($(platform), ps2) + TARGET := $(TARGET_NAME)_libretro_$(platform).a + CC = ee-gcc$(EXE_EXT) + CXX = ee-g++$(EXE_EXT) + AR = ee-ar$(EXE_EXT) + PLATCFLAGS := -G0 -Wall -DPS2 -DNO_UNALIGNED_ACCESS -DABGR1555 -DRENDER_GSKIT_PS2 -fsingle-precision-constant + PLATCFLAGS += -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -I$(PS2DEV)/gsKit/include + PLATCFLAGS += -O3 + PLATCFLAGS += -DHAVE_NO_LANGEXTRA + CXXFLAGS += -fno-rtti -fno-exceptions -ffast-math + STATIC_LINKING = 1 + +# PS3 else ifeq ($(platform), ps3) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - BIGENDIAN = 1 - CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe - AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe - PLATCFLAGS += -D__CELLOS_LV2__ -D__ppc__ -D__POWERPC__ - STATIC_LINKING = 1 - SPLIT_UP_LINK=1 - + TARGET = $(TARGET_NAME)_libretro_$(platform).a + BIGENDIAN = 1 + CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe + AR = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ar.exe + PLATCFLAGS += -D__CELLOS_LV2__ -D__ppc__ -D__POWERPC__ + STATIC_LINKING = 1 + SPLIT_UP_LINK=1 + +# snc PS3 else ifeq ($(platform), sncps3) - TARGET = $(TARGET_NAME)_libretro_ps3.a - BIGENDIAN = 1 - CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe - AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe - PLATCFLAGS += -D__CELLOS_LV2__ -D__ppc__ -D__POWERPC__ - STATIC_LINKING = 1 - SPLIT_UP_LINK=1 + TARGET = $(TARGET_NAME)_libretro_ps3.a + BIGENDIAN = 1 + CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe + AR = $(CELL_SDK)/host-win32/sn/bin/ps3snarl.exe + PLATCFLAGS += -D__CELLOS_LV2__ -D__ppc__ -D__POWERPC__ + STATIC_LINKING = 1 + SPLIT_UP_LINK=1 + +# Lightweight PS3 Homebrew SDK else ifeq ($(platform), psl1ght) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - BIGENDIAN = 1 - CC = $(PS3DEV)/ppu/bin/ppu-gcc$ - AR = $(PS3DEV)/ppu/bin/ppu-ar$ - PLATCFLAGS += -D__CELLOS_LV2__ -D__ppc__ -D__POWERPC__ - STATIC_LINKING = 1 - + TARGET = $(TARGET_NAME)_libretro_$(platform).a + BIGENDIAN = 1 + CC = $(PS3DEV)/ppu/bin/ppu-gcc$ + AR = $(PS3DEV)/ppu/bin/ppu-ar$ + PLATCFLAGS += -D__CELLOS_LV2__ -D__ppc__ -D__POWERPC__ + STATIC_LINKING = 1 + +# PSP else ifeq ($(platform), psp1) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - CC = psp-gcc$(EXE_EXT) - AR = psp-ar$(EXE_EXT) - PLATCFLAGS += -DPSP - CFLAGS += -G0 - STATIC_LINKING = 1 - + TARGET = $(TARGET_NAME)_libretro_$(platform).a + CC = psp-gcc$(EXE_EXT) + AR = psp-ar$(EXE_EXT) + PLATCFLAGS += -DPSP + CFLAGS += -G0 + STATIC_LINKING = 1 + +# Vita else ifeq ($(platform), vita) - TARGET = $(TARGET_NAME)_libretro_$(platform).a - CC = arm-vita-eabi-gcc$(EXE_EXT) - AR = arm-vita-eabi-ar$(EXE_EXT) - PLATCFLAGS += -DVITA -marm - CFLAGS += -mfloat-abi=hard -fsingle-precision-constant - CFLAGS += -Wall -mword-relocations - CFLAGS += -fomit-frame-pointer -ffast-math - CFLAGS += -fno-unwind-tables -fno-asynchronous-unwind-tables - CFLAGS += -fno-optimize-sibling-calls - CFLAGS += -ftree-vectorize -funroll-loops -fno-short-enums - CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions - HAVE_RZLIB := 1 - ARM = 1 - STATIC_LINKING := 1 - USE_CYCLONE := 1 - USE_DRZ80 := 1 + TARGET = $(TARGET_NAME)_libretro_$(platform).a + CC = arm-vita-eabi-gcc$(EXE_EXT) + AR = arm-vita-eabi-ar$(EXE_EXT) + PLATCFLAGS += -DVITA -mthumb + CFLAGS += -mfloat-abi=hard -fsingle-precision-constant + CFLAGS += -Wall -mword-relocations + CFLAGS += -fomit-frame-pointer -ffast-math + CFLAGS += -fno-unwind-tables -fno-asynchronous-unwind-tables + CFLAGS += -fno-optimize-sibling-calls + CFLAGS += -ftree-vectorize -funroll-loops -fno-short-enums -fcommon + CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions + HAVE_RZLIB := 1 + ARM = 1 + STATIC_LINKING := 1 + USE_CYCLONE := 1 + USE_DRZ80 := 1 +# ARMv else ifneq (,$(findstring armv,$(platform))) - TARGET = $(TARGET_NAME)_libretro.so - CFLAGS += -fPIC - LDFLAGS += -fPIC -shared -Wl,--version-script=link.T + TARGET = $(TARGET_NAME)_libretro.so + CFLAGS += -fPIC + LDFLAGS += -fPIC -shared -Wl,--version-script=link.T # GCW0 else ifeq ($(platform), gcw0) - TARGET := $(TARGET_NAME)_libretro.so - CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc-4.9.1 - CXX = /opt/gcw0-toolchain/usr/bin/mipsel-linux-g++ - AR = /opt/gcw0-toolchain/usr/bin/mipsel-linux-ar - LDFLAGS += -shared -Wl,--version-script=link.T -Wl,-no-undefined - PLATCFLAGS += -D__GCW0__ - LIBS := -lc -lgcc - fpic := -fPIC -nostdlib - LIBS = - CFLAGS += -lm -march=mips32 -mtune=mips32r2 -mhard-float - + TARGET := $(TARGET_NAME)_libretro.so + CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc + CXX = /opt/gcw0-toolchain/usr/bin/mipsel-linux-g++ + AR = /opt/gcw0-toolchain/usr/bin/mipsel-linux-ar + LDFLAGS += -shared -Wl,--version-script=link.T -Wl,-no-undefined + PLATCFLAGS += -D__GCW0__ + LIBS := -lc -lgcc -lm + fpic := -fPIC -nostdlib + CFLAGS += -lm -march=mips32 -mtune=mips32r2 -mhard-float + +# Emscripten else ifeq ($(platform), emscripten) TARGET := $(TARGET_NAME)_libretro_$(platform).bc HAVE_RZLIB := 1 STATIC_LINKING := 1 - PLATCFLAGS += -D__EMSCRIPTEN__ + PLATCFLAGS += -D__EMSCRIPTEN__ # Windows MSVC 2003 Xbox 1 else ifeq ($(platform), xbox1_msvc2003) - TARGET := $(TARGET_NAME)_libretro_xdk1.lib - MSVCBINDIRPREFIX = $(XDK)/xbox/bin/vc71 - CC = "$(MSVCBINDIRPREFIX)/CL.exe" - CXX = "$(MSVCBINDIRPREFIX)/CL.exe" - LD = "$(MSVCBINDIRPREFIX)/lib.exe" - export INCLUDE := $(XDK)/xbox/include - export LIB := $(XDK)/xbox/lib - PSS_STYLE :=2 - CFLAGS += -D_XBOX -D_XBOX1 - CXXFLAGS += -D_XBOX -D_XBOX1 - STATIC_LINKING=1 + TARGET := $(TARGET_NAME)_libretro_xdk1.lib + MSVCBINDIRPREFIX = $(XDK)/xbox/bin/vc71 + CC = "$(MSVCBINDIRPREFIX)/CL.exe" + CXX = "$(MSVCBINDIRPREFIX)/CL.exe" + LD = "$(MSVCBINDIRPREFIX)/lib.exe" + export INCLUDE := $(XDK)/xbox/include + export LIB := $(XDK)/xbox/lib + PSS_STYLE :=2 + CFLAGS += -D_XBOX -D_XBOX1 + CXXFLAGS += -D_XBOX -D_XBOX1 + STATIC_LINKING=1 # Windows MSVC 2010 Xbox 360 else ifeq ($(platform), xbox360_msvc2010) - TARGET := $(TARGET_NAME)_libretro_xdk360.lib - MSVCBINDIRPREFIX = $(XEDK)/bin/win32 - CC = "$(MSVCBINDIRPREFIX)/cl.exe" - CXX = "$(MSVCBINDIRPREFIX)/cl.exe" - LD = "$(MSVCBINDIRPREFIX)/lib.exe" - export INCLUDE := $(XEDK)/include/xbox - export LIB := $(XEDK)/lib/xbox - PSS_STYLE :=2 - CFLAGS += -D_XBOX -D_XBOX360 - CXXFLAGS += -D_XBOX -D_XBOX360 - STATIC_LINKING=1 - BIGENDIAN = 1 + TARGET := $(TARGET_NAME)_libretro_xdk360.lib + MSVCBINDIRPREFIX = $(XEDK)/bin/win32 + CC = "$(MSVCBINDIRPREFIX)/cl.exe" + CXX = "$(MSVCBINDIRPREFIX)/cl.exe" + LD = "$(MSVCBINDIRPREFIX)/lib.exe" + export INCLUDE := $(XEDK)/include/xbox + export LIB := $(XEDK)/lib/xbox + PSS_STYLE :=2 + CFLAGS += -D_XBOX -D_XBOX360 + CXXFLAGS += -D_XBOX -D_XBOX360 + STATIC_LINKING=1 + BIGENDIAN = 1 # Windows MSVC 2010 x64 else ifeq ($(platform), windows_msvc2010_x64) CC = cl.exe CXX = cl.exe + PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin/amd64"):$(PATH) + PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE") + LIB := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/lib/amd64") + INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include") -PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin/amd64"):$(PATH) -PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE") -LIB := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/lib/amd64") -INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include") - -WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib/x64 -WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib/x64 + WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*') + WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*') -WindowsSdkDirInc := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include -WindowsSdkDirInc ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include + WindowsSDKIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include") + WindowsSDKGlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\gl") + WindowsSDKLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\x64") - -INCFLAGS_PLATFORM = -I"$(WindowsSdkDirInc)" -export INCLUDE := $(INCLUDE) -export LIB := $(LIB);$(WindowsSdkDir) -TARGET := $(TARGET_NAME)_libretro.dll -PSS_STYLE :=2 -LDFLAGS += -DLL -LIBS = + INCFLAGS_PLATFORM = -I"$(WindowsSDKIncludeDir)" + export INCLUDE := $(INCLUDE);$(WindowsSDKIncludeDir);$(WindowsSDKGlIncludeDir) + export LIB := $(LIB);$(WindowsSDKLibDir) + TARGET := $(TARGET_NAME)_libretro.dll + PSS_STYLE :=2 + LDFLAGS += -DLL + LIBS = # Windows MSVC 2010 x86 else ifeq ($(platform), windows_msvc2010_x86) CC = cl.exe CXX = cl.exe + PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin"):$(PATH) + PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE") + LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/lib") + INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include") -PATH := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/bin"):$(PATH) -PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../IDE") -LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS100COMNTOOLS)../../VC/lib") -INCLUDE := $(shell IFS=$$'\n'; cygpath "$(VS100COMNTOOLS)../../VC/include") - -WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib -WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')lib - -WindowsSdkDirInc := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include -WindowsSdkDirInc ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*')Include + WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*') + WindowsSdkDir ?= $(shell reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A" -v "InstallationFolder" | grep -o '[A-Z]:\\.*') + WindowsSDKIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include") + WindowsSDKGlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\gl") + WindowsSDKLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib") -INCFLAGS_PLATFORM = -I"$(WindowsSdkDirInc)" -export INCLUDE := $(INCLUDE) -export LIB := $(LIB);$(WindowsSdkDir) -TARGET := $(TARGET_NAME)_libretro.dll -PSS_STYLE :=2 -LDFLAGS += -DLL -LIBS = + INCFLAGS_PLATFORM = -I"$(WindowsSDKIncludeDir)" + export INCLUDE := $(INCLUDE);$(WindowsSDKIncludeDir);$(WindowsSDKGlIncludeDir) + export LIB := $(LIB);$(WindowsSDKLibDir) + TARGET := $(TARGET_NAME)_libretro.dll + PSS_STYLE :=2 + LDFLAGS += -DLL + LIBS = # Windows MSVC 2003 x86 else ifeq ($(platform), windows_msvc2003_x86) @@ -465,11 +568,9 @@ INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VS71COMNTOOLS)../../Vc7/include") LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS71COMNTOOLS)../../Vc7/lib") BIN := $(shell IFS=$$'\n'; cygpath "$(VS71COMNTOOLS)../../Vc7/bin") - WindowsSdkDir := $(INETSDK) export INCLUDE := $(INCLUDE);$(INETSDK)/Include;src/libretro/libretro-common/include/compat/msvc export LIB := $(LIB);$(WindowsSdkDir);$(INETSDK)/Lib - TARGET := $(TARGET_NAME)_libretro.dll PSS_STYLE :=2 LDFLAGS += -DLL @@ -486,10 +587,17 @@ LIB := $(shell IFS=$$'\n'; cygpath -w "$(VS80COMNTOOLS)../../VC/lib") BIN := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin") - WindowsSdkDir := $(INETSDK) - export INCLUDE := $(INCLUDE);$(INETSDK)/Include;src/libretro/libretro-common/include/compat/msvc - export LIB := $(LIB);$(WindowsSdkDir);$(INETSDK)/Lib + WindowsSdkDir := $(shell reg query "HKLM\SOFTWARE\Microsoft\MicrosoftSDK\InstalledSDKs\8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3" -v "Install Dir" | grep -o '[A-Z]:\\.*') + + WindowsSDKIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include") + WindowsSDKAtlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\atl") + WindowsSDKCrtIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\crt") + WindowsSDKGlIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\gl") + WindowsSDKMfcIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\mfc") + WindowsSDKLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib") + export INCLUDE := $(INCLUDE);$(WindowsSDKIncludeDir);$(WindowsSDKAtlIncludeDir);$(WindowsSDKCrtIncludeDir);$(WindowsSDKGlIncludeDir);$(WindowsSDKMfcIncludeDir);src/libretro/libretro-common/include/compat/msvc + export LIB := $(LIB);$(WindowsSDKLibDir) TARGET := $(TARGET_NAME)_libretro.dll PSS_STYLE :=2 LDFLAGS += -DLL @@ -498,13 +606,12 @@ # Windows MSVC 2017 all architectures else ifneq (,$(findstring windows_msvc2017,$(platform))) - - NO_GCC := 1 - CFLAGS += -DNOMINMAX - CXXFLAGS += -DNOMINMAX - WINDOWS_VERSION = 1 - + NO_GCC := 1 + CFLAGS += -DNOMINMAX + CXXFLAGS += -DNOMINMAX + WINDOWS_VERSION = 1 PlatformSuffix = $(subst windows_msvc2017_,,$(platform)) + ifneq (,$(findstring desktop,$(PlatformSuffix))) WinPartition = desktop MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -FS @@ -593,10 +700,10 @@ # Windows else - TARGET := $(TARGET_NAME)_libretro.dll - CC ?= gcc - LDFLAGS += -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=link.T - CFLAGS += -D__WIN32__ + TARGET := $(TARGET_NAME)_libretro.dll + CC ?= gcc + LDFLAGS += -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=link.T + CFLAGS += -D__WIN32__ endif # Architecture-specific flags ############################# @@ -609,6 +716,11 @@ # Compiler flags for all platforms ############################# +# explictly use -fsigned-char on all platforms to solve problems with code written/tested on x86 but used on ARM +# for example, audio on rtype leo is wrong on ARM without this flag +ifeq (,$(findstring msvc,$(platform))) + CFLAGS += -fsigned-char +endif # Use position-independent code for all platforms CFLAGS += $(fpic) @@ -619,29 +731,34 @@ CFLAGS += -DRETRO_PROFILE=$(RETRO_PROFILE) ifneq ($(platform), sncps3) -ifeq (,$(findstring msvc,$(platform))) -CFLAGS += -Wall -Wunused \ - -Wpointer-arith -Wbad-function-cast -Wcast-align -Waggregate-return \ - -Wshadow -Wstrict-prototypes \ - -Wformat-security -Wwrite-strings \ - -Wdisabled-optimization -# explictly use -fsigned-char on all platforms to solve problems with code written/tested on x86 but used on ARM -# for example, audio on rtype leo is wrong on ARM without this flag -CFLAGS += -fsigned-char -endif + ifeq (,$(findstring msvc,$(platform))) + CFLAGS += -Wall -Wunused \ + -Wpointer-arith -Wbad-function-cast -Wcast-align -Waggregate-return \ + -Wshadow -Wstrict-prototypes \ + -Wformat-security -Wwrite-strings \ + -Wdisabled-optimization + endif endif ifeq (,$(findstring msvc,$(platform))) - CFLAGS += -D_XOPEN_SOURCE=500 -fomit-frame-pointer -fstrict-aliasing + CFLAGS += -D_XOPEN_SOURCE=500 -fomit-frame-pointer -fstrict-aliasing endif # End of compiler flags for all platforms ###################### # Disable optimization when debugging ##################### ifeq ($(DEBUG), 1) - CFLAGS += -O0 -g3 + CFLAGS += -O0 -g3 +else + CFLAGS += -O2 -DNDEBUG +endif + +ifneq (,$(findstring msvc,$(platform))) +ifeq ($(DEBUG),1) + CFLAGS += -MTd else - CFLAGS += -O2 -DNDEBUG + CFLAGS += -MT +endif endif # include the various .mak files @@ -684,20 +801,17 @@ all: $(TARGET) $(TARGET): $(OBJECTS) ifeq ($(STATIC_LINKING),1) - @echo Archiving $@... ifeq ($(SPLIT_UP_LINK), 1) $(AR) rcs $@ $(foreach OBJECTS,$(OBJECTS),$(NEWLINE) $(AR) q $@ $(OBJECTS)) else $(AR) rcs $@ $(OBJECTS) endif else - @echo Linking $@... - @echo platform $(system_platform) ifeq ($(SPLIT_UP_LINK), 1) # Use a temporary file to hold the list of objects, as it can exceed windows shell command limits $(file >$@.in,$(OBJECTS)) $(LD) $(LDFLAGS) $(LINKOUT)$@ @$@.in $(LIBS) - @rm $@.in + $(RM) $@.in else $(LD) $(LDFLAGS) $(LINKOUT)$@ $(OBJECTS) $(LIBS) endif @@ -712,16 +826,16 @@ $(CC) -c $(OBJOUT)$@ $< $(CFLAGS) $(OBJ)/%.a: - @echo Archiving $@... $(RM) $@ $(AR) cr $@ $^ clean: + @echo Cleaning project... ifeq ($(SPLIT_UP_LINK), 1) # Use a temporary file to hold the list of objects, as it can exceed windows shell command limits $(file >$@.in,$(OBJECTS)) - rm -f @$@.in $(TARGET) - @rm $@.in + $(RM) -f @$@.in $(TARGET) + $(RM) $@.in endif - rm -f $(OBJECTS) $(TARGET) + $(RM) -f $(OBJECTS) $(TARGET)
View file
libretro-mame2003-0~git20200805.tar.xz/Makefile.common -> libretro-mame2003-0~git20210529.tar.xz/Makefile.common
Changed
@@ -2604,9 +2604,7 @@ $(CORE_DIR)/lib/mame-chd/mame_sha1.c SOURCES_C += \ - $(CORE_DIR)/libretro-deps/libFLAC/bitmath.c \ $(CORE_DIR)/libretro-deps/libFLAC/bitreader.c \ - $(CORE_DIR)/libretro-deps/libFLAC/bitwriter.c \ $(CORE_DIR)/libretro-deps/libFLAC/cpu.c \ $(CORE_DIR)/libretro-deps/libFLAC/crc.c \ $(CORE_DIR)/libretro-deps/libFLAC/fixed.c \ @@ -2616,8 +2614,6 @@ $(CORE_DIR)/libretro-deps/libFLAC/md5.c \ $(CORE_DIR)/libretro-deps/libFLAC/memory.c \ $(CORE_DIR)/libretro-deps/libFLAC/stream_decoder.c \ - $(CORE_DIR)/libretro-deps/libFLAC/stream_encoder.c \ - $(CORE_DIR)/libretro-deps/libFLAC/stream_encoder_framing.c \ $(CORE_DIR)/libretro-deps/libFLAC/window.c ifeq ($(STATIC_LINKING),1) @@ -2630,18 +2626,15 @@ $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.c \ $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.c \ $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ $(LIBRETRO_COMM_DIR)/string/stdstring.c \ $(LIBRETRO_COMM_DIR)/utils/md5.c \ $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c \ + $(LIBRETRO_COMM_DIR)/time/rtime.c \ $(CORE_DIR)/lib/zlib/adler32.c \ - $(CORE_DIR)/lib/zlib/compress.c \ $(CORE_DIR)/lib/zlib/crc32.c \ $(CORE_DIR)/lib/zlib/deflate.c \ - $(CORE_DIR)/lib/zlib/gzclose.c \ - $(CORE_DIR)/lib/zlib/gzlib.c \ - $(CORE_DIR)/lib/zlib/gzread.c \ - $(CORE_DIR)/lib/zlib/gzwrite.c \ $(CORE_DIR)/lib/zlib/inffast.c \ $(CORE_DIR)/lib/zlib/inflate.c \ $(CORE_DIR)/lib/zlib/inftrees.c \
View file
libretro-mame2003-0~git20200805.tar.xz/README.md -> libretro-mame2003-0~git20210529.tar.xz/README.md
Changed
@@ -1,7 +1,11 @@ # mame2003-libretro +[![pipeline status](https://git.libretro.com/libretro/mame2003-libretro/badges/master/pipeline.svg)](https://git.libretro.com/libretro/mame2003-libretro/-/commits/master) + MAME as it was in 2003, using the libretro API. Suitable for lower-end devices that would struggle to run current versions of MAME (later versions of MAME are increasingly accurate, thus can perform worse). ## ROMset compatibility with MAME 2003 +View our [live compatibility table](https://buildbot.libretro.com/compatibility_lists/cores/mame2003/mame2003.html). See an incorrect entry? Create a new issue to let us know! + **The MAME 2003 core accepts MAME 0.78 ROMsets.** Each version of an arcade emulator must be used with ROMs that have the same exact version number. For example, MAME 0.37b5 ROMsets are required by the MAME 2000 emulator, but MAME 0.37b5 sets will not work correctly with the MAME 2003 or MAME 2010 emulator cores. Those cores require MAME 0.78 and MAME 0.139 ROM sets, respectively. File-not-found errors are the result of a ROMset that is wrong or incomplete, including if you're trying to run a "Split" clone .zip without the parent .zip present. "Non-Merged ROM" romset collections do not require parent .zips to be present. "Full Non-Merged" romset collections do not require the parent .zip or the BIOS .zip; Full Non-Merged romsets are fully standalone.
View file
libretro-mame2003-0~git20200805.tar.xz/metadata/catver.ini -> libretro-mame2003-0~git20210529.tar.xz/metadata/catver.ini
Changed
@@ -2359,6 +2359,7 @@ mk2r32=Fighter / Versus mk2r42=Fighter / Versus mk2r91=Fighter / Versus +mk2p=Fighter / Versus mk3=Fighter / Versus mk3r10=Fighter / Versus mk3r20=Fighter / Versus @@ -2372,6 +2373,7 @@ mladyhtr=Tabletop / Mahjong * Mature * mmatrix=Shooter / Flying Vertical mmatrixj=Shooter / Flying Vertical +mmaulers=Fighter / Versus Co-Op mmaze=Maze / Shooter Large mmcamera=Tabletop / Mahjong * Mature * mmehyou=Tabletop / Mahjong * Mature * @@ -2639,7 +2641,9 @@ nprincsu=Shooter / Walking nrallyv=Maze / Driving nrallyx=Maze / Driving -nslasher=Uncategorized +nslasher=Fighter / 2.5D +nslasherj=Fighter / 2.5D +nslashers=Fighter / 2.5D nspirit=Fighter / 2D nspiritj=Fighter / 2D nss=BIOS @@ -3416,6 +3420,7 @@ sbugger=Uncategorized scandal=Tabletop / Mahjong * Mature * scandalm=Tabletop / Mahjong * Mature * +scessjoe=Sports / Boxing scfinals=Sports / Soccer schaser=Maze schasrcv=Maze @@ -4389,6 +4394,7 @@ umanclub=Shooter / Field umk3=Fighter / Versus umk3r11=Fighter / Versus +umk3p=Fighter / Versus undoukai=Sports / Track & Field undrfire=Lightgun undrfirj=Lightgun
View file
libretro-mame2003-0~git20200805.tar.xz/metadata/hiscore.dat -> libretro-mame2003-0~git20210529.tar.xz/metadata/hiscore.dat
Changed
@@ -1,15 +1,15 @@ ; ___ ___ ___ ________ ______ ________ _____ _______ ______ _______ __________ ; / / / // // // ___/ / ____ // _ \ / / / __ \ / __ //___ ___/ ; / /__/ // // _____// / / / / // /_/ / / ____/ / / \ // /_/ / / / -; / __ // //____ // / / / / // / / ____/ / / / // __ / / / -; / / / // // // /___ / /___/ // /\ \ / /_ / /___/ // / / / / / -;/__/ /__//__//_______//______//_______//__/ \__\/______//_//_______//_/ /_/ /__/ +; / __ // //____ // / / / / // / / ____/ / / / // __ / / / +; / / / // // // /___ / /___/ // /\ \ / /_ / /___/ // / / / / / +;/__/ /__//__//_______//______//_______//__/ \__\/______//_//_______//_/ /_/ /__/ ;_________________________________________________________________________________________ ;This file can be edited with a text editor, but keep the same format: ; all fields are separated by a colon (:) ; <gamename>: -; <cpu>:<address>:<length>:<value to wait for +; <cpu>:<address>:<length>:<value to wait for ; in the first byte/word>:<value to wait for in the last byte/word> ; [repeat the above as many times as necessary] ; @@ -23,7 +23,7 @@ ;*************************************************************************** ;* latest unofficial highscore_v_infinity additions below - by leezer * ;* hiscore.dat discontinued as from mame v0.107u2. * -;* [ for Leezer's personal use only ] * +;* [ for Leezer's personal use only ] * ;* (to use this .dat file after the release of mame v0.107u2 you must use) * ;* (a hacked mame that enables hiscore.dat saves.) * ;*************************************************************************** @@ -65,8 +65,8 @@ 0:30d7e7:13f:00:35 strider: ;*Missing: Stage completion information (Player name + Score) -striderj: -stridrjr: +striderj: +stridrjr: striderua: strideruc: 0:ff89aa:78:ff:20 @@ -133,7 +133,7 @@ ;(sdi - strategic defence initiative) sdi: -defense: ;******Defense (System 16B, FD1089A 317-0028) +defense: ;******Defense (System 16B, FD1089A 317-0028) sdibl: sdib: sdibl2: @@ -143,7 +143,7 @@ sdibl6: 0:fff800:320:00:20 0:fffb88:4:00:00 -0:fffbca:3:4b:5a +0:fffbca:3:4b:5a ;*******Twin Cobra 2 (World) & (us) tcobra2: @@ -227,7 +227,7 @@ phoenixb: phoenixc: phoenixc2: -phoenixj: +phoenixj: phoenixt: vautour: pleiads: @@ -342,7 +342,7 @@ 0:83a1:6:00:00 ;********berzerk.c -berzerk: +berzerk: berzerk1: berzerkg: berzerks: @@ -497,9 +497,9 @@ fixeightt: fixeighth: fixeightht: -fixeightj: +fixeightj: fixeightjt: -fixeighta: +fixeighta: fixeightat: fixeightk: fixeightkt: @@ -538,8 +538,8 @@ 0:e1a0:3c:00:00 0:e1da:1:50:50 -nemesis: -nemesisuk: +nemesis: +nemesisuk: 0:06509a:1:76:76 0:065010:8c:00:00 0:060098:4:00:00 @@ -564,7 +564,7 @@ ;(dai toride) (by GeoMan) daitorid: -0:8042ba:28:00:40 +0:8042ba:28:00:40 0:8042e2:28:02:00 daitorida: ;******Daitoride (YMF278B version) @@ -638,7 +638,7 @@ 0:833:e0:00:f2 0:913:f0:20:00 -;** you must let the highscore display in attract mode before starting a game ** +;** you must let the highscore display in attract mode before starting a game ** shangha3u: shangha3j: 0:307be2:78:00:1d @@ -828,7 +828,7 @@ 0:c825b7:62:30:20 ikari3: -ikari3u: +ikari3u: ikari3j: ikari3k: 0:4007e:58:00:1d @@ -911,7 +911,7 @@ 0:ef03:31:00:49 ;(satan of saturn) and clones (by GeoMan) -satansat: +satansat: zarzon: satansata: satansatind: @@ -1038,7 +1038,7 @@ 0:5220:1:40:40 0:4087:1:01:01 -sranger: +sranger: srangero: srangern: srangerw: @@ -1084,7 +1084,7 @@ makaimur: makaimurc: makaimurg: -gngbl: +gngbl: gngblita: gngc: 0:1518:5a:15:72 @@ -1180,8 +1180,8 @@ ;*******Knights of the Round (world 911127 & clones)) knights: -knightsj: -knightsu: +knightsj: +knightsu: knightsb: knightsja: 0:ffe53a:257:00:00 @@ -1219,7 +1219,7 @@ brapboysu: 0:1030c5:31:00:4a -birdiy: +birdiy: 0:4c29:1e:00:00 0:c3ed:6:30:20 0:4d03:3:00:00 @@ -1253,7 +1253,7 @@ spacmiss: 0:20a8:3:00:00 -bublpong: +bublpong: 0:e64c:32:00:13 0:e64d:1:30:30 0:e5df:1:00:00 @@ -1322,7 +1322,7 @@ ddpdojblkbl: 0:803824:8c:01:06 -;dodonpachi dai-ou-jou (black label) -- new version game is the default hiscore.dat version !! +;dodonpachi dai-ou-jou (black label) -- new version game is the default hiscore.dat version !! ddpdojblk: ;**** you choose between old/new game on startup swap the ; on the version you want. **** ddpdojblka: 0:803824:8c:01:06 ;*** new version (default) - if you use other version you must delete .hi file @@ -1370,7 +1370,7 @@ 0:e002:1:0a:0a 0:f42d:6:3c:3c -pzlbreak: +pzlbreak: 0:102d9c:32:50:32 0:102e0b:3:00:00 @@ -1485,7 +1485,7 @@ 0:208c00:7f:a0:57 ;** hiscore & top score don`t update until you lose your first life, pretty ** -;** lame way for doing a hiscore - but who am i to complain!! ;0) ** +;** lame way for doing a hiscore - but who am i to complain!! ;0) ** spacebrd: 0:c0e0:3:00:00 0:d0e0:3:00:00 @@ -1732,10 +1732,10 @@ xevious: sxevious: -sxeviousj: ;******Super Xevious (Japan) -xevios: +sxeviousj: ;******Super Xevious (Japan) +xevios: xeviousa: -battles: +battles: 0:8510:4d:00:24 0:8024:3:00:00 0:8025:1:40:40 @@ -1747,9 +1747,9 @@ 0:8025:1:40:40 sci: -scia: -scij: -sciu: +scia: +scij: +sciu: 0:101500:28:02:51 0:10164e:4:02:80 @@ -1780,7 +1780,7 @@ ckongalc: ckongs: ckongg: -kkgalax: +kkgalax: ckongpt2j: ;******Crazy Kong Part II (Japan) ckong: ckongmc: @@ -1804,8 +1804,8 @@ aliensj: aliensu: aliens2: -aliens3: -aliensj2: +aliens3: +aliensj2: 0:1e30:38:00:48 asterix: @@ -1847,7 +1847,7 @@ 0:8200:1e:00:01 masterw: -masterwu: +masterwu: masterwj: ;******Master of Weapon (Japan) yukiwo: 0:2030c0:28:00:4f @@ -2042,7 +2042,7 @@ sfa: sfzjr1: sfzj: -sfau: +sfau: sfar3: sfar2: sfar1: @@ -2061,7 +2061,7 @@ sfz3j: sfz3jr1: sfz3a: -sfz3jr2: +sfz3jr2: sfa3b: sfa3ur1: sfa3ud: ;******Street Fighter Alpha 3 (USA 980904 Phoenix Edition) (bootleg) @@ -2079,14 +2079,14 @@ sf2ceua: sf2rb2: sf2ceea: -sf2ceub: -sf2cejb: -sf2rb: +sf2ceub: +sf2cejb: +sf2rb: sf2hfu: sf2hfj: sf2m2: -sf2m1: -sf2m4: +sf2m1: +sf2m4: sf2m5: sf2m6: sf2m7: @@ -2118,7 +2118,7 @@ xmvsf: xmvsfur1: -xmvsfu: +xmvsfu: xmvsfar1: xmvsfa: xmvsfb: @@ -2134,7 +2134,7 @@ xmvsfur2: 0:ff256e:63:00:05 -xmcotar1: +xmcotar1: xmcotaj2: xmcotaar1: xmcotar1d: ;******X-Men: Children of the Atom (Euro 950105 Phoenix Edition) @@ -2158,9 +2158,9 @@ 0:fff426:ad:00:02 viostorm: -viostormu: -viostorma: -viostormj: +viostrmu: +viostrma: +viostrmj: viostormub: viostormab: viostormeb: @@ -2170,9 +2170,9 @@ progear: progearj: progeara: -progearjd: ;******Progear no Arashi (Japan 010117 Phoenix Edition) (bootleg) +progearjd: ;******Progear no Arashi (Japan 010117 Phoenix Edition) (bootleg) progearud: -progearjbl: +progearjbl: 0:ff3dcf:e5:20:04 nwarr: @@ -2193,11 +2193,11 @@ mvscj: mvscjr1: mvsca: -mvscr1: -mvsch: +mvscr1: +mvsch: mvscu: mvscar1: -mvscud: ;******Marvel Vs. Capcom: Clash of Super Heroes (USA 980123 Phoenix Edition) (bootleg) +mvscud: ;******Marvel Vs. Capcom: Clash of Super Heroes (USA 980123 Phoenix Edition) (bootleg) mvscur1: mvscjsing: 0:ff26fd:66:ff:00 @@ -2243,41 +2243,41 @@ dstlk: dstlku: dstlkur1: -dstlka: -vampj: -vampja: +dstlka: +vampj: +vampja: vampjr1: dstlku1d: ;******Darkstalkers: The Night Warriors (USA 940705 Phoenix Edition) (bootleg) dstlkh: 0:fff4aa:5:00:43 -0:fff4af:37:41:00 +0:fff4af:37:41:00 0:ffe976:4:00:00 ddsom: -ddsoma: -ddsomar1: -ddsomr1: -ddsomjr1: -ddsomj: -ddsomur1: +ddsoma: +ddsomar1: +ddsomr1: +ddsomjr1: +ddsomj: +ddsomur1: ddsomu: ddsomb: ddsomr3: ddsomr2: ddsomud: ;******Dungeons & Dragons: Shadow over Mystara (USA 960619 Phoenix Edition) (bootleg) -ddsomh: +ddsomh: 0:ff0fd0:8b:12:09 ddtod: ddtodu: -ddtodhr1: -ddtodjr1: -ddtodj: -ddtodur1: +ddtodhr1: +ddtodjr1: +ddtodj: +ddtodur1: ddtodjr2: ddtodd: ;******Dungeons & Dragons: Tower of Doom (Euro 940412 Phoenix Edition) (bootleg) ddtoda: -ddtodar1: +ddtodar1: ddtodr1: ddtodhr2: ddtodh: @@ -2349,8 +2349,8 @@ 0:ec0a:23:00:55 boogwing: -boogwinga: -ragtime: +boogwinga: +ragtime: ragtimea: boogwingu: 0:200f4a:27:00:0b @@ -2362,18 +2362,19 @@ marble5: 0:401e92:32:00:3a -imagoa: -imago: -0:c521:4a:00:00 -0:c565:1:01:01 +;** Commented out because eventually it saves bad values and locks out the high score screen ** +;**imagoa: +;**imago: +;**0:c521:4a:00:00 +;**0:c565:1:01:01 -ddragon: +ddragon: ddragonb: ddragonu: -ddragonw: -ddragonw1: +ddragonw: +ddragonw1: ddragonua: -ddragonba: +ddragonba: ddragonb2: ;******Double Dragon (bootleg) ddragonub: 0:0e73:1e:02:2c @@ -2406,15 +2407,15 @@ 0:474:5dd:00:55 0:d2:1:03:03 -abattle: +abattle: abattle2: astrof: acombat3: astrof2: astrof3: -afire: +afire: acombat: -acombato: +acombato: sstarbtl: ;******Super Star Battle 0:0084:2:00:00 0:4268:5:c1:c1 @@ -2457,11 +2458,11 @@ 0:202100:190:01:61 captcomm: -captcommu: -captcommj: +captcomu: +captcomj: captcommb: ;******Captain Commando (bootleg) captcommr1: -captcommjr1: +captcommjr1: 0:ff0000:190:08:00 0:ff018d:1:01:01 0:ffa8c2:04:00:00 @@ -2493,7 +2494,7 @@ wrally: ;******world rally (set1) wrallya: ;******world rally (set 2) -wrallyb: l******world rally (us, 930217) +wrallyb: ;******world rally (us, 930217) wrallyat: 0:fef558:288:5a:ff @@ -2503,9 +2504,9 @@ 0:80006:4:00:00 demonwld: -demonwld1: -demonwld4: -demonwld3: +demonwld1: +demonwld4: +demonwld3: demonwld2: 0:c001c2:c8:00:2d 0:c001be:4:00:00 @@ -2577,10 +2578,10 @@ 0:609:1:01:01 rfjet: ;******raiden fighters jet (all versions fixed) -rfjeta: -rfjetu: -rfjets: -rfjetj: +rfjeta: +rfjetu: +rfjets: +rfjetj: rfjet2kc: rfjetsa: rfjett: @@ -2656,7 +2657,7 @@ 0:e886:01:00:00 toride2g: ;******toride ii adouchi gaiden -toride2gk: +toride2gk: 0:40c5f4:4:00:00 0:40c5f6:1:50:50 0:40c60a:4c:00:40 @@ -2707,15 +2708,15 @@ tantr: tantrbl: tantrbl2: -tantrkor: +tantrkor: tantrbl3: ;******Puzzle & Action: Tant-R (Japan) (bootleg set 3) 0:fffc45:28:48:00 ;** this only saves the hiscore table, the top score will stay at default ** -sqix: -sqixr1: -sqixu: -sqixb1: +sqix: +sqixr1: +sqixu: +sqixb1: sqixb2: 0:f4c0:28:00:03 @@ -2728,7 +2729,7 @@ 0:614e:ea:f4:01 0:619b:1:01:01 -loht: +loht: lohtj: lohtb2: 0:a3af4:32:36:20 @@ -2764,7 +2765,7 @@ shinobi2: shinobi3: shinobi4: -shinobi5: +shinobi5: shinobld: shinobls: ;******Shinobi (Star bootleg, System 16A) shinoblda: @@ -2833,12 +2834,12 @@ eagle: eagle2: eagle3: -mooncrs3: -spcdrag: -spcdraga: +mooncrs3: +spcdrag: +spcdraga: mooncmw: ;******Moon War (Moon Cresta bootleg) mooncrstu: -stera: +stera: mooncrstuk: sstarcrs: mooncrstuku: @@ -2876,8 +2877,8 @@ spacbat2: redufob: galaxiana: -galaxianmo: -galaxbsf: +galaxianmo: +galaxbsf: galaxiant: skyraidr: spacempr: @@ -2934,7 +2935,7 @@ strahla: ;******koutetsu yousai strahl (japan set 2) 0:f30d1:d9:55:2e 0:f3239:27:00:88 -0:f0d5b:3:00:50 +0:f0d5b:3:00:50 ;*******jump coaster jumpcoas: @@ -2961,7 +2962,7 @@ 0:fc01:9e:00:07 0:e154:3:00:00 -airattck: +airattck: airattcka: ;******Air Attack (set 2) 0:b9100:80:0:6b @@ -3083,9 +3084,9 @@ 0:fff2a2:3c:00:01 0:fff2e2:1:ff:ff -brdrline: -starrkr: -brdrlinb: +brdrline: +starrkr: +brdrlinb: brdrlins: ;******Borderline (Sidam bootleg) 0:938d:2:00:00 @@ -3117,7 +3118,7 @@ 0:c017:3:00:05 turtship: -turtshipk: +turtshipk: turtshipj: ;******turtle ship (japan) turtshipkn: turtshipko: @@ -3156,15 +3157,15 @@ 0:c910:0b:99:00 ddenlovr: ;******don den lover vol.1 (hong Kong) -0:ff853a:74:82:3c +0:ff853a:74:82:3c tryout: ;******pro baseball skill tryout (japan) 0:319:29:90:00 0:33d:1:01:01 0:13:3:07:90 -nslasher: -nslasherj: +nslasher: +nslasherj: nslasheru: nslashers: ;******Night Slashers (Over Sea Rev 1.2) 0:100044:50:13:00 @@ -3194,7 +3195,7 @@ amidar: ;[Special thanks to Cananas for enhancing this entry] amidarb: amidaro: -amidaru: +amidaru: amigo: amidar1: 0:8200:1e:00:01 @@ -3205,7 +3206,7 @@ 0:40a8:03:00:01 realbrk: -realbrkj: +realbrkj: realbrkk: ;******Billiard Academy Real Break (Korea) realbrko: 0:ff84da:44:52:f8 @@ -3214,7 +3215,7 @@ 0:1c1b02:4c:27:20 cawing: -cawingj: +cawingj: cawingu: cawingr1: ;******Carrier Air Wing (World 901009) cawingbl: @@ -3288,19 +3289,19 @@ mspacmnf: mschamps: newpuc2: -newpuc2b: -joyman: +newpuc2b: +joyman: mspacpls: pacgal: newpuckx: alibaba: -mspacmat: +mspacmat: puckmod: puckmana: -ctrpllrp: -puckmanh: +ctrpllrp: +puckmanh: piranhao: -abscam: ;******Abscam +abscam: ;******Abscam mspacmbe: ;******Ms. Pac-Man (bootleg, (encrypted)) popeyeman: bucaner: @@ -3352,7 +3353,7 @@ 0:8220:1:40:40 0:8dce:1:03:03 -;** wardner,wardner (japan),pyros all fixed * +;** wardner,wardner (japan),pyros all fixed * wardner: wardnerj: pyros: @@ -3485,7 +3486,7 @@ outzone: outzonea: -outzoneb: +outzoneb: outzonec: ;******outzone (set 4) outzoned: outzoneh: @@ -3559,7 +3560,7 @@ burnforc: burnforco: ;******Burning Force (Japan old version) 0:100171:bb:00:48 -0:100175:1:08:08 +0:100175:1:08:08 darkmist: ;******The Lost Castle In Darkmist 0:e01d:8c:00:20 @@ -3670,7 +3671,7 @@ 0:30048c:7c:41:00 alien3: -alien3u: ;*******alien 3: the gun (us) +alien3u: ;*******alien 3: the gun (us) 0:20f2bc:78:80:00 shuttlei: ;******shuttle invader @@ -3681,7 +3682,7 @@ 0:108909:4e:01:52 hvysmsh: ;[Special thanks to Cananas for enhancing this entry] -hvysmshj: +hvysmshj: hvysmsha: 0:100400:50:01:00 0:10000c:04:00:00 @@ -3730,12 +3731,12 @@ 0:20a900:200:00:40 arabfgt: -arabfgtj: +arabfgtj: arabfgtu: ;******Arabian Fight (us) 0:208300:49:53:00 0:208345:1:17:17 -powerbal: +powerbal: powerbals: ;******power balls (super slam conversion) 0:f8276:7c:56:00 0:f82f0:1:20:20 @@ -3765,7 +3766,7 @@ splatter2: 1:1430:3f:00:2e -vbowlj: ;******Virtua Bowling (Japan, V100JCM) +vbowlj: ;******Virtua Bowling (Japan, V100JCM) vbowl: 0:101c32:44:00:2e @@ -3773,7 +3774,7 @@ stkclmnsj: ;******Stack Columns (japan) 0:fffc24:38:4b:88 -redclash: +redclash: redclasha: 0:6023:4:00:00 0:6320:6:23:1d @@ -3792,7 +3793,7 @@ 0:4280:3:00:00 0:5242:1:10:10 0:5222:1:10:10 -0:5202:1:10:10 +0:5202:1:10:10 0:51e2:1:10:10 0:51c2:1:00:00 0:51a2:1:00:00 @@ -3820,18 +3821,18 @@ 0:e03c:78:10:46 rohga: -rohgah: -rohgau: +rohgah: +rohgau: rohga1: ;******rohga armour force (asia/europe v3.0 set 1) rohga2: ;******rohga armour force (asia/europe v3.0 set 2) wolffang: -0:3f0200:50:00:09 +0:3f0200:50:00:09 ;** these are untested as the dont work in this version of mame (mame v0.96u1) ** -mtlchampj: -mtlchamp: -mtlchampa: -mtlchampu: +mtlchampj: +mtlchamp: +mtlchampa: +mtlchampu: mtlchamp1: ;******martial champion (ver eaa) mtlchampu1: 0:100300:61:00:44 @@ -3842,7 +3843,7 @@ 0:203240:35:00:5a raimais: -raimaisj: +raimaisj: raimaisjo: 0:a237:30:50:4b @@ -4015,7 +4016,7 @@ searchar: searcharu: searcharj: ;******;sar - search and rescue (japan) -0:437b6:50:00:1f +0:437b6:50:00:1f 0:40118:3:00:01 jajamaru: ;******vs. ninja jajamaru kun (japan) @@ -4143,8 +4144,8 @@ 0:400920:a:54:00 cannonb: -cannonb2: -cannonb3: +cannonb2: +cannonb3: 0:6180:d4:00:01 0:665c:3:00:01 @@ -4170,10 +4171,10 @@ 0:43400:4a0:01:20 0:43b90:10:99:99 -kaitei: ;******kaitei takara sagashi (k`k-tokki) +kaitei: ;******kaitei takara sagashi (k`k-tokki) 0:200e:5:00:00 -kaitein: ;******kaitei takara sagashi +kaitein: ;******kaitei takara sagashi 0:403e:2:00:00 0:21c0:1:00:00 0:21e0:1:00:00 @@ -4274,7 +4275,7 @@ rdft: rdftau: -rdftj: +rdftj: rdftadi: ;******Raiden Fighters (Dream Island Co. license) rdftu: ;******Raiden Fighters (US) rdfta: @@ -4328,7 +4329,7 @@ welltris: ;******welltris (world?,2 players) welltrisj: ;******welltris (japan,2 players) -0:ffb61c:50:0c:00 +0:ffb61c:50:0c:00 mshuttle: mshuttlej: @@ -4376,7 +4377,7 @@ 0:80c64:1:20:20 gaiapols: -gaiapolsj: +gaiapolsj: gaiapolsu: 0:60f801:99:00:00 0:60f896:1:29:29 @@ -4394,9 +4395,9 @@ 0:c017:3:00:02 rdft22kc: -rdft2a: +rdft2a: rdft2: ;******Raiden Fighters 2 -rdft2j: +rdft2j: rdft2a2: rdft2us: ;******raiden fighters 2.1 (us, single board) rdft2j2: @@ -4437,9 +4438,9 @@ sxyreac2: 0:7550:a3:4c:4c -survarts: +survarts: survartsu: ;******survival arts (usa) -0:11a5:26:00:45 +0:11a5:26:00:45 0:11cb:2:45:00 invaders: @@ -4457,8 +4458,8 @@ spceking: spcewars: spacewr3: -invader4: -invadrmr: +invader4: +invadrmr: invasion: searthin: searthina: @@ -4496,7 +4497,7 @@ ;******Cosmic Monsters 2 cosmicm2: -cosmicmo: ;******cosmic monsters (*) +cosmicmo: ;******cosmic monsters (*) 0:20f4:03:00:00 darthvdr: @@ -4536,11 +4537,11 @@ wbbc97: 0:5023f1:6d:00:02 -opwolf: +opwolf: opwolfb: opwolfu: opwolfa: -opwolfj: +opwolfj: 0:100a42:75:00:54 0:100e28:3b:00:01 @@ -4549,7 +4550,7 @@ 0:100e68:37:08:01 gsword: ;******Great Swordsman (Japan?) -gsword2: ;******Great Swordsman (world?) +gsword2: ;******Great Swordsman (world?) 0:9c00:1e:00:00 0:9c78:3c:34:00 @@ -4565,7 +4566,7 @@ 0:101bd3:31:05:2b avalnche: -cascade: ;******Cascade +cascade: ;******Cascade 0:009b:2:00:00 ;******Aero Fighters (bootleg) @@ -4603,18 +4604,18 @@ rainbow: rainbowo: ;******rainbow islands (old version) rbisland: -0:10d0cc:32:00:32 -0:10e1f2:04:00:00 +0:10d0cc:32:00:32 +0:10e1f2:04:00:00 jumping: jumpinga: jumpingi: -0:10d0cc:32:00:41 -0:10e1f2:04:00:00 +0:10d0cc:32:00:41 +0:10e1f2:04:00:00 rainbowe: rbislande: -0:10d0d2:32:00:33 +0:10d0d2:32:00:33 0:10e1b6:04:00:00 ;*********************************************************************** @@ -4710,7 +4711,7 @@ 0:800b0:1c:00:11 bigstrik: -bestleag: +bestleag: bestleaw: bigstrkb: 0:ff890b:49:08:78 @@ -4742,9 +4743,9 @@ ;*** this saves just the today`s best scores, the all time greatest are *** ;*** saved using nvram *** defender: -startrkd: -defenderg: -defenderw: +startrkd: +defenderg: +defenderw: defenderb: ;******defender (blue label) defence: defcmnd: @@ -4835,7 +4836,7 @@ 0:d83b:82:00:20 0:e77b:3:00:00 -;********sprcros2.c +;********sprcros2.c sprcros2: sprcros2a: ;******Super Cross 2 (Japan set 2) 0:fa00:78:00:4a @@ -4902,7 +4903,7 @@ 0:201c66:63:03:20 0:2018ba:2:03:e8 -;********pushman.c +;********pushman.c pushman: pushmans: pushmana: ;******Pushman (Korea, set 2) @@ -4917,7 +4918,7 @@ 0:90400:50:41:50 0:90120:4:00:60 -;******Bronx +;******Bronx bronx: 0:e1da:28:0:41 @@ -5003,7 +5004,7 @@ pbobble: 0:907010:36:00:00 -;******turbo out run (set 2, upright, 317-unknown)(both fixed) +;******turbo out run (set 2, upright, 317-unknown)(both fixed) toutruna: toutrunu: ;****** turbo out run (set 3,upgrade kit, 317-0118) toutrun1: @@ -5056,7 +5057,7 @@ shippumd: kingdmgp: 0:1002d0:9e:00:4e -0:1003c4:53:2a:39 +0:1003c4:53:2a:39 ;********cps2.c (Quiz Nanairo Dreams: Nijiirochou no Kiseki (Japan 960826)) qndream: @@ -5217,7 +5218,7 @@ aurailjd: 0:ffff7e:27:00:52 -;******body slam (8751 317-unknown) +;******body slam (8751 317-unknown) bodyslam: dumpmtmt: ;******dump matsumoto (japan 8751 317-unknown) 0:fffcc0:3c:00:00 @@ -5225,10 +5226,10 @@ ;Golden Axe (by GeoMan) goldnaxe: -goldnaxa: -goldnaxej: +goldnaxa: +goldnaxej: goldnaxeu: -goldnaxeb2: +goldnaxeb2: goldnaxeb1: goldnaxe1: goldnaxe2: @@ -5289,7 +5290,7 @@ vanguard: vanguardc: vanguardj: ;******Vanguard (Japan) -0:220:70:11:30 +0:220:70:11:30 0:25:3:00:00 ;********tigeroad.c @@ -5315,8 +5316,8 @@ ;*******mermaid.c (mermaid) mermaid: -yachtmn: ;******Yachtsman -0:c008:6:00:00 +yachtmn: ;******Yachtsman +0:c008:6:00:00 ;********asteroid.c asteroid: @@ -5331,7 +5332,7 @@ 0:001c:35:00:00 0:2a6:1:01:01 -meteorts: ;******Meteorites +meteorts: ;******Meteorites meteorho: 0:001c:35:00:00 @@ -5455,8 +5456,8 @@ farmer: ;*****Farmers Rebellion 0:c010:1e:22:00 0:d61b:1:2a:2a -0:d65b:1:04:04 -0:d69b:1:00:00 +0:d65b:1:04:04 +0:d69b:1:00:00 0:d6db:1:00:00 0:d71b:1:00:00 0:d75b:1:00:00 @@ -5491,7 +5492,7 @@ 0:1026c4:1:4d:4d ;******Street Fighter II' - Hyper Fighting (World 921209) -sf2hf: +sf2hf: 0:ffd276:28:00:20 0:ffd2c6:14:ff:96 0:ffd2ee:04:00:00 @@ -5546,11 +5547,11 @@ ;* latest unofficial highscore_v0.85 additions below - by leezer/firebrand/geoman/others * ;****************************************************************************************** -;*******gold medalist & Gold Medalist (alt) +;*******gold medalist & Gold Medalist (alt) goldmedl: goldmedla: 0:40a20:a0:00:00 -0:40b22:46:1b:00 +0:40b22:46:1b:00 0:40b20:2:00:01 ;*******fax & fax (alt questions) @@ -5744,7 +5745,7 @@ piratetr: 0:2dc:4f:55:44 -;(leprechaun) and clones (by GeoMan) +;(leprechaun) and clones (by GeoMan) ;** let game display hiscore table a few times in attract mode before ** ;** starting a game ** leprechn: @@ -5859,7 +5860,7 @@ 0:8aba:6:00:00 ;(violence fight (world)) (by GeoMan) -viofight: +viofight: viofightu: viofightj: 0:a02800:28:02:20 @@ -5958,7 +5959,7 @@ ;********toaplan2.c battleg: -battlegb: +battlegb: 0:10ca4c:ed:00:2a 0:101241:1:45:45 @@ -6280,11 +6281,11 @@ 0:1ac8e:28:40:04 0:e23c:3:40:0f -;**btime by Ziller +;**btime by Ziller vecbtime: 0:0033:27:00:FF -;*******centiped.c by Ziller +;*******centiped.c by Ziller centidux: pacipede: vectiped: @@ -6293,7 +6294,7 @@ 0:000b:0f:10:01 0:0023:0f:04:12 -;********dkong.c by Ziller +;********dkong.c by Ziller kong2600: 0:6100:AA:94:76 0:60B8:03:50:00 @@ -6305,22 +6306,22 @@ 0:75a1:01:00:00 -;********galaga.c by Ziller +;********galaga.c by Ziller galaga99: vgalaga: 0:8a20:2d:00:18 0:83ed:6:00:24 -;**galaxian: by Ziller +;**galaxian: by Ziller buglaxn: 0:40a8:3:00:00 -;********milliped.c by Ziller +;********milliped.c by Ziller silliped: 0:64:30:75:17 0:24:1:a0:a0 -;********mrdo.c by Ziller +;********mrdo.c by Ziller mrdigdo: 0:e017:64:01:00 @@ -6375,11 +6376,11 @@ ;******locked and loaded(By Firebrand) lockload: -0:102703:f6:20:1e +0:102703:f6:20:1e ;******great guns(By Firebrand) greatgun: -0:e00b:53:55:50 +0:e00b:53:55:50 ;******genix(By Firebrand) genix: @@ -6450,7 +6451,7 @@ ;********(field day and clone) fieldday: -undoukai: +undoukai: 0:c00d:536:48:11 0:a190:1:03:03 @@ -6486,43 +6487,43 @@ zaviga: zavigaj: 0:0da0:50:00:20 -0:1026:5:14:10 +0:1026:5:14:10 ;*******tricky doc(By Firebrand) trckydoc: -0:e05a:5a:2d:46 +0:e05a:5a:2d:46 sdtennis: ;[Special thanks to Cananas for enhancing this entry] 0:0200:3c:01:15 0:0250:3c:3b:43 -0:002c:03:88:01 +0:002c:03:88:01 ;*******rapid hero(Japan?)(By Firebrand) ;wait to see top scores before you start a game raphero: -0:1fe600:60:00:01 +0:1fe600:60:00:01 ;*******progress(By Firebrand)(Hiscore does not seem to change during game) progress: -0:8711:e:00:01 +0:8711:e:00:01 ;*******prebillian(By Firebrand)(Hiscore display will not change. It is always 50,000. Please check) pbillian: 0:f26b:23:00:45 -0:f222:3:00:00 +0:f222:3:00:00 ;*******metal soldier issac II(By Firebrand) msisaac: -0:e4a5:50:02:4d +0:e4a5:50:02:4d ;*******kung-fu taikun(By Firebrand) kungfut: kungfuta: -0:c1d3:2c:00:1f +0:c1d3:2c:00:1f ;*******kick start wheelie king(By Firebrand) kikstart: -0:816f:3:00:00 +0:816f:3:00:00 ;*******horizon(By Firebrand) horizon: @@ -6630,7 +6631,7 @@ ;*******champion pro wrestling(By Firebrand) chwrestl: 0:c009:3:00:00 -0:c00c:3:00:00 +0:c00c:3:00:00 ;*******vasara vasara: @@ -6831,7 +6832,7 @@ 0:e611:1:00:00 0:e60b:2:00:00 -sboblbob: +sboblbob: sboblboa: ;******Super Bobble Bobble (set 1) sboblbobla: sboblboblb: @@ -7045,7 +7046,7 @@ 0:fee16000:44d:47:00 0:fee16448:1:01:01 -;********macross II(By Firebrand)(redited to include each stage's hiscore +;********macross II(By Firebrand)(redited to include each stage's hiscore ;and all ranks) macross2: macross2g: @@ -7081,20 +7082,20 @@ 0:3f803c:1e:19:10 ;*******mayhem 2002(By Firebrand) -; - Only works if you delete the nvram after you turn off the game. Making +; - Only works if you delete the nvram after you turn off the game. Making ;the nvram read-only will not work. mayhem: 0:e081:ba:10:45 ;*******super triv II(By Firebrand) -; - Only saves "Experts Only" scores, can save other slots but the games are +; - Only saves "Experts Only" scores, can save other slots but the games are ;different every time -;, - unless you choose the same three over and over again so only "Experts +;, - unless you choose the same three over and over again so only "Experts ;Only" game stays the same. supertr2: 0:4891:20:00:00 -;*******golly! ghost!(By Firebrand)(unable to test properly due to lack of +;*******golly! ghost!(By Firebrand)(unable to test properly due to lack of ;sight movement on screen) gollygho: 0:10312E:143:02:00 @@ -7149,7 +7150,7 @@ ;*******(mega twins [updated]) mtwins: -chikij: +chikij: 0:ff12c8:190:00:00 0:ff9168:28:02:5b 0:ffe006:04:00:00 @@ -7219,7 +7220,7 @@ willow: willowj: -willowu: +willowu: 0:ffefc6:50:00:20 0:fff03e:04:00:00 @@ -7292,7 +7293,7 @@ bang: 0:fe5a4c:ee:41:01 -;*******(alligator hunt (unprotected)) +;*******(alligator hunt (unprotected)) aligatorun: 0:fe51da:2:42:68 0:feaf02:98:42:2e @@ -7511,7 +7512,7 @@ armwaru1: pgearr1: pgear: -0:ff27d6:256:00:04 +0:ff27d6:256:00:04 ;(cassette: tornado) (by GeoMan) ctornado: @@ -7857,7 +7858,7 @@ 0:1f002c:26:00:00 0:1f0022:4:00:00 -;(sheriff) and clones (by GeoMan) +;(sheriff) and clones (by GeoMan) sheriff: bandido: westgun2: @@ -7892,7 +7893,7 @@ 0:e700:a:0:0 0:f700:a:0:0 -;(space laser) and clones (by GeoMan) +;(space laser) and clones (by GeoMan) spclaser: laser: 0:2034:2:0:0 @@ -8137,7 +8138,7 @@ 0:f1a4:3:00:00 0:f16e:1:13:13 -;*******epos.c (igmo) +;*******epos.c (igmo) ;** only saves top score ** igmo: 0:784a:3c:10:00 @@ -8192,7 +8193,7 @@ ;(dream soccer '94) and clones (by GeoMan) dsoccr94: 0:eb57b:80:10:04 -dsoccr94j: +dsccr94j: 0:ead6d:80:10:04 dsoccr94k: 0:eb7a1:80:10:04 @@ -8300,11 +8301,11 @@ ecofghtru: 0:ff033b:a0:0a:00 0:ff8106:4:00:00 - + ;********psikyo.c (battle k-road (japan)) btlkrodj: btlkroad: -btlkroadk: +btlkroadk: 0:fe1af4:4e:00:04 ;********missb.c (miss bubble 2) @@ -8316,15 +8317,15 @@ ;********renegade.c (nekketsu kouha kunio-kun (japan bootleg)) kuniokunb: kuniokun: -0:2e:3:00:05 -0:102c:28:47:00 +0:2e:3:00:05 +0:102c:28:47:00 -;********rockrage.c (rock `n rage (world?) +;********rockrage.c (rock `n rage (world?) rockrage: rockragej: 0:4980:4e:01:53 0:48be:3:01:80 -0:4fc8:1:54:54 +0:4fc8:1:54:54 ;******Rock 'n Rage (Prototype?) rockragea: @@ -8335,7 +8336,7 @@ ;********galaxian.c (zero time) zerotime: 0:40a8:3:00:00 - + ;(scrambled egg) and clones (by GeoMan) scregg: eggs: @@ -8347,17 +8348,17 @@ 0:4207:f:00:00 0:42ad:f:10:10 -;(sauro) (by GeoMan) +;(sauro) (by GeoMan) sauro: saurop: 0:e000:b4:00:4f - + ;(sasuke vs. commander) (by GeoMan) sasuke: 0:24:2:00:05 ;(samurai (sega)) (by GeoMan) -samurai: +samurai: 0:971a:12:00:00 ;(safari rally) (by GeoMan) - hiscore updates after new game start !!! @@ -8365,24 +8366,24 @@ safarirj: 0:2389:3:00:00 0:2381:3:00:00 -0:2141:1:20:20 +0:2141:1:20:20 0:2161:1:20:20 -0:2181:1:20:20 +0:2181:1:20:20 0:21a1:1:20:20 0:21c1:1:20:20 0:21e1:1:20:20 - + ;(sadari) (by GeoMan) -sadari: +sadari: 0:c31d:3c:3a:01 ;(riding fight (world)) and clones (by GeoMan) -ridingf: -ridingfu: -ridingfj: +ridingf: +ridingfu: +ridingfj: 0:408060:80:00:3f - -;(reikai doushi (japan)) + +;(reikai doushi (japan)) reikaids: 0:43ca:1e:00:e8 0:40df:2:13:88 @@ -8390,10 +8391,10 @@ ;(red alert) (by GeoMan) redalert: 0:301:f:0:0 - + ;(raiders5) and clones (by GeoMan) raiders5: -raiders5t: +raiders5t: 0:e075:37:00:55 0:888c:7:22:10 @@ -8405,28 +8406,28 @@ ;(puzzle de bowling (japan)) (by GeoMan) pzlbowl: 0:20a9c4:60:0a:a8 - + ;(punk shot (us 4 players)) and clones (by GeoMan) -punkshot: +punkshot: punkshotj: punkshot2: 0:80700:30:00:40 ;(power surge) (by GeoMan) - Hiscores appear correctly after game enters attract mode! -psurge: -0:a86c:6:20:30 +psurge: +0:a86c:6:20:30 0:b080:50:31:ff -;(pop flamer (protected)) and clones (by GeoMan)- hiscore updates after new game start !!! +;(pop flamer (protected)) and clones (by GeoMan)- hiscore updates after new game start !!! popflame: popflamea: popflameb: -popflamen: +popflamen: 0:4004:3:0:0 0:4021:3:0:0 0:872f:1:20:20 0:8733:1:20:20 -0:8737:1:20:20 +0:8737:1:20:20 0:873b:1:20:20 0:873f:1:20:20 0:8743:1:20:20 @@ -8435,8 +8436,8 @@ pcktgal: pcktgalb: pcktgal2: -spool3: -spool3i: +spool3: +spool3i: pcktgal2j: 0:0467:2:64:00 @@ -8444,21 +8445,21 @@ pballoonr: 0:0220:70:11:30 0:0022:3:00:00 - + ;(pettan pyuu (japan)) (by GeoMan) -pettanp: +pettanp: 0:c0c2:1e:20:00 ;********slapfght.c - ADDED CLONE -perfrman: +perfrman: perfrmanu: 0:8006:30:89:12 0:8609:07:24:00 ;(percussor, the) (by GeoMan) -percuss: +percuss: 0:5da8:37:00:24 - + ;******************************************************************************** ;* latest unofficial highscore_v7.93 additions below - by leezer/geoman/others * ;******************************************************************************** @@ -8468,23 +8469,23 @@ peekaboou: 0:1f0278:60:00:fa 0:1f0380:4:00:00 - + ;(pass) (by GeoMan) pass: 0:81200:50:4b:00 0:8005e:4:00:00 - + ;(paddle mania) (by GeoMan) paddlema: 0:801a8:28:02:03 0:82108:a0:00:20 ;(onna sansirou - typhoon gal (set 1)) and clones (by GeoMan) -onna34ro: +onna34ro: onna34roa: -0:e1d7:82:00:65 +0:e1d7:82:00:65 0:e188:3:00:01 - + ;(noboranka (japan)) (by GeoMan) nob: nobb: @@ -8495,11 +8496,11 @@ ninjakun: 0:e0a3:37:00:20 0:c08c:7:22:10 - -;(ninja kid ii (set 1)) and clones (by GeoMan) + +;(ninja kid ii (set 1)) and clones (by GeoMan) ninjakd2: -ninjakd2a: -ninjakd2b: +ninjakd2a: +ninjakd2b: rdaction: ninjakd2c: 0:e0f4:3:00:00 @@ -8512,14 +8513,14 @@ 0:fffc1f:90:55:00 ;(new sinbad 7) (by GeoMan) -newsin7: +newsin7: newsin7a: 0:43d3:48:00:10 0:413d:3:0:0 ;(navalone) (by GeoMan) navalone: -navarone: +navarone: 0:402d:3:0:0 ;(nato defense) and clones (by GeoMan) @@ -8533,53 +8534,53 @@ rastsag2: 0:601eef:3a:00:42 0:600545:3:00:77 - + ;(hexion (japan)) (by GeoMan) -hexion: +hexion: hexionb: 0:a740:3:00:10 0:a743:27d:00:00 ;*******gotya.c (got-ya (12/241981,prototype ?)) - ADDED CLONE gotya: -thehand: +thehand: 0:5021:3:00:01 ;******cvs.c (radar zone - ADDED CLONE) outline: radarzon: -radarzon1: -radarzont: +radarzon1: +radarzont: 0:1c08:35:00:00 ;(invinco) (by GeoMan) invinco: 0:8398:16:00:00 - + ;(invinco / head on 2) (by GeoMan) invho2: -0:83b6:16:00:00 +0:83b6:16:00:00 0:8392:12:30:30 ;(kaos) (by GeoMan) -kaos: +kaos: 0:03c8:30:84:44 ;(ken-go) (by GeoMan) -kengo: +kengo: kengoa: ltswords: 0:e09f2:82:10:20 - + ;(kodure ookami (japan)) (by GeoMan) -kodure: -0:637c0:4:00:00 +kodure: +0:637c0:4:00:00 0:635b4:28:00:00 ;(knuckle bash) (by GeoMan) kbash: kbashk: -0:100080:3c:00:30 +0:100080:3c:00:30 ;(knuckle joe (set 1)) and clones (by GeoMan) kncljoe: @@ -8593,76 +8594,76 @@ kurikintj: kurikinta: 0:8aa3:a0:00:2e - + ;(legend of makai (world)) and clones (by GeoMan) lomakai: -makaiden: -0:ff000:2:00:03 -0:ff002:7e:00:00 +makaiden: +0:ff000:2:00:03 +0:ff002:7e:00:00 0:fe060:4:00:00 - + ;(kyros) (by GeoMan) -kyros: +kyros: kyrosj: -0:20e00:ae:01:02 +0:20e00:ae:01:02 0:20020:4:00:00 ;(lizard wizard) (by GeoMan) -lizwiz: +lizwiz: 0:4daf:3c:4d:01 0:43ed:6:00:40 -;(lost tomb (easy)) and clones (by GeoMan) -losttomb: -losttombh: +;(lost tomb (easy)) and clones (by GeoMan) +losttomb: +losttombh: 0:8110:50:03:00 ;(mach rider) (by GeoMan) machridr: 0:0714:50:00:4b - + ;(mad crasher) (by GeoMan) madcrash: 0:c2b3:4b:00:4b ;(magical spot ii) (by GeoMan) magspot2: -0:6007:2:00:20 +0:6007:2:00:20 0:6009:1:00:00 ;(megatack) (by GeoMan) megatack: 0:00c4:f:00:1a -;(minefield) (by GeoMan) +;(minefield) (by GeoMan) minefld: 0:80f3:3c:01:43 minefldfe: 0:ef3:3c:03:50 - -;(bucky o'hare (world version ea) and clones (by GeoMan) + +;(bucky o'hare (world version ea) and clones (by GeoMan) bucky: buckyuab: buckyaab: buckyea: 0:801e0:50:00:04 - + ;(mister viking) and clones (by GeoMan) mrviking: -mrvikngj: +mrvikngj: 0:d42c:15:59:47 -0:d300:15:00:01 +0:d300:15:00:01 0:c086:3:00:02 - + ;(money money) (by GeoMan) monymony: 0:7512:48:0a:00 0:726d:3:00:00 - + ;(mystic raiders (world)) and clones (by GeoMan) mysticri: gunhohki: -0:e8af8:38:00:4d +0:e8af8:38:00:4d 0:e8b30:94:2e:00 ;(mysterious stones) (by GeoMan) @@ -8670,54 +8671,54 @@ myststono: myststonoi: 0:0308:37:00:0c -0:001a:5:00:00 +0:001a:5:00:00 0:1033:8:40:41 - + ;(cyberbots: fullmetal madness (japan 950420)) (by GeoMan) -cybots: +cybots: cybotsj: cybotsu: cybotsjd: cybotsud: 0:ffe6a0:5:00:43 0:ffe6a5:4b:41:00 - -;(space trek (upright)) and clones (by GeoMan) + +;(space trek (upright)) and clones (by GeoMan) spacetrk: spacetrkc: 0:838c:4:0:0 -spacezap: -0:d00f:1:ff:ff -0:d041:6:0:0 +spacezap: +0:d00f:1:ff:ff +0:d041:6:0:0 0:d01d:6:0:0 ;(american speedway (set 1)) and clones (by GeoMan)- * UNDER TEST * -amspdwy: +amspdwy: amspdwya: -0:e402:190:50:00 -0:e602:190:50:00 +0:e402:190:50:00 +0:e602:190:50:00 0:e3de:23:00:5c - -;(speed ball) (by GeoMan) -speedbal: + +;(speed ball) (by GeoMan) +speedbal: 0:f800:46:20:50 ;(speed freak) (by GeoMan) speedfrk: 0:128:2:0:0 - -;(spinal breakers (world)) and clones (by GeoMan) -spinlbrk: -spinlbrku: -0:ffac76:8c:00:50 + +;(spinal breakers (world)) and clones (by GeoMan) +spinlbrk: +spinlbrku: +0:ffac76:8c:00:50 spinlbrkj: 0:ffacce:8c:00:50 - + ;(sports match) (by GeoMan) -sprtmtch: -0:7500:30:4a:00 +sprtmtch: +0:7500:30:4a:00 0:7743:2:00:00 ;(s.r.d. mission) (by GeoMan) @@ -8727,7 +8728,7 @@ ;(star jacker (sega)) and clones (by GeoMan) starjack: -0:c0e1:1e:00:52 +0:c0e1:1e:00:52 0:c0db:3:00:03 starjacks: @@ -8736,31 +8737,31 @@ ;(strength & skill) and clones (by GeoMan) strnskil: -guiness: +guiness: 0:c0c4:1e:22:00 0:c430:60:09:00 - + ;(super bond) (by GeoMan) superbon: 0:810f:50:00:48 ;(super invader attack) (by GeoMan) -sia2650: -tinv2650: +sia2650: +tinv2650: 0:1d07:2:0:0 -0:19fa:1:30:30 +0:19fa:1:30:30 0:1a1a:1:30:30 0:1a3a:1:30:30 0:1a5a:1:30:30 - -;(superbike) (by GeoMan) -superbik: + +;(superbike) (by GeoMan) +superbik: 0:1c08:1e:00:30 ;(syvalion (japan)) (by GeoMan) syvalion: -0:1090ec:10:00:01 -0:1090fc:54:49:00 +0:1090ec:10:00:01 +0:1090fc:54:49:00 0:104266:4:00:00 ;(tailgunner) (by GeoMan) @@ -8768,22 +8769,22 @@ 0:d8:4:0:0 ;(tecmo knight) and clones (by GeoMan)- hiscores update after hiscore table is displayed in attract mode -tknight: -wildfang: +tknight: +wildfang: wildfangs: 0:609ce:28:00:1a - -;(time limit) (by GeoMan) + +;(time limit) (by GeoMan) timelimt: -0:80ca:3:0:0 +0:80ca:3:0:0 0:8981:1:27:27 -0:89a1:1:00:00 +0:89a1:1:00:00 0:89c1:1:27:27 0:89e1:1:27:27 -0:8a01:1:27:27 +0:8a01:1:27:27 0:8a21:1:27:27 - -;(time tunnel) (by GeoMan) + +;(time tunnel) (by GeoMan) timetunl: 0:801f:6:0:0 0:c46d:6:63:63 @@ -8793,64 +8794,64 @@ 0:c04d:54:00:20 0:c0a1:4:00:00 -;(tough turf (japan)) and clones (by GeoMan) +;(tough turf (japan)) and clones (by GeoMan) tturf: tturfu: tturfbl: 0:200100:4:00:08 0:200104:7c:08:00 - + ;(ultraman club - tatakae! ultraman kyoudai!!) (by GeoMan) -umanclub: +umanclub: 0:200742:2:00:07 -0:2006a2:a0:00:00 +0:2006a2:a0:00:00 ;(valkyrie no densetsu (japan)) (by GeoMan) -valkyrie: -0:100620:4:00:a0 +valkyrie: +0:100620:4:00:a0 0:100624:9c:56:00 -;(vanguard ii) (by GeoMan) +;(vanguard ii) (by GeoMan) vangrd2: 0:c380:60:0a:00 0:f620:3:00:00 - -;(vastar (set 1)) and clones (by GeoMan) -vastar: + +;(vastar (set 1)) and clones (by GeoMan) +vastar: vastar2: vastar3: vastar4: 0:cda1:1:00:00 -0:cdc1:1:00:00 -0:cde1:1:00:00 +0:cdc1:1:00:00 +0:cde1:1:00:00 0:ce01:1:00:00 -0:ce21:1:02:02 -0:ce41:1:28:28 -0:ce61:1:28:28 -0:f128:85:00:16 +0:ce21:1:02:02 +0:ce41:1:28:28 +0:ce61:1:28:28 +0:f128:85:00:16 -;(wai wai jockey gate-in!) (by GeoMan) +;(wai wai jockey gate-in!) (by GeoMan) wwjgtin: -0:0220:70:24:24 +0:0220:70:24:24 0:001c:3:00:00 -;(wall street) (by GeoMan) +;(wall street) (by GeoMan) wallst: 0:1c19:1e:00:00 ;(water match) (by GeoMan) -wmatch: -0:c000:3c:84:02 -0:c086:3:00:02 -0:d300:15:00:01 -0:d380:15:41:49 +wmatch: +0:c000:3c:84:02 +0:c086:3:00:02 +0:d300:15:00:01 +0:d380:15:41:49 0:d400:2d0:84:4d ;(water ski) (by GeoMan) -waterski: +waterski: 0:835b:3:0:0 -;(capcom sports club (japan 970722)) and clones (by GeoMan) +;(capcom sports club (japan 970722)) and clones (by GeoMan) csclubj: cscluba: csclub: @@ -8858,15 +8859,15 @@ csclubh: csclubjy: csclub1d: -0:ff9894:50:00:b2 -0:ff98e4:dc:1a:01 +0:ff9894:50:00:b2 +0:ff98e4:dc:1a:01 -;(in the hunt (world)) and clones (by GeoMan) - FIXED ENTRY! +;(in the hunt (world)) and clones (by GeoMan) - FIXED ENTRY! inthunt: inthuntu: kaiteids: 0:e0180:d8:00:02 - + ;********system16.c (wonder boy iii - monster lair (set 1)) wb3bbl: wb32: @@ -9121,7 +9122,7 @@ ;********taito_b.c (hit the ice (us)) ;** you must wait untill the hiscore table has displayed in attract mode before ** -;** starting a game, for the save to work ** +;** starting a game, for the save to work ** hitice: 0:802830:27:00:4b 0:802852:1:56:56 @@ -9246,7 +9247,7 @@ ;0:fff666:1:54:54 ;Saturday Night Slam Masters clones -slammastu: +slammastu: 0:ffa138:02:00:10 0:ffa13a:ae:00:00 @@ -9368,7 +9369,7 @@ 0:8743:1:20:20 ;in this game to make the hiscore display by starting a new game (if you beat the hiscore) before you exit -naughtyb: +naughtyb: naughtyba: naughtybc: 0:4004:3:0:0 @@ -9376,8 +9377,8 @@ 0:872f:1:20:20 0:8733:1:20:20 0:8737:1:20:20 -0:873b:1:20:20 -0:873f:1:20:20 +0:873b:1:20:20 +0:873f:1:20:20 0:8743:1:20:20 ;Video Hustler and clones (by GeoMan) @@ -9403,7 +9404,7 @@ ;********taito_f3.c (lightbringer (japan)) ;** you must wait until the hiscore table has displayed in attract mode before ** -;** starting a game, for the save to work ** +;** starting a game, for the save to work ** lightbr: lightbrj: 0:40a312:70:00:01 @@ -9473,7 +9474,7 @@ ;********wgp.c (world grand prix (us & joystick version set 1 japan) ;** you must wait untill the hiscore table has displayed in attract mode before ** -;** starting a game, for the save to work ** +;** starting a game, for the save to work ** ;** THIS SAVE DOES NOT SAVE THE COURSE RECORDS ** wgp: 0:10bbd9:c5:01:02 @@ -10227,7 +10228,7 @@ 0:306aa1:3:00:00 ;*********gaelco.c (biomechanical toy (unprotected)) -;** you must let the highscore display in attract mode before starting a game ** +;** you must let the highscore display in attract mode before starting a game ** biomtoy: biomtoya: 0:ff0794:17:06:2e @@ -10762,7 +10763,7 @@ ;********parodius.c (parodius da! (japan)) parodius: -parodiusj: +parodiusj: parodiusa: parodiuse: 0:1f50:5e:00:00 @@ -11025,7 +11026,7 @@ ;*******playch10.c (play choice 10:rc pro am) ;pc_rcpam: -;1:378:64:17:29 +;1:378:64:17:29 ;********deniam.c (karian cross) karianx: @@ -11137,7 +11138,7 @@ 0:6008:3:00:00 invadpt2: -invaddlx: +invaddlx: 0:20f4:2:00:05 0:2340:a:1b:1b @@ -11160,7 +11161,7 @@ lrescue: warl: desterth: -lrescuem: +lrescuem: lrescuem2: ;updated when start a game 0:20db:1:0a:0a @@ -11181,9 +11182,9 @@ polarisa: polarisbr: -0:2150:14:00:00 -0:2165:1e:2a:2a -0:2314:02:00:00 +0:2150:14:00:00 +0:2165:1e:2a:2a +0:2314:02:00:00 rollingc: 0:2302:0f:00:00 @@ -11250,12 +11251,12 @@ 0:fc38:4:00:00 arkanoid: ;[Special thanks to Cananas for enhancing this entry] -ark1ball: -arkangc: -arkangc2: +ark1ball: +arkangc: +arkangc2: arkbloc2: arkblock: -arkgcbl: +arkgcbl: arkmcubl: arkanoidu: arkanoiduo: @@ -11578,8 +11579,8 @@ ;starcas: ;starcas1: ;starcase: -;starcasp: -;stellcas: +;starcasp: +;stellcas: ;0:1aa:4:00:00 crash: @@ -11597,7 +11598,7 @@ ;********citycon.c citycon: -citycona: +citycona: cruisin: 0:0055:3:00:13 0:0043:3:00:02 @@ -11672,7 +11673,7 @@ cosmica: cosmica2: cosmica1: -0:400e:3:00:00 +0:400e:3:00:00 panic: panich: @@ -11681,7 +11682,7 @@ panic3: 0:40c1:5:00:00 0:5c00:c:09:15 -0:4004:2:00:00 +0:4004:2:00:00 ;********cps1.c 1941: @@ -11697,21 +11698,21 @@ 0:ff0f6c:9c:00:00 dino: -dinoj: +dinoj: dinou: dinohunt: 0:fff03e:310:00:00 0:fff34e:010:99:00 ghouls: -ghoulsu: +ghoulsu: daimakair: -daimakai: +daimakai: 0:ffbf4c:78:48:a8 0:ff087a:04:00:00 -mbombrd: -mbombrdj: +mbombrd: +mbombrdj: 0:ffa0cc:02:00:10 0:ffa0ce:ae:00:00 @@ -11725,28 +11726,28 @@ 0:ffef10:28:00:02 mercs: -mercsur1: -mercsj: +mercsur1: +mercsj: mercsua: 0:ff0fd0:a0:00:20 msword: -mswordu: -mswordj: +mswordu: +mswordj: mswordr1: 0:fffe32:98:00:00 0:fffeca:02:04:00 0:ffa890:04:00:00 nemo: -nemoj: +nemoj: nemor1: 0:fff004:28:00:20 0:fff054:14:ff:24 0:fff07c:04:00:00 pang3: -pang3j: +pang3j: pang3b: pang3r1: 0:ff9726:8c:00:09 @@ -11757,8 +11758,8 @@ 0:ff8534:04:00:00 punisher: -punisheru: -punisherj: +punisheru: +punisherj: punisherbz: punisherh: 0:ff7896:258:ff:01 @@ -11803,8 +11804,8 @@ sf2ed: sf2ebbl2: sf2ebbl3: -0:ffd28a:30:00:20 -0:ffd302:04:00:00 +0:ffd28a:30:00:20 +0:ffd302:04:00:00 sf2accp2: 0:ffd276:27:00:4b @@ -11814,20 +11815,20 @@ 0:ffd276:28:02:20 0:ffd2ee:04:02:53 -slammast: -mbomberj: +slammast: +mbomberj: 0:ffa138:02:00:10 0:ffa13a:ae:00:00 unsquad: ;******u.n. squadren area88: -area88r: +area88r: 0:ff101c:50:00:26 0:ff107c:08:00:00 ;********crbaloon.c -crbaloon: -crbaloon2: +crbaloon: +crbaloon2: 0:4016:03:00:00 0:417f:0a:11:00 @@ -11881,12 +11882,12 @@ 0:4800:70:1d:03 baddudes: ;[Special thanks to Cananas for enhancing this entry] -0:ffa8fe:a0:4d:01 -0:ff81d4:04:00:00 +0:ffa8fe:a0:4d:01 +0:ff81d4:04:00:00 -drgninja: +drgninja: drgninjab: -0:ffa8f8:a0:4d:01 +0:ffa8f8:a0:4d:01 0:ff81d4:04:00:00 drgninjab2: @@ -11905,7 +11906,7 @@ 0:ffbe00:50:08:01 ;********dec8.c -breywood: +breywood: 0:0108:28:31:00 0:006d:3:04:00 @@ -11950,7 +11951,7 @@ 0:075a:46:00:33 0:0006:3:00:09 -shackled: +shackled: 0:0108:28:31:00 0:006b:3:04:00 @@ -11967,7 +11968,7 @@ logicpr2: 0:ff70e6:46:0a:d0 -radarscp: +radarscp: radarscp1: 0:6307:a2:00:fc 0:60a8:3:50:00 @@ -12083,7 +12084,7 @@ rallysa: 0:00ae:2:00:10 -sidetrac: +sidetrac: 0:000f:2:00:00 ;********fastfred.c @@ -12091,7 +12092,7 @@ 0:c04b:3:00:00 0:c400:3f:00:11 -flyboy: +flyboy: flyboyb: 0:c400:1e:00:00 0:c430:64:1b:10 @@ -12281,25 +12282,6 @@ 0:0900:A0:20:00 0:09b6:03:00:00 -;********gauntlet.c -; note saves last level completed and high scores -gauntlet: -gauntir1: -gauntir2: -gaunt2p: -gauntletr4: -gauntletr5: -gauntletr7: -gauntletr9: -gauntlets: -0:904010:2:0:7 -0:904DE8:C8:00:50 - -; note saves last level completed and high scores -gaunt2: -0:904010:2:0:5 -0:904DE8:C8:00:E3 - ;********gberet.c gberet: rushatck: @@ -12351,7 +12333,7 @@ 0:e680:50:00:18 0:e600:8:00:00 -;********hcastle.c +;********hcastle.c hcastle: hcastleo: hcastljo: @@ -12367,16 +12349,16 @@ hexaa: 0:c709:2:00:00 -;********hyperspt.c +;********hyperspt.c roadf: -roadf2: +roadf2: 0:3bd0:10a:01:01 0:3066:3:01:00 ;********ironhors.c ironhors: dairesya: -farwest: +farwest: 0:32f1:3:02:00 0:3300:40:23:00 @@ -12400,7 +12382,7 @@ ;********junofrst.c junofrst: -junofrstg: +junofrstg: 0:8100:a0:01:3f diamond: @@ -12418,7 +12400,7 @@ 0:9488:28:00:83 0:940b:03:00:01 -;********kaneko16.c +;********kaneko16.c berlwall: berlwallt: berlwallk: @@ -12658,7 +12640,7 @@ 0:c0db1a:0a:01:64 ;********m97.c -bbmanwj: ;**** top score not working ????? +bbmanwj: ;**** top score not working ????? bbmanw: bomblord: bbmanwja: @@ -12829,14 +12811,14 @@ mikie: mikiej: mikiehs: -0:2a00:01:1d:1d -0:2a01:01:2c:2c -0:2a02:01:1f:1f -0:2a03:01:00:00 -0:2a04:01:01:01 -0:2a05:28:00:00 -0:29f0:04:00:00 -0:297c:04:00:00 +0:2a00:01:1d:1d +0:2a01:01:2c:2c +0:2a02:01:1f:1f +0:2a03:01:00:00 +0:2a04:01:01:01 +0:2a05:28:00:00 +0:29f0:04:00:00 +0:297c:04:00:00 ;********mitchell.c block: @@ -12862,13 +12844,13 @@ 00:0375:50:19:00 ;********mpatrol.c -mpatrol: -mpatrolw: -mranger: +mpatrol: +mpatrolw: +mranger: 0:e008:2c:00:00 ;********mrdo.c -mrdo: +mrdo: mrdot: mrdofix: mrlo: @@ -12983,7 +12965,7 @@ sagaia: 0:1010fa:44b:00:20 -;********nova2001.c +;********nova2001.c ;****note doesnt save top scores nova2001u: nova2001: @@ -13137,7 +13119,7 @@ nrallyx: nrallyxb: rallyxmr: -0:8060:8:00:02 +0:8060:8:00:02 ;********renegade.c renegade: @@ -13232,7 +13214,7 @@ 0:4200:1e:00:01 0:40a8:03:00:01 -explorer: +explorer: 0:4200:1e:49:01 0:40a8:03:00:01 @@ -13264,7 +13246,7 @@ 0:cb44:0f:4d:48 0:cb95:0f:02:00 -;********segac2.c +;********segac2.c borench: borencha: 0:fff410:44:4d:05 @@ -13357,7 +13339,7 @@ sharkatt: 0:806e:50:30:20 -;********sidearms.c +;********sidearms.c dyger: dygera: 0:c0d0:23:37:06 @@ -13505,7 +13487,7 @@ pacnpal: pacnchmp: -pacnpal2: +pacnpal2: 0:104c:28:00:23 0:116d:3:00:00 0:3ed:7:00:24 @@ -13558,7 +13540,7 @@ wboy3: wboy4: wboy4u: -wboyu: ;*note* only 1/2 works... +wboyu: ;*note* only 1/2 works... wbdeluxe: wboyo: wboy2u: @@ -13573,7 +13555,7 @@ wbmljo: wbmljb: wbml: -wbmlbg: +wbmlbg: wbmlbge: wbmlvc: wbmld: @@ -13745,7 +13727,7 @@ ;********taito_f2.c cameltry: ;*note cant see highscore table in cameltry so its commented out -;cameltru: +;cameltru: 0:106c9e:244:35:44 0:1066b0:3e:06:00 0:105430:4:00:00 @@ -13758,12 +13740,12 @@ dondokodu: dondokodj: 0:1028e8:28:00:55 - + gunfront: gunfrontj: 0:10922c:54:00:30 0:10922e:1:c3:c3 - + liquidk: liquidku: mizubaku: @@ -14029,7 +14011,7 @@ tatsujn2: 0:100300:7c:00:01 -;********topspeed.c +;********topspeed.c topspeed: topspeedu: fullthrl:
View file
libretro-mame2003-0~git20200805.tar.xz/metadata/mame2003.xml -> libretro-mame2003-0~git20210529.tar.xz/metadata/mame2003.xml
Changed
@@ -3,6 +3,7 @@ <!ELEMENT mame (game+)> <!ELEMENT game (description, year?, manufacturer, history?, biosset*, rom*, disk*, sample*, chip*, video?, sound?, input?, dipswitch*, driver?)> <!ATTLIST game name CDATA #REQUIRED> + <!ATTLIST game sourcefile CDATA #IMPLIED> <!ATTLIST game runnable (yes|no) "yes"> <!ATTLIST game cloneof CDATA #IMPLIED> <!ATTLIST game romof CDATA #IMPLIED> @@ -66,11 +67,12 @@ <!ATTLIST driver status (good|preliminary|test) #REQUIRED> <!ATTLIST driver color (good|imperfect|preliminary) #REQUIRED> <!ATTLIST driver sound (good|imperfect|preliminary) #REQUIRED> + <!ATTLIST driver graphic (good|imperfect) #REQUIRED> <!ATTLIST driver palettesize CDATA #REQUIRED> ]> <mame> - <game name="puckman"> + <game name="puckman" sourcefile="pacman.c"> <description>PuckMan (Japan set 1)</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -125,9 +127,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="puckmana" cloneof="puckman" romof="puckman"> + <game name="puckmana" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>PuckMan (Japan set 2)</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -184,9 +186,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pacman" cloneof="puckman" romof="puckman"> + <game name="pacman" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Pac-Man (Midway)</description> <year>1980</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -241,9 +243,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="puckmod" cloneof="puckman" romof="puckman"> + <game name="puckmod" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>PuckMan (harder?)</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -298,9 +300,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pacmod" cloneof="puckman" romof="puckman"> + <game name="pacmod" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Pac-Man (Midway, harder)</description> <year>1981</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -355,9 +357,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="hangly" cloneof="puckman" romof="puckman"> + <game name="hangly" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Hangly-Man (set 1)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -412,9 +414,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="hangly2" cloneof="puckman" romof="puckman"> + <game name="hangly2" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Hangly-Man (set 2)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -471,9 +473,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="hangly3" cloneof="puckman" romof="puckman"> + <game name="hangly3" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Hangly-Man (set 3)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -534,9 +536,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="newpuckx" cloneof="puckman" romof="puckman"> + <game name="newpuckx" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>New Puck-X</description> <year>1980</year> <manufacturer>hack</manufacturer> @@ -591,9 +593,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pacheart" cloneof="puckman" romof="puckman"> + <game name="pacheart" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Pac-Man (Hearts)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -654,9 +656,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="joyman" cloneof="puckman" romof="puckman"> + <game name="joyman" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Joyman</description> <year>1982</year> <manufacturer>hack</manufacturer> @@ -717,9 +719,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="newpuc2" cloneof="puckman" romof="puckman"> + <game name="newpuc2" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Newpuc2</description> <year>1980</year> <manufacturer>hack</manufacturer> @@ -780,9 +782,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="newpuc2b" cloneof="puckman" romof="puckman"> + <game name="newpuc2b" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Newpuc2 (set 2)</description> <year>1980</year> <manufacturer>hack</manufacturer> @@ -843,9 +845,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="piranha" cloneof="puckman" romof="puckman"> + <game name="piranha" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Piranha</description> <year>1981</year> <manufacturer>GL (US Billiards License)</manufacturer> @@ -902,9 +904,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="piranhao" cloneof="puckman" romof="puckman"> + <game name="piranhao" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Piranha (older)</description> <year>1981</year> <manufacturer>GL (US Billiards License)</manufacturer> @@ -961,9 +963,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="piranhah" cloneof="puckman" romof="puckman"> + <game name="piranhah" sourcefile="pacman.c" cloneof="puckman" romof="puckman"> <description>Piranha (hack)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -1016,9 +1018,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="nmouse"> + <game name="nmouse" sourcefile="pacman.c"> <description>Naughty Mouse (set 1)</description> <year>1981</year> <manufacturer>Amenip (Palcom Queen River)</manufacturer> @@ -1077,9 +1079,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="nmouseb" cloneof="nmouse" romof="nmouse"> + <game name="nmouseb" sourcefile="pacman.c" cloneof="nmouse" romof="nmouse"> <description>Naughty Mouse (set 2)</description> <year>1981</year> <manufacturer>Amenip Nova Games Ltd.</manufacturer> @@ -1138,9 +1140,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pacplus"> + <game name="pacplus" sourcefile="pacman.c"> <description>Pac-Man Plus</description> <year>1982</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -1195,9 +1197,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mspacman"> + <game name="mspacman" sourcefile="pacman.c"> <description>Ms. Pac-Man</description> <year>1981</year> <manufacturer>Midway</manufacturer> @@ -1251,9 +1253,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mspacmab" cloneof="mspacman" romof="mspacman"> + <game name="mspacmab" sourcefile="pacman.c" cloneof="mspacman" romof="mspacman"> <description>Ms. Pac-Man (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -1306,9 +1308,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mspacmat" cloneof="mspacman" romof="mspacman"> + <game name="mspacmat" sourcefile="pacman.c" cloneof="mspacman" romof="mspacman"> <description>Ms. Pac Attack</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -1362,9 +1364,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mspacpls" cloneof="mspacman" romof="mspacman"> + <game name="mspacpls" sourcefile="pacman.c" cloneof="mspacman" romof="mspacman"> <description>Ms. Pac-Man Plus</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -1415,9 +1417,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pacgal" cloneof="mspacman" romof="mspacman"> + <game name="pacgal" sourcefile="pacman.c" cloneof="mspacman" romof="mspacman"> <description>Pac-Gal</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -1471,9 +1473,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mschamp" cloneof="mspacman" romof="mspacman"> + <game name="mschamp" sourcefile="pacman.c" cloneof="mspacman" romof="mspacman"> <description>Ms. Pacman Champion Edition / Super Zola Pac Gal</description> <year>1995</year> <manufacturer>hack</manufacturer> @@ -1534,9 +1536,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="maketrax" cloneof="crush" romof="crush"> + <game name="maketrax" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Make Trax (set 1)</description> <year>1981</year> <manufacturer>[Kural] (Williams license)</manufacturer> @@ -1579,9 +1581,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="maketrxb" cloneof="crush" romof="crush"> + <game name="maketrxb" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Make Trax (set 2)</description> <year>1981</year> <manufacturer>[Kural] (Williams license)</manufacturer> @@ -1624,9 +1626,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="korosuke" cloneof="crush" romof="crush"> + <game name="korosuke" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Korosuke Roller</description> <year>1981</year> <manufacturer>Kural Electric</manufacturer> @@ -1669,9 +1671,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="crush"> + <game name="crush" sourcefile="pacman.c"> <description>Crush Roller (Kural Samno)</description> <year>1981</year> <manufacturer>Kural Samno Electric</manufacturer> @@ -1714,9 +1716,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="crush2" cloneof="crush" romof="crush"> + <game name="crush2" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Crush Roller (Kural Esco - bootleg?)</description> <year>1981</year> <manufacturer>Kural Esco Electric</manufacturer> @@ -1765,9 +1767,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="crush3" cloneof="crush" romof="crush"> + <game name="crush3" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Crush Roller (Kural - bootleg?)</description> <year>1981</year> <manufacturer>Kural Electric</manufacturer> @@ -1816,9 +1818,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mbrush" cloneof="crush" romof="crush"> + <game name="mbrush" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Magic Brush</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -1863,9 +1865,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="paintrlr" cloneof="crush" romof="crush"> + <game name="paintrlr" sourcefile="pacman.c" cloneof="crush" romof="crush"> <description>Paint Roller</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -1914,9 +1916,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="eyes"> + <game name="eyes" sourcefile="pacman.c"> <description>Eyes (Digitrex Techstar)</description> <year>1982</year> <manufacturer>Digitrex Techstar (Rock-ola license)</manufacturer> @@ -1963,9 +1965,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="eyes2" cloneof="eyes" romof="eyes"> + <game name="eyes2" sourcefile="pacman.c" cloneof="eyes" romof="eyes"> <description>Eyes (Techstar)</description> <year>1982</year> <manufacturer>Techstar (Rock-ola license)</manufacturer> @@ -2012,9 +2014,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mrtnt"> + <game name="mrtnt" sourcefile="pacman.c"> <description>Mr. TNT</description> <year>1983</year> <manufacturer>Telko</manufacturer> @@ -2061,9 +2063,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="16"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="16"/> </game> - <game name="gorkans" cloneof="mrtnt" romof="mrtnt"> + <game name="gorkans" sourcefile="pacman.c" cloneof="mrtnt" romof="mrtnt"> <description>Gorkans</description> <year>1983</year> <manufacturer>Techstar</manufacturer> @@ -2116,9 +2118,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="eggor"> + <game name="eggor" sourcefile="pacman.c"> <description>Eggor</description> <year>1983</year> <manufacturer>Telko</manufacturer> @@ -2171,9 +2173,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="16"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="ponpoko"> + <game name="ponpoko" sourcefile="pacman.c"> <description>Ponpoko</description> <year>1982</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -2256,9 +2258,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="ponpokov" cloneof="ponpoko" romof="ponpoko"> + <game name="ponpokov" sourcefile="pacman.c" cloneof="ponpoko" romof="ponpoko"> <description>Ponpoko (Venture Line)</description> <year>1982</year> <manufacturer>Sigma Enterprises Inc. (Venture Line license)</manufacturer> @@ -2341,9 +2343,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="lizwiz"> + <game name="lizwiz" sourcefile="pacman.c"> <description>Lizard Wizard</description> <year>1985</year> <manufacturer>Techstar (Sunn license)</manufacturer> @@ -2392,9 +2394,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="theglobp" cloneof="suprglob" romof="suprglob"> + <game name="theglobp" sourcefile="pacman.c" cloneof="suprglob" romof="suprglob"> <description>The Glob (Pac-Man hardware)</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -2443,9 +2445,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="beastf" cloneof="suprglob" romof="suprglob"> + <game name="beastf" sourcefile="pacman.c" cloneof="suprglob" romof="suprglob"> <description>Beastie Feastie</description> <year>1984</year> <manufacturer>Epos Corporation</manufacturer> @@ -2494,9 +2496,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="acitya" cloneof="bwcasino" romof="bwcasino"> + <game name="acitya" sourcefile="pacman.c" cloneof="bwcasino" romof="bwcasino"> <description>Atlantic City Action</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -2547,9 +2549,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="bwcasino"> + <game name="bwcasino" sourcefile="pacman.c"> <description>Boardwalk Casino</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -2604,9 +2606,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="dremshpr"> + <game name="dremshpr" sourcefile="pacman.c"> <description>Dream Shopper</description> <year>1982</year> <manufacturer>Sanritsu</manufacturer> @@ -2652,9 +2654,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="vanvan"> + <game name="vanvan" sourcefile="pacman.c"> <description>Van-Van Car</description> <year>1983</year> <manufacturer>Sanritsu</manufacturer> @@ -2729,9 +2731,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="vanvank" cloneof="vanvan" romof="vanvan"> + <game name="vanvank" sourcefile="pacman.c" cloneof="vanvan" romof="vanvan"> <description>Van-Van Car (Karateco)</description> <year>1983</year> <manufacturer>Karateco</manufacturer> @@ -2808,9 +2810,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="alibaba"> + <game name="alibaba" sourcefile="pacman.c"> <description>Ali Baba and 40 Thieves</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -2865,9 +2867,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="preliminary" sound="good" palettesize="16"/> + <driver status="protection" color="preliminary" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pengo"> + <game name="pengo" sourcefile="pengo.c"> <description>Pengo (set 1 rev c)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -2952,9 +2954,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pengo2" cloneof="pengo" romof="pengo"> + <game name="pengo2" sourcefile="pengo.c" cloneof="pengo" romof="pengo"> <description>Pengo (set 2)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -3039,9 +3041,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pengo2u" cloneof="pengo" romof="pengo"> + <game name="pengo2u" sourcefile="pengo.c" cloneof="pengo" romof="pengo"> <description>Pengo (set 2 not encrypted)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -3126,9 +3128,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pengo3u" cloneof="pengo" romof="pengo"> + <game name="pengo3u" sourcefile="pengo.c" cloneof="pengo" romof="pengo"> <description>Pengo (set 3 not encrypted)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -3213,9 +3215,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pengob" cloneof="pengo" romof="pengo"> + <game name="pengob" sourcefile="pengo.c" cloneof="pengo" romof="pengo"> <description>Pengo (bootleg)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -3298,9 +3300,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="penta" cloneof="pengo" romof="pengo"> + <game name="penta" sourcefile="pengo.c" cloneof="pengo" romof="pengo"> <description>Penta</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -3385,9 +3387,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jrpacman"> + <game name="jrpacman" sourcefile="jrpacman.c"> <description>Jr. Pac-Man</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -3444,9 +3446,9 @@ </dipswitch> <dipswitch name="Speedup Cheat"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jumpshot"> + <game name="jumpshot" sourcefile="pacman.c"> <description>Jump Shot</description> <year>1985</year> <manufacturer>Bally Midway</manufacturer> @@ -3504,9 +3506,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="shootbul"> + <game name="shootbul" sourcefile="pacman.c"> <description>Shoot the Bull</description> <year>1985</year> <manufacturer>Bally Midway</manufacturer> @@ -3554,9 +3556,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="bigbucks"> + <game name="bigbucks" sourcefile="pacman.c"> <description>Big Bucks</description> <year>1986</year> <manufacturer>Dynasoft Inc.</manufacturer> @@ -3620,9 +3622,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="drivfrcp"> + <game name="drivfrcp" sourcefile="pacman.c"> <description>Driving Force (Pac-Man conversion)</description> <year>1984</year> <manufacturer>Shinkai Inc. (Magic Eletronics Inc. licence)</manufacturer> @@ -3667,9 +3669,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="8bpm" cloneof="8ballact" romof="8ballact"> + <game name="8bpm" sourcefile="pacman.c" cloneof="8ballact" romof="8ballact"> <description>Eight Ball Action (Pac-Man conversion)</description> <year>1985</year> <manufacturer>Seatongrove Ltd (Magic Eletronics USA licence)</manufacturer> @@ -3716,9 +3718,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="16"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="16"/> </game> - <game name="porky"> + <game name="porky" sourcefile="pacman.c"> <description>Porky</description> <year>1985</year> <manufacturer>Shinkai Inc. (Magic Eletronics Inc. licence)</manufacturer> @@ -3764,9 +3766,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="16"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="16"/> </game> - <game name="megadon"> + <game name="megadon" sourcefile="epos.c"> <description>Megadon</description> <year>1982</year> <manufacturer>Epos Corporation (Photar Industries license)</manufacturer> @@ -3814,9 +3816,9 @@ <dipvalue name="Arcade" default="yes"/> <dipvalue name="Contest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="catapult"> + <game name="catapult" sourcefile="epos.c"> <description>Catapult</description> <year>1982</year> <manufacturer>Epos Corporation</manufacturer> @@ -3860,9 +3862,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="suprglob"> + <game name="suprglob" sourcefile="epos.c"> <description>Super Glob</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -3908,9 +3910,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="theglob" cloneof="suprglob" romof="suprglob"> + <game name="theglob" sourcefile="epos.c" cloneof="suprglob" romof="suprglob"> <description>The Glob</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -3956,9 +3958,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="theglob2" cloneof="suprglob" romof="suprglob"> + <game name="theglob2" sourcefile="epos.c" cloneof="suprglob" romof="suprglob"> <description>The Glob (earlier)</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -4004,9 +4006,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="theglob3" cloneof="suprglob" romof="suprglob"> + <game name="theglob3" sourcefile="epos.c" cloneof="suprglob" romof="suprglob"> <description>The Glob (set 3)</description> <year>1983</year> <manufacturer>Epos Corporation</manufacturer> @@ -4052,9 +4054,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="igmo"> + <game name="igmo" sourcefile="epos.c"> <description>IGMO</description> <year>1984</year> <manufacturer>Epos Corporation</manufacturer> @@ -4098,9 +4100,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="32"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="32"/> </game> - <game name="dealer"> + <game name="dealer" sourcefile="epos.c"> <description>The Dealer</description> <manufacturer>Epos Corporation</manufacturer> <rom name="u1.bin" size="8192" crc="e06f3563" sha1="0d58cd1f2e1ca89adb9c64d7dd520bb1f2d50f1a" region="cpu1" offset="0"/> @@ -4145,9 +4147,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="galaxian"> + <game name="galaxian" sourcefile="galaxian.c"> <description>Galaxian (Namco set 1)</description> <year>1979</year> <manufacturer>Namco</manufacturer> @@ -4190,9 +4192,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galaxiaj" cloneof="galaxian" romof="galaxian"> + <game name="galaxiaj" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian (Namco set 2)</description> <year>1979</year> <manufacturer>Namco</manufacturer> @@ -4233,9 +4235,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galmidw" cloneof="galaxian" romof="galaxian"> + <game name="galmidw" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian (Midway)</description> <year>1979</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -4278,9 +4280,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galmidwo" cloneof="galaxian" romof="galaxian"> + <game name="galmidwo" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian (Midway, old rev)</description> <year>1979</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -4323,9 +4325,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="superg" cloneof="galaxian" romof="galaxian"> + <game name="superg" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Super Galaxians</description> <year>1979</year> <manufacturer>hack</manufacturer> @@ -4367,9 +4369,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galapx" cloneof="galaxian" romof="galaxian"> + <game name="galapx" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian Part X</description> <year>1979</year> <manufacturer>hack</manufacturer> @@ -4412,9 +4414,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="moonaln" cloneof="galaxian" romof="galaxian"> + <game name="moonaln" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Moon Alien</description> <manufacturer>[Nichibutsu] (Karateco license)</manufacturer> <rom name="galx.u" size="2048" crc="79e4007d" sha1="d55050498a670d1c022ba3caad34f8fcaccf4a30" region="cpu1" offset="0"/> @@ -4456,9 +4458,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galap1" cloneof="galaxian" romof="galaxian"> + <game name="galap1" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Space Invaders Galactica</description> <year>1979</year> <manufacturer>hack</manufacturer> @@ -4500,9 +4502,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galap4" cloneof="galaxian" romof="galaxian"> + <game name="galap4" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian Part 4</description> <year>1979</year> <manufacturer>hack</manufacturer> @@ -4545,9 +4547,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="galturbo" cloneof="galaxian" romof="galaxian"> + <game name="galturbo" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian Turbo</description> <year>1979</year> <manufacturer>hack</manufacturer> @@ -4590,9 +4592,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="swarm" cloneof="galaxian" romof="galaxian"> + <game name="swarm" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Swarm</description> <year>1979</year> <manufacturer>hack</manufacturer> @@ -4635,9 +4637,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="zerotime" cloneof="galaxian" romof="galaxian"> + <game name="zerotime" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Zero Time</description> <year>1979</year> <manufacturer>Petaco S.A.</manufacturer> @@ -4680,9 +4682,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="tst_galx" cloneof="galaxian" romof="galaxian"> + <game name="tst_galx" sourcefile="galaxian.c" cloneof="galaxian" romof="galaxian"> <description>Galaxian Test ROM</description> <manufacturer>Test ROM</manufacturer> <rom name="test.u" size="2048" crc="0614cd7f" sha1="12440678be8a27a6c3032b6e43c45e27905ffa83" region="cpu1" offset="0"/> @@ -4724,9 +4726,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="gmgalax"> + <game name="gmgalax" sourcefile="galaxian.c"> <description>Ghostmuncher Galaxian (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -4798,9 +4800,9 @@ </dipswitch> <dipswitch name="Game Select"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="130"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="130"/> </game> - <game name="pisces"> + <game name="pisces" sourcefile="galaxian.c"> <description>Pisces</description> <manufacturer>Subelectro</manufacturer> <rom name="p1.bin" size="2048" crc="40c5b0e4" sha1="6c18e6f4719eb0d7eb13b778d7ea58e4b87ac35c" region="cpu1" offset="0"/> @@ -4843,9 +4845,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="piscesb" cloneof="pisces" romof="pisces"> + <game name="piscesb" sourcefile="galaxian.c" cloneof="pisces" romof="pisces"> <description>Pisces (bootleg)</description> <manufacturer>bootleg</manufacturer> <rom name="pisces.a1" size="2048" crc="856b8e1f" sha1="24d468b5f06f54c3fa1cb54ceec8a0c8e285430e" region="cpu1" offset="0"/> @@ -4888,9 +4890,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="uniwars"> + <game name="uniwars" sourcefile="galaxian.c"> <description>UniWar S</description> <year>1980</year> <manufacturer>Irem</manufacturer> @@ -4938,9 +4940,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="gteikoku" cloneof="uniwars" romof="uniwars"> + <game name="gteikoku" sourcefile="galaxian.c" cloneof="uniwars" romof="uniwars"> <description>Gingateikoku No Gyakushu</description> <year>1980</year> <manufacturer>Irem</manufacturer> @@ -4988,9 +4990,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="gteikokb" cloneof="uniwars" romof="uniwars"> + <game name="gteikokb" sourcefile="galaxian.c" cloneof="uniwars" romof="uniwars"> <description>Gingateikoku No Gyakushu (bootleg set 1)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -5036,9 +5038,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="gteikob2" cloneof="uniwars" romof="uniwars"> + <game name="gteikob2" sourcefile="galaxian.c" cloneof="uniwars" romof="uniwars"> <description>Gingateikoku No Gyakushu (bootleg set 2)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -5084,9 +5086,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="spacbatt" cloneof="uniwars" romof="uniwars"> + <game name="spacbatt" sourcefile="galaxian.c" cloneof="uniwars" romof="uniwars"> <description>Space Battle</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -5134,9 +5136,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="skyraidr" cloneof="uniwars" romof="uniwars"> + <game name="skyraidr" sourcefile="galaxian.c" cloneof="uniwars" romof="uniwars"> <description>Sky Raiders</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -5184,9 +5186,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="batman2" cloneof="phoenix" romof="phoenix"> + <game name="batman2" sourcefile="galaxian.c" cloneof="phoenix" romof="phoenix"> <description>Batman Part 2</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -5232,9 +5234,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="warofbug"> + <game name="warofbug" sourcefile="galaxian.c"> <description>War of the Bugs or Monsterous Manouvers in a Mushroom Maze</description> <year>1981</year> <manufacturer>Armenia</manufacturer> @@ -5274,9 +5276,9 @@ <dipvalue name="500000" default="yes"/> <dipvalue name="750000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="redufo"> + <game name="redufo" sourcefile="galaxian.c"> <description>Defend the Terra Attack on the Red UFO</description> <manufacturer>bootleg</manufacturer> <rom name="ru1a" size="2048" crc="5a8e4f37" sha1="c0957ede91e2dc3f80e4912b877843aed5d15779" region="cpu1" offset="0"/> @@ -5315,9 +5317,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="exodus" cloneof="redufo" romof="redufo"> + <game name="exodus" sourcefile="galaxian.c" cloneof="redufo" romof="redufo"> <description>Exodus (bootleg?)</description> <manufacturer>Subelectro</manufacturer> <rom name="exodus1.bin" size="2048" crc="5dfe65e1" sha1="5f1ce289b3c98a89d61d4dea952b4b8888d92ed7" region="cpu1" offset="0"/> @@ -5361,9 +5363,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="streakng"> + <game name="streakng" sourcefile="galaxian.c"> <description>Streaking</description> <year>1981</year> <manufacturer>Shoei</manufacturer> @@ -5401,9 +5403,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="98"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="98"/> </game> - <game name="pacmanbl" cloneof="puckman" romof="puckman"> + <game name="pacmanbl" sourcefile="galaxian.c" cloneof="puckman" romof="puckman"> <description>Pac-Man (Galaxian hardware)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -5448,9 +5450,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="devilfsg" cloneof="devilfsh" romof="devilfsh"> + <game name="devilfsg" sourcefile="galaxian.c" cloneof="devilfsh" romof="devilfsh"> <description>Devil Fish (Galaxian hardware, bootleg?)</description> <year>1984</year> <manufacturer>Vision / Artic</manufacturer> @@ -5486,9 +5488,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="zigzag"> + <game name="zigzag" sourcefile="galaxian.c"> <description>Zig Zag (Galaxian hardware, set 1)</description> <year>1982</year> <manufacturer>LAX</manufacturer> @@ -5524,9 +5526,9 @@ <dipvalue name="30000 60000"/> <dipvalue name="40000 60000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="zigzag2" cloneof="zigzag" romof="zigzag"> + <game name="zigzag2" sourcefile="galaxian.c" cloneof="zigzag" romof="zigzag"> <description>Zig Zag (Galaxian hardware, set 2)</description> <year>1982</year> <manufacturer>LAX</manufacturer> @@ -5562,9 +5564,9 @@ <dipvalue name="30000 60000"/> <dipvalue name="40000 60000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="jumpbug"> + <game name="jumpbug" sourcefile="galaxian.c"> <description>Jump Bug</description> <year>1981</year> <manufacturer>Rock-ola</manufacturer> @@ -5607,9 +5609,9 @@ <dipvalue name="A 1C/1C B 1C/1C" default="yes"/> <dipvalue name="A 1C/1C B 1C/6C"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="jumpbugb" cloneof="jumpbug" romof="jumpbug"> + <game name="jumpbugb" sourcefile="galaxian.c" cloneof="jumpbug" romof="jumpbug"> <description>Jump Bug (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -5652,9 +5654,9 @@ <dipvalue name="A 1C/1C B 1C/1C" default="yes"/> <dipvalue name="A 1C/1C B 1C/6C"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="levers"> + <game name="levers" sourcefile="galaxian.c"> <description>Levers</description> <year>1983</year> <manufacturer>Rock-ola</manufacturer> @@ -5706,9 +5708,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="azurian"> + <game name="azurian" sourcefile="galaxian.c"> <description>Azurian Attack</description> <year>1982</year> <manufacturer>Rait Electronics Ltd</manufacturer> @@ -5745,9 +5747,9 @@ <dipvalue name="Hard"/> <dipvalue name="Very hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="orbitron"> + <game name="orbitron" sourcefile="galaxian.c"> <description>Orbitron</description> <manufacturer>Signatron USA</manufacturer> <rom name="orbitron.3" size="2048" crc="419f9c9b" sha1="788a3920f4270b886b3a578f8c2df33e6314a1c3" region="cpu1" offset="600"/> @@ -5783,9 +5785,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrgx" cloneof="mooncrst" romof="mooncrst"> + <game name="mooncrgx" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Moon Cresta (Galaxian hardware)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -5827,9 +5829,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrst"> + <game name="mooncrst" sourcefile="galaxian.c"> <description>Moon Cresta (Nichibutsu)</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -5875,9 +5877,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrsu" cloneof="mooncrst" romof="mooncrst"> + <game name="mooncrsu" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Moon Cresta (Nichibutsu, unencrypted)</description> <year>1980</year> <manufacturer>Nichibutsu USA</manufacturer> @@ -5923,9 +5925,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrsa" cloneof="mooncrst" romof="mooncrst"> + <game name="mooncrsa" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Moon Cresta (Nichibutsu, old rev)</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -5965,9 +5967,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrsg" cloneof="mooncrst" romof="mooncrst"> + <game name="mooncrsg" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Moon Cresta (Gremlin)</description> <year>1980</year> <manufacturer>Gremlin</manufacturer> @@ -6009,9 +6011,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="smooncrs" cloneof="mooncrst" romof="mooncrst"> + <game name="smooncrs" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Super Moon Cresta</description> <manufacturer>Gremlin</manufacturer> <rom name="927" size="2048" crc="55c5b994" sha1="3451b121fa22361b2684385cf5d4455fa6963215" region="cpu1" offset="0"/> @@ -6048,9 +6050,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrsb" cloneof="mooncrst" romof="mooncrst"> + <game name="mooncrsb" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Moon Cresta (bootleg set 1)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -6090,9 +6092,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mooncrs2" cloneof="mooncrst" romof="mooncrst"> + <game name="mooncrs2" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Moon Cresta (bootleg set 2)</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -6132,9 +6134,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="fantazia" cloneof="mooncrst" romof="mooncrst"> + <game name="fantazia" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Fantazia</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -6176,9 +6178,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="98"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="98"/> </game> - <game name="moonqsr"> + <game name="moonqsr" sourcefile="galaxian.c"> <description>Moon Quasar</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -6222,9 +6224,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mshuttle"> + <game name="mshuttle" sourcefile="galaxian.c"> <description>Moon Shuttle (US?)</description> <year>1981</year> <manufacturer>Nichibutsu</manufacturer> @@ -6278,9 +6280,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mshuttlj" cloneof="mshuttle" romof="mshuttle"> + <game name="mshuttlj" sourcefile="galaxian.c" cloneof="mshuttle" romof="mshuttle"> <description>Moon Shuttle (Japan)</description> <year>1981</year> <manufacturer>Nichibutsu</manufacturer> @@ -6334,9 +6336,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="moonal2"> + <game name="moonal2" sourcefile="galaxian.c"> <description>Moon Alien Part 2</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -6385,9 +6387,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="moonal2b" cloneof="moonal2" romof="moonal2"> + <game name="moonal2b" sourcefile="galaxian.c" cloneof="moonal2" romof="moonal2"> <description>Moon Alien Part 2 (older version)</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -6435,9 +6437,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="eagle" cloneof="mooncrst" romof="mooncrst"> + <game name="eagle" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Eagle (set 1)</description> <year>1980</year> <manufacturer>Centuri</manufacturer> @@ -6477,9 +6479,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="eagle2" cloneof="mooncrst" romof="mooncrst"> + <game name="eagle2" sourcefile="galaxian.c" cloneof="mooncrst" romof="mooncrst"> <description>Eagle (set 2)</description> <year>1980</year> <manufacturer>Centuri</manufacturer> @@ -6523,9 +6525,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="skybase"> + <game name="skybase" sourcefile="galaxian.c"> <description>Sky Base</description> <year>1982</year> <manufacturer>Omori Electric Co., Ltd.</manufacturer> @@ -6567,9 +6569,9 @@ <dipvalue name="20000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="checkman"> + <game name="checkman" sourcefile="galaxian.c"> <description>Check Man</description> <year>1982</year> <manufacturer>Zilec-Zenitone</manufacturer> @@ -6612,9 +6614,9 @@ <dipvalue name="3"/> <dipvalue name="5" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="checkmaj" cloneof="checkman" romof="checkman"> + <game name="checkmaj" sourcefile="galaxian.c" cloneof="checkman" romof="checkman"> <description>Check Man (Japan)</description> <year>1982</year> <manufacturer>Jaleco</manufacturer> @@ -6653,9 +6655,9 @@ <dipvalue name="3"/> <dipvalue name="5" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="dingo"> + <game name="dingo" sourcefile="galaxian.c"> <description>Dingo</description> <year>1983</year> <manufacturer>Ashby Computers and Graphics LTD. (Jaleco license)</manufacturer> @@ -6694,9 +6696,9 @@ <dipvalue name="20000" default="yes"/> <dipvalue name="40000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="blkhole"> + <game name="blkhole" sourcefile="galaxian.c"> <description>Black Hole</description> <year>1981</year> <manufacturer>TDS</manufacturer> @@ -6736,9 +6738,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="kingball"> + <game name="kingball" sourcefile="galaxian.c"> <description>King & Balloon (US)</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -6789,9 +6791,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="kingbalj" cloneof="kingball" romof="kingball"> + <game name="kingbalj" sourcefile="galaxian.c" cloneof="kingball" romof="kingball"> <description>King & Balloon (Japan)</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -6842,9 +6844,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="scorpnmc"> + <game name="scorpnmc" sourcefile="galaxian.c"> <description>Scorpion (Moon Cresta hardware)</description> <manufacturer>Dorneer</manufacturer> <rom name="p1.bin" size="2048" crc="58818d88" sha1="d9fbfb6fff9ba1d078c3735889b8878ab0442ded" region="cpu1" offset="0"/> @@ -6887,9 +6889,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="frogg" cloneof="frogger" romof="frogger"> + <game name="frogg" sourcefile="galaxian.c" cloneof="frogger" romof="frogger"> <description>Frog (Galaxian hardware)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -6926,9 +6928,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="4in1"> + <game name="4in1" sourcefile="galaxian.c"> <description>4 Fun in 1</description> <year>1981</year> <manufacturer>Armenia / Food and Fun</manufacturer> @@ -7020,9 +7022,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="98"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="98"/> </game> - <game name="bagmanmc" cloneof="bagman" romof="bagman"> + <game name="bagmanmc" sourcefile="galaxian.c" cloneof="bagman" romof="bagman"> <description>Bagman (Moon Cresta hardware)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -7074,9 +7076,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="98"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="98"/> </game> - <game name="dkongjrm" cloneof="dkongjr" romof="dkongjr"> + <game name="dkongjrm" sourcefile="galaxian.c" cloneof="dkongjr" romof="dkongjr"> <description>Donkey Kong Jr. (Moon Cresta hardware)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -7117,9 +7119,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="98"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="98"/> </game> - <game name="ozon1"> + <game name="ozon1" sourcefile="galaxian.c"> <description>Ozon I</description> <year>1983</year> <manufacturer>Proma</manufacturer> @@ -7170,9 +7172,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ladybugg" cloneof="ladybug" romof="ladybug"> + <game name="ladybugg" sourcefile="galaxian.c" cloneof="ladybug" romof="ladybug"> <description>Ladybug (bootleg on Galaxian hardware)</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -7214,9 +7216,9 @@ <dipvalue name="20000" default="yes"/> <dipvalue name="40000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="vpool" cloneof="hustler" romof="hustler"> + <game name="vpool" sourcefile="galaxian.c" cloneof="hustler" romof="hustler"> <description>Video Pool (bootleg on Moon Cresta hardware)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -7282,9 +7284,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="drivfrcg" cloneof="drivfrcp" romof="drivfrcp"> + <game name="drivfrcg" sourcefile="galaxian.c" cloneof="drivfrcp" romof="drivfrcp"> <description>Driving Force (Galaxian conversion)</description> <year>1984</year> <manufacturer>Shinkai Inc. (Magic Eletronics USA licence)</manufacturer> @@ -7370,9 +7372,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="32"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="32"/> </game> - <game name="rockclim"> + <game name="rockclim" sourcefile="galaxian.c"> <description>Rock Climber</description> <year>1981</year> <manufacturer>Taito</manufacturer> @@ -7449,9 +7451,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="scramble"> + <game name="scramble" sourcefile="scramble.c"> <description>Scramble</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -7492,9 +7494,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="scrambls" cloneof="scramble" romof="scramble"> + <game name="scrambls" sourcefile="scramble.c" cloneof="scramble" romof="scramble"> <description>Scramble (Stern)</description> <year>1981</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -7535,9 +7537,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="scramblb" cloneof="scramble" romof="scramble"> + <game name="scramblb" sourcefile="galaxian.c" cloneof="scramble" romof="scramble"> <description>Scramble (Galaxian hardware)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -7573,9 +7575,9 @@ <dipvalue name="5"/> <dipvalue name="255"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="explorer" cloneof="scramble" romof="scramble"> + <game name="explorer" sourcefile="scramble.c" cloneof="scramble" romof="scramble"> <description>Explorer</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -7677,9 +7679,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="atlantis"> + <game name="atlantis" sourcefile="scramble.c"> <description>Battle of Atlantis (set 1)</description> <year>1981</year> <manufacturer>Comsoft</manufacturer> @@ -7715,9 +7717,9 @@ <dipvalue name="A 1/6 B 1/1" default="yes"/> <dipvalue name="A 1/99 B 1/99"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="atlants2" cloneof="atlantis" romof="atlantis"> + <game name="atlants2" sourcefile="scramble.c" cloneof="atlantis" romof="atlantis"> <description>Battle of Atlantis (set 2)</description> <year>1981</year> <manufacturer>Comsoft</manufacturer> @@ -7755,9 +7757,9 @@ <dipvalue name="A 1/6 B 1/1" default="yes"/> <dipvalue name="A 1/99 B 1/99"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="theend"> + <game name="theend" sourcefile="scramble.c"> <description>The End</description> <year>1980</year> <manufacturer>Konami</manufacturer> @@ -7795,9 +7797,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="theends" cloneof="theend" romof="theend"> + <game name="theends" sourcefile="scramble.c" cloneof="theend" romof="theend"> <description>The End (Stern)</description> <year>1980</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -7835,9 +7837,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="omega" cloneof="theend" romof="theend"> + <game name="omega" sourcefile="galaxian.c" cloneof="theend" romof="theend"> <description>Omega</description> <manufacturer>bootleg?</manufacturer> <rom name="omega1.bin" size="2048" crc="fc2a096b" sha1="071ff30060a1aa0a47ae6e88140b80caed00fc4e" region="cpu1" offset="0"/> @@ -7874,9 +7876,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="ckongs" cloneof="ckong" romof="ckong"> + <game name="ckongs" sourcefile="scramble.c" cloneof="ckong" romof="ckong"> <description>Crazy Kong (Scramble hardware)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -7916,9 +7918,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="froggers" cloneof="frogger" romof="frogger"> + <game name="froggers" sourcefile="scramble.c" cloneof="frogger" romof="frogger"> <description>Frog</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -7956,9 +7958,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="amidars" cloneof="amidar" romof="amidar"> + <game name="amidars" sourcefile="scramble.c" cloneof="amidar" romof="amidar"> <description>Amidar (Scramble hardware)</description> <year>1982</year> <manufacturer>Konami</manufacturer> @@ -8008,9 +8010,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="triplep"> + <game name="triplep" sourcefile="scramble.c"> <description>Triple Punch</description> <year>1982</year> <manufacturer>KKI</manufacturer> @@ -8046,9 +8048,9 @@ </dipswitch> <dipswitch name="Rack Test"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="knockout" cloneof="triplep" romof="triplep"> + <game name="knockout" sourcefile="scramble.c" cloneof="triplep" romof="triplep"> <description>Knock Out!!</description> <year>1982</year> <manufacturer>KKK</manufacturer> @@ -8084,9 +8086,9 @@ </dipswitch> <dipswitch name="Rack Test"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mariner"> + <game name="mariner" sourcefile="scramble.c"> <description>Mariner</description> <year>1981</year> <manufacturer>Amenip</manufacturer> @@ -8121,9 +8123,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="114"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="114"/> </game> - <game name="800fath" cloneof="mariner" romof="mariner"> + <game name="800fath" sourcefile="scramble.c" cloneof="mariner" romof="mariner"> <description>800 Fathoms</description> <year>1981</year> <manufacturer>Amenip (US Billiards Inc. license)</manufacturer> @@ -8158,9 +8160,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="114"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="114"/> </game> - <game name="mars"> + <game name="mars" sourcefile="scramble.c"> <description>Mars</description> <year>1981</year> <manufacturer>Artic</manufacturer> @@ -8203,9 +8205,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="255"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="devilfsh"> + <game name="devilfsh" sourcefile="scramble.c"> <description>Devil Fish</description> <year>1982</year> <manufacturer>Artic</manufacturer> @@ -8250,9 +8252,9 @@ <dipvalue name="1 Coin/3 Credits" default="yes"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="newsin7"> + <game name="newsin7" sourcefile="scramble.c"> <description>New Sinbad 7</description> <year>1983</year> <manufacturer>ATW USA, Inc.</manufacturer> @@ -8293,9 +8295,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mrkougar"> + <game name="mrkougar" sourcefile="scramble.c"> <description>Mr. Kougar</description> <year>1984</year> <manufacturer>ATW</manufacturer> @@ -8334,9 +8336,9 @@ <dipvalue name="Hard" default="yes"/> <dipvalue name="Easy"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mrkougr2" cloneof="mrkougar" romof="mrkougar"> + <game name="mrkougr2" sourcefile="scramble.c" cloneof="mrkougar" romof="mrkougar"> <description>Mr. Kougar (earlier)</description> <year>1983</year> <manufacturer>ATW</manufacturer> @@ -8375,9 +8377,9 @@ <dipvalue name="Hard" default="yes"/> <dipvalue name="Easy"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="mrkougb" cloneof="mrkougar" romof="mrkougar"> + <game name="mrkougb" sourcefile="scramble.c" cloneof="mrkougar" romof="mrkougar"> <description>Mr. Kougar (bootleg)</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -8420,9 +8422,9 @@ <dipvalue name="Hard" default="yes"/> <dipvalue name="Easy"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="hotshock"> + <game name="hotshock" sourcefile="scramble.c"> <description>Hot Shocker</description> <year>1982</year> <manufacturer>E.G. Felaco</manufacturer> @@ -8506,9 +8508,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="hunchbks" cloneof="hunchbak" romof="hunchbak"> + <game name="hunchbks" sourcefile="scramble.c" cloneof="hunchbak" romof="hunchbak"> <description>Hunchback (Scramble hardware)</description> <year>1983</year> <manufacturer>Century Electronics</manufacturer> @@ -8549,9 +8551,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="cavelon"> + <game name="cavelon" sourcefile="scramble.c"> <description>Cavelon</description> <year>1983</year> <manufacturer>Jetsoft</manufacturer> @@ -8587,9 +8589,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="sfx"> + <game name="sfx" sourcefile="scramble.c"> <description>SF-X</description> <year>1983</year> <manufacturer>Nichibutsu</manufacturer> @@ -8636,9 +8638,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="mimonscr" cloneof="mimonkey" romof="mimonkey"> + <game name="mimonscr" sourcefile="scramble.c" cloneof="mimonkey" romof="mimonkey"> <description>Mighty Monkey (bootleg on Scramble hardware)</description> <manufacturer>bootleg</manufacturer> <rom name="mm1" size="4096" crc="0399a0c4" sha1="8314124f9b535ce531663625d19cd3a76782ed3b" region="cpu1" offset="0"/> @@ -8683,9 +8685,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="mimonkey"> + <game name="mimonkey" sourcefile="scobra.c"> <description>Mighty Monkey</description> <manufacturer>Universal Video Games</manufacturer> <rom name="mm1.2e" size="4096" crc="9019f1b1" sha1="0c45f64e39b9a182f6162ab520ced6ef0686466c" region="cpu1" offset="0"/> @@ -8732,9 +8734,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="mimonsco" cloneof="mimonkey" romof="mimonkey"> + <game name="mimonsco" sourcefile="scobra.c" cloneof="mimonkey" romof="mimonkey"> <description>Mighty Monkey (bootleg on Super Cobra hardware)</description> <manufacturer>bootleg</manufacturer> <rom name="fra_1a" size="4096" crc="8e7a7379" sha1="06b945a5d237384bfd1b4c9a7449f5a1701a352c" region="cpu1" offset="0"/> @@ -8779,9 +8781,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="scobra"> + <game name="scobra" sourcefile="scobra.c"> <description>Super Cobra</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -8822,9 +8824,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="scobras" cloneof="scobra" romof="scobra"> + <game name="scobras" sourcefile="scobra.c" cloneof="scobra" romof="scobra"> <description>Super Cobra (Stern)</description> <year>1981</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -8865,9 +8867,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="scobrase" cloneof="scobra" romof="scobra"> + <game name="scobrase" sourcefile="scobra.c" cloneof="scobra" romof="scobra"> <description>Super Cobra (Sega)</description> <year>1981</year> <manufacturer>[Konami] (Sega license)</manufacturer> @@ -8908,9 +8910,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="scobrab" cloneof="scobra" romof="scobra"> + <game name="scobrab" sourcefile="scobra.c" cloneof="scobra" romof="scobra"> <description>Super Cobra (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -8952,9 +8954,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="stratgyx"> + <game name="stratgyx" sourcefile="scobra.c"> <description>Strategy X</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -9026,9 +9028,9 @@ <dipvalue name="A 1/99 B 2/1"/> <dipvalue name="A 1/99 B 1/3"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="stratgys" cloneof="stratgyx" romof="stratgyx"> + <game name="stratgys" sourcefile="scobra.c" cloneof="stratgyx" romof="stratgyx"> <description>Strategy X (Stern)</description> <year>1981</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -9100,9 +9102,9 @@ <dipvalue name="A 1/99 B 2/1"/> <dipvalue name="A 1/99 B 1/3"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="armorcar"> + <game name="armorcar" sourcefile="scobra.c"> <description>Armored Car (set 1)</description> <year>1981</year> <manufacturer>Stern</manufacturer> @@ -9153,9 +9155,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="armorca2" cloneof="armorcar" romof="armorcar"> + <game name="armorca2" sourcefile="scobra.c" cloneof="armorcar" romof="armorcar"> <description>Armored Car (set 2)</description> <year>1981</year> <manufacturer>Stern</manufacturer> @@ -9206,9 +9208,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="moonwar"> + <game name="moonwar" sourcefile="scobra.c"> <description>Moonwar</description> <year>1981</year> <manufacturer>Stern</manufacturer> @@ -9244,9 +9246,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="moonwara" cloneof="moonwar" romof="moonwar"> + <game name="moonwara" sourcefile="scobra.c" cloneof="moonwar" romof="moonwar"> <description>Moonwar (older)</description> <year>1981</year> <manufacturer>Stern</manufacturer> @@ -9282,9 +9284,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="spdcoin"> + <game name="spdcoin" sourcefile="scobra.c"> <description>Speed Coin (prototype)</description> <year>1984</year> <manufacturer>Stern</manufacturer> @@ -9322,9 +9324,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="darkplnt"> + <game name="darkplnt" sourcefile="scobra.c"> <description>Dark Planet</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -9365,9 +9367,9 @@ <dipvalue name="100k" default="yes"/> <dipvalue name="200k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="34"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="34"/> </game> - <game name="tazmania"> + <game name="tazmania" sourcefile="scobra.c"> <description>Tazz-Mania (set 1)</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -9418,9 +9420,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="tazmani2" cloneof="tazmania" romof="tazmania"> + <game name="tazmani2" sourcefile="scobra.c" cloneof="tazmania" romof="tazmania"> <description>Tazz-Mania (set 2)</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -9471,9 +9473,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="calipso"> + <game name="calipso" sourcefile="scobra.c"> <description>Calipso</description> <year>1982</year> <manufacturer>[Stern] (Tago license)</manufacturer> @@ -9513,9 +9515,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="anteater"> + <game name="anteater" sourcefile="scobra.c"> <description>Anteater</description> <year>1982</year> <manufacturer>[Stern] (Tago license)</manufacturer> @@ -9565,9 +9567,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="rescue"> + <game name="rescue" sourcefile="scobra.c"> <description>Rescue</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -9630,9 +9632,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="226"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="226"/> </game> - <game name="aponow" cloneof="rescue" romof="rescue"> + <game name="aponow" sourcefile="scobra.c" cloneof="rescue" romof="rescue"> <description>Apocaljpse Now</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -9695,9 +9697,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="226"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="226"/> </game> - <game name="minefld"> + <game name="minefld" sourcefile="scobra.c"> <description>Minefield</description> <year>1983</year> <manufacturer>Stern</manufacturer> @@ -9761,9 +9763,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="354"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="354"/> </game> - <game name="losttomb"> + <game name="losttomb" sourcefile="scobra.c"> <description>Lost Tomb (easy)</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -9826,9 +9828,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="losttmbh" cloneof="losttomb" romof="losttomb"> + <game name="losttmbh" sourcefile="scobra.c" cloneof="losttomb" romof="losttomb"> <description>Lost Tomb (hard)</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -9891,9 +9893,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="superbon"> + <game name="superbon" sourcefile="scobra.c"> <description>Super Bond</description> <manufacturer>bootleg</manufacturer> <rom name="2d.cpu" size="4096" crc="60c0ba18" sha1="6ad09e01dd3c86c8d9c465916227c9b00f38e025" region="cpu1" offset="0"/> @@ -9967,9 +9969,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="99"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="99"/> </game> - <game name="hustler"> + <game name="hustler" sourcefile="scobra.c"> <description>Video Hustler</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -10003,9 +10005,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="billiard" cloneof="hustler" romof="hustler"> + <game name="billiard" sourcefile="scobra.c" cloneof="hustler" romof="hustler"> <description>The Billiards</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -10039,9 +10041,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="hustlerb" cloneof="hustler" romof="hustler"> + <game name="hustlerb" sourcefile="scobra.c" cloneof="hustler" romof="hustler"> <description>Video Hustler (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -10075,9 +10077,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="98"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="98"/> </game> - <game name="frogger"> + <game name="frogger" sourcefile="frogger.c"> <description>Frogger</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -10112,9 +10114,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="frogseg1" cloneof="frogger" romof="frogger"> + <game name="frogseg1" sourcefile="frogger.c" cloneof="frogger" romof="frogger"> <description>Frogger (Sega set 1)</description> <year>1981</year> <manufacturer>[Konami] (Sega license)</manufacturer> @@ -10149,9 +10151,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="frogseg2" cloneof="frogger" romof="frogger"> + <game name="frogseg2" sourcefile="frogger.c" cloneof="frogger" romof="frogger"> <description>Frogger (Sega set 2)</description> <year>1981</year> <manufacturer>[Konami] (Sega license)</manufacturer> @@ -10187,9 +10189,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="froggrmc" cloneof="frogger" romof="frogger"> + <game name="froggrmc" sourcefile="galaxian.c" cloneof="frogger" romof="frogger"> <description>Frogger (Moon Cresta hardware)</description> <year>1981</year> <manufacturer>bootleg?</manufacturer> @@ -10224,9 +10226,9 @@ <dipvalue name="A 1/1 B 1/1 C 1/1" default="yes"/> <dipvalue name="A 1/1 B 1/6 C 1/1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="99"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="99"/> </game> - <game name="amidar"> + <game name="amidar" sourcefile="amidar.c"> <description>Amidar</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -10308,9 +10310,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disable All Coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="amidaru" cloneof="amidar" romof="amidar"> + <game name="amidaru" sourcefile="amidar.c" cloneof="amidar" romof="amidar"> <description>Amidar (Stern)</description> <year>1982</year> <manufacturer>Konami (Stern license)</manufacturer> @@ -10393,9 +10395,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disable All Coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="amidaro" cloneof="amidar" romof="amidar"> + <game name="amidaro" sourcefile="amidar.c" cloneof="amidar" romof="amidar"> <description>Amidar (Olympia)</description> <year>1982</year> <manufacturer>Konami (Olympia license)</manufacturer> @@ -10478,9 +10480,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disable All Coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="amigo" cloneof="amidar" romof="amidar"> + <game name="amigo" sourcefile="amidar.c" cloneof="amidar" romof="amidar"> <description>Amigo</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -10562,9 +10564,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disable All Coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="turtles"> + <game name="turtles" sourcefile="amidar.c"> <description>Turtles</description> <year>1981</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -10609,9 +10611,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="turpin" cloneof="turtles" romof="turtles"> + <game name="turpin" sourcefile="amidar.c" cloneof="turtles" romof="turtles"> <description>Turpin</description> <year>1981</year> <manufacturer>[Konami] (Sega license)</manufacturer> @@ -10656,9 +10658,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="600" cloneof="turtles" romof="turtles"> + <game name="600" sourcefile="amidar.c" cloneof="turtles" romof="turtles"> <description>600</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -10703,9 +10705,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="106"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="106"/> </game> - <game name="flyboy"> + <game name="flyboy" sourcefile="fastfred.c"> <description>Fly-Boy</description> <year>1982</year> <manufacturer>Kaneko</manufacturer> @@ -10762,9 +10764,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="flyboyb" cloneof="flyboy" romof="flyboy"> + <game name="flyboyb" sourcefile="fastfred.c" cloneof="flyboy" romof="flyboy"> <description>Fly-Boy (bootleg)</description> <year>1982</year> <manufacturer>Kaneko</manufacturer> @@ -10821,9 +10823,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="fastfred" cloneof="flyboy" romof="flyboy"> + <game name="fastfred" sourcefile="fastfred.c" cloneof="flyboy" romof="flyboy"> <description>Fast Freddie</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -10890,9 +10892,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="jumpcoas"> + <game name="jumpcoas" sourcefile="fastfred.c"> <description>Jump Coaster</description> <year>1983</year> <manufacturer>Kaneko</manufacturer> @@ -10937,9 +10939,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="boggy84"> + <game name="boggy84" sourcefile="fastfred.c"> <description>Boggy '84</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -11016,9 +11018,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="redrobin"> + <game name="redrobin" sourcefile="fastfred.c"> <description>Red Robin</description> <year>1986</year> <manufacturer>Elettronolo</manufacturer> @@ -11078,9 +11080,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="imago"> + <game name="imago" sourcefile="fastfred.c"> <description>Imago</description> <year>1983</year> <manufacturer>Acom</manufacturer> @@ -11137,9 +11139,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="256"/> + <driver status="good" color="preliminary" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="cclimber"> + <game name="cclimber" sourcefile="cclimber.c"> <description>Crazy Climber (US)</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -11193,9 +11195,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="cclimbrj" cloneof="cclimber" romof="cclimber"> + <game name="cclimbrj" sourcefile="cclimber.c" cloneof="cclimber" romof="cclimber"> <description>Crazy Climber (Japan)</description> <year>1980</year> <manufacturer>Nichibutsu</manufacturer> @@ -11249,9 +11251,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ccboot" cloneof="cclimber" romof="cclimber"> + <game name="ccboot" sourcefile="cclimber.c" cloneof="cclimber" romof="cclimber"> <description>Crazy Climber (bootleg set 1)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -11306,9 +11308,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ccboot2" cloneof="cclimber" romof="cclimber"> + <game name="ccboot2" sourcefile="cclimber.c" cloneof="cclimber" romof="cclimber"> <description>Crazy Climber (bootleg set 2)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -11363,9 +11365,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ckong"> + <game name="ckong" sourcefile="cclimber.c"> <description>Crazy Kong (set 1)</description> <year>1981</year> <manufacturer>Falcon</manufacturer> @@ -11418,9 +11420,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ckonga" cloneof="ckong" romof="ckong"> + <game name="ckonga" sourcefile="cclimber.c" cloneof="ckong" romof="ckong"> <description>Crazy Kong (set 2)</description> <year>1981</year> <manufacturer>Falcon</manufacturer> @@ -11473,9 +11475,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ckongjeu" cloneof="ckong" romof="ckong"> + <game name="ckongjeu" sourcefile="cclimber.c" cloneof="ckong" romof="ckong"> <description>Crazy Kong (Jeutel bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -11528,9 +11530,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ckongo" cloneof="ckong" romof="ckong"> + <game name="ckongo" sourcefile="cclimber.c" cloneof="ckong" romof="ckong"> <description>Crazy Kong (Orca bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -11582,9 +11584,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="ckongalc" cloneof="ckong" romof="ckong"> + <game name="ckongalc" sourcefile="cclimber.c" cloneof="ckong" romof="ckong"> <description>Crazy Kong (Alca bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -11636,9 +11638,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="monkeyd" cloneof="ckong" romof="ckong"> + <game name="monkeyd" sourcefile="cclimber.c" cloneof="ckong" romof="ckong"> <description>Monkey Donkey</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -11690,9 +11692,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="rpatrolb"> + <game name="rpatrolb" sourcefile="cclimber.c"> <description>River Patrol (bootleg)</description> <manufacturer>bootleg</manufacturer> <rom name="rp1.4l" size="4096" crc="bfd7ae7a" sha1="a06d1cc2674ed40d0bfa67dd6d724964c1e40600" region="cpu1" offset="0"/> @@ -11743,9 +11745,9 @@ <dipvalue name="Retry on Error"/> <dipvalue name="Stop on Error" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="silvland" cloneof="rpatrolb" romof="rpatrolb"> + <game name="silvland" sourcefile="cclimber.c" cloneof="rpatrolb" romof="rpatrolb"> <description>Silver Land</description> <manufacturer>Falcon</manufacturer> <rom name="7.2r" size="4096" crc="57e6be62" sha1="c1d47970f8209256c9ccd6512b921dec6c276998" region="cpu1" offset="0"/> @@ -11797,9 +11799,9 @@ <dipvalue name="Retry on Error"/> <dipvalue name="Stop on Error" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="yamato"> + <game name="yamato" sourcefile="yamato.c"> <description>Yamato (US)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -11854,9 +11856,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="yamato2" cloneof="yamato" romof="yamato"> + <game name="yamato2" sourcefile="yamato.c" cloneof="yamato" romof="yamato"> <description>Yamato (World?)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -11910,9 +11912,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="swimmer"> + <game name="swimmer" sourcefile="cclimber.c"> <description>Swimmer (set 1)</description> <year>1982</year> <manufacturer>Tehkan</manufacturer> @@ -11979,9 +11981,9 @@ <dipvalue name="Harder"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="290"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="290"/> </game> - <game name="swimmera" cloneof="swimmer" romof="swimmer"> + <game name="swimmera" sourcefile="cclimber.c" cloneof="swimmer" romof="swimmer"> <description>Swimmer (set 2)</description> <year>1982</year> <manufacturer>Tehkan</manufacturer> @@ -12048,9 +12050,9 @@ <dipvalue name="Harder"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="290"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="290"/> </game> - <game name="swimmerb" cloneof="swimmer" romof="swimmer"> + <game name="swimmerb" sourcefile="cclimber.c" cloneof="swimmer" romof="swimmer"> <description>Swimmer (set 3)</description> <year>1982</year> <manufacturer>Tehkan</manufacturer> @@ -12115,9 +12117,9 @@ <dipvalue name="Easy"/> <dipvalue name="Hard" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="290"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="290"/> </game> - <game name="guzzler"> + <game name="guzzler" sourcefile="cclimber.c"> <description>Guzzler</description> <year>1983</year> <manufacturer>Tehkan</manufacturer> @@ -12181,9 +12183,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="290"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="290"/> </game> - <game name="cannonb"> + <game name="cannonb" sourcefile="cclimber.c"> <description>Cannon Ball (Crazy Climber hardware)</description> <year>1985</year> <manufacturer>Soft</manufacturer> @@ -12238,9 +12240,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="gomoku"> + <game name="gomoku" sourcefile="gomoku.c"> <description>Gomoku Narabe Renju</description> <year>1981</year> <manufacturer>Nichibutsu</manufacturer> @@ -12290,9 +12292,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="wiping"> + <game name="wiping" sourcefile="wiping.c"> <description>Wiping</description> <year>1982</year> <manufacturer>Nichibutsu</manufacturer> @@ -12350,9 +12352,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="rugrats" cloneof="wiping" romof="wiping"> + <game name="rugrats" sourcefile="wiping.c" cloneof="wiping" romof="wiping"> <description>Rug Rats</description> <year>1983</year> <manufacturer>Nichibutsu</manufacturer> @@ -12410,9 +12412,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="friskyt"> + <game name="friskyt" sourcefile="seicross.c"> <description>Frisky Tom (set 1)</description> <year>1981</year> <manufacturer>Nichibutsu</manufacturer> @@ -12451,9 +12453,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="friskyta" cloneof="friskyt" romof="friskyt"> + <game name="friskyta" sourcefile="seicross.c" cloneof="friskyt" romof="friskyt"> <description>Frisky Tom (set 2)</description> <year>1981</year> <manufacturer>Nichibutsu</manufacturer> @@ -12492,9 +12494,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="radrad"> + <game name="radrad" sourcefile="seicross.c"> <description>Radical Radial</description> <year>1982</year> <manufacturer>Nichibutsu USA</manufacturer> @@ -12565,9 +12567,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="seicross"> + <game name="seicross" sourcefile="seicross.c"> <description>Seicross</description> <year>1984</year> <manufacturer>Nichibutsu + Alice</manufacturer> @@ -12644,9 +12646,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sectrzon" cloneof="seicross" romof="seicross"> + <game name="sectrzon" sourcefile="seicross.c" cloneof="seicross" romof="seicross"> <description>Sector Zone</description> <year>1984</year> <manufacturer>Nichibutsu + Alice</manufacturer> @@ -12723,9 +12725,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="firebatl"> + <game name="firebatl" sourcefile="clshroad.c"> <description>Fire Battle</description> <year>1984</year> <manufacturer>Taito</manufacturer> @@ -12824,9 +12826,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="512"/> </game> - <game name="clshroad"> + <game name="clshroad" sourcefile="clshroad.c"> <description>Clash-Road</description> <year>1986</year> <manufacturer>Woodplace Inc.</manufacturer> @@ -12912,9 +12914,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tubep"> + <game name="tubep" sourcefile="tubep.c"> <description>Tube Panic</description> <year>1984</year> <manufacturer>Nichibutsu + Fujitek</manufacturer> @@ -13048,9 +13050,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16416"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16416"/> </game> - <game name="rjammer"> + <game name="rjammer" sourcefile="tubep.c"> <description>Roller Jammer</description> <year>1984</year> <manufacturer>Nichibutsu + Alice</manufacturer> @@ -13159,9 +13161,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="magmax"> + <game name="magmax" sourcefile="magmax.c"> <description>Mag Max</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -13261,9 +13263,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cop01"> + <game name="cop01" sourcefile="cop01.c"> <description>Cop 01 (set 1)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -13352,9 +13354,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cop01a" cloneof="cop01" romof="cop01"> + <game name="cop01a" sourcefile="cop01.c" cloneof="cop01" romof="cop01"> <description>Cop 01 (set 2)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -13443,9 +13445,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mightguy"> + <game name="mightguy" sourcefile="cop01.c"> <description>Mighty Guy</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -13521,9 +13523,9 @@ <dipvalue name="3"/> <dipvalue name="4"/> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="256"/> + <driver status="protection" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="terracre"> + <game name="terracre" sourcefile="terracre.c"> <description>Terra Cresta (YM3526 set 1)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -13612,9 +13614,9 @@ </dipswitch> <dipswitch name="Base Ship Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="terracrb" cloneof="terracre" romof="terracre"> + <game name="terracrb" sourcefile="terracre.c" cloneof="terracre" romof="terracre"> <description>Terra Cresta (YM3526 set 2)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -13703,9 +13705,9 @@ </dipswitch> <dipswitch name="Base Ship Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="terracra" cloneof="terracre" romof="terracre"> + <game name="terracra" sourcefile="terracre.c" cloneof="terracre" romof="terracre"> <description>Terra Cresta (YM2203)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -13793,9 +13795,9 @@ </dipswitch> <dipswitch name="Base Ship Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="amazon"> + <game name="amazon" sourcefile="terracre.c"> <description>Soldier Girl Amazon</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -13886,9 +13888,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="amatelas" cloneof="amazon" romof="amazon"> + <game name="amatelas" sourcefile="terracre.c" cloneof="amazon" romof="amazon"> <description>Sei Senshi Amatelass</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -13979,9 +13981,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="horekid"> + <game name="horekid" sourcefile="terracre.c"> <description>Kid no Hore Hore Daisakusen</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -14063,9 +14065,9 @@ </dipswitch> <dipswitch name="Debug Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="horekidb" cloneof="horekid" romof="horekid"> + <game name="horekidb" sourcefile="terracre.c" cloneof="horekid" romof="horekid"> <description>Kid no Hore Hore Daisakusen (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -14147,9 +14149,9 @@ </dipswitch> <dipswitch name="Debug Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galivan"> + <game name="galivan" sourcefile="galivan.c"> <description>Galivan - Cosmo Police (12/16/1985)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -14234,9 +14236,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galivan2" cloneof="galivan" romof="galivan"> + <game name="galivan2" sourcefile="galivan.c" cloneof="galivan" romof="galivan"> <description>Galivan - Cosmo Police (12/11/1985)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -14321,9 +14323,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dangar"> + <game name="dangar" sourcefile="galivan.c"> <description>Dangar - Ufo Robo (12/1/1986)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -14408,9 +14410,9 @@ <dipvalue name="5 Times"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dangar2" cloneof="dangar" romof="dangar"> + <game name="dangar2" sourcefile="galivan.c" cloneof="dangar" romof="dangar"> <description>Dangar - Ufo Robo (9/26/1986)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -14493,9 +14495,9 @@ </dipswitch> <dipswitch name="Base Ship Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dangarb" cloneof="dangar" romof="dangar"> + <game name="dangarb" sourcefile="galivan.c" cloneof="dangar" romof="dangar"> <description>Dangar - Ufo Robo (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -14578,9 +14580,9 @@ </dipswitch> <dipswitch name="Base Ship Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ninjemak"> + <game name="ninjemak" sourcefile="galivan.c"> <description>Ninja Emaki (US)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -14698,9 +14700,9 @@ <dipvalue name="5 Times"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="youma" cloneof="ninjemak" romof="ninjemak"> + <game name="youma" sourcefile="galivan.c" cloneof="ninjemak" romof="ninjemak"> <description>Youma Ninpou Chou (Japan)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -14818,9 +14820,9 @@ <dipvalue name="5 Times"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="legion"> + <game name="legion" sourcefile="armedf.c"> <description>Legion (ver 2.03)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -14829,6 +14831,7 @@ <rom name="legion.1b" size="65536" crc="c306660a" sha1="31c6b868ba07677b5110c577335873354bff596f" region="cpu1" offset="20001"/> <rom name="legion.1d" size="65536" crc="c2e45e1e" sha1="95cc359145b1b03123262891feed358407ba105a" region="cpu1" offset="20000"/> <rom name="legion.1h" size="16384" crc="2ca4f7f0" sha1="7cf997af9dd74ced9d28c047069ccfb67d72e257" region="cpu2" offset="0"/> + <rom name="legion.1i" size="32768" crc="79f4a827" sha1="25e4c1b5b8466627244b7226310e67e4261333b6" region="cpu2" offset="4000"/> <rom name="lg8.bin" size="32768" crc="e0596570" sha1="68ddc950efc55a16e6abc699e3bad18ea19d579f" region="gfx1" dispose="yes" offset="0"/> <rom name="legion.1e" size="65536" crc="a9d70faf" sha1="8b8b60ae49c55e931d6838e863463f6b2bf7adb0" region="gfx2" dispose="yes" offset="0"/> <rom name="legion.1f" size="32768" crc="f018313b" sha1="860bc9937202dc3a40c9fa7caad11c2c2aa19f5c" region="gfx2" dispose="yes" offset="18000"/> @@ -14836,7 +14839,6 @@ <rom name="legion.1k" size="65536" crc="ff5a0db9" sha1="9308deb363d3b7686cc69485ec14201dd68f9a97" region="gfx4" dispose="yes" offset="0"/> <rom name="legion.1j" size="65536" crc="bae220c8" sha1="392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df" region="gfx4" dispose="yes" offset="10000"/> <rom name="lg7.bin" size="16384" crc="533e2b58" sha1="a13ea4a530038760ffa87713903c59a932452717" region="gfx5" offset="0"/> - <rom name="legion.1i" size="32768" crc="79f4a827" sha1="25e4c1b5b8466627244b7226310e67e4261333b6" region="user1" offset="0"/> <chip type="cpu" name="68000" clock="8000000"/> <chip type="cpu" soundonly="yes" name="Z80" clock="3072000"/> <chip type="audio" name="YM3812" clock="4000000"/> @@ -14905,9 +14907,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="legiono" cloneof="legion" romof="legion"> + <game name="legiono" sourcefile="armedf.c" cloneof="legion" romof="legion"> <description>Legion (ver 1.05)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -14916,13 +14918,13 @@ <rom name="legion.1b" merge="legion.1b" size="65536" crc="c306660a" sha1="31c6b868ba07677b5110c577335873354bff596f" region="cpu1" offset="20001"/> <rom name="legion.1d" merge="legion.1d" size="65536" crc="c2e45e1e" sha1="95cc359145b1b03123262891feed358407ba105a" region="cpu1" offset="20000"/> <rom name="legion.1h" merge="legion.1h" size="16384" crc="2ca4f7f0" sha1="7cf997af9dd74ced9d28c047069ccfb67d72e257" region="cpu2" offset="0"/> + <rom name="legion.1i" merge="legion.1i" size="32768" crc="79f4a827" sha1="25e4c1b5b8466627244b7226310e67e4261333b6" region="cpu2" offset="4000"/> <rom name="legion.1g" size="32768" crc="c50b0125" sha1="83b5e9707152d97777fb65fa8820ba34ec2fac8d" region="gfx1" dispose="yes" offset="0"/> <rom name="legion.1e" merge="legion.1e" size="65536" crc="a9d70faf" sha1="8b8b60ae49c55e931d6838e863463f6b2bf7adb0" region="gfx2" dispose="yes" offset="0"/> <rom name="legion.1f" merge="legion.1f" size="32768" crc="f018313b" sha1="860bc9937202dc3a40c9fa7caad11c2c2aa19f5c" region="gfx2" dispose="yes" offset="18000"/> <rom name="legion.1l" merge="legion.1l" size="65536" crc="29b8adaa" sha1="10338ebe7324960683de1f796dd311ed662e42b4" region="gfx3" dispose="yes" offset="0"/> <rom name="legion.1k" merge="legion.1k" size="65536" crc="ff5a0db9" sha1="9308deb363d3b7686cc69485ec14201dd68f9a97" region="gfx4" dispose="yes" offset="0"/> <rom name="legion.1j" merge="legion.1j" size="65536" crc="bae220c8" sha1="392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df" region="gfx4" dispose="yes" offset="10000"/> - <rom name="legion.1i" merge="legion.1i" size="32768" crc="79f4a827" sha1="25e4c1b5b8466627244b7226310e67e4261333b6" region="user1" offset="0"/> <chip type="cpu" name="68000" clock="8000000"/> <chip type="cpu" soundonly="yes" name="Z80" clock="3072000"/> <chip type="audio" name="YM3812" clock="4000000"/> @@ -14991,9 +14993,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="terraf"> + <game name="terraf" sourcefile="armedf.c"> <description>Terra Force</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -15075,9 +15077,9 @@ <dipvalue name="5 Times"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="terrafu" cloneof="terraf" romof="terraf"> + <game name="terrafu" sourcefile="armedf.c" cloneof="terraf" romof="terraf"> <description>Terra Force (US)</description> <year>1987</year> <manufacturer>Nichibutsu USA</manufacturer> @@ -15159,9 +15161,9 @@ <dipvalue name="5 Times"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="kodure"> + <game name="kodure" sourcefile="armedf.c"> <description>Kodure Ookami (Japan)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -15246,9 +15248,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="armedf"> + <game name="armedf" sourcefile="armedf.c"> <description>Armed Formation</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -15328,9 +15330,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cclimbr2"> + <game name="cclimbr2" sourcefile="armedf.c"> <description>Crazy Climber 2 (Japan)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -15416,9 +15418,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hyhoo"> + <game name="hyhoo" sourcefile="hyhoo.c"> <description>Taisen Quiz HYHOO (Japan)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -15485,9 +15487,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="hyhoo2"> + <game name="hyhoo2" sourcefile="hyhoo.c"> <description>Taisen Quiz HYHOO 2 (Japan)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -15544,9 +15546,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="pastelgl"> + <game name="pastelgl" sourcefile="pastelgl.c"> <description>Pastel Gal (Japan 851224)</description> <year>1985</year> <manufacturer>Nichibutsu</manufacturer> @@ -15657,9 +15659,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="crystalg"> + <game name="crystalg" sourcefile="nbmj8688.c"> <description>Crystal Gal (Japan 860512)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -15749,9 +15751,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="crystal2"> + <game name="crystal2" sourcefile="nbmj8688.c"> <description>Crystal Gal 2 (Japan 860620)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -15838,9 +15840,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="citylove"> + <game name="citylove" sourcefile="nbmj8688.c"> <description>City Love (Japan 860908)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -15926,9 +15928,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="apparel"> + <game name="apparel" sourcefile="nbmj8688.c"> <description>Apparel Night (Japan 860929)</description> <year>1986</year> <manufacturer>Central Denshi</manufacturer> @@ -16017,9 +16019,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="secolove"> + <game name="secolove" sourcefile="nbmj8688.c"> <description>Second Love (Japan 861201)</description> <year>1986</year> <manufacturer>Nichibutsu</manufacturer> @@ -16101,9 +16103,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="housemnq"> + <game name="housemnq" sourcefile="nbmj8688.c"> <description>House Mannequin (Japan 870217)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16181,9 +16183,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="housemn2"> + <game name="housemn2" sourcefile="nbmj8688.c"> <description>House Mannequin Roppongi Live hen (Japan 870418)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16257,9 +16259,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="seiha"> + <game name="seiha" sourcefile="nbmj8688.c"> <description>Seiha (Japan 870725)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16346,9 +16348,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="seiham" cloneof="seiha" romof="seiha"> + <game name="seiham" sourcefile="nbmj8688.c" cloneof="seiha" romof="seiha"> <description>Seiha [BET] (Japan 870723)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16432,9 +16434,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="bijokkoy"> + <game name="bijokkoy" sourcefile="nbmj8688.c"> <description>Bijokko Yume Monogatari (Japan 870925)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16517,9 +16519,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="iemoto"> + <game name="iemoto" sourcefile="nbmj8688.c"> <description>Iemoto (Japan 871020)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16602,9 +16604,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="ojousan"> + <game name="ojousan" sourcefile="nbmj8688.c"> <description>Ojousan (Japan 871204)</description> <year>1987</year> <manufacturer>Nichibutsu</manufacturer> @@ -16689,9 +16691,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="bijokkog"> + <game name="bijokkog" sourcefile="nbmj8688.c"> <description>Bijokko Gakuen (Japan 880116)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -16779,9 +16781,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="orangec"> + <game name="orangec" sourcefile="nbmj8688.c"> <description>Orange Club - Maruhi Kagai Jugyou (Japan 880213)</description> <year>1988</year> <manufacturer>Daiichi Denshi</manufacturer> @@ -16872,9 +16874,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="vipclub" cloneof="orangec" romof="orangec"> + <game name="vipclub" sourcefile="nbmj8688.c" cloneof="orangec" romof="orangec"> <description>Vip Club [BET] (Japan 880310)</description> <year>1988</year> <manufacturer>Daiichi Denshi</manufacturer> @@ -16965,9 +16967,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="korinai"> + <game name="korinai" sourcefile="nbmj8688.c"> <description>Mahjong-zukino Korinai Menmen (Japan 880425)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -17057,9 +17059,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="kaguya"> + <game name="kaguya" sourcefile="nbmj8688.c"> <description>Mahjong Kaguyahime [BET] (Japan 880521)</description> <year>1988</year> <manufacturer>MIKI SYOUJI</manufacturer> @@ -17138,9 +17140,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="otonano"> + <game name="otonano" sourcefile="nbmj8688.c"> <description>Otona no Mahjong (Japan 880628)</description> <year>1988</year> <manufacturer>Apple</manufacturer> @@ -17227,9 +17229,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kanatuen"> + <game name="kanatuen" sourcefile="nbmj8688.c"> <description>Kanatsuen no Onna [BET] (Japan 880905)</description> <year>1988</year> <manufacturer>Panac</manufacturer> @@ -17318,9 +17320,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjsikaku"> + <game name="mjsikaku" sourcefile="nbmj8688.c"> <description>Mahjong Shikaku (Japan 880908)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -17407,9 +17409,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjsikakb" cloneof="mjsikaku" romof="mjsikaku"> + <game name="mjsikakb" sourcefile="nbmj8688.c" cloneof="mjsikaku" romof="mjsikaku"> <description>Mahjong Shikaku (Japan 880722)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -17494,9 +17496,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjcamera"> + <game name="mjcamera" sourcefile="nbmj8688.c"> <description>Mahjong Camera Kozou (Japan 881109)</description> <year>1988</year> <manufacturer>MIKI SYOUJI</manufacturer> @@ -17589,9 +17591,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mmcamera" cloneof="mjcamera" romof="mjcamera"> + <game name="mmcamera" sourcefile="nbmj8891.c" cloneof="mjcamera" romof="mjcamera"> <description>(Medal) Mahjong Camera Kozou [BET] (Japan 890509)</description> <year>1989</year> <manufacturer>MIKI SYOUJI</manufacturer> @@ -17686,9 +17688,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="idhimitu"> + <game name="idhimitu" sourcefile="nbmj8688.c"> <description>Idol no Himitsu [BET] (Japan 890304)</description> <year>1989</year> <manufacturer>Digital Soft</manufacturer> @@ -17778,9 +17780,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="msjiken"> + <game name="msjiken" sourcefile="nbmj8891.c"> <description>Mahjong Satsujin Jiken (Japan 881017)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -17873,9 +17875,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hanamomo"> + <game name="hanamomo" sourcefile="nbmj8891.c"> <description>Mahjong Hana no Momoko gumi (Japan 881201)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -17972,9 +17974,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="telmahjn"> + <game name="telmahjn" sourcefile="nbmj8891.c"> <description>Telephone Mahjong (Japan 890111)</description> <year>1988</year> <manufacturer>Nichibutsu</manufacturer> @@ -18068,9 +18070,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gionbana"> + <game name="gionbana" sourcefile="nbmj8891.c"> <description>Gionbana (Japan 890120)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -18158,9 +18160,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjfocus"> + <game name="mjfocus" sourcefile="nbmj8891.c"> <description>Mahjong Focus (Japan 890313)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -18256,9 +18258,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjfocusm" cloneof="mjfocus" romof="mjfocus"> + <game name="mjfocusm" sourcefile="nbmj8891.c" cloneof="mjfocus" romof="mjfocus"> <description>Mahjong Focus [BET] (Japan 890510)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -18348,9 +18350,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="peepshow" cloneof="mjfocus" romof="mjfocus"> + <game name="peepshow" sourcefile="nbmj8891.c" cloneof="mjfocus" romof="mjfocus"> <description>Nozokimeguri Mahjong Peep Show (Japan 890404)</description> <year>1989</year> <manufacturer>AC</manufacturer> @@ -18444,9 +18446,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="scandal"> + <game name="scandal" sourcefile="nbmj8891.c"> <description>Scandal Mahjong (Japan 890213)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -18535,9 +18537,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="scandalm" cloneof="scandal" romof="scandal"> + <game name="scandalm" sourcefile="nbmj8891.c" cloneof="scandal" romof="scandal"> <description>Scandal Mahjong [BET] (Japan 890217)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -18622,9 +18624,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mgmen89"> + <game name="mgmen89" sourcefile="nbmj8891.c"> <description>Mahjong G-MEN'89 (Japan 890425)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -18716,9 +18718,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjnanpas"> + <game name="mjnanpas" sourcefile="nbmj8891.c"> <description>Mahjong Nanpa Story (Japan 890713)</description> <year>1989</year> <manufacturer>BROOKS</manufacturer> @@ -18816,9 +18818,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjnanpaa" cloneof="mjnanpas" romof="mjnanpas"> + <game name="mjnanpaa" sourcefile="nbmj8891.c" cloneof="mjnanpas" romof="mjnanpas"> <description>Mahjong Nanpa Story (Japan 890712)</description> <year>1989</year> <manufacturer>BROOKS</manufacturer> @@ -18916,9 +18918,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjnanpau" cloneof="mjnanpas" romof="mjnanpas"> + <game name="mjnanpau" sourcefile="nbmj8891.c" cloneof="mjnanpas" romof="mjnanpas"> <description>Mahjong Nanpa Story (Ura) (Japan 890805)</description> <year>1989</year> <manufacturer>BROOKS</manufacturer> @@ -19016,9 +19018,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pairsten"> + <game name="pairsten" sourcefile="nbmj8891.c"> <description>Pairs (System Ten) (Japan 890826)</description> <year>1989</year> <manufacturer>System Ten</manufacturer> @@ -19111,9 +19113,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="bananadr"> + <game name="bananadr" sourcefile="nbmj8891.c"> <description>Mahjong Banana Dream [BET] (Japan 891124)</description> <year>1989</year> <manufacturer>Digital Soft</manufacturer> @@ -19211,9 +19213,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mladyhtr"> + <game name="mladyhtr" sourcefile="nbmj8891.c"> <description>Mahjong THE LADY HUNTER (Japan 900509)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -19309,9 +19311,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="chinmoku"> + <game name="chinmoku" sourcefile="nbmj8891.c"> <description>Mahjong Chinmoku no Hentai (Japan 900511)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -19407,9 +19409,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="maiko"> + <game name="maiko" sourcefile="nbmj8891.c"> <description>Maikobana (Japan 900802)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -19492,9 +19494,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="club90s"> + <game name="club90s" sourcefile="nbmj8891.c"> <description>Mahjong CLUB 90's (set 1) (Japan 900919)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -19579,9 +19581,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="club90sa" cloneof="club90s" romof="club90s"> + <game name="club90sa" sourcefile="nbmj8891.c" cloneof="club90s" romof="club90s"> <description>Mahjong CLUB 90's (set 2) (Japan 900919)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -19666,9 +19668,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hanaoji"> + <game name="hanaoji" sourcefile="nbmj8891.c"> <description>Hana to Ojisan [BET] (Japan 911209)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -19755,9 +19757,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pstadium"> + <game name="pstadium" sourcefile="nbmj8991.c"> <description>Mahjong Panic Stadium (Japan)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -19853,9 +19855,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="triplew1"> + <game name="triplew1" sourcefile="nbmj8991.c"> <description>Mahjong Triple Wars (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -19954,9 +19956,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="triplew2"> + <game name="triplew2" sourcefile="nbmj8991.c"> <description>Mahjong Triple Wars 2 (Japan)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -20053,9 +20055,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ntopstar"> + <game name="ntopstar" sourcefile="nbmj8991.c"> <description>Mahjong Nerae! Top Star (Japan)</description> <year>1990</year> <manufacturer>Nichibutsu</manufacturer> @@ -20152,9 +20154,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjlstory"> + <game name="mjlstory" sourcefile="nbmj8991.c"> <description>Mahjong Jikken Love Story (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -20246,9 +20248,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vanilla"> + <game name="vanilla" sourcefile="nbmj8991.c"> <description>Mahjong Vanilla Syndrome (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -20347,9 +20349,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="finalbny" cloneof="vanilla" romof="vanilla"> + <game name="finalbny" sourcefile="nbmj8991.c" cloneof="vanilla" romof="vanilla"> <description>Mahjong Final Bunny [BET] (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -20440,9 +20442,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="qmhayaku"> + <game name="qmhayaku" sourcefile="nbmj8991.c"> <description>Quiz-Mahjong Hayaku Yatteyo! (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -20538,9 +20540,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galkoku"> + <game name="galkoku" sourcefile="nbmj8991.c"> <description>Mahjong Gal no Kokuhaku (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu/T.R.TEC</manufacturer> @@ -20634,9 +20636,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hyouban" cloneof="galkoku" romof="galkoku"> + <game name="hyouban" sourcefile="nbmj8991.c" cloneof="galkoku" romof="galkoku"> <description>Mahjong Hyouban Musume [BET] (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu/T.R.TEC</manufacturer> @@ -20732,9 +20734,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galkaika"> + <game name="galkaika" sourcefile="nbmj8991.c"> <description>Mahjong Gal no Kaika (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu/T.R.TEC</manufacturer> @@ -20823,9 +20825,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tokyogal"> + <game name="tokyogal" sourcefile="nbmj8991.c"> <description>Tokyo Gal Zukan (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -20923,9 +20925,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tokimbsj" cloneof="tokyogal" romof="tokyogal"> + <game name="tokimbsj" sourcefile="nbmj8991.c" cloneof="tokyogal" romof="tokyogal"> <description>Tokimeki Bishoujo [BET] (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -21023,9 +21025,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mcontest"> + <game name="mcontest" sourcefile="nbmj8991.c"> <description>Miss Mahjong Contest (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -21124,9 +21126,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="uchuuai"> + <game name="uchuuai" sourcefile="nbmj8991.c"> <description>Mahjong Uchuu yori Ai wo komete (Japan)</description> <year>1989</year> <manufacturer>Nichibutsu</manufacturer> @@ -21224,9 +21226,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="av2mj1bb"> + <game name="av2mj1bb" sourcefile="nbmj8991.c"> <description>AV2Mahjong No.1 Bay Bridge no Seijo (Japan)</description> <year>1991</year> <manufacturer>MIKI SYOUJI/AV JAPAN</manufacturer> @@ -21305,9 +21307,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="av2mj2rg"> + <game name="av2mj2rg" sourcefile="nbmj8991.c"> <description>AV2Mahjong No.2 Rouge no Kaori (Japan)</description> <year>1991</year> <manufacturer>MIKI SYOUJI/AV JAPAN</manufacturer> @@ -21389,9 +21391,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjuraden"> + <game name="mjuraden" sourcefile="nbmj9195.c"> <description>Mahjong Uranai Densetsu (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu/Yubis</manufacturer> @@ -21477,9 +21479,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="koinomp"> + <game name="koinomp" sourcefile="nbmj9195.c"> <description>Mahjong Koi no Magic Potion (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu</manufacturer> @@ -21567,9 +21569,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="patimono"> + <game name="patimono" sourcefile="nbmj9195.c"> <description>Mahjong Pachinko Monogatari (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu</manufacturer> @@ -21656,9 +21658,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjanbari"> + <game name="mjanbari" sourcefile="nbmj9195.c"> <description>Medal Mahjong Janjan Baribari [BET] (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu/Yubis/AV JAPAN</manufacturer> @@ -21745,9 +21747,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ultramhm"> + <game name="ultramhm" sourcefile="nbmj9195.c"> <description>Ultra Maru-hi Mahjong (Japan)</description> <year>1993</year> <manufacturer>Apple</manufacturer> @@ -21831,9 +21833,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gal10ren"> + <game name="gal10ren" sourcefile="nbmj9195.c"> <description>Mahjong Gal 10-renpatsu (Japan)</description> <year>1993</year> <manufacturer>FUJIC</manufacturer> @@ -21921,9 +21923,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="renaiclb"> + <game name="renaiclb" sourcefile="nbmj9195.c"> <description>Mahjong Ren-ai Club (Japan)</description> <year>1993</year> <manufacturer>FUJIC</manufacturer> @@ -22008,9 +22010,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjlaman"> + <game name="mjlaman" sourcefile="nbmj9195.c"> <description>Mahjong La Man (Japan)</description> <year>1993</year> <manufacturer>Nichibutsu/AV JAPAN</manufacturer> @@ -22090,9 +22092,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mkeibaou"> + <game name="mkeibaou" sourcefile="nbmj9195.c"> <description>Mahjong Keibaou (Japan)</description> <year>1993</year> <manufacturer>Nichibutsu</manufacturer> @@ -22177,9 +22179,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pachiten"> + <game name="pachiten" sourcefile="nbmj9195.c"> <description>Medal Mahjong Pachi-Slot Tengoku [BET] (Japan)</description> <year>1993</year> <manufacturer>Nichibutsu/MIKI SYOUJI/AV JAPAN</manufacturer> @@ -22260,9 +22262,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sailorws"> + <game name="sailorws" sourcefile="nbmj9195.c"> <description>Mahjong Sailor Wars (Japan)</description> <year>1993</year> <manufacturer>Nichibutsu</manufacturer> @@ -22348,9 +22350,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sailorwr" cloneof="sailorws" romof="sailorws"> + <game name="sailorwr" sourcefile="nbmj9195.c" cloneof="sailorws" romof="sailorws"> <description>Mahjong Sailor Wars-R [BET] (Japan)</description> <year>1993</year> <manufacturer>Nichibutsu</manufacturer> @@ -22432,9 +22434,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="psailor1"> + <game name="psailor1" sourcefile="nbmj9195.c"> <description>Bishoujo Janshi Pretty Sailor 18-kin (Japan)</description> <year>1994</year> <manufacturer>SPHINX</manufacturer> @@ -22516,9 +22518,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="psailor2"> + <game name="psailor2" sourcefile="nbmj9195.c"> <description>Bishoujo Janshi Pretty Sailor 2 (Japan)</description> <year>1994</year> <manufacturer>SPHINX</manufacturer> @@ -22600,9 +22602,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="otatidai"> + <game name="otatidai" sourcefile="nbmj9195.c"> <description>Disco Mahjong Otachidai no Okite (Japan)</description> <year>1995</year> <manufacturer>SPHINX</manufacturer> @@ -22684,9 +22686,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ngpgal"> + <game name="ngpgal" sourcefile="nbmj9195.c"> <description>Nekketsu Grand-Prix Gal (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -22779,9 +22781,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjgottsu"> + <game name="mjgottsu" sourcefile="nbmj9195.c"> <description>Mahjong Gottsu ee-kanji (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -22875,9 +22877,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bakuhatu" cloneof="mjgottsu" romof="mjgottsu"> + <game name="bakuhatu" sourcefile="nbmj9195.c" cloneof="mjgottsu" romof="mjgottsu"> <description>Mahjong Bakuhatsu Junjouden (Japan)</description> <year>1991</year> <manufacturer>Nichibutsu</manufacturer> @@ -22971,9 +22973,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cmehyou"> + <game name="cmehyou" sourcefile="nbmj9195.c"> <description>Mahjong Circuit no Mehyou (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu/Kawakusu</manufacturer> @@ -23068,9 +23070,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mmehyou"> + <game name="mmehyou" sourcefile="nbmj9195.c"> <description>Medal Mahjong Circuit no Mehyou [BET] (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu/Kawakusu</manufacturer> @@ -23157,9 +23159,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjkoiura"> + <game name="mjkoiura" sourcefile="nbmj9195.c"> <description>Mahjong Koi Uranai (Japan)</description> <year>1992</year> <manufacturer>Nichibutsu</manufacturer> @@ -23255,9 +23257,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="imekura"> + <game name="imekura" sourcefile="nbmj9195.c"> <description>Imekura Mahjong (Japan)</description> <year>1994</year> <manufacturer>SPHINX/AV JAPAN</manufacturer> @@ -23341,9 +23343,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mscoutm"> + <game name="mscoutm" sourcefile="nbmj9195.c"> <description>Mahjong Scout Man (Japan)</description> <year>1994</year> <manufacturer>SPHINX/AV JAPAN</manufacturer> @@ -23427,9 +23429,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mjegolf"> + <game name="mjegolf" sourcefile="nbmj9195.c"> <description>Mahjong Erotica Golf (Japan)</description> <year>1994</year> <manufacturer>FUJIC/AV JAPAN</manufacturer> @@ -23513,9 +23515,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="niyanpai"> + <game name="niyanpai" sourcefile="niyanpai.c"> <description>Niyanpai (Japan)</description> <year>1996</year> <manufacturer>Nichibutsu</manufacturer> @@ -23576,9 +23578,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="safarir"> + <game name="safarir" sourcefile="safarir.c"> <description>Safari Rally (Japan)</description> <year>1979</year> <manufacturer>SNK</manufacturer> @@ -23588,10 +23590,21 @@ <rom name="rl04" size="1024" crc="5dd12f96" sha1="a80ac0705648f0807ea33e444fdbea450bf23f85" region="cpu1" offset="c00"/> <rom name="rl05" size="1024" crc="935ed469" sha1="052a59df831dcc2c618e9e5e5fdfa47548550596" region="cpu1" offset="1000"/> <rom name="rl06" size="1024" crc="24c1cd42" sha1="fe32ecea77a3777f8137ca248b8f371db37b8b85" region="cpu1" offset="1400"/> - <rom name="rl08" size="1024" crc="d6a50aac" sha1="0a0c2cefc556e4e15085318fcac485b82bac2416" region="gfx1" dispose="yes" offset="0"/> - <rom name="rl07" size="1024" crc="ba525203" sha1="1c261cc1259787a7a248766264fefe140226e465" region="gfx2" dispose="yes" offset="0"/> - <chip type="cpu" name="8080" clock="3072000"/> - <chip type="audio" name="SN76477"/> + <rom name="rl08" size="1024" crc="d6a50aac" sha1="0a0c2cefc556e4e15085318fcac485b82bac2416" region="gfx1" offset="0"/> + <rom name="rl07" size="1024" crc="ba525203" sha1="1c261cc1259787a7a248766264fefe140226e465" region="gfx2" offset="0"/> + <sample name="sound1-1.wav"/> + <sample name="sound1-2.wav"/> + <sample name="sound2.wav"/> + <sample name="sound3.wav"/> + <sample name="sound4-1.wav"/> + <sample name="sound4-2.wav"/> + <sample name="sound5-1.wav"/> + <sample name="sound5-2.wav"/> + <sample name="sound6.wav"/> + <sample name="sound7.wav"/> + <sample name="sound8.wav"/> + <chip type="cpu" name="8080" clock="2250000"/> + <chip type="audio" name="Samples"/> <video screen="raster" orientation="vertical" width="208" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="1" coins="1"/> @@ -23617,9 +23630,9 @@ <dipvalue name="7000"/> <dipvalue name="9000"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="phoenix"> + <game name="phoenix" sourcefile="phoenix.c"> <description>Phoenix (Amstar)</description> <year>1980</year> <manufacturer>Amstar</manufacturer> @@ -23671,9 +23684,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="phoenixa" cloneof="phoenix" romof="phoenix"> + <game name="phoenixa" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Phoenix (Centuri)</description> <year>1980</year> <manufacturer>Amstar (Centuri license)</manufacturer> @@ -23725,9 +23738,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="phoenixt" cloneof="phoenix" romof="phoenix"> + <game name="phoenixt" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Phoenix (Taito)</description> <year>1980</year> <manufacturer>Taito</manufacturer> @@ -23779,9 +23792,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="phoenix3" cloneof="phoenix" romof="phoenix"> + <game name="phoenix3" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Phoenix (T.P.N.)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -23833,9 +23846,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="phoenixc" cloneof="phoenix" romof="phoenix"> + <game name="phoenixc" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Phoenix (IRECSA, G.G.I Corp)</description> <year>1981</year> <manufacturer>bootleg?</manufacturer> @@ -23887,9 +23900,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="condor" cloneof="phoenix" romof="phoenix"> + <game name="condor" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Condor</description> <year>1981</year> <manufacturer>Sidam</manufacturer> @@ -23941,9 +23954,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="falcon" cloneof="phoenix" romof="phoenix"> + <game name="falcon" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Falcon</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -23995,9 +24008,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vautour" cloneof="phoenix" romof="phoenix"> + <game name="vautour" sourcefile="phoenix.c" cloneof="phoenix" romof="phoenix"> <description>Vautour (Jeutel France)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -24049,9 +24062,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pleiads"> + <game name="pleiads" sourcefile="phoenix.c"> <description>Pleiads (Tehkan)</description> <year>1981</year> <manufacturer>Tehkan</manufacturer> @@ -24103,9 +24116,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pleiadbl" cloneof="pleiads" romof="pleiads"> + <game name="pleiadbl" sourcefile="phoenix.c" cloneof="pleiads" romof="pleiads"> <description>Pleiads (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -24157,9 +24170,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pleiadce" cloneof="pleiads" romof="pleiads"> + <game name="pleiadce" sourcefile="phoenix.c" cloneof="pleiads" romof="pleiads"> <description>Pleiads (Centuri)</description> <year>1981</year> <manufacturer>Tehkan (Centuri license)</manufacturer> @@ -24210,9 +24223,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="capitol" cloneof="pleiads" romof="pleiads"> + <game name="capitol" sourcefile="phoenix.c" cloneof="pleiads" romof="pleiads"> <description>Capitol</description> <year>1981</year> <manufacturer>Universal Video Spiel</manufacturer> @@ -24264,9 +24277,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="survival"> + <game name="survival" sourcefile="phoenix.c"> <description>Survival</description> <year>1982</year> <manufacturer>Rock-ola</manufacturer> @@ -24315,9 +24328,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="naughtyb"> + <game name="naughtyb" sourcefile="naughtyb.c"> <description>Naughty Boy</description> <year>1982</year> <manufacturer>Jaleco</manufacturer> @@ -24367,9 +24380,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="naughtya" cloneof="naughtyb" romof="naughtyb"> + <game name="naughtya" sourcefile="naughtyb.c" cloneof="naughtyb" romof="naughtyb"> <description>Naughty Boy (bootleg)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -24419,9 +24432,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="naughtyc" cloneof="naughtyb" romof="naughtyb"> + <game name="naughtyc" sourcefile="naughtyb.c" cloneof="naughtyb" romof="naughtyb"> <description>Naughty Boy (Cinematronics)</description> <year>1982</year> <manufacturer>Jaleco (Cinematronics license)</manufacturer> @@ -24471,9 +24484,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="popflame"> + <game name="popflame" sourcefile="naughtyb.c"> <description>Pop Flamer (protected)</description> <year>1982</year> <manufacturer>Jaleco</manufacturer> @@ -24515,9 +24528,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="popflama" cloneof="popflame" romof="popflame"> + <game name="popflama" sourcefile="naughtyb.c" cloneof="popflame" romof="popflame"> <description>Pop Flamer (not protected)</description> <year>1982</year> <manufacturer>Jaleco</manufacturer> @@ -24559,9 +24572,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="popflamb" cloneof="popflame" romof="popflame"> + <game name="popflamb" sourcefile="naughtyb.c" cloneof="popflame" romof="popflame"> <description>Pop Flamer (hack?)</description> <year>1982</year> <manufacturer>Jaleco</manufacturer> @@ -24603,9 +24616,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="geebee"> + <game name="geebee" sourcefile="geebee.c"> <description>Gee Bee</description> <year>1978</year> <manufacturer>Namco</manufacturer> @@ -24644,9 +24657,9 @@ <dipvalue name="150k 300k"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="geebeeg" cloneof="geebee" romof="geebee"> + <game name="geebeeg" sourcefile="geebee.c" cloneof="geebee" romof="geebee"> <description>Gee Bee (Gremlin)</description> <year>1978</year> <manufacturer>[Namco] (Gremlin license)</manufacturer> @@ -24685,9 +24698,9 @@ <dipvalue name="150k 300k"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="bombbee"> + <game name="bombbee" sourcefile="warpwarp.c"> <description>Bomb Bee</description> <year>1979</year> <manufacturer>Namco</manufacturer> @@ -24729,9 +24742,9 @@ <dipvalue name="150000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cutieq"> + <game name="cutieq" sourcefile="warpwarp.c"> <description>Cutie Q</description> <year>1979</year> <manufacturer>Namco</manufacturer> @@ -24773,9 +24786,9 @@ <dipvalue name="200000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="navalone"> + <game name="navalone" sourcefile="geebee.c"> <description>Navalone</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -24809,9 +24822,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="3"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="3"/> </game> - <game name="kaitei"> + <game name="kaitei" sourcefile="geebee.c"> <description>Kaitei Takara Sagashi</description> <year>1980</year> <manufacturer>K.K. Tokki</manufacturer> @@ -24851,9 +24864,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="kaitein" cloneof="kaitei" romof="kaitei"> + <game name="kaitein" sourcefile="geebee.c" cloneof="kaitei" romof="kaitei"> <description>Kaitei Takara Sagashi (Namco)</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -24885,9 +24898,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="sos"> + <game name="sos" sourcefile="geebee.c"> <description>SOS</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -24917,9 +24930,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="3"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="3"/> </game> - <game name="tankbatt"> + <game name="tankbatt" sourcefile="tankbatt.c"> <description>Tank Battalion</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -24968,9 +24981,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="warpwarp"> + <game name="warpwarp" sourcefile="warpwarp.c"> <description>Warp & Warp</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -25014,9 +25027,9 @@ </dipswitch> <dipswitch name="Level Selection"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="warpwarr" cloneof="warpwarp" romof="warpwarp"> + <game name="warpwarr" sourcefile="warpwarp.c" cloneof="warpwarp" romof="warpwarp"> <description>Warp Warp (Rock-ola set 1)</description> <year>1981</year> <manufacturer>[Namco] (Rock-ola license)</manufacturer> @@ -25062,9 +25075,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="warpwar2" cloneof="warpwarp" romof="warpwarp"> + <game name="warpwar2" sourcefile="warpwarp.c" cloneof="warpwarp" romof="warpwarp"> <description>Warp Warp (Rock-ola set 2)</description> <year>1981</year> <manufacturer>[Namco] (Rock-ola license)</manufacturer> @@ -25110,9 +25123,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rallyx"> + <game name="rallyx" sourcefile="rallyx.c"> <description>Rally X</description> <year>1980</year> <manufacturer>Namco</manufacturer> @@ -25161,9 +25174,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="rallyxm" cloneof="rallyx" romof="rallyx" sampleof="rallyx"> + <game name="rallyxm" sourcefile="rallyx.c" cloneof="rallyx" romof="rallyx" sampleof="rallyx"> <description>Rally X (Midway)</description> <year>1980</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -25212,9 +25225,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="nrallyx" sampleof="rallyx"> + <game name="nrallyx" sourcefile="rallyx.c" sampleof="rallyx"> <description>New Rally X</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -25263,9 +25276,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="nrallyv" cloneof="nrallyx" romof="nrallyx" sampleof="rallyx"> + <game name="nrallyv" sourcefile="rallyx.c" cloneof="nrallyx" romof="nrallyx" sampleof="rallyx"> <description>New Rally X (Vertical Screen)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -25314,9 +25327,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jungler"> + <game name="jungler" sourcefile="locomotn.c"> <description>Jungler</description> <year>1981</year> <manufacturer>Konami</manufacturer> @@ -25365,9 +25378,9 @@ </dipswitch> <dipswitch name="Debug Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="junglers" cloneof="jungler" romof="jungler"> + <game name="junglers" sourcefile="locomotn.c" cloneof="jungler" romof="jungler"> <description>Jungler (Stern)</description> <year>1981</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -25416,9 +25429,9 @@ </dipswitch> <dipswitch name="Debug Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="tactcian"> + <game name="tactcian" sourcefile="locomotn.c"> <description>Tactician (set 1)</description> <year>1982</year> <manufacturer>[Konami] (Sega license)</manufacturer> @@ -25495,9 +25508,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="tactcan2" cloneof="tactcian" romof="tactcian"> + <game name="tactcan2" sourcefile="locomotn.c" cloneof="tactcian" romof="tactcian"> <description>Tactician (set 2)</description> <year>1981</year> <manufacturer>[Konami] (Sega license)</manufacturer> @@ -25574,9 +25587,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="locomotn"> + <game name="locomotn" sourcefile="locomotn.c"> <description>Loco-Motion</description> <year>1982</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -25658,9 +25671,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="gutangtn" cloneof="locomotn" romof="locomotn"> + <game name="gutangtn" sourcefile="locomotn.c" cloneof="locomotn" romof="locomotn"> <description>Guttang Gottong</description> <year>1982</year> <manufacturer>Konami (Sega license)</manufacturer> @@ -25742,9 +25755,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cottong" cloneof="locomotn" romof="locomotn"> + <game name="cottong" sourcefile="locomotn.c" cloneof="locomotn" romof="locomotn"> <description>Cotocoto Cottong</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -25826,9 +25839,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="commsega"> + <game name="commsega" sourcefile="locomotn.c"> <description>Commando (Sega)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -25902,9 +25915,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="bosco"> + <game name="bosco" sourcefile="bosco.c"> <description>Bosconian (new version)</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -25998,9 +26011,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="boscoo" cloneof="bosco" romof="bosco" sampleof="bosco"> + <game name="boscoo" sourcefile="bosco.c" cloneof="bosco" romof="bosco" sampleof="bosco"> <description>Bosconian (old version)</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -26094,9 +26107,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="boscoo2" cloneof="bosco" romof="bosco" sampleof="bosco"> + <game name="boscoo2" sourcefile="bosco.c" cloneof="bosco" romof="bosco" sampleof="bosco"> <description>Bosconian (older version)</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -26190,9 +26203,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="boscomd" cloneof="bosco" romof="bosco" sampleof="bosco"> + <game name="boscomd" sourcefile="bosco.c" cloneof="bosco" romof="bosco" sampleof="bosco"> <description>Bosconian (Midway, new version)</description> <year>1981</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -26286,9 +26299,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="boscomdo" cloneof="bosco" romof="bosco" sampleof="bosco"> + <game name="boscomdo" sourcefile="bosco.c" cloneof="bosco" romof="bosco" sampleof="bosco"> <description>Bosconian (Midway, old version)</description> <year>1981</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -26382,9 +26395,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="galaga"> + <game name="galaga" sourcefile="galaga.c"> <description>Galaga (Namco)</description> <year>1981</year> <manufacturer>Namco</manufacturer> @@ -26468,9 +26481,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="galagamw" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="galagamw" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Galaga (Midway)</description> <year>1981</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -26554,9 +26567,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="galagads" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="galagads" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Galaga (fast shoot)</description> <year>1981</year> <manufacturer>hack</manufacturer> @@ -26640,9 +26653,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="gallag" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="gallag" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Gallag</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -26727,9 +26740,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="galagab2" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="galagab2" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Galaga (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -26814,9 +26827,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="galaga84" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="galaga84" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Galaga '84</description> <year>1984</year> <manufacturer>hack</manufacturer> @@ -26901,9 +26914,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="nebulbee" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="nebulbee" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Nebulous Bee</description> <year>1984</year> <manufacturer>hack</manufacturer> @@ -26987,9 +27000,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="gatsbee" cloneof="galaga" romof="galaga" sampleof="galaga"> + <game name="gatsbee" sourcefile="galaga.c" cloneof="galaga" romof="galaga" sampleof="galaga"> <description>Gatsbee</description> <year>1984</year> <manufacturer>Uchida</manufacturer> @@ -27074,9 +27087,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="96"/> </game> - <game name="digdug"> + <game name="digdug" sourcefile="digdug.c"> <description>Dig Dug (set 1)</description> <year>1982</year> <manufacturer>Namco</manufacturer> @@ -27161,9 +27174,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="digdugb" cloneof="digdug" romof="digdug"> + <game name="digdugb" sourcefile="digdug.c" cloneof="digdug" romof="digdug"> <description>Dig Dug (set 2)</description> <year>1982</year> <manufacturer>Namco</manufacturer> @@ -27248,9 +27261,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="digdugat" cloneof="digdug" romof="digdug"> + <game name="digdugat" sourcefile="digdug.c" cloneof="digdug" romof="digdug"> <description>Dig Dug (Atari, rev 2)</description> <year>1982</year> <manufacturer>[Namco] (Atari license)</manufacturer> @@ -27335,9 +27348,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="digduga1" cloneof="digdug" romof="digdug"> + <game name="digduga1" sourcefile="digdug.c" cloneof="digdug" romof="digdug"> <description>Dig Dug (Atari, rev 1)</description> <year>1982</year> <manufacturer>[Namco] (Atari license)</manufacturer> @@ -27422,9 +27435,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="dzigzag" cloneof="digdug" romof="digdug"> + <game name="dzigzag" sourcefile="digdug.c" cloneof="digdug" romof="digdug"> <description>Zig Zag (Dig Dug hardware)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -27509,9 +27522,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="xevious"> + <game name="xevious" sourcefile="xevious.c"> <description>Xevious (Namco)</description> <year>1982</year> <manufacturer>Namco</manufacturer> @@ -27601,9 +27614,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="xeviousa" cloneof="xevious" romof="xevious" sampleof="xevious"> + <game name="xeviousa" sourcefile="xevious.c" cloneof="xevious" romof="xevious" sampleof="xevious"> <description>Xevious (Atari set 1)</description> <year>1982</year> <manufacturer>Namco (Atari license)</manufacturer> @@ -27690,9 +27703,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="xeviousb" cloneof="xevious" romof="xevious" sampleof="xevious"> + <game name="xeviousb" sourcefile="xevious.c" cloneof="xevious" romof="xevious" sampleof="xevious"> <description>Xevious (Atari set 2)</description> <year>1982</year> <manufacturer>Namco (Atari license)</manufacturer> @@ -27779,9 +27792,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="xevios" cloneof="xevious" romof="xevious" sampleof="xevious"> + <game name="xevios" sourcefile="xevious.c" cloneof="xevious" romof="xevious" sampleof="xevious"> <description>Xevios</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -27873,9 +27886,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="battles" cloneof="xevious" romof="xevious"> + <game name="battles" sourcefile="xevious.c" cloneof="xevious" romof="xevious"> <description>Battles</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -27960,9 +27973,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="sxevious" cloneof="xevious" romof="xevious" sampleof="xevious"> + <game name="sxevious" sourcefile="xevious.c" cloneof="xevious" romof="xevious" sampleof="xevious"> <description>Super Xevious</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -28052,9 +28065,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="superpac"> + <game name="superpac" sourcefile="superpac.c"> <description>Super Pac-Man</description> <year>1982</year> <manufacturer>Namco</manufacturer> @@ -28137,9 +28150,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="superpcm" cloneof="superpac" romof="superpac"> + <game name="superpcm" sourcefile="superpac.c" cloneof="superpac" romof="superpac"> <description>Super Pac-Man (Midway)</description> <year>1982</year> <manufacturer>[Namco] (Bally Midway license)</manufacturer> @@ -28222,9 +28235,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pacnpal"> + <game name="pacnpal" sourcefile="superpac.c"> <description>Pac & Pal</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -28288,9 +28301,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pacnpal2" cloneof="pacnpal" romof="pacnpal"> + <game name="pacnpal2" sourcefile="superpac.c" cloneof="pacnpal" romof="pacnpal"> <description>Pac & Pal (older)</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -28354,9 +28367,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pacnchmp" cloneof="pacnpal" romof="pacnpal"> + <game name="pacnchmp" sourcefile="superpac.c" cloneof="pacnpal" romof="pacnpal"> <description>Pac-Man & Chomp Chomp</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -28420,9 +28433,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="32"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="32"/> </game> - <game name="phozon"> + <game name="phozon" sourcefile="phozon.c"> <description>Phozon (Japan)</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -28493,9 +28506,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mappy"> + <game name="mappy" sourcefile="mappy.c"> <description>Mappy (US)</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -28574,9 +28587,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="mappyj" cloneof="mappy" romof="mappy"> + <game name="mappyj" sourcefile="mappy.c" cloneof="mappy" romof="mappy"> <description>Mappy (Japan)</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -28655,9 +28668,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="digdug2"> + <game name="digdug2" sourcefile="mappy.c"> <description>Dig Dug II (New Ver.)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -28731,9 +28744,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="digdug2o" cloneof="digdug2" romof="digdug2"> + <game name="digdug2o" sourcefile="mappy.c" cloneof="digdug2" romof="digdug2"> <description>Dig Dug II (Old Ver.)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -28807,9 +28820,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="todruaga"> + <game name="todruaga" sourcefile="mappy.c"> <description>Tower of Druaga (New Ver.)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -28861,9 +28874,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="todruago" cloneof="todruaga" romof="todruaga"> + <game name="todruago" sourcefile="mappy.c" cloneof="todruaga" romof="todruaga"> <description>Tower of Druaga (Old Ver.)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -28915,9 +28928,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="motos"> + <game name="motos" sourcefile="mappy.c"> <description>Motos</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -28971,9 +28984,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="grobda"> + <game name="grobda" sourcefile="grobda.c"> <description>Grobda (New version)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29047,9 +29060,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="grobda2" cloneof="grobda" romof="grobda"> + <game name="grobda2" sourcefile="grobda.c" cloneof="grobda" romof="grobda"> <description>Grobda (Old version set 1)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29123,9 +29136,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="grobda3" cloneof="grobda" romof="grobda"> + <game name="grobda3" sourcefile="grobda.c" cloneof="grobda" romof="grobda"> <description>Grobda (Old version set 2)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29199,9 +29212,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="gaplus" sampleof="galaga"> + <game name="gaplus" sourcefile="gaplus.c" sampleof="galaga"> <description>Gaplus (rev. D)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29283,9 +29296,9 @@ <dipvalue name="50k 150k and every 300k"/> <dipvalue name="50k 150k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gaplusa" cloneof="gaplus" romof="gaplus" sampleof="galaga"> + <game name="gaplusa" sourcefile="gaplus.c" cloneof="gaplus" romof="gaplus" sampleof="galaga"> <description>Gaplus (alternate hardware)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29367,9 +29380,9 @@ <dipvalue name="50k 150k and every 300k"/> <dipvalue name="50k 150k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gapluso" cloneof="gaplus" romof="gaplus" sampleof="galaga"> + <game name="gapluso" sourcefile="gaplus.c" cloneof="gaplus" romof="gaplus" sampleof="galaga"> <description>Gaplus (rev. B)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29451,9 +29464,9 @@ <dipvalue name="50k 150k and every 300k"/> <dipvalue name="50k 150k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galaga3" cloneof="gaplus" romof="gaplus" sampleof="galaga"> + <game name="galaga3" sourcefile="gaplus.c" cloneof="gaplus" romof="gaplus" sampleof="galaga"> <description>Galaga 3 (rev. C)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29535,9 +29548,9 @@ <dipvalue name="50k 150k and every 300k"/> <dipvalue name="50k 150k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galaga3m" cloneof="gaplus" romof="gaplus" sampleof="galaga"> + <game name="galaga3m" sourcefile="gaplus.c" cloneof="gaplus" romof="gaplus" sampleof="galaga"> <description>Galaga 3 (Midway)</description> <year>1984</year> <manufacturer>[Namco] (Midway license)</manufacturer> @@ -29619,9 +29632,9 @@ <dipvalue name="150k 400k and every 900k"/> <dipvalue name="150k 400k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galaga3a" cloneof="gaplus" romof="gaplus" sampleof="galaga"> + <game name="galaga3a" sourcefile="gaplus.c" cloneof="gaplus" romof="gaplus" sampleof="galaga"> <description>Galaga 3 (alternate set)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -29703,9 +29716,9 @@ <dipvalue name="50k 150k and every 200k"/> <dipvalue name="30k 150k"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="liblrabl"> + <game name="liblrabl" sourcefile="toypop.c"> <description>Libble Rabble</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -29789,9 +29802,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="toypop"> + <game name="toypop" sourcefile="toypop.c"> <description>Toypop</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -29869,9 +29882,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="polepos"> + <game name="polepos" sourcefile="polepos.c"> <description>Pole Position</description> <year>1982</year> <manufacturer>Namco</manufacturer> @@ -29983,9 +29996,9 @@ <dipvalue name="G"/> <dipvalue name="H"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="poleposa" cloneof="polepos" romof="polepos" sampleof="polepos"> + <game name="poleposa" sourcefile="polepos.c" cloneof="polepos" romof="polepos" sampleof="polepos"> <description>Pole Position (Atari version 2)</description> <year>1982</year> <manufacturer>Namco (Atari license)</manufacturer> @@ -30095,9 +30108,9 @@ <dipvalue name="G"/> <dipvalue name="H"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="polepos1" cloneof="polepos" romof="polepos" sampleof="polepos"> + <game name="polepos1" sourcefile="polepos.c" cloneof="polepos" romof="polepos" sampleof="polepos"> <description>Pole Position (Atari version 1)</description> <year>1982</year> <manufacturer>[Namco] (Atari license)</manufacturer> @@ -30207,9 +30220,9 @@ <dipvalue name="G"/> <dipvalue name="H"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="topracer" cloneof="polepos" romof="polepos" sampleof="polepos"> + <game name="topracer" sourcefile="polepos.c" cloneof="polepos" romof="polepos" sampleof="polepos"> <description>Top Racer</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -30319,9 +30332,9 @@ <dipvalue name="G"/> <dipvalue name="H"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="polepos2" sampleof="polepos"> + <game name="polepos2" sourcefile="polepos.c" sampleof="polepos"> <description>Pole Position II</description> <year>1983</year> <manufacturer>Namco</manufacturer> @@ -30438,9 +30451,9 @@ <dipvalue name="90 secs."/> <dipvalue name="120 secs." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="poleps2a" cloneof="polepos2" romof="polepos2" sampleof="polepos"> + <game name="poleps2a" sourcefile="polepos.c" cloneof="polepos2" romof="polepos2" sampleof="polepos"> <description>Pole Position II (Atari)</description> <year>1983</year> <manufacturer>Namco (Atari license)</manufacturer> @@ -30554,9 +30567,9 @@ <dipvalue name="90 secs."/> <dipvalue name="120 secs." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="poleps2b" cloneof="polepos2" romof="polepos2" sampleof="polepos"> + <game name="poleps2b" sourcefile="polepos.c" cloneof="polepos2" romof="polepos2" sampleof="polepos"> <description>Pole Position II (Atari bootleg 1)</description> <year>1983</year> <manufacturer>Namco (Atari license)</manufacturer> @@ -30671,9 +30684,9 @@ <dipvalue name="90 secs."/> <dipvalue name="120 secs." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="poleps2c" cloneof="polepos2" romof="polepos2" sampleof="polepos"> + <game name="poleps2c" sourcefile="polepos.c" cloneof="polepos2" romof="polepos2" sampleof="polepos"> <description>Pole Position II (Atari bootleg 2)</description> <year>1983</year> <manufacturer>Namco (Atari license)</manufacturer> @@ -30788,9 +30801,9 @@ <dipvalue name="90 secs."/> <dipvalue name="120 secs." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="pacland"> + <game name="pacland" sourcefile="pacland.c"> <description>Pac-Land (set 1)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -30875,9 +30888,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pacland2" cloneof="pacland" romof="pacland"> + <game name="pacland2" sourcefile="pacland.c" cloneof="pacland" romof="pacland"> <description>Pac-Land (set 2)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -30962,9 +30975,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pacland3" cloneof="pacland" romof="pacland"> + <game name="pacland3" sourcefile="pacland.c" cloneof="pacland" romof="pacland"> <description>Pac-Land (set 3)</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -31049,9 +31062,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="paclandm" cloneof="pacland" romof="pacland"> + <game name="paclandm" sourcefile="pacland.c" cloneof="pacland" romof="pacland"> <description>Pac-Land (Midway)</description> <year>1984</year> <manufacturer>[Namco] (Bally Midway license)</manufacturer> @@ -31136,9 +31149,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="drgnbstr"> + <game name="drgnbstr" sourcefile="skykid.c"> <description>Dragon Buster</description> <year>1984</year> <manufacturer>Namco</manufacturer> @@ -31226,9 +31239,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="skykid"> + <game name="skykid" sourcefile="skykid.c"> <description>Sky Kid (New Ver.)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31314,9 +31327,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="skykido" cloneof="skykid" romof="skykid"> + <game name="skykido" sourcefile="skykid.c" cloneof="skykid" romof="skykid"> <description>Sky Kid (Old Ver.)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31402,9 +31415,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="skykidd" cloneof="skykid" romof="skykid"> + <game name="skykidd" sourcefile="skykid.c" cloneof="skykid" romof="skykid"> <description>Sky Kid (60A1 Ver.)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31490,9 +31503,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="baraduke"> + <game name="baraduke" sourcefile="baraduke.c"> <description>Baraduke (set 1)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31579,9 +31592,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="baraduka" cloneof="baraduke" romof="baraduke"> + <game name="baraduka" sourcefile="baraduke.c" cloneof="baraduke" romof="baraduke"> <description>Baraduke (set 2)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31668,9 +31681,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="metrocrs"> + <game name="metrocrs" sourcefile="baraduke.c"> <description>Metro-Cross (set 1)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31758,9 +31771,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="metrocra" cloneof="metrocrs" romof="metrocrs"> + <game name="metrocra" sourcefile="baraduke.c" cloneof="metrocrs" romof="metrocrs"> <description>Metro-Cross (set 2)</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -31848,9 +31861,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hopmappy"> + <game name="hopmappy" sourcefile="namcos86.c"> <description>Hopping Mappy</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -31930,9 +31943,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="skykiddx"> + <game name="skykiddx" sourcefile="namcos86.c"> <description>Sky Kid Deluxe (set 1)</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32016,9 +32029,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="skykiddo" cloneof="skykiddx" romof="skykiddx"> + <game name="skykiddo" sourcefile="namcos86.c" cloneof="skykiddx" romof="skykiddx"> <description>Sky Kid Deluxe (set 2)</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32102,9 +32115,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="roishtar"> + <game name="roishtar" sourcefile="namcos86.c"> <description>The Return of Ishtar</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32197,9 +32210,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="genpeitd"> + <game name="genpeitd" sourcefile="namcos86.c"> <description>Genpei ToumaDen</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32292,9 +32305,9 @@ <dipvalue name="60"/> <dipvalue name="70"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rthunder"> + <game name="rthunder" sourcefile="namcos86.c"> <description>Rolling Thunder (new version)</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32389,9 +32402,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rthundro" cloneof="rthunder" romof="rthunder"> + <game name="rthundro" sourcefile="namcos86.c" cloneof="rthunder" romof="rthunder"> <description>Rolling Thunder (old version)</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32485,9 +32498,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="wndrmomo"> + <game name="wndrmomo" sourcefile="namcos86.c"> <description>Wonder Momo</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -32582,9 +32595,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tceptor"> + <game name="tceptor" sourcefile="tceptor.c"> <description>Thunder Ceptor</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32658,9 +32671,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tceptor2" cloneof="tceptor" romof="tceptor"> + <game name="tceptor2" sourcefile="tceptor.c" cloneof="tceptor" romof="tceptor"> <description>Thunder Ceptor II</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -32740,9 +32753,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="shadowld"> + <game name="shadowld" sourcefile="namcos1.c"> <description>Shadow Land</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -32790,9 +32803,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="youkaidk" cloneof="shadowld" romof="shadowld"> + <game name="youkaidk" sourcefile="namcos1.c" cloneof="shadowld" romof="shadowld"> <description>Yokai Douchuuki (Japan new version)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -32839,9 +32852,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="yokaidko" cloneof="shadowld" romof="shadowld"> + <game name="yokaidko" sourcefile="namcos1.c" cloneof="shadowld" romof="shadowld"> <description>Yokai Douchuuki (Japan old version)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -32888,9 +32901,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="dspirit"> + <game name="dspirit" sourcefile="namcos1.c"> <description>Dragon Spirit (new version)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -32940,9 +32953,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="dspirito" cloneof="dspirit" romof="dspirit"> + <game name="dspirito" sourcefile="namcos1.c" cloneof="dspirit" romof="dspirit"> <description>Dragon Spirit (old version)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -32992,9 +33005,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="blazer"> + <game name="blazer" sourcefile="namcos1.c"> <description>Blazer (Japan)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33038,9 +33051,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="quester"> + <game name="quester" sourcefile="namcos1.c"> <description>Quester (Japan)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33071,9 +33084,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="pacmania"> + <game name="pacmania" sourcefile="namcos1.c"> <description>Pac-Mania</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33110,9 +33123,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="pacmanij" cloneof="pacmania" romof="pacmania"> + <game name="pacmanij" sourcefile="namcos1.c" cloneof="pacmania" romof="pacmania"> <description>Pac-Mania (Japan)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33149,9 +33162,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="galaga88"> + <game name="galaga88" sourcefile="namcos1.c"> <description>Galaga '88 (set 1)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33196,9 +33209,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="galag88b" cloneof="galaga88" romof="galaga88"> + <game name="galag88b" sourcefile="namcos1.c" cloneof="galaga88" romof="galaga88"> <description>Galaga '88 (set 2)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33243,9 +33256,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="galag88j" cloneof="galaga88" romof="galaga88"> + <game name="galag88j" sourcefile="namcos1.c" cloneof="galaga88" romof="galaga88"> <description>Galaga '88 (Japan)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -33290,9 +33303,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="ws"> + <game name="ws" sourcefile="namcos1.c"> <description>World Stadium (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33328,9 +33341,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="berabohm"> + <game name="berabohm" sourcefile="namcos1.c"> <description>Beraboh Man (Japan version C)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33375,9 +33388,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="beraboho" cloneof="berabohm" romof="berabohm"> + <game name="beraboho" sourcefile="namcos1.c" cloneof="berabohm" romof="berabohm"> <description>Beraboh Man (Japan version B)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33422,9 +33435,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="mmaze"> + <game name="mmaze" sourcefile="namcos1.c"> <description>Marchen Maze (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33465,9 +33478,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="bakutotu"> + <game name="bakutotu" sourcefile="namcos1.c"> <description>Bakutotsu Kijuutei</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33515,9 +33528,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="wldcourt"> + <game name="wldcourt" sourcefile="namcos1.c"> <description>World Court (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33552,9 +33565,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="splatter"> + <game name="splatter" sourcefile="namcos1.c"> <description>Splatter House (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33600,9 +33613,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="faceoff"> + <game name="faceoff" sourcefile="namcos1.c"> <description>Face Off (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -33634,9 +33647,9 @@ <input players="4" control="joy8way" buttons="1" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="rompers"> + <game name="rompers" sourcefile="namcos1.c"> <description>Rompers (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -33671,9 +33684,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="romperso" cloneof="rompers" romof="rompers"> + <game name="romperso" sourcefile="namcos1.c" cloneof="rompers" romof="rompers"> <description>Rompers (Japan old version)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -33708,9 +33721,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="blastoff"> + <game name="blastoff" sourcefile="namcos1.c"> <description>Blast Off (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -33747,9 +33760,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="ws89" cloneof="ws" romof="ws"> + <game name="ws89" sourcefile="namcos1.c" cloneof="ws" romof="ws"> <description>World Stadium '89 (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -33789,9 +33802,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="dangseed"> + <game name="dangseed" sourcefile="namcos1.c"> <description>Dangerous Seed (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -33828,9 +33841,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="ws90" cloneof="ws" romof="ws"> + <game name="ws90" sourcefile="namcos1.c" cloneof="ws" romof="ws"> <description>World Stadium '90 (Japan)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -33870,9 +33883,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="pistoldm"> + <game name="pistoldm" sourcefile="namcos1.c"> <description>Pistol Daimyo no Bouken (Japan)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -33908,9 +33921,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="boxyboy"> + <game name="boxyboy" sourcefile="namcos1.c"> <description>Boxy Boy (US)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -33942,9 +33955,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="soukobdx" cloneof="boxyboy" romof="boxyboy"> + <game name="soukobdx" sourcefile="namcos1.c" cloneof="boxyboy" romof="boxyboy"> <description>Souko Ban Deluxe (Japan)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -33976,9 +33989,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="puzlclub"> + <game name="puzlclub" sourcefile="namcos1.c"> <description>Puzzle Club (Japan prototype)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -34011,9 +34024,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="tankfrce"> + <game name="tankfrce" sourcefile="namcos1.c"> <description>Tank Force (US)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -34045,9 +34058,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="tankfrcj" cloneof="tankfrce" romof="tankfrce"> + <game name="tankfrcj" sourcefile="namcos1.c" cloneof="tankfrce" romof="tankfrce"> <description>Tank Force (Japan)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -34079,9 +34092,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5121"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5121"/> </game> - <game name="finallap"> + <game name="finallap" sourcefile="namcos2.c"> <description>Final Lap (Rev E)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -34114,7 +34127,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -34181,9 +34194,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="finalapd" cloneof="finallap" romof="finallap"> + <game name="finalapd" sourcefile="namcos2.c" cloneof="finallap" romof="finallap"> <description>Final Lap (Rev D)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -34216,7 +34229,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -34283,9 +34296,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="finalapc" cloneof="finallap" romof="finallap"> + <game name="finalapc" sourcefile="namcos2.c" cloneof="finallap" romof="finallap"> <description>Final Lap (Rev C)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -34318,7 +34331,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -34385,9 +34398,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="finlapjc" cloneof="finallap" romof="finallap"> + <game name="finlapjc" sourcefile="namcos2.c" cloneof="finallap" romof="finallap"> <description>Final Lap (Japan - Rev C)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -34420,7 +34433,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -34487,9 +34500,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="finlapjb" cloneof="finallap" romof="finallap"> + <game name="finlapjb" sourcefile="namcos2.c" cloneof="finallap" romof="finallap"> <description>Final Lap (Japan - Rev B)</description> <year>1987</year> <manufacturer>Namco</manufacturer> @@ -34522,7 +34535,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -34589,9 +34602,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="assault"> + <game name="assault" sourcefile="namcos2.c"> <description>Assault</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -34663,9 +34676,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="assaultj" cloneof="assault" romof="assault"> + <game name="assaultj" sourcefile="namcos2.c" cloneof="assault" romof="assault"> <description>Assault (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -34737,9 +34750,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="assaultp" cloneof="assault" romof="assault"> + <game name="assaultp" sourcefile="namcos2.c" cloneof="assault" romof="assault"> <description>Assault Plus (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -34811,9 +34824,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="metlhawk"> + <game name="metlhawk" sourcefile="namcos2.c"> <description>Metal Hawk (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -34890,9 +34903,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="ordyne"> + <game name="ordyne" sourcefile="namcos2.c"> <description>Ordyne (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -34966,9 +34979,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="mirninja"> + <game name="mirninja" sourcefile="namcos2.c"> <description>Mirai Ninja (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -35041,9 +35054,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="phelios"> + <game name="phelios" sourcefile="namcos2.c"> <description>Phelios (Japan)</description> <year>1988</year> <manufacturer>Namco</manufacturer> @@ -35119,9 +35132,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dirtfoxj"> + <game name="dirtfoxj" sourcefile="namcos2.c"> <description>Dirt Fox (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35160,7 +35173,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="vertical" width="224" height="288" aspectx="3" aspecty="4" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" coins="2" service="yes"/> + <input players="1" control="dial" coins="2" service="yes"/> <dipswitch name="Video Display"> <dipvalue name="Normal" default="yes"/> <dipvalue name="Frozen"/> @@ -35191,9 +35204,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="fourtrax"> + <game name="fourtrax" sourcefile="namcos2.c"> <description>Four Trax</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35242,7 +35255,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2" service="yes"/> + <input players="1" control="dial" buttons="1" coins="2" service="yes"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -35341,9 +35354,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="valkyrie"> + <game name="valkyrie" sourcefile="namcos2.c"> <description>Valkyrie No Densetsu (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35416,9 +35429,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="finehour"> + <game name="finehour" sourcefile="namcos2.c"> <description>Finest Hour (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35490,9 +35503,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="burnforc"> + <game name="burnforc" sourcefile="namcos2.c"> <description>Burning Force (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35563,9 +35576,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="marvland"> + <game name="marvland" sourcefile="namcos2.c"> <description>Marvel Land (US)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35634,9 +35647,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="marvlanj" cloneof="marvland" romof="marvland"> + <game name="marvlanj" sourcefile="namcos2.c" cloneof="marvland" romof="marvland"> <description>Marvel Land (Japan)</description> <year>1989</year> <manufacturer>Namco</manufacturer> @@ -35703,9 +35716,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="kyukaidk"> + <game name="kyukaidk" sourcefile="namcos2.c"> <description>Kyuukai Douchuuki (Japan new version)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -35773,9 +35786,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="kyukaido" cloneof="kyukaidk" romof="kyukaidk"> + <game name="kyukaido" sourcefile="namcos2.c" cloneof="kyukaidk" romof="kyukaidk"> <description>Kyuukai Douchuuki (Japan old version)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -35843,9 +35856,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dsaber"> + <game name="dsaber" sourcefile="namcos2.c"> <description>Dragon Saber</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -35908,9 +35921,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dsaberj" cloneof="dsaber" romof="dsaber"> + <game name="dsaberj" sourcefile="namcos2.c" cloneof="dsaber" romof="dsaber"> <description>Dragon Saber (Japan)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -35973,9 +35986,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="finalap2"> + <game name="finalap2" sourcefile="namcos2.c"> <description>Final Lap 2</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -36015,7 +36028,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -36082,9 +36095,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="finalp2j" cloneof="finalap2" romof="finalap2"> + <game name="finalp2j" sourcefile="namcos2.c" cloneof="finalap2" romof="finalap2"> <description>Final Lap 2 (Japan)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -36124,7 +36137,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -36191,9 +36204,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="gollygho"> + <game name="gollygho" sourcefile="namcos2.c"> <description>Golly! Ghost!</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -36253,9 +36266,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rthun2"> + <game name="rthun2" sourcefile="namcos2.c"> <description>Rolling Thunder 2</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -36319,9 +36332,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rthun2j" cloneof="rthun2" romof="rthun2"> + <game name="rthun2j" sourcefile="namcos2.c" cloneof="rthun2" romof="rthun2"> <description>Rolling Thunder 2 (Japan)</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -36385,9 +36398,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="sgunner"> + <game name="sgunner" sourcefile="namcos2.c"> <description>Steel Gunner</description> <year>1990</year> <manufacturer>Namco</manufacturer> @@ -36452,9 +36465,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="sgunner2"> + <game name="sgunner2" sourcefile="namcos2.c"> <description>Steel Gunner 2 (US)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -36523,9 +36536,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="sgunnr2j" cloneof="sgunner2" romof="sgunner2"> + <game name="sgunnr2j" sourcefile="namcos2.c" cloneof="sgunner2" romof="sgunner2"> <description>Steel Gunner 2 (Japan)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -36594,9 +36607,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="cosmogng"> + <game name="cosmogng" sourcefile="namcos2.c"> <description>Cosmo Gang the Video (US)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -36660,9 +36673,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="cosmognj" cloneof="cosmogng" romof="cosmogng"> + <game name="cosmognj" sourcefile="namcos2.c" cloneof="cosmogng" romof="cosmogng"> <description>Cosmo Gang the Video (Japan)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -36726,9 +36739,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="finalap3"> + <game name="finalap3" sourcefile="namcos2.c"> <description>Final Lap 3 (Japan set 1)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -36769,7 +36782,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -36836,9 +36849,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="finalp3a" cloneof="finalap3" romof="finalap3"> + <game name="finalp3a" sourcefile="namcos2.c" cloneof="finalap3" romof="finalap3"> <description>Final Lap 3 (World)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -36879,7 +36892,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="dial" buttons="1" coins="2"/> + <input players="1" control="dial" buttons="1" coins="2"/> <dipswitch name="PortB 0x01"> <dipvalue name="H" default="yes"/> <dipvalue name="L"/> @@ -36946,9 +36959,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="luckywld"> + <game name="luckywld" sourcefile="namcos2.c"> <description>Lucky & Wild</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37022,9 +37035,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="suzuka8h"> + <game name="suzuka8h" sourcefile="namcos2.c"> <description>Suzuka 8 Hours (World?)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37060,7 +37073,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="stick" coins="2" service="yes"/> + <input players="1" control="stick" coins="2" service="yes"/> <dipswitch name="Video Display"> <dipvalue name="Normal" default="yes"/> <dipvalue name="Frozen"/> @@ -37091,9 +37104,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="suzuk8hj" cloneof="suzuka8h" romof="suzuka8h"> + <game name="suzuk8hj" sourcefile="namcos2.c" cloneof="suzuka8h" romof="suzuka8h"> <description>Suzuka 8 Hours (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37129,7 +37142,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="stick" coins="2" service="yes"/> + <input players="1" control="stick" coins="2" service="yes"/> <dipswitch name="Video Display"> <dipvalue name="Normal" default="yes"/> <dipvalue name="Frozen"/> @@ -37160,9 +37173,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="sws92"> + <game name="sws92" sourcefile="namcos2.c"> <description>Super World Stadium '92 (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37226,9 +37239,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="sws92g" cloneof="sws92" romof="sws92"> + <game name="sws92g" sourcefile="namcos2.c" cloneof="sws92" romof="sws92"> <description>Super World Stadium '92 Gekitouban (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37294,9 +37307,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="suzuk8h2"> + <game name="suzuk8h2" sourcefile="namcos2.c"> <description>Suzuka 8 Hours 2 (Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37338,7 +37351,7 @@ <chip type="audio" name="YM2151" clock="3579580"/> <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.606060"/> <sound channels="2"/> - <input players="2" control="stick" coins="2" service="yes"/> + <input players="1" control="stick" coins="2" service="yes"/> <dipswitch name="Video Display"> <dipvalue name="Normal" default="yes"/> <dipvalue name="Frozen"/> @@ -37369,9 +37382,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="sws93"> + <game name="sws93" sourcefile="namcos2.c"> <description>Super World Stadium '93 (Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37435,9 +37448,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bkrtmaq"> + <game name="bkrtmaq" sourcefile="namcona1.c"> <description>Bakuretsu Quiz Ma-Q Dai Bouken (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37470,9 +37483,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="cgangpzl"> + <game name="cgangpzl" sourcefile="namcona1.c"> <description>Cosmo Gang the Puzzle (US)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37499,9 +37512,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="cgangpzj" cloneof="cgangpzl" romof="cgangpzl"> + <game name="cgangpzj" sourcefile="namcona1.c" cloneof="cgangpzl" romof="cgangpzl"> <description>Cosmo Gang the Puzzle (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37528,9 +37541,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="exvania"> + <game name="exvania" sourcefile="namcona1.c"> <description>Exvania (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37561,9 +37574,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="fghtatck"> + <game name="fghtatck" sourcefile="namcona1.c"> <description>Fighter & Attacker (US)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37596,9 +37609,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="fa" cloneof="fghtatck" romof="fghtatck"> + <game name="fa" sourcefile="namcona1.c" cloneof="fghtatck" romof="fghtatck"> <description>F/A (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37631,9 +37644,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="knckhead"> + <game name="knckhead" sourcefile="namcona1.c"> <description>Knuckle Heads (World)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37670,9 +37683,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="knckhedj" cloneof="knckhead" romof="knckhead"> + <game name="knckhedj" sourcefile="namcona1.c" cloneof="knckhead" romof="knckhead"> <description>Knuckle Heads (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37709,9 +37722,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="swcourt"> + <game name="swcourt" sourcefile="namcona1.c"> <description>Super World Court (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -37744,9 +37757,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="emeralda"> + <game name="emeralda" sourcefile="namcona1.c"> <description>Emeraldia (Japan Version B)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37775,9 +37788,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="emerldaa" cloneof="emeralda" romof="emeralda"> + <game name="emerldaa" sourcefile="namcona1.c" cloneof="emeralda" romof="emeralda"> <description>Emeraldia (Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37806,9 +37819,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="numanath"> + <game name="numanath" sourcefile="namcona1.c"> <description>Numan Athletics (World)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37845,9 +37858,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="numanatj" cloneof="numanath" romof="numanath"> + <game name="numanatj" sourcefile="namcona1.c" cloneof="numanath" romof="numanath"> <description>Numan Athletics (Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37884,9 +37897,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="quiztou"> + <game name="quiztou" sourcefile="namcona1.c"> <description>Nettou! Gekitou! Quiztou!! (Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37923,9 +37936,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="tinklpit"> + <game name="tinklpit" sourcefile="namcona1.c"> <description>Tinkle Pit (Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -37960,9 +37973,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="xday2"> + <game name="xday2" sourcefile="namcona1.c"> <description>X-Day 2 (Japan)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -37993,9 +38006,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="imperfect" palettesize="4096"/> + <driver status="preliminary" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="nebulray"> + <game name="nebulray" sourcefile="namconb1.c"> <description>Nebulas Ray (World)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38045,9 +38058,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="nebulryj" cloneof="nebulray" romof="nebulray"> + <game name="nebulryj" sourcefile="namconb1.c" cloneof="nebulray" romof="nebulray"> <description>Nebulas Ray (Japan)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38097,9 +38110,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="ptblank"> + <game name="ptblank" sourcefile="namconb1.c"> <description>Point Blank</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38128,9 +38141,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="gunbulet" cloneof="ptblank" romof="ptblank"> + <game name="gunbulet" sourcefile="namconb1.c" cloneof="ptblank" romof="ptblank"> <description>Gun Bullet (Japan)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38159,9 +38172,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="gslgr94u"> + <game name="gslgr94u" sourcefile="namconb1.c"> <description>Great Sluggers '94</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38204,9 +38217,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="sws95"> + <game name="sws95" sourcefile="namconb1.c"> <description>Super World Stadium '95 (Japan)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -38249,9 +38262,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="sws96"> + <game name="sws96" sourcefile="namconb1.c"> <description>Super World Stadium '96 (Japan)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -38294,9 +38307,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="sws97"> + <game name="sws97" sourcefile="namconb1.c"> <description>Super World Stadium '97 (Japan)</description> <year>1997</year> <manufacturer>Namco</manufacturer> @@ -38339,9 +38352,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="vshoot"> + <game name="vshoot" sourcefile="namconb1.c"> <description>J-League Soccer V-Shoot</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38386,9 +38399,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="outfxies"> + <game name="outfxies" sourcefile="namconb1.c"> <description>Outfoxies</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38442,9 +38455,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="outfxesj" cloneof="outfxies" romof="outfxies"> + <game name="outfxesj" sourcefile="namconb1.c" cloneof="outfxies" romof="outfxies"> <description>Outfoxies (Japan)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -38498,9 +38511,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="machbrkr"> + <game name="machbrkr" sourcefile="namconb1.c"> <description>Mach Breakers (Japan)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -38555,9 +38568,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="ncv1"> + <game name="ncv1" sourcefile="namcond1.c"> <description>Namco Classics Collection Vol.1</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -38578,9 +38591,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="ncv1j" cloneof="ncv1" romof="ncv1"> + <game name="ncv1j" sourcefile="namcond1.c" cloneof="ncv1" romof="ncv1"> <description>Namco Classics Collection Vol.1 (Japan set 1)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -38601,9 +38614,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="ncv1j2" cloneof="ncv1" romof="ncv1"> + <game name="ncv1j2" sourcefile="namcond1.c" cloneof="ncv1" romof="ncv1"> <description>Namco Classics Collection Vol.1 (Japan set 2)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -38624,9 +38637,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="ncv2"> + <game name="ncv2" sourcefile="namcond1.c"> <description>Namco Classics Collection Vol.2</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -38648,9 +38661,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="ncv2j" cloneof="ncv2" romof="ncv2"> + <game name="ncv2j" sourcefile="namcond1.c" cloneof="ncv2" romof="ncv2"> <description>Namco Classics Collection Vol.2 (Japan)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -38672,9 +38685,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="winrun91"> + <game name="winrun91" sourcefile="namcos21.c"> <description>Winning Run 91</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -38748,9 +38761,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="solvalou"> + <game name="solvalou" sourcefile="namcos21.c"> <description>Solvalou (Japan)</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -38823,9 +38836,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="starblad"> + <game name="starblad" sourcefile="namcos21.c"> <description>Starblade</description> <year>1991</year> <manufacturer>Namco</manufacturer> @@ -38897,9 +38910,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="aircombj"> + <game name="aircombj" sourcefile="namcos21.c"> <description>Air Combat (Japan)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -38974,9 +38987,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="aircombu" cloneof="aircombj" romof="aircombj"> + <game name="aircombu" sourcefile="namcos21.c" cloneof="aircombj" romof="aircombj"> <description>Air Combat (US)</description> <year>1992</year> <manufacturer>Namco</manufacturer> @@ -39051,9 +39064,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="cybsled"> + <game name="cybsled" sourcefile="namcos21.c"> <description>Cyber Sled</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -39131,9 +39144,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="alpinerd"> + <game name="alpinerd" sourcefile="namcos22.c"> <description>Alpine Racer (Rev. AR2 Ver.D)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -39203,9 +39216,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="alpinerc" cloneof="alpinerd" romof="alpinerd"> + <game name="alpinerc" sourcefile="namcos22.c" cloneof="alpinerd" romof="alpinerd"> <description>Alpine Racer (Rev. AR2 Ver.C)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -39275,9 +39288,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="raveracw"> + <game name="raveracw" sourcefile="namcos22.c"> <description>Rave Racer (Rev. RV2, World)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -39382,9 +39395,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="ridgeraj"> + <game name="ridgeraj" sourcefile="namcos22.c"> <description>Ridge Racer (Rev. RR1, Japan)</description> <year>1993</year> <manufacturer>Namco</manufacturer> @@ -39541,9 +39554,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="ridger2j"> + <game name="ridger2j" sourcefile="namcos22.c"> <description>Ridge Racer 2 (Rev. RRS1, Japan)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -39700,9 +39713,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="acedrvrw"> + <game name="acedrvrw" sourcefile="namcos22.c"> <description>Ace Driver (Rev. AD2, World)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -39859,9 +39872,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="victlapw"> + <game name="victlapw" sourcefile="namcos22.c"> <description>Ace Driver: Victory Lap (Rev. ADV2, World)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -40026,9 +40039,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="cybrcomm"> + <game name="cybrcomm" sourcefile="namcos22.c"> <description>Cyber Commando (Rev. CY1, Japan)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -40125,9 +40138,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="airco22b"> + <game name="airco22b" sourcefile="namcos22.c"> <description>Air Combat 22 (Rev. ACS1 Ver.B)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -40294,9 +40307,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="cybrcycc"> + <game name="cybrcycc" sourcefile="namcos22.c"> <description>Cyber Cycles (Rev. CB2 Ver.C)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -40397,9 +40410,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="timecrsa"> + <game name="timecrsa" sourcefile="namcos22.c"> <description>Time Crisis (Rev. TS2 Ver.A)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -40500,9 +40513,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="propcycl"> + <game name="propcycl" sourcefile="namcos22.c"> <description>Prop Cycle (Rev PR2 Ver.A)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -40570,9 +40583,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="32768"/> </game> - <game name="cosmicg"> + <game name="cosmicg" sourcefile="cosmic.c"> <description>Cosmic Guerilla</description> <year>1979</year> <manufacturer>Universal</manufacturer> @@ -40628,9 +40641,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="cosmica"> + <game name="cosmica" sourcefile="cosmic.c"> <description>Cosmic Alien</description> <year>1979</year> <manufacturer>Universal</manufacturer> @@ -40667,9 +40680,9 @@ <dipvalue name="15000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="cosmica2" cloneof="cosmica" romof="cosmica"> + <game name="cosmica2" sourcefile="cosmic.c" cloneof="cosmica" romof="cosmica"> <description>Cosmic Alien (older)</description> <year>1979</year> <manufacturer>Universal</manufacturer> @@ -40708,9 +40721,9 @@ <dipvalue name="15000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="panic"> + <game name="panic" sourcefile="cosmic.c"> <description>Space Panic (version E)</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -40770,9 +40783,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="panic2" cloneof="panic" romof="panic" sampleof="panic"> + <game name="panic2" sourcefile="cosmic.c" cloneof="panic" romof="panic" sampleof="panic"> <description>Space Panic (set 2)</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -40832,9 +40845,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="panic3" cloneof="panic" romof="panic" sampleof="panic"> + <game name="panic3" sourcefile="cosmic.c" cloneof="panic" romof="panic" sampleof="panic"> <description>Space Panic (set 3)</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -40894,9 +40907,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="panich" cloneof="panic" romof="panic" sampleof="panic"> + <game name="panich" sourcefile="cosmic.c" cloneof="panic" romof="panic" sampleof="panic"> <description>Space Panic (harder)</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -40956,9 +40969,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="panicger" cloneof="panic" romof="panic" sampleof="panic"> + <game name="panicger" sourcefile="cosmic.c" cloneof="panic" romof="panic" sampleof="panic"> <description>Space Panic (German)</description> <year>1980</year> <manufacturer>Universal (ADP Automaten license)</manufacturer> @@ -41018,9 +41031,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="zerohour"> + <game name="zerohour" sourcefile="redclash.c"> <description>Zero Hour</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -41098,9 +41111,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="32"/> + <driver status="good" color="preliminary" sound="preliminary" graphic="imperfect" palettesize="32"/> </game> - <game name="redclash"> + <game name="redclash" sourcefile="redclash.c"> <description>Red Clash</description> <year>1981</year> <manufacturer>Tehkan</manufacturer> @@ -41181,9 +41194,9 @@ <dipvalue name="1 Coin/8 Credits"/> <dipvalue name="1 Coin/9 Credits"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="32"/> + <driver status="good" color="preliminary" sound="preliminary" graphic="imperfect" palettesize="32"/> </game> - <game name="redclask" cloneof="redclash" romof="redclash"> + <game name="redclask" sourcefile="redclash.c" cloneof="redclash" romof="redclash"> <description>Red Clash (Kaneko)</description> <year>1981</year> <manufacturer>Kaneko</manufacturer> @@ -41267,9 +41280,9 @@ <dipvalue name="1 Coin/8 Credits"/> <dipvalue name="1 Coin/9 Credits"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="32"/> + <driver status="good" color="preliminary" sound="preliminary" graphic="imperfect" palettesize="32"/> </game> - <game name="magspot"> + <game name="magspot" sourcefile="cosmic.c"> <description>Magical Spot</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -41350,9 +41363,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="magspot2"> + <game name="magspot2" sourcefile="cosmic.c"> <description>Magical Spot II</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -41433,9 +41446,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="devzone"> + <game name="devzone" sourcefile="cosmic.c"> <description>Devil Zone</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -41512,9 +41525,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="devzone2" cloneof="devzone" romof="devzone"> + <game name="devzone2" sourcefile="cosmic.c" cloneof="devzone" romof="devzone"> <description>Devil Zone (easier)</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -41591,9 +41604,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="nomnlnd"> + <game name="nomnlnd" sourcefile="cosmic.c"> <description>No Man's Land</description> <year>1980</year> <manufacturer>Universal</manufacturer> @@ -41633,9 +41646,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="nomnlndg" cloneof="nomnlnd" romof="nomnlnd"> + <game name="nomnlndg" sourcefile="cosmic.c" cloneof="nomnlnd" romof="nomnlnd"> <description>No Man's Land (Gottlieb)</description> <year>1980</year> <manufacturer>Universal (Gottlieb license)</manufacturer> @@ -41675,10 +41688,11 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="cheekyms"> + <game name="cheekyms" sourcefile="cheekyms.c"> <description>Cheeky Mouse</description> + <year>1980</year> <manufacturer>Universal</manufacturer> <rom name="cm03.c5" size="2048" crc="1ad0cb40" sha1="2a751395ac19a3218c22cfd3597f9a17b8e31527" region="cpu1" offset="0"/> <rom name="cm04.c6" size="2048" crc="2238f607" sha1="35df9eb49f6e3c6351fae220d773442cf8536f90" region="cpu1" offset="800"/> @@ -41688,8 +41702,8 @@ <rom name="cm02.c2" size="2048" crc="885887c3" sha1="62ce8e39d27c0cfea9ebd51757ad31b0baf6b3cd" region="gfx1" dispose="yes" offset="800"/> <rom name="cm07.n5" size="2048" crc="2738c88d" sha1="3ccd6c1d49bfe2c1b141854ec705e692252e8af8" region="gfx2" dispose="yes" offset="0"/> <rom name="cm08.n6" size="2048" crc="b3fbd4ac" sha1="9f45cc6d9e0bf580149e18de5c3e37d4de347b92" region="gfx2" dispose="yes" offset="800"/> - <rom name="cm.m8" size="32" crc="2386bc68" sha1="6676082860cd8678a71339a352d2c6286e78ba44" region="proms" offset="0"/> - <rom name="cm.m9" size="32" crc="db9c59a5" sha1="357ed5ac8e954a4c8b4d78d36e57bf2de36c1d57" region="proms" offset="20"/> + <rom name="cm.m9" size="32" crc="db9c59a5" sha1="357ed5ac8e954a4c8b4d78d36e57bf2de36c1d57" region="proms" offset="0"/> + <rom name="cm.m8" size="32" crc="2386bc68" sha1="6676082860cd8678a71339a352d2c6286e78ba44" region="proms" offset="20"/> <rom name="cm.p3" size="32" crc="6ac41516" sha1="05bf40790a0de1e859362df892f7f158c183e247" region="proms" offset="40"/> <chip type="cpu" name="Z80" clock="2500000"/> <chip type="audio" name="DAC"/> @@ -41721,9 +41735,9 @@ <dipvalue name="6000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="192"/> </game> - <game name="ladybug"> + <game name="ladybug" sourcefile="ladybug.c"> <description>Lady Bug</description> <year>1981</year> <manufacturer>Universal</manufacturer> @@ -41798,9 +41812,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ladybugb" cloneof="ladybug" romof="ladybug"> + <game name="ladybugb" sourcefile="ladybug.c" cloneof="ladybug" romof="ladybug"> <description>Lady Bug (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -41875,9 +41889,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="snapjack"> + <game name="snapjack" sourcefile="ladybug.c"> <description>Snap Jack</description> <year>1982</year> <manufacturer>Universal</manufacturer> @@ -41954,9 +41968,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cavenger"> + <game name="cavenger" sourcefile="ladybug.c"> <description>Cosmic Avenger</description> <year>1981</year> <manufacturer>Universal</manufacturer> @@ -42028,9 +42042,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="dorodon"> + <game name="dorodon" sourcefile="ladybug.c"> <description>Dorodon (set 1)</description> <year>1982</year> <manufacturer>Falcon</manufacturer> @@ -42104,9 +42118,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="dorodon2" cloneof="dorodon" romof="dorodon"> + <game name="dorodon2" sourcefile="ladybug.c" cloneof="dorodon" romof="dorodon"> <description>Dorodon (set 2)</description> <year>1982</year> <manufacturer>Falcon</manufacturer> @@ -42180,9 +42194,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="mrdo"> + <game name="mrdo" sourcefile="mrdo.c"> <description>Mr. Do!</description> <year>1982</year> <manufacturer>Universal</manufacturer> @@ -42258,9 +42272,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mrdoy" cloneof="mrdo" romof="mrdo"> + <game name="mrdoy" sourcefile="mrdo.c" cloneof="mrdo" romof="mrdo"> <description>Mr. Do! (prototype)</description> <year>1982</year> <manufacturer>Universal</manufacturer> @@ -42336,9 +42350,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mrdot" cloneof="mrdo" romof="mrdo"> + <game name="mrdot" sourcefile="mrdo.c" cloneof="mrdo" romof="mrdo"> <description>Mr. Do! (Taito)</description> <year>1982</year> <manufacturer>Universal (Taito license)</manufacturer> @@ -42414,9 +42428,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mrdofix" cloneof="mrdo" romof="mrdo"> + <game name="mrdofix" sourcefile="mrdo.c" cloneof="mrdo" romof="mrdo"> <description>Mr. Do! (bugfixed)</description> <year>1982</year> <manufacturer>Universal (Taito license)</manufacturer> @@ -42492,9 +42506,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mrlo" cloneof="mrdo" romof="mrdo"> + <game name="mrlo" sourcefile="mrdo.c" cloneof="mrdo" romof="mrdo"> <description>Mr. Lo!</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -42570,9 +42584,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mrdu" cloneof="mrdo" romof="mrdo"> + <game name="mrdu" sourcefile="mrdo.c" cloneof="mrdo" romof="mrdo"> <description>Mr. Du!</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -42648,9 +42662,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="yankeedo" cloneof="mrdo" romof="mrdo"> + <game name="yankeedo" sourcefile="mrdo.c" cloneof="mrdo" romof="mrdo"> <description>Yankee DO!</description> <year>1982</year> <manufacturer>hack</manufacturer> @@ -42726,9 +42740,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="docastle"> + <game name="docastle" sourcefile="docastle.c"> <description>Mr. Do's Castle (set 1)</description> <year>1983</year> <manufacturer>Universal</manufacturer> @@ -42812,9 +42826,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="docastl2" cloneof="docastle" romof="docastle"> + <game name="docastl2" sourcefile="docastle.c" cloneof="docastle" romof="docastle"> <description>Mr. Do's Castle (set 2)</description> <year>1983</year> <manufacturer>Universal</manufacturer> @@ -42898,9 +42912,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="docastlo" cloneof="docastle" romof="docastle"> + <game name="docastlo" sourcefile="docastle.c" cloneof="docastle" romof="docastle"> <description>Mr. Do's Castle (older)</description> <year>1983</year> <manufacturer>Universal</manufacturer> @@ -42984,9 +42998,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="douni" cloneof="docastle" romof="docastle"> + <game name="douni" sourcefile="docastle.c" cloneof="docastle" romof="docastle"> <description>Mr. Do vs. Unicorns</description> <year>1983</year> <manufacturer>Universal</manufacturer> @@ -43070,9 +43084,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="dorunrun"> + <game name="dorunrun" sourcefile="docastle.c"> <description>Do! Run Run (set 1)</description> <year>1984</year> <manufacturer>Universal</manufacturer> @@ -43158,9 +43172,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="dorunru2" cloneof="dorunrun" romof="dorunrun"> + <game name="dorunru2" sourcefile="docastle.c" cloneof="dorunrun" romof="dorunrun"> <description>Do! Run Run (set 2)</description> <year>1984</year> <manufacturer>Universal</manufacturer> @@ -43246,9 +43260,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="dorunruc" cloneof="dorunrun" romof="dorunrun"> + <game name="dorunruc" sourcefile="docastle.c" cloneof="dorunrun" romof="dorunrun"> <description>Do! Run Run (Do's Castle hardware)</description> <year>1984</year> <manufacturer>Universal</manufacturer> @@ -43334,9 +43348,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="spiero" cloneof="dorunrun" romof="dorunrun"> + <game name="spiero" sourcefile="docastle.c" cloneof="dorunrun" romof="dorunrun"> <description>Super Pierrot (Japan)</description> <year>1987</year> <manufacturer>Universal</manufacturer> @@ -43422,9 +43436,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="dowild"> + <game name="dowild" sourcefile="docastle.c"> <description>Mr. Do's Wild Ride</description> <year>1984</year> <manufacturer>Universal</manufacturer> @@ -43508,9 +43522,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="jjack"> + <game name="jjack" sourcefile="docastle.c"> <description>Jumping Jack</description> <year>1984</year> <manufacturer>Universal</manufacturer> @@ -43592,9 +43606,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="kickridr"> + <game name="kickridr" sourcefile="docastle.c"> <description>Kick Rider</description> <year>1984</year> <manufacturer>Universal</manufacturer> @@ -43678,9 +43692,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="258"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="258"/> </game> - <game name="idsoccer"> + <game name="idsoccer" sourcefile="docastle.c"> <description>Indoor Soccer</description> <year>1985</year> <manufacturer>Universal</manufacturer> @@ -43771,9 +43785,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="258"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="258"/> </game> - <game name="radarscp" sampleof="dkong"> + <game name="radarscp" sourcefile="dkong.c" sampleof="dkong"> <description>Radar Scope</description> <year>1980</year> <manufacturer>Nintendo</manufacturer> @@ -43828,9 +43842,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="258"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="258"/> </game> - <game name="dkong"> + <game name="dkong" sourcefile="dkong.c"> <description>Donkey Kong (US set 1)</description> <year>1981</year> <manufacturer>Nintendo of America</manufacturer> @@ -43885,9 +43899,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongo" cloneof="dkong" romof="dkong" sampleof="dkong"> + <game name="dkongo" sourcefile="dkong.c" cloneof="dkong" romof="dkong" sampleof="dkong"> <description>Donkey Kong (US set 2)</description> <year>1981</year> <manufacturer>Nintendo</manufacturer> @@ -43942,9 +43956,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongjp" cloneof="dkong" romof="dkong" sampleof="dkong"> + <game name="dkongjp" sourcefile="dkong.c" cloneof="dkong" romof="dkong" sampleof="dkong"> <description>Donkey Kong (Japan set 1)</description> <year>1981</year> <manufacturer>Nintendo</manufacturer> @@ -43999,9 +44013,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongjo" cloneof="dkong" romof="dkong" sampleof="dkong"> + <game name="dkongjo" sourcefile="dkong.c" cloneof="dkong" romof="dkong" sampleof="dkong"> <description>Donkey Kong (Japan set 2)</description> <year>1981</year> <manufacturer>Nintendo</manufacturer> @@ -44056,9 +44070,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongjo1" cloneof="dkong" romof="dkong" sampleof="dkong"> + <game name="dkongjo1" sourcefile="dkong.c" cloneof="dkong" romof="dkong" sampleof="dkong"> <description>Donkey Kong (Japan set 3) (bad dump?)</description> <year>1981</year> <manufacturer>Nintendo</manufacturer> @@ -44113,9 +44127,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongjr"> + <game name="dkongjr" sourcefile="dkong.c"> <description>Donkey Kong Junior (US)</description> <year>1982</year> <manufacturer>Nintendo of America</manufacturer> @@ -44173,9 +44187,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongjrj" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> + <game name="dkongjrj" sourcefile="dkong.c" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> <description>Donkey Kong Jr. (Japan)</description> <year>1982</year> <manufacturer>Nintendo</manufacturer> @@ -44233,9 +44247,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkngjnrj" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> + <game name="dkngjnrj" sourcefile="dkong.c" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> <description>Donkey Kong Junior (Japan?)</description> <year>1982</year> <manufacturer>Nintendo</manufacturer> @@ -44293,9 +44307,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkongjrb" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> + <game name="dkongjrb" sourcefile="dkong.c" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> <description>Donkey Kong Jr. (bootleg)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -44353,9 +44367,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkngjnrb" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> + <game name="dkngjnrb" sourcefile="dkong.c" cloneof="dkongjr" romof="dkongjr" sampleof="dkongjr"> <description>Donkey Kong Junior (bootleg?)</description> <year>1982</year> <manufacturer>Nintendo of America</manufacturer> @@ -44414,9 +44428,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkong3"> + <game name="dkong3" sourcefile="dkong.c"> <description>Donkey Kong 3 (US)</description> <year>1983</year> <manufacturer>Nintendo of America</manufacturer> @@ -44493,9 +44507,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkong3j" cloneof="dkong3" romof="dkong3"> + <game name="dkong3j" sourcefile="dkong.c" cloneof="dkong3" romof="dkong3"> <description>Donkey Kong 3 (Japan)</description> <year>1983</year> <manufacturer>Nintendo</manufacturer> @@ -44572,9 +44586,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dkong3b" cloneof="dkong3" romof="dkong3" sampleof="dkongjr"> + <game name="dkong3b" sourcefile="dkong.c" cloneof="dkong3" romof="dkong3" sampleof="dkongjr"> <description>Donkey Kong 3 (bootleg on Donkey Kong Jr. hardware)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -44654,9 +44668,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="256"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mario"> + <game name="mario" sourcefile="mario.c"> <description>Mario Bros. (US)</description> <year>1983</year> <manufacturer>Nintendo of America</manufacturer> @@ -44710,9 +44724,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mariojp" cloneof="mario" romof="mario" sampleof="mario"> + <game name="mariojp" sourcefile="mario.c" cloneof="mario" romof="mario" sampleof="mario"> <description>Mario Bros. (Japan)</description> <year>1983</year> <manufacturer>Nintendo</manufacturer> @@ -44768,9 +44782,9 @@ <dipvalue name="40000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="masao" cloneof="mario" romof="mario"> + <game name="masao" sourcefile="mario.c" cloneof="mario" romof="mario"> <description>Masao</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -44818,9 +44832,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pestplce" cloneof="mario" romof="mario"> + <game name="pestplce" sourcefile="dkong.c" cloneof="mario" romof="mario"> <description>Pest Place</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -44870,9 +44884,9 @@ <dipvalue name="40000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="256"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="spclforc"> + <game name="spclforc" sourcefile="dkong.c"> <description>Special Forces</description> <year>1985</year> <manufacturer>Senko Industries (Magic Eletronics Inc. licence)</manufacturer> @@ -44919,9 +44933,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="spcfrcii"> + <game name="spcfrcii" sourcefile="dkong.c"> <description>Special Forces II</description> <year>1985</year> <manufacturer>Senko Industries (Magic Eletronics Inc. licence)</manufacturer> @@ -44968,9 +44982,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="8ballact"> + <game name="8ballact" sourcefile="dkong.c"> <description>Eight Ball Action (DK conversion)</description> <year>1984</year> <manufacturer>Seatongrove Ltd (Magic Eletronics USA licence)</manufacturer> @@ -45028,9 +45042,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="8ballat2" cloneof="8ballact" romof="8ballact"> + <game name="8ballat2" sourcefile="dkong.c" cloneof="8ballact" romof="8ballact"> <description>Eight Ball Action (DKJr conversion)</description> <year>1984</year> <manufacturer>Seatongrove Ltd (Magic Eletronics USA licence)</manufacturer> @@ -45086,9 +45100,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shootgal"> + <game name="shootgal" sourcefile="dkong.c"> <description>Shooting Gallery</description> <year>1984</year> <manufacturer>Seatongrove Ltd (Zaccaria licence)</manufacturer> @@ -45146,9 +45160,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="drakton" sampleof="dkong"> + <game name="drakton" sourcefile="dkong.c" sampleof="dkong"> <description>Drakton</description> <manufacturer>Epos Corporation</manufacturer> <rom name="2764.u2" size="8192" region="cpu1" status="nodump" offset="0"/> @@ -45199,9 +45213,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="strtheat" sampleof="dkongjr"> + <game name="strtheat" sourcefile="dkong.c" sampleof="dkongjr"> <description>Street Heat - Cardinal Amusements</description> <year>1985</year> <manufacturer>Epos Corporation</manufacturer> @@ -45258,9 +45272,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="hunchbkd" cloneof="hunchbak" romof="hunchbak"> + <game name="hunchbkd" sourcefile="dkong.c" cloneof="hunchbak" romof="hunchbak"> <description>Hunchback (DK conversion)</description> <year>1983</year> <manufacturer>Century Electronics</manufacturer> @@ -45317,9 +45331,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="256"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sbdk" cloneof="superbik" romof="superbik"> + <game name="sbdk" sourcefile="dkong.c" cloneof="superbik" romof="superbik"> <description>Super Bike (DK conversion)</description> <year>1984</year> <manufacturer>Century Electronics</manufacturer> @@ -45377,9 +45391,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="herbiedk" cloneof="huncholy" romof="huncholy"> + <game name="herbiedk" sourcefile="dkong.c" cloneof="huncholy" romof="huncholy"> <description>Herbie at the Olympics (DK conversion)</description> <year>1984</year> <manufacturer>CVS</manufacturer> @@ -45438,9 +45452,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="herodk" cloneof="hero" romof="hero"> + <game name="herodk" sourcefile="dkong.c" cloneof="hero" romof="hero"> <description>Hero in the Castle of Doom (DK conversion)</description> <year>1984</year> <manufacturer>Seatongrove Ltd (Crown license)</manufacturer> @@ -45494,9 +45508,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="herodku" cloneof="hero" romof="hero"> + <game name="herodku" sourcefile="dkong.c" cloneof="hero" romof="hero"> <description>Hero in the Castle of Doom (DK conversion not encrypted)</description> <year>1984</year> <manufacturer>Seatongrove Ltd (Crown license)</manufacturer> @@ -45550,9 +45564,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="skyskipr"> + <game name="skyskipr" sourcefile="popeye.c"> <description>Sky Skipper</description> <year>1981</year> <manufacturer>Nintendo</manufacturer> @@ -45636,9 +45650,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="popeye"> + <game name="popeye" sourcefile="popeye.c"> <description>Popeye (revision D)</description> <year>1982</year> <manufacturer>Nintendo</manufacturer> @@ -45714,9 +45728,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="popeyeu" cloneof="popeye" romof="popeye"> + <game name="popeyeu" sourcefile="popeye.c" cloneof="popeye" romof="popeye"> <description>Popeye (revision D not protected)</description> <year>1982</year> <manufacturer>Nintendo</manufacturer> @@ -45792,9 +45806,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="popeyef" cloneof="popeye" romof="popeye"> + <game name="popeyef" sourcefile="popeye.c" cloneof="popeye" romof="popeye"> <description>Popeye (revision F)</description> <year>1982</year> <manufacturer>Nintendo</manufacturer> @@ -45870,9 +45884,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="popeyebl" cloneof="popeye" romof="popeye"> + <game name="popeyebl" sourcefile="popeye.c" cloneof="popeye" romof="popeye"> <description>Popeye (bootleg)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -45948,9 +45962,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="punchout"> + <game name="punchout" sourcefile="punchout.c"> <description>Punch-Out!!</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -46039,9 +46053,9 @@ <dipvalue name="Nintendo" default="yes"/> <dipvalue name="Nintendo of America"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1025"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1025"/> </game> - <game name="spnchout"> + <game name="spnchout" sourcefile="punchout.c"> <description>Super Punch-Out!!</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -46131,9 +46145,9 @@ <dipvalue name="Nintendo" default="yes"/> <dipvalue name="Nintendo of America"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1025"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1025"/> </game> - <game name="spnchotj" cloneof="spnchout" romof="spnchout"> + <game name="spnchotj" sourcefile="punchout.c" cloneof="spnchout" romof="spnchout"> <description>Super Punch-Out!! (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -46223,9 +46237,9 @@ <dipvalue name="Nintendo" default="yes"/> <dipvalue name="Nintendo of America"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1025"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1025"/> </game> - <game name="armwrest"> + <game name="armwrest" sourcefile="punchout.c"> <description>Arm Wrestling</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -46310,9 +46324,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1025"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1025"/> </game> - <game name="pc_tenis" romof="playch10"> + <game name="pc_tenis" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Tennis</description> <year>1983</year> <manufacturer>Nintendo</manufacturer> @@ -46425,9 +46439,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_mario" romof="playch10"> + <game name="pc_mario" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Mario Bros.</description> <year>1983</year> <manufacturer>Nintendo</manufacturer> @@ -46540,9 +46554,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_bball" romof="playch10"> + <game name="pc_bball" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Baseball</description> <year>1984</year> <manufacturer>Nintendo of America</manufacturer> @@ -46655,9 +46669,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_bfght" romof="playch10"> + <game name="pc_bfght" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Balloon Fight</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -46770,9 +46784,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ebike" romof="playch10"> + <game name="pc_ebike" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Excite Bike</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -46885,9 +46899,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_golf" romof="playch10"> + <game name="pc_golf" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Golf</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -47000,9 +47014,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_kngfu" romof="playch10"> + <game name="pc_kngfu" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Kung Fu</description> <year>1984</year> <manufacturer>Irem (Nintendo license)</manufacturer> @@ -47115,9 +47129,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_1942" romof="playch10"> + <game name="pc_1942" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: 1942</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -47230,9 +47244,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="320"/> </game> - <game name="pc_smb" romof="playch10"> + <game name="pc_smb" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Super Mario Bros.</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -47345,9 +47359,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_vball" romof="playch10"> + <game name="pc_vball" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Volley Ball</description> <year>1986</year> <manufacturer>Nintendo</manufacturer> @@ -47460,9 +47474,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_duckh" romof="playch10"> + <game name="pc_duckh" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Duck Hunt</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -47575,9 +47589,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_hgaly" romof="playch10"> + <game name="pc_hgaly" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Hogan's Alley</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -47690,9 +47704,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_wgnmn" romof="playch10"> + <game name="pc_wgnmn" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Wild Gunman</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -47805,9 +47819,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_grdus" romof="playch10"> + <game name="pc_grdus" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Gradius</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -47920,9 +47934,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_grdue" cloneof="pc_grdus" romof="pc_grdus"> + <game name="pc_grdue" sourcefile="playch10.c" cloneof="pc_grdus" romof="pc_grdus"> <description>PlayChoice-10: Gradius (older)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -48035,9 +48049,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_tkfld" romof="playch10"> + <game name="pc_tkfld" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Track & Field</description> <year>1987</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -48150,9 +48164,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_pwrst" romof="playch10"> + <game name="pc_pwrst" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Pro Wrestling</description> <year>1986</year> <manufacturer>Nintendo</manufacturer> @@ -48265,9 +48279,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_trjan" romof="playch10"> + <game name="pc_trjan" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Trojan</description> <year>1986</year> <manufacturer>Capcom USA (Nintendo of America license)</manufacturer> @@ -48380,9 +48394,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_cvnia" romof="playch10"> + <game name="pc_cvnia" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Castlevania</description> <year>1987</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -48495,9 +48509,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_dbldr" romof="playch10"> + <game name="pc_dbldr" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Double Dribble</description> <year>1987</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -48610,9 +48624,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_rnatk" romof="playch10"> + <game name="pc_rnatk" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Rush N' Attack</description> <year>1987</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -48725,9 +48739,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_rygar" romof="playch10"> + <game name="pc_rygar" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Rygar</description> <year>1987</year> <manufacturer>Tecmo (Nintendo of America license)</manufacturer> @@ -48840,9 +48854,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_cntra" romof="playch10"> + <game name="pc_cntra" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Contra</description> <year>1988</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -48955,9 +48969,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_goons" romof="playch10"> + <game name="pc_goons" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: The Goonies</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -49070,9 +49084,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_mtoid" romof="playch10"> + <game name="pc_mtoid" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Metroid</description> <year>1986</year> <manufacturer>Nintendo</manufacturer> @@ -49185,9 +49199,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_radrc" romof="playch10"> + <game name="pc_radrc" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Rad Racer</description> <year>1987</year> <manufacturer>Square</manufacturer> @@ -49300,9 +49314,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_miket" romof="playch10"> + <game name="pc_miket" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Mike Tyson's Punchout</description> <year>1987</year> <manufacturer>Nintendo</manufacturer> @@ -49415,9 +49429,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="320"/> </game> - <game name="pc_rcpam" romof="playch10"> + <game name="pc_rcpam" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: RC Pro Am</description> <year>1987</year> <manufacturer>Rare</manufacturer> @@ -49530,9 +49544,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ngaid" romof="playch10"> + <game name="pc_ngaid" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Ninja Gaiden</description> <year>1989</year> <manufacturer>Tecmo (Nintendo of America license)</manufacturer> @@ -49645,9 +49659,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_tmnt" romof="playch10"> + <game name="pc_tmnt" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Teenage Mutant Ninja Turtles</description> <year>1989</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -49760,9 +49774,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ftqst" romof="playch10"> + <game name="pc_ftqst" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Uncle Fester's Quest - The Addams Family</description> <year>1989</year> <manufacturer>Sunsoft (Nintendo of America license)</manufacturer> @@ -49875,9 +49889,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_bstar" romof="playch10"> + <game name="pc_bstar" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Baseball Stars</description> <year>1989</year> <manufacturer>SNK (Nintendo of America license)</manufacturer> @@ -49990,9 +50004,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_tbowl" romof="playch10"> + <game name="pc_tbowl" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Tecmo Bowl</description> <year>1989</year> <manufacturer>Tecmo (Nintendo of America license)</manufacturer> @@ -50105,9 +50119,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_drmro" romof="playch10"> + <game name="pc_drmro" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Dr. Mario</description> <year>1990</year> <manufacturer>Nintendo</manufacturer> @@ -50220,9 +50234,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ynoid" romof="playch10"> + <game name="pc_ynoid" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Yo! Noid</description> <year>1990</year> <manufacturer>Capcom USA (Nintendo of America license)</manufacturer> @@ -50335,9 +50349,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_rrngr" romof="playch10"> + <game name="pc_rrngr" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Chip'n Dale - Rescue Rangers</description> <year>1987</year> <manufacturer>Capcom USA (Nintendo of America license)</manufacturer> @@ -50450,9 +50464,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ddrgn" romof="playch10"> + <game name="pc_ddrgn" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Double Dragon</description> <year>1988</year> <manufacturer>Technos</manufacturer> @@ -50565,9 +50579,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_gntlt" romof="playch10"> + <game name="pc_gntlt" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Gauntlet</description> <year>1985</year> <manufacturer>Atari/Tengen (Nintendo of America license)</manufacturer> @@ -50680,9 +50694,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_smb2" romof="playch10"> + <game name="pc_smb2" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Super Mario Bros. 2</description> <year>1988</year> <manufacturer>Nintendo</manufacturer> @@ -50795,9 +50809,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_smb3" romof="playch10"> + <game name="pc_smb3" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Super Mario Bros. 3</description> <year>1988</year> <manufacturer>Nintendo</manufacturer> @@ -50911,9 +50925,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_mman3" romof="playch10"> + <game name="pc_mman3" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Mega Man 3</description> <year>1990</year> <manufacturer>Capcom USA (Nintendo of America license)</manufacturer> @@ -51027,9 +51041,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_radr2" romof="playch10"> + <game name="pc_radr2" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Rad Racer II</description> <year>1990</year> <manufacturer>Square (Nintendo of America license)</manufacturer> @@ -51142,9 +51156,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_suprc" romof="playch10"> + <game name="pc_suprc" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Super C</description> <year>1990</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -51257,9 +51271,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_tmnt2" romof="playch10"> + <game name="pc_tmnt2" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Teenage Mutant Ninja Turtles II</description> <year>1990</year> <manufacturer>Konami (Nintendo of America license)</manufacturer> @@ -51372,9 +51386,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_wcup" romof="playch10"> + <game name="pc_wcup" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Nintendo World Cup</description> <year>1990</year> <manufacturer>Technos (Nintendo license)</manufacturer> @@ -51487,9 +51501,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ngai2" romof="playch10"> + <game name="pc_ngai2" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Ninja Gaiden 2</description> <year>1990</year> <manufacturer>Tecmo (Nintendo of America license)</manufacturer> @@ -51602,9 +51616,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_ngai3" romof="playch10"> + <game name="pc_ngai3" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Ninja Gaiden 3</description> <year>1991</year> <manufacturer>Tecmo (Nintendo of America license)</manufacturer> @@ -51717,9 +51731,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_pwbld" romof="playch10"> + <game name="pc_pwbld" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Power Blade</description> <year>1991</year> <manufacturer>Taito (Nintendo of America license)</manufacturer> @@ -51832,9 +51846,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_rkats" romof="playch10"> + <game name="pc_rkats" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Rockin' Kats</description> <year>1991</year> <manufacturer>Atlus (Nintendo of America license)</manufacturer> @@ -51947,9 +51961,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_pinbt" romof="playch10"> + <game name="pc_pinbt" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: PinBot</description> <year>1988</year> <manufacturer>Rare (Nintendo of America license)</manufacturer> @@ -52062,9 +52076,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="320"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="320"/> </game> - <game name="pc_cshwk" romof="playch10"> + <game name="pc_cshwk" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Captain Sky Hawk</description> <year>1989</year> <manufacturer>Rare (Nintendo of America license)</manufacturer> @@ -52176,9 +52190,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_sjetm" romof="playch10"> + <game name="pc_sjetm" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Solar Jetman</description> <year>1990</year> <manufacturer>Rare</manufacturer> @@ -52290,9 +52304,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="pc_moglf" romof="playch10"> + <game name="pc_moglf" sourcefile="playch10.c" romof="playch10"> <description>PlayChoice-10: Mario's Open Golf</description> <year>1991</year> <manufacturer>Nintendo</manufacturer> @@ -52404,9 +52418,9 @@ <dipvalue name="1 unit every 4 seconds"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="320"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="320"/> </game> - <game name="btlecity"> + <game name="btlecity" sourcefile="vsnes.c"> <description>Vs. Battle City</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -52452,9 +52466,9 @@ <dipvalue name="Wrong 2"/> <dipvalue name="Wrong 3"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="starlstr"> + <game name="starlstr" sourcefile="vsnes.c"> <description>Vs. Star Luster</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -52497,9 +52511,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="cstlevna"> + <game name="cstlevna" sourcefile="vsnes.c"> <description>Vs. Castlevania</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -52538,9 +52552,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="cluclu"> + <game name="cluclu" sourcefile="vsnes.c"> <description>Vs. Clu Clu Land</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -52584,9 +52598,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="drmario"> + <game name="drmario" sourcefile="vsnes.c"> <description>Vs. Dr. Mario</description> <year>1990</year> <manufacturer>Nintendo</manufacturer> @@ -52624,9 +52638,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="duckhunt"> + <game name="duckhunt" sourcefile="vsnes.c"> <description>Vs. Duck Hunt</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -52668,9 +52682,9 @@ <dipvalue name="80000"/> <dipvalue name="100000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="excitebk"> + <game name="excitebk" sourcefile="vsnes.c"> <description>Vs. Excitebike</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -52714,9 +52728,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="excitbkj" cloneof="excitebk" romof="excitebk"> + <game name="excitbkj" sourcefile="vsnes.c" cloneof="excitebk" romof="excitebk"> <description>Vs. Excitebike (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -52760,9 +52774,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="goonies"> + <game name="goonies" sourcefile="vsnes.c"> <description>Vs. The Goonies</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -52804,9 +52818,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="hogalley"> + <game name="hogalley" sourcefile="vsnes.c"> <description>Vs. Hogan's Alley</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -52848,9 +52862,9 @@ <dipvalue name="80000"/> <dipvalue name="100000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="iceclimb"> + <game name="iceclimb" sourcefile="vsnes.c"> <description>Vs. Ice Climber</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -52894,9 +52908,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="iceclmbj" cloneof="iceclimb" romof="iceclimb"> + <game name="iceclmbj" sourcefile="vsnes.c" cloneof="iceclimb" romof="iceclimb"> <description>Vs. Ice Climber (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -52940,9 +52954,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="ladygolf"> + <game name="ladygolf" sourcefile="vsnes.c"> <description>Vs. Stroke and Match Golf (Ladies Version)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -52986,9 +53000,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="machridr"> + <game name="machridr" sourcefile="vsnes.c"> <description>Vs. Mach Rider (Endurance Course Version)</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -53032,9 +53046,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="machridj" cloneof="machridr" romof="machridr"> + <game name="machridj" sourcefile="vsnes.c" cloneof="machridr" romof="machridr"> <description>Vs. Mach Rider (Japan, Fighting Course Version)</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -53076,9 +53090,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="rbibb"> + <game name="rbibb" sourcefile="vsnes.c"> <description>Vs. Atari R.B.I. Baseball (set 1)</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -53113,9 +53127,9 @@ <dipvalue name="Wrong 3"/> <dipvalue name="Wrong 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="rbibba" cloneof="rbibb" romof="rbibb"> + <game name="rbibba" sourcefile="vsnes.c" cloneof="rbibb" romof="rbibb"> <description>Vs. Atari R.B.I. Baseball (set 2)</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -53150,9 +53164,9 @@ <dipvalue name="Wrong 3"/> <dipvalue name="Wrong 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="suprmrio"> + <game name="suprmrio" sourcefile="vsnes.c"> <description>Vs. Super Mario Bros.</description> <year>1986</year> <manufacturer>Nintendo</manufacturer> @@ -53196,9 +53210,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vsskykid"> + <game name="vsskykid" sourcefile="vsnes.c"> <description>Vs. Super SkyKid</description> <year>1985</year> <manufacturer>Namco</manufacturer> @@ -53235,9 +53249,9 @@ <dipvalue name="Wrong 3"/> <dipvalue name="Wrong 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="tkoboxng"> + <game name="tkoboxng" sourcefile="vsnes.c"> <description>Vs. TKO Boxing</description> <year>1987</year> <manufacturer>Namco LTD.</manufacturer> @@ -53279,9 +53293,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="64"/> + <driver status="good" color="preliminary" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="smgolf"> + <game name="smgolf" sourcefile="vsnes.c"> <description>Vs. Stroke and Match Golf (Men Version)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -53325,9 +53339,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="smgolfj" cloneof="smgolf" romof="smgolf"> + <game name="smgolfj" sourcefile="vsnes.c" cloneof="smgolf" romof="smgolf"> <description>Vs. Stroke and Match Golf (Men Version) (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -53371,9 +53385,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vspinbal"> + <game name="vspinbal" sourcefile="vsnes.c"> <description>Vs. Pinball</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -53417,9 +53431,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vspinblj" cloneof="vspinbal" romof="vspinbal"> + <game name="vspinblj" sourcefile="vsnes.c" cloneof="vspinbal" romof="vspinbal"> <description>Vs. Pinball (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -53463,9 +53477,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vsslalom"> + <game name="vsslalom" sourcefile="vsnes.c"> <description>Vs. Slalom</description> <year>1986</year> <manufacturer>Rare LTD.</manufacturer> @@ -53508,9 +53522,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="vssoccer"> + <game name="vssoccer" sourcefile="vsnes.c"> <description>Vs. Soccer</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -53552,9 +53566,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vsgradus"> + <game name="vsgradus" sourcefile="vsnes.c"> <description>Vs. Gradius</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -53594,9 +53608,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="platoon"> + <game name="platoon" sourcefile="vsnes.c"> <description>Vs. Platoon</description> <year>1987</year> <manufacturer>Ocean Software Limited</manufacturer> @@ -53638,9 +53652,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="64"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vstetris"> + <game name="vstetris" sourcefile="vsnes.c"> <description>Vs. Tetris</description> <year>1987</year> <manufacturer>Academysoft-Elory</manufacturer> @@ -53679,9 +53693,9 @@ <dipvalue name="Wrong 3"/> <dipvalue name="Wrong 4"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="64"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="64"/> </game> - <game name="mightybj"> + <game name="mightybj" sourcefile="vsnes.c"> <description>Vs. Mighty Bomb Jack (Japan)</description> <year>1986</year> <manufacturer>Tecmo</manufacturer> @@ -53724,9 +53738,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="jajamaru"> + <game name="jajamaru" sourcefile="vsnes.c"> <description>Vs. Ninja Jajamaru Kun (Japan)</description> <year>1985</year> <manufacturer>Jaleco</manufacturer> @@ -53769,9 +53783,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="topgun"> + <game name="topgun" sourcefile="vsnes.c"> <description>Vs. Top Gun</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -53810,9 +53824,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="bnglngby"> + <game name="bnglngby" sourcefile="vsnes.c"> <description>Vs. Raid on Bungeling Bay (Japan)</description> <year>1985</year> <manufacturer>Nintendo / Broderbund Software Inc.</manufacturer> @@ -53855,9 +53869,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vstennis"> + <game name="vstennis" sourcefile="vsnes.c"> <description>Vs. Tennis</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -53936,9 +53950,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="wrecking"> + <game name="wrecking" sourcefile="vsnes.c"> <description>Vs. Wrecking Crew</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -54023,9 +54037,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="balonfgt"> + <game name="balonfgt" sourcefile="vsnes.c"> <description>Vs. Balloon Fight</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -54108,9 +54122,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="vsmahjng"> + <game name="vsmahjng" sourcefile="vsnes.c"> <description>Vs. Mahjang (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -54187,9 +54201,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="vsbball"> + <game name="vsbball" sourcefile="vsnes.c"> <description>Vs. BaseBall</description> <year>1984</year> <manufacturer>Nintendo of America</manufacturer> @@ -54264,9 +54278,9 @@ <dipvalue name="Strong"/> <dipvalue name="Very Strong"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="vsbballj" cloneof="vsbball" romof="vsbball"> + <game name="vsbballj" sourcefile="vsnes.c" cloneof="vsbball" romof="vsbball"> <description>Vs. BaseBall (Japan set 1)</description> <year>1984</year> <manufacturer>Nintendo of America</manufacturer> @@ -54341,9 +54355,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="vsbbalja" cloneof="vsbball" romof="vsbball"> + <game name="vsbbalja" sourcefile="vsnes.c" cloneof="vsbball" romof="vsbball"> <description>Vs. BaseBall (Japan set 2)</description> <year>1984</year> <manufacturer>Nintendo of America</manufacturer> @@ -54418,9 +54432,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="iceclmrj"> + <game name="iceclmrj" sourcefile="vsnes.c"> <description>Vs. Ice Climber Dual (Japan)</description> <year>1984</year> <manufacturer>Nintendo</manufacturer> @@ -54497,9 +54511,9 @@ </dipswitch> <dipswitch name="Service Mode (Right Side)"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="vsgshoe"> + <game name="vsgshoe" sourcefile="vsnes.c"> <description>Vs. Gumshoe</description> <year>1986</year> <manufacturer>Nintendo</manufacturer> @@ -54543,9 +54557,9 @@ <dipvalue name="80000" default="yes"/> <dipvalue name="100000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="supxevs"> + <game name="supxevs" sourcefile="vsnes.c"> <description>Vs. Super Xevious</description> <year>1986</year> <manufacturer>Namco</manufacturer> @@ -54586,9 +54600,9 @@ <dipvalue name="Wrong 2"/> <dipvalue name="Wrong 3"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vsfdf"> + <game name="vsfdf" sourcefile="vsnes.c"> <description>Vs. Freedom Force</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -54631,9 +54645,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="smgolfb" cloneof="smgolf" romof="smgolf"> + <game name="smgolfb" sourcefile="vsnes.c" cloneof="smgolf" romof="smgolf"> <description>Vs. Stroke and Match Golf (Men set 2)</description> <year>1985</year> <manufacturer>Nintendo</manufacturer> @@ -54677,9 +54691,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="64"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="vsbbaljb" cloneof="vsbball" romof="vsbball"> + <game name="vsbbaljb" sourcefile="vsnes.c" cloneof="vsbball" romof="vsbball"> <description>Vs. BaseBall (Japan set 3)</description> <year>1984</year> <manufacturer>Nintendo of America</manufacturer> @@ -54754,9 +54768,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="128"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="nss_ssoc" romof="nss"> + <game name="nss_ssoc" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Super Soccer</description> <year>1992</year> <manufacturer>Human Inc.</manufacturer> @@ -54799,9 +54813,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_actr" romof="nss"> + <game name="nss_actr" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Act Raiser</description> <year>1992</year> <manufacturer>Enix</manufacturer> @@ -54845,9 +54859,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_con3" romof="nss"> + <game name="nss_con3" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Contra 3: The Alien Wars</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -54891,9 +54905,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_adam" romof="nss"> + <game name="nss_adam" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: The Addams Family</description> <year>1992</year> <manufacturer>Ocean</manufacturer> @@ -54937,9 +54951,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_aten" romof="nss"> + <game name="nss_aten" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: David Crane's Amazing Tennis</description> <year>1992</year> <manufacturer>Absolute Entertainment Inc.</manufacturer> @@ -54983,9 +54997,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="32768"/> </game> - <game name="nss_rob3" romof="nss"> + <game name="nss_rob3" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Robocop 3</description> <year>1992</year> <manufacturer>Ocean</manufacturer> @@ -55029,9 +55043,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_ncaa" romof="nss"> + <game name="nss_ncaa" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: NCAA Basketball</description> <year>1992</year> <manufacturer>Sculptured Software Inc.</manufacturer> @@ -55075,9 +55089,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_skin" romof="nss"> + <game name="nss_skin" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Skins Game</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -55121,9 +55135,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_lwep" romof="nss"> + <game name="nss_lwep" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Lethal Weapon</description> <year>1992</year> <manufacturer>Ocean</manufacturer> @@ -55167,9 +55181,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_smw" romof="nss"> + <game name="nss_smw" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Super Mario World</description> <manufacturer>Nintendo</manufacturer> <rom name="spc700.rom" merge="spc700.rom" size="64" crc="38000b6b" sha1="9f3af3d51c229e67daa68041492afa27287aad31" region="cpu2" offset="ffc0"/> @@ -55211,9 +55225,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_fzer" romof="nss"> + <game name="nss_fzer" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: F-Zero</description> <manufacturer>Nintendo</manufacturer> <rom name="spc700.rom" merge="spc700.rom" size="64" crc="38000b6b" sha1="9f3af3d51c229e67daa68041492afa27287aad31" region="cpu2" offset="ffc0"/> @@ -55255,9 +55269,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="nss_sten" romof="nss"> + <game name="nss_sten" sourcefile="nss.c" romof="nss"> <description>Nintendo Super System: Super Tennis</description> <manufacturer>Nintendo</manufacturer> <rom name="spc700.rom" merge="spc700.rom" size="64" crc="38000b6b" sha1="9f3af3d51c229e67daa68041492afa27287aad31" region="cpu2" offset="ffc0"/> @@ -55299,9 +55313,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="seawolf"> + <game name="seawolf" sourcefile="8080bw_drivers.c"> <description>Sea Wolf</description> <year>1976</year> <manufacturer>Midway</manufacturer> @@ -55341,9 +55355,9 @@ <dipvalue name="7000"/> <dipvalue name="Test Mode"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="gunfight"> + <game name="gunfight" sourcefile="8080bw_drivers.c"> <description>Gun Fight</description> <year>1975</year> <manufacturer>Midway</manufacturer> @@ -55373,9 +55387,9 @@ <dipvalue name="80"/> <dipvalue name="90"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="tornbase"> + <game name="tornbase" sourcefile="8080bw_drivers.c"> <description>Tornado Baseball</description> <year>1976</year> <manufacturer>Midway</manufacturer> @@ -55406,9 +55420,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="280zzzap"> + <game name="280zzzap" sourcefile="8080bw_drivers.c"> <description>Datsun 280 Zzzap</description> <year>1976</year> <manufacturer>Midway</manufacturer> @@ -55445,9 +55459,9 @@ <dipvalue name="French"/> <dipvalue name="Spanish"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="maze"> + <game name="maze" sourcefile="8080bw_drivers.c"> <description>Amazing Maze</description> <year>1976</year> <manufacturer>Midway</manufacturer> @@ -55491,9 +55505,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="boothill"> + <game name="boothill" sourcefile="8080bw_drivers.c"> <description>Boot Hill</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55523,9 +55537,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="checkmat"> + <game name="checkmat" sourcefile="8080bw_drivers.c"> <description>Checkmate</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55563,9 +55577,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="desertgu"> + <game name="desertgu" sourcefile="8080bw_drivers.c"> <description>Desert Gun</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55595,9 +55609,9 @@ <dipvalue name="9000"/> <dipvalue name="Test Mode"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="dplay" cloneof="einnings" romof="einnings"> + <game name="dplay" sourcefile="8080bw_drivers.c" cloneof="einnings" romof="einnings"> <description>Double Play</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55619,9 +55633,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="lagunar"> + <game name="lagunar" sourcefile="8080bw_drivers.c"> <description>Laguna Racer</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55657,9 +55671,9 @@ <dipvalue name="Steering"/> <dipvalue name="No Extended Play"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="gmissile"> + <game name="gmissile" sourcefile="8080bw_drivers.c"> <description>Guided Missile</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55691,9 +55705,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="m4"> + <game name="m4" sourcefile="8080bw_drivers.c"> <description>M-4</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55719,9 +55733,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="clowns" sampleof="circus"> + <game name="clowns" sourcefile="8080bw_drivers.c" sampleof="circus"> <description>Clowns (rev. 2)</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -55767,9 +55781,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="clowns1" cloneof="clowns" romof="clowns" sampleof="circus"> + <game name="clowns1" sourcefile="8080bw_drivers.c" cloneof="clowns" romof="clowns" sampleof="circus"> <description>Clowns (rev. 1)</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -55815,9 +55829,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="einnings"> + <game name="einnings" sourcefile="8080bw_drivers.c"> <description>Extra Inning</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -55840,9 +55854,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="shuffle"> + <game name="shuffle" sourcefile="8080bw_drivers.c"> <description>Shuffleboard</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -55877,9 +55891,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="dogpatch" sampleof="circus"> + <game name="dogpatch" sourcefile="8080bw_drivers.c" sampleof="circus"> <description>Dog Patch</description> <year>1977</year> <manufacturer>Midway</manufacturer> @@ -55919,9 +55933,9 @@ <dipvalue name="225 Pts"/> <dipvalue name="275 Pts" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="spcenctr"> + <game name="spcenctr" sourcefile="8080bw_drivers.c"> <description>Space Encounters</description> <year>1980</year> <manufacturer>Midway</manufacturer> @@ -55961,9 +55975,9 @@ <dipvalue name="75"/> <dipvalue name="90"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="phantom2"> + <game name="phantom2" sourcefile="8080bw_drivers.c"> <description>Phantom II</description> <year>1979</year> <manufacturer>Midway</manufacturer> @@ -55988,9 +56002,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="3"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="3"/> </game> - <game name="bowler"> + <game name="bowler" sourcefile="8080bw_drivers.c"> <description>4 Player Bowling Alley</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -56026,9 +56040,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="invaders"> + <game name="invaders" sourcefile="8080bw_drivers.c"> <description>Space Invaders</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -56069,9 +56083,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="blueshrk"> + <game name="blueshrk" sourcefile="8080bw_drivers.c"> <description>Blue Shark</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -56090,9 +56104,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="invad2ct" sampleof="invaders"> + <game name="invad2ct" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Space Invaders II (Midway, cocktail)</description> <year>1980</year> <manufacturer>Midway</manufacturer> @@ -56142,9 +56156,9 @@ <dipvalue name="1500" default="yes"/> <dipvalue name="2000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="invadpt2" sampleof="invaders"> + <game name="invadpt2" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Space Invaders Part II (Taito)</description> <year>1979</year> <manufacturer>Taito</manufacturer> @@ -56190,9 +56204,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="invaddlx" cloneof="invadpt2" romof="invadpt2" sampleof="invaders"> + <game name="invaddlx" sourcefile="8080bw_drivers.c" cloneof="invadpt2" romof="invadpt2" sampleof="invaders"> <description>Space Invaders Deluxe</description> <year>1980</year> <manufacturer>Midway</manufacturer> @@ -56236,9 +56250,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="moonbase" cloneof="invadpt2" romof="invadpt2" sampleof="invaders"> + <game name="moonbase" sourcefile="8080bw_drivers.c" cloneof="invadpt2" romof="invadpt2" sampleof="invaders"> <description>Moon Base</description> <year>1978</year> <manufacturer>Nichibutsu</manufacturer> @@ -56285,9 +56299,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="earthinv" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="earthinv" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Super Earth Invasion</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -56330,9 +56344,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="spaceatt" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="spaceatt" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Attack</description> <year>1978</year> <manufacturer>Video Games GMBH</manufacturer> @@ -56375,9 +56389,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="spaceat2" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="spaceat2" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Attack II</description> <year>1980</year> <manufacturer>Zenitone-Microsec Ltd</manufacturer> @@ -56426,9 +56440,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="sinvzen" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="sinvzen" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Super Invaders (Zenitone-Microsec)</description> <manufacturer>Zenitone-Microsec Ltd</manufacturer> <rom name="1.bin" size="1024" crc="9b0da779" sha1="a52ccdb252eb69c497aa5eafb35d7f25a311b44e" region="cpu1" offset="0"/> @@ -56480,9 +56494,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="superinv" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="superinv" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Super Invaders</description> <manufacturer>bootleg</manufacturer> <rom name="00" size="1024" crc="7a9b4485" sha1="dde918ec106971972bf7c7e5085c1262522f7e35" region="cpu1" offset="0"/> @@ -56524,9 +56538,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="sstrangr" sampleof="invaders"> + <game name="sstrangr" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Space Stranger</description> <year>1978</year> <manufacturer>Yachiyo Electronics, Ltd.</manufacturer> @@ -56577,9 +56591,9 @@ <dipvalue name="Slow" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="sstrngr2" sampleof="invaders"> + <game name="sstrngr2" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Space Stranger 2</description> <year>1979</year> <manufacturer>Yachiyo Electronics, Ltd.</manufacturer> @@ -56629,9 +56643,9 @@ <dipvalue name="Slow" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="sinvemag" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="sinvemag" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Super Invaders (EMAG)</description> <manufacturer>bootleg</manufacturer> <rom name="sv0h.bin" size="1024" crc="86bb8cb6" sha1="a75648e7f2446c756d86624b15d387d25ce47b66" region="cpu1" offset="0"/> @@ -56677,9 +56691,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="jspecter" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="jspecter" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Jatre Specter (set 1)</description> <year>1979</year> <manufacturer>Jatre</manufacturer> @@ -56726,9 +56740,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="jspectr2" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="jspectr2" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Jatre Specter (set 2)</description> <year>1979</year> <manufacturer>Jatre</manufacturer> @@ -56775,9 +56789,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="invrvnge"> + <game name="invrvnge" sourcefile="8080bw_drivers.c"> <description>Invader's Revenge</description> <manufacturer>Zenitone Microsec Ltd.</manufacturer> <rom name="invrvnge.h" size="2048" crc="aca41bbb" sha1="ca71f792abd6d9a44d15b19d2ccf678e82ccba4f" region="cpu1" offset="0"/> @@ -56806,9 +56820,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="invrvnga" cloneof="invrvnge" romof="invrvnge"> + <game name="invrvnga" sourcefile="8080bw_drivers.c" cloneof="invrvnge" romof="invrvnge"> <description>Invader's Revenge (Dutchford)</description> <manufacturer>Zenitone Microsec Ltd. (Dutchford license)</manufacturer> <rom name="5m.bin" size="2048" crc="b145cb71" sha1="127eb11de7ab9835f06510fb12838c0b728c0d42" region="cpu1" offset="0"/> @@ -56837,9 +56851,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="galxwars" sampleof="invaders"> + <game name="galxwars" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Galaxy Wars (Universal set 1)</description> <year>1979</year> <manufacturer>Universal</manufacturer> @@ -56886,9 +56900,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="galxwar2" cloneof="galxwars" romof="galxwars" sampleof="invaders"> + <game name="galxwar2" sourcefile="8080bw_drivers.c" cloneof="galxwars" romof="galxwars" sampleof="invaders"> <description>Galaxy Wars (Universal set 2)</description> <year>1979</year> <manufacturer>Universal</manufacturer> @@ -56931,9 +56945,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="galxwart" cloneof="galxwars" romof="galxwars" sampleof="invaders"> + <game name="galxwart" sourcefile="8080bw_drivers.c" cloneof="galxwars" romof="galxwars" sampleof="invaders"> <description>Galaxy Wars (Taito?)</description> <year>1979</year> <manufacturer>Taito?</manufacturer> @@ -56980,9 +56994,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="starw" cloneof="galxwars" romof="galxwars" sampleof="invaders"> + <game name="starw" sourcefile="8080bw_drivers.c" cloneof="galxwars" romof="galxwars" sampleof="invaders"> <description>Star Wars</description> <year>1979</year> <manufacturer>bootleg</manufacturer> @@ -57029,9 +57043,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="lrescue" sampleof="invaders"> + <game name="lrescue" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Lunar Rescue</description> <year>1979</year> <manufacturer>Taito</manufacturer> @@ -57075,9 +57089,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="grescue" cloneof="lrescue" romof="lrescue" sampleof="invaders"> + <game name="grescue" sourcefile="8080bw_drivers.c" cloneof="lrescue" romof="lrescue" sampleof="invaders"> <description>Galaxy Rescue</description> <year>1979</year> <manufacturer>Taito (Universal license?)</manufacturer> @@ -57121,9 +57135,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="desterth" cloneof="lrescue" romof="lrescue" sampleof="invaders"> + <game name="desterth" sourcefile="8080bw_drivers.c" cloneof="lrescue" romof="lrescue" sampleof="invaders"> <description>Destination Earth</description> <year>1979</year> <manufacturer>bootleg</manufacturer> @@ -57168,9 +57182,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="cosmicmo" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="cosmicmo" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Cosmic Monsters</description> <year>1979</year> <manufacturer>Universal</manufacturer> @@ -57218,9 +57232,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="rollingc"> + <game name="rollingc" sourcefile="8080bw_drivers.c"> <description>Rolling Crash / Moon Base</description> <year>1979</year> <manufacturer>Nichibutsu</manufacturer> @@ -57258,9 +57272,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="sheriff"> + <game name="sheriff" sourcefile="8080bw_drivers.c"> <description>Sheriff</description> <year>1979</year> <manufacturer>Nintendo</manufacturer> @@ -57313,9 +57327,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="2"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="bandido" cloneof="sheriff" romof="sheriff"> + <game name="bandido" sourcefile="8080bw_drivers.c" cloneof="sheriff" romof="sheriff"> <description>Bandido</description> <year>1980</year> <manufacturer>Exidy</manufacturer> @@ -57367,9 +57381,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="ozmawars" sampleof="invaders"> + <game name="ozmawars" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Ozma Wars (set 1)</description> <year>1979</year> <manufacturer>SNK</manufacturer> @@ -57416,9 +57430,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="ozmawar2" cloneof="ozmawars" romof="ozmawars" sampleof="invaders"> + <game name="ozmawar2" sourcefile="8080bw_drivers.c" cloneof="ozmawars" romof="ozmawars" sampleof="invaders"> <description>Ozma Wars (set 2)</description> <year>1979</year> <manufacturer>SNK</manufacturer> @@ -57468,9 +57482,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="solfight" cloneof="ozmawars" romof="ozmawars" sampleof="invaders"> + <game name="solfight" sourcefile="8080bw_drivers.c" cloneof="ozmawars" romof="ozmawars" sampleof="invaders"> <description>Solar Fight</description> <year>1979</year> <manufacturer>bootleg</manufacturer> @@ -57517,9 +57531,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="spaceph" cloneof="ozmawars" romof="ozmawars" sampleof="invaders"> + <game name="spaceph" sourcefile="8080bw_drivers.c" cloneof="ozmawars" romof="ozmawars" sampleof="invaders"> <description>Space Phantoms</description> <year>1979</year> <manufacturer>Zilec Games</manufacturer> @@ -57568,9 +57582,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="schaser"> + <game name="schaser" sourcefile="8080bw_drivers.c"> <description>Space Chaser</description> <year>1979</year> <manufacturer>Taito</manufacturer> @@ -57622,9 +57636,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="8"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="schasrcv" cloneof="schaser" romof="schaser"> + <game name="schasrcv" sourcefile="8080bw_drivers.c" cloneof="schaser" romof="schaser"> <description>Space Chaser (CV version)</description> <year>1979</year> <manufacturer>Taito</manufacturer> @@ -57660,9 +57674,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="lupin3"> + <game name="lupin3" sourcefile="8080bw_drivers.c"> <description>Lupin III</description> <year>1980</year> <manufacturer>Taito</manufacturer> @@ -57697,9 +57711,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="helifire"> + <game name="helifire" sourcefile="8080bw_drivers.c"> <description>HeliFire (revision B)</description> <year>1980</year> <manufacturer>Nintendo</manufacturer> @@ -57790,9 +57804,9 @@ <dipvalue name="06"/> <dipvalue name="07"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1032"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1032"/> </game> - <game name="helifira" cloneof="helifire" romof="helifire"> + <game name="helifira" sourcefile="8080bw_drivers.c" cloneof="helifire" romof="helifire"> <description>HeliFire (revision A)</description> <year>1980</year> <manufacturer>Nintendo</manufacturer> @@ -57883,9 +57897,9 @@ <dipvalue name="06"/> <dipvalue name="07"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1032"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1032"/> </game> - <game name="spacefev"> + <game name="spacefev" sourcefile="8080bw_drivers.c"> <description>Space Fever (color)</description> <year>1979</year> <manufacturer>Nintendo</manufacturer> @@ -57911,9 +57925,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="sfeverbw" cloneof="spacefev" romof="spacefev"> + <game name="sfeverbw" sourcefile="8080bw_drivers.c" cloneof="spacefev" romof="spacefev"> <description>Space Fever (black and white)</description> <year>1979</year> <manufacturer>Nintendo</manufacturer> @@ -57939,9 +57953,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="spclaser" sampleof="invaders"> + <game name="spclaser" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Space Laser</description> <year>1980</year> <manufacturer>GamePlan (Taito)</manufacturer> @@ -57980,9 +57994,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="laser" cloneof="spclaser" romof="spclaser" sampleof="invaders"> + <game name="laser" sourcefile="8080bw_drivers.c" cloneof="spclaser" romof="spclaser" sampleof="invaders"> <description>Laser</description> <year>1980</year> <manufacturer><unknown></manufacturer> @@ -58021,9 +58035,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="spcewarl" cloneof="spclaser" romof="spclaser" sampleof="invaders"> + <game name="spcewarl" sourcefile="8080bw_drivers.c" cloneof="spclaser" romof="spclaser" sampleof="invaders"> <description>Space War (Leijac)</description> <year>1979</year> <manufacturer>Leijac (Konami)</manufacturer> @@ -58062,9 +58076,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="polaris"> + <game name="polaris" sourcefile="8080bw_drivers.c"> <description>Polaris (set 1)</description> <year>1980</year> <manufacturer>Taito</manufacturer> @@ -58123,9 +58137,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="polarisa" cloneof="polaris" romof="polaris"> + <game name="polarisa" sourcefile="8080bw_drivers.c" cloneof="polaris" romof="polaris"> <description>Polaris (set 2)</description> <year>1980</year> <manufacturer>Taito</manufacturer> @@ -58185,9 +58199,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="ballbomb"> + <game name="ballbomb" sourcefile="8080bw_drivers.c"> <description>Balloon Bomber</description> <year>1980</year> <manufacturer>Taito</manufacturer> @@ -58212,9 +58226,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8"/> </game> - <game name="m79amb"> + <game name="m79amb" sourcefile="m79amb.c"> <description>M79 Ambush</description> <year>1977</year> <manufacturer>RamTek</manufacturer> @@ -58238,9 +58252,9 @@ <video screen="raster" orientation="horizontal" width="256" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="2" control="paddle" buttons="2" coins="1" tilt="yes"/> - <driver status="good" color="good" sound="preliminary" palettesize="7"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="7"/> </game> - <game name="alieninv" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="alieninv" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Alien Invasion Part II</description> <manufacturer>bootleg</manufacturer> <rom name="1h.bin" size="2048" crc="c46df7f4" sha1="eec34b3d5585bae03c7b80585daaa05ddfcc2164" region="cpu1" offset="0"/> @@ -58282,9 +58296,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="tst_invd" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="tst_invd" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Invaders Test ROM</description> <manufacturer>Test ROM</manufacturer> <rom name="test.h" size="2048" crc="f86a2eea" sha1="4a72ff01f3e6d16bbe9bf7f123cd98895bfbed9a" region="cpu1" offset="0"/> @@ -58324,9 +58338,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="sitv" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="sitv" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Invaders (TV Version)</description> <year>1978</year> <manufacturer>Taito</manufacturer> @@ -58369,9 +58383,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="sicv" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="sicv" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Invaders (CV Version)</description> <year>1979</year> <manufacturer>Taito</manufacturer> @@ -58414,9 +58428,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="sisv" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="sisv" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Invaders (SV Version)</description> <year>1978</year> <manufacturer>Taito</manufacturer> @@ -58460,9 +58474,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="sisv2" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="sisv2" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Invaders (SV Version 2)</description> <year>1978</year> <manufacturer>Taito</manufacturer> @@ -58507,9 +58521,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spacewr3" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="spacewr3" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space War Part 3</description> <year>1978</year> <manufacturer>bootleg</manufacturer> @@ -58553,9 +58567,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="invaderl" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="invaderl" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space Invaders (Logitec)</description> <year>1978</year> <manufacturer>bootleg</manufacturer> @@ -58599,9 +58613,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="yosakdon"> + <game name="yosakdon" sourcefile="8080bw_drivers.c"> <description>Yosaku To Donbee (bootleg)</description> <year>1979</year> <manufacturer>bootleg</manufacturer> @@ -58634,9 +58648,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="spceking" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="spceking" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space King</description> <year>1978</year> <manufacturer>Leijac (Konami)</manufacturer> @@ -58681,9 +58695,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="spcewars" cloneof="invaders" romof="invaders" sampleof="invaders"> + <game name="spcewars" sourcefile="8080bw_drivers.c" cloneof="invaders" romof="invaders" sampleof="invaders"> <description>Space War (Sanritsu)</description> <year>1978</year> <manufacturer>Sanritsu</manufacturer> @@ -58730,9 +58744,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="cosmo" sampleof="invaders"> + <game name="cosmo" sourcefile="8080bw_drivers.c" sampleof="invaders"> <description>Cosmo</description> <year>1979</year> <manufacturer>bootleg</manufacturer> @@ -58768,9 +58782,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="sspeedr"> + <game name="sspeedr" sourcefile="sspeedr.c"> <description>Super Speed Race</description> <year>1979</year> <manufacturer>Midway</manufacturer> @@ -58804,9 +58818,9 @@ <dipvalue name="RAM/ROM Test"/> <dipvalue name="Accelerator Adjustment"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="16"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="16"/> </game> - <game name="sflush"> + <game name="sflush" sourcefile="8080bw_drivers.c"> <description>Straight Flush</description> <year>1979</year> <manufacturer>Taito</manufacturer> @@ -58837,9 +58851,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="lazercmd"> + <game name="lazercmd" sourcefile="lazercmd.c"> <description>Lazer Command</description> <year>1976</year> <manufacturer>Meadows Games, Inc.</manufacturer> @@ -58877,9 +58891,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="bbonk"> + <game name="bbonk" sourcefile="lazercmd.c"> <description>Bigfoot Bonkers</description> <year>1976</year> <manufacturer>Meadows Games, Inc.</manufacturer> @@ -58911,9 +58925,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="deadeye"> + <game name="deadeye" sourcefile="meadows.c"> <description>Dead Eye</description> <year>1978</year> <manufacturer>Meadows</manufacturer> @@ -58960,9 +58974,9 @@ <dipvalue name="35000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="gypsyjug"> + <game name="gypsyjug" sourcefile="meadows.c"> <description>Gypsy Juggler</description> <year>1978</year> <manufacturer>Meadows</manufacturer> @@ -59009,9 +59023,9 @@ <dipvalue name="35000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="minferno"> + <game name="minferno" sourcefile="meadows.c"> <description>Inferno (S2650)</description> <year>1978</year> <manufacturer>Meadows</manufacturer> @@ -59060,9 +59074,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="medlanes"> + <game name="medlanes" sourcefile="lazercmd.c"> <description>Meadows Lanes</description> <year>1977</year> <manufacturer>Meadows Games, Inc.</manufacturer> @@ -59106,9 +59120,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="3"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="3"/> </game> - <game name="cosmos" romof="cvs"> + <game name="cosmos" sourcefile="cvs.c" romof="cvs"> <description>Cosmos</description> <year>1981</year> <manufacturer>Century Electronics</manufacturer> @@ -59175,9 +59189,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="darkwar" romof="cvs"> + <game name="darkwar" sourcefile="cvs.c" romof="cvs"> <description>Dark Warrior</description> <year>1981</year> <manufacturer>Century Electronics</manufacturer> @@ -59244,9 +59258,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="spacefrt" romof="cvs"> + <game name="spacefrt" sourcefile="cvs.c" romof="cvs"> <description>Space Fortress</description> <year>1981</year> <manufacturer>Century Electronics</manufacturer> @@ -59313,9 +59327,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="8ball" romof="cvs"> + <game name="8ball" sourcefile="cvs.c" romof="cvs"> <description>Video Eight Ball</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59382,9 +59396,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="8ball1" cloneof="8ball" romof="8ball"> + <game name="8ball1" sourcefile="cvs.c" cloneof="8ball" romof="8ball"> <description>Video Eight Ball (Rev.1)</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59451,9 +59465,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="logger" romof="cvs"> + <game name="logger" sourcefile="cvs.c" romof="cvs"> <description>Logger</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59520,9 +59534,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="dazzler" romof="cvs"> + <game name="dazzler" sourcefile="cvs.c" romof="cvs"> <description>Dazzler</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59589,9 +59603,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="wallst" romof="cvs"> + <game name="wallst" sourcefile="cvs.c" romof="cvs"> <description>Wall Street</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59658,9 +59672,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="radarzon" romof="cvs"> + <game name="radarzon" sourcefile="cvs.c" romof="cvs"> <description>Radar Zone</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59727,9 +59741,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="radarzn1" cloneof="radarzon" romof="radarzon"> + <game name="radarzn1" sourcefile="cvs.c" cloneof="radarzon" romof="radarzon"> <description>Radar Zone (Rev.1)</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59796,9 +59810,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="radarznt" cloneof="radarzon" romof="radarzon"> + <game name="radarznt" sourcefile="cvs.c" cloneof="radarzon" romof="radarzon"> <description>Radar Zone (Tuni)</description> <year>1982</year> <manufacturer>Century Electronics (Tuni Electro Service Inc)</manufacturer> @@ -59865,9 +59879,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="outline" cloneof="radarzon" romof="radarzon"> + <game name="outline" sourcefile="cvs.c" cloneof="radarzon" romof="radarzon"> <description>Outline</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -59934,9 +59948,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="goldbug" romof="cvs"> + <game name="goldbug" sourcefile="cvs.c" romof="cvs"> <description>Gold Bug</description> <year>1982</year> <manufacturer>Century Electronics</manufacturer> @@ -60003,9 +60017,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="heartatk" romof="cvs"> + <game name="heartatk" sourcefile="cvs.c" romof="cvs"> <description>Heart Attack</description> <year>1983</year> <manufacturer>Century Electronics</manufacturer> @@ -60072,9 +60086,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="hunchbak" romof="cvs"> + <game name="hunchbak" sourcefile="cvs.c" romof="cvs"> <description>Hunchback</description> <year>1983</year> <manufacturer>Century Electronics</manufacturer> @@ -60141,9 +60155,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="superbik" romof="cvs"> + <game name="superbik" sourcefile="cvs.c" romof="cvs"> <description>Superbike</description> <year>1983</year> <manufacturer>Century Electronics</manufacturer> @@ -60210,9 +60224,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="hero" romof="cvs"> + <game name="hero" sourcefile="cvs.c" romof="cvs"> <description>Hero</description> <year>1983</year> <manufacturer>Seatongrove Ltd</manufacturer> @@ -60279,9 +60293,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="huncholy" romof="cvs"> + <game name="huncholy" sourcefile="cvs.c" romof="cvs"> <description>Hunchback Olympic</description> <year>1984</year> <manufacturer>Seatongrove Ltd</manufacturer> @@ -60348,9 +60362,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="seawolf2"> + <game name="seawolf2" sourcefile="astrocde.c"> <description>Sea Wolf II</description> <year>1978</year> <manufacturer>Midway</manufacturer> @@ -60396,9 +60410,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="spacezap"> + <game name="spacezap" sourcefile="astrocde.c"> <description>Space Zap</description> <year>1980</year> <manufacturer>Midway</manufacturer> @@ -60448,9 +60462,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ebases"> + <game name="ebases" sourcefile="astrocde.c"> <description>Extra Bases</description> <year>1980</year> <manufacturer>Midway</manufacturer> @@ -60515,9 +60529,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wow"> + <game name="wow" sourcefile="astrocde.c"> <description>Wizard of Wor</description> <year>1980</year> <manufacturer>Midway</manufacturer> @@ -60696,9 +60710,9 @@ <dipvalue name="On only when controls are touched"/> <dipvalue name="Always On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gorf"> + <game name="gorf" sourcefile="astrocde.c"> <description>Gorf</description> <year>1981</year> <manufacturer>Midway</manufacturer> @@ -60852,9 +60866,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gorfpgm1" cloneof="gorf" romof="gorf" sampleof="gorf"> + <game name="gorfpgm1" sourcefile="astrocde.c" cloneof="gorf" romof="gorf" sampleof="gorf"> <description>Gorf (Program 1)</description> <year>1981</year> <manufacturer>Midway</manufacturer> @@ -61008,9 +61022,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="robby"> + <game name="robby" sourcefile="astrocde.c"> <description>Robby Roto</description> <year>1981</year> <manufacturer>Bally Midway</manufacturer> @@ -61064,9 +61078,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="profpac"> + <game name="profpac" sourcefile="astrocde.c"> <description>Professor PacMan</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61135,9 +61149,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="solarfox"> + <game name="solarfox" sourcefile="mcr1.c"> <description>Solar Fox</description> <year>1981</year> <manufacturer>Bally Midway</manufacturer> @@ -61184,9 +61198,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="kick"> + <game name="kick" sourcefile="mcr1.c"> <description>Kick (upright)</description> <year>1981</year> <manufacturer>Midway</manufacturer> @@ -61220,9 +61234,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="kicka" cloneof="kick" romof="kick"> + <game name="kicka" sourcefile="mcr1.c" cloneof="kick" romof="kick"> <description>Kick (cocktail)</description> <year>1981</year> <manufacturer>Midway</manufacturer> @@ -61260,9 +61274,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="shollow"> + <game name="shollow" sourcefile="mcr2.c"> <description>Satan's Hollow (set 1)</description> <year>1981</year> <manufacturer>Bally Midway</manufacturer> @@ -61295,9 +61309,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="shollow2" cloneof="shollow" romof="shollow"> + <game name="shollow2" sourcefile="mcr2.c" cloneof="shollow" romof="shollow"> <description>Satan's Hollow (set 2)</description> <year>1981</year> <manufacturer>Bally Midway</manufacturer> @@ -61330,9 +61344,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="tron"> + <game name="tron" sourcefile="mcr2.c"> <description>Tron (set 1)</description> <year>1982</year> <manufacturer>Bally Midway</manufacturer> @@ -61373,9 +61387,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="tron2" cloneof="tron" romof="tron"> + <game name="tron2" sourcefile="mcr2.c" cloneof="tron" romof="tron"> <description>Tron (set 2)</description> <year>1982</year> <manufacturer>Bally Midway</manufacturer> @@ -61416,9 +61430,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="kroozr"> + <game name="kroozr" sourcefile="mcr2.c"> <description>Kozmik Kroozr</description> <year>1982</year> <manufacturer>Bally Midway</manufacturer> @@ -61450,9 +61464,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="domino"> + <game name="domino" sourcefile="mcr2.c"> <description>Domino Man</description> <year>1982</year> <manufacturer>Bally Midway</manufacturer> @@ -61492,9 +61506,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="wacko"> + <game name="wacko" sourcefile="mcr2.c"> <description>Wacko</description> <year>1982</year> <manufacturer>Bally Midway</manufacturer> @@ -61529,9 +61543,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="twotiger"> + <game name="twotiger" sourcefile="mcr2.c"> <description>Two Tigers</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -61558,9 +61572,9 @@ <input players="2" control="dial" buttons="2" coins="3" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="twotigra" cloneof="twotiger" romof="twotiger"> + <game name="twotigra" sourcefile="mcr2.c" cloneof="twotiger" romof="twotiger"> <description>Two Tigers (dedicated)</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -61599,9 +61613,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analog"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="journey"> + <game name="journey" sourcefile="mcr2.c"> <description>Journey</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61642,9 +61656,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="tapper"> + <game name="tapper" sourcefile="mcr3.c"> <description>Tapper (Budweiser)</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61688,9 +61702,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="tappera" cloneof="tapper" romof="tapper"> + <game name="tappera" sourcefile="mcr3.c" cloneof="tapper" romof="tapper"> <description>Tapper (alternate)</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61734,9 +61748,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sutapper" cloneof="tapper" romof="tapper"> + <game name="sutapper" sourcefile="mcr3.c" cloneof="tapper" romof="tapper"> <description>Tapper (Suntory)</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61780,9 +61794,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="rbtapper" cloneof="tapper" romof="tapper"> + <game name="rbtapper" sourcefile="mcr3.c" cloneof="tapper" romof="tapper"> <description>Tapper (Root Beer)</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -61826,9 +61840,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="timber"> + <game name="timber" sourcefile="mcr3.c"> <description>Timber</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -61871,9 +61885,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="dotron"> + <game name="dotron" sourcefile="mcr3.c"> <description>Discs of Tron (Upright)</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61918,9 +61932,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="dotrona" cloneof="dotron" romof="dotron"> + <game name="dotrona" sourcefile="mcr3.c" cloneof="dotron" romof="dotron"> <description>Discs of Tron (Upright alternate)</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -61965,9 +61979,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="dotrone" cloneof="dotron" romof="dotron"> + <game name="dotrone" sourcefile="mcr3.c" cloneof="dotron" romof="dotron"> <description>Discs of Tron (Environmental)</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -62012,9 +62026,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="demoderb"> + <game name="demoderb" sourcefile="mcr3.c"> <description>Demolition Derby</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -62063,9 +62077,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="demoderm" cloneof="demoderb" romof="demoderb"> + <game name="demoderm" sourcefile="mcr3.c" cloneof="demoderb" romof="demoderb"> <description>Demolition Derby (2-Player Mono Board Version)</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -62113,9 +62127,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sarge"> + <game name="sarge" sourcefile="mcr3.c"> <description>Sarge</description> <year>1985</year> <manufacturer>Bally Midway</manufacturer> @@ -62146,9 +62160,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="rampage"> + <game name="rampage" sourcefile="mcr3.c"> <description>Rampage (revision 3)</description> <year>1986</year> <manufacturer>Bally Midway</manufacturer> @@ -62198,9 +62212,9 @@ </dipswitch> <dipswitch name="Rack Advance"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="rampage2" cloneof="rampage" romof="rampage"> + <game name="rampage2" sourcefile="mcr3.c" cloneof="rampage" romof="rampage"> <description>Rampage (revision 2)</description> <year>1986</year> <manufacturer>Bally Midway</manufacturer> @@ -62250,9 +62264,9 @@ </dipswitch> <dipswitch name="Rack Advance"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="powerdrv"> + <game name="powerdrv" sourcefile="mcr3.c"> <description>Power Drive</description> <year>1986</year> <manufacturer>Bally Midway</manufacturer> @@ -62293,9 +62307,9 @@ </dipswitch> <dipswitch name="Rack Advance"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="stargrds"> + <game name="stargrds" sourcefile="mcr3.c"> <description>Star Guards</description> <year>1987</year> <manufacturer>Bally Midway</manufacturer> @@ -62335,9 +62349,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="maxrpm"> + <game name="maxrpm" sourcefile="mcr3.c"> <description>Max RPM</description> <year>1986</year> <manufacturer>Bally Midway</manufacturer> @@ -62368,9 +62382,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="spyhunt"> + <game name="spyhunt" sourcefile="mcr3.c"> <description>Spy Hunter</description> <year>1983</year> <manufacturer>Bally Midway</manufacturer> @@ -62419,9 +62433,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="68"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="68"/> </game> - <game name="turbotag"> + <game name="turbotag" sourcefile="mcr3.c"> <description>Turbo Tag (prototype)</description> <year>1985</year> <manufacturer>Bally Midway</manufacturer> @@ -62460,9 +62474,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="68"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="68"/> </game> - <game name="crater"> + <game name="crater" sourcefile="mcr3.c"> <description>Crater Raider</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -62498,9 +62512,9 @@ <input players="1" control="joy8way" buttons="3" coins="2" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="68"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="68"/> </game> - <game name="zwackery"> + <game name="zwackery" sourcefile="mcr68.c"> <description>Zwackery</description> <year>1984</year> <manufacturer>Bally Midway</manufacturer> @@ -62568,9 +62582,9 @@ <dipvalue name="Harder"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xenophob"> + <game name="xenophob" sourcefile="mcr68.c"> <description>Xenophobe</description> <year>1987</year> <manufacturer>Bally Midway</manufacturer> @@ -62617,9 +62631,9 @@ <dipvalue name="Medium" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="spyhunt2"> + <game name="spyhunt2" sourcefile="mcr68.c"> <description>Spy Hunter 2 (rev 2)</description> <year>1987</year> <manufacturer>Bally Midway</manufacturer> @@ -62670,9 +62684,9 @@ </dipswitch> <dipswitch name="Rack Advance"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="spyhnt2a" cloneof="spyhunt2" romof="spyhunt2"> + <game name="spyhnt2a" sourcefile="mcr68.c" cloneof="spyhunt2" romof="spyhunt2"> <description>Spy Hunter 2 (rev 1)</description> <year>1987</year> <manufacturer>Bally Midway</manufacturer> @@ -62723,9 +62737,9 @@ </dipswitch> <dipswitch name="Rack Advance"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="blasted"> + <game name="blasted" sourcefile="mcr68.c"> <description>Blasted</description> <year>1988</year> <manufacturer>Bally Midway</manufacturer> @@ -62771,9 +62785,9 @@ </dipswitch> <dipswitch name="Rack Advance"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="archrivl"> + <game name="archrivl" sourcefile="mcr68.c"> <description>Arch Rivals (rev 4.0)</description> <year>1989</year> <manufacturer>Bally Midway</manufacturer> @@ -62828,9 +62842,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="archriv2" cloneof="archrivl" romof="archrivl"> + <game name="archriv2" sourcefile="mcr68.c" cloneof="archrivl" romof="archrivl"> <description>Arch Rivals (rev 2.0)</description> <year>1989</year> <manufacturer>Bally Midway</manufacturer> @@ -62885,9 +62899,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="trisport"> + <game name="trisport" sourcefile="mcr68.c"> <description>Tri-Sports</description> <year>1989</year> <manufacturer>Bally Midway</manufacturer> @@ -62942,9 +62956,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="pigskin"> + <game name="pigskin" sourcefile="mcr68.c"> <description>Pigskin 621AD</description> <year>1990</year> <manufacturer>Midway</manufacturer> @@ -62999,9 +63013,9 @@ <dipvalue name="Standard" default="yes"/> <dipvalue name="Rotated"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sentetst"> + <game name="sentetst" sourcefile="balsente.c"> <description>Sente Diagnostic Cartridge</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63051,9 +63065,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cshift"> + <game name="cshift" sourcefile="balsente.c"> <description>Chicken Shift</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63102,9 +63116,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gghost"> + <game name="gghost" sourcefile="balsente.c"> <description>Goalie Ghost</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63160,9 +63174,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hattrick"> + <game name="hattrick" sourcefile="balsente.c"> <description>Hat Trick</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63211,9 +63225,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="otwalls"> + <game name="otwalls" sourcefile="balsente.c"> <description>Off the Wall (Sente)</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63259,9 +63273,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="snakepit"> + <game name="snakepit" sourcefile="balsente.c"> <description>Snake Pit</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63323,9 +63337,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="snakjack"> + <game name="snakjack" sourcefile="balsente.c"> <description>Snacks'n Jaxson</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63383,9 +63397,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stocker"> + <game name="stocker" sourcefile="balsente.c"> <description>Stocker</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63447,9 +63461,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="triviag1"> + <game name="triviag1" sourcefile="balsente.c"> <description>Trivial Pursuit (Genus I)</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63509,9 +63523,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="triviag2"> + <game name="triviag2" sourcefile="balsente.c"> <description>Trivial Pursuit (Genus II)</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63566,9 +63580,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="triviasp"> + <game name="triviasp" sourcefile="balsente.c"> <description>Trivial Pursuit (All Star Sports Edition)</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63623,9 +63637,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="triviayp"> + <game name="triviayp" sourcefile="balsente.c"> <description>Trivial Pursuit (Young Players Edition)</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63680,9 +63694,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="triviabb"> + <game name="triviabb" sourcefile="balsente.c"> <description>Trivial Pursuit (Baby Boomer Edition)</description> <year>1984</year> <manufacturer>Bally/Sente</manufacturer> @@ -63737,9 +63751,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gimeabrk"> + <game name="gimeabrk" sourcefile="balsente.c"> <description>Gimme A Break</description> <year>1985</year> <manufacturer>Bally/Sente</manufacturer> @@ -63817,9 +63831,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="minigolf"> + <game name="minigolf" sourcefile="balsente.c"> <description>Mini Golf (set 1)</description> <year>1985</year> <manufacturer>Bally/Sente</manufacturer> @@ -63903,9 +63917,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="minigol2" cloneof="minigolf" romof="minigolf"> + <game name="minigol2" sourcefile="balsente.c" cloneof="minigolf" romof="minigolf"> <description>Mini Golf (set 2)</description> <year>1985</year> <manufacturer>Bally/Sente</manufacturer> @@ -63990,9 +64004,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="toggle"> + <game name="toggle" sourcefile="balsente.c"> <description>Toggle (prototype)</description> <year>1985</year> <manufacturer>Bally/Sente</manufacturer> @@ -64038,9 +64052,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nametune"> + <game name="nametune" sourcefile="balsente.c"> <description>Name That Tune</description> <year>1986</year> <manufacturer>Bally/Sente</manufacturer> @@ -64125,9 +64139,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nstocker"> + <game name="nstocker" sourcefile="balsente.c"> <description>Night Stocker</description> <year>1986</year> <manufacturer>Bally/Sente</manufacturer> @@ -64191,9 +64205,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sfootbal"> + <game name="sfootbal" sourcefile="balsente.c"> <description>Street Football</description> <year>1986</year> <manufacturer>Bally/Sente</manufacturer> @@ -64263,9 +64277,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="spiker"> + <game name="spiker" sourcefile="balsente.c"> <description>Spiker</description> <year>1986</year> <manufacturer>Bally/Sente</manufacturer> @@ -64347,9 +64361,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stompin"> + <game name="stompin" sourcefile="balsente.c"> <description>Stompin'</description> <year>1986</year> <manufacturer>Bally/Sente</manufacturer> @@ -64435,9 +64449,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rescraid"> + <game name="rescraid" sourcefile="balsente.c"> <description>Rescue Raider</description> <year>1987</year> <manufacturer>Bally/Midway</manufacturer> @@ -64513,9 +64527,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rescrdsa" cloneof="rescraid" romof="rescraid"> + <game name="rescrdsa" sourcefile="balsente.c" cloneof="rescraid" romof="rescraid"> <description>Rescue Raider (Stand-Alone)</description> <year>1987</year> <manufacturer>Bally/Midway</manufacturer> @@ -64591,9 +64605,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="grudge"> + <game name="grudge" sourcefile="balsente.c"> <description>Grudge Match (prototype)</description> <manufacturer>Bally/Midway</manufacturer> <rom name="grudge.ab0" size="32768" crc="260965ca" sha1="79eb5dc6605974ece3d5564f10c4598204907398" region="cpu1" offset="10000"/> @@ -64629,9 +64643,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="shrike"> + <game name="shrike" sourcefile="balsente.c"> <description>Shrike Avenger (prototype)</description> <manufacturer>Bally/Sente</manufacturer> <rom name="savgu35.bin" size="8192" crc="dd2230a0" sha1="72be0e07d76ee1f170ab457ae62db87111758697" region="cpu1" offset="10000"/> @@ -64696,9 +64710,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1025"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1025"/> </game> - <game name="gridlee"> + <game name="gridlee" sourcefile="gridlee.c"> <description>Gridlee</description> <year>1983</year> <manufacturer>Videa</manufacturer> @@ -64758,9 +64772,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="andromed"> + <game name="andromed" sourcefile="skychut.c"> <description>Andromeda (Japan?)</description> <year>1979</year> <manufacturer>Irem</manufacturer> @@ -64782,9 +64796,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="preliminary" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="ipminvad"> + <game name="ipminvad" sourcefile="skychut.c"> <description>IPM Invader</description> <manufacturer>Irem</manufacturer> <rom name="b1r" size="1024" crc="f9a7eb9b" sha1="93ac65d3ac725d3e4c2fb769816ee808ab609911" region="cpu1" offset="1000"/> @@ -64805,9 +64819,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="skychut"> + <game name="skychut" sourcefile="skychut.c"> <description>Sky Chuter</description> <year>1980</year> <manufacturer>Irem</manufacturer> @@ -64830,9 +64844,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="spacbeam"> + <game name="spacbeam" sourcefile="skychut.c"> <description>Space Beam</description> <year>1979</year> <manufacturer>Irem</manufacturer> @@ -64861,9 +64875,9 @@ <dipvalue name="1 Coin 1 Play" default="yes"/> <dipvalue name="1 Coin 2 Plays"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="greenber"> + <game name="greenber" sourcefile="skychut.c"> <description>Green Beret (Irem)</description> <year>1980</year> <manufacturer>Irem</manufacturer> @@ -64895,9 +64909,9 @@ <dipvalue name="1 Coin 1 Play" default="yes"/> <dipvalue name="1 Coin 2 Plays"/> </dipswitch> - <driver status="preliminary" color="imperfect" sound="preliminary" palettesize="8"/> + <driver status="preliminary" color="imperfect" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="redalert"> + <game name="redalert" sourcefile="redalert.c"> <description>Red Alert</description> <year>1981</year> <manufacturer>Irem + GDI</manufacturer> @@ -64947,9 +64961,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="9"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="imperfect" palettesize="9"/> </game> - <game name="demoneye"> + <game name="demoneye" sourcefile="redalert.c"> <description>Demoneye-X</description> <year>1981</year> <manufacturer>Irem</manufacturer> @@ -64998,9 +65012,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="9"/> + <driver status="good" color="preliminary" sound="preliminary" graphic="imperfect" palettesize="9"/> </game> - <game name="olibochu"> + <game name="olibochu" sourcefile="olibochu.c"> <description>Oli-Boo-Chu</description> <year>1981</year> <manufacturer>Irem + GDI</manufacturer> @@ -65119,9 +65133,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="32"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="mpatrol"> + <game name="mpatrol" sourcefile="mpatrol.c"> <description>Moon Patrol</description> <year>1982</year> <manufacturer>Irem</manufacturer> @@ -65215,9 +65229,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="192"/> </game> - <game name="mpatrolw" cloneof="mpatrol" romof="mpatrol"> + <game name="mpatrolw" sourcefile="mpatrol.c" cloneof="mpatrol" romof="mpatrol"> <description>Moon Patrol (Williams)</description> <year>1982</year> <manufacturer>Irem (Williams license)</manufacturer> @@ -65311,9 +65325,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="192"/> </game> - <game name="troangel"> + <game name="troangel" sourcefile="troangel.c"> <description>Tropical Angel</description> <year>1983</year> <manufacturer>Irem</manufacturer> @@ -65398,9 +65412,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="272"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="272"/> </game> - <game name="yard"> + <game name="yard" sourcefile="yard.c"> <description>10 Yard Fight (Japan)</description> <year>1983</year> <manufacturer>Irem</manufacturer> @@ -65499,9 +65513,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="528"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="528"/> </game> - <game name="vsyard" cloneof="yard" romof="yard"> + <game name="vsyard" sourcefile="yard.c" cloneof="yard" romof="yard"> <description>10 Yard Fight (Vs. version World, 11/05/84)</description> <year>1984</year> <manufacturer>Irem</manufacturer> @@ -65600,9 +65614,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="528"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="528"/> </game> - <game name="vsyard2" cloneof="yard" romof="yard"> + <game name="vsyard2" sourcefile="yard.c" cloneof="yard" romof="yard"> <description>10 Yard Fight (Vs. version Japan, set 2)</description> <year>1984</year> <manufacturer>Irem</manufacturer> @@ -65701,9 +65715,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="528"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="528"/> </game> - <game name="travrusa"> + <game name="travrusa" sourcefile="travrusa.c"> <description>Traverse USA / Zippy Race</description> <year>1983</year> <manufacturer>Irem</manufacturer> @@ -65784,9 +65798,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="motorace" cloneof="travrusa" romof="travrusa"> + <game name="motorace" sourcefile="travrusa.c" cloneof="travrusa" romof="travrusa"> <description>MotoRace USA</description> <year>1983</year> <manufacturer>Irem (Williams license)</manufacturer> @@ -65867,9 +65881,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="shtrider"> + <game name="shtrider" sourcefile="travrusa.c"> <description>Shot Rider</description> <year>1984</year> <manufacturer>Seibu Kaihatsu (Sigma license)</manufacturer> @@ -65961,9 +65975,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="wilytowr"> + <game name="wilytowr" sourcefile="wilytowr.c"> <description>Wily Tower</description> <year>1984</year> <manufacturer>Irem</manufacturer> @@ -66055,9 +66069,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="260"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="260"/> </game> - <game name="atomboy" cloneof="wilytowr" romof="wilytowr"> + <game name="atomboy" sourcefile="wilytowr.c" cloneof="wilytowr" romof="wilytowr"> <description>Atomic Boy</description> <year>1985</year> <manufacturer>Irem (Memetron license)</manufacturer> @@ -66149,9 +66163,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="260"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="260"/> </game> - <game name="kungfum"> + <game name="kungfum" sourcefile="m62.c"> <description>Kung-Fu Master</description> <year>1984</year> <manufacturer>Irem</manufacturer> @@ -66245,9 +66259,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="kungfud" cloneof="kungfum" romof="kungfum"> + <game name="kungfud" sourcefile="m62.c" cloneof="kungfum" romof="kungfum"> <description>Kung-Fu Master (Data East)</description> <year>1984</year> <manufacturer>Irem (Data East license)</manufacturer> @@ -66341,9 +66355,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="spartanx" cloneof="kungfum" romof="kungfum"> + <game name="spartanx" sourcefile="m62.c" cloneof="kungfum" romof="kungfum"> <description>Spartan X (Japan)</description> <year>1984</year> <manufacturer>Irem</manufacturer> @@ -66437,9 +66451,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="kungfub" cloneof="kungfum" romof="kungfum"> + <game name="kungfub" sourcefile="m62.c" cloneof="kungfum" romof="kungfum"> <description>Kung-Fu Master (bootleg set 1)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -66533,9 +66547,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="kungfub2" cloneof="kungfum" romof="kungfum"> + <game name="kungfub2" sourcefile="m62.c" cloneof="kungfum" romof="kungfum"> <description>Kung-Fu Master (bootleg set 2)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -66629,9 +66643,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="battroad"> + <game name="battroad" sourcefile="m62.c"> <description>The Battle-Road</description> <year>1984</year> <manufacturer>Irem</manufacturer> @@ -66734,9 +66748,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="544"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="544"/> </game> - <game name="ldrun"> + <game name="ldrun" sourcefile="m62.c"> <description>Lode Runner (set 1)</description> <year>1984</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -66822,9 +66836,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ldruna" cloneof="ldrun" romof="ldrun"> + <game name="ldruna" sourcefile="m62.c" cloneof="ldrun" romof="ldrun"> <description>Lode Runner (set 2)</description> <year>1984</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -66910,9 +66924,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ldrun2"> + <game name="ldrun2" sourcefile="m62.c"> <description>Lode Runner II - The Bungeling Strikes Back</description> <year>1984</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67006,9 +67020,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ldrun3"> + <game name="ldrun3" sourcefile="m62.c"> <description>Lode Runner III - The Golden Labyrinth</description> <year>1985</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67099,9 +67113,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ldrun3jp" cloneof="ldrun3" romof="ldrun3"> + <game name="ldrun3jp" sourcefile="m62.c" cloneof="ldrun3" romof="ldrun3"> <description>Lode Runner III - Majin No Fukkatsu</description> <year>1985</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67189,9 +67203,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ldrun4"> + <game name="ldrun4" sourcefile="m62.c"> <description>Lode Runner IV - Teikoku Karano Dasshutsu</description> <year>1986</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67284,9 +67298,9 @@ </dipswitch> <dipswitch name="Service Mode (must set 2P game to No)"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="lotlot"> + <game name="lotlot" sourcefile="m62.c"> <description>Lot Lot</description> <year>1985</year> <manufacturer>Irem (licensed from Tokuma Shoten)</manufacturer> @@ -67380,9 +67394,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="kidniki"> + <game name="kidniki" sourcefile="m62.c"> <description>Kid Niki - Radical Ninja (US)</description> <year>1986</year> <manufacturer>Irem (Data East USA license)</manufacturer> @@ -67487,9 +67501,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="yanchamr" cloneof="kidniki" romof="kidniki"> + <game name="yanchamr" sourcefile="m62.c" cloneof="kidniki" romof="kidniki"> <description>Kaiketsu Yanchamaru (Japan)</description> <year>1986</year> <manufacturer>Irem</manufacturer> @@ -67594,9 +67608,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="spelunkr"> + <game name="spelunkr" sourcefile="m62.c"> <description>Spelunker</description> <year>1985</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67693,9 +67707,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="spelnkrj" cloneof="spelunkr" romof="spelunkr"> + <game name="spelnkrj" sourcefile="m62.c" cloneof="spelunkr" romof="spelunkr"> <description>Spelunker (Japan)</description> <year>1985</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67792,9 +67806,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="spelunk2"> + <game name="spelunk2" sourcefile="m62.c"> <description>Spelunker II</description> <year>1986</year> <manufacturer>Irem (licensed from Broderbund)</manufacturer> @@ -67891,9 +67905,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="horizon"> + <game name="horizon" sourcefile="m62.c"> <description>Horizon</description> <year>1985</year> <manufacturer>Irem</manufacturer> @@ -67981,9 +67995,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="youjyudn"> + <game name="youjyudn" sourcefile="m62.c"> <description>Youjyuden (Japan)</description> <year>1986</year> <manufacturer>Irem</manufacturer> @@ -68080,9 +68094,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="vigilant"> + <game name="vigilant" sourcefile="vigilant.c"> <description>Vigilante (World)</description> <year>1988</year> <manufacturer>Irem</manufacturer> @@ -68170,9 +68184,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="544"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="544"/> </game> - <game name="vigilntu" cloneof="vigilant" romof="vigilant"> + <game name="vigilntu" sourcefile="vigilant.c" cloneof="vigilant" romof="vigilant"> <description>Vigilante (US)</description> <year>1988</year> <manufacturer>Irem (Data East USA license)</manufacturer> @@ -68260,9 +68274,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="544"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="544"/> </game> - <game name="vigilntj" cloneof="vigilant" romof="vigilant"> + <game name="vigilntj" sourcefile="vigilant.c" cloneof="vigilant" romof="vigilant"> <description>Vigilante (Japan)</description> <year>1988</year> <manufacturer>Irem</manufacturer> @@ -68350,9 +68364,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="544"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="544"/> </game> - <game name="kikcubic"> + <game name="kikcubic" sourcefile="vigilant.c"> <description>Meikyu Jima (Japan)</description> <year>1988</year> <manufacturer>Irem</manufacturer> @@ -68429,9 +68443,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rtype"> + <game name="rtype" sourcefile="m72.c"> <description>R-Type (Japan)</description> <year>1987</year> <manufacturer>Irem</manufacturer> @@ -68523,9 +68537,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rtypepj" cloneof="rtype" romof="rtype"> + <game name="rtypepj" sourcefile="m72.c" cloneof="rtype" romof="rtype"> <description>R-Type (Japan prototype)</description> <year>1987</year> <manufacturer>Irem</manufacturer> @@ -68617,9 +68631,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rtypeu" cloneof="rtype" romof="rtype"> + <game name="rtypeu" sourcefile="m72.c" cloneof="rtype" romof="rtype"> <description>R-Type (US)</description> <year>1987</year> <manufacturer>Irem (Nintendo of America license)</manufacturer> @@ -68711,9 +68725,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="bchopper"> + <game name="bchopper" sourcefile="m72.c"> <description>Battle Chopper</description> <year>1987</year> <manufacturer>Irem</manufacturer> @@ -68809,9 +68823,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mrheli" cloneof="bchopper" romof="bchopper"> + <game name="mrheli" sourcefile="m72.c" cloneof="bchopper" romof="bchopper"> <description>Mr. HELI no Dai-Bouken</description> <year>1987</year> <manufacturer>Irem</manufacturer> @@ -68903,9 +68917,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="nspirit"> + <game name="nspirit" sourcefile="m72.c"> <description>Ninja Spirit</description> <year>1988</year> <manufacturer>Irem</manufacturer> @@ -68997,9 +69011,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="nspiritj" cloneof="nspirit" romof="nspirit"> + <game name="nspiritj" sourcefile="m72.c" cloneof="nspirit" romof="nspirit"> <description>Saigo no Nindou (Japan)</description> <year>1988</year> <manufacturer>Irem</manufacturer> @@ -69091,9 +69105,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="imgfight"> + <game name="imgfight" sourcefile="m72.c"> <description>Image Fight (Japan)</description> <year>1988</year> <manufacturer>Irem</manufacturer> @@ -69178,9 +69192,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="loht"> + <game name="loht" sourcefile="m72.c"> <description>Legend of Hero Tonma</description> <year>1989</year> <manufacturer>Irem</manufacturer> @@ -69264,9 +69278,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="xmultipl"> + <game name="xmultipl" sourcefile="m72.c"> <description>X Multiply (Japan)</description> <year>1989</year> <manufacturer>Irem</manufacturer> @@ -69356,9 +69370,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="dbreed"> + <game name="dbreed" sourcefile="m72.c"> <description>Dragon Breed</description> <year>1989</year> <manufacturer>Irem</manufacturer> @@ -69442,9 +69456,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rtype2"> + <game name="rtype2" sourcefile="m72.c"> <description>R-Type II</description> <year>1989</year> <manufacturer>Irem</manufacturer> @@ -69526,9 +69540,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rtype2j" cloneof="rtype2" romof="rtype2"> + <game name="rtype2j" sourcefile="m72.c" cloneof="rtype2" romof="rtype2"> <description>R-Type II (Japan)</description> <year>1989</year> <manufacturer>Irem</manufacturer> @@ -69610,9 +69624,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="majtitle"> + <game name="majtitle" sourcefile="m72.c"> <description>Major Title (Japan)</description> <year>1990</year> <manufacturer>Irem</manufacturer> @@ -69694,9 +69708,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="hharry"> + <game name="hharry" sourcefile="m72.c"> <description>Hammerin' Harry (World)</description> <year>1990</year> <manufacturer>Irem</manufacturer> @@ -69778,9 +69792,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="hharryu" cloneof="hharry" romof="hharry"> + <game name="hharryu" sourcefile="m72.c" cloneof="hharry" romof="hharry"> <description>Hammerin' Harry (US)</description> <year>1990</year> <manufacturer>Irem America</manufacturer> @@ -69862,9 +69876,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="dkgensan" cloneof="hharry" romof="hharry"> + <game name="dkgensan" sourcefile="m72.c" cloneof="hharry" romof="hharry"> <description>Daiku no Gensan (Japan)</description> <year>1990</year> <manufacturer>Irem</manufacturer> @@ -69946,9 +69960,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="dkgenm72" cloneof="hharry" romof="hharry"> + <game name="dkgenm72" sourcefile="m72.c" cloneof="hharry" romof="hharry"> <description>Daiku no Gensan (Japan, M72)</description> <year>1990</year> <manufacturer>Irem</manufacturer> @@ -70033,9 +70047,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="poundfor"> + <game name="poundfor" sourcefile="m72.c"> <description>Pound for Pound (World)</description> <year>1990</year> <manufacturer>Irem</manufacturer> @@ -70119,9 +70133,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="poundfou" cloneof="poundfor" romof="poundfor"> + <game name="poundfou" sourcefile="m72.c" cloneof="poundfor" romof="poundfor"> <description>Pound for Pound (US)</description> <year>1990</year> <manufacturer>Irem America</manufacturer> @@ -70205,9 +70219,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="airduel"> + <game name="airduel" sourcefile="m72.c"> <description>Air Duel (Japan)</description> <year>1990</year> <manufacturer>Irem</manufacturer> @@ -70278,9 +70292,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="cosmccop"> + <game name="cosmccop" sourcefile="m72.c"> <description>Cosmic Cop (World)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -70356,9 +70370,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gallop" cloneof="cosmccop" romof="cosmccop"> + <game name="gallop" sourcefile="m72.c" cloneof="cosmccop" romof="cosmccop"> <description>Gallop - Armed police Unit (Japan)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -70439,9 +70453,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="kengo"> + <game name="kengo" sourcefile="m72.c"> <description>Ken-Go</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -70524,9 +70538,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="sichuan2"> + <game name="sichuan2" sourcefile="shisen.c"> <description>Sichuan II (hack?) (set 1)</description> <year>1989</year> <manufacturer>Tamtex</manufacturer> @@ -70630,9 +70644,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sichuana" cloneof="sichuan2" romof="sichuan2"> + <game name="sichuana" sourcefile="shisen.c" cloneof="sichuan2" romof="sichuan2"> <description>Sichuan II (hack?) (set 2)</description> <year>1989</year> <manufacturer>Tamtex</manufacturer> @@ -70736,9 +70750,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shisen" cloneof="sichuan2" romof="sichuan2"> + <game name="shisen" sourcefile="shisen.c" cloneof="sichuan2" romof="sichuan2"> <description>Shisensho - Joshiryo-Hen (Japan)</description> <year>1989</year> <manufacturer>Tamtex</manufacturer> @@ -70841,9 +70855,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="matchit" cloneof="sichuan2" romof="sichuan2"> + <game name="matchit" sourcefile="shisen.c" cloneof="sichuan2" romof="sichuan2"> <description>Match It</description> <year>1989</year> <manufacturer>Tamtex</manufacturer> @@ -70943,9 +70957,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hasamu"> + <game name="hasamu" sourcefile="m90.c"> <description>Hasamu (Japan)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -71027,9 +71041,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="dynablst"> + <game name="dynablst" sourcefile="m90.c"> <description>Dynablaster (World)</description> <year>1992</year> <manufacturer>Irem (licensed from Hudson Soft)</manufacturer> @@ -71106,9 +71120,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="dynablsb" cloneof="dynablst" romof="dynablst"> + <game name="dynablsb" sourcefile="m90.c" cloneof="dynablst" romof="dynablst"> <description>Dynablaster (bootleg)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -71186,9 +71200,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="bombrman" cloneof="dynablst" romof="dynablst"> + <game name="bombrman" sourcefile="m90.c" cloneof="dynablst" romof="dynablst"> <description>Bomberman (Japan)</description> <year>1992</year> <manufacturer>Irem (licensed from Hudson Soft)</manufacturer> @@ -71267,9 +71281,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="bbmanw"> + <game name="bbmanw" sourcefile="m90.c"> <description>Bomber Man World (World)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -71346,9 +71360,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="bbmanwj" cloneof="bbmanw" romof="bbmanw"> + <game name="bbmanwj" sourcefile="m90.c" cloneof="bbmanw" romof="bbmanw"> <description>Bomber Man World (Japan)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -71425,9 +71439,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="atompunk" cloneof="bbmanw" romof="bbmanw"> + <game name="atompunk" sourcefile="m90.c" cloneof="bbmanw" romof="bbmanw"> <description>New Atomic Punk - Global Quest (US)</description> <year>1992</year> <manufacturer>Irem America</manufacturer> @@ -71504,9 +71518,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="quizf1"> + <game name="quizf1" sourcefile="m90.c"> <description>Quiz F-1 1,2finish</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -71589,9 +71603,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="512"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="512"/> </game> - <game name="riskchal"> + <game name="riskchal" sourcefile="m90.c"> <description>Risky Challenge</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -71672,9 +71686,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gussun" cloneof="riskchal" romof="riskchal"> + <game name="gussun" sourcefile="m90.c" cloneof="riskchal" romof="riskchal"> <description>Gussun Oyoyo (Japan)</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -71755,9 +71769,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="shisen2"> + <game name="shisen2" sourcefile="m90.c"> <description>Shisensho II</description> <year>1993</year> <manufacturer>Tamtex</manufacturer> @@ -71837,9 +71851,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gunforce"> + <game name="gunforce" sourcefile="m92.c"> <description>Gunforce - Battle Fire Engulfed Terror Island (World)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -71925,9 +71939,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gunforcu" cloneof="gunforce" romof="gunforce"> + <game name="gunforcu" sourcefile="m92.c" cloneof="gunforce" romof="gunforce"> <description>Gunforce - Battle Fire Engulfed Terror Island (US)</description> <year>1991</year> <manufacturer>Irem America</manufacturer> @@ -72013,9 +72027,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gunforcj" cloneof="gunforce" romof="gunforce"> + <game name="gunforcj" sourcefile="m92.c" cloneof="gunforce" romof="gunforce"> <description>Gunforce - Battle Fire Engulfed Terror Island (Japan)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -72101,9 +72115,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bmaster"> + <game name="bmaster" sourcefile="m92.c"> <description>Blade Master (World)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -72221,9 +72235,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="lethalth"> + <game name="lethalth" sourcefile="m92.c"> <description>Lethal Thunder (World)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -72341,9 +72355,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="thndblst" cloneof="lethalth" romof="lethalth"> + <game name="thndblst" sourcefile="m92.c" cloneof="lethalth" romof="lethalth"> <description>Thunder Blaster (Japan)</description> <year>1991</year> <manufacturer>Irem</manufacturer> @@ -72461,9 +72475,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="uccops"> + <game name="uccops" sourcefile="m92.c"> <description>Undercover Cops (World)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -72581,9 +72595,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="uccopsj" cloneof="uccops" romof="uccops"> + <game name="uccopsj" sourcefile="m92.c" cloneof="uccops" romof="uccops"> <description>Undercover Cops (Japan)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -72701,9 +72715,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mysticri"> + <game name="mysticri" sourcefile="m92.c"> <description>Mystic Riders (World)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -72823,9 +72837,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gunhohki" cloneof="mysticri" romof="mysticri"> + <game name="gunhohki" sourcefile="m92.c" cloneof="mysticri" romof="mysticri"> <description>Gun Hohki (Japan)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -72945,9 +72959,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="majtitl2"> + <game name="majtitl2" sourcefile="m92.c"> <description>Major Title 2 (World)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -73070,9 +73084,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="skingame" cloneof="majtitl2" romof="majtitl2"> + <game name="skingame" sourcefile="m92.c" cloneof="majtitl2" romof="majtitl2"> <description>The Irem Skins Game (US set 1)</description> <year>1992</year> <manufacturer>Irem America</manufacturer> @@ -73195,9 +73209,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="skingam2" cloneof="majtitl2" romof="majtitl2"> + <game name="skingam2" sourcefile="m92.c" cloneof="majtitl2" romof="majtitl2"> <description>The Irem Skins Game (US set 2)</description> <year>1992</year> <manufacturer>Irem America</manufacturer> @@ -73320,9 +73334,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="hook"> + <game name="hook" sourcefile="m92.c"> <description>Hook (World)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -73440,9 +73454,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hooku" cloneof="hook" romof="hook"> + <game name="hooku" sourcefile="m92.c" cloneof="hook" romof="hook"> <description>Hook (US)</description> <year>1992</year> <manufacturer>Irem America</manufacturer> @@ -73560,9 +73574,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rtypeleo"> + <game name="rtypeleo" sourcefile="m92.c"> <description>R-Type Leo (World rev. C)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -73648,9 +73662,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rtypelej" cloneof="rtypeleo" romof="rtypeleo"> + <game name="rtypelej" sourcefile="m92.c" cloneof="rtypeleo" romof="rtypeleo"> <description>R-Type Leo (Japan rev. D)</description> <year>1992</year> <manufacturer>Irem</manufacturer> @@ -73736,9 +73750,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="inthunt"> + <game name="inthunt" sourcefile="m92.c"> <description>In The Hunt (World)</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -73856,9 +73870,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="inthuntu" cloneof="inthunt" romof="inthunt"> + <game name="inthuntu" sourcefile="m92.c" cloneof="inthunt" romof="inthunt"> <description>In The Hunt (US)</description> <year>1993</year> <manufacturer>Irem America</manufacturer> @@ -73976,9 +73990,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="kaiteids" cloneof="inthunt" romof="inthunt"> + <game name="kaiteids" sourcefile="m92.c" cloneof="inthunt" romof="inthunt"> <description>Kaitei Daisensou (Japan)</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -74096,9 +74110,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="nbbatman"> + <game name="nbbatman" sourcefile="m92.c"> <description>Ninja Baseball Batman (US)</description> <year>1993</year> <manufacturer>Irem America</manufacturer> @@ -74218,9 +74232,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="leaguemn" cloneof="nbbatman" romof="nbbatman"> + <game name="leaguemn" sourcefile="m92.c" cloneof="nbbatman" romof="nbbatman"> <description>Yakyuu Kakutou League-Man (Japan)</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -74340,9 +74354,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssoldier"> + <game name="ssoldier" sourcefile="m92.c"> <description>Superior Soldiers (US)</description> <year>1993</year> <manufacturer>Irem America</manufacturer> @@ -74468,9 +74482,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="psoldier" cloneof="ssoldier" romof="ssoldier"> + <game name="psoldier" sourcefile="m92.c" cloneof="ssoldier" romof="ssoldier"> <description>Perfect Soldiers (Japan)</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -74596,9 +74610,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="dsccr94j" cloneof="dsoccr94" romof="dsoccr94"> + <game name="dsccr94j" sourcefile="m92.c" cloneof="dsoccr94" romof="dsoccr94"> <description>Dream Soccer '94 (Japan)</description> <year>1994</year> <manufacturer>Irem</manufacturer> @@ -74722,9 +74736,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gunforc2"> + <game name="gunforc2" sourcefile="m92.c"> <description>Gunforce 2 (US)</description> <year>1994</year> <manufacturer>Irem</manufacturer> @@ -74810,9 +74824,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="geostorm" cloneof="gunforc2" romof="gunforc2"> + <game name="geostorm" sourcefile="m92.c" cloneof="gunforc2" romof="gunforc2"> <description>Geostorm (Japan)</description> <year>1994</year> <manufacturer>Irem</manufacturer> @@ -74898,9 +74912,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="firebarr"> + <game name="firebarr" sourcefile="m107.c"> <description>Fire Barrel (Japan)</description> <year>1993</year> <manufacturer>Irem</manufacturer> @@ -75026,9 +75040,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="dsoccr94"> + <game name="dsoccr94" sourcefile="m107.c"> <description>Dream Soccer '94</description> <year>1994</year> <manufacturer>Irem (Data East Corporation license)</manufacturer> @@ -75148,9 +75162,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="wpksoc"> + <game name="wpksoc" sourcefile="m107.c"> <description>World PK Soccer</description> <year>1995</year> <manufacturer>Jaleco</manufacturer> @@ -75276,9 +75290,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="reactor"> + <game name="reactor" sourcefile="gottlieb.c"> <description>Reactor</description> <year>1982</year> <manufacturer>Gottlieb</manufacturer> @@ -75355,9 +75369,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mplanets"> + <game name="mplanets" sourcefile="gottlieb.c"> <description>Mad Planets</description> <year>1983</year> <manufacturer>Gottlieb</manufacturer> @@ -75410,9 +75424,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mplanuk" cloneof="mplanets" romof="mplanets"> + <game name="mplanuk" sourcefile="gottlieb.c" cloneof="mplanets" romof="mplanets"> <description>Mad Planets (UK)</description> <year>1983</year> <manufacturer>Gottlieb (Taitel license)</manufacturer> @@ -75465,9 +75479,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="qbert"> + <game name="qbert" sourcefile="gottlieb.c"> <description>Q*bert (US)</description> <year>1982</year> <manufacturer>Gottlieb</manufacturer> @@ -75566,9 +75580,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="qbertjp" cloneof="qbert" romof="qbert" sampleof="qbert"> + <game name="qbertjp" sourcefile="gottlieb.c" cloneof="qbert" romof="qbert" sampleof="qbert"> <description>Q*bert (Japan)</description> <year>1982</year> <manufacturer>Gottlieb (Konami license)</manufacturer> @@ -75667,9 +75681,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="myqbert" cloneof="qbert" romof="qbert" sampleof="qbert"> + <game name="myqbert" sourcefile="gottlieb.c" cloneof="qbert" romof="qbert" sampleof="qbert"> <description>Mello Yello Q*bert</description> <year>1982</year> <manufacturer>Gottlieb</manufacturer> @@ -75768,9 +75782,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="qberttst" cloneof="qbert" romof="qbert" sampleof="qbert"> + <game name="qberttst" sourcefile="gottlieb.c" cloneof="qbert" romof="qbert" sampleof="qbert"> <description>Q*bert (early test version)</description> <year>1982</year> <manufacturer>Gottlieb</manufacturer> @@ -75869,9 +75883,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="insector"> + <game name="insector" sourcefile="gottlieb.c"> <description>Insector (prototype)</description> <year>1982</year> <manufacturer>Gottlieb</manufacturer> @@ -75924,9 +75938,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="krull"> + <game name="krull" sourcefile="gottlieb.c"> <description>Krull</description> <year>1983</year> <manufacturer>Gottlieb</manufacturer> @@ -75979,9 +75993,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="sqbert" sampleof="qbert"> + <game name="sqbert" sourcefile="gottlieb.c" sampleof="qbert"> <description>Faster, Harder, More Challenging Q*bert (prototype)</description> <year>1983</year> <manufacturer>Mylstar</manufacturer> @@ -76080,9 +76094,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mach3"> + <game name="mach3" sourcefile="gottlieb.c"> <description>M.A.C.H. 3</description> <year>1983</year> <manufacturer>Mylstar</manufacturer> @@ -76138,9 +76152,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16"/> </game> - <game name="usvsthem"> + <game name="usvsthem" sourcefile="gottlieb.c"> <description>Us vs. Them</description> <year>1984</year> <manufacturer>Mylstar</manufacturer> @@ -76198,9 +76212,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16"/> </game> - <game name="3stooges"> + <game name="3stooges" sourcefile="gottlieb.c"> <description>The Three Stooges In Brides Is Brides</description> <year>1984</year> <manufacturer>Mylstar</manufacturer> @@ -76259,9 +76273,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="qbertqub" sampleof="qbert"> + <game name="qbertqub" sourcefile="gottlieb.c" sampleof="qbert"> <description>Q*bert's Qubes</description> <year>1983</year> <manufacturer>Mylstar</manufacturer> @@ -76362,9 +76376,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="screwloo"> + <game name="screwloo" sourcefile="gottlieb.c"> <description>Screw Loose (prototype)</description> <year>1983</year> <manufacturer>Mylstar</manufacturer> @@ -76423,9 +76437,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="curvebal"> + <game name="curvebal" sourcefile="gottlieb.c"> <description>Curve Ball</description> <year>1984</year> <manufacturer>Mylstar</manufacturer> @@ -76477,9 +76491,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="qix"> + <game name="qix" sourcefile="qix.c"> <description>Qix (set 1)</description> <year>1981</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76506,9 +76520,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="qixa" cloneof="qix" romof="qix"> + <game name="qixa" sourcefile="qix.c" cloneof="qix" romof="qix"> <description>Qix (set 2)</description> <year>1981</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76534,9 +76548,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="qixb" cloneof="qix" romof="qix"> + <game name="qixb" sourcefile="qix.c" cloneof="qix" romof="qix"> <description>Qix (set 3)</description> <year>1981</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76556,9 +76570,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="qix2" cloneof="qix" romof="qix"> + <game name="qix2" sourcefile="qix.c" cloneof="qix" romof="qix"> <description>Qix II (Tournament)</description> <year>1981</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76586,9 +76600,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sdungeon"> + <game name="sdungeon" sourcefile="qix.c"> <description>Space Dungeon</description> <year>1981</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76615,9 +76629,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="doublejoy8way" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="elecyoyo"> + <game name="elecyoyo" sourcefile="qix.c"> <description>The Electric Yo-Yo (set 1)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76643,9 +76657,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="elecyoy2" cloneof="elecyoyo" romof="elecyoyo"> + <game name="elecyoy2" sourcefile="qix.c" cloneof="elecyoyo" romof="elecyoyo"> <description>The Electric Yo-Yo (set 2)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76671,9 +76685,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="kram"> + <game name="kram" sourcefile="qix.c"> <description>Kram (set 1)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76699,9 +76713,9 @@ <video screen="raster" orientation="horizontal" width="256" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="kram2" cloneof="kram" romof="kram"> + <game name="kram2" sourcefile="qix.c" cloneof="kram" romof="kram"> <description>Kram (set 2)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76727,9 +76741,9 @@ <video screen="raster" orientation="horizontal" width="256" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="kram3" cloneof="kram" romof="kram"> + <game name="kram3" sourcefile="qix.c" cloneof="kram" romof="kram"> <description>Kram (encrypted)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76753,9 +76767,9 @@ <video screen="raster" orientation="horizontal" width="256" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="3" service="yes" tilt="yes"/> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="zookeep"> + <game name="zookeep" sourcefile="qix.c"> <description>Zoo Keeper (set 1)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76787,9 +76801,9 @@ <video screen="raster" orientation="horizontal" width="256" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="1" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="zookeep2" cloneof="zookeep" romof="zookeep"> + <game name="zookeep2" sourcefile="qix.c" cloneof="zookeep" romof="zookeep"> <description>Zoo Keeper (set 2)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76821,9 +76835,9 @@ <video screen="raster" orientation="horizontal" width="256" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="1" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="zookeep3" cloneof="zookeep" romof="zookeep"> + <game name="zookeep3" sourcefile="qix.c" cloneof="zookeep" romof="zookeep"> <description>Zoo Keeper (set 3)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76855,9 +76869,9 @@ <video screen="raster" orientation="horizontal" width="256" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy4way" buttons="1" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="slither"> + <game name="slither" sourcefile="qix.c"> <description>Slither (set 1)</description> <year>1982</year> <manufacturer>Century II</manufacturer> @@ -76881,9 +76895,9 @@ <input players="2" control="trackball" buttons="2" coins="3" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="slithera" cloneof="slither" romof="slither"> + <game name="slithera" sourcefile="qix.c" cloneof="slither" romof="slither"> <description>Slither (set 2)</description> <year>1982</year> <manufacturer>Century II</manufacturer> @@ -76907,9 +76921,9 @@ <input players="2" control="trackball" buttons="2" coins="3" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="complexx"> + <game name="complexx" sourcefile="qix.c"> <description>Complex X</description> <year>1984</year> <manufacturer>Taito America Corporation</manufacturer> @@ -76934,9 +76948,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="doublejoy8way" buttons="1" coins="3" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="spaceskr"> + <game name="spaceskr" sourcefile="taitosj.c"> <description>Space Seeker</description> <year>1981</year> <manufacturer>Taito Corporation</manufacturer> @@ -77060,9 +77074,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="spacecr"> + <game name="spacecr" sourcefile="taitosj.c"> <description>Space Cruiser</description> <year>1981</year> <manufacturer>Taito Corporation</manufacturer> @@ -77192,9 +77206,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="junglek"> + <game name="junglek" sourcefile="taitosj.c"> <description>Jungle King (Japan)</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -77319,9 +77333,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="junglkj2" cloneof="junglek" romof="junglek"> + <game name="junglkj2" sourcefile="taitosj.c" cloneof="junglek" romof="junglek"> <description>Jungle King (Japan, earlier)</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -77446,9 +77460,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="jungleh" cloneof="junglek" romof="junglek"> + <game name="jungleh" sourcefile="taitosj.c" cloneof="junglek" romof="junglek"> <description>Jungle Hunt (US)</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -77573,9 +77587,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="junglhbr" cloneof="junglek" romof="junglek"> + <game name="junglhbr" sourcefile="taitosj.c" cloneof="junglek" romof="junglek"> <description>Jungle Hunt (Brazil)</description> <year>1983</year> <manufacturer>Taito do Brasil</manufacturer> @@ -77697,9 +77711,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="piratpet" cloneof="junglek" romof="junglek"> + <game name="piratpet" sourcefile="taitosj.c" cloneof="junglek" romof="junglek"> <description>Pirate Pete</description> <year>1982</year> <manufacturer>Taito America Corporation</manufacturer> @@ -77821,9 +77835,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="alpine"> + <game name="alpine" sourcefile="taitosj.c"> <description>Alpine Ski (set 1)</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -77937,9 +77951,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="alpinea" cloneof="alpine" romof="alpine"> + <game name="alpinea" sourcefile="taitosj.c" cloneof="alpine" romof="alpine"> <description>Alpine Ski (set 2)</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -78051,9 +78065,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="timetunl"> + <game name="timetunl" sourcefile="taitosj.c"> <description>Time Tunnel</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -78183,9 +78197,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="wwestern"> + <game name="wwestern" sourcefile="taitosj.c"> <description>Wild Western (set 1)</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -78306,9 +78320,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="wwester1" cloneof="wwestern" romof="wwestern"> + <game name="wwester1" sourcefile="taitosj.c" cloneof="wwestern" romof="wwestern"> <description>Wild Western (set 2)</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -78429,9 +78443,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="frontlin"> + <game name="frontlin" sourcefile="taitosj.c"> <description>Front Line</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -78561,9 +78575,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="elevator"> + <game name="elevator" sourcefile="taitosj.c"> <description>Elevator Action</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -78690,9 +78704,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="elevatob" cloneof="elevator" romof="elevator"> + <game name="elevatob" sourcefile="taitosj.c" cloneof="elevator" romof="elevator"> <description>Elevator Action (bootleg)</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -78818,9 +78832,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="tinstar"> + <game name="tinstar" sourcefile="taitosj.c"> <description>The Tin Star</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -78950,9 +78964,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="waterski"> + <game name="waterski" sourcefile="taitosj.c"> <description>Water Ski</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -79077,9 +79091,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="bioatack"> + <game name="bioatack" sourcefile="taitosj.c"> <description>Bio Attack</description> <year>1983</year> <manufacturer>Taito Corporation (Fox Video Games license)</manufacturer> @@ -79205,9 +79219,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="hwrace"> + <game name="hwrace" sourcefile="taitosj.c"> <description>High Way Race</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -79334,9 +79348,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sfposeid"> + <game name="sfposeid" sourcefile="taitosj.c"> <description>Sea Fighter Poseidon</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -79460,9 +79474,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="kikstart"> + <game name="kikstart" sourcefile="taitosj.c"> <description>Kick Start Wheelie King</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -79571,9 +79585,9 @@ <dipvalue name="A and B"/> <dipvalue name="A only" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="crbaloon"> + <game name="crbaloon" sourcefile="crbaloon.c"> <description>Crazy Balloon (set 1)</description> <year>1980</year> <manufacturer>Taito Corporation</manufacturer> @@ -79636,9 +79650,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="crbalon2" cloneof="crbaloon" romof="crbaloon"> + <game name="crbalon2" sourcefile="crbaloon.c" cloneof="crbaloon" romof="crbaloon"> <description>Crazy Balloon (set 2)</description> <year>1980</year> <manufacturer>Taito Corporation</manufacturer> @@ -79701,9 +79715,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="sbowling"> + <game name="sbowling" sourcefile="sbowling.c"> <description>Strike Bowling</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -79720,38 +79734,42 @@ <chip type="audio" name="AY-3-8910" clock="1248000"/> <video screen="raster" orientation="vertical" width="224" height="240" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="1" control="trackball" coins="2" tilt="yes"/> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <input players="2" control="trackball" buttons="1" coins="2" tilt="yes"/> + <dipswitch name="Coin A"> + <dipvalue name="9 Coins/1 Credit"/> + <dipvalue name="8 Coins/1 Credit"/> + <dipvalue name="7 Coins/1 Credit"/> + <dipvalue name="6 Coins/1 Credit"/> + <dipvalue name="5 Coins/1 Credit"/> + <dipvalue name="4 Coins/1 Credit"/> + <dipvalue name="3 Coins/1 Credit"/> + <dipvalue name="2 Coins/1 Credit"/> + <dipvalue name="1 Coin/1 Credit" default="yes"/> + <dipvalue name="1 Coin/2 Credits"/> + <dipvalue name="1 Coin/3 Credits"/> + <dipvalue name="1 Coin/4 Credits"/> + <dipvalue name="1 Coin/5 Credits"/> + <dipvalue name="1 Coin/6 Credits"/> + <dipvalue name="1 Coin/7 Credits"/> + <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipswitch name="Coin B"> + <dipvalue name="9 Coins/1 Credit"/> + <dipvalue name="8 Coins/1 Credit"/> + <dipvalue name="7 Coins/1 Credit"/> + <dipvalue name="6 Coins/1 Credit"/> + <dipvalue name="5 Coins/1 Credit"/> + <dipvalue name="4 Coins/1 Credit"/> + <dipvalue name="3 Coins/1 Credit"/> + <dipvalue name="2 Coins/1 Credit"/> + <dipvalue name="1 Coin/1 Credit" default="yes"/> + <dipvalue name="1 Coin/2 Credits"/> + <dipvalue name="1 Coin/3 Credits"/> + <dipvalue name="1 Coin/4 Credits"/> + <dipvalue name="1 Coin/5 Credits"/> + <dipvalue name="1 Coin/6 Credits"/> + <dipvalue name="1 Coin/7 Credits"/> + <dipvalue name="1 Coin/8 Credits"/> </dipswitch> <dipswitch name="Cabinet"> <dipvalue name="Upright" default="yes"/> @@ -79762,8 +79780,8 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Year Display"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> </dipswitch> <dipswitch name="Unknown"> <dipvalue name="Off" default="yes"/> @@ -79777,7 +79795,7 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <dipswitch name="Ball Controll Check"> + <dipswitch name="Ball Control Check"> <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> @@ -79785,9 +79803,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="grchamp"> + <game name="grchamp" sourcefile="grchamp.c"> <description>Grand Champion</description> <year>1981</year> <manufacturer>Taito</manufacturer> @@ -79885,9 +79903,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="68"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="68"/> </game> - <game name="marinedt"> + <game name="marinedt" sourcefile="marinedt.c"> <description>Marine Date</description> <year>1981</year> <manufacturer>Taito</manufacturer> @@ -79973,9 +79991,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="64"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="bking"> + <game name="bking" sourcefile="bking2.c"> <description>Birdie King</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -80102,9 +80120,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="bking2"> + <game name="bking2" sourcefile="bking2.c"> <description>Birdie King 2</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -80233,9 +80251,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="bking3"> + <game name="bking3" sourcefile="bking2.c"> <description>Birdie King 3</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -80367,9 +80385,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="chaknpop"> + <game name="chaknpop" sourcefile="chaknpop.c"> <description>Chack'n Pop</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -80483,9 +80501,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="josvolly"> + <game name="josvolly" sourcefile="gsword.c"> <description>Joshi Volleyball</description> <year>1983</year> <manufacturer>Taito Corporation</manufacturer> @@ -80585,9 +80603,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gsword"> + <game name="gsword" sourcefile="gsword.c"> <description>Great Swordsman</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -80690,9 +80708,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pitnrun"> + <game name="pitnrun" sourcefile="pitnrun.c"> <description>Pit & Run</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -80741,9 +80759,9 @@ </dipswitch> <dipswitch name="No Hit"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="96"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="96"/> </game> - <game name="lkage"> + <game name="lkage" sourcefile="lkage.c"> <description>The Legend of Kage</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -80857,9 +80875,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="176"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="176"/> </game> - <game name="lkageb" cloneof="lkage" romof="lkage"> + <game name="lkageb" sourcefile="lkage.c" cloneof="lkage" romof="lkage"> <description>The Legend of Kage (bootleg set 1)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -80972,9 +80990,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="176"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="176"/> </game> - <game name="lkageb2" cloneof="lkage" romof="lkage"> + <game name="lkageb2" sourcefile="lkage.c" cloneof="lkage" romof="lkage"> <description>The Legend of Kage (bootleg set 2)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -81086,9 +81104,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="176"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="176"/> </game> - <game name="lkageb3" cloneof="lkage" romof="lkage"> + <game name="lkageb3" sourcefile="lkage.c" cloneof="lkage" romof="lkage"> <description>The Legend of Kage (bootleg set 3)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -81200,9 +81218,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="176"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="176"/> </game> - <game name="msisaac"> + <game name="msisaac" sourcefile="msisaac.c"> <description>Metal Soldier Isaac II</description> <year>1985</year> <manufacturer>Taito Corporation</manufacturer> @@ -81322,9 +81340,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="retofinv"> + <game name="retofinv" sourcefile="retofinv.c"> <description>Return of the Invaders</description> <year>1985</year> <manufacturer>Taito Corporation</manufacturer> @@ -81446,9 +81464,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="retofin1" cloneof="retofinv" romof="retofinv"> + <game name="retofin1" sourcefile="retofinv.c" cloneof="retofinv" romof="retofinv"> <description>Return of the Invaders (bootleg set 1)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -81568,9 +81586,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="retofin2" cloneof="retofinv" romof="retofinv"> + <game name="retofin2" sourcefile="retofinv.c" cloneof="retofinv" romof="retofinv"> <description>Return of the Invaders (bootleg set 2)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -81690,9 +81708,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="fightrol"> + <game name="fightrol" sourcefile="rollrace.c"> <description>Fighting Roller</description> <year>1983</year> <manufacturer>[Kaneko] (Taito license)</manufacturer> @@ -81793,9 +81811,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="256"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="rollace" cloneof="fightrol" romof="fightrol"> + <game name="rollace" sourcefile="rollrace.c" cloneof="fightrol" romof="fightrol"> <description>Roller Aces (set 1)</description> <year>1983</year> <manufacturer>[Kaneko] (Williams license)</manufacturer> @@ -81896,9 +81914,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="256"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="rollace2" cloneof="fightrol" romof="fightrol"> + <game name="rollace2" sourcefile="rollrace.c" cloneof="fightrol" romof="fightrol"> <description>Roller Aces (set 2)</description> <year>1983</year> <manufacturer>[Kaneko] (Williams license)</manufacturer> @@ -82000,9 +82018,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="256"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="vsgongf"> + <game name="vsgongf" sourcefile="tsamurai.c"> <description>VS Gong Fight</description> <year>1984</year> <manufacturer>Kaneko</manufacturer> @@ -82088,9 +82106,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ringfgt" cloneof="vsgongf" romof="vsgongf"> + <game name="ringfgt" sourcefile="tsamurai.c" cloneof="vsgongf" romof="vsgongf"> <description>Ring Fighter (set 1)</description> <year>1984</year> <manufacturer>Taito</manufacturer> @@ -82174,9 +82192,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ringfgt2" cloneof="vsgongf" romof="vsgongf"> + <game name="ringfgt2" sourcefile="tsamurai.c" cloneof="vsgongf" romof="vsgongf"> <description>Ring Fighter (set 2)</description> <year>1984</year> <manufacturer>Taito</manufacturer> @@ -82260,9 +82278,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="fieldday"> + <game name="fieldday" sourcefile="40love.c"> <description>Field Day</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -82387,9 +82405,9 @@ <dipvalue name="Single Slot" default="yes"/> <dipvalue name="Double Slot"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="undoukai" cloneof="fieldday" romof="fieldday"> + <game name="undoukai" sourcefile="40love.c" cloneof="fieldday" romof="fieldday"> <description>The Undoukai (Japan)</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -82507,9 +82525,9 @@ <dipvalue name="Single Slot" default="yes"/> <dipvalue name="Double Slot"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="40love"> + <game name="40love" sourcefile="40love.c"> <description>Forty-Love</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -82639,9 +82657,9 @@ <dipvalue name="Single Slot" default="yes"/> <dipvalue name="Double Slot"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="tsamurai"> + <game name="tsamurai" sourcefile="tsamurai.c"> <description>Samurai Nihon-ichi (set 1)</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -82726,9 +82744,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tsamura2" cloneof="tsamurai" romof="tsamurai"> + <game name="tsamura2" sourcefile="tsamurai.c" cloneof="tsamurai" romof="tsamurai"> <description>Samurai Nihon-ichi (set 2)</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -82813,9 +82831,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="nunchaku"> + <game name="nunchaku" sourcefile="tsamurai.c"> <description>Nunchackun</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -82901,9 +82919,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="yamagchi"> + <game name="yamagchi" sourcefile="tsamurai.c"> <description>Go Go Mr. Yamaguchi / Yuke Yuke Yamaguchi-kun</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -82989,9 +83007,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="m660"> + <game name="m660" sourcefile="tsamurai.c"> <description>Mission 660 (US)</description> <year>1986</year> <manufacturer>[Woodplace Inc.] Taito America Corporation</manufacturer> @@ -83077,9 +83095,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="m660j" cloneof="m660" romof="m660"> + <game name="m660j" sourcefile="tsamurai.c" cloneof="m660" romof="m660"> <description>Mission 660 (Japan)</description> <year>1986</year> <manufacturer>[Woodplace Inc.] Taito Corporation</manufacturer> @@ -83166,9 +83184,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="m660b" cloneof="m660" romof="m660"> + <game name="m660b" sourcefile="tsamurai.c" cloneof="m660" romof="m660"> <description>Mission 660 (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -83254,9 +83272,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="alphaxz" cloneof="m660" romof="m660"> + <game name="alphaxz" sourcefile="tsamurai.c" cloneof="m660" romof="m660"> <description>The Alphax Z (Japan)</description> <year>1986</year> <manufacturer>Ed / Woodplace Inc.</manufacturer> @@ -83342,9 +83360,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="buggychl"> + <game name="buggychl" sourcefile="buggychl.c"> <description>Buggy Challenge</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -83453,9 +83471,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="256"/> </game> - <game name="buggycht" cloneof="buggychl" romof="buggychl"> + <game name="buggycht" sourcefile="buggychl.c" cloneof="buggychl" romof="buggychl"> <description>Buggy Challenge (Tecfri)</description> <year>1984</year> <manufacturer>Taito Corporation (Tecfri license)</manufacturer> @@ -83564,9 +83582,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="256"/> </game> - <game name="ssrj"> + <game name="ssrj" sourcefile="ssrj.c"> <description>Super Speed Race Junior (Japan)</description> <year>1985</year> <manufacturer>Taito Corporation</manufacturer> @@ -83614,9 +83632,9 @@ <dipvalue name="Type 3"/> <dipvalue name="Type 4"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="128"/> + <driver status="good" color="preliminary" sound="good" graphic="imperfect" palettesize="128"/> </game> - <game name="bigevglf"> + <game name="bigevglf" sourcefile="bigevglf.c"> <description>Big Event Golf</description> <year>1986</year> <manufacturer>Taito America Corporation</manufacturer> @@ -83694,9 +83712,9 @@ <dipvalue name="9"/> <dipvalue name="10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="flstory"> + <game name="flstory" sourcefile="flstory.c"> <description>The FairyLand Story</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -83805,9 +83823,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="flstoryj" cloneof="flstory" romof="flstory"> + <game name="flstoryj" sourcefile="flstory.c" cloneof="flstory" romof="flstory"> <description>The FairyLand Story (Japan)</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -83916,9 +83934,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="onna34ro"> + <game name="onna34ro" sourcefile="flstory.c"> <description>Onna Sansirou - Typhoon Gal (set 1)</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -84039,9 +84057,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="512"/> + <driver status="protection" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="onna34ra" cloneof="onna34ro" romof="onna34ro"> + <game name="onna34ra" sourcefile="flstory.c" cloneof="onna34ro" romof="onna34ro"> <description>Onna Sansirou - Typhoon Gal (set 2)</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -84162,9 +84180,9 @@ <dipvalue name="A and B" default="yes"/> <dipvalue name="A only"/> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="512"/> + <driver status="protection" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="gladiatr"> + <game name="gladiatr" sourcefile="gladiatr.c"> <description>Gladiator (US)</description> <year>1986</year> <manufacturer>Taito America Corporation</manufacturer> @@ -84260,9 +84278,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="514"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="514"/> </game> - <game name="ogonsiro" cloneof="gladiatr" romof="gladiatr"> + <game name="ogonsiro" sourcefile="gladiatr.c" cloneof="gladiatr" romof="gladiatr"> <description>Ohgon no Siro (Japan)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -84358,9 +84376,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="514"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="514"/> </game> - <game name="nycaptor"> + <game name="nycaptor" sourcefile="nycaptor.c"> <description>N.Y. Captor</description> <year>1985</year> <manufacturer>Taito</manufacturer> @@ -84481,9 +84499,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="512"/> </game> - <game name="cyclshtg"> + <game name="cyclshtg" sourcefile="nycaptor.c"> <description>Cycle Shooting</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -84526,9 +84544,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="benberob"> + <game name="benberob" sourcefile="halleys.c"> <description>Ben Bero Beh (Japan)</description> <year>1984</year> <manufacturer>Taito</manufacturer> @@ -84649,9 +84667,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="1536"/> + <driver status="good" color="imperfect" sound="good" graphic="imperfect" palettesize="1536"/> </game> - <game name="halleys"> + <game name="halleys" sourcefile="halleys.c"> <description>Halley's Comet (US)</description> <year>1986</year> <manufacturer>Taito America Corporation (Coin-It license)</manufacturer> @@ -84767,9 +84785,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1536"/> </game> - <game name="halleysc" cloneof="halleys" romof="halleys"> + <game name="halleysc" sourcefile="halleys.c" cloneof="halleys" romof="halleys"> <description>Halley's Comet (Japan set 1)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -84885,9 +84903,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1536"/> </game> - <game name="halleycj" cloneof="halleys" romof="halleys"> + <game name="halleycj" sourcefile="halleys.c" cloneof="halleys" romof="halleys"> <description>Halley's Comet (Japan set 2)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -85003,9 +85021,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1536"/> </game> - <game name="lsasquad"> + <game name="lsasquad" sourcefile="lsasquad.c"> <description>Land Sea Air Squad / Riku Kai Kuu Saizensen</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -85118,9 +85136,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="512"/> </game> - <game name="storming" cloneof="lsasquad" romof="lsasquad"> + <game name="storming" sourcefile="lsasquad.c" cloneof="lsasquad" romof="lsasquad"> <description>Storming Party / Riku Kai Kuu Saizensen</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -85233,9 +85251,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="512"/> </game> - <game name="tokio"> + <game name="tokio" sourcefile="bublbobl.c"> <description>Tokio / Scramble Formation</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -85323,9 +85341,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tokiob" cloneof="tokio" romof="tokio"> + <game name="tokiob" sourcefile="bublbobl.c" cloneof="tokio" romof="tokio"> <description>Tokio / Scramble Formation (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -85412,9 +85430,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bublbobl"> + <game name="bublbobl" sourcefile="bublbobl.c"> <description>Bubble Bobble</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -85497,9 +85515,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bublbobr" cloneof="bublbobl" romof="bublbobl"> + <game name="bublbobr" sourcefile="bublbobl.c" cloneof="bublbobl" romof="bublbobl"> <description>Bubble Bobble (US with mode select)</description> <year>1986</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -85582,9 +85600,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bubbobr1" cloneof="bublbobl" romof="bublbobl"> + <game name="bubbobr1" sourcefile="bublbobl.c" cloneof="bublbobl" romof="bublbobl"> <description>Bubble Bobble (US)</description> <year>1986</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -85667,9 +85685,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="boblbobl" cloneof="bublbobl" romof="bublbobl"> + <game name="boblbobl" sourcefile="bublbobl.c" cloneof="bublbobl" romof="bublbobl"> <description>Bobble Bobble</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -85749,9 +85767,9 @@ <dipvalue name="High"/> <dipvalue name="Very High"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sboblbob" cloneof="bublbobl" romof="bublbobl"> + <game name="sboblbob" sourcefile="bublbobl.c" cloneof="bublbobl" romof="bublbobl"> <description>Super Bobble Bobble</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -85831,9 +85849,9 @@ <dipvalue name="High"/> <dipvalue name="Very High"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="missb2" cloneof="bublbobl" romof="bublbobl"> + <game name="missb2" sourcefile="missb2.c" cloneof="bublbobl" romof="bublbobl"> <description>Miss Bubble 2</description> <year>1996</year> <manufacturer>Alpha Co</manufacturer> @@ -85910,9 +85928,9 @@ <dipvalue name="High"/> <dipvalue name="Very High"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="512"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="512"/> </game> - <game name="kikikai"> + <game name="kikikai" sourcefile="mexico86.c"> <description>KiKi KaiKai</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -85986,9 +86004,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kicknrun"> + <game name="kicknrun" sourcefile="mexico86.c"> <description>Kick and Run</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -86066,9 +86084,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mexico86" cloneof="kicknrun" romof="kicknrun"> + <game name="mexico86" sourcefile="mexico86.c" cloneof="kicknrun" romof="kicknrun"> <description>Mexico 86</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -86146,9 +86164,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="darius"> + <game name="darius" sourcefile="darius.c"> <description>Darius (World)</description> <year>1986</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -86249,9 +86267,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariusj" cloneof="darius" romof="darius"> + <game name="dariusj" sourcefile="darius.c" cloneof="darius" romof="darius"> <description>Darius (Japan)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -86350,9 +86368,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariuso" cloneof="darius" romof="darius"> + <game name="dariuso" sourcefile="darius.c" cloneof="darius" romof="darius"> <description>Darius (Japan old version)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -86451,9 +86469,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariuse" cloneof="darius" romof="darius"> + <game name="dariuse" sourcefile="darius.c" cloneof="darius" romof="darius"> <description>Darius (Extra) (Japan)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -86552,9 +86570,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rastan"> + <game name="rastan" sourcefile="rastan.c"> <description>Rastan (World)</description> <year>1987</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -86633,9 +86651,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rastanu" cloneof="rastan" romof="rastan"> + <game name="rastanu" sourcefile="rastan.c" cloneof="rastan" romof="rastan"> <description>Rastan (US set 1)</description> <year>1987</year> <manufacturer>Taito America Corporation</manufacturer> @@ -86714,9 +86732,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rastanu2" cloneof="rastan" romof="rastan"> + <game name="rastanu2" sourcefile="rastan.c" cloneof="rastan" romof="rastan"> <description>Rastan (US set 2)</description> <year>1987</year> <manufacturer>Taito America Corporation</manufacturer> @@ -86795,9 +86813,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rastsaga" cloneof="rastan" romof="rastan"> + <game name="rastsaga" sourcefile="rastan.c" cloneof="rastan" romof="rastan"> <description>Rastan Saga (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -86876,9 +86894,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="topspeed"> + <game name="topspeed" sourcefile="topspeed.c"> <description>Top Speed (World)</description> <year>1987</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -86975,9 +86993,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analogue"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="topspedu" cloneof="topspeed" romof="topspeed"> + <game name="topspedu" sourcefile="topspeed.c" cloneof="topspeed" romof="topspeed"> <description>Top Speed (US)</description> <year>1987</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -87059,9 +87077,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analogue"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="fullthrl" cloneof="topspeed" romof="topspeed"> + <game name="fullthrl" sourcefile="topspeed.c" cloneof="topspeed" romof="topspeed"> <description>Full Throttle (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -87143,9 +87161,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analogue"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="opwolf"> + <game name="opwolf" sourcefile="opwolf.c"> <description>Operation Wolf (US)</description> <year>1987</year> <manufacturer>Taito America Corporation</manufacturer> @@ -87221,9 +87239,9 @@ <dipvalue name="Japanese"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="opwolfb" cloneof="opwolf" romof="opwolf"> + <game name="opwolfb" sourcefile="opwolf.c" cloneof="opwolf" romof="opwolf"> <description>Operation Bear</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -87320,9 +87338,9 @@ <dipvalue name="Japanese"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="othunder"> + <game name="othunder" sourcefile="othunder.c"> <description>Operation Thunderbolt (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -87397,9 +87415,9 @@ <dipvalue name="Japanese"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="othundu" cloneof="othunder" romof="othunder"> + <game name="othundu" sourcefile="othunder.c" cloneof="othunder" romof="othunder"> <description>Operation Thunderbolt (US)</description> <year>1988</year> <manufacturer>Taito America Corporation</manufacturer> @@ -87474,9 +87492,9 @@ <dipvalue name="Japanese"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rainbow"> + <game name="rainbow" sourcefile="rainbow.c"> <description>Rainbow Islands (new version)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -87551,9 +87569,9 @@ <dipvalue name="Type 1" default="yes"/> <dipvalue name="Type 2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rainbowo" cloneof="rainbow" romof="rainbow"> + <game name="rainbowo" sourcefile="rainbow.c" cloneof="rainbow" romof="rainbow"> <description>Rainbow Islands (old version)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -87628,9 +87646,9 @@ <dipvalue name="Type 1" default="yes"/> <dipvalue name="Type 2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rainbowe" cloneof="rainbow" romof="rainbow"> + <game name="rainbowe" sourcefile="rainbow.c" cloneof="rainbow" romof="rainbow"> <description>Rainbow Islands (Extra)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -87705,9 +87723,9 @@ <dipvalue name="Type 1" default="yes"/> <dipvalue name="Type 2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="jumping" cloneof="rainbow" romof="rainbow"> + <game name="jumping" sourcefile="rainbow.c" cloneof="rainbow" romof="rainbow"> <description>Jumping</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -87802,9 +87820,9 @@ <dipvalue name="Type 1" default="yes"/> <dipvalue name="Type 2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="arkanoid"> + <game name="arkanoid" sourcefile="arkanoid.c"> <description>Arkanoid (World)</description> <year>1986</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -87851,9 +87869,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arknoidu" cloneof="arkanoid" romof="arkanoid"> + <game name="arknoidu" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (US)</description> <year>1986</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -87900,9 +87918,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arknoiuo" cloneof="arkanoid" romof="arkanoid"> + <game name="arknoiuo" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (US, older)</description> <year>1986</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -87949,9 +87967,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arknoidj" cloneof="arkanoid" romof="arkanoid"> + <game name="arknoidj" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (Japan)</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -88000,9 +88018,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkbl2" cloneof="arkanoid" romof="arkanoid"> + <game name="arkbl2" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (Japanese bootleg Set 2)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -88051,9 +88069,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkbl3" cloneof="arkanoid" romof="arkanoid"> + <game name="arkbl3" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (Japanese bootleg Set 3)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -88100,9 +88118,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="paddle2" cloneof="arkanoid" romof="arkanoid"> + <game name="paddle2" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Paddle 2</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -88149,9 +88167,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="512"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkatayt" cloneof="arkanoid" romof="arkanoid"> + <game name="arkatayt" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (Tayto bootleg, Japanese)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -88198,9 +88216,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkblock" cloneof="arkanoid" romof="arkanoid"> + <game name="arkblock" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Block (bootleg, Japanese)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -88247,9 +88265,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkbloc2" cloneof="arkanoid" romof="arkanoid"> + <game name="arkbloc2" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Block (Game Corporation bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -88296,9 +88314,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkangc" cloneof="arkanoid" romof="arkanoid"> + <game name="arkangc" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Arkanoid (Game Corporation bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -88345,9 +88363,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arkatour" cloneof="arkanoid" romof="arkanoid"> + <game name="arkatour" sourcefile="arkanoid.c" cloneof="arkanoid" romof="arkanoid"> <description>Tournament Arkanoid (US)</description> <year>1987</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -88394,9 +88412,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="superqix"> + <game name="superqix" sourcefile="superqix.c"> <description>Super Qix</description> <year>1987</year> <manufacturer>Taito</manufacturer> @@ -88469,9 +88487,9 @@ <dipvalue name="80%"/> <dipvalue name="85%"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sqixbl" cloneof="superqix" romof="superqix"> + <game name="sqixbl" sourcefile="superqix.c" cloneof="superqix" romof="superqix"> <description>Super Qix (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -88543,9 +88561,9 @@ <dipvalue name="80%"/> <dipvalue name="85%"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="perestro"> + <game name="perestro" sourcefile="superqix.c"> <description>Perestroika Girls</description> <year>1993</year> <manufacturer>Promat / Fuuki</manufacturer> @@ -88615,9 +88633,9 @@ <dipvalue name="80%"/> <dipvalue name="85%"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pbillian"> + <game name="pbillian" sourcefile="pbillian.c"> <description>Prebillian</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -88688,9 +88706,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="hotsmash"> + <game name="hotsmash" sourcefile="pbillian.c"> <description>Hot Smash</description> <year>1987</year> <manufacturer>Taito</manufacturer> @@ -88736,9 +88754,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="exzisus"> + <game name="exzisus" sourcefile="exzisus.c"> <description>Exzisus (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -88822,9 +88840,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="minivadr"> + <game name="minivadr" sourcefile="minivadr.c"> <description>Minivader</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -88833,9 +88851,9 @@ <video screen="raster" orientation="horizontal" width="256" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="1" control="joy8way" buttons="1" coins="1"/> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="volfied"> + <game name="volfied" sourcefile="volfied.c"> <description>Volfied (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -88910,9 +88928,9 @@ <dipvalue name="Japanese"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="8192"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="volfiedu" cloneof="volfied" romof="volfied"> + <game name="volfiedu" sourcefile="volfied.c" cloneof="volfied" romof="volfied"> <description>Volfied (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -88989,9 +89007,9 @@ <dipvalue name="Japanese"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="8192"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="volfiedj" cloneof="volfied" romof="volfied"> + <game name="volfiedj" sourcefile="volfied.c" cloneof="volfied" romof="volfied"> <description>Volfied (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -89066,9 +89084,9 @@ <dipvalue name="Japanese" default="yes"/> <dipvalue name="English"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="8192"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bonzeadv"> + <game name="bonzeadv" sourcefile="asuka.c"> <description>Bonze Adventure (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -89139,9 +89157,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bonzeadu" cloneof="bonzeadv" romof="bonzeadv"> + <game name="bonzeadu" sourcefile="asuka.c" cloneof="bonzeadv" romof="bonzeadv"> <description>Bonze Adventure (US)</description> <year>1988</year> <manufacturer>Taito America Corporation</manufacturer> @@ -89212,9 +89230,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="jigkmgri" cloneof="bonzeadv" romof="bonzeadv"> + <game name="jigkmgri" sourcefile="asuka.c" cloneof="bonzeadv" romof="bonzeadv"> <description>Jigoku Meguri (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -89285,9 +89303,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="asuka"> + <game name="asuka" sourcefile="asuka.c"> <description>Asuka & Asuka (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -89367,9 +89385,9 @@ <dipvalue name="Up to Level 3"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mofflott"> + <game name="mofflott" sourcefile="asuka.c"> <description>Maze of Flott (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -89439,9 +89457,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cadash"> + <game name="cadash" sourcefile="asuka.c"> <description>Cadash (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -89509,9 +89527,9 @@ <dipvalue name="Master"/> <dipvalue name="Slave"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cadashj" cloneof="cadash" romof="cadash"> + <game name="cadashj" sourcefile="asuka.c" cloneof="cadash" romof="cadash"> <description>Cadash (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -89579,9 +89597,9 @@ <dipvalue name="Master"/> <dipvalue name="Slave"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cadashu" cloneof="cadash" romof="cadash"> + <game name="cadashu" sourcefile="asuka.c" cloneof="cadash" romof="cadash"> <description>Cadash (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -89649,9 +89667,9 @@ <dipvalue name="Master"/> <dipvalue name="Slave"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cadashi" cloneof="cadash" romof="cadash"> + <game name="cadashi" sourcefile="asuka.c" cloneof="cadash" romof="cadash"> <description>Cadash (Italy)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -89719,9 +89737,9 @@ <dipvalue name="Master"/> <dipvalue name="Slave"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cadashf" cloneof="cadash" romof="cadash"> + <game name="cadashf" sourcefile="asuka.c" cloneof="cadash" romof="cadash"> <description>Cadash (France)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -89789,9 +89807,9 @@ <dipvalue name="Master"/> <dipvalue name="Slave"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="galmedes"> + <game name="galmedes" sourcefile="asuka.c"> <description>Galmedes (Japan)</description> <year>1992</year> <manufacturer>Visco</manufacturer> @@ -89860,9 +89878,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="earthjkr"> + <game name="earthjkr" sourcefile="asuka.c"> <description>U.N. Defense Force: Earth Joker (Japan)</description> <year>1993</year> <manufacturer>Visco</manufacturer> @@ -89935,9 +89953,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="eto"> + <game name="eto" sourcefile="asuka.c"> <description>Kokontouzai Eto Monogatari (Japan)</description> <year>1994</year> <manufacturer>Visco</manufacturer> @@ -90010,9 +90028,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wgp"> + <game name="wgp" sourcefile="wgp.c"> <description>World Grand Prix (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -90098,9 +90116,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analogue"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="wgpj" cloneof="wgp" romof="wgp"> + <game name="wgpj" sourcefile="wgp.c" cloneof="wgp" romof="wgp"> <description>World Grand Prix (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -90186,9 +90204,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analogue"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="wgpjoy" cloneof="wgp" romof="wgp"> + <game name="wgpjoy" sourcefile="wgp.c" cloneof="wgp" romof="wgp"> <description>World Grand Prix (joystick version set 1) (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -90271,9 +90289,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="wgpjoya" cloneof="wgp" romof="wgp"> + <game name="wgpjoya" sourcefile="wgp.c" cloneof="wgp" romof="wgp"> <description>World Grand Prix (joystick version set 2) (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -90356,9 +90374,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="wgp2" cloneof="wgp" romof="wgp"> + <game name="wgp2" sourcefile="wgp.c" cloneof="wgp" romof="wgp"> <description>World Grand Prix 2 (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -90444,9 +90462,9 @@ <dipvalue name="Digital" default="yes"/> <dipvalue name="Analogue"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="slapshot"> + <game name="slapshot" sourcefile="slapshot.c"> <description>Slap Shot (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -90465,9 +90483,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="1" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="opwolf3"> + <game name="opwolf3" sourcefile="slapshot.c"> <description>Operation Wolf 3 (World)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -90488,9 +90506,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="2" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="opwolf3u" cloneof="opwolf3" romof="opwolf3"> + <game name="opwolf3u" sourcefile="slapshot.c" cloneof="opwolf3" romof="opwolf3"> <description>Operation Wolf 3 (US)</description> <year>1994</year> <manufacturer>Taito America Corporation</manufacturer> @@ -90511,34 +90529,124 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="2" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> + </game> + <game name="scessjoe" sourcefile="ashnojoe.c"> + <description>Success Joe (World)</description> + <year>1990</year> + <manufacturer>WAVE / Taito Corporation</manufacturer> + <rom name="5.4q" size="65536" crc="c805f9e7" sha1="e1e85701bde496b1fd64211b94bfb0def597ae51" region="cpu1" offset="0"/> + <rom name="6.4s" size="65536" crc="eda7a537" sha1="3bb19fbdfb6c8af4e2078958fa445ac1f4434d0d" region="cpu1" offset="1"/> + <rom name="sj201-nw.6m" size="262144" crc="5a64ca42" sha1="660b8bca21ef3c2230adce7cb7e7d1f018714f23" region="cpu1" offset="80000"/> + <rom name="9.8q" size="32768" crc="8767e212" sha1="13bf927febedff9d7d164fbf0da7fb3a588c2a94" region="cpu2" offset="0"/> + <rom name="8.5e" size="65536" crc="9bcb160e" sha1="1677048e5ce26562ff7ba36fcc2d0ed5a652b91e" region="gfx1" dispose="yes" offset="0"/> + <rom name="7.5c" size="65536" crc="b250c69d" sha1="594b1bb94a162b07944a971b7fedddca5c37f2cb" region="gfx1" dispose="yes" offset="10000"/> + <rom name="4.4e" size="65536" crc="aa6336d3" sha1="43f70cc3223f11d7929dd44b0edf0a31f5fe41c3" region="gfx2" dispose="yes" offset="0"/> + <rom name="3.4c" size="65536" crc="7e2d86b5" sha1="8b8d1b9240a700e29afc109eddf6e58a0a7666a4" region="gfx2" dispose="yes" offset="10000"/> + <rom name="2.3m" size="65536" crc="c3254938" sha1="fd57163f740cd4fdecca94cced91314c289741ae" region="gfx3" dispose="yes" offset="0"/> + <rom name="1.1m" size="65536" crc="5d16a6fa" sha1="2af907b0fcb9ff93340de3301da4b10e945455e5" region="gfx3" dispose="yes" offset="10000"/> + <rom name="sj402-nw.8e" size="524288" crc="b6d33d06" sha1="688ccf467a5112ec522811894e2626ab5f155903" region="gfx4" dispose="yes" offset="0"/> + <rom name="sj403-nw.7e" size="524288" crc="07143f56" sha1="1b953c8826d3993a486eed6b9d94d37145fd2e79" region="gfx4" dispose="yes" offset="80000"/> + <rom name="sj404-nw.7a" size="524288" crc="8f134128" sha1="026a6076d54cd5f1d06b29c51031cb79a6b2c11d" region="gfx5" dispose="yes" offset="0"/> + <rom name="sj405-nw.7c" size="524288" crc="6fd81699" sha1="8a4f9e47dd39b4b0213c3682da2221ca53bba658" region="gfx5" dispose="yes" offset="80000"/> + <rom name="sj406-nw.7d" size="524288" crc="634e33e6" sha1="1d6a72a4ca80cd1c1fd6ce9359c304b45091cdfe" region="gfx5" dispose="yes" offset="100000"/> + <rom name="sj407-nw.7f" size="524288" crc="5c66ff06" sha1="9923ba00679e1b47b5da63c1a13e0f8dd4c78bb5" region="gfx5" dispose="yes" offset="180000"/> + <rom name="sj408-nw.7g" size="524288" crc="6a3b1ea1" sha1="e39a6e52d930f291bf237cf9db3d4b3d2fad53e0" region="gfx5" dispose="yes" offset="200000"/> + <rom name="sj409-nw.7j" size="524288" crc="d8764213" sha1="89eadefb956863216c8e3d0380394aba35e8c856" region="gfx5" dispose="yes" offset="280000"/> + <rom name="sj401-nw.10r" size="524288" crc="25dfab59" sha1="7d50159204ba05323a2442778f35192e66117dda" region="sound1" offset="0"/> + <chip type="cpu" name="68000" clock="8000000"/> + <chip type="cpu" soundonly="yes" name="Z80" clock="4000000"/> + <chip type="audio" name="YM2203" clock="4000000"/> + <chip type="audio" name="MSM5205" clock="384000"/> + <video screen="raster" orientation="horizontal" width="288" height="208" aspectx="4" aspecty="3" refresh="60.000000"/> + <sound channels="1"/> + <input players="2" control="joy4way" buttons="2" coins="2"/> + <dipswitch name="Cabinet"> + <dipvalue name="Upright" default="yes"/> + <dipvalue name="Cocktail"/> + </dipswitch> + <dipswitch name="Flip Screen"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Service Mode"> + </dipswitch> + <dipswitch name="Demo Sounds"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Coinage"> + <dipvalue name="2 Coins/1 Credit"/> + <dipvalue name="1 Coin/1 Credit" default="yes"/> + <dipvalue name="2 Coins/3 Credits"/> + <dipvalue name="1 Coin/2 Credits"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Difficulty"> + <dipvalue name="Easy"/> + <dipvalue name="Normal" default="yes"/> + <dipvalue name="Medium"/> + <dipvalue name="Hard"/> + </dipswitch> + <dipswitch name="Number of controller"> + <dipvalue name="2" default="yes"/> + <dipvalue name="1"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Unknown"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ashnojoe"> + <game name="ashnojoe" sourcefile="ashnojoe.c" cloneof="scessjoe" romof="scessjoe"> <description>Ashita no Joe (Japan)</description> <year>1990</year> <manufacturer>WAVE / Taito Corporation</manufacturer> <rom name="5.bin" size="65536" crc="c61e1569" sha1="422c18f5810539b5a9e3a9bd4e3b4d70bde8d1d5" region="cpu1" offset="0"/> <rom name="6.bin" size="65536" crc="c0a16338" sha1="fb127b9d38f2c9807b6e23ff71935fc8a22a2e8f" region="cpu1" offset="1"/> - <rom name="sj201-nw.bin" size="262144" crc="5a64ca42" sha1="660b8bca21ef3c2230adce7cb7e7d1f018714f23" region="cpu1" offset="80000"/> - <rom name="9.bin" size="32768" crc="8767e212" sha1="13bf927febedff9d7d164fbf0da7fb3a588c2a94" region="cpu2" offset="0"/> - <rom name="8.bin" size="65536" crc="9bcb160e" sha1="1677048e5ce26562ff7ba36fcc2d0ed5a652b91e" region="gfx1" dispose="yes" offset="0"/> + <rom name="sj201-nw.6m" merge="sj201-nw.6m" size="262144" crc="5a64ca42" sha1="660b8bca21ef3c2230adce7cb7e7d1f018714f23" region="cpu1" offset="80000"/> + <rom name="9.8q" merge="9.8q" size="32768" crc="8767e212" sha1="13bf927febedff9d7d164fbf0da7fb3a588c2a94" region="cpu2" offset="0"/> + <rom name="8.5e" merge="8.5e" size="65536" crc="9bcb160e" sha1="1677048e5ce26562ff7ba36fcc2d0ed5a652b91e" region="gfx1" dispose="yes" offset="0"/> <rom name="7.bin" size="65536" crc="7e1efc42" sha1="e3c282072fdaa0b98c2a1bf25fd02c680d9ca4d7" region="gfx1" dispose="yes" offset="10000"/> - <rom name="4.bin" size="65536" crc="aa6336d3" sha1="43f70cc3223f11d7929dd44b0edf0a31f5fe41c3" region="gfx2" dispose="yes" offset="0"/> - <rom name="3.bin" size="65536" crc="7e2d86b5" sha1="8b8d1b9240a700e29afc109eddf6e58a0a7666a4" region="gfx2" dispose="yes" offset="10000"/> - <rom name="2.bin" size="65536" crc="c3254938" sha1="fd57163f740cd4fdecca94cced91314c289741ae" region="gfx3" dispose="yes" offset="0"/> + <rom name="4.4e" merge="4.4e" size="65536" crc="aa6336d3" sha1="43f70cc3223f11d7929dd44b0edf0a31f5fe41c3" region="gfx2" dispose="yes" offset="0"/> + <rom name="3.4c" merge="3.4c" size="65536" crc="7e2d86b5" sha1="8b8d1b9240a700e29afc109eddf6e58a0a7666a4" region="gfx2" dispose="yes" offset="10000"/> + <rom name="2.3m" merge="2.3m" size="65536" crc="c3254938" sha1="fd57163f740cd4fdecca94cced91314c289741ae" region="gfx3" dispose="yes" offset="0"/> <rom name="1.bin" size="65536" crc="1bf585f0" sha1="4003941636e7fded95e880109c3c9dd1d8f28b07" region="gfx3" dispose="yes" offset="10000"/> - <rom name="sj402-nw.bin" size="524288" crc="b6d33d06" sha1="688ccf467a5112ec522811894e2626ab5f155903" region="gfx4" dispose="yes" offset="0"/> - <rom name="sj403-nw.bin" size="524288" crc="07143f56" sha1="1b953c8826d3993a486eed6b9d94d37145fd2e79" region="gfx4" dispose="yes" offset="80000"/> - <rom name="sj404-nw.bin" size="524288" crc="8f134128" sha1="026a6076d54cd5f1d06b29c51031cb79a6b2c11d" region="gfx5" dispose="yes" offset="0"/> - <rom name="sj405-nw.bin" size="524288" crc="6fd81699" sha1="8a4f9e47dd39b4b0213c3682da2221ca53bba658" region="gfx5" dispose="yes" offset="80000"/> - <rom name="sj406-nw.bin" size="524288" crc="634e33e6" sha1="1d6a72a4ca80cd1c1fd6ce9359c304b45091cdfe" region="gfx5" dispose="yes" offset="100000"/> - <rom name="sj407-nw.bin" size="524288" crc="5c66ff06" sha1="9923ba00679e1b47b5da63c1a13e0f8dd4c78bb5" region="gfx5" dispose="yes" offset="180000"/> - <rom name="sj408-nw.bin" size="524288" crc="6a3b1ea1" sha1="e39a6e52d930f291bf237cf9db3d4b3d2fad53e0" region="gfx5" dispose="yes" offset="200000"/> - <rom name="sj409-nw.bin" size="524288" crc="d8764213" sha1="89eadefb956863216c8e3d0380394aba35e8c856" region="gfx5" dispose="yes" offset="280000"/> - <rom name="sj401-nw.bin" size="524288" crc="25dfab59" sha1="7d50159204ba05323a2442778f35192e66117dda" region="sound1" offset="0"/> + <rom name="sj402-nw.8e" merge="sj402-nw.8e" size="524288" crc="b6d33d06" sha1="688ccf467a5112ec522811894e2626ab5f155903" region="gfx4" dispose="yes" offset="0"/> + <rom name="sj403-nw.7e" merge="sj403-nw.7e" size="524288" crc="07143f56" sha1="1b953c8826d3993a486eed6b9d94d37145fd2e79" region="gfx4" dispose="yes" offset="80000"/> + <rom name="sj404-nw.7a" merge="sj404-nw.7a" size="524288" crc="8f134128" sha1="026a6076d54cd5f1d06b29c51031cb79a6b2c11d" region="gfx5" dispose="yes" offset="0"/> + <rom name="sj405-nw.7c" merge="sj405-nw.7c" size="524288" crc="6fd81699" sha1="8a4f9e47dd39b4b0213c3682da2221ca53bba658" region="gfx5" dispose="yes" offset="80000"/> + <rom name="sj406-nw.7d" merge="sj406-nw.7d" size="524288" crc="634e33e6" sha1="1d6a72a4ca80cd1c1fd6ce9359c304b45091cdfe" region="gfx5" dispose="yes" offset="100000"/> + <rom name="sj407-nw.7f" merge="sj407-nw.7f" size="524288" crc="5c66ff06" sha1="9923ba00679e1b47b5da63c1a13e0f8dd4c78bb5" region="gfx5" dispose="yes" offset="180000"/> + <rom name="sj408-nw.7g" merge="sj408-nw.7g" size="524288" crc="6a3b1ea1" sha1="e39a6e52d930f291bf237cf9db3d4b3d2fad53e0" region="gfx5" dispose="yes" offset="200000"/> + <rom name="sj409-nw.7j" merge="sj409-nw.7j" size="524288" crc="d8764213" sha1="89eadefb956863216c8e3d0380394aba35e8c856" region="gfx5" dispose="yes" offset="280000"/> + <rom name="sj401-nw.10r" merge="sj401-nw.10r" size="524288" crc="25dfab59" sha1="7d50159204ba05323a2442778f35192e66117dda" region="sound1" offset="0"/> <chip type="cpu" name="68000" clock="8000000"/> <chip type="cpu" soundonly="yes" name="Z80" clock="4000000"/> - <chip type="audio" name="YM2203" clock="3000000"/> + <chip type="audio" name="YM2203" clock="4000000"/> <chip type="audio" name="MSM5205" clock="384000"/> <video screen="raster" orientation="horizontal" width="288" height="208" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> @@ -90601,9 +90709,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ninjaw"> + <game name="ninjaw" sourcefile="ninjaw.c"> <description>The Ninja Warriors (World)</description> <year>1987</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -90698,9 +90806,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="12288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="12288"/> </game> - <game name="ninjawj" cloneof="ninjaw" romof="ninjaw"> + <game name="ninjawj" sourcefile="ninjaw.c" cloneof="ninjaw" romof="ninjaw"> <description>The Ninja Warriors (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -90795,9 +90903,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="12288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="12288"/> </game> - <game name="darius2"> + <game name="darius2" sourcefile="ninjaw.c"> <description>Darius II (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -90881,9 +90989,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="12288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="12288"/> </game> - <game name="darius2d" cloneof="darius2" romof="darius2"> + <game name="darius2d" sourcefile="warriorb.c" cloneof="darius2" romof="darius2"> <description>Darius II (dual screen) (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -90963,9 +91071,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="drius2do" cloneof="darius2" romof="darius2"> + <game name="drius2do" sourcefile="warriorb.c" cloneof="darius2" romof="darius2"> <description>Darius II (dual screen) (Japan old version)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -91045,9 +91153,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="warriorb"> + <game name="warriorb" sourcefile="warriorb.c"> <description>Warrior Blade - Rastan Saga Episode III (Japan)</description> <year>1991</year> <manufacturer>Taito Corporation</manufacturer> @@ -91130,9 +91238,9 @@ <dipvalue name="Normal (10-14, depends on skill)" default="yes"/> <dipvalue name="Long (14)"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="superman"> + <game name="superman" sourcefile="taito_x.c"> <description>Superman</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -91206,9 +91314,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="twinhawk"> + <game name="twinhawk" sourcefile="taito_x.c"> <description>Twin Hawk (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -91277,9 +91385,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="twinhwku" cloneof="twinhawk" romof="twinhawk"> + <game name="twinhwku" sourcefile="taito_x.c" cloneof="twinhawk" romof="twinhawk"> <description>Twin Hawk (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -91348,9 +91456,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="daisenpu" cloneof="twinhawk" romof="twinhawk"> + <game name="daisenpu" sourcefile="taito_x.c" cloneof="twinhawk" romof="twinhawk"> <description>Daisenpu (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -91419,9 +91527,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gigandes"> + <game name="gigandes" sourcefile="taito_x.c"> <description>Gigandes</description> <year>1989</year> <manufacturer>East Technology</manufacturer> @@ -91496,9 +91604,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="kyustrkr"> + <game name="kyustrkr" sourcefile="taito_x.c"> <description>Last Striker / Kyuukyoku no Striker</description> <year>1989</year> <manufacturer>East Technology</manufacturer> @@ -91573,9 +91681,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ballbros"> + <game name="ballbros" sourcefile="taito_x.c"> <description>Balloon Brothers</description> <year>1992</year> <manufacturer>East Technology</manufacturer> @@ -91652,9 +91760,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="plumppop"> + <game name="plumppop" sourcefile="tnzs.c"> <description>Plump Pop (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -91730,9 +91838,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="extrmatn"> + <game name="extrmatn" sourcefile="tnzs.c"> <description>Extermination (US)</description> <year>1987</year> <manufacturer>[Taito] World Games</manufacturer> @@ -91806,9 +91914,9 @@ <dipvalue name="*2"/> <dipvalue name="*3"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arknoid2"> + <game name="arknoid2" sourcefile="tnzs.c"> <description>Arkanoid - Revenge of DOH (World)</description> <year>1987</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -91879,9 +91987,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arknid2u" cloneof="arknoid2" romof="arknoid2"> + <game name="arknid2u" sourcefile="tnzs.c" cloneof="arknoid2" romof="arknoid2"> <description>Arkanoid - Revenge of DOH (US)</description> <year>1987</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -91952,9 +92060,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arknid2j" cloneof="arknoid2" romof="arknoid2"> + <game name="arknid2j" sourcefile="tnzs.c" cloneof="arknoid2" romof="arknoid2"> <description>Arkanoid - Revenge of DOH (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -92025,9 +92133,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="drtoppel"> + <game name="drtoppel" sourcefile="tnzs.c"> <description>Dr. Toppel's Adventure (World)</description> <year>1987</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -92103,9 +92211,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="drtopplu" cloneof="drtoppel" romof="drtoppel"> + <game name="drtopplu" sourcefile="tnzs.c" cloneof="drtoppel" romof="drtoppel"> <description>Dr. Toppel's Adventure (US)</description> <year>1987</year> <manufacturer>Taito America Corporation</manufacturer> @@ -92181,9 +92289,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="drtopplj" cloneof="drtoppel" romof="drtoppel"> + <game name="drtopplj" sourcefile="tnzs.c" cloneof="drtoppel" romof="drtoppel"> <description>Dr. Toppel's Tankentai (Japan)</description> <year>1987</year> <manufacturer>Taito Corporation</manufacturer> @@ -92259,9 +92367,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="kageki"> + <game name="kageki" sourcefile="tnzs.c"> <description>Kageki (US)</description> <year>1988</year> <manufacturer>Taito America Corporation (Romstar license)</manufacturer> @@ -92341,9 +92449,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="kagekij" cloneof="kageki" romof="kageki"> + <game name="kagekij" sourcefile="tnzs.c" cloneof="kageki" romof="kageki"> <description>Kageki (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -92423,9 +92531,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="chukatai"> + <game name="chukatai" sourcefile="tnzs.c"> <description>Chuka Taisen (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -92500,9 +92608,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="chukatau" cloneof="chukatai" romof="chukatai"> + <game name="chukatau" sourcefile="tnzs.c" cloneof="chukatai" romof="chukatai"> <description>Chuka Taisen (US)</description> <year>1988</year> <manufacturer>Taito America Corporation</manufacturer> @@ -92577,9 +92685,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="chukataj" cloneof="chukatai" romof="chukatai"> + <game name="chukataj" sourcefile="tnzs.c" cloneof="chukatai" romof="chukatai"> <description>Chuka Taisen (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -92654,9 +92762,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tnzs"> + <game name="tnzs" sourcefile="tnzs.c"> <description>The NewZealand Story (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -92730,9 +92838,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tnzsb" cloneof="tnzs" romof="tnzs"> + <game name="tnzsb" sourcefile="tnzs.c" cloneof="tnzs" romof="tnzs"> <description>The NewZealand Story (World, bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -92806,9 +92914,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tnzs2" cloneof="tnzs" romof="tnzs"> + <game name="tnzs2" sourcefile="tnzs.c" cloneof="tnzs" romof="tnzs"> <description>The NewZealand Story 2 (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -92882,9 +92990,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="insectx"> + <game name="insectx" sourcefile="tnzs.c"> <description>Insector X (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -92950,9 +93058,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="raimais"> + <game name="raimais" sourcefile="taito_l.c"> <description>Raimais (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -93022,9 +93130,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kurikint"> + <game name="kurikint" sourcefile="taito_l.c"> <description>Kuri Kinton (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -93095,9 +93203,9 @@ <dipvalue name="5 Times" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kurikinu" cloneof="kurikint" romof="kurikint"> + <game name="kurikinu" sourcefile="taito_l.c" cloneof="kurikint" romof="kurikint"> <description>Kuri Kinton (US)</description> <year>1988</year> <manufacturer>Taito America Corporation</manufacturer> @@ -93168,9 +93276,9 @@ <dipvalue name="5 Times" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kurikinj" cloneof="kurikint" romof="kurikint"> + <game name="kurikinj" sourcefile="taito_l.c" cloneof="kurikint" romof="kurikint"> <description>Kuri Kinton (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -93241,9 +93349,9 @@ <dipvalue name="5 Times" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kurikina" cloneof="kurikint" romof="kurikint"> + <game name="kurikina" sourcefile="taito_l.c" cloneof="kurikint" romof="kurikint"> <description>Kuri Kinton (World, prototype?)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -93316,9 +93424,9 @@ </dipswitch> <dipswitch name="Slow Motion"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="evilston"> + <game name="evilston" sourcefile="taito_l.c"> <description>Evil Stone</description> <year>1990</year> <manufacturer>Spacy Industrial, Ltd.</manufacturer> @@ -93385,9 +93493,9 @@ <dipvalue name="English"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="fhawk"> + <game name="fhawk" sourcefile="taito_l.c"> <description>Fighting Hawk (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -93458,9 +93566,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="fhawkj" cloneof="fhawk" romof="fhawk"> + <game name="fhawkj" sourcefile="taito_l.c" cloneof="fhawk" romof="fhawk"> <description>Fighting Hawk (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -93531,9 +93639,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="plotting"> + <game name="plotting" sourcefile="taito_l.c"> <description>Plotting (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -93599,9 +93707,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="champwr"> + <game name="champwr" sourcefile="taito_l.c"> <description>Champion Wrestler (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -93673,9 +93781,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="champwru" cloneof="champwr" romof="champwr"> + <game name="champwru" sourcefile="taito_l.c" cloneof="champwr" romof="champwr"> <description>Champion Wrestler (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -93747,9 +93855,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="champwrj" cloneof="champwr" romof="champwr"> + <game name="champwrj" sourcefile="taito_l.c" cloneof="champwr" romof="champwr"> <description>Champion Wrestler (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -93821,9 +93929,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="puzznic"> + <game name="puzznic" sourcefile="taito_l.c"> <description>Puzznic (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -93889,9 +93997,9 @@ <dipvalue name="Stage reset to start/Timer continuous" default="yes"/> <dipvalue name="Stage reset to start/Timer reset to start"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="horshoes"> + <game name="horshoes" sourcefile="taito_l.c"> <description>American Horseshoes (US)</description> <year>1990</year> <manufacturer>Taito America Corporation</manufacturer> @@ -93963,9 +94071,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="palamed"> + <game name="palamed" sourcefile="taito_l.c"> <description>Palamedes (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -94033,9 +94141,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cachat"> + <game name="cachat" sourcefile="taito_l.c"> <description>Cachat (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -94105,9 +94213,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tubeit" cloneof="cachat" romof="cachat"> + <game name="tubeit" sourcefile="taito_l.c" cloneof="cachat" romof="cachat"> <description>Tube-It</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -94175,9 +94283,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cubybop"> + <game name="cubybop" sourcefile="taito_l.c"> <description>Cuby Bop (Location Test)</description> <manufacturer>Taito Corporation</manufacturer> <rom name="cb06.6" size="262144" crc="66b89a85" sha1="2ba26d71fd1aa8e64584a5908a1d797666718d49" region="cpu1" offset="0"/> @@ -94246,9 +94354,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="plgirls"> + <game name="plgirls" sourcefile="taito_l.c"> <description>Play Girls</description> <year>1992</year> <manufacturer>Hot-B.</manufacturer> @@ -94317,9 +94425,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="plgirls2"> + <game name="plgirls2" sourcefile="taito_l.c"> <description>Play Girls 2</description> <year>1993</year> <manufacturer>Hot-B.</manufacturer> @@ -94385,9 +94493,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="syvalion"> + <game name="syvalion" sourcefile="taito_h.c"> <description>Syvalion (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -94472,9 +94580,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="528"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="528"/> </game> - <game name="recordbr"> + <game name="recordbr" sourcefile="taito_h.c"> <description>Recordbreaker (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -94555,9 +94663,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="dleague"> + <game name="dleague" sourcefile="taito_h.c"> <description>Dynamite League (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -94642,9 +94750,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="528"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="528"/> </game> - <game name="masterw"> + <game name="masterw" sourcefile="taito_b.c"> <description>Master of Weapon (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -94713,9 +94821,9 @@ <dipvalue name="Default" default="yes"/> <dipvalue name="Alternate"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nastar"> + <game name="nastar" sourcefile="taito_b.c"> <description>Nastar (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -94786,9 +94894,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nastarw" cloneof="nastar" romof="nastar"> + <game name="nastarw" sourcefile="taito_b.c" cloneof="nastar" romof="nastar"> <description>Nastar Warrior (US)</description> <year>1988</year> <manufacturer>Taito America Corporation</manufacturer> @@ -94859,9 +94967,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rastsag2" cloneof="nastar" romof="nastar"> + <game name="rastsag2" sourcefile="taito_b.c" cloneof="nastar" romof="nastar"> <description>Rastan Saga 2 (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -94932,9 +95040,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rambo3"> + <game name="rambo3" sourcefile="taito_b.c"> <description>Rambo III (Europe set 1)</description> <year>1989</year> <manufacturer>Taito Europe Corporation</manufacturer> @@ -95025,9 +95133,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rambo3ae" cloneof="rambo3" romof="rambo3"> + <game name="rambo3ae" sourcefile="taito_b.c" cloneof="rambo3" romof="rambo3"> <description>Rambo III (Europe set 2)</description> <year>1989</year> <manufacturer>Taito Europe Corporation</manufacturer> @@ -95103,9 +95211,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rambo3a" cloneof="rambo3" romof="rambo3"> + <game name="rambo3a" sourcefile="taito_b.c" cloneof="rambo3" romof="rambo3"> <description>Rambo III (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -95181,9 +95289,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="crimec"> + <game name="crimec" sourcefile="taito_b.c"> <description>Crime City (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -95251,9 +95359,9 @@ <dipvalue name="8 Times"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="crimecu" cloneof="crimec" romof="crimec"> + <game name="crimecu" sourcefile="taito_b.c" cloneof="crimec" romof="crimec"> <description>Crime City (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -95321,9 +95429,9 @@ <dipvalue name="8 Times"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="crimecj" cloneof="crimec" romof="crimec"> + <game name="crimecj" sourcefile="taito_b.c" cloneof="crimec" romof="crimec"> <description>Crime City (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -95391,9 +95499,9 @@ <dipvalue name="8 Times"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tetrist" cloneof="tetris" romof="tetris"> + <game name="tetrist" sourcefile="taito_b.c" cloneof="tetris" romof="tetris"> <description>Tetris (Japan, B-System)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -95464,9 +95572,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="viofight"> + <game name="viofight" sourcefile="taito_b.c"> <description>Violence Fight (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -95543,9 +95651,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ashura"> + <game name="ashura" sourcefile="taito_b.c"> <description>Ashura Blaster (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -95615,9 +95723,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ashurau" cloneof="ashura" romof="ashura"> + <game name="ashurau" sourcefile="taito_b.c" cloneof="ashura" romof="ashura"> <description>Ashura Blaster (US)</description> <year>1990</year> <manufacturer>Taito America Corporation</manufacturer> @@ -95687,9 +95795,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="hitice"> + <game name="hitice" sourcefile="taito_b.c"> <description>Hit the Ice (US)</description> <year>1990</year> <manufacturer>Williams</manufacturer> @@ -95763,9 +95871,9 @@ <dipvalue name="99"/> <dipvalue name="9" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sbm"> + <game name="sbm" sourcefile="taito_b.c"> <description>Sonic Blast Man (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -95845,9 +95953,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="selfeena"> + <game name="selfeena" sourcefile="taito_b.c"> <description>Sel Feena</description> <year>1991</year> <manufacturer>East Technology</manufacturer> @@ -95915,9 +96023,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="silentd"> + <game name="silentd" sourcefile="taito_b.c"> <description>Silent Dragon (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -95992,9 +96100,9 @@ <dipvalue name="4 Players/1 Machine"/> <dipvalue name="4 Players/2 Machines"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="silentdj" cloneof="silentd" romof="silentd"> + <game name="silentdj" sourcefile="taito_b.c" cloneof="silentd" romof="silentd"> <description>Silent Dragon (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -96067,9 +96175,9 @@ <dipvalue name="4 Players/1 Machine"/> <dipvalue name="4 Players/2 Machines"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ryujin"> + <game name="ryujin" sourcefile="taito_b.c"> <description>Ryu Jin (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -96141,9 +96249,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qzshowby"> + <game name="qzshowby" sourcefile="taito_b.c"> <description>Quiz Sekai wa SHOW by shobai (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -96159,9 +96267,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pbobble"> + <game name="pbobble" sourcefile="taito_b.c"> <description>Puzzle Bobble (Japan, B-System)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -96177,9 +96285,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="spacedx"> + <game name="spacedx" sourcefile="taito_b.c"> <description>Space Invaders DX (US) v2.1</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -96195,9 +96303,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="spacedxj" cloneof="spacedx" romof="spacedx"> + <game name="spacedxj" sourcefile="taito_b.c" cloneof="spacedx" romof="spacedx"> <description>Space Invaders DX (Japan) v2.1</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -96213,9 +96321,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="spacedxo" cloneof="spacedx" romof="spacedx"> + <game name="spacedxo" sourcefile="taito_b.c" cloneof="spacedx" romof="spacedx"> <description>Space Invaders DX (Japan) v2.0</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -96283,9 +96391,9 @@ <dipvalue name="Double Company" default="yes"/> <dipvalue name="Single Company"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="contcirc"> + <game name="contcirc" sourcefile="taito_z.c"> <description>Continental Circus (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -96372,9 +96480,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="contcrcu" cloneof="contcirc" romof="contcirc"> + <game name="contcrcu" sourcefile="taito_z.c" cloneof="contcirc" romof="contcirc"> <description>Continental Circus (US)</description> <year>1987</year> <manufacturer>Taito America Corporation</manufacturer> @@ -96461,9 +96569,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="chasehq"> + <game name="chasehq" sourcefile="taito_z.c"> <description>Chase H.Q. (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -96562,9 +96670,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="chasehqj" cloneof="chasehq" romof="chasehq"> + <game name="chasehqj" sourcefile="taito_z.c" cloneof="chasehq" romof="chasehq"> <description>Chase H.Q. (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -96663,9 +96771,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="enforce"> + <game name="enforce" sourcefile="taito_z.c"> <description>Enforce (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -96753,9 +96861,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="nightstr"> + <game name="nightstr" sourcefile="taito_z.c"> <description>Night Striker (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -96847,9 +96955,9 @@ <dipvalue name="7 Shots / Second" default="yes"/> <dipvalue name="10 Shots / Second"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="sci"> + <game name="sci" sourcefile="taito_z.c"> <description>Special Criminal Investigation (World set 1)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -96938,9 +97046,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="scia" cloneof="sci" romof="sci"> + <game name="scia" sourcefile="taito_z.c" cloneof="sci" romof="sci"> <description>Special Criminal Investigation (World set 2)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -97029,9 +97137,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="sciu" cloneof="sci" romof="sci"> + <game name="sciu" sourcefile="taito_z.c" cloneof="sci" romof="sci"> <description>Special Criminal Investigation (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -97120,9 +97228,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="bshark"> + <game name="bshark" sourcefile="taito_z.c"> <description>Battle Shark (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -97208,9 +97316,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="bsharkj" cloneof="bshark" romof="bshark"> + <game name="bsharkj" sourcefile="taito_z.c" cloneof="bshark" romof="bshark"> <description>Battle Shark (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -97296,9 +97404,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="aquajack"> + <game name="aquajack" sourcefile="taito_z.c"> <description>Aqua Jack (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -97375,9 +97483,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="aquajckj" cloneof="aquajack" romof="aquajack"> + <game name="aquajckj" sourcefile="taito_z.c" cloneof="aquajack" romof="aquajack"> <description>Aqua Jack (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -97454,9 +97562,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="spacegun"> + <game name="spacegun" sourcefile="taito_z.c"> <description>Space Gun (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -97536,9 +97644,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dblaxle"> + <game name="dblaxle" sourcefile="taito_z.c"> <description>Double Axle (US)</description> <year>1991</year> <manufacturer>Taito America Corporation</manufacturer> @@ -97632,9 +97740,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="pwheelsj" cloneof="dblaxle" romof="dblaxle"> + <game name="pwheelsj" sourcefile="taito_z.c" cloneof="dblaxle" romof="dblaxle"> <description>Power Wheels (Japan)</description> <year>1991</year> <manufacturer>Taito Corporation</manufacturer> @@ -97728,9 +97836,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="topland"> + <game name="topland" sourcefile="taitoair.c"> <description>Top Landing (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -97815,9 +97923,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="ainferno"> + <game name="ainferno" sourcefile="taitoair.c"> <description>Air Inferno (US)</description> <year>1990</year> <manufacturer>Taito America Corporation</manufacturer> @@ -97900,9 +98008,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gunbustr"> + <game name="gunbustr" sourcefile="gunbustr.c"> <description>Gunbuster (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -97928,9 +98036,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="superchs"> + <game name="superchs" sourcefile="superchs.c"> <description>Super Chase - Criminal Termination (US)</description> <year>1992</year> <manufacturer>Taito America Corporation</manufacturer> @@ -97963,9 +98071,9 @@ <dipvalue name="Digital"/> <dipvalue name="Analogue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="groundfx"> + <game name="groundfx" sourcefile="groundfx.c"> <description>Ground Effects / Super Ground Effects (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -97994,9 +98102,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="stick" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="undrfire"> + <game name="undrfire" sourcefile="undrfire.c"> <description>Under Fire (World)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -98027,9 +98135,9 @@ <input players="2" control="lightgun" buttons="3" coins="2" service="yes"/> <dipswitch name="Show gun target"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="undrfiru" cloneof="undrfire" romof="undrfire"> + <game name="undrfiru" sourcefile="undrfire.c" cloneof="undrfire" romof="undrfire"> <description>Under Fire (US)</description> <year>1993</year> <manufacturer>Taito America Corporation</manufacturer> @@ -98060,9 +98168,9 @@ <input players="2" control="lightgun" buttons="3" coins="2" service="yes"/> <dipswitch name="Show gun target"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="undrfirj" cloneof="undrfire" romof="undrfire"> + <game name="undrfirj" sourcefile="undrfire.c" cloneof="undrfire" romof="undrfire"> <description>Under Fire (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -98093,9 +98201,9 @@ <input players="2" control="lightgun" buttons="3" coins="2" service="yes"/> <dipswitch name="Show gun target"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="finalb"> + <game name="finalb" sourcefile="taito_f2.c"> <description>Final Blow (World)</description> <year>1988</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -98171,9 +98279,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="finalbj" cloneof="finalb" romof="finalb"> + <game name="finalbj" sourcefile="taito_f2.c" cloneof="finalb" romof="finalb"> <description>Final Blow (Japan)</description> <year>1988</year> <manufacturer>Taito Corporation</manufacturer> @@ -98249,9 +98357,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dondokod"> + <game name="dondokod" sourcefile="taito_f2.c"> <description>Don Doko Don (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -98322,9 +98430,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dondokdu" cloneof="dondokod" romof="dondokod"> + <game name="dondokdu" sourcefile="taito_f2.c" cloneof="dondokod" romof="dondokod"> <description>Don Doko Don (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -98395,9 +98503,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dondokdj" cloneof="dondokod" romof="dondokod"> + <game name="dondokdj" sourcefile="taito_f2.c" cloneof="dondokod" romof="dondokod"> <description>Don Doko Don (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -98468,9 +98576,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="megab"> + <game name="megab" sourcefile="taito_f2.c"> <description>Mega Blast (World)</description> <year>1989</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -98542,9 +98650,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="megabj" cloneof="megab" romof="megab"> + <game name="megabj" sourcefile="taito_f2.c" cloneof="megab" romof="megab"> <description>Mega Blast (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -98616,9 +98724,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="thundfox"> + <game name="thundfox" sourcefile="taito_f2.c"> <description>Thunder Fox (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -98693,9 +98801,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="thndfoxu" cloneof="thundfox" romof="thundfox"> + <game name="thndfoxu" sourcefile="taito_f2.c" cloneof="thundfox" romof="thundfox"> <description>Thunder Fox (US)</description> <year>1990</year> <manufacturer>Taito America Corporation</manufacturer> @@ -98770,9 +98878,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="thndfoxj" cloneof="thundfox" romof="thundfox"> + <game name="thndfoxj" sourcefile="taito_f2.c" cloneof="thundfox" romof="thundfox"> <description>Thunder Fox (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -98847,9 +98955,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cameltry"> + <game name="cameltry" sourcefile="taito_f2.c"> <description>Cameltry (US)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -98917,9 +99025,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="camltrua" cloneof="cameltry" romof="cameltry"> + <game name="camltrua" sourcefile="taito_f2.c" cloneof="cameltry" romof="cameltry"> <description>Cameltry (US, alt sound)</description> <year>1989</year> <manufacturer>Taito America Corporation</manufacturer> @@ -98987,9 +99095,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="cameltrj" cloneof="cameltry" romof="cameltry"> + <game name="cameltrj" sourcefile="taito_f2.c" cloneof="cameltry" romof="cameltry"> <description>Cameltry (Japan)</description> <year>1989</year> <manufacturer>Taito Corporation</manufacturer> @@ -99057,9 +99165,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qtorimon"> + <game name="qtorimon" sourcefile="taito_f2.c"> <description>Quiz Torimonochou (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -99131,9 +99239,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="liquidk"> + <game name="liquidk" sourcefile="taito_f2.c"> <description>Liquid Kids (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -99204,9 +99312,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="liquidku" cloneof="liquidk" romof="liquidk"> + <game name="liquidku" sourcefile="taito_f2.c" cloneof="liquidk" romof="liquidk"> <description>Liquid Kids (US)</description> <year>1990</year> <manufacturer>Taito America Corporation</manufacturer> @@ -99277,9 +99385,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mizubaku" cloneof="liquidk" romof="liquidk"> + <game name="mizubaku" sourcefile="taito_f2.c" cloneof="liquidk" romof="liquidk"> <description>Mizubaku Daibouken (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -99350,9 +99458,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quizhq"> + <game name="quizhq" sourcefile="taito_f2.c"> <description>Quiz H.Q. (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -99424,9 +99532,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssi"> + <game name="ssi" sourcefile="taito_f2.c"> <description>Super Space Invaders '91 (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -99493,9 +99601,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="majest12" cloneof="ssi" romof="ssi"> + <game name="majest12" sourcefile="taito_f2.c" cloneof="ssi" romof="ssi"> <description>Majestic Twelve - The Space Invaders Part IV (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -99564,9 +99672,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gunfront"> + <game name="gunfront" sourcefile="taito_f2.c"> <description>Gun & Frontier (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -99638,9 +99746,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gunfronj" cloneof="gunfront" romof="gunfront"> + <game name="gunfronj" sourcefile="taito_f2.c" cloneof="gunfront" romof="gunfront"> <description>Gun Frontier (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -99712,9 +99820,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="growl"> + <game name="growl" sourcefile="taito_f2.c"> <description>Growl (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -99788,9 +99896,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="growlu" cloneof="growl" romof="growl"> + <game name="growlu" sourcefile="taito_f2.c" cloneof="growl" romof="growl"> <description>Growl (US)</description> <year>1990</year> <manufacturer>Taito America Corporation</manufacturer> @@ -99864,9 +99972,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="runark" cloneof="growl" romof="growl"> + <game name="runark" sourcefile="taito_f2.c" cloneof="growl" romof="growl"> <description>Runark (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -99940,9 +100048,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjnquest"> + <game name="mjnquest" sourcefile="taito_f2.c"> <description>Mahjong Quest (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -100016,9 +100124,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjnquesb" cloneof="mjnquest" romof="mjnquest"> + <game name="mjnquesb" sourcefile="taito_f2.c" cloneof="mjnquest" romof="mjnquest"> <description>Mahjong Quest (No Nudity)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -100092,9 +100200,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="footchmp"> + <game name="footchmp" sourcefile="taito_f2.c"> <description>Football Champ (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -100166,9 +100274,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="European"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="hthero" cloneof="footchmp" romof="footchmp"> + <game name="hthero" sourcefile="taito_f2.c" cloneof="footchmp" romof="footchmp"> <description>Hat Trick Hero (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -100240,9 +100348,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="euroch92" cloneof="footchmp" romof="footchmp"> + <game name="euroch92" sourcefile="taito_f2.c" cloneof="footchmp" romof="footchmp"> <description>Euro Champ '92 (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -100314,9 +100422,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="European"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="koshien"> + <game name="koshien" sourcefile="taito_f2.c"> <description>Ah Eikou no Koshien (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -100389,9 +100497,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="yuyugogo"> + <game name="yuyugogo" sourcefile="taito_f2.c"> <description>Yuuyu no Quiz de GO!GO! (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -100465,9 +100573,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ninjak"> + <game name="ninjak" sourcefile="taito_f2.c"> <description>The Ninja Kids (World)</description> <year>1990</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -100539,9 +100647,9 @@ <dipvalue name="1 Player only"/> <dipvalue name="Multiplayer" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ninjakj" cloneof="ninjak" romof="ninjak"> + <game name="ninjakj" sourcefile="taito_f2.c" cloneof="ninjak" romof="ninjak"> <description>The Ninja Kids (Japan)</description> <year>1990</year> <manufacturer>Taito Corporation</manufacturer> @@ -100613,9 +100721,9 @@ <dipvalue name="1 Player only"/> <dipvalue name="Multiplayer" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="solfigtr"> + <game name="solfigtr" sourcefile="taito_f2.c"> <description>Solitary Fighter (World)</description> <year>1991</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -100688,9 +100796,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qzquest"> + <game name="qzquest" sourcefile="taito_f2.c"> <description>Quiz Quest - Hime to Yuusha no Monogatari (Japan)</description> <year>1991</year> <manufacturer>Taito Corporation</manufacturer> @@ -100763,9 +100871,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pulirula"> + <game name="pulirula" sourcefile="taito_f2.c"> <description>PuLiRuLa (World)</description> <year>1991</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -100836,9 +100944,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pulirulj" cloneof="pulirula" romof="pulirula"> + <game name="pulirulj" sourcefile="taito_f2.c" cloneof="pulirula" romof="pulirula"> <description>PuLiRuLa (Japan)</description> <year>1991</year> <manufacturer>Taito Corporation</manufacturer> @@ -100909,9 +101017,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="metalb"> + <game name="metalb" sourcefile="taito_f2.c"> <description>Metal Black (World)</description> <year>1991</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -100983,9 +101091,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="metalbj" cloneof="metalb" romof="metalb"> + <game name="metalbj" sourcefile="taito_f2.c" cloneof="metalb" romof="metalb"> <description>Metal Black (Japan)</description> <year>1991</year> <manufacturer>Taito Corporation</manufacturer> @@ -101057,9 +101165,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="qzchikyu"> + <game name="qzchikyu" sourcefile="taito_f2.c"> <description>Quiz Chikyu Bouei Gun (Japan)</description> <year>1991</year> <manufacturer>Taito Corporation</manufacturer> @@ -101132,9 +101240,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="yesnoj"> + <game name="yesnoj" sourcefile="taito_f2.c"> <description>Yes/No Sinri Tokimeki Chart</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -101212,9 +101320,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="deadconx"> + <game name="deadconx" sourcefile="taito_f2.c"> <description>Dead Connection (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -101288,9 +101396,9 @@ <dipvalue name="1 Player only"/> <dipvalue name="Multiplayer" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="deadconj" cloneof="deadconx" romof="deadconx"> + <game name="deadconj" sourcefile="taito_f2.c" cloneof="deadconx" romof="deadconx"> <description>Dead Connection (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -101364,9 +101472,9 @@ <dipvalue name="1 Player only"/> <dipvalue name="Multiplayer" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dinorex"> + <game name="dinorex" sourcefile="taito_f2.c"> <description>Dino Rex (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -101441,9 +101549,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dinorexj" cloneof="dinorex" romof="dinorex"> + <game name="dinorexj" sourcefile="taito_f2.c" cloneof="dinorex" romof="dinorex"> <description>Dino Rex (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -101518,9 +101626,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dinorexu" cloneof="dinorex" romof="dinorex"> + <game name="dinorexu" sourcefile="taito_f2.c" cloneof="dinorex" romof="dinorex"> <description>Dino Rex (US)</description> <year>1992</year> <manufacturer>Taito America Corporation</manufacturer> @@ -101595,9 +101703,9 @@ <dipvalue name="Single"/> <dipvalue name="Dual" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qjinsei"> + <game name="qjinsei" sourcefile="taito_f2.c"> <description>Quiz Jinsei Gekijoh (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -101671,9 +101779,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qcrayon"> + <game name="qcrayon" sourcefile="taito_f2.c"> <description>Quiz Crayon Shinchan (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -101745,9 +101853,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qcrayon2"> + <game name="qcrayon2" sourcefile="taito_f2.c"> <description>Crayon Shinchan Orato Asobo (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -101820,9 +101928,9 @@ <dipvalue name="Joystick" default="yes"/> <dipvalue name="4 Buttons"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="driftout"> + <game name="driftout" sourcefile="taito_f2.c"> <description>Drift Out (Japan)</description> <year>1991</year> <manufacturer>Visco</manufacturer> @@ -101892,9 +102000,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="driveout" cloneof="driftout" romof="driftout"> + <game name="driveout" sourcefile="taito_f2.c" cloneof="driftout" romof="driftout"> <description>Drive Out</description> <year>1991</year> <manufacturer>bootleg</manufacturer> @@ -101966,9 +102074,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ringrage"> + <game name="ringrage" sourcefile="taito_f3.c"> <description>Ring Rage (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -101992,9 +102100,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="8192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8192"/> </game> - <game name="ringragj" cloneof="ringrage" romof="ringrage"> + <game name="ringragj" sourcefile="taito_f3.c" cloneof="ringrage" romof="ringrage"> <description>Ring Rage (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -102018,9 +102126,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="8192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8192"/> </game> - <game name="ringragu" cloneof="ringrage" romof="ringrage"> + <game name="ringragu" sourcefile="taito_f3.c" cloneof="ringrage" romof="ringrage"> <description>Ring Rage (US)</description> <year>1992</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102044,9 +102152,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="8192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8192"/> </game> - <game name="arabianm"> + <game name="arabianm" sourcefile="taito_f3.c"> <description>Arabian Magic (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102070,9 +102178,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="arabiamj" cloneof="arabianm" romof="arabianm"> + <game name="arabiamj" sourcefile="taito_f3.c" cloneof="arabianm" romof="arabianm"> <description>Arabian Magic (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -102096,9 +102204,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="arabiamu" cloneof="arabianm" romof="arabianm"> + <game name="arabiamu" sourcefile="taito_f3.c" cloneof="arabianm" romof="arabianm"> <description>Arabian Magic (US)</description> <year>1992</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102122,9 +102230,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="ridingf"> + <game name="ridingf" sourcefile="taito_f3.c"> <description>Riding Fight (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102146,9 +102254,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="ridefgtj" cloneof="ridingf" romof="ridingf"> + <game name="ridefgtj" sourcefile="taito_f3.c" cloneof="ridingf" romof="ridingf"> <description>Riding Fight (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -102170,9 +102278,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="ridefgtu" cloneof="ridingf" romof="ridingf"> + <game name="ridefgtu" sourcefile="taito_f3.c" cloneof="ridingf" romof="ridingf"> <description>Riding Fight (US)</description> <year>1992</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102194,9 +102302,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="gseeker"> + <game name="gseeker" sourcefile="taito_f3.c"> <description>Grid Seeker: Project Stormhammer (World)</description> <year>1992</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102220,9 +102328,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gseekerj" cloneof="gseeker" romof="gseeker"> + <game name="gseekerj" sourcefile="taito_f3.c" cloneof="gseeker" romof="gseeker"> <description>Grid Seeker: Project Stormhammer (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -102246,9 +102354,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gseekeru" cloneof="gseeker" romof="gseeker"> + <game name="gseekeru" sourcefile="taito_f3.c" cloneof="gseeker" romof="gseeker"> <description>Grid Seeker: Project Stormhammer (US)</description> <year>1992</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102272,9 +102380,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hthero93" cloneof="scfinals" romof="scfinals"> + <game name="hthero93" sourcefile="taito_f3.c" cloneof="scfinals" romof="scfinals"> <description>Hat Trick Hero '93 (Japan)</description> <year>1992</year> <manufacturer>Taito Corporation</manufacturer> @@ -102301,9 +102409,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="cupfinal" cloneof="scfinals" romof="scfinals"> + <game name="cupfinal" sourcefile="taito_f3.c" cloneof="scfinals" romof="scfinals"> <description>Taito Cup Finals (World)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102330,9 +102438,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="trstar"> + <game name="trstar" sourcefile="taito_f3.c"> <description>Top Ranking Stars (World new version)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102359,9 +102467,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="trstarj" cloneof="trstar" romof="trstar"> + <game name="trstarj" sourcefile="taito_f3.c" cloneof="trstar" romof="trstar"> <description>Top Ranking Stars (Japan new version)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -102388,9 +102496,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="prmtmfgt" cloneof="trstar" romof="trstar"> + <game name="prmtmfgt" sourcefile="taito_f3.c" cloneof="trstar" romof="trstar"> <description>Prime Time Fighter (US new version)</description> <year>1993</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102417,9 +102525,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="trstaro" cloneof="trstar" romof="trstar"> + <game name="trstaro" sourcefile="taito_f3.c" cloneof="trstar" romof="trstar"> <description>Top Ranking Stars (World old version)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102446,9 +102554,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="trstaroj" cloneof="trstar" romof="trstar"> + <game name="trstaroj" sourcefile="taito_f3.c" cloneof="trstar" romof="trstar"> <description>Top Ranking Stars (Japan old version)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -102475,9 +102583,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="prmtmfgo" cloneof="trstar" romof="trstar"> + <game name="prmtmfgo" sourcefile="taito_f3.c" cloneof="trstar" romof="trstar"> <description>Prime Time Fighter (US old version)</description> <year>1993</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102504,9 +102612,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gunlock"> + <game name="gunlock" sourcefile="taito_f3.c"> <description>Gunlock (World)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102530,9 +102638,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rayforcj" cloneof="gunlock" romof="gunlock"> + <game name="rayforcj" sourcefile="taito_f3.c" cloneof="gunlock" romof="gunlock"> <description>Rayforce (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -102556,9 +102664,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="rayforce" cloneof="gunlock" romof="gunlock"> + <game name="rayforce" sourcefile="taito_f3.c" cloneof="gunlock" romof="gunlock"> <description>Rayforce (US)</description> <year>1993</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102582,9 +102690,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="scfinals"> + <game name="scfinals" sourcefile="taito_f3.c"> <description>Super Cup Finals (World)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102611,9 +102719,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="intcup94" cloneof="scfinals" romof="scfinals"> + <game name="intcup94" sourcefile="taito_f3.c" cloneof="scfinals" romof="scfinals"> <description>International Cup '94</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102640,9 +102748,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dungeonm"> + <game name="dungeonm" sourcefile="taito_f3.c"> <description>Dungeon Magic (World)</description> <year>1993</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102669,9 +102777,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="lightbr" cloneof="dungeonm" romof="dungeonm"> + <game name="lightbr" sourcefile="taito_f3.c" cloneof="dungeonm" romof="dungeonm"> <description>Light Bringer (Japan)</description> <year>1993</year> <manufacturer>Taito Corporation</manufacturer> @@ -102698,9 +102806,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dungenmu" cloneof="dungeonm" romof="dungeonm"> + <game name="dungenmu" sourcefile="taito_f3.c" cloneof="dungeonm" romof="dungeonm"> <description>Dungeon Magic (US)</description> <year>1993</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102727,9 +102835,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="kaiserkn"> + <game name="kaiserkn" sourcefile="taito_f3.c"> <description>Kaiser Knuckle (World)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102766,9 +102874,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="dial" buttons="6" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="kaiserkj" cloneof="kaiserkn" romof="kaiserkn"> + <game name="kaiserkj" sourcefile="taito_f3.c" cloneof="kaiserkn" romof="kaiserkn"> <description>Kaiser Knuckle (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -102805,9 +102913,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="dial" buttons="6" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gblchmp" cloneof="kaiserkn" romof="kaiserkn"> + <game name="gblchmp" sourcefile="taito_f3.c" cloneof="kaiserkn" romof="kaiserkn"> <description>Global Champion (US)</description> <year>1994</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102844,9 +102952,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="dial" buttons="6" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dankuga" cloneof="kaiserkn" romof="kaiserkn"> + <game name="dankuga" sourcefile="taito_f3.c" cloneof="kaiserkn" romof="kaiserkn"> <description>Dan-Ku-Ga (Prototype)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -102883,9 +102991,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="dial" buttons="6" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariusg"> + <game name="dariusg" sourcefile="taito_f3.c"> <description>Darius Gaiden - Silver Hawk (World)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -102909,9 +103017,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariusgj" cloneof="dariusg" romof="dariusg"> + <game name="dariusgj" sourcefile="taito_f3.c" cloneof="dariusg" romof="dariusg"> <description>Darius Gaiden - Silver Hawk (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -102935,9 +103043,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariusgu" cloneof="dariusg" romof="dariusg"> + <game name="dariusgu" sourcefile="taito_f3.c" cloneof="dariusg" romof="dariusg"> <description>Darius Gaiden - Silver Hawk (US)</description> <year>1994</year> <manufacturer>Taito America Corporation</manufacturer> @@ -102961,9 +103069,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dariusgx" cloneof="dariusg" romof="dariusg"> + <game name="dariusgx" sourcefile="taito_f3.c" cloneof="dariusg" romof="dariusg"> <description>Darius Gaiden - Silver Hawk (Extra Version) [Official Hack]</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -102987,9 +103095,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bublbob2"> + <game name="bublbob2" sourcefile="taito_f3.c"> <description>Bubble Bobble 2 (World)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103013,9 +103121,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bubsympe" cloneof="bublbob2" romof="bublbob2"> + <game name="bubsympe" sourcefile="taito_f3.c" cloneof="bublbob2" romof="bublbob2"> <description>Bubble Symphony (Europe)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103039,9 +103147,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bubsympu" cloneof="bublbob2" romof="bublbob2"> + <game name="bubsympu" sourcefile="taito_f3.c" cloneof="bublbob2" romof="bublbob2"> <description>Bubble Symphony (US)</description> <year>1994</year> <manufacturer>Taito America Corporation</manufacturer> @@ -103065,9 +103173,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bubsymph" cloneof="bublbob2" romof="bublbob2"> + <game name="bubsymph" sourcefile="taito_f3.c" cloneof="bublbob2" romof="bublbob2"> <description>Bubble Symphony (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -103091,9 +103199,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="spcinvdj" cloneof="spacedx" romof="spacedx"> + <game name="spcinvdj" sourcefile="taito_f3.c" cloneof="spacedx" romof="spacedx"> <description>Space Invaders DX (Japan F3 version)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -103115,9 +103223,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pwrgoal"> + <game name="pwrgoal" sourcefile="taito_f3.c"> <description>Taito Power Goal (World)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103147,9 +103255,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hthero95" cloneof="pwrgoal" romof="pwrgoal"> + <game name="hthero95" sourcefile="taito_f3.c" cloneof="pwrgoal" romof="pwrgoal"> <description>Hat Trick Hero '95 (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -103179,9 +103287,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hthro95u" cloneof="pwrgoal" romof="pwrgoal"> + <game name="hthro95u" sourcefile="taito_f3.c" cloneof="pwrgoal" romof="pwrgoal"> <description>Hat Trick Hero '95 (US)</description> <year>1994</year> <manufacturer>Taito America Corporation</manufacturer> @@ -103211,9 +103319,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="qtheater"> + <game name="qtheater" sourcefile="taito_f3.c"> <description>Quiz Theater - 3tsu no Monogatari (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -103235,9 +103343,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="8192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8192"/> </game> - <game name="elvactr"> + <game name="elvactr" sourcefile="taito_f3.c"> <description>Elevator Action Returns (World)</description> <year>1994</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103261,9 +103369,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="elvactrj" cloneof="elvactr" romof="elvactr"> + <game name="elvactrj" sourcefile="taito_f3.c" cloneof="elvactr" romof="elvactr"> <description>Elevator Action Returns (Japan)</description> <year>1994</year> <manufacturer>Taito Corporation</manufacturer> @@ -103287,9 +103395,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="elvact2u" cloneof="elvactr" romof="elvactr"> + <game name="elvact2u" sourcefile="taito_f3.c" cloneof="elvactr" romof="elvactr"> <description>Elevator Action 2 (US)</description> <year>1994</year> <manufacturer>Taito America Corporation</manufacturer> @@ -103313,9 +103421,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="spcinv95"> + <game name="spcinv95" sourcefile="taito_f3.c"> <description>Space Invaders '95 - Attack Of The Lunar Loonies (World)</description> <year>1995</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103339,9 +103447,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="spcnv95u" cloneof="spcinv95" romof="spcinv95"> + <game name="spcnv95u" sourcefile="taito_f3.c" cloneof="spcinv95" romof="spcinv95"> <description>Space Invaders '95 - Attack Of The Lunar Loonies (US)</description> <year>1995</year> <manufacturer>Taito America Corporation</manufacturer> @@ -103365,9 +103473,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="akkanvdr" cloneof="spcinv95" romof="spcinv95"> + <game name="akkanvdr" sourcefile="taito_f3.c" cloneof="spcinv95" romof="spcinv95"> <description>Akkanvader (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103391,9 +103499,9 @@ <video screen="raster" orientation="vertical" width="224" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="twinqix"> + <game name="twinqix" sourcefile="taito_f3.c"> <description>Twin Qix (US Prototype)</description> <year>1995</year> <manufacturer>Taito America Corporation</manufacturer> @@ -103421,9 +103529,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="quizhuhu"> + <game name="quizhuhu" sourcefile="taito_f3.c"> <description>Moriguchi Hiroko no Quiz de Hyuu!Hyuu! (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103451,9 +103559,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobble2"> + <game name="pbobble2" sourcefile="taito_f3.c"> <description>Puzzle Bobble 2 (World)</description> <year>1995</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103476,9 +103584,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl2j" cloneof="pbobble2" romof="pbobble2"> + <game name="pbobbl2j" sourcefile="taito_f3.c" cloneof="pbobble2" romof="pbobble2"> <description>Puzzle Bobble 2 (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103501,9 +103609,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl2u" cloneof="pbobble2" romof="pbobble2"> + <game name="pbobbl2u" sourcefile="taito_f3.c" cloneof="pbobble2" romof="pbobble2"> <description>Bust-A-Move Again (US)</description> <year>1995</year> <manufacturer>Taito America Corporation</manufacturer> @@ -103526,9 +103634,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl2x" cloneof="pbobble2" romof="pbobble2"> + <game name="pbobbl2x" sourcefile="taito_f3.c" cloneof="pbobble2" romof="pbobble2"> <description>Puzzle Bobble 2X (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103551,9 +103659,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gekirido"> + <game name="gekirido" sourcefile="taito_f3.c"> <description>Gekirindan (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103577,9 +103685,9 @@ <video screen="raster" orientation="vertical" width="232" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="ktiger2"> + <game name="ktiger2" sourcefile="taito_f3.c"> <description>Kyukyoku Tiger 2 (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103605,9 +103713,9 @@ <video screen="raster" orientation="vertical" width="232" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bubblem"> + <game name="bubblem" sourcefile="taito_f3.c"> <description>Bubble Memories - The Story Of Bubble Bobble 3 (World)</description> <year>1995</year> <manufacturer>Taito Corporation Japan</manufacturer> @@ -103630,9 +103738,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bubblemj" cloneof="bubblem" romof="bubblem"> + <game name="bubblemj" sourcefile="taito_f3.c" cloneof="bubblem" romof="bubblem"> <description>Bubble Memories - The Story Of Bubble Bobble 3 (Japan)</description> <year>1995</year> <manufacturer>Taito Corporation</manufacturer> @@ -103655,9 +103763,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="cleopatr"> + <game name="cleopatr" sourcefile="taito_f3.c"> <description>Cleopatra Fortune (Japan)</description> <year>1996</year> <manufacturer>Taito Corporation</manufacturer> @@ -103679,9 +103787,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobble3"> + <game name="pbobble3" sourcefile="taito_f3.c"> <description>Puzzle Bobble 3 (World)</description> <year>1996</year> <manufacturer>Taito Corporation</manufacturer> @@ -103705,9 +103813,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl3u" cloneof="pbobble3" romof="pbobble3"> + <game name="pbobbl3u" sourcefile="taito_f3.c" cloneof="pbobble3" romof="pbobble3"> <description>Puzzle Bobble 3 (US)</description> <year>1996</year> <manufacturer>Taito Corporation</manufacturer> @@ -103731,9 +103839,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl3j" cloneof="pbobble3" romof="pbobble3"> + <game name="pbobbl3j" sourcefile="taito_f3.c" cloneof="pbobble3" romof="pbobble3"> <description>Puzzle Bobble 3 (Japan)</description> <year>1996</year> <manufacturer>Taito Corporation</manufacturer> @@ -103757,9 +103865,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="arkretrn"> + <game name="arkretrn" sourcefile="taito_f3.c"> <description>Arkanoid Returns (Japan)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103782,9 +103890,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="kirameki"> + <game name="kirameki" sourcefile="taito_f3.c"> <description>Kirameki Star Road (Japan)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103815,9 +103923,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="puchicar"> + <game name="puchicar" sourcefile="taito_f3.c"> <description>Puchi Carat (Japan)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103845,9 +103953,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobble4"> + <game name="pbobble4" sourcefile="taito_f3.c"> <description>Puzzle Bobble 4 (World)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103871,9 +103979,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl4j" cloneof="pbobble4" romof="pbobble4"> + <game name="pbobbl4j" sourcefile="taito_f3.c" cloneof="pbobble4" romof="pbobble4"> <description>Puzzle Bobble 4 (Japan)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103897,9 +104005,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="pbobbl4u" cloneof="pbobble4" romof="pbobble4"> + <game name="pbobbl4u" sourcefile="taito_f3.c" cloneof="pbobble4" romof="pbobble4"> <description>Puzzle Bobble 4 (US)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103923,9 +104031,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="popnpop"> + <game name="popnpop" sourcefile="taito_f3.c"> <description>Pop 'N Pop (World)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103949,9 +104057,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="popnpopj" cloneof="popnpop" romof="popnpop"> + <game name="popnpopj" sourcefile="taito_f3.c" cloneof="popnpop" romof="popnpop"> <description>Pop 'N Pop (Japan)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -103975,9 +104083,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="popnpopu" cloneof="popnpop" romof="popnpop"> + <game name="popnpopu" sourcefile="taito_f3.c" cloneof="popnpop" romof="popnpop"> <description>Pop 'N Pop (US)</description> <year>1997</year> <manufacturer>Taito Corporation</manufacturer> @@ -104001,9 +104109,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="landmakr"> + <game name="landmakr" sourcefile="taito_f3.c"> <description>Land Maker (Japan)</description> <year>1998</year> <manufacturer>Taito Corporation</manufacturer> @@ -104028,9 +104136,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="landmkrp" cloneof="landmakr" romof="landmakr"> + <game name="landmkrp" sourcefile="taito_f3.c" cloneof="landmakr" romof="landmakr"> <description>Land Maker (World Prototype)</description> <year>1998</year> <manufacturer>Taito Corporation</manufacturer> @@ -104082,9 +104190,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="perfrman"> + <game name="perfrman" sourcefile="slapfght.c"> <description>Performan (Japan)</description> <year>1985</year> <manufacturer>[Toaplan] Data East Corporation</manufacturer> @@ -104162,9 +104270,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="perfrmau" cloneof="perfrman" romof="perfrman"> + <game name="perfrmau" sourcefile="slapfght.c" cloneof="perfrman" romof="perfrman"> <description>Performan (US)</description> <year>1985</year> <manufacturer>[Toaplan] Data East USA</manufacturer> @@ -104242,9 +104350,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tigerh"> + <game name="tigerh" sourcefile="slapfght.c"> <description>Tiger Heli (US)</description> <year>1985</year> <manufacturer>Taito America Corp.</manufacturer> @@ -104329,9 +104437,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tigerh2" cloneof="tigerh" romof="tigerh"> + <game name="tigerh2" sourcefile="slapfght.c" cloneof="tigerh" romof="tigerh"> <description>Tiger Heli (Japan set 1)</description> <year>1985</year> <manufacturer>Taito Corp.</manufacturer> @@ -104416,9 +104524,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tigerhj" cloneof="tigerh" romof="tigerh"> + <game name="tigerhj" sourcefile="slapfght.c" cloneof="tigerh" romof="tigerh"> <description>Tiger Heli (Japan set 2)</description> <year>1985</year> <manufacturer>Taito Corp.</manufacturer> @@ -104503,9 +104611,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tigerhb1" cloneof="tigerh" romof="tigerh"> + <game name="tigerhb1" sourcefile="slapfght.c" cloneof="tigerh" romof="tigerh"> <description>Tiger Heli (bootleg set 1)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -104588,9 +104696,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tigerhb2" cloneof="tigerh" romof="tigerh"> + <game name="tigerhb2" sourcefile="slapfght.c" cloneof="tigerh" romof="tigerh"> <description>Tiger Heli (bootleg set 2)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -104673,9 +104781,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="slapfigh"> + <game name="slapfigh" sourcefile="slapfght.c"> <description>Slap Fight</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -104753,9 +104861,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="slapbtjp" cloneof="slapfigh" romof="slapfigh"> + <game name="slapbtjp" sourcefile="slapfght.c" cloneof="slapfigh" romof="slapfigh"> <description>Slap Fight (Japan bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -104832,9 +104940,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="slapbtuk" cloneof="slapfigh" romof="slapfigh"> + <game name="slapbtuk" sourcefile="slapfght.c" cloneof="slapfigh" romof="slapfigh"> <description>Slap Fight (English bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -104912,9 +105020,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="alcon" cloneof="slapfigh" romof="slapfigh"> + <game name="alcon" sourcefile="slapfght.c" cloneof="slapfigh" romof="slapfigh"> <description>Alcon</description> <year>1986</year> <manufacturer><unknown></manufacturer> @@ -104992,10 +105100,10 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="getstar"> - <description>Guardian</description> + <game name="getstar" sourcefile="slapfght.c"> + <description>Guardian (US)</description> <year>1986</year> <manufacturer>Taito</manufacturer> <rom name="rom0" size="16384" crc="6a8bdc6c" sha1="c923bca539bd2eb9a34cb9c7a67a199e28bc081a" region="cpu1" offset="0"/> @@ -105078,9 +105186,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="getstarj" cloneof="getstar" romof="getstar"> + <game name="getstarj" sourcefile="slapfght.c" cloneof="getstar" romof="getstar"> <description>Get Star (Japan)</description> <year>1986</year> <manufacturer>Taito</manufacturer> @@ -105164,9 +105272,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="getstarb" cloneof="getstar" romof="getstar"> + <game name="getstarb" sourcefile="slapfght.c" cloneof="getstar" romof="getstar"> <description>Get Star (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -105249,9 +105357,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjsister"> + <game name="mjsister" sourcefile="mjsister.c"> <description>Mahjong Sisters (Japan)</description> <year>1986</year> <manufacturer>Toaplan</manufacturer> @@ -105330,9 +105438,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="fshark"> + <game name="fshark" sourcefile="twincobr.c"> <description>Flying Shark (World)</description> <year>1987</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -105426,9 +105534,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="skyshark" cloneof="fshark" romof="fshark"> + <game name="skyshark" sourcefile="twincobr.c" cloneof="fshark" romof="fshark"> <description>Sky Shark (US)</description> <year>1987</year> <manufacturer>[Toaplan] Taito America Corporation (Romstar license)</manufacturer> @@ -105520,9 +105628,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="hishouza" cloneof="fshark" romof="fshark"> + <game name="hishouza" sourcefile="twincobr.c" cloneof="fshark" romof="fshark"> <description>Hishou Zame (Japan)</description> <year>1987</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -105616,9 +105724,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="fsharkbt" cloneof="fshark" romof="fshark"> + <game name="fsharkbt" sourcefile="twincobr.c" cloneof="fshark" romof="fshark"> <description>Flying Shark (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -105710,9 +105818,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="wardner"> + <game name="wardner" sourcefile="wardner.c"> <description>Wardner (World)</description> <year>1987</year> <manufacturer>[Toaplan] Taito Corporation Japan</manufacturer> @@ -105810,9 +105918,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="pyros" cloneof="wardner" romof="wardner"> + <game name="pyros" sourcefile="wardner.c" cloneof="wardner" romof="wardner"> <description>Pyros (US)</description> <year>1987</year> <manufacturer>[Toaplan] Taito America Corporation</manufacturer> @@ -105910,9 +106018,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="wardnerj" cloneof="wardner" romof="wardner"> + <game name="wardnerj" sourcefile="wardner.c" cloneof="wardner" romof="wardner"> <description>Wardner no Mori (Japan)</description> <year>1987</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -106010,9 +106118,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="twincobr"> + <game name="twincobr" sourcefile="twincobr.c"> <description>Twin Cobra (World)</description> <year>1987</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -106108,9 +106216,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="twincobu" cloneof="twincobr" romof="twincobr"> + <game name="twincobu" sourcefile="twincobr.c" cloneof="twincobr" romof="twincobr"> <description>Twin Cobra (US)</description> <year>1987</year> <manufacturer>[Toaplan] Taito America Corporation (Romstar license)</manufacturer> @@ -106206,9 +106314,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="ktiger" cloneof="twincobr" romof="twincobr"> + <game name="ktiger" sourcefile="twincobr.c" cloneof="twincobr" romof="twincobr"> <description>Kyukyoku Tiger (Japan)</description> <year>1987</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -106304,9 +106412,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="gulfwar2"> + <game name="gulfwar2" sourcefile="twincobr.c"> <description>Gulf War II</description> <year>1991</year> <manufacturer>Comad</manufacturer> @@ -106400,9 +106508,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="rallybik"> + <game name="rallybik" sourcefile="toaplan1.c"> <description>Rally Bike / Dash Yarou</description> <year>1988</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -106483,9 +106591,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="truxton"> + <game name="truxton" sourcefile="toaplan1.c"> <description>Truxton / Tatsujin</description> <year>1988</year> <manufacturer>[Toaplan] Taito Corporation</manufacturer> @@ -106571,9 +106679,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hellfire"> + <game name="hellfire" sourcefile="toaplan1.c"> <description>Hellfire</description> <year>1989</year> <manufacturer>Toaplan (Taito license)</manufacturer> @@ -106659,9 +106767,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hellfir1" cloneof="hellfire" romof="hellfire"> + <game name="hellfir1" sourcefile="toaplan1.c" cloneof="hellfire" romof="hellfire"> <description>Hellfire (1P Ver.)</description> <year>1989</year> <manufacturer>Toaplan (Taito license)</manufacturer> @@ -106747,9 +106855,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="zerowing"> + <game name="zerowing" sourcefile="toaplan1.c"> <description>Zero Wing</description> <year>1989</year> <manufacturer>Toaplan</manufacturer> @@ -106837,9 +106945,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="demonwld"> + <game name="demonwld" sourcefile="toaplan1.c"> <description>Demon's World / Horror Story</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -106931,9 +107039,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="demonwl1" cloneof="demonwld" romof="demonwld"> + <game name="demonwl1" sourcefile="toaplan1.c" cloneof="demonwld" romof="demonwld"> <description>Demon's World / Horror Story (Taito license)</description> <year>1989</year> <manufacturer>Toaplan (Taito license)</manufacturer> @@ -107023,9 +107131,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fireshrk"> + <game name="fireshrk" sourcefile="toaplan1.c"> <description>Fire Shark</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107112,9 +107220,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="samesame" cloneof="fireshrk" romof="fireshrk"> + <game name="samesame" sourcefile="toaplan1.c" cloneof="fireshrk" romof="fireshrk"> <description>Same! Same! Same!</description> <year>1989</year> <manufacturer>Toaplan</manufacturer> @@ -107208,9 +107316,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="samesam2" cloneof="fireshrk" romof="fireshrk"> + <game name="samesam2" sourcefile="toaplan1.c" cloneof="fireshrk" romof="fireshrk"> <description>Same! Same! Same! (2P Ver.)</description> <year>1989</year> <manufacturer>Toaplan</manufacturer> @@ -107300,9 +107408,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="outzone"> + <game name="outzone" sourcefile="toaplan1.c"> <description>Out Zone (set 1)</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107385,9 +107493,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="outzonea" cloneof="outzone" romof="outzone"> + <game name="outzonea" sourcefile="toaplan1.c" cloneof="outzone" romof="outzone"> <description>Out Zone (set 2)</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107470,9 +107578,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vimana"> + <game name="vimana" sourcefile="toaplan1.c"> <description>Vimana</description> <year>1991</year> <manufacturer>Toaplan</manufacturer> @@ -107550,9 +107658,9 @@ <dipvalue name="Korea"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="vimana1" cloneof="vimana" romof="vimana"> + <game name="vimana1" sourcefile="toaplan1.c" cloneof="vimana" romof="vimana"> <description>Vimana (old set)</description> <year>1991</year> <manufacturer>Toaplan</manufacturer> @@ -107630,9 +107738,9 @@ <dipvalue name="Korea"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="vimanan" cloneof="vimana" romof="vimana"> + <game name="vimanan" sourcefile="toaplan1.c" cloneof="vimana" romof="vimana"> <description>Vimana (Nova Apparate GMBH & Co)</description> <year>1991</year> <manufacturer>Toaplan (Nova Apparate GMBH & Co license)</manufacturer> @@ -107714,9 +107822,9 @@ <dipvalue name="Korea"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="snowbros"> + <game name="snowbros" sourcefile="snowbros.c"> <description>Snow Bros. - Nick & Tom (set 1)</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107780,9 +107888,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="snowbroa" cloneof="snowbros" romof="snowbros"> + <game name="snowbroa" sourcefile="snowbros.c" cloneof="snowbros" romof="snowbros"> <description>Snow Bros. - Nick & Tom (set 2)</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107846,9 +107954,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="snowbrob" cloneof="snowbros" romof="snowbros"> + <game name="snowbrob" sourcefile="snowbros.c" cloneof="snowbros" romof="snowbros"> <description>Snow Bros. - Nick & Tom (set 3)</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107912,9 +108020,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="snowbroj" cloneof="snowbros" romof="snowbros"> + <game name="snowbroj" sourcefile="snowbros.c" cloneof="snowbros" romof="snowbros"> <description>Snow Bros. - Nick & Tom (Japan)</description> <year>1990</year> <manufacturer>Toaplan</manufacturer> @@ -107978,9 +108086,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wintbob" cloneof="snowbros" romof="snowbros"> + <game name="wintbob" sourcefile="snowbros.c" cloneof="snowbros" romof="snowbros"> <description>The Winter Bobble</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -108053,9 +108161,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hyperpac"> + <game name="hyperpac" sourcefile="snowbros.c"> <description>Hyper Pacman</description> <year>1995</year> <manufacturer>SemiCom</manufacturer> @@ -108131,9 +108239,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hyperpcb" cloneof="hyperpac" romof="hyperpac"> + <game name="hyperpcb" sourcefile="snowbros.c" cloneof="hyperpac" romof="hyperpac"> <description>Hyper Pacman (bootleg)</description> <year>1995</year> <manufacturer>bootleg</manufacturer> @@ -108209,9 +108317,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="moremorp"> + <game name="moremorp" sourcefile="snowbros.c"> <description>More More +</description> <manufacturer>SemiCom</manufacturer> <rom name="mmp_u52.bin" size="262144" crc="66baf9b2" sha1="f1d383a94ef4313cb02c59ace17b9562eddcfb3c" region="cpu1" offset="1"/> @@ -108287,9 +108395,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="3in1semi"> + <game name="3in1semi" sourcefile="snowbros.c"> <description>3-in-1 (SemiCom)</description> <year>1997</year> <manufacturer>SemiCom</manufacturer> @@ -108366,9 +108474,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="4in1boot"> + <game name="4in1boot" sourcefile="snowbros.c"> <description>4-in-1 bootleg</description> <manufacturer>bootleg</manufacturer> <rom name="u52" size="524288" crc="71815878" sha1="e3868f5687c1d8ec817671c50ade6c56ee83bfa1" region="cpu1" offset="1"/> @@ -108433,9 +108541,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cookbib2"> + <game name="cookbib2" sourcefile="snowbros.c"> <description>Cookie and Bibi 2</description> <year>1996</year> <manufacturer>SemiCom</manufacturer> @@ -108513,9 +108621,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tekipaki"> + <game name="tekipaki" sourcefile="toaplan2.c"> <description>Teki Paki</description> <year>1991</year> <manufacturer>Toaplan</manufacturer> @@ -108595,9 +108703,9 @@ <dipvalue name="Hong Kong (Honest Trading Co.)"/> <dipvalue name="Taiwan (Spacy Co. Ltd)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="ghox"> + <game name="ghox" sourcefile="toaplan2.c"> <description>Ghox</description> <year>1991</year> <manufacturer>Toaplan</manufacturer> @@ -108677,9 +108785,9 @@ <dipvalue name="USA (Taito Corporation Japan)"/> <dipvalue name="Japan (Taito Corporation)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="dogyuun"> + <game name="dogyuun" sourcefile="toaplan2.c"> <description>Dogyuun</description> <year>1992</year> <manufacturer>Toaplan</manufacturer> @@ -108756,9 +108864,9 @@ <dipvalue name="USA (Atari Games Corp license)"/> <dipvalue name="Japan (Taito Corp license)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="kbash"> + <game name="kbash" sourcefile="toaplan2.c"> <description>Knuckle Bash</description> <year>1993</year> <manufacturer>Toaplan</manufacturer> @@ -108836,9 +108944,9 @@ <dipvalue name="Europe, USA (Atari License)"/> <dipvalue name="USA, Europe (Atari License)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="truxton2"> + <game name="truxton2" sourcefile="toaplan2.c"> <description>Truxton II / Tatsujin II / Tatsujin Oh (Japan)</description> <year>1992</year> <manufacturer>Toaplan</manufacturer> @@ -108911,9 +109019,9 @@ <dipvalue name="Asia"/> <dipvalue name="Korea"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pipibibs"> + <game name="pipibibs" sourcefile="toaplan2.c"> <description>Pipi & Bibis / Whoopee!!</description> <year>1991</year> <manufacturer>Toaplan</manufacturer> @@ -108992,9 +109100,9 @@ <dipvalue name="Low"/> <dipvalue name="High, but censored" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="whoopee" cloneof="pipibibs" romof="pipibibs"> + <game name="whoopee" sourcefile="toaplan2.c" cloneof="pipibibs" romof="pipibibs"> <description>Whoopee!! / Pipi & Bibis</description> <year>1991</year> <manufacturer>Toaplan</manufacturer> @@ -109073,9 +109181,9 @@ <dipvalue name="Low" default="yes"/> <dipvalue name="High, but censored"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pipibibi" cloneof="pipibibs" romof="pipibibs"> + <game name="pipibibi" sourcefile="toaplan2.c" cloneof="pipibibs" romof="pipibibs"> <description>Pipi & Bibis / Whoopee!! (bootleg ?)</description> <year>1991</year> <manufacturer>[Toaplan] Ryouta Kikaku</manufacturer> @@ -109152,9 +109260,9 @@ <dipvalue name="Low"/> <dipvalue name="High, but censored" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fixeight"> + <game name="fixeight" sourcefile="toaplan2.c"> <description>FixEight</description> <year>1992</year> <manufacturer>Toaplan</manufacturer> @@ -109237,9 +109345,9 @@ <dipvalue name="South East Asia"/> <dipvalue name="South East Asia (Taito corp)"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vfive"> + <game name="vfive" sourcefile="toaplan2.c"> <description>V-Five (Japan)</description> <year>1993</year> <manufacturer>Toaplan</manufacturer> @@ -109301,9 +109409,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="grindstm" cloneof="vfive" romof="vfive"> + <game name="grindstm" sourcefile="toaplan2.c" cloneof="vfive" romof="vfive"> <description>Grind Stormer</description> <year>1992</year> <manufacturer>Toaplan</manufacturer> @@ -109378,9 +109486,9 @@ <dipvalue name="Taiwan (Anomoto International Inc License)"/> <dipvalue name="South East Asia (Charterfield License)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="grindsta" cloneof="vfive" romof="vfive"> + <game name="grindsta" sourcefile="toaplan2.c" cloneof="vfive" romof="vfive"> <description>Grind Stormer (older set)</description> <year>1992</year> <manufacturer>Toaplan</manufacturer> @@ -109455,9 +109563,9 @@ <dipvalue name="Taiwan (Anomoto International Inc License)"/> <dipvalue name="South East Asia (Charterfield License)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="batsugun"> + <game name="batsugun" sourcefile="toaplan2.c"> <description>Batsugun</description> <year>1993</year> <manufacturer>Toaplan</manufacturer> @@ -109541,9 +109649,9 @@ <dipvalue name="Taiwan (Taito Corp License)"/> <dipvalue name="South East Asia (Taito Corp License)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="batugnsp" cloneof="batsugun" romof="batsugun"> + <game name="batugnsp" sourcefile="toaplan2.c" cloneof="batsugun" romof="batsugun"> <description>Batsugun (Special Ver.)</description> <year>1993</year> <manufacturer>Toaplan</manufacturer> @@ -109627,9 +109735,9 @@ <dipvalue name="Taiwan (Taito Corp License)"/> <dipvalue name="South East Asia (Taito Corp License)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="snowbro2"> + <game name="snowbro2" sourcefile="toaplan2.c"> <description>Snow Bros. 2 - With New Elves / Otenki Paradise</description> <year>1994</year> <manufacturer>[Toaplan] Hanafram</manufacturer> @@ -109709,9 +109817,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sstriker" cloneof="mahoudai" romof="mahoudai"> + <game name="sstriker" sourcefile="toaplan2.c" cloneof="mahoudai" romof="mahoudai"> <description>Sorcer Striker (World)</description> <year>1993</year> <manufacturer>Raizing</manufacturer> @@ -109788,9 +109896,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mahoudai"> + <game name="mahoudai" sourcefile="toaplan2.c"> <description>Mahou Daisakusen (Japan)</description> <year>1993</year> <manufacturer>Raizing (Able license)</manufacturer> @@ -109857,9 +109965,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="shippumd"> + <game name="shippumd" sourcefile="toaplan2.c"> <description>Shippu Mahou Daisakusen (Japan)</description> <year>1994</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -109927,9 +110035,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="kingdmgp" cloneof="shippumd" romof="shippumd"> + <game name="kingdmgp" sourcefile="toaplan2.c" cloneof="shippumd" romof="shippumd"> <description>Kingdom Grandprix (World)</description> <year>1994</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110006,9 +110114,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="battleg"> + <game name="battleg" sourcefile="toaplan2.c"> <description>Battle Garegga - Type 2 (Denmark / China) (Tue Apr 2 1996)</description> <year>1996</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110092,9 +110200,9 @@ <dipvalue name="Denmark (German Tuning license)" default="yes"/> <dipvalue name="China"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="battlega" cloneof="battleg" romof="battleg"> + <game name="battlega" sourcefile="toaplan2.c" cloneof="battleg" romof="battleg"> <description>Battle Garegga (Europe / USA / Japan / Asia) (Sat Feb 3 1996)</description> <year>1996</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110180,9 +110288,9 @@ <dipvalue name="Japan"/> <dipvalue name="Asia"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="battlegb" cloneof="battleg" romof="battleg"> + <game name="battlegb" sourcefile="toaplan2.c" cloneof="battleg" romof="battleg"> <description>Battle Garegga (Austria / Hong Kong) (Sat Mar 2 1996)</description> <year>1996</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110266,9 +110374,9 @@ <dipvalue name="Austria (German Tuning license)" default="yes"/> <dipvalue name="Hong Kong"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="batrider"> + <game name="batrider" sourcefile="toaplan2.c"> <description>Armed Police Batrider (Japan, version B)</description> <year>1998</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110370,9 +110478,9 @@ <dipvalue name="Every 2000k"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="batridra" cloneof="batrider" romof="batrider"> + <game name="batridra" sourcefile="toaplan2.c" cloneof="batrider" romof="batrider"> <description>Armed Police Batrider (Japan, version A)</description> <year>1998</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110474,9 +110582,9 @@ <dipvalue name="Every 2000k"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="batridrk" cloneof="batrider" romof="batrider"> + <game name="batridrk" sourcefile="toaplan2.c" cloneof="batrider" romof="batrider"> <description>Armed Police Batrider (Korea, version B)</description> <year>1998</year> <manufacturer>Raizing / Eighting</manufacturer> @@ -110578,9 +110686,9 @@ <dipvalue name="Every 2000k"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bbakraid"> + <game name="bbakraid" sourcefile="toaplan2.c"> <description>Battle Bakraid (Japan) (Wed Apr 7 1999)</description> <year>1999</year> <manufacturer>Eighting</manufacturer> @@ -110681,9 +110789,9 @@ <dipvalue name="Every 400k"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bbakradu" cloneof="bbakraid" romof="bbakraid"> + <game name="bbakradu" sourcefile="toaplan2.c" cloneof="bbakraid" romof="bbakraid"> <description>Battle Bakraid - Unlimited version (Japan) (Tue Jun 8 1999)</description> <year>1999</year> <manufacturer>Eighting</manufacturer> @@ -110784,9 +110892,9 @@ <dipvalue name="Every 400k"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pwrinst2"> + <game name="pwrinst2" sourcefile="cave.c"> <description>Power Instinct 2 (USA)</description> <year>1994</year> <manufacturer>Atlus/Cave</manufacturer> @@ -110818,9 +110926,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="10240"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="10240"/> </game> - <game name="mazinger"> + <game name="mazinger" sourcefile="cave.c"> <description>Mazinger Z</description> <year>1994</year> <manufacturer>Banpresto/Dynamic Pl. Toei Animation</manufacturer> @@ -110843,9 +110951,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="donpachi"> + <game name="donpachi" sourcefile="cave.c"> <description>DonPachi (US)</description> <year>1995</year> <manufacturer>Atlus/Cave</manufacturer> @@ -110864,9 +110972,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="donpachj" cloneof="donpachi" romof="donpachi"> + <game name="donpachj" sourcefile="cave.c" cloneof="donpachi" romof="donpachi"> <description>DonPachi (Japan)</description> <year>1995</year> <manufacturer>Atlus/Cave</manufacturer> @@ -110885,9 +110993,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="donpachk" cloneof="donpachi" romof="donpachi"> + <game name="donpachk" sourcefile="cave.c" cloneof="donpachi" romof="donpachi"> <description>DonPachi (Korea)</description> <year>1995</year> <manufacturer>Atlus/Cave</manufacturer> @@ -110906,9 +111014,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="metmqstr"> + <game name="metmqstr" sourcefile="cave.c"> <description>Metamoqester</description> <year>1995</year> <manufacturer>Banpresto/Pandorabox</manufacturer> @@ -110933,9 +111041,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="nmaster" cloneof="metmqstr" romof="metmqstr"> + <game name="nmaster" sourcefile="cave.c" cloneof="metmqstr" romof="metmqstr"> <description>Oni - The Ninja Master (Japan)</description> <year>1995</year> <manufacturer>Banpresto/Pandorabox</manufacturer> @@ -110960,9 +111068,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sailormn"> + <game name="sailormn" sourcefile="cave.c"> <description>Pretty Soldier Sailor Moon (95/03/22B)</description> <year>1995</year> <manufacturer>Banpresto</manufacturer> @@ -110999,9 +111107,9 @@ <dipvalue name="Taiwan"/> <dipvalue name="Korea"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="sailormo" cloneof="sailormn" romof="sailormn"> + <game name="sailormo" sourcefile="cave.c" cloneof="sailormn" romof="sailormn"> <description>Pretty Soldier Sailor Moon (95/03/22)</description> <year>1995</year> <manufacturer>Banpresto</manufacturer> @@ -111038,9 +111146,9 @@ <dipvalue name="Taiwan"/> <dipvalue name="Korea"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="agallet"> + <game name="agallet" sourcefile="cave.c"> <description>Air Gallet</description> <year>1996</year> <manufacturer>Banpresto / Gazelle</manufacturer> @@ -111070,9 +111178,9 @@ <dipvalue name="Taiwan"/> <dipvalue name="Korea"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hotdogst"> + <game name="hotdogst" sourcefile="cave.c"> <description>Hotdog Storm</description> <year>1996</year> <manufacturer>Marble</manufacturer> @@ -111092,9 +111200,9 @@ <video screen="raster" orientation="vertical" width="240" height="384" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ddonpach"> + <game name="ddonpach" sourcefile="cave.c"> <description>DoDonPachi (International)</description> <year>1997</year> <manufacturer>Atlus/Cave</manufacturer> @@ -111114,9 +111222,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="ddonpchj" cloneof="ddonpach" romof="ddonpach"> + <game name="ddonpchj" sourcefile="cave.c" cloneof="ddonpach" romof="ddonpach"> <description>DoDonPachi (Japan)</description> <year>1997</year> <manufacturer>Atlus/Cave</manufacturer> @@ -111136,9 +111244,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="dfeveron"> + <game name="dfeveron" sourcefile="cave.c"> <description>Dangun Feveron (Japan)</description> <year>1998</year> <manufacturer>Cave (Nihon System license)</manufacturer> @@ -111154,9 +111262,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="esprade"> + <game name="esprade" sourcefile="cave.c"> <description>ESP Ra.De. (International Ver 1998 4/22)</description> <year>1998</year> <manufacturer>Atlus/Cave</manufacturer> @@ -111177,9 +111285,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="espradej" cloneof="esprade" romof="esprade"> + <game name="espradej" sourcefile="cave.c" cloneof="esprade" romof="esprade"> <description>ESP Ra.De. (Japan Ver 1998 4/21)</description> <year>1998</year> <manufacturer>Atlus/Cave</manufacturer> @@ -111200,9 +111308,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="espradeo" cloneof="esprade" romof="esprade"> + <game name="espradeo" sourcefile="cave.c" cloneof="esprade" romof="esprade"> <description>ESP Ra.De. (Japan Ver 1998 4/14)</description> <year>1998</year> <manufacturer>Atlus/Cave</manufacturer> @@ -111223,9 +111331,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="uopoko"> + <game name="uopoko" sourcefile="cave.c"> <description>Uo Poko (Japan)</description> <year>1998</year> <manufacturer>Cave (Jaleco license)</manufacturer> @@ -111239,9 +111347,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="guwange"> + <game name="guwange" sourcefile="cave.c"> <description>Guwange (Japan)</description> <year>1999</year> <manufacturer>Atlus/Cave</manufacturer> @@ -111260,9 +111368,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="57.550644"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gaia"> + <game name="gaia" sourcefile="cave.c"> <description>Gaia Crusaders</description> <year>1999</year> <manufacturer>Noise Factory</manufacturer> @@ -111334,9 +111442,9 @@ <dipvalue name="Very Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="32768"/> </game> - <game name="gyrodine"> + <game name="gyrodine" sourcefile="kyugo.c"> <description>Gyrodine</description> <year>1984</year> <manufacturer>Taito Corporation</manufacturer> @@ -111425,9 +111533,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sonofphx"> + <game name="sonofphx" sourcefile="kyugo.c"> <description>Son of Phoenix</description> <year>1985</year> <manufacturer>Associated Overseas MFR, Inc</manufacturer> @@ -111513,9 +111621,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="repulse" cloneof="sonofphx" romof="sonofphx"> + <game name="repulse" sourcefile="kyugo.c" cloneof="sonofphx" romof="sonofphx"> <description>Repulse</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -111601,9 +111709,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="99lstwar" cloneof="sonofphx" romof="sonofphx"> + <game name="99lstwar" sourcefile="kyugo.c" cloneof="sonofphx" romof="sonofphx"> <description>'99: The Last War</description> <year>1985</year> <manufacturer>Proma</manufacturer> @@ -111689,9 +111797,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="99lstwra" cloneof="sonofphx" romof="sonofphx"> + <game name="99lstwra" sourcefile="kyugo.c" cloneof="sonofphx" romof="sonofphx"> <description>'99: The Last War (alternate)</description> <year>1985</year> <manufacturer>Proma</manufacturer> @@ -111777,9 +111885,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="flashgal"> + <game name="flashgal" sourcefile="kyugo.c"> <description>Flashgal</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -111871,9 +111979,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="srdmissn"> + <game name="srdmissn" sourcefile="kyugo.c"> <description>S.R.D. Mission</description> <year>1986</year> <manufacturer>Taito Corporation</manufacturer> @@ -111959,9 +112067,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="legend"> + <game name="legend" sourcefile="kyugo.c"> <description>Legend</description> <manufacturer>Sega / Coreland ?</manufacturer> <rom name="a_r2.rom" size="16384" crc="0cc1c4f4" sha1="33f6a1b31eed75a92e06cb29f912321fe75c31e6" region="cpu1" offset="0"/> @@ -112050,9 +112158,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="airwolf"> + <game name="airwolf" sourcefile="kyugo.c"> <description>Airwolf</description> <year>1987</year> <manufacturer>Kyugo</manufacturer> @@ -112132,9 +112240,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="skywolf" cloneof="airwolf" romof="airwolf"> + <game name="skywolf" sourcefile="kyugo.c" cloneof="airwolf" romof="airwolf"> <description>Sky Wolf (set 1)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -112219,9 +112327,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="skywolf2" cloneof="airwolf" romof="airwolf"> + <game name="skywolf2" sourcefile="kyugo.c" cloneof="airwolf" romof="airwolf"> <description>Sky Wolf (set 2)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -112305,9 +112413,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="defender"> + <game name="defender" sourcefile="williams.c"> <description>Defender (Red label)</description> <year>1980</year> <manufacturer>Williams</manufacturer> @@ -112329,9 +112437,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="defendg" cloneof="defender" romof="defender"> + <game name="defendg" sourcefile="williams.c" cloneof="defender" romof="defender"> <description>Defender (Green label)</description> <year>1980</year> <manufacturer>Williams</manufacturer> @@ -112353,9 +112461,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="defendw" cloneof="defender" romof="defender"> + <game name="defendw" sourcefile="williams.c" cloneof="defender" romof="defender"> <description>Defender (White label)</description> <year>1980</year> <manufacturer>Williams</manufacturer> @@ -112376,9 +112484,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="defndjeu" cloneof="defender" romof="defender"> + <game name="defndjeu" sourcefile="williams.c" cloneof="defender" romof="defender"> <description>Defender ? (bootleg)</description> <year>1980</year> <manufacturer>Jeutel</manufacturer> @@ -112396,9 +112504,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="defcmnd" cloneof="defender" romof="defender"> + <game name="defcmnd" sourcefile="williams.c" cloneof="defender" romof="defender"> <description>Defense Command (set 1)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -112419,9 +112527,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="defence" cloneof="defender" romof="defender"> + <game name="defence" sourcefile="williams.c" cloneof="defender" romof="defender"> <description>Defence Command</description> <year>1981</year> <manufacturer>Outer Limits</manufacturer> @@ -112442,9 +112550,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mayday"> + <game name="mayday" sourcefile="williams.c"> <description>Mayday (set 1)</description> <year>1980</year> <manufacturer><unknown></manufacturer> @@ -112462,9 +112570,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="maydaya" cloneof="mayday" romof="mayday"> + <game name="maydaya" sourcefile="williams.c" cloneof="mayday" romof="mayday"> <description>Mayday (set 2)</description> <year>1980</year> <manufacturer><unknown></manufacturer> @@ -112482,9 +112590,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="maydayb" cloneof="mayday" romof="mayday"> + <game name="maydayb" sourcefile="williams.c" cloneof="mayday" romof="mayday"> <description>Mayday (set 3)</description> <year>1980</year> <manufacturer><unknown></manufacturer> @@ -112506,9 +112614,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="5" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="colony7"> + <game name="colony7" sourcefile="williams.c"> <description>Colony 7 (set 1)</description> <year>1981</year> <manufacturer>Taito</manufacturer> @@ -112527,9 +112635,9 @@ <video screen="raster" orientation="vertical" width="240" height="292" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="3" coins="2"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="colony7a" cloneof="colony7" romof="colony7"> + <game name="colony7a" sourcefile="williams.c" cloneof="colony7" romof="colony7"> <description>Colony 7 (set 2)</description> <year>1981</year> <manufacturer>Taito</manufacturer> @@ -112548,9 +112656,9 @@ <video screen="raster" orientation="vertical" width="240" height="292" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="3" coins="2"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="stargate"> + <game name="stargate" sourcefile="williams.c"> <description>Stargate</description> <year>1981</year> <manufacturer>Williams</manufacturer> @@ -112573,9 +112681,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="6" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="robotron"> + <game name="robotron" sourcefile="williams.c"> <description>Robotron (Solid Blue label)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112598,9 +112706,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="doublejoy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="robotryo" cloneof="robotron" romof="robotron"> + <game name="robotryo" sourcefile="williams.c" cloneof="robotron" romof="robotron"> <description>Robotron (Yellow/Orange label)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112623,9 +112731,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="doublejoy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="joust"> + <game name="joust" sourcefile="williams.c"> <description>Joust (White/Green label)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112648,9 +112756,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="1" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="joustr" cloneof="joust" romof="joust"> + <game name="joustr" sourcefile="williams.c" cloneof="joust" romof="joust"> <description>Joust (Solid Red label)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112673,9 +112781,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="1" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="joustwr" cloneof="joust" romof="joust"> + <game name="joustwr" sourcefile="williams.c" cloneof="joust" romof="joust"> <description>Joust (White/Red label)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112698,9 +112806,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="1" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="bubbles"> + <game name="bubbles" sourcefile="williams.c"> <description>Bubbles</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112723,9 +112831,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="bubblesr" cloneof="bubbles" romof="bubbles"> + <game name="bubblesr" sourcefile="williams.c" cloneof="bubbles" romof="bubbles"> <description>Bubbles (Solid Red label)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112748,9 +112856,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="bubblesp" cloneof="bubbles" romof="bubbles"> + <game name="bubblesp" sourcefile="williams.c" cloneof="bubbles" romof="bubbles"> <description>Bubbles (prototype version)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112773,9 +112881,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="splat"> + <game name="splat" sourcefile="williams.c"> <description>Splat!</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112798,9 +112906,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="doublejoy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="sinistar"> + <game name="sinistar" sourcefile="williams.c"> <description>Sinistar (revision 3)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112827,9 +112935,9 @@ <video screen="raster" orientation="vertical" width="240" height="292" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="stick" buttons="2" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="sinista1" cloneof="sinistar" romof="sinistar"> + <game name="sinista1" sourcefile="williams.c" cloneof="sinistar" romof="sinistar"> <description>Sinistar (prototype version)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112856,9 +112964,9 @@ <video screen="raster" orientation="vertical" width="240" height="292" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="stick" buttons="2" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="sinista2" cloneof="sinistar" romof="sinistar"> + <game name="sinista2" sourcefile="williams.c" cloneof="sinistar" romof="sinistar"> <description>Sinistar (revision 2)</description> <year>1982</year> <manufacturer>Williams</manufacturer> @@ -112885,9 +112993,9 @@ <video screen="raster" orientation="vertical" width="240" height="292" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="stick" buttons="2" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="playball"> + <game name="playball" sourcefile="williams.c"> <description>PlayBall! (prototype)</description> <year>1983</year> <manufacturer>Williams</manufacturer> @@ -112915,9 +113023,9 @@ <video screen="raster" orientation="vertical" width="231" height="292" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="blaster"> + <game name="blaster" sourcefile="williams.c"> <description>Blaster</description> <year>1983</year> <manufacturer>Williams</manufacturer> @@ -112946,9 +113054,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="stick" buttons="3" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="blastkit" cloneof="blaster" romof="blaster"> + <game name="blastkit" sourcefile="williams.c" cloneof="blaster" romof="blaster"> <description>Blaster (kit)</description> <year>1983</year> <manufacturer>Williams</manufacturer> @@ -112977,9 +113085,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="stick" buttons="3" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="spdball"> + <game name="spdball" sourcefile="williams.c"> <description>Speed Ball (prototype)</description> <year>1985</year> <manufacturer>Williams</manufacturer> @@ -113003,9 +113111,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="trackball" buttons="1" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mysticm"> + <game name="mysticm" sourcefile="williams.c"> <description>Mystic Marathon</description> <year>1983</year> <manufacturer>Williams</manufacturer> @@ -113036,9 +113144,9 @@ <video screen="raster" orientation="horizontal" width="284" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="1" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="tshoot"> + <game name="tshoot" sourcefile="williams.c"> <description>Turkey Shoot</description> <year>1984</year> <manufacturer>Williams</manufacturer> @@ -113069,9 +113177,9 @@ <video screen="raster" orientation="horizontal" width="284" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="lightgun" buttons="3" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="inferno"> + <game name="inferno" sourcefile="williams.c"> <description>Inferno</description> <year>1984</year> <manufacturer>Williams</manufacturer> @@ -113099,9 +113207,9 @@ <video screen="raster" orientation="horizontal" width="284" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="doublejoy8way" buttons="1" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="144"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="144"/> </game> - <game name="joust2"> + <game name="joust2" sourcefile="williams.c"> <description>Joust 2 - Survival of the Fittest (set 1)</description> <year>1986</year> <manufacturer>Williams</manufacturer> @@ -113139,9 +113247,9 @@ <video screen="raster" orientation="vertical" width="240" height="284" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="lottofun"> + <game name="lottofun" sourcefile="williams.c"> <description>Lotto Fun</description> <year>1987</year> <manufacturer>H.A.R. Management</manufacturer> @@ -113164,9 +113272,9 @@ <video screen="raster" orientation="horizontal" width="292" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" coins="2" tilt="yes"/> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="vulgus"> + <game name="vulgus" sourcefile="vulgus.c"> <description>Vulgus (set 1)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113255,9 +113363,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vulgus2" cloneof="vulgus" romof="vulgus"> + <game name="vulgus2" sourcefile="vulgus.c" cloneof="vulgus" romof="vulgus"> <description>Vulgus (set 2)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113346,9 +113454,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vulgusj" cloneof="vulgus" romof="vulgus"> + <game name="vulgusj" sourcefile="vulgus.c" cloneof="vulgus" romof="vulgus"> <description>Vulgus (Japan?)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113437,9 +113545,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sonson"> + <game name="sonson" sourcefile="sonson.c"> <description>Son Son</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113521,9 +113629,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="sonsonj" cloneof="sonson" romof="sonson"> + <game name="sonsonj" sourcefile="sonson.c" cloneof="sonson" romof="sonson"> <description>Son Son (Japan)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113608,9 +113716,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="higemaru"> + <game name="higemaru" sourcefile="higemaru.c"> <description>Pirate Ship Higemaru</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113692,9 +113800,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="1942"> + <game name="1942" sourcefile="1942.c"> <description>1942 (set 1)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113784,9 +113892,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="1942a" cloneof="1942" romof="1942"> + <game name="1942a" sourcefile="1942.c" cloneof="1942" romof="1942"> <description>1942 (set 2)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113876,9 +113984,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="1942b" cloneof="1942" romof="1942"> + <game name="1942b" sourcefile="1942.c" cloneof="1942" romof="1942"> <description>1942 (set 3)</description> <year>1984</year> <manufacturer>Capcom</manufacturer> @@ -113968,9 +114076,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="exedexes"> + <game name="exedexes" sourcefile="exedexes.c"> <description>Exed Exes</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114061,9 +114169,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="savgbees" cloneof="exedexes" romof="exedexes"> + <game name="savgbees" sourcefile="exedexes.c" cloneof="exedexes" romof="exedexes"> <description>Savage Bees</description> <year>1985</year> <manufacturer>Capcom (Memetron license)</manufacturer> @@ -114154,9 +114262,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="commando"> + <game name="commando" sourcefile="commando.c"> <description>Commando (World)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114236,13 +114344,13 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="Upright One Player" default="yes"/> - <dipvalue name="Upright Two Players"/> + <dipvalue name="Upright One Player"/> + <dipvalue name="Upright Two Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="commandu" cloneof="commando" romof="commando"> + <game name="commandu" sourcefile="commando.c" cloneof="commando" romof="commando"> <description>Commando (US)</description> <year>1985</year> <manufacturer>Capcom (Data East USA license)</manufacturer> @@ -114320,13 +114428,13 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="Upright One Player" default="yes"/> - <dipvalue name="Upright Two Players"/> + <dipvalue name="Upright One Player"/> + <dipvalue name="Upright Two Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="commandj" cloneof="commando" romof="commando"> + <game name="commandj" sourcefile="commando.c" cloneof="commando" romof="commando"> <description>Senjou no Ookami</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114406,13 +114514,13 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="Upright One Player" default="yes"/> - <dipvalue name="Upright Two Players"/> + <dipvalue name="Upright One Player"/> + <dipvalue name="Upright Two Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sinvasn" cloneof="commando" romof="commando"> + <game name="sinvasn" sourcefile="commando.c" cloneof="commando" romof="commando"> <description>Space Invasion (Europe)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114492,13 +114600,13 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="Upright One Player" default="yes"/> - <dipvalue name="Upright Two Players"/> + <dipvalue name="Upright One Player"/> + <dipvalue name="Upright Two Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sinvasnb" cloneof="commando" romof="commando"> + <game name="sinvasnb" sourcefile="commando.c" cloneof="commando" romof="commando"> <description>Space Invasion (bootleg)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -114578,13 +114686,13 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="Upright One Player" default="yes"/> - <dipvalue name="Upright Two Players"/> + <dipvalue name="Upright One Player"/> + <dipvalue name="Upright Two Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gng"> + <game name="gng" sourcefile="gng.c"> <description>Ghosts'n Goblins (World? set 1)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114672,9 +114780,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gnga" cloneof="gng" romof="gng"> + <game name="gnga" sourcefile="gng.c" cloneof="gng" romof="gng"> <description>Ghosts'n Goblins (World? set 2)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114764,9 +114872,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gngt" cloneof="gng" romof="gng"> + <game name="gngt" sourcefile="gng.c" cloneof="gng" romof="gng"> <description>Ghosts'n Goblins (US)</description> <year>1985</year> <manufacturer>Capcom (Taito America license)</manufacturer> @@ -114854,9 +114962,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="makaimur" cloneof="gng" romof="gng"> + <game name="makaimur" sourcefile="gng.c" cloneof="gng" romof="gng"> <description>Makai-Mura (Japan)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -114942,9 +115050,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="makaimuc" cloneof="gng" romof="gng"> + <game name="makaimuc" sourcefile="gng.c" cloneof="gng" romof="gng"> <description>Makai-Mura (Japan Revision C)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -115030,9 +115138,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="makaimug" cloneof="gng" romof="gng"> + <game name="makaimug" sourcefile="gng.c" cloneof="gng" romof="gng"> <description>Makai-Mura (Japan Revision G)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -115118,9 +115226,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="diamond"> + <game name="diamond" sourcefile="gng.c"> <description>Diamond Run</description> <year>1989</year> <manufacturer>KH Video</manufacturer> @@ -115203,9 +115311,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gunsmoke"> + <game name="gunsmoke" sourcefile="gunsmoke.c"> <description>Gun.Smoke (World)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -115324,9 +115432,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gunsmoku" cloneof="gunsmoke" romof="gunsmoke"> + <game name="gunsmoku" sourcefile="gunsmoke.c" cloneof="gunsmoke" romof="gunsmoke"> <description>Gun.Smoke (US set 1)</description> <year>1985</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -115445,9 +115553,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gunsmoka" cloneof="gunsmoke" romof="gunsmoke"> + <game name="gunsmoka" sourcefile="gunsmoke.c" cloneof="gunsmoke" romof="gunsmoke"> <description>Gun.Smoke (US set 2)</description> <year>1986</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -115566,9 +115674,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gunsmokj" cloneof="gunsmoke" romof="gunsmoke"> + <game name="gunsmokj" sourcefile="gunsmoke.c" cloneof="gunsmoke" romof="gunsmoke"> <description>Gun.Smoke (Japan)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -115687,9 +115795,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sectionz"> + <game name="sectionz" sourcefile="lwings.c"> <description>Section Z (set 1)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -115767,9 +115875,9 @@ <dipvalue name="Upright Two Players"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sctionza" cloneof="sectionz" romof="sectionz"> + <game name="sctionza" sourcefile="lwings.c" cloneof="sectionz" romof="sectionz"> <description>Section Z (set 2)</description> <year>1985</year> <manufacturer>Capcom</manufacturer> @@ -115847,9 +115955,9 @@ <dipvalue name="Upright Two Players"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="trojan"> + <game name="trojan" sourcefile="lwings.c"> <description>Trojan (US)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -115942,9 +116050,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="trojanr" cloneof="trojan" romof="trojan"> + <game name="trojanr" sourcefile="lwings.c" cloneof="trojan" romof="trojan"> <description>Trojan (Romstar)</description> <year>1986</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -116033,9 +116141,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="trojanj" cloneof="trojan" romof="trojan"> + <game name="trojanj" sourcefile="lwings.c" cloneof="trojan" romof="trojan"> <description>Tatakai no Banka (Japan)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116124,9 +116232,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="srumbler"> + <game name="srumbler" sourcefile="srumbler.c"> <description>The Speed Rumbler (set 1)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116218,9 +116326,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="srumblr2" cloneof="srumbler" romof="srumbler"> + <game name="srumblr2" sourcefile="srumbler.c" cloneof="srumbler" romof="srumbler"> <description>The Speed Rumbler (set 2)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116312,9 +116420,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rushcrsh" cloneof="srumbler" romof="srumbler"> + <game name="rushcrsh" sourcefile="srumbler.c" cloneof="srumbler" romof="srumbler"> <description>Rush & Crash (Japan)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116406,9 +116514,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="lwings"> + <game name="lwings" sourcefile="lwings.c"> <description>Legendary Wings (US set 1)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116491,9 +116599,9 @@ <dipvalue name="40000 and every 100000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lwings2" cloneof="lwings" romof="lwings"> + <game name="lwings2" sourcefile="lwings.c" cloneof="lwings" romof="lwings"> <description>Legendary Wings (US set 2)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116576,9 +116684,9 @@ <dipvalue name="40000 and every 100000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lwingsjp" cloneof="lwings" romof="lwings"> + <game name="lwingsjp" sourcefile="lwings.c" cloneof="lwings" romof="lwings"> <description>Ares no Tsubasa (Japan)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116661,9 +116769,9 @@ <dipvalue name="40000 and every 100000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sidearms"> + <game name="sidearms" sourcefile="sidearms.c"> <description>Side Arms - Hyper Dyne (World)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116759,9 +116867,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="sidearmr" cloneof="sidearms" romof="sidearms"> + <game name="sidearmr" sourcefile="sidearms.c" cloneof="sidearms" romof="sidearms"> <description>Side Arms - Hyper Dyne (US)</description> <year>1986</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -116857,9 +116965,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="sidearjp" cloneof="sidearms" romof="sidearms"> + <game name="sidearjp" sourcefile="sidearms.c" cloneof="sidearms" romof="sidearms"> <description>Side Arms - Hyper Dyne (Japan)</description> <year>1986</year> <manufacturer>Capcom</manufacturer> @@ -116955,9 +117063,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="turtship"> + <game name="turtship" sourcefile="sidearms.c"> <description>Turtle Ship</description> <year>1988</year> <manufacturer>Philko</manufacturer> @@ -117037,9 +117145,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="dyger"> + <game name="dyger" sourcefile="sidearms.c"> <description>Dyger (Korea set 1)</description> <year>1989</year> <manufacturer>Philko</manufacturer> @@ -117121,9 +117229,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="dygera" cloneof="dyger" romof="dyger"> + <game name="dygera" sourcefile="sidearms.c" cloneof="dyger" romof="dyger"> <description>Dyger (Korea set 2)</description> <year>1989</year> <manufacturer>Philko</manufacturer> @@ -117205,9 +117313,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="whizz"> + <game name="whizz" sourcefile="sidearms.c"> <description>Whizz</description> <year>1989</year> <manufacturer>Philko</manufacturer> @@ -117257,9 +117365,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="avengers"> + <game name="avengers" sourcefile="lwings.c"> <description>Avengers (US set 1)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117351,9 +117459,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="avenger2" cloneof="avengers" romof="avengers"> + <game name="avenger2" sourcefile="lwings.c" cloneof="avengers" romof="avengers"> <description>Avengers (US set 2)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117445,9 +117553,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="buraiken" cloneof="avengers" romof="avengers"> + <game name="buraiken" sourcefile="lwings.c" cloneof="avengers" romof="avengers"> <description>Hissatsu Buraiken (Japan)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117539,9 +117647,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bionicc"> + <game name="bionicc" sourcefile="bionicc.c"> <description>Bionic Commando (US set 1)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117628,9 +117736,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bionicc2" cloneof="bionicc" romof="bionicc"> + <game name="bionicc2" sourcefile="bionicc.c" cloneof="bionicc" romof="bionicc"> <description>Bionic Commando (US set 2)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117717,9 +117825,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="topsecrt" cloneof="bionicc" romof="bionicc"> + <game name="topsecrt" sourcefile="bionicc.c" cloneof="bionicc" romof="bionicc"> <description>Top Secret (Japan)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117806,9 +117914,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="1943"> + <game name="1943" sourcefile="1943.c"> <description>1943 - The Battle of Midway (US)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -117916,9 +118024,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="1943j" cloneof="1943" romof="1943"> + <game name="1943j" sourcefile="1943.c" cloneof="1943" romof="1943"> <description>1943 - The Battle of Midway (Japan)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118026,9 +118134,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="blktiger"> + <game name="blktiger" sourcefile="blktiger.c"> <description>Black Tiger</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118116,9 +118224,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bktigerb" cloneof="blktiger" romof="blktiger"> + <game name="bktigerb" sourcefile="blktiger.c" cloneof="blktiger" romof="blktiger"> <description>Black Tiger (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -118206,9 +118314,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="blkdrgon" cloneof="blktiger" romof="blktiger"> + <game name="blkdrgon" sourcefile="blktiger.c" cloneof="blktiger" romof="blktiger"> <description>Black Dragon</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118296,9 +118404,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="blkdrgnb" cloneof="blktiger" romof="blktiger"> + <game name="blkdrgnb" sourcefile="blktiger.c" cloneof="blktiger" romof="blktiger"> <description>Black Dragon (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -118386,9 +118494,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sf1"> + <game name="sf1" sourcefile="sf1.c"> <description>Street Fighter (World)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118535,9 +118643,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sf1us" cloneof="sf1" romof="sf1"> + <game name="sf1us" sourcefile="sf1.c" cloneof="sf1" romof="sf1"> <description>Street Fighter (US)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118684,9 +118792,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sf1jp" cloneof="sf1" romof="sf1"> + <game name="sf1jp" sourcefile="sf1.c" cloneof="sf1" romof="sf1"> <description>Street Fighter (Japan)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118833,9 +118941,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sf1p" cloneof="sf1" romof="sf1"> + <game name="sf1p" sourcefile="sf1.c" cloneof="sf1" romof="sf1"> <description>Street Fighter (prototype)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -118975,9 +119083,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tigeroad"> + <game name="tigeroad" sourcefile="tigeroad.c"> <description>Tiger Road (US)</description> <year>1987</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -119058,9 +119166,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="576"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="576"/> </game> - <game name="toramich" cloneof="tigeroad" romof="tigeroad"> + <game name="toramich" sourcefile="tigeroad.c" cloneof="tigeroad" romof="tigeroad"> <description>Tora-he no Michi (Japan)</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -119146,9 +119254,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="576"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="576"/> </game> - <game name="f1dream"> + <game name="f1dream" sourcefile="tigeroad.c"> <description>F-1 Dream</description> <year>1988</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -119229,9 +119337,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="576"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="576"/> </game> - <game name="f1dreamb" cloneof="f1dream" romof="f1dream"> + <game name="f1dreamb" sourcefile="tigeroad.c" cloneof="f1dream" romof="f1dream"> <description>F-1 Dream (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -119314,9 +119422,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="576"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="576"/> </game> - <game name="1943kai"> + <game name="1943kai" sourcefile="1943.c"> <description>1943 Kai - Midway Kaisen</description> <year>1987</year> <manufacturer>Capcom</manufacturer> @@ -119424,9 +119532,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="lastduel"> + <game name="lastduel" sourcefile="lastduel.c"> <description>Last Duel (US set 1)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -119552,9 +119660,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lstduela" cloneof="lastduel" romof="lastduel"> + <game name="lstduela" sourcefile="lastduel.c" cloneof="lastduel" romof="lastduel"> <description>Last Duel (US set 2)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -119680,9 +119788,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lstduelb" cloneof="lastduel" romof="lastduel"> + <game name="lstduelb" sourcefile="lastduel.c" cloneof="lastduel" romof="lastduel"> <description>Last Duel (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -119810,9 +119918,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="madgear"> + <game name="madgear" sourcefile="lastduel.c"> <description>Mad Gear (US)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -119935,9 +120043,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="madgearj" cloneof="madgear" romof="madgear"> + <game name="madgearj" sourcefile="lastduel.c" cloneof="madgear" romof="madgear"> <description>Mad Gear (Japan)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -120060,9 +120168,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ledstorm" cloneof="madgear" romof="madgear"> + <game name="ledstorm" sourcefile="lastduel.c" cloneof="madgear" romof="madgear"> <description>Led Storm (US)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -120185,9 +120293,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="forgottn"> + <game name="forgottn" sourcefile="cps1.c"> <description>Forgotten Worlds (US)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -120302,9 +120410,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lostwrld" cloneof="forgottn" romof="forgottn"> + <game name="lostwrld" sourcefile="cps1.c" cloneof="forgottn" romof="forgottn"> <description>Lost Worlds (Japan)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -120419,9 +120527,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ghouls"> + <game name="ghouls" sourcefile="cps1.c"> <description>Ghouls'n Ghosts (World)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -120541,9 +120649,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ghoulsu" cloneof="ghouls" romof="ghouls"> + <game name="ghoulsu" sourcefile="cps1.c" cloneof="ghouls" romof="ghouls"> <description>Ghouls'n Ghosts (US)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -120663,9 +120771,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="daimakai" cloneof="ghouls" romof="ghouls"> + <game name="daimakai" sourcefile="cps1.c" cloneof="ghouls" romof="ghouls"> <description>Dai Makai-Mura (Japan)</description> <year>1988</year> <manufacturer>Capcom</manufacturer> @@ -120785,9 +120893,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="strider"> + <game name="strider" sourcefile="cps1.c"> <description>Strider (US set 1)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -120894,9 +121002,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="stridrua" cloneof="strider" romof="strider"> + <game name="stridrua" sourcefile="cps1.c" cloneof="strider" romof="strider"> <description>Strider (US set 2)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121003,9 +121111,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="striderj" cloneof="strider" romof="strider"> + <game name="striderj" sourcefile="cps1.c" cloneof="strider" romof="strider"> <description>Strider Hiryu (Japan set 1)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121109,9 +121217,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="stridrja" cloneof="strider" romof="strider"> + <game name="stridrja" sourcefile="cps1.c" cloneof="strider" romof="strider"> <description>Strider Hiryu (Japan set 2)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121218,9 +121326,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dw"> + <game name="dw" sourcefile="cps1.c"> <description>Dynasty Wars (World)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121364,9 +121472,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dwj" cloneof="dw" romof="dw"> + <game name="dwj" sourcefile="cps1.c" cloneof="dw" romof="dw"> <description>Tenchi wo Kurau (Japan)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121510,9 +121618,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="willow"> + <game name="willow" sourcefile="cps1.c"> <description>Willow (US)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121622,9 +121730,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="willowj" cloneof="willow" romof="willow"> + <game name="willowj" sourcefile="cps1.c" cloneof="willow" romof="willow"> <description>Willow (Japan, Japanese)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121734,9 +121842,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="willowje" cloneof="willow" romof="willow"> + <game name="willowje" sourcefile="cps1.c" cloneof="willow" romof="willow"> <description>Willow (Japan, English)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121846,9 +121954,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="unsquad"> + <game name="unsquad" sourcefile="cps1.c"> <description>U.N. Squadron (US)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -121956,9 +122064,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="area88" cloneof="unsquad" romof="unsquad"> + <game name="area88" sourcefile="cps1.c" cloneof="unsquad" romof="unsquad"> <description>Area 88 (Japan)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -122066,9 +122174,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ffight"> + <game name="ffight" sourcefile="cps1.c"> <description>Final Fight (World)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -122175,9 +122283,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ffightu" cloneof="ffight" romof="ffight"> + <game name="ffightu" sourcefile="cps1.c" cloneof="ffight" romof="ffight"> <description>Final Fight (US 900112)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -122284,9 +122392,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ffightj" cloneof="ffight" romof="ffight"> + <game name="ffightj" sourcefile="cps1.c" cloneof="ffight" romof="ffight"> <description>Final Fight (Japan set 1)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -122405,9 +122513,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ffightj1" cloneof="ffight" romof="ffight"> + <game name="ffightj1" sourcefile="cps1.c" cloneof="ffight" romof="ffight"> <description>Final Fight (Japan set 2)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -122526,9 +122634,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="1941"> + <game name="1941" sourcefile="cps1.c"> <description>1941 - Counter Attack (World)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -122637,9 +122745,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="1941j" cloneof="1941" romof="1941"> + <game name="1941j" sourcefile="cps1.c" cloneof="1941" romof="1941"> <description>1941 - Counter Attack (Japan)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -122748,9 +122856,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mercs"> + <game name="mercs" sourcefile="cps1.c"> <description>Mercs (World 900302)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -122871,9 +122979,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mercsu" cloneof="mercs" romof="mercs"> + <game name="mercsu" sourcefile="cps1.c" cloneof="mercs" romof="mercs"> <description>Mercs (US 900302)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -122994,9 +123102,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mercsua" cloneof="mercs" romof="mercs"> + <game name="mercsua" sourcefile="cps1.c" cloneof="mercs" romof="mercs"> <description>Mercs (US 900608)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123117,9 +123225,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mercsj" cloneof="mercs" romof="mercs"> + <game name="mercsj" sourcefile="cps1.c" cloneof="mercs" romof="mercs"> <description>Senjou no Ookami II (Japan 900302)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123240,9 +123348,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mtwins"> + <game name="mtwins" sourcefile="cps1.c"> <description>Mega Twins (World 900619)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123347,9 +123455,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="chikij" cloneof="mtwins" romof="mtwins"> + <game name="chikij" sourcefile="cps1.c" cloneof="mtwins" romof="mtwins"> <description>Chiki Chiki Boys (Japan 900619)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123454,9 +123562,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="msword"> + <game name="msword" sourcefile="cps1.c"> <description>Magic Sword - Heroic Fantasy (World 900725)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123563,9 +123671,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mswordr1" cloneof="msword" romof="msword"> + <game name="mswordr1" sourcefile="cps1.c" cloneof="msword" romof="msword"> <description>Magic Sword - Heroic Fantasy (World 900623)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123672,9 +123780,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mswordu" cloneof="msword" romof="msword"> + <game name="mswordu" sourcefile="cps1.c" cloneof="msword" romof="msword"> <description>Magic Sword - Heroic Fantasy (US 900725)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123781,9 +123889,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mswordj" cloneof="msword" romof="msword"> + <game name="mswordj" sourcefile="cps1.c" cloneof="msword" romof="msword"> <description>Magic Sword (Japan 900623)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -123890,9 +123998,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cawing"> + <game name="cawing" sourcefile="cps1.c"> <description>Carrier Air Wing (World 901012)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -124001,9 +124109,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cawingu" cloneof="cawing" romof="cawing"> + <game name="cawingu" sourcefile="cps1.c" cloneof="cawing" romof="cawing"> <description>Carrier Air Wing (US 901012)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -124112,9 +124220,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cawingj" cloneof="cawing" romof="cawing"> + <game name="cawingj" sourcefile="cps1.c" cloneof="cawing" romof="cawing"> <description>U.S. Navy (Japan 901012)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -124238,9 +124346,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nemo"> + <game name="nemo" sourcefile="cps1.c"> <description>Nemo (World 901130)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -124346,9 +124454,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nemoj" cloneof="nemo" romof="nemo"> + <game name="nemoj" sourcefile="cps1.c" cloneof="nemo" romof="nemo"> <description>Nemo (Japan 901120)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -124454,9 +124562,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2"> + <game name="sf2" sourcefile="cps1.c"> <description>Street Fighter II - The World Warrior (World 910522)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -124578,9 +124686,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2eb" cloneof="sf2" romof="sf2"> + <game name="sf2eb" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (World 910214)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -124702,9 +124810,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ua" cloneof="sf2" romof="sf2"> + <game name="sf2ua" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 910206)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -124826,9 +124934,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ub" cloneof="sf2" romof="sf2"> + <game name="sf2ub" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 910214)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -124950,9 +125058,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ud" cloneof="sf2" romof="sf2"> + <game name="sf2ud" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 910318)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125074,9 +125182,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ue" cloneof="sf2" romof="sf2"> + <game name="sf2ue" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 910228)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125198,9 +125306,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2uf" cloneof="sf2" romof="sf2"> + <game name="sf2uf" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 910411)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125322,9 +125430,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ui" cloneof="sf2" romof="sf2"> + <game name="sf2ui" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 910522)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125446,9 +125554,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2uk" cloneof="sf2" romof="sf2"> + <game name="sf2uk" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (US 911101)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125570,9 +125678,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2j" cloneof="sf2" romof="sf2"> + <game name="sf2j" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (Japan 911210)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125694,9 +125802,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ja" cloneof="sf2" romof="sf2"> + <game name="sf2ja" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (Japan 910214)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125818,9 +125926,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2jc" cloneof="sf2" romof="sf2"> + <game name="sf2jc" sourcefile="cps1.c" cloneof="sf2" romof="sf2"> <description>Street Fighter II - The World Warrior (Japan 910306)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -125942,9 +126050,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="3wonders"> + <game name="3wonders" sourcefile="cps1.c"> <description>Three Wonders (World 910520)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126052,9 +126160,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="3wonderu" cloneof="3wonders" romof="3wonders"> + <game name="3wonderu" sourcefile="cps1.c" cloneof="3wonders" romof="3wonders"> <description>Three Wonders (US 910520)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126162,9 +126270,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wonder3" cloneof="3wonders" romof="3wonders"> + <game name="wonder3" sourcefile="cps1.c" cloneof="3wonders" romof="3wonders"> <description>Wonder 3 (Japan 910520)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126272,9 +126380,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kod"> + <game name="kod" sourcefile="cps1.c"> <description>The King of Dragons (World 910711)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126390,9 +126498,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kodu" cloneof="kod" romof="kod"> + <game name="kodu" sourcefile="cps1.c" cloneof="kod" romof="kod"> <description>The King of Dragons (US 910910)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126508,9 +126616,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kodj" cloneof="kod" romof="kod"> + <game name="kodj" sourcefile="cps1.c" cloneof="kod" romof="kod"> <description>The King of Dragons (Japan 910805)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126623,9 +126731,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kodb" cloneof="kod" romof="kod"> + <game name="kodb" sourcefile="cps1.c" cloneof="kod" romof="kod"> <description>The King of Dragons (bootleg)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126735,9 +126843,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="captcomm"> + <game name="captcomm" sourcefile="cps1.c"> <description>Captain Commando (World 911014)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126815,9 +126923,9 @@ </dipswitch> <dipswitch name="Max Players"> <dipvalue name="1"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="2"/> <dipvalue name="3"/> - <dipvalue name="4"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Lives"> <dipvalue name="1"/> @@ -126847,9 +126955,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="captcomu" cloneof="captcomm" romof="captcomm"> + <game name="captcomu" sourcefile="cps1.c" cloneof="captcomm" romof="captcomm"> <description>Captain Commando (US 910928)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -126927,9 +127035,9 @@ </dipswitch> <dipswitch name="Max Players"> <dipvalue name="1"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="2"/> <dipvalue name="3"/> - <dipvalue name="4"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Lives"> <dipvalue name="1"/> @@ -126959,9 +127067,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="captcomj" cloneof="captcomm" romof="captcomm"> + <game name="captcomj" sourcefile="cps1.c" cloneof="captcomm" romof="captcomm"> <description>Captain Commando (Japan 911202)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -127039,9 +127147,9 @@ </dipswitch> <dipswitch name="Max Players"> <dipvalue name="1"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="2"/> <dipvalue name="3"/> - <dipvalue name="4"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Lives"> <dipvalue name="1"/> @@ -127071,9 +127179,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="knights"> + <game name="knights" sourcefile="cps1.c"> <description>Knights of the Round (World 911127)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -127183,9 +127291,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="knightsu" cloneof="knights" romof="knights"> + <game name="knightsu" sourcefile="cps1.c" cloneof="knights" romof="knights"> <description>Knights of the Round (US 911127)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -127295,9 +127403,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="knightsj" cloneof="knights" romof="knights"> + <game name="knightsj" sourcefile="cps1.c" cloneof="knights" romof="knights"> <description>Knights of the Round (Japan 911127)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -127410,9 +127518,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ce"> + <game name="sf2ce" sourcefile="cps1.c"> <description>Street Fighter II' - Champion Edition (World 920313)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -127529,9 +127637,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ceua" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2ceua" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (US 920313)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -127648,9 +127756,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ceub" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2ceub" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (US 920513)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -127767,9 +127875,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2ceuc" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2ceuc" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (US 920803)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -127886,9 +127994,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2cej" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2cej" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (Japan 920513)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -128005,9 +128113,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2rb" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2rb" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (Rainbow set 1)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128124,9 +128232,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2rb2" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2rb2" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (Rainbow set 2)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128249,9 +128357,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2red" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2red" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (Red Wave)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128368,9 +128476,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2v004" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2v004" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II! - Champion Edition (V004)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128487,9 +128595,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2accp2" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2accp2" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (Accelerator Pt.II)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128606,9 +128714,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m1" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m1" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M1)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128725,9 +128833,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m2" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m2" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M2)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128844,9 +128952,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m3" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m3" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M3)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -128963,9 +129071,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m4" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m4" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M4)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -129082,9 +129190,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m5" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m5" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M5)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -129201,9 +129309,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m6" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m6" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M6)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -129320,9 +129428,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2m7" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2m7" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (M7)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -129441,9 +129549,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2yyc" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2yyc" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (YYC)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -129561,9 +129669,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2koryu" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2koryu" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Champion Edition (Kouryu)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -129681,9 +129789,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="varth"> + <game name="varth" sourcefile="cps1.c"> <description>Varth - Operation Thunderstorm (World 920612)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -129793,9 +129901,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="varthu" cloneof="varth" romof="varth"> + <game name="varthu" sourcefile="cps1.c" cloneof="varth" romof="varth"> <description>Varth - Operation Thunderstorm (US 920612)</description> <year>1992</year> <manufacturer>Capcom (Romstar license)</manufacturer> @@ -129902,9 +130010,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="varthj" cloneof="varth" romof="varth"> + <game name="varthj" sourcefile="cps1.c" cloneof="varth" romof="varth"> <description>Varth - Operation Thunderstorm (Japan 920714)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130014,9 +130122,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cworld2j"> + <game name="cworld2j" sourcefile="cps1.c"> <description>Capcom World 2 (Japan 920611)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130133,9 +130241,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wof"> + <game name="wof" sourcefile="cps1.c"> <description>Warriors of Fate (World 921002)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130164,9 +130272,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wofa" cloneof="wof" romof="wof"> + <game name="wofa" sourcefile="cps1.c" cloneof="wof" romof="wof"> <description>Sangokushi II (Asia 921005)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130195,9 +130303,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wofu" cloneof="wof" romof="wof"> + <game name="wofu" sourcefile="cps1.c" cloneof="wof" romof="wof"> <description>Warriors of Fate (US 921031)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130226,9 +130334,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wofj" cloneof="wof" romof="wof"> + <game name="wofj" sourcefile="cps1.c" cloneof="wof" romof="wof"> <description>Tenchi wo Kurau II - Sekiheki no Tatakai (Japan 921031)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130257,9 +130365,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2t" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2t" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' - Hyper Fighting (US 921209)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130376,9 +130484,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sf2tj" cloneof="sf2ce" romof="sf2ce"> + <game name="sf2tj" sourcefile="cps1.c" cloneof="sf2ce" romof="sf2ce"> <description>Street Fighter II' Turbo - Hyper Fighting (Japan 921209)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -130495,9 +130603,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dino"> + <game name="dino" sourcefile="cps1.c"> <description>Cadillacs and Dinosaurs (World 930201)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130527,9 +130635,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dinou" cloneof="dino" romof="dino"> + <game name="dinou" sourcefile="cps1.c" cloneof="dino" romof="dino"> <description>Cadillacs and Dinosaurs (US 930201)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130559,9 +130667,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dinoj" cloneof="dino" romof="dino"> + <game name="dinoj" sourcefile="cps1.c" cloneof="dino" romof="dino"> <description>Cadillacs Kyouryuu-Shinseiki (Japan 930201)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130591,9 +130699,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="punisher"> + <game name="punisher" sourcefile="cps1.c"> <description>The Punisher (World 930422)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130629,9 +130737,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="punishru" cloneof="punisher" romof="punisher"> + <game name="punishru" sourcefile="cps1.c" cloneof="punisher" romof="punisher"> <description>The Punisher (US 930422)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130667,9 +130775,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="punishrj" cloneof="punisher" romof="punisher"> + <game name="punishrj" sourcefile="cps1.c" cloneof="punisher" romof="punisher"> <description>The Punisher (Japan 930422)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130699,9 +130807,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="slammast"> + <game name="slammast" sourcefile="cps1.c"> <description>Saturday Night Slam Masters (World 930713)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130743,9 +130851,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="slammasu" cloneof="slammast" romof="slammast"> + <game name="slammasu" sourcefile="cps1.c" cloneof="slammast" romof="slammast"> <description>Saturday Night Slam Masters (US 930713)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130787,9 +130895,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mbomberj" cloneof="slammast" romof="slammast"> + <game name="mbomberj" sourcefile="cps1.c" cloneof="slammast" romof="slammast"> <description>Muscle Bomber - The Body Explosion (Japan 930713)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130831,9 +130939,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mbombrd" cloneof="slammast" romof="slammast"> + <game name="mbombrd" sourcefile="cps1.c" cloneof="slammast" romof="slammast"> <description>Muscle Bomber Duo - Ultimate Team Battle (World 931206)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130878,9 +130986,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mbombrdj" cloneof="slammast" romof="slammast"> + <game name="mbombrdj" sourcefile="cps1.c" cloneof="slammast" romof="slammast"> <description>Muscle Bomber Duo - Heat Up Warriors (Japan 931206)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -130925,9 +131033,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pnickj"> + <game name="pnickj" sourcefile="cps1.c"> <description>Pnickies (Japan 940608)</description> <year>1994</year> <manufacturer>Compile (Capcom license)</manufacturer> @@ -131047,9 +131155,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qad"> + <game name="qad" sourcefile="cps1.c"> <description>Quiz & Dragons (US 920701)</description> <year>1992</year> <manufacturer>Capcom</manufacturer> @@ -131155,9 +131263,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qadj" cloneof="qad" romof="qad"> + <game name="qadj" sourcefile="cps1.c" cloneof="qad" romof="qad"> <description>Quiz & Dragons (Japan 940921)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -131257,9 +131365,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qtono2"> + <game name="qtono2" sourcefile="cps1.c"> <description>Quiz Tonosama no Yabou 2 Zenkoku-ban (Japan 950123)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -131372,9 +131480,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pang3"> + <game name="pang3" sourcefile="cps1.c"> <description>Pang! 3 (Euro 950511)</description> <year>1995</year> <manufacturer>Mitchell</manufacturer> @@ -131396,9 +131504,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pang3j" cloneof="pang3" romof="pang3"> + <game name="pang3j" sourcefile="cps1.c" cloneof="pang3" romof="pang3"> <description>Pang! 3 (Japan 950511)</description> <year>1995</year> <manufacturer>Mitchell</manufacturer> @@ -131420,9 +131528,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="megaman"> + <game name="megaman" sourcefile="cps1.c"> <description>Mega Man - The Power Battle (CPS1 Asia 951006)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -131543,9 +131651,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rockmanj" cloneof="megaman" romof="megaman"> + <game name="rockmanj" sourcefile="cps1.c" cloneof="megaman" romof="megaman"> <description>Rockman - The Power Battle (CPS1 Japan 950922)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -131666,9 +131774,9 @@ </dipswitch> <dipswitch name="Game Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2"> + <game name="ssf2" sourcefile="cps2.c"> <description>Super Street Fighter 2: The New Challengers (World 930911)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131705,9 +131813,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2u" cloneof="ssf2" romof="ssf2"> + <game name="ssf2u" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The New Challengers (US 930911)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131744,9 +131852,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2a" cloneof="ssf2" romof="ssf2"> + <game name="ssf2a" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The New Challengers (Asia 931005)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131783,9 +131891,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2ar1" cloneof="ssf2" romof="ssf2"> + <game name="ssf2ar1" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The New Challengers (Asia 930914)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131822,9 +131930,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2j" cloneof="ssf2" romof="ssf2"> + <game name="ssf2j" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The New Challengers (Japan 931005)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131861,9 +131969,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2jr1" cloneof="ssf2" romof="ssf2"> + <game name="ssf2jr1" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The New Challengers (Japan 930911)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131900,9 +132008,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2jr2" cloneof="ssf2" romof="ssf2"> + <game name="ssf2jr2" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The New Challengers (Japan 930910)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131939,9 +132047,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2tb" cloneof="ssf2" romof="ssf2"> + <game name="ssf2tb" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The Tournament Battle (World 931119)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -131978,9 +132086,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2tbj" cloneof="ssf2" romof="ssf2"> + <game name="ssf2tbj" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2: The Tournament Battle (Japan 930910)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132012,9 +132120,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ecofghtr"> + <game name="ecofghtr" sourcefile="cps2.c"> <description>Eco Fighters (World 931203)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132043,9 +132151,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ecofghta" cloneof="ecofghtr" romof="ecofghtr"> + <game name="ecofghta" sourcefile="cps2.c" cloneof="ecofghtr" romof="ecofghtr"> <description>Eco Fighters (Asia 931203)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132070,9 +132178,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="uecology" cloneof="ecofghtr" romof="ecofghtr"> + <game name="uecology" sourcefile="cps2.c" cloneof="ecofghtr" romof="ecofghtr"> <description>Ultimate Ecology (Japan 931203)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132097,9 +132205,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddtod"> + <game name="ddtod" sourcefile="cps2.c"> <description>Dungeons & Dragons: Tower of Doom (Euro 940412)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132128,9 +132236,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddtodu" cloneof="ddtod" romof="ddtod"> + <game name="ddtodu" sourcefile="cps2.c" cloneof="ddtod" romof="ddtod"> <description>Dungeons & Dragons: Tower of Doom (US 940125)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132159,9 +132267,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddtodur1" cloneof="ddtod" romof="ddtod"> + <game name="ddtodur1" sourcefile="cps2.c" cloneof="ddtod" romof="ddtod"> <description>Dungeons & Dragons: Tower of Doom (US 940113)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132190,9 +132298,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddtodj" cloneof="ddtod" romof="ddtod"> + <game name="ddtodj" sourcefile="cps2.c" cloneof="ddtod" romof="ddtod"> <description>Dungeons & Dragons: Tower of Doom (Japan 940113)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132221,9 +132329,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddtoda" cloneof="ddtod" romof="ddtod"> + <game name="ddtoda" sourcefile="cps2.c" cloneof="ddtod" romof="ddtod"> <description>Dungeons & Dragons: Tower of Doom (Asia 940113)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132249,9 +132357,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddtodh" cloneof="ddtod" romof="ddtod"> + <game name="ddtodh" sourcefile="cps2.c" cloneof="ddtod" romof="ddtod"> <description>Dungeons & Dragons: Tower of Doom (Hispanic 940125)</description> <year>1993</year> <manufacturer>Capcom</manufacturer> @@ -132280,9 +132388,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2t" cloneof="ssf2" romof="ssf2"> + <game name="ssf2t" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2 Turbo (World 940223)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132321,9 +132429,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2tu" cloneof="ssf2" romof="ssf2"> + <game name="ssf2tu" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2 Turbo (US 940323)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132356,9 +132464,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2tur1" cloneof="ssf2" romof="ssf2"> + <game name="ssf2tur1" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2 Turbo (US 940223)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132397,9 +132505,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2ta" cloneof="ssf2" romof="ssf2"> + <game name="ssf2ta" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2 Turbo (Asia 940223)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132438,9 +132546,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssf2xj" cloneof="ssf2" romof="ssf2"> + <game name="ssf2xj" sourcefile="cps2.c" cloneof="ssf2" romof="ssf2"> <description>Super Street Fighter 2 X: Grand Master Challenge (Japan 940223)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132479,9 +132587,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="avsp"> + <game name="avsp" sourcefile="cps2.c"> <description>Alien vs. Predator (Euro 940520)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132508,9 +132616,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="avspu" cloneof="avsp" romof="avsp"> + <game name="avspu" sourcefile="cps2.c" cloneof="avsp" romof="avsp"> <description>Alien vs. Predator (US 940520)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132537,9 +132645,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="avspj" cloneof="avsp" romof="avsp"> + <game name="avspj" sourcefile="cps2.c" cloneof="avsp" romof="avsp"> <description>Alien vs. Predator (Japan 940520)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132566,9 +132674,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="avspa" cloneof="avsp" romof="avsp"> + <game name="avspa" sourcefile="cps2.c" cloneof="avsp" romof="avsp"> <description>Alien vs. Predator (Asia 940520)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132593,9 +132701,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dstlk"> + <game name="dstlk" sourcefile="cps2.c"> <description>Darkstalkers: The Night Warriors (Euro 940705)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132627,9 +132735,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dstlku" cloneof="dstlk" romof="dstlk"> + <game name="dstlku" sourcefile="cps2.c" cloneof="dstlk" romof="dstlk"> <description>Darkstalkers: The Night Warriors (US 940818)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132661,9 +132769,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dstlkur1" cloneof="dstlk" romof="dstlk"> + <game name="dstlkur1" sourcefile="cps2.c" cloneof="dstlk" romof="dstlk"> <description>Darkstalkers: The Night Warriors (US 940705)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132695,9 +132803,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dstlka" cloneof="dstlk" romof="dstlk"> + <game name="dstlka" sourcefile="cps2.c" cloneof="dstlk" romof="dstlk"> <description>Darkstalkers: The Night Warriors (Asia 940705)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132729,9 +132837,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vampj" cloneof="dstlk" romof="dstlk"> + <game name="vampj" sourcefile="cps2.c" cloneof="dstlk" romof="dstlk"> <description>Vampire: The Night Warriors (Japan 940705)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132763,9 +132871,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vampja" cloneof="dstlk" romof="dstlk"> + <game name="vampja" sourcefile="cps2.c" cloneof="dstlk" romof="dstlk"> <description>Vampire: The Night Warriors (Japan 940705 alt)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132797,9 +132905,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vampjr1" cloneof="dstlk" romof="dstlk"> + <game name="vampjr1" sourcefile="cps2.c" cloneof="dstlk" romof="dstlk"> <description>Vampire: The Night Warriors (Japan 940630)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132831,9 +132939,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ringdest"> + <game name="ringdest" sourcefile="cps2.c"> <description>Ring of Destruction: Slammasters II (Euro 940902)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132868,9 +132976,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="5" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="smbomb" cloneof="ringdest" romof="ringdest"> + <game name="smbomb" sourcefile="cps2.c" cloneof="ringdest" romof="ringdest"> <description>Super Muscle Bomber: The International Blowout (Japan 940831)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132905,9 +133013,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="5" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="smbombr1" cloneof="ringdest" romof="ringdest"> + <game name="smbombr1" sourcefile="cps2.c" cloneof="ringdest" romof="ringdest"> <description>Super Muscle Bomber: The International Blowout (Japan 940808)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132942,9 +133050,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="5" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="armwar"> + <game name="armwar" sourcefile="cps2.c"> <description>Armored Warriors (Euro 941011)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -132976,9 +133084,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="armwaru" cloneof="armwar" romof="armwar"> + <game name="armwaru" sourcefile="cps2.c" cloneof="armwar" romof="armwar"> <description>Armored Warriors (US 941024)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133010,9 +133118,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pgear" cloneof="armwar" romof="armwar"> + <game name="pgear" sourcefile="cps2.c" cloneof="armwar" romof="armwar"> <description>Powered Gear: Strategic Variant Armor Equipment (Japan 941024)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133044,9 +133152,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pgearr1" cloneof="armwar" romof="armwar"> + <game name="pgearr1" sourcefile="cps2.c" cloneof="armwar" romof="armwar"> <description>Powered Gear: Strategic Variant Armor Equipment (Japan 940916)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133078,9 +133186,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="armwara" cloneof="armwar" romof="armwar"> + <game name="armwara" sourcefile="cps2.c" cloneof="armwar" romof="armwar"> <description>Armored Warriors (Asia 940920)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133110,9 +133218,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="3" control="joy8way" buttons="3" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcota"> + <game name="xmcota" sourcefile="cps2.c"> <description>X-Men: Children of the Atom (Euro 950105)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133144,9 +133252,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcotau" cloneof="xmcota" romof="xmcota"> + <game name="xmcotau" sourcefile="cps2.c" cloneof="xmcota" romof="xmcota"> <description>X-Men: Children of the Atom (US 950105)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133178,9 +133286,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcotah" cloneof="xmcota" romof="xmcota"> + <game name="xmcotah" sourcefile="cps2.c" cloneof="xmcota" romof="xmcota"> <description>X-Men: Children of the Atom (Hispanic 950331)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133210,9 +133318,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcotaj" cloneof="xmcota" romof="xmcota"> + <game name="xmcotaj" sourcefile="cps2.c" cloneof="xmcota" romof="xmcota"> <description>X-Men: Children of the Atom (Japan 941219)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133244,9 +133352,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcotaj1" cloneof="xmcota" romof="xmcota"> + <game name="xmcotaj1" sourcefile="cps2.c" cloneof="xmcota" romof="xmcota"> <description>X-Men: Children of the Atom (Japan 941217)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133278,9 +133386,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcotaa" cloneof="xmcota" romof="xmcota"> + <game name="xmcotaa" sourcefile="cps2.c" cloneof="xmcota" romof="xmcota"> <description>X-Men: Children of the Atom (Asia 941217)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133312,9 +133420,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmcotajr" cloneof="xmcota" romof="xmcota"> + <game name="xmcotajr" sourcefile="cps2.c" cloneof="xmcota" romof="xmcota"> <description>X-Men: Children of the Atom (Japan 941208 rent version)</description> <year>1994</year> <manufacturer>Capcom</manufacturer> @@ -133346,9 +133454,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nwarr"> + <game name="nwarr" sourcefile="cps2.c"> <description>Night Warriors: Darkstalkers' Revenge (US 950406)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133381,9 +133489,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nwarrh" cloneof="nwarr" romof="nwarr"> + <game name="nwarrh" sourcefile="cps2.c" cloneof="nwarr" romof="nwarr"> <description>Night Warriors: Darkstalkers' Revenge (Hispanic 950403)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133413,9 +133521,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nwarrb" cloneof="nwarr" romof="nwarr"> + <game name="nwarrb" sourcefile="cps2.c" cloneof="nwarr" romof="nwarr"> <description>Night Warriors: Darkstalkers' Revenge (Brazil 950403)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133445,9 +133553,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vhuntj" cloneof="nwarr" romof="nwarr"> + <game name="vhuntj" sourcefile="cps2.c" cloneof="nwarr" romof="nwarr"> <description>Vampire Hunter: Darkstalkers' Revenge (Japan 950316)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133480,9 +133588,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vhuntjr1" cloneof="nwarr" romof="nwarr"> + <game name="vhuntjr1" sourcefile="cps2.c" cloneof="nwarr" romof="nwarr"> <description>Vampire Hunter: Darkstalkers' Revenge (Japan 950302)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133515,9 +133623,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cybots"> + <game name="cybots" sourcefile="cps2.c"> <description>Cyberbots: Fullmetal Madness (US 950424)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133549,9 +133657,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cybotsj" cloneof="cybots" romof="cybots"> + <game name="cybotsj" sourcefile="cps2.c" cloneof="cybots" romof="cybots"> <description>Cyberbots: Fullmetal Madness (Japan 950420)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133583,9 +133691,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfa"> + <game name="sfa" sourcefile="cps2.c"> <description>Street Fighter Alpha: Warriors' Dreams (Euro 950727)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133608,9 +133716,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfar1" cloneof="sfa" romof="sfa"> + <game name="sfar1" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Alpha: Warriors' Dreams (Euro 950718)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133633,9 +133741,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfar2" cloneof="sfa" romof="sfa"> + <game name="sfar2" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Alpha: Warriors' Dreams (Euro 950605)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133658,9 +133766,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfau" cloneof="sfa" romof="sfa"> + <game name="sfau" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Alpha: Warriors' Dreams (US 950627)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133683,9 +133791,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfzj" cloneof="sfa" romof="sfa"> + <game name="sfzj" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Zero (Japan 950727)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133708,9 +133816,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfzjr1" cloneof="sfa" romof="sfa"> + <game name="sfzjr1" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Zero (Japan 950627)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133733,9 +133841,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfzjr2" cloneof="sfa" romof="sfa"> + <game name="sfzjr2" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Zero (Japan 950605)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133758,9 +133866,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfzh" cloneof="sfa" romof="sfa"> + <game name="sfzh" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Zero (Hispanic 950627)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133782,9 +133890,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfzb" cloneof="sfa" romof="sfa"> + <game name="sfzb" sourcefile="cps2.c" cloneof="sfa" romof="sfa"> <description>Street Fighter Zero (Brazil 951109)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133806,9 +133914,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="msh"> + <game name="msh" sourcefile="cps2.c"> <description>Marvel Super Heroes (Euro 951024)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133838,9 +133946,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshu" cloneof="msh" romof="msh"> + <game name="mshu" sourcefile="cps2.c" cloneof="msh" romof="msh"> <description>Marvel Super Heroes (US 951024)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133872,9 +133980,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshj" cloneof="msh" romof="msh"> + <game name="mshj" sourcefile="cps2.c" cloneof="msh" romof="msh"> <description>Marvel Super Heroes (Japan 951024)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133906,9 +134014,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="msha" cloneof="msh" romof="msh"> + <game name="msha" sourcefile="cps2.c" cloneof="msh" romof="msh"> <description>Marvel Super Heroes (Asia 951024)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133940,9 +134048,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshh" cloneof="msh" romof="msh"> + <game name="mshh" sourcefile="cps2.c" cloneof="msh" romof="msh"> <description>Marvel Super Heroes (Hispanic 951117)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -133974,9 +134082,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshb" cloneof="msh" romof="msh"> + <game name="mshb" sourcefile="cps2.c" cloneof="msh" romof="msh"> <description>Marvel Super Heroes (Brazil 951117)</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -134006,9 +134114,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="19xx"> + <game name="19xx" sourcefile="cps2.c"> <description>19XX: The War Against Destiny (US 951207)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134038,9 +134146,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="19xxj" cloneof="19xx" romof="19xx"> + <game name="19xxj" sourcefile="cps2.c" cloneof="19xx" romof="19xx"> <description>19XX: The War Against Destiny (Japan 951225)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134066,9 +134174,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="19xxjr1" cloneof="19xx" romof="19xx"> + <game name="19xxjr1" sourcefile="cps2.c" cloneof="19xx" romof="19xx"> <description>19XX: The War Against Destiny (Japan 951207)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134098,9 +134206,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="19xxa" cloneof="19xx" romof="19xx"> + <game name="19xxa" sourcefile="cps2.c" cloneof="19xx" romof="19xx"> <description>19XX: The War Against Destiny (Asia 951207)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134126,9 +134234,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="19xxh" cloneof="19xx" romof="19xx"> + <game name="19xxh" sourcefile="cps2.c" cloneof="19xx" romof="19xx"> <description>19XX: The War Against Destiny (Hispanic 951218)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134158,9 +134266,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsom"> + <game name="ddsom" sourcefile="cps2.c"> <description>Dungeons & Dragons: Shadow over Mystara (Euro 960619)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134192,9 +134300,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsomr1" cloneof="ddsom" romof="ddsom"> + <game name="ddsomr1" sourcefile="cps2.c" cloneof="ddsom" romof="ddsom"> <description>Dungeons & Dragons: Shadow over Mystara (Euro 960209)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134226,9 +134334,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsomu" cloneof="ddsom" romof="ddsom"> + <game name="ddsomu" sourcefile="cps2.c" cloneof="ddsom" romof="ddsom"> <description>Dungeons & Dragons: Shadow over Mystara (US 960619)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134260,9 +134368,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsomur1" cloneof="ddsom" romof="ddsom"> + <game name="ddsomur1" sourcefile="cps2.c" cloneof="ddsom" romof="ddsom"> <description>Dungeons & Dragons: Shadow over Mystara (US 960209)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134294,9 +134402,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsomjr1" cloneof="ddsom" romof="ddsom"> + <game name="ddsomjr1" sourcefile="cps2.c" cloneof="ddsom" romof="ddsom"> <description>Dungeons & Dragons: Shadow over Mystara (Japan 960206)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134328,9 +134436,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsomj" cloneof="ddsom" romof="ddsom"> + <game name="ddsomj" sourcefile="cps2.c" cloneof="ddsom" romof="ddsom"> <description>Dungeons & Dragons: Shadow over Mystara (Japan 960619)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134362,9 +134470,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddsoma" cloneof="ddsom" romof="ddsom"> + <game name="ddsoma" sourcefile="cps2.c" cloneof="ddsom" romof="ddsom"> <description>Dungeons & Dragons: Shadow over Mystara (Asia 960619)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134396,9 +134504,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfa2"> + <game name="sfa2" sourcefile="cps2.c"> <description>Street Fighter Alpha 2 (US 960306)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134428,9 +134536,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2j" cloneof="sfa2" romof="sfa2"> + <game name="sfz2j" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 (Japan 960227)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134460,9 +134568,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2a" cloneof="sfa2" romof="sfa2"> + <game name="sfz2a" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 (Asia 960227)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134492,9 +134600,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2b" cloneof="sfa2" romof="sfa2"> + <game name="sfz2b" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 (Brazil 960531)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134522,9 +134630,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2br1" cloneof="sfa2" romof="sfa2"> + <game name="sfz2br1" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 (Brazil 960304)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134552,9 +134660,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="spf2t"> + <game name="spf2t" sourcefile="cps2.c"> <description>Super Puzzle Fighter 2 Turbo (US 960620)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134575,9 +134683,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="spf2xj" cloneof="spf2t" romof="spf2t"> + <game name="spf2xj" sourcefile="cps2.c" cloneof="spf2t" romof="spf2t"> <description>Super Puzzle Fighter 2 X (Japan 960531)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134598,9 +134706,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="qndream"> + <game name="qndream" sourcefile="cps2.c"> <description>Quiz Nanairo Dreams: Nijiirochou no Kiseki (Japan 960826)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134622,9 +134730,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="megaman2"> + <game name="megaman2" sourcefile="cps2.c"> <description>Mega Man 2: The Power Fighters (US 960708)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134647,9 +134755,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="megamn2a" cloneof="megaman2" romof="megaman2"> + <game name="megamn2a" sourcefile="cps2.c" cloneof="megaman2" romof="megaman2"> <description>Mega Man 2: The Power Fighters (Asia 960708)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134670,9 +134778,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rckman2j" cloneof="megaman2" romof="megaman2"> + <game name="rckman2j" sourcefile="cps2.c" cloneof="megaman2" romof="megaman2"> <description>Rockman 2: The Power Fighters (Japan 960708)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134695,9 +134803,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2aj" cloneof="sfa2" romof="sfa2"> + <game name="sfz2aj" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 Alpha (Japan 960805)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134727,9 +134835,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2ah" cloneof="sfa2" romof="sfa2"> + <game name="sfz2ah" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 Alpha (Hispanic 960813)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134757,9 +134865,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2ab" cloneof="sfa2" romof="sfa2"> + <game name="sfz2ab" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 Alpha (Brazil 960813)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134787,9 +134895,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz2aa" cloneof="sfa2" romof="sfa2"> + <game name="sfz2aa" sourcefile="cps2.c" cloneof="sfa2" romof="sfa2"> <description>Street Fighter Zero 2 Alpha (Asia 960826)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134819,9 +134927,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsf"> + <game name="xmvsf" sourcefile="cps2.c"> <description>X-Men Vs. Street Fighter (Euro 960910)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134852,9 +134960,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfu" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfu" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (US 961023)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134883,9 +134991,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfur1" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfur1" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (US 961004)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134916,9 +135024,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfj" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfj" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (Japan 961004)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134947,9 +135055,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfjr1" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfjr1" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (Japan 960910)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -134978,9 +135086,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfjr2" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfjr2" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (Japan 960909)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -135009,9 +135117,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfa" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfa" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (Asia 961023)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -135040,9 +135148,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfh" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfh" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (Hispanic 961004)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -135071,9 +135179,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="xmvsfb" cloneof="xmvsf" romof="xmvsf"> + <game name="xmvsfb" sourcefile="cps2.c" cloneof="xmvsf" romof="xmvsf"> <description>X-Men Vs. Street Fighter (Brazil 961023)</description> <year>1996</year> <manufacturer>Capcom</manufacturer> @@ -135102,9 +135210,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="batcir"> + <game name="batcir" sourcefile="cps2.c"> <description>Battle Circuit (Euro 970319)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135133,9 +135241,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="batcirj" cloneof="batcir" romof="batcir"> + <game name="batcirj" sourcefile="cps2.c" cloneof="batcir" romof="batcir"> <description>Battle Circuit (Japan 970319)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135164,9 +135272,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="batcira" cloneof="batcir" romof="batcir"> + <game name="batcira" sourcefile="cps2.c" cloneof="batcir" romof="batcir"> <description>Battle Circuit (Asia 970319)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135191,9 +135299,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vsav"> + <game name="vsav" sourcefile="cps2.c"> <description>Vampire Savior: The Lord of Vampire (Euro 970519)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135225,9 +135333,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vsavu" cloneof="vsav" romof="vsav"> + <game name="vsavu" sourcefile="cps2.c" cloneof="vsav" romof="vsav"> <description>Vampire Savior: The Lord of Vampire (US 970519)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135259,9 +135367,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vsavj" cloneof="vsav" romof="vsav"> + <game name="vsavj" sourcefile="cps2.c" cloneof="vsav" romof="vsav"> <description>Vampire Savior: The Lord of Vampire (Japan 970519)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135293,9 +135401,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vsava" cloneof="vsav" romof="vsav"> + <game name="vsava" sourcefile="cps2.c" cloneof="vsav" romof="vsav"> <description>Vampire Savior: The Lord of Vampire (Asia 970519)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135327,9 +135435,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vsavh" cloneof="vsav" romof="vsav"> + <game name="vsavh" sourcefile="cps2.c" cloneof="vsav" romof="vsav"> <description>Vampire Savior: The Lord of Vampire (Hispanic 970519)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135359,9 +135467,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsf"> + <game name="mshvsf" sourcefile="cps2.c"> <description>Marvel Super Heroes Vs. Street Fighter (US 970827)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135393,9 +135501,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfu1" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfu1" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (US 970625)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135427,9 +135535,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfj" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfj" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Japan 970707)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135461,9 +135569,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfj1" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfj1" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Japan 970702)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135495,9 +135603,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfj2" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfj2" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Japan 970625)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135527,9 +135635,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfh" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfh" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Hispanic 970625)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135559,9 +135667,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfa" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfa" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Asia 970625)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135591,9 +135699,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfa1" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfa1" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Asia 970620)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135623,9 +135731,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfb" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfb" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Brazil 970827)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135655,9 +135763,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mshvsfb1" cloneof="mshvsf" romof="mshvsf"> + <game name="mshvsfb1" sourcefile="cps2.c" cloneof="mshvsf" romof="mshvsf"> <description>Marvel Super Heroes Vs. Street Fighter (Brazil 970625)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135687,9 +135795,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="csclub"> + <game name="csclub" sourcefile="cps2.c"> <description>Capcom Sports Club (Euro 970722)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135715,9 +135823,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="csclubj" cloneof="csclub" romof="csclub"> + <game name="csclubj" sourcefile="cps2.c" cloneof="csclub" romof="csclub"> <description>Capcom Sports Club (Japan 970722)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135743,9 +135851,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cscluba" cloneof="csclub" romof="csclub"> + <game name="cscluba" sourcefile="cps2.c" cloneof="csclub" romof="csclub"> <description>Capcom Sports Club (Asia 970722)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135771,9 +135879,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="csclubh" cloneof="csclub" romof="csclub"> + <game name="csclubh" sourcefile="cps2.c" cloneof="csclub" romof="csclub"> <description>Capcom Sports Club (Hispanic 970722)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135795,9 +135903,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sgemf"> + <game name="sgemf" sourcefile="cps2.c"> <description>Super Gem Fighter Mini Mix (US 970904)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135825,9 +135933,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pfghtj" cloneof="sgemf" romof="sgemf"> + <game name="pfghtj" sourcefile="cps2.c" cloneof="sgemf" romof="sgemf"> <description>Pocket Fighter (Japan 970904)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135855,9 +135963,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sgemfa" cloneof="sgemf" romof="sgemf"> + <game name="sgemfa" sourcefile="cps2.c" cloneof="sgemf" romof="sgemf"> <description>Super Gem Fighter: Mini Mix (Asia 970904)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135885,9 +135993,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sgemfh" cloneof="sgemf" romof="sgemf"> + <game name="sgemfh" sourcefile="cps2.c" cloneof="sgemf" romof="sgemf"> <description>Super Gem Fighter: Mini Mix (Hispanic 970904)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135914,9 +136022,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vhunt2r1" cloneof="vhunt2" romof="vhunt2"> + <game name="vhunt2r1" sourcefile="cps2.c" cloneof="vhunt2" romof="vhunt2"> <description>Vampire Hunter 2: Darkstalkers Revenge (Japan 970913)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135948,9 +136056,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vhunt2"> + <game name="vhunt2" sourcefile="cps2.c"> <description>Vampire Hunter 2: Darkstalkers Revenge (Japan 970929)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -135980,9 +136088,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="vsav2"> + <game name="vsav2" sourcefile="cps2.c"> <description>Vampire Savior 2: The Lord of Vampire (Japan 970913)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -136014,9 +136122,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mvsc"> + <game name="mvsc" sourcefile="cps2.c"> <description>Marvel Vs. Capcom: Clash of Super Heroes (US 980123)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136048,9 +136156,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mvscj" cloneof="mvsc" romof="mvsc"> + <game name="mvscj" sourcefile="cps2.c" cloneof="mvsc" romof="mvsc"> <description>Marvel Vs. Capcom: Clash of Super Heroes (Japan 980123)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136082,9 +136190,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mvscjr1" cloneof="mvsc" romof="mvsc"> + <game name="mvscjr1" sourcefile="cps2.c" cloneof="mvsc" romof="mvsc"> <description>Marvel Vs. Capcom: Clash of Super Heroes (Japan 980112)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136116,9 +136224,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mvsca" cloneof="mvsc" romof="mvsc"> + <game name="mvsca" sourcefile="cps2.c" cloneof="mvsc" romof="mvsc"> <description>Marvel Vs. Capcom: Clash of Super Heroes (Asia 980112)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136150,9 +136258,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mvsch" cloneof="mvsc" romof="mvsc"> + <game name="mvsch" sourcefile="cps2.c" cloneof="mvsc" romof="mvsc"> <description>Marvel Vs. Capcom: Clash of Super Heroes (Hispanic 980123)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136182,9 +136290,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfa3"> + <game name="sfa3" sourcefile="cps2.c"> <description>Street Fighter Alpha 3 (US 980904)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136216,9 +136324,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfa3r1" cloneof="sfa3" romof="sfa3"> + <game name="sfa3r1" sourcefile="cps2.c" cloneof="sfa3" romof="sfa3"> <description>Street Fighter Alpha 3 (US 980629)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136250,9 +136358,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz3j" cloneof="sfa3" romof="sfa3"> + <game name="sfz3j" sourcefile="cps2.c" cloneof="sfa3" romof="sfa3"> <description>Street Fighter Zero 3 (Japan 980727)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136284,9 +136392,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz3jr1" cloneof="sfa3" romof="sfa3"> + <game name="sfz3jr1" sourcefile="cps2.c" cloneof="sfa3" romof="sfa3"> <description>Street Fighter Zero 3 (Japan 980629)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136318,9 +136426,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sfz3a" cloneof="sfa3" romof="sfa3"> + <game name="sfz3a" sourcefile="cps2.c" cloneof="sfa3" romof="sfa3"> <description>Street Fighter Zero 3 (Asia 980701)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -136352,9 +136460,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gigawing"> + <game name="gigawing" sourcefile="cps2.c"> <description>Giga Wing (US 990222)</description> <year>1999</year> <manufacturer>Capcom, supported by Takumi</manufacturer> @@ -136376,9 +136484,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gwingj" cloneof="gigawing" romof="gigawing"> + <game name="gwingj" sourcefile="cps2.c" cloneof="gigawing" romof="gigawing"> <description>Giga Wing (Japan 990223)</description> <year>1999</year> <manufacturer>Capcom, supported by Takumi</manufacturer> @@ -136400,9 +136508,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dimahoo"> + <game name="dimahoo" sourcefile="cps2.c"> <description>Dimahoo (US 000121)</description> <year>2000</year> <manufacturer>Eighting/Raizing, distributed by Capcom</manufacturer> @@ -136425,9 +136533,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gmahou" cloneof="dimahoo" romof="dimahoo"> + <game name="gmahou" sourcefile="cps2.c" cloneof="dimahoo" romof="dimahoo"> <description>Great Mahou Daisakusen (Japan 000121)</description> <year>2000</year> <manufacturer>Eighting/Raizing, distributed by Capcom</manufacturer> @@ -136450,9 +136558,9 @@ <video screen="raster" orientation="vertical" width="224" height="384" aspectx="3" aspecty="4" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mmatrix"> + <game name="mmatrix" sourcefile="cps2.c"> <description>Mars Matrix: Hyper Solid Shooting (US 000412)</description> <year>2000</year> <manufacturer>Capcom, supported by Takumi</manufacturer> @@ -136479,9 +136587,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mmatrixj" cloneof="mmatrix" romof="mmatrix"> + <game name="mmatrixj" sourcefile="cps2.c" cloneof="mmatrix" romof="mmatrix"> <description>Mars Matrix: Hyper Solid Shooting (Japan 000412)</description> <year>2000</year> <manufacturer>Capcom, supported by Takumi</manufacturer> @@ -136508,9 +136616,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="1944"> + <game name="1944" sourcefile="cps2.c"> <description>1944: The Loop Master (US 000620)</description> <year>2000</year> <manufacturer>Capcom, supported by Eighting/Raizing</manufacturer> @@ -136535,9 +136643,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="1944j" cloneof="1944" romof="1944"> + <game name="1944j" sourcefile="cps2.c" cloneof="1944" romof="1944"> <description>1944: The Loop Master (Japan 000620)</description> <year>2000</year> <manufacturer>Capcom, supported by Eighting/Raizing</manufacturer> @@ -136561,9 +136669,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mpangj"> + <game name="mpangj" sourcefile="cps2.c"> <description>Mighty! Pang (Japan 001011)</description> <year>2000</year> <manufacturer>Mitchell, distributed by Capcom</manufacturer> @@ -136588,9 +136696,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="59.633331"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ts2" romof="cpzn1"> + <game name="ts2" sourcefile="zn.c" romof="cpzn1"> <description>Battle Arena Toshinden 2 (USA 951124)</description> <year>1995</year> <manufacturer>Capcom/Takara</manufacturer> @@ -136620,9 +136728,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="ts2j" cloneof="ts2" romof="ts2"> + <game name="ts2j" sourcefile="zn.c" cloneof="ts2" romof="ts2"> <description>Battle Arena Toshinden 2 (JAPAN 951124)</description> <year>1995</year> <manufacturer>Capcom/Takara</manufacturer> @@ -136652,9 +136760,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="starglad" romof="cpzn1"> + <game name="starglad" sourcefile="zn.c" romof="cpzn1"> <description>Star Gladiator (USA 960627)</description> <year>1996</year> <manufacturer>Capcom/</manufacturer> @@ -136687,9 +136795,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfex" romof="cpzn1"> + <game name="sfex" sourcefile="zn.c" romof="cpzn1"> <description>Street Fighter EX (ASIA 961219)</description> <year>1996</year> <manufacturer>Capcom/Arika</manufacturer> @@ -136722,9 +136830,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfexj" cloneof="sfex" romof="sfex"> + <game name="sfexj" sourcefile="zn.c" cloneof="sfex" romof="sfex"> <description>Street Fighter EX (JAPAN 961130)</description> <year>1996</year> <manufacturer>Capcom/Arika</manufacturer> @@ -136757,9 +136865,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="glpracr" romof="cpzn1"> + <game name="glpracr" sourcefile="zn.c" romof="cpzn1"> <description>Gallop Racer (JAPAN Ver 9.01.12)</description> <year>1996</year> <manufacturer>Tecmo</manufacturer> @@ -136784,9 +136892,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="sfexp" romof="cpzn1"> + <game name="sfexp" sourcefile="zn.c" romof="cpzn1"> <description>Street Fighter EX Plus (USA 970311)</description> <year>1997</year> <manufacturer>Capcom/Arika</manufacturer> @@ -136819,9 +136927,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfexpj" cloneof="sfexp" romof="sfexp"> + <game name="sfexpj" sourcefile="zn.c" cloneof="sfexp" romof="sfexp"> <description>Street Fighter EX Plus (JAPAN 970311)</description> <year>1997</year> <manufacturer>Capcom/Arika</manufacturer> @@ -136854,9 +136962,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="rvschool" romof="cpzn1"> + <game name="rvschool" sourcefile="zn.c" romof="cpzn1"> <description>Rival Schools (ASIA 971117)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -136892,9 +137000,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="jgakuen" cloneof="rvschool" romof="rvschool"> + <game name="jgakuen" sourcefile="zn.c" cloneof="rvschool" romof="rvschool"> <description>Justice Gakuen (JAPAN 971117)</description> <year>1997</year> <manufacturer>Capcom</manufacturer> @@ -136930,9 +137038,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="tgmj" romof="cpzn1"> + <game name="tgmj" sourcefile="zn.c" romof="cpzn1"> <description>Tetris The Grand Master (JAPAN 980710)</description> <year>1998</year> <manufacturer>Capcom/Akira</manufacturer> @@ -136960,9 +137068,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfex2" romof="cpzn2"> + <game name="sfex2" sourcefile="zn.c" romof="cpzn2"> <description>Street Fighter EX 2 (JAPAN 980312)</description> <year>1998</year> <manufacturer>Capcom/Arika</manufacturer> @@ -136993,9 +137101,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sg2j" romof="cpzn2"> + <game name="sg2j" sourcefile="zn.c" romof="cpzn2"> <description>Star Gladiator 2 (JAPAN 980316)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -137027,9 +137135,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="techromn" romof="cpzn2"> + <game name="techromn" sourcefile="zn.c" romof="cpzn2"> <description>Tech Romancer (USA 980914)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -137062,9 +137170,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="kikaioh" cloneof="techromn" romof="techromn"> + <game name="kikaioh" sourcefile="zn.c" cloneof="techromn" romof="techromn"> <description>Kikaioh (JAPAN 980914)</description> <year>1998</year> <manufacturer>Capcom</manufacturer> @@ -137097,9 +137205,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfex2p" cloneof="sfex2" romof="sfex2"> + <game name="sfex2p" sourcefile="zn.c" cloneof="sfex2" romof="sfex2"> <description>Street Fighter EX 2 Plus (JAPAN 990611)</description> <year>1999</year> <manufacturer>Capcom/Arika</manufacturer> @@ -137132,9 +137240,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="strider2" romof="cpzn2"> + <game name="strider2" sourcefile="zn.c" romof="cpzn2"> <description>Strider 2 (USA 991213)</description> <year>1999</year> <manufacturer>Capcom</manufacturer> @@ -137166,9 +137274,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="stridr2a" cloneof="strider2" romof="strider2"> + <game name="stridr2a" sourcefile="zn.c" cloneof="strider2" romof="strider2"> <description>Strider 2 (ASIA 991213)</description> <year>1999</year> <manufacturer>Capcom</manufacturer> @@ -137200,9 +137308,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="shiryu2" cloneof="strider2" romof="strider2"> + <game name="shiryu2" sourcefile="zn.c" cloneof="strider2" romof="strider2"> <description>Strider Hiryu 2 (JAPAN 991213)</description> <year>1999</year> <manufacturer>Capcom</manufacturer> @@ -137234,9 +137342,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="glpracr2" romof="tps"> + <game name="glpracr2" sourcefile="zn.c" romof="tps"> <description>Gallop Racer 2 (USA)</description> <year>1997</year> <manufacturer>Tecmo</manufacturer> @@ -137267,9 +137375,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="glprac2j" cloneof="glpracr2" romof="glpracr2"> + <game name="glprac2j" sourcefile="zn.c" cloneof="glpracr2" romof="glpracr2"> <description>Gallop Racer 2 (JAPAN)</description> <year>1997</year> <manufacturer>Tecmo</manufacturer> @@ -137300,9 +137408,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="glprac2l" cloneof="glpracr2" romof="glpracr2"> + <game name="glprac2l" sourcefile="zn.c" cloneof="glpracr2" romof="glpracr2"> <description>Gallop Racer 2 Link HW (JAPAN)</description> <year>1997</year> <manufacturer>Tecmo</manufacturer> @@ -137335,9 +137443,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="doapp" romof="tps"> + <game name="doapp" sourcefile="zn.c" romof="tps"> <description>Dead Or Alive ++ (JAPAN)</description> <year>1998</year> <manufacturer>Tecmo</manufacturer> @@ -137366,9 +137474,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="tondemo" romof="tps"> + <game name="tondemo" sourcefile="zn.c" romof="tps"> <description>Tondemo Crisis (JAPAN)</description> <year>1999</year> <manufacturer>Tecmo</manufacturer> @@ -137396,9 +137504,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="brvblade" romof="psarc95"> + <game name="brvblade" sourcefile="zn.c" romof="psarc95"> <description>Brave Blade (JAPAN)</description> <year>2000</year> <manufacturer>Eighting/Raizing</manufacturer> @@ -137425,9 +137533,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="beastrzr" romof="psarc95"> + <game name="beastrzr" sourcefile="zn.c" romof="psarc95"> <description>Beastorizer</description> <year>1997</year> <manufacturer>Eighting/Raizing</manufacturer> @@ -137457,9 +137565,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="primrag2"> + <game name="primrag2" sourcefile="zn.c"> <description>Primal Rage 2</description> <year>1996</year> <manufacturer>Atari</manufacturer> @@ -137484,9 +137592,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="nbajamex" romof="acpsx"> + <game name="nbajamex" sourcefile="zn.c" romof="acpsx"> <description>NBA Jam Extreme</description> <year>1996</year> <manufacturer>Acclaim</manufacturer> @@ -137526,9 +137634,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="jdredd" romof="acpsx"> + <game name="jdredd" sourcefile="zn.c" romof="acpsx"> <description>Judge Dredd (Rev C)</description> <year>1996</year> <manufacturer>Acclaim</manufacturer> @@ -137552,9 +137660,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="jdreddb" cloneof="jdredd" romof="jdredd"> + <game name="jdreddb" sourcefile="zn.c" cloneof="jdredd" romof="jdredd"> <description>Judge Dredd (Rev B)</description> <year>1996</year> <manufacturer>Acclaim</manufacturer> @@ -137578,9 +137686,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="sncwgltd"> + <game name="sncwgltd" sourcefile="zn.c"> <description>Sonic Wings Limited (JAPAN)</description> <year>1996</year> <manufacturer>Video System</manufacturer> @@ -137612,9 +137720,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="psyforce" romof="taitofx1"> + <game name="psyforce" sourcefile="zn.c" romof="taitofx1"> <description>Psychic Force (JAPAN)</description> <year>1995</year> <manufacturer>Taito</manufacturer> @@ -137644,9 +137752,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfchamp" romof="taitofx1"> + <game name="sfchamp" sourcefile="zn.c" romof="taitofx1"> <description>Super Football Champ (JAPAN)</description> <year>1995</year> <manufacturer>Taito</manufacturer> @@ -137677,9 +137785,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="mgcldate" romof="taitofx1"> + <game name="mgcldate" sourcefile="zn.c" romof="taitofx1"> <description>Magical Date (JAPAN) set 1</description> <year>1996</year> <manufacturer>Taito</manufacturer> @@ -137709,9 +137817,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="mgcldtea" cloneof="mgcldate" romof="mgcldate"> + <game name="mgcldtea" sourcefile="zn.c" cloneof="mgcldate" romof="mgcldate"> <description>Magical Date (JAPAN) set 2</description> <year>1996</year> <manufacturer>Taito</manufacturer> @@ -137741,9 +137849,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="raystorm" romof="taitofx1"> + <game name="raystorm" sourcefile="zn.c" romof="taitofx1"> <description>Ray Storm (JAPAN)</description> <year>1996</year> <manufacturer>Taito</manufacturer> @@ -137770,9 +137878,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="ftimpcta" romof="taitofx1"> + <game name="ftimpcta" sourcefile="zn.c" romof="taitofx1"> <description>Fighter's Impact Ace (JAPAN)</description> <year>1996</year> <manufacturer>Taito</manufacturer> @@ -137801,9 +137909,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="gdarius" romof="taitofx1"> + <game name="gdarius" sourcefile="zn.c" romof="taitofx1"> <description>G-Darius (JAPAN)</description> <year>1997</year> <manufacturer>Taito</manufacturer> @@ -137831,9 +137939,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="gdarius2" cloneof="gdarius" romof="gdarius"> + <game name="gdarius2" sourcefile="zn.c" cloneof="gdarius" romof="gdarius"> <description>G-Darius Ver.2 (JAPAN)</description> <year>1997</year> <manufacturer>Taito</manufacturer> @@ -137861,9 +137969,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="beastrzb" romof="taitofx1"> + <game name="beastrzb" sourcefile="zn.c" romof="taitofx1"> <description>Beastorizer (bootleg)</description> <year>1997</year> <manufacturer>Eighting/Raizing</manufacturer> @@ -137892,9 +138000,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="tekken"> + <game name="tekken" sourcefile="namcos11.c"> <description>Tekken (TE4/VER.C)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -137922,9 +138030,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="tekkena" cloneof="tekken" romof="tekken"> + <game name="tekkena" sourcefile="namcos11.c" cloneof="tekken" romof="tekken"> <description>Tekken (TE2/VER.B)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -137952,9 +138060,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="tekkenb" cloneof="tekken" romof="tekken"> + <game name="tekkenb" sourcefile="namcos11.c" cloneof="tekken" romof="tekken"> <description>Tekken (TE1/VER.B)</description> <year>1994</year> <manufacturer>Namco</manufacturer> @@ -137982,9 +138090,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="tekken2"> + <game name="tekken2" sourcefile="namcos11.c"> <description>Tekken 2 Ver.B (TES3/VER.B)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138014,9 +138122,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="tekken2a" cloneof="tekken2" romof="tekken2"> + <game name="tekken2a" sourcefile="namcos11.c" cloneof="tekken2" romof="tekken2"> <description>Tekken 2 Ver.B (TES2/VER.B)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138046,9 +138154,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="tekken2b" cloneof="tekken2" romof="tekken2"> + <game name="tekken2b" sourcefile="namcos11.c" cloneof="tekken2" romof="tekken2"> <description>Tekken 2 (TES2/VER.A)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138078,9 +138186,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="souledge"> + <game name="souledge" sourcefile="namcos11.c"> <description>Soul Edge Ver. II (SO4/VER.C)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -138110,9 +138218,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="souledga" cloneof="souledge" romof="souledge"> + <game name="souledga" sourcefile="namcos11.c" cloneof="souledge" romof="souledge"> <description>Soul Edge (SO3/VER.A)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138142,9 +138250,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="souledgb" cloneof="souledge" romof="souledge"> + <game name="souledgb" sourcefile="namcos11.c" cloneof="souledge" romof="souledge"> <description>Soul Edge (SO1/VER.A)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138174,9 +138282,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="dunkmnia"> + <game name="dunkmnia" sourcefile="namcos11.c"> <description>Dunk Mania (DM1/VER.C)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138202,9 +138310,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="xevi3dg"> + <game name="xevi3dg" sourcefile="namcos11.c"> <description>Xevious 3D/G (XV31/VER.A)</description> <year>1995</year> <manufacturer>Namco</manufacturer> @@ -138232,9 +138340,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="primglex"> + <game name="primglex" sourcefile="namcos11.c"> <description>Prime Goal EX (PG1/VER.A)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -138258,9 +138366,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="danceyes"> + <game name="danceyes" sourcefile="namcos11.c"> <description>Dancing Eyes (DC1/VER.A)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -138290,9 +138398,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="starswep"> + <game name="starswep" sourcefile="namcos11.c"> <description>Star Sweep (STP1/VER.A)</description> <year>1997</year> <manufacturer>Axela/Namco</manufacturer> @@ -138312,9 +138420,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="myangel3"> + <game name="myangel3" sourcefile="namcos11.c"> <description>Kosodate Quiz My Angel 3 (KQT1/VER.A)</description> <year>1998</year> <manufacturer>Namco</manufacturer> @@ -138338,9 +138446,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="tekken3"> + <game name="tekken3" sourcefile="namcos12.c"> <description>Tekken 3 (TET1/VER.E)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -138369,9 +138477,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="soulclbr"> + <game name="soulclbr" sourcefile="namcos12.c"> <description>Soul Calibur (SOC1/VER.A)</description> <year>1998</year> <manufacturer>Namco</manufacturer> @@ -138396,9 +138504,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="ehrgeiz"> + <game name="ehrgeiz" sourcefile="namcos12.c"> <description>Ehrgeiz (EG3/VER.A)</description> <year>1998</year> <manufacturer>Square/Namco</manufacturer> @@ -138426,9 +138534,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="mdhorse"> + <game name="mdhorse" sourcefile="namcos12.c"> <description>Derby Quiz My Dream Horse (MDH1/VER.A)</description> <year>1998</year> <manufacturer>Namco</manufacturer> @@ -138454,9 +138562,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="fgtlayer"> + <game name="fgtlayer" sourcefile="namcos12.c"> <description>Fighting Layer (FTL1/VER.A)</description> <year>1998</year> <manufacturer>Arika/Namco</manufacturer> @@ -138484,9 +138592,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="pacapp"> + <game name="pacapp" sourcefile="namcos12.c"> <description>Paca Paca Passion (PPP1/VERA)</description> <year>1999</year> <manufacturer>Produce/Namco</manufacturer> @@ -138513,9 +138621,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="sws99"> + <game name="sws99" sourcefile="namcos12.c"> <description>Super World Stadium '99 (SS91/VER.A)</description> <year>1999</year> <manufacturer>Namco</manufacturer> @@ -138542,9 +138650,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="tekkentt"> + <game name="tekkentt" sourcefile="namcos12.c"> <description>Tekken Tag Tournament (TEG3/VER.B)</description> <year>1999</year> <manufacturer>Namco</manufacturer> @@ -138575,9 +138683,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="mrdrillr"> + <game name="mrdrillr" sourcefile="namcos12.c"> <description>Mr Driller (DRI1/VER.A)</description> <year>1999</year> <manufacturer>Namco</manufacturer> @@ -138599,9 +138707,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="aquarush"> + <game name="aquarush" sourcefile="namcos12.c"> <description>Aqua Rush (AQ1/VER.A)</description> <year>1999</year> <manufacturer>Namco</manufacturer> @@ -138623,9 +138731,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="65536"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="65536"/> </game> - <game name="golgo13"> + <game name="golgo13" sourcefile="namcos12.c"> <description>Golgo 13 (GLG1/VER.A)</description> <year>1999</year> <manufacturer>Raizing/Namco</manufacturer> @@ -138658,9 +138766,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="mrdrilr2"> + <game name="mrdrilr2" sourcefile="namcos10.c"> <description>Mr Driller 2</description> <year>2000</year> <manufacturer>Namco</manufacturer> @@ -138669,9 +138777,9 @@ <video screen="raster" orientation="horizontal" width="640" height="480" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="2" control="joy8way" buttons="6" coins="2"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="65536"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="65536"/> </game> - <game name="cryptklr"> + <game name="cryptklr" sourcefile="konamigq.c"> <description>Crypt Killer (ver. UAA)</description> <year>1995</year> <manufacturer>Konami</manufacturer> @@ -138710,9 +138818,9 @@ <dipvalue name="Common" default="yes"/> <dipvalue name="Independent"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="65536"/> </game> - <game name="mgakuen"> + <game name="mgakuen" sourcefile="mitchell.c"> <description>Mahjong Gakuen</description> <year>1988</year> <manufacturer>Yuga</manufacturer> @@ -138787,9 +138895,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="7toitsu" cloneof="mgakuen" romof="mgakuen"> + <game name="7toitsu" sourcefile="mitchell.c" cloneof="mgakuen" romof="mgakuen"> <description>Chi-Toitsu</description> <year>1988</year> <manufacturer>Yuga</manufacturer> @@ -138864,9 +138972,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mgakuen2"> + <game name="mgakuen2" sourcefile="mitchell.c"> <description>Mahjong Gakuen 2 Gakuen-chou no Fukushuu</description> <year>1989</year> <manufacturer>Face</manufacturer> @@ -138886,9 +138994,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pkladies"> + <game name="pkladies" sourcefile="mitchell.c"> <description>Poker Ladies</description> <year>1989</year> <manufacturer>Mitchell</manufacturer> @@ -138908,9 +139016,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pkladiel" cloneof="pkladies" romof="pkladies"> + <game name="pkladiel" sourcefile="mitchell.c" cloneof="pkladies" romof="pkladies"> <description>Poker Ladies (Leprechaun)</description> <year>1989</year> <manufacturer>Leprechaun</manufacturer> @@ -138930,9 +139038,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="dokaben"> + <game name="dokaben" sourcefile="mitchell.c"> <description>Dokaben (Japan)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -138952,9 +139060,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pang"> + <game name="pang" sourcefile="mitchell.c"> <description>Pang (World)</description> <year>1989</year> <manufacturer>Mitchell</manufacturer> @@ -138973,9 +139081,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pangb" cloneof="pang" romof="pang"> + <game name="pangb" sourcefile="mitchell.c" cloneof="pang" romof="pang"> <description>Pang (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -138995,9 +139103,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bbros" cloneof="pang" romof="pang"> + <game name="bbros" sourcefile="mitchell.c" cloneof="pang" romof="pang"> <description>Buster Bros. (US)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -139016,9 +139124,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pompingw" cloneof="pang" romof="pang"> + <game name="pompingw" sourcefile="mitchell.c" cloneof="pang" romof="pang"> <description>Pomping World (Japan)</description> <year>1989</year> <manufacturer>Mitchell</manufacturer> @@ -139037,9 +139145,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cbasebal"> + <game name="cbasebal" sourcefile="cbasebal.c"> <description>Capcom Baseball (Japan)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -139065,9 +139173,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cworld"> + <game name="cworld" sourcefile="mitchell.c"> <description>Capcom World (Japan)</description> <year>1989</year> <manufacturer>Capcom</manufacturer> @@ -139091,9 +139199,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hatena"> + <game name="hatena" sourcefile="mitchell.c"> <description>Adventure Quiz 2 Hatena Hatena no Dai-Bouken (Japan)</description> <year>1990</year> <manufacturer>Capcom</manufacturer> @@ -139117,9 +139225,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="spang"> + <game name="spang" sourcefile="mitchell.c"> <description>Super Pang (World)</description> <year>1990</year> <manufacturer>Mitchell</manufacturer> @@ -139139,9 +139247,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sbbros" cloneof="spang" romof="spang"> + <game name="sbbros" sourcefile="mitchell.c" cloneof="spang" romof="spang"> <description>Super Buster Bros. (US)</description> <year>1990</year> <manufacturer>Mitchell + Capcom</manufacturer> @@ -139161,9 +139269,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="marukin"> + <game name="marukin" sourcefile="mitchell.c"> <description>Super Marukin-Ban</description> <year>1990</year> <manufacturer>Yuga</manufacturer> @@ -139182,9 +139290,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="qtono1"> + <game name="qtono1" sourcefile="mitchell.c"> <description>Quiz Tonosama no Yabou (Japan)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -139208,9 +139316,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="qsangoku"> + <game name="qsangoku" sourcefile="mitchell.c"> <description>Quiz Sangokushi (Japan)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -139234,9 +139342,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="57.419998"/> <sound channels="1"/> <input players="2" buttons="4" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="block"> + <game name="block" sourcefile="mitchell.c"> <description>Block Block (World 911106 Joystick)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -139256,9 +139364,9 @@ <video screen="raster" orientation="vertical" width="240" height="384" aspectx="3" aspecty="4" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blocka" cloneof="block" romof="block"> + <game name="blocka" sourcefile="mitchell.c" cloneof="block" romof="block"> <description>Block Block (World 910910)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -139278,9 +139386,9 @@ <video screen="raster" orientation="vertical" width="240" height="384" aspectx="3" aspecty="4" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="dial" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blockj" cloneof="block" romof="block"> + <game name="blockj" sourcefile="mitchell.c" cloneof="block" romof="block"> <description>Block Block (Japan 910910)</description> <year>1991</year> <manufacturer>Capcom</manufacturer> @@ -139300,9 +139408,9 @@ <video screen="raster" orientation="vertical" width="240" height="384" aspectx="3" aspecty="4" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="dial" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blockbl" cloneof="block" romof="block"> + <game name="blockbl" sourcefile="mitchell.c" cloneof="block" romof="block"> <description>Block Block (bootleg)</description> <year>1991</year> <manufacturer>bootleg</manufacturer> @@ -139324,9 +139432,9 @@ <video screen="raster" orientation="vertical" width="240" height="384" aspectx="3" aspecty="4" refresh="57.419998"/> <sound channels="1"/> <input players="2" control="dial" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="capbowl"> + <game name="capbowl" sourcefile="capbowl.c"> <description>Capcom Bowling (set 1)</description> <year>1988</year> <manufacturer>Incredible Technologies</manufacturer> @@ -139346,9 +139454,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="capbowl2" cloneof="capbowl" romof="capbowl"> + <game name="capbowl2" sourcefile="capbowl.c" cloneof="capbowl" romof="capbowl"> <description>Capcom Bowling (set 2)</description> <year>1988</year> <manufacturer>Incredible Technologies</manufacturer> @@ -139368,9 +139476,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="clbowl" cloneof="capbowl" romof="capbowl"> + <game name="clbowl" sourcefile="capbowl.c" cloneof="capbowl" romof="capbowl"> <description>Coors Light Bowling</description> <year>1989</year> <manufacturer>Incredible Technologies</manufacturer> @@ -139390,9 +139498,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bowlrama"> + <game name="bowlrama" sourcefile="capbowl.c"> <description>Bowl-O-Rama</description> <year>1991</year> <manufacturer>P&P Marketing</manufacturer> @@ -139410,9 +139518,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wfortune"> + <game name="wfortune" sourcefile="itech8.c"> <description>Wheel Of Fortune</description> <year>1989</year> <manufacturer>GameTek</manufacturer> @@ -139434,9 +139542,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wfortuna" cloneof="wfortune" romof="wfortune"> + <game name="wfortuna" sourcefile="itech8.c" cloneof="wfortune" romof="wfortune"> <description>Wheel Of Fortune (alternate)</description> <year>1989</year> <manufacturer>GameTek</manufacturer> @@ -139458,9 +139566,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="stratab"> + <game name="stratab" sourcefile="itech8.c"> <description>Strata Bowling (V3)</description> <year>1990</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139481,9 +139589,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="stratab1" cloneof="stratab" romof="stratab"> + <game name="stratab1" sourcefile="itech8.c" cloneof="stratab" romof="stratab"> <description>Strata Bowling (V1)</description> <year>1990</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139504,9 +139612,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sstrike"> + <game name="sstrike" sourcefile="itech8.c"> <description>Super Strike Bowling</description> <year>1990</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139525,9 +139633,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="paddle" buttons="3" coins="4" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="257"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="gtg"> + <game name="gtg" sourcefile="itech8.c"> <description>Golden Tee Golf (Joystick, v3.1)</description> <year>1990</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139551,9 +139659,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hstennis"> + <game name="hstennis" sourcefile="itech8.c"> <description>Hot Shots Tennis (V1.1)</description> <year>1990</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139580,9 +139688,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hstenn10" cloneof="hstennis" romof="hstennis"> + <game name="hstenn10" sourcefile="itech8.c" cloneof="hstennis" romof="hstennis"> <description>Hot Shots Tennis (V1.0)</description> <year>1990</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139609,9 +139717,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="slikshot"> + <game name="slikshot" sourcefile="itech8.c"> <description>Slick Shot (V2.2)</description> <year>1990</year> <manufacturer>Grand Products/Incredible Technologies</manufacturer> @@ -139629,9 +139737,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="paddle" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="257"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="sliksh17" cloneof="slikshot" romof="slikshot"> + <game name="sliksh17" sourcefile="itech8.c" cloneof="slikshot" romof="slikshot"> <description>Slick Shot (V1.7)</description> <year>1990</year> <manufacturer>Grand Products/Incredible Technologies</manufacturer> @@ -139649,9 +139757,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="paddle" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="257"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="dynobop"> + <game name="dynobop" sourcefile="itech8.c"> <description>Dyno Bop</description> <year>1990</year> <manufacturer>Grand Products/Incredible Technologies</manufacturer> @@ -139669,9 +139777,9 @@ <video screen="raster" orientation="vertical" width="240" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="paddle" buttons="3" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="257"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="arlingtn"> + <game name="arlingtn" sourcefile="itech8.c"> <description>Arlington Horse Racing (v1.21-D)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139692,9 +139800,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="peggle"> + <game name="peggle" sourcefile="itech8.c"> <description>Peggle (Joystick, v1.0)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139711,9 +139819,9 @@ <video screen="raster" orientation="vertical" width="240" height="350" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="joy8way" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pegglet" cloneof="peggle" romof="peggle"> + <game name="pegglet" sourcefile="itech8.c" cloneof="peggle" romof="peggle"> <description>Peggle (Trackball, v1.0)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139730,9 +139838,9 @@ <video screen="raster" orientation="vertical" width="240" height="350" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="dial" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rimrockn"> + <game name="rimrockn" sourcefile="itech8.c"> <description>Rim Rockin' Basketball (V2.2)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139750,9 +139858,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rimrck20" cloneof="rimrockn" romof="rimrockn"> + <game name="rimrck20" sourcefile="itech8.c" cloneof="rimrockn" romof="rimrockn"> <description>Rim Rockin' Basketball (V2.0)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139770,9 +139878,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rimrck16" cloneof="rimrockn" romof="rimrockn"> + <game name="rimrck16" sourcefile="itech8.c" cloneof="rimrockn" romof="rimrockn"> <description>Rim Rockin' Basketball (V1.6)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139790,9 +139898,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rimrck12" cloneof="rimrockn" romof="rimrockn"> + <game name="rimrck12" sourcefile="itech8.c" cloneof="rimrockn" romof="rimrockn"> <description>Rim Rockin' Basketball (V1.2)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139810,9 +139918,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ninclown"> + <game name="ninclown" sourcefile="itech8.c"> <description>Ninja Clowns (08/27/91)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139833,9 +139941,9 @@ <video screen="raster" orientation="horizontal" width="360" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gtg2"> + <game name="gtg2" sourcefile="itech8.c"> <description>Golden Tee Golf II (Trackball, V2.2)</description> <year>1992</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139859,9 +139967,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gtg2t" cloneof="gtg2" romof="gtg2"> + <game name="gtg2t" sourcefile="itech8.c" cloneof="gtg2" romof="gtg2"> <description>Golden Tee Golf II (Trackball, V1.1)</description> <year>1989</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139885,9 +139993,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gtg2j" cloneof="gtg2" romof="gtg2"> + <game name="gtg2j" sourcefile="itech8.c" cloneof="gtg2" romof="gtg2"> <description>Golden Tee Golf II (Joystick, V1.0)</description> <year>1991</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139911,9 +140019,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="neckneck"> + <game name="neckneck" sourcefile="itech8.c"> <description>Neck-n-Neck (v1.2)</description> <year>1992</year> <manufacturer>Bundra Games/Incredible Technologies</manufacturer> @@ -139935,9 +140043,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="timekill"> + <game name="timekill" sourcefile="itech32.c"> <description>Time Killers (v1.32)</description> <year>1992</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -139977,9 +140085,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="timek131" cloneof="timekill" romof="timekill"> + <game name="timek131" sourcefile="itech32.c" cloneof="timekill" romof="timekill"> <description>Time Killers (v1.31)</description> <year>1992</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140019,9 +140127,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hardyard"> + <game name="hardyard" sourcefile="itech32.c"> <description>Hard Yardage (v1.20)</description> <year>1993</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140064,9 +140172,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="hardyd10" cloneof="hardyard" romof="hardyard"> + <game name="hardyd10" sourcefile="itech32.c" cloneof="hardyard" romof="hardyard"> <description>Hard Yardage (v1.00)</description> <year>1993</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140109,9 +140217,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bloodstm"> + <game name="bloodstm" sourcefile="itech32.c"> <description>Blood Storm (v2.22)</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140160,9 +140268,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bloods22" cloneof="bloodstm" romof="bloodstm"> + <game name="bloods22" sourcefile="itech32.c" cloneof="bloodstm" romof="bloodstm"> <description>Blood Storm (v2.20)</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140211,9 +140319,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bloods21" cloneof="bloodstm" romof="bloodstm"> + <game name="bloods21" sourcefile="itech32.c" cloneof="bloodstm" romof="bloodstm"> <description>Blood Storm (v2.10)</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140262,9 +140370,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bloods11" cloneof="bloodstm" romof="bloodstm"> + <game name="bloods11" sourcefile="itech32.c" cloneof="bloodstm" romof="bloodstm"> <description>Blood Storm (v1.10)</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140313,9 +140421,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="pairs"> + <game name="pairs" sourcefile="itech32.c"> <description>Pairs (V1.2, 09/30/94)</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140354,9 +140462,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="pairsa" cloneof="pairs" romof="pairs"> + <game name="pairsa" sourcefile="itech32.c" cloneof="pairs" romof="pairs"> <description>Pairs (09/07/94)</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140395,9 +140503,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="drivedge"> + <game name="drivedge" sourcefile="itech32.c"> <description>Driver's Edge</description> <year>1994</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140447,9 +140555,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wcbowl"> + <game name="wcbowl" sourcefile="itech32.c"> <description>World Class Bowling (v1.66)</description> <year>1995</year> <manufacturer>Incredible Technologies</manufacturer> @@ -140492,9 +140600,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wcbwl165" cloneof="wcbowl" romof="wcbowl"> + <game name="wcbwl165" sourcefile="itech32.c" cloneof="wcbowl" romof="wcbowl"> <description>World Class Bowling (v1.65)</description> <year>1995</year> <manufacturer>Incredible Technologies</manufacturer> @@ -140537,9 +140645,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wcbwl161" cloneof="wcbowl" romof="wcbowl"> + <game name="wcbwl161" sourcefile="itech32.c" cloneof="wcbowl" romof="wcbowl"> <description>World Class Bowling (v1.61)</description> <year>1995</year> <manufacturer>Incredible Technologies</manufacturer> @@ -140582,9 +140690,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wcbwl12" cloneof="wcbowl" romof="wcbowl"> + <game name="wcbwl12" sourcefile="itech32.c" cloneof="wcbowl" romof="wcbowl"> <description>World Class Bowling (v1.2)</description> <year>1995</year> <manufacturer>Incredible Technologies</manufacturer> @@ -140620,9 +140728,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="sftm"> + <game name="sftm" sourcefile="itech32.c"> <description>Street Fighter: The Movie (v1.12)</description> <year>1995</year> <manufacturer>Capcom/Incredible Technologies</manufacturer> @@ -140667,9 +140775,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="sftm110" cloneof="sftm" romof="sftm"> + <game name="sftm110" sourcefile="itech32.c" cloneof="sftm" romof="sftm"> <description>Street Fighter: The Movie (v1.10)</description> <year>1995</year> <manufacturer>Capcom/Incredible Technologies</manufacturer> @@ -140714,9 +140822,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="sftm111" cloneof="sftm" romof="sftm"> + <game name="sftm111" sourcefile="itech32.c" cloneof="sftm" romof="sftm"> <description>Street Fighter: The Movie (v1.11)</description> <year>1995</year> <manufacturer>Capcom/Incredible Technologies</manufacturer> @@ -140761,9 +140869,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="sftmj" cloneof="sftm" romof="sftm"> + <game name="sftmj" sourcefile="itech32.c" cloneof="sftm" romof="sftm"> <description>Street Fighter: The Movie (v1.12N, Japan)</description> <year>1995</year> <manufacturer>Capcom/Incredible Technologies</manufacturer> @@ -140808,9 +140916,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="shufshot"> + <game name="shufshot" sourcefile="itech32.c"> <description>Shuffleshot (v1.39)</description> <year>1997</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140859,9 +140967,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="sshot137" cloneof="shufshot" romof="shufshot"> + <game name="sshot137" sourcefile="itech32.c" cloneof="shufshot" romof="shufshot"> <description>Shuffleshot (v1.37)</description> <year>1997</year> <manufacturer>Strata/Incredible Technologies</manufacturer> @@ -140910,9 +141018,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="cerberus"> + <game name="cerberus" sourcefile="leland.c"> <description>Cerberus</description> <year>1985</year> <manufacturer>Cinematronics</manufacturer> @@ -140949,9 +141057,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="dial" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mayhem"> + <game name="mayhem" sourcefile="leland.c"> <description>Mayhem 2002</description> <year>1985</year> <manufacturer>Cinematronics</manufacturer> @@ -140982,9 +141090,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="powrplay"> + <game name="powrplay" sourcefile="leland.c"> <description>Power Play</description> <year>1985</year> <manufacturer>Cinematronics</manufacturer> @@ -141012,9 +141120,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="wseries"> + <game name="wseries" sourcefile="leland.c"> <description>World Series: The Season</description> <year>1985</year> <manufacturer>Cinematronics</manufacturer> @@ -141048,9 +141156,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="stick" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="alleymas"> + <game name="alleymas" sourcefile="leland.c"> <description>Alley Master</description> <year>1986</year> <manufacturer>Cinematronics</manufacturer> @@ -141083,9 +141191,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="stick" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="dangerz"> + <game name="dangerz" sourcefile="leland.c"> <description>Danger Zone</description> <year>1986</year> <manufacturer>Cinematronics</manufacturer> @@ -141116,9 +141224,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="trackball" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="basebal2"> + <game name="basebal2" sourcefile="leland.c"> <description>Baseball The Season II</description> <year>1987</year> <manufacturer>Cinematronics</manufacturer> @@ -141154,9 +141262,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="stick" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="dblplay"> + <game name="dblplay" sourcefile="leland.c"> <description>Super Baseball Double Play Home Run Derby</description> <year>1987</year> <manufacturer>Leland Corp. / Tradewest</manufacturer> @@ -141193,9 +141301,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="stick" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="strkzone"> + <game name="strkzone" sourcefile="leland.c"> <description>Strike Zone Baseball</description> <year>1988</year> <manufacturer>Leland Corp.</manufacturer> @@ -141232,9 +141340,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="stick" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="redlin2p"> + <game name="redlin2p" sourcefile="leland.c"> <description>Redline Racer (2 players)</description> <year>1987</year> <manufacturer>Cinematronics (Tradewest license)</manufacturer> @@ -141268,9 +141376,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="dial" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="quarterb"> + <game name="quarterb" sourcefile="leland.c"> <description>Quarterback</description> <year>1987</year> <manufacturer>Leland Corp.</manufacturer> @@ -141307,9 +141415,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="stick" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="quartrba" cloneof="quarterb" romof="quarterb"> + <game name="quartrba" sourcefile="leland.c" cloneof="quarterb" romof="quarterb"> <description>Quarterback (set 2)</description> <year>1987</year> <manufacturer>Leland Corp.</manufacturer> @@ -141346,9 +141454,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="stick" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="viper"> + <game name="viper" sourcefile="leland.c"> <description>Viper</description> <year>1988</year> <manufacturer>Leland Corp.</manufacturer> @@ -141384,9 +141492,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" control="trackball" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="teamqb"> + <game name="teamqb" sourcefile="leland.c"> <description>John Elway's Team Quarterback</description> <year>1988</year> <manufacturer>Leland Corp.</manufacturer> @@ -141424,9 +141532,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="teamqb2" cloneof="teamqb" romof="teamqb"> + <game name="teamqb2" sourcefile="leland.c" cloneof="teamqb" romof="teamqb"> <description>John Elway's Team Quarterback (set 2)</description> <year>1988</year> <manufacturer>Leland Corp.</manufacturer> @@ -141464,9 +141572,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aafb"> + <game name="aafb" sourcefile="leland.c"> <description>All American Football (rev E)</description> <year>1989</year> <manufacturer>Leland Corp.</manufacturer> @@ -141503,9 +141611,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aafbd2p" cloneof="aafb" romof="aafb"> + <game name="aafbd2p" sourcefile="leland.c" cloneof="aafb" romof="aafb"> <description>All American Football (rev D, 2 Players)</description> <year>1989</year> <manufacturer>Leland Corp.</manufacturer> @@ -141544,9 +141652,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aafbc" cloneof="aafb" romof="aafb"> + <game name="aafbc" sourcefile="leland.c" cloneof="aafb" romof="aafb"> <description>All American Football (rev C)</description> <year>1989</year> <manufacturer>Leland Corp.</manufacturer> @@ -141585,9 +141693,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aafbb" cloneof="aafb" romof="aafb"> + <game name="aafbb" sourcefile="leland.c" cloneof="aafb" romof="aafb"> <description>All American Football (rev B)</description> <year>1989</year> <manufacturer>Leland Corp.</manufacturer> @@ -141626,9 +141734,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="offroad"> + <game name="offroad" sourcefile="leland.c"> <description>Ironman Stewart's Super Off-Road</description> <year>1989</year> <manufacturer>Leland Corp.</manufacturer> @@ -141664,9 +141772,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="dial" buttons="1" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="offroadt"> + <game name="offroadt" sourcefile="leland.c"> <description>Ironman Stewart's Super Off-Road Track Pack</description> <year>1989</year> <manufacturer>Leland Corp.</manufacturer> @@ -141704,9 +141812,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="dial" buttons="1" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="pigout"> + <game name="pigout" sourcefile="leland.c"> <description>Pigout</description> <year>1990</year> <manufacturer>Leland Corp.</manufacturer> @@ -141747,9 +141855,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="pigouta" cloneof="pigout" romof="pigout"> + <game name="pigouta" sourcefile="leland.c" cloneof="pigout" romof="pigout"> <description>Pigout (alternate)</description> <year>1990</year> <manufacturer>Leland Corp.</manufacturer> @@ -141790,9 +141898,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ataxx"> + <game name="ataxx" sourcefile="ataxx.c"> <description>Ataxx (set 1)</description> <year>1990</year> <manufacturer>Leland Corp.</manufacturer> @@ -141817,9 +141925,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="trackball" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ataxxa" cloneof="ataxx" romof="ataxx"> + <game name="ataxxa" sourcefile="ataxx.c" cloneof="ataxx" romof="ataxx"> <description>Ataxx (set 2)</description> <year>1990</year> <manufacturer>Leland Corp.</manufacturer> @@ -141844,9 +141952,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="trackball" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ataxxj" cloneof="ataxx" romof="ataxx"> + <game name="ataxxj" sourcefile="ataxx.c" cloneof="ataxx" romof="ataxx"> <description>Ataxx (Japan)</description> <year>1990</year> <manufacturer>Leland Corp.</manufacturer> @@ -141871,9 +141979,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="trackball" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="wsf"> + <game name="wsf" sourcefile="ataxx.c"> <description>World Soccer Finals</description> <year>1990</year> <manufacturer>Leland Corp.</manufacturer> @@ -141908,9 +142016,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="indyheat"> + <game name="indyheat" sourcefile="ataxx.c"> <description>Danny Sullivan's Indy Heat</description> <year>1991</year> <manufacturer>Leland Corp.</manufacturer> @@ -141948,9 +142056,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="dial" buttons="2" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="brutforc"> + <game name="brutforc" sourcefile="ataxx.c"> <description>Brute Force</description> <year>1991</year> <manufacturer>Leland Corp.</manufacturer> @@ -141990,9 +142098,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="joy8way" buttons="2" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="asylum"> + <game name="asylum" sourcefile="ataxx.c"> <description>Asylum (prototype)</description> <year>1991</year> <manufacturer>Leland Corp.</manufacturer> @@ -142032,9 +142140,9 @@ <video screen="raster" orientation="vertical" width="240" height="320" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="3" control="joy8way" buttons="2" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="blockade"> + <game name="blockade" sourcefile="blockade.c"> <description>Blockade</description> <year>1976</year> <manufacturer>Gremlin</manufacturer> @@ -142058,9 +142166,9 @@ <dipvalue name="5"/> <dipvalue name="6" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="comotion" sampleof="blockade"> + <game name="comotion" sourcefile="blockade.c" sampleof="blockade"> <description>Comotion</description> <year>1976</year> <manufacturer>Gremlin</manufacturer> @@ -142084,9 +142192,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="hustle" sampleof="blockade"> + <game name="hustle" sourcefile="blockade.c" sampleof="blockade"> <description>Hustle</description> <year>1977</year> <manufacturer>Gremlin</manufacturer> @@ -142119,9 +142227,9 @@ <dipvalue name="17000"/> <dipvalue name="Disabled" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="blasto" sampleof="blockade"> + <game name="blasto" sourcefile="blockade.c" sampleof="blockade"> <description>Blasto</description> <year>1978</year> <manufacturer>Gremlin</manufacturer> @@ -142151,9 +142259,9 @@ <dipvalue name="70 Secs"/> <dipvalue name="90 Secs" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="mineswpr" sampleof="blockade"> + <game name="mineswpr" sourcefile="blockade.c" sampleof="blockade"> <description>Minesweeper</description> <year>1977</year> <manufacturer>Amutech</manufacturer> @@ -142177,9 +142285,9 @@ <dipvalue name="5"/> <dipvalue name="6" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="depthch"> + <game name="depthch" sourcefile="vicdual.c"> <description>Depthcharge</description> <year>1977</year> <manufacturer>Gremlin</manufacturer> @@ -142207,9 +142315,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="depthv1" cloneof="depthch" romof="depthch" sampleof="depthch"> + <game name="depthv1" sourcefile="vicdual.c" cloneof="depthch" romof="depthch" sampleof="depthch"> <description>Depthcharge (older)</description> <year>1977</year> <manufacturer>Gremlin</manufacturer> @@ -142243,9 +142351,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="subhunt" cloneof="depthch" romof="depthch" sampleof="depthch"> + <game name="subhunt" sourcefile="vicdual.c" cloneof="depthch" romof="depthch" sampleof="depthch"> <description>Sub Hunter</description> <year>1977</year> <manufacturer>Taito</manufacturer> @@ -142279,9 +142387,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="safari"> + <game name="safari" sourcefile="vicdual.c"> <description>Safari</description> <year>1977</year> <manufacturer>Gremlin</manufacturer> @@ -142307,9 +142415,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="frogs"> + <game name="frogs" sourcefile="vicdual.c"> <description>Frogs</description> <year>1978</year> <manufacturer>Gremlin</manufacturer> @@ -142341,9 +142449,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="sspaceat"> + <game name="sspaceat" sourcefile="vicdual.c"> <description>Space Attack (upright)</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142378,9 +142486,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="sspacat2" cloneof="sspaceat" romof="sspaceat"> + <game name="sspacat2" sourcefile="vicdual.c" cloneof="sspaceat" romof="sspaceat"> <description>Space Attack (upright, older)</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142415,9 +142523,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="sspacatc" cloneof="sspaceat" romof="sspaceat"> + <game name="sspacatc" sourcefile="vicdual.c" cloneof="sspaceat" romof="sspaceat"> <description>Space Attack (cocktail)</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142452,9 +142560,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="sspacaho"> + <game name="sspacaho" sourcefile="vicdual.c"> <description>Space Attack / Head On</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142493,9 +142601,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="headon"> + <game name="headon" sourcefile="vicdual.c"> <description>Head On (2 players)</description> <year>1979</year> <manufacturer>Gremlin</manufacturer> @@ -142521,9 +142629,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="headonb" cloneof="headon" romof="headon"> + <game name="headonb" sourcefile="vicdual.c" cloneof="headon" romof="headon"> <description>Head On (1 player)</description> <year>1979</year> <manufacturer>Gremlin</manufacturer> @@ -142549,9 +142657,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="headon2"> + <game name="headon2" sourcefile="vicdual.c"> <description>Head On 2</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142579,9 +142687,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="invho2" sampleof="invinco"> + <game name="invho2" sourcefile="vicdual.c" sampleof="invinco"> <description>Invinco / Head On 2</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142635,9 +142743,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="samurai"> + <game name="samurai" sourcefile="vicdual.c"> <description>Samurai</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -142680,9 +142788,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="invinco"> + <game name="invinco" sourcefile="vicdual.c"> <description>Invinco</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142731,9 +142839,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="invds" sampleof="invinco"> + <game name="invds" sourcefile="vicdual.c" sampleof="invinco"> <description>Invinco / Deep Scan</description> <year>1979</year> <manufacturer>Sega</manufacturer> @@ -142788,9 +142896,9 @@ <dipvalue name="+0"/> <dipvalue name="+2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="tranqgun"> + <game name="tranqgun" sourcefile="vicdual.c"> <description>Tranquilizer Gun</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -142837,9 +142945,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="spacetrk"> + <game name="spacetrk" sourcefile="vicdual.c"> <description>Space Trek (upright)</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -142886,9 +142994,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="sptrekct" cloneof="spacetrk" romof="spacetrk"> + <game name="sptrekct" sourcefile="vicdual.c" cloneof="spacetrk" romof="spacetrk"> <description>Space Trek (cocktail)</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -142935,9 +143043,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="carnival"> + <game name="carnival" sourcefile="vicdual.c"> <description>Carnival (upright)</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -143000,9 +143108,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="carnvckt" cloneof="carnival" romof="carnival" sampleof="carnival"> + <game name="carnvckt" sourcefile="vicdual.c" cloneof="carnival" romof="carnival" sampleof="carnival"> <description>Carnival (cocktail)</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -143065,9 +143173,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="brdrlinb"> + <game name="brdrlinb" sourcefile="vicdual.c"> <description>Borderline (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -143124,9 +143232,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="digger"> + <game name="digger" sourcefile="vicdual.c"> <description>Digger</description> <year>1980</year> <manufacturer>Sega</manufacturer> @@ -143166,9 +143274,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="pulsar"> + <game name="pulsar" sourcefile="vicdual.c"> <description>Pulsar</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -143227,9 +143335,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="heiankyo"> + <game name="heiankyo" sourcefile="vicdual.c"> <description>Heiankyo Alien</description> <year>1979</year> <manufacturer>Denki Onkyo</manufacturer> @@ -143274,9 +143382,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="alphaho" sampleof="invinco"> + <game name="alphaho" sourcefile="vicdual.c" sampleof="invinco"> <description>Alpha Fighter / Head On</description> <manufacturer>Data East Corporation</manufacturer> <rom name="c0.bin" size="1024" crc="db774c23" sha1="c5042872110ae8d0c5c7629892a16b87e8f19d96" region="cpu1" offset="0"/> @@ -143325,9 +143433,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="64"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="64"/> </game> - <game name="spacfury"> + <game name="spacfury" sourcefile="sega.c"> <description>Space Fury (revision C)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -143424,9 +143532,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="spacfura" cloneof="spacfury" romof="spacfury" sampleof="spacfury"> + <game name="spacfura" sourcefile="sega.c" cloneof="spacfury" romof="spacfury" sampleof="spacfury"> <description>Space Fury (revision A)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -143523,9 +143631,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="zektor"> + <game name="zektor" sourcefile="sega.c"> <description>Zektor (revision B)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -143635,9 +143743,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tacscan"> + <game name="tacscan" sourcefile="sega.c"> <description>Tac/Scan</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -143753,9 +143861,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="elim2"> + <game name="elim2" sourcefile="sega.c"> <description>Eliminator (2 Players, set 1)</description> <year>1981</year> <manufacturer>Gremlin</manufacturer> @@ -143848,9 +143956,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="elim2a" cloneof="elim2" romof="elim2" sampleof="elim2"> + <game name="elim2a" sourcefile="sega.c" cloneof="elim2" romof="elim2" sampleof="elim2"> <description>Eliminator (2 Players, set 2)</description> <year>1981</year> <manufacturer>Gremlin</manufacturer> @@ -143943,9 +144051,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="elim4" cloneof="elim2" romof="elim2" sampleof="elim2"> + <game name="elim4" sourcefile="sega.c" cloneof="elim2" romof="elim2" sampleof="elim2"> <description>Eliminator (4 Players)</description> <year>1981</year> <manufacturer>Gremlin</manufacturer> @@ -144003,9 +144111,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="startrek"> + <game name="startrek" sourcefile="sega.c"> <description>Star Trek</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -144134,9 +144242,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="astrob"> + <game name="astrob" sourcefile="segar.c"> <description>Astro Blaster (version 3)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -144254,9 +144362,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="astrob2" cloneof="astrob" romof="astrob" sampleof="astrob"> + <game name="astrob2" sourcefile="segar.c" cloneof="astrob" romof="astrob" sampleof="astrob"> <description>Astro Blaster (version 2)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -144372,9 +144480,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="astrob1" cloneof="astrob" romof="astrob" sampleof="astrob"> + <game name="astrob1" sourcefile="segar.c" cloneof="astrob" romof="astrob" sampleof="astrob"> <description>Astro Blaster (version 1)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -144489,9 +144597,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="005"> + <game name="005" sourcefile="segar.c"> <description>005</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -144588,9 +144696,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="monsterb"> + <game name="monsterb" sourcefile="segar.c"> <description>Monster Bash</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -144695,9 +144803,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="spaceod"> + <game name="spaceod" sourcefile="segar.c"> <description>Space Odyssey</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -144808,9 +144916,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="pignewt"> + <game name="pignewt" sourcefile="segar.c"> <description>Pig Newton (version C)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -144911,9 +145019,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="129"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="129"/> </game> - <game name="pignewta" cloneof="pignewt" romof="pignewt"> + <game name="pignewta" sourcefile="segar.c" cloneof="pignewt" romof="pignewt"> <description>Pig Newton (version A)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -145012,9 +145120,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="129"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="129"/> </game> - <game name="sindbadm"> + <game name="sindbadm" sourcefile="segar.c"> <description>Sindbad Mystery</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -145102,9 +145210,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="129"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="129"/> </game> - <game name="zaxxon"> + <game name="zaxxon" sourcefile="zaxxon.c"> <description>Zaxxon (set 1)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -145198,9 +145306,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="zaxxon2" cloneof="zaxxon" romof="zaxxon" sampleof="zaxxon"> + <game name="zaxxon2" sourcefile="zaxxon.c" cloneof="zaxxon" romof="zaxxon" sampleof="zaxxon"> <description>Zaxxon (set 2)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -145294,9 +145402,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="zaxxonb" cloneof="zaxxon" romof="zaxxon" sampleof="zaxxon"> + <game name="zaxxonb" sourcefile="zaxxon.c" cloneof="zaxxon" romof="zaxxon" sampleof="zaxxon"> <description>Jackson</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -145390,9 +145498,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="szaxxon" sampleof="zaxxon"> + <game name="szaxxon" sourcefile="zaxxon.c" sampleof="zaxxon"> <description>Super Zaxxon</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -145490,9 +145598,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="futspy" sampleof="zaxxon"> + <game name="futspy" sourcefile="zaxxon.c" sampleof="zaxxon"> <description>Future Spy</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -145592,9 +145700,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="razmataz"> + <game name="razmataz" sourcefile="zaxxon.c"> <description>Razzmatazz</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -145671,9 +145779,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="ixion"> + <game name="ixion" sourcefile="zaxxon.c"> <description>Ixion (prototype)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -145750,9 +145858,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="congo"> + <game name="congo" sourcefile="zaxxon.c"> <description>Congo Bongo</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -145857,9 +145965,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tiptop" cloneof="congo" romof="congo" sampleof="congo"> + <game name="tiptop" sourcefile="zaxxon.c" cloneof="congo" romof="congo" sampleof="congo"> <description>Tip Top</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -145964,9 +146072,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="chboxing"> + <game name="chboxing" sourcefile="sg1000a.c"> <description>Champion Boxing</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -145992,9 +146100,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="chwrestl"> + <game name="chwrestl" sourcefile="sg1000a.c"> <description>Champion Pro Wrestling</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -146020,9 +146128,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="starjack"> + <game name="starjack" sourcefile="system1.c"> <description>Star Jacker (Sega)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -146109,9 +146217,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="starjacs" cloneof="starjack" romof="starjack"> + <game name="starjacs" sourcefile="system1.c" cloneof="starjack" romof="starjack"> <description>Star Jacker (Stern)</description> <year>1983</year> <manufacturer>Stern</manufacturer> @@ -146198,9 +146306,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="regulus"> + <game name="regulus" sourcefile="system1.c"> <description>Regulus (New Ver.)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -146291,9 +146399,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="reguluso" cloneof="regulus" romof="regulus"> + <game name="reguluso" sourcefile="system1.c" cloneof="regulus" romof="regulus"> <description>Regulus (Old Ver.)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -146384,9 +146492,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="regulusu" cloneof="regulus" romof="regulus"> + <game name="regulusu" sourcefile="system1.c" cloneof="regulus" romof="regulus"> <description>Regulus (not encrypted)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -146477,9 +146585,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="upndown"> + <game name="upndown" sourcefile="system1.c"> <description>Up'n Down</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -146566,9 +146674,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="upndownu" cloneof="upndown" romof="upndown"> + <game name="upndownu" sourcefile="system1.c" cloneof="upndown" romof="upndown"> <description>Up'n Down (not encrypted)</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -146655,9 +146763,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="mrviking"> + <game name="mrviking" sourcefile="system1.c"> <description>Mister Viking</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -146746,9 +146854,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="mrvikngj" cloneof="mrviking" romof="mrviking"> + <game name="mrvikngj" sourcefile="system1.c" cloneof="mrviking" romof="mrviking"> <description>Mister Viking (Japan)</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -146837,9 +146945,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="swat"> + <game name="swat" sourcefile="system1.c"> <description>SWAT</description> <year>1984</year> <manufacturer>Coreland / Sega</manufacturer> @@ -146928,9 +147036,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="flicky"> + <game name="flicky" sourcefile="system1.c"> <description>Flicky (128k Ver.)</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -147015,9 +147123,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="flickyo" cloneof="flicky" romof="flicky"> + <game name="flickyo" sourcefile="system1.c" cloneof="flicky" romof="flicky"> <description>Flicky (64k Ver.)</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -147104,9 +147212,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wmatch"> + <game name="wmatch" sourcefile="system1.c"> <description>Water Match</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -147197,9 +147305,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="bullfgt"> + <game name="bullfgt" sourcefile="system1.c"> <description>Bullfight</description> <year>1984</year> <manufacturer>Coreland / Sega</manufacturer> @@ -147288,9 +147396,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="thetogyu" cloneof="bullfgt" romof="bullfgt"> + <game name="thetogyu" sourcefile="system1.c" cloneof="bullfgt" romof="bullfgt"> <description>The Togyu (Japan)</description> <year>1984</year> <manufacturer>Coreland / Sega</manufacturer> @@ -147376,9 +147484,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="spatter"> + <game name="spatter" sourcefile="system1.c"> <description>Spatter</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -147466,9 +147574,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="ssanchan" cloneof="spatter" romof="spatter"> + <game name="ssanchan" sourcefile="system1.c" cloneof="spatter" romof="spatter"> <description>Sanrin San Chan (Japan)</description> <year>1984</year> <manufacturer>Sega</manufacturer> @@ -147556,9 +147664,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="pitfall2"> + <game name="pitfall2" sourcefile="system1.c"> <description>Pitfall II</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -147646,9 +147754,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="pitfallu" cloneof="pitfall2" romof="pitfall2"> + <game name="pitfallu" sourcefile="system1.c" cloneof="pitfall2" romof="pitfall2"> <description>Pitfall II (not encrypted)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -147734,9 +147842,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="seganinj"> + <game name="seganinj" sourcefile="system1.c"> <description>Sega Ninja</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -147826,9 +147934,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="seganinu" cloneof="seganinj" romof="seganinj"> + <game name="seganinu" sourcefile="system1.c" cloneof="seganinj" romof="seganinj"> <description>Sega Ninja (not encrypted)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -147918,9 +148026,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="nprinces" cloneof="seganinj" romof="seganinj"> + <game name="nprinces" sourcefile="system1.c" cloneof="seganinj" romof="seganinj"> <description>Ninja Princess (64k Ver. bootleg?)</description> <year>1985</year> <manufacturer>bootleg?</manufacturer> @@ -148013,9 +148121,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="nprincso" cloneof="seganinj" romof="seganinj"> + <game name="nprincso" sourcefile="system1.c" cloneof="seganinj" romof="seganinj"> <description>Ninja Princess (128k Ver.)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -148105,9 +148213,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="nprincsu" cloneof="seganinj" romof="seganinj"> + <game name="nprincsu" sourcefile="system1.c" cloneof="seganinj" romof="seganinj"> <description>Ninja Princess (64k Ver. not encrypted)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -148200,9 +148308,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="nprincsb" cloneof="seganinj" romof="seganinj"> + <game name="nprincsb" sourcefile="system1.c" cloneof="seganinj" romof="seganinj"> <description>Ninja Princess (128k Ver. bootleg?)</description> <year>1985</year> <manufacturer>bootleg?</manufacturer> @@ -148294,9 +148402,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="imsorry"> + <game name="imsorry" sourcefile="system1.c"> <description>I'm Sorry (US)</description> <year>1985</year> <manufacturer>Coreland / Sega</manufacturer> @@ -148382,9 +148490,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="imsorryj" cloneof="imsorry" romof="imsorry"> + <game name="imsorryj" sourcefile="system1.c" cloneof="imsorry" romof="imsorry"> <description>Gonbee no I'm Sorry (Japan)</description> <year>1985</year> <manufacturer>Coreland / Sega</manufacturer> @@ -148470,9 +148578,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="teddybb"> + <game name="teddybb" sourcefile="system1.c"> <description>TeddyBoy Blues (New Ver.)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -148560,9 +148668,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="teddybbo" cloneof="teddybb" romof="teddybb"> + <game name="teddybbo" sourcefile="system1.c" cloneof="teddybb" romof="teddybb"> <description>TeddyBoy Blues (Old Ver.)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -148650,9 +148758,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="hvymetal"> + <game name="hvymetal" sourcefile="system1.c"> <description>Heavy Metal</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -148743,9 +148851,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="myhero"> + <game name="myhero" sourcefile="system1.c"> <description>My Hero (US)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -148833,9 +148941,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="sscandal" cloneof="myhero" romof="myhero"> + <game name="sscandal" sourcefile="system1.c" cloneof="myhero" romof="myhero"> <description>Seishun Scandal (Japan)</description> <year>1985</year> <manufacturer>Coreland / Sega</manufacturer> @@ -148923,9 +149031,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="myherok" cloneof="myhero" romof="myhero"> + <game name="myherok" sourcefile="system1.c" cloneof="myhero" romof="myhero"> <description>My Hero (Korea)</description> <year>1985</year> <manufacturer>Coreland / Sega</manufacturer> @@ -149010,9 +149118,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="shtngmst"> + <game name="shtngmst" sourcefile="system1.c"> <description>Shooting Master</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -149105,9 +149213,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="chplft"> + <game name="chplft" sourcefile="system1.c"> <description>Choplifter</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -149197,9 +149305,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1536"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="chplftb" cloneof="chplft" romof="chplft"> + <game name="chplftb" sourcefile="system1.c" cloneof="chplft" romof="chplft"> <description>Choplifter (alternate)</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -149289,9 +149397,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="chplftbl" cloneof="chplft" romof="chplft"> + <game name="chplftbl" sourcefile="system1.c" cloneof="chplft" romof="chplft"> <description>Choplifter (bootleg)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -149381,9 +149489,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="4dwarrio"> + <game name="4dwarrio" sourcefile="system1.c"> <description>4-D Warriors</description> <year>1985</year> <manufacturer>Coreland / Sega</manufacturer> @@ -149471,9 +149579,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="brain"> + <game name="brain" sourcefile="system1.c"> <description>Brain</description> <year>1986</year> <manufacturer>Coreland / Sega</manufacturer> @@ -149562,9 +149670,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="raflesia"> + <game name="raflesia" sourcefile="system1.c"> <description>Rafflesia</description> <year>1986</year> <manufacturer>Coreland / Sega</manufacturer> @@ -149652,9 +149760,9 @@ <dipvalue name="Port $0D" default="yes"/> <dipvalue name="Port $10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wboy"> + <game name="wboy" sourcefile="system1.c"> <description>Wonder Boy (set 1, new encryption)</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -149744,9 +149852,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wboyo" cloneof="wboy" romof="wboy"> + <game name="wboyo" sourcefile="system1.c" cloneof="wboy" romof="wboy"> <description>Wonder Boy (set 1, old encryption)</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -149836,9 +149944,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wboy2" cloneof="wboy" romof="wboy"> + <game name="wboy2" sourcefile="system1.c" cloneof="wboy" romof="wboy"> <description>Wonder Boy (set 2)</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -149931,9 +150039,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wboy2u" cloneof="wboy" romof="wboy"> + <game name="wboy2u" sourcefile="system1.c" cloneof="wboy" romof="wboy"> <description>Wonder Boy (set 2 not encrypted)</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -150026,9 +150134,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wboy3" cloneof="wboy" romof="wboy"> + <game name="wboy3" sourcefile="system1.c" cloneof="wboy" romof="wboy"> <description>Wonder Boy (set 3)</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -150118,9 +150226,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wboyu" cloneof="wboy" romof="wboy"> + <game name="wboyu" sourcefile="system1.c" cloneof="wboy" romof="wboy"> <description>Wonder Boy (not encrypted)</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -150204,9 +150312,9 @@ <dipvalue name="Test Mode"/> <dipvalue name="Endless Game"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wbdeluxe" cloneof="wboy" romof="wboy"> + <game name="wbdeluxe" sourcefile="system1.c" cloneof="wboy" romof="wboy"> <description>Wonder Boy Deluxe</description> <year>1986</year> <manufacturer>Sega (Escape license)</manufacturer> @@ -150299,9 +150407,9 @@ <dipvalue name="Slow" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="gardia"> + <game name="gardia" sourcefile="system1.c"> <description>Gardia</description> <year>1986</year> <manufacturer>Sega / Coreland</manufacturer> @@ -150391,9 +150499,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="gardiab" cloneof="gardia" romof="gardia"> + <game name="gardiab" sourcefile="system1.c" cloneof="gardia" romof="gardia"> <description>Gardia (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -150483,9 +150591,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="noboranb"> + <game name="noboranb" sourcefile="system1.c"> <description>Noboranka (Japan)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -150565,9 +150673,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="blockgal"> + <game name="blockgal" sourcefile="system1.c"> <description>Block Gal</description> <year>1987</year> <manufacturer>Sega / Vic Tokai</manufacturer> @@ -150656,9 +150764,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="blckgalb" cloneof="blockgal" romof="blockgal"> + <game name="blckgalb" sourcefile="system1.c" cloneof="blockgal" romof="blockgal"> <description>Block Gal (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -150746,9 +150854,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="tokisens"> + <game name="tokisens" sourcefile="system1.c"> <description>Toki no Senshi - Chrono Soldier</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -150838,9 +150946,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wbml"> + <game name="wbml" sourcefile="system1.c"> <description>Wonder Boy in Monster Land (Japan New Ver.)</description> <year>1987</year> <manufacturer>Sega / Westone</manufacturer> @@ -150927,9 +151035,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wbmljo" cloneof="wbml" romof="wbml"> + <game name="wbmljo" sourcefile="system1.c" cloneof="wbml" romof="wbml"> <description>Wonder Boy in Monster Land (Japan Old Ver.)</description> <year>1987</year> <manufacturer>Sega / Westone</manufacturer> @@ -151016,9 +151124,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wbmljb" cloneof="wbml" romof="wbml"> + <game name="wbmljb" sourcefile="system1.c" cloneof="wbml" romof="wbml"> <description>Wonder Boy in Monster Land (Japan not encrypted)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -151105,9 +151213,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="wbmlb" cloneof="wbml" romof="wbml"> + <game name="wbmlb" sourcefile="system1.c" cloneof="wbml" romof="wbml"> <description>Wonder Boy in Monster Land</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -151194,9 +151302,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="dakkochn"> + <game name="dakkochn" sourcefile="system1.c"> <description>DakkoChan Jansoh</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -151285,9 +151393,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="ufosensi"> + <game name="ufosensi" sourcefile="system1.c"> <description>Ufo Senshi Yohko Chan</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -151377,9 +151485,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="hangonjr"> + <game name="hangonjr" sourcefile="segasyse.c"> <description>Hang-On Jr.</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -151456,9 +151564,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="transfrm"> + <game name="transfrm" sourcefile="segasyse.c"> <description>Transformer</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -151533,9 +151641,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="astrofl" cloneof="transfrm" romof="transfrm"> + <game name="astrofl" sourcefile="segasyse.c" cloneof="transfrm" romof="transfrm"> <description>Astro Flash (Japan)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -151610,9 +151718,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="ridleofp"> + <game name="ridleofp" sourcefile="segasyse.c"> <description>Riddle of Pythagoras (Japan)</description> <year>1986</year> <manufacturer>Sega / Nasco</manufacturer> @@ -151691,9 +151799,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="fantzn2"> + <game name="fantzn2" sourcefile="segasyse.c"> <description>Fantasy Zone 2</description> <manufacturer>????</manufacturer> <rom name="fz2_ic7.rom" size="32768" crc="76db7b7b" sha1="d60e2961fc893dcb4445aed5f67515cbd25b610f" region="cpu1" offset="0"/> @@ -151707,9 +151815,9 @@ <video screen="raster" orientation="horizontal" width="256" height="192" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="64"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="opaopa"> + <game name="opaopa" sourcefile="segasyse.c"> <description>Opa Opa</description> <manufacturer>????</manufacturer> <rom name="epr11224.ic7" size="32768" crc="024b1244" sha1="59a522ac3d98982cc4ddb1c81f9584d3da453649" region="user1" offset="0"/> @@ -151723,9 +151831,9 @@ <video screen="raster" orientation="horizontal" width="256" height="192" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="64"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="turbo"> + <game name="turbo" sourcefile="turbo.c"> <description>Turbo</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -151835,9 +151943,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cockpit"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="turboa" cloneof="turbo" romof="turbo" sampleof="turbo"> + <game name="turboa" sourcefile="turbo.c" cloneof="turbo" romof="turbo" sampleof="turbo"> <description>Turbo (encrypted set 1)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -151947,9 +152055,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cockpit"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="turbob" cloneof="turbo" romof="turbo" sampleof="turbo"> + <game name="turbob" sourcefile="turbo.c" cloneof="turbo" romof="turbo" sampleof="turbo"> <description>Turbo (encrypted set 2)</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -152059,9 +152167,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cockpit"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="subroc3d"> + <game name="subroc3d" sourcefile="turbo.c"> <description>Subroc-3D</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -152173,9 +152281,9 @@ <dipvalue name="Endless"/> <dipvalue name="Normal" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="buckrog"> + <game name="buckrog" sourcefile="turbo.c"> <description>Buck Rogers: Planet of Zoom</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -152265,9 +152373,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cockpit"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="buckrogn" cloneof="buckrog" romof="buckrog" sampleof="buckrog"> + <game name="buckrogn" sourcefile="turbo.c" cloneof="buckrog" romof="buckrog" sampleof="buckrog"> <description>Buck Rogers: Planet of Zoom (not encrypted)</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -152357,9 +152465,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cockpit"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1792"/> </game> - <game name="kopunch"> + <game name="kopunch" sourcefile="kopunch.c"> <description>KO Punch</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -152413,9 +152521,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="8"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="suprloco"> + <game name="suprloco" sourcefile="suprloco.c"> <description>Super Locomotive</description> <year>1982</year> <manufacturer>Sega</manufacturer> @@ -152492,9 +152600,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="dotrikun"> + <game name="dotrikun" sourcefile="dotrikun.c"> <description>Dottori Kun (new version)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -152503,9 +152611,9 @@ <video screen="raster" orientation="horizontal" width="256" height="192" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="1" control="joy8way" buttons="2" coins="1"/> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="dotriku2" cloneof="dotrikun" romof="dotrikun"> + <game name="dotriku2" sourcefile="dotrikun.c" cloneof="dotrikun" romof="dotrikun"> <description>Dottori Kun (old version)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -152514,9 +152622,9 @@ <video screen="raster" orientation="horizontal" width="256" height="192" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="1" control="joy8way" buttons="2" coins="1"/> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="spcpostn"> + <game name="spcpostn" sourcefile="angelkds.c"> <description>Space Position (Japan)</description> <year>1986</year> <manufacturer>Sega / Nasco</manufacturer> @@ -152596,9 +152704,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="angelkds"> + <game name="angelkds" sourcefile="angelkds.c"> <description>Angel Kids (Japan)</description> <year>1988</year> <manufacturer>Sega / Nasco?</manufacturer> @@ -152687,9 +152795,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="alexkidd"> + <game name="alexkidd" sourcefile="system16.c"> <description>Alex Kidd: The Lost Stars (set 1)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -152782,9 +152890,9 @@ <dipvalue name="50"/> <dipvalue name="40"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aliensya" cloneof="aliensyn" romof="aliensyn"> + <game name="aliensya" sourcefile="system16.c" cloneof="aliensyn" romof="aliensyn"> <description>Alien Syndrome (set 2)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -152878,9 +152986,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aliensyb" cloneof="aliensyn" romof="aliensyn"> + <game name="aliensyb" sourcefile="system16.c" cloneof="aliensyn" romof="aliensyn"> <description>Alien Syndrome (set 3)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -152974,9 +153082,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aliensyj" cloneof="aliensyn" romof="aliensyn"> + <game name="aliensyj" sourcefile="system16.c" cloneof="aliensyn" romof="aliensyn"> <description>Alien Syndrome (Japan)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -153070,9 +153178,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="astorm"> + <game name="astorm" sourcefile="system18.c"> <description>Alien Storm</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -153167,9 +153275,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="astorm2p" cloneof="astorm" romof="astorm"> + <game name="astorm2p" sourcefile="system18.c" cloneof="astorm" romof="astorm"> <description>Alien Storm (2 Player)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -153264,9 +153372,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="auraila" cloneof="aurail" romof="aurail"> + <game name="auraila" sourcefile="system16.c" cloneof="aurail" romof="aurail"> <description>Aurail (set 2)</description> <year>1990</year> <manufacturer>Sega / Westone</manufacturer> @@ -153371,9 +153479,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bayrouta" cloneof="bayroute" romof="bayroute"> + <game name="bayrouta" sourcefile="system16.c" cloneof="bayroute" romof="bayroute"> <description>Bay Route (set 2)</description> <year>1989</year> <manufacturer>Sunsoft / Sega</manufacturer> @@ -153460,9 +153568,9 @@ <dipvalue name="C"/> <dipvalue name="D"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bayrtbl1" cloneof="bayroute" romof="bayroute"> + <game name="bayrtbl1" sourcefile="system16.c" cloneof="bayroute" romof="bayroute"> <description>Bay Route (bootleg set 1)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -153555,9 +153663,9 @@ <dipvalue name="C"/> <dipvalue name="D"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bayrtbl2" cloneof="bayroute" romof="bayroute"> + <game name="bayrtbl2" sourcefile="system16.c" cloneof="bayroute" romof="bayroute"> <description>Bay Route (bootleg set 2)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -153647,9 +153755,9 @@ <dipvalue name="C"/> <dipvalue name="D"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="enduror"> + <game name="enduror" sourcefile="sharrier.c"> <description>Enduro Racer</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -153770,9 +153878,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="eswat"> + <game name="eswat" sourcefile="system16.c"> <description>E-Swat - Cyber Police</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -153860,9 +153968,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fpoint"> + <game name="fpoint" sourcefile="system16.c"> <description>Flash Point</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -153946,9 +154054,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="goldnaxb" cloneof="goldnaxe" romof="goldnaxe"> + <game name="goldnaxb" sourcefile="system16.c" cloneof="goldnaxe" romof="goldnaxe"> <description>Golden Axe (Version 2 317-0110)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -154036,9 +154144,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="goldnaxc" cloneof="goldnaxe" romof="goldnaxe"> + <game name="goldnaxc" sourcefile="system16.c" cloneof="goldnaxe" romof="goldnaxe"> <description>Golden Axe (Version 2 317-0122)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -154126,9 +154234,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="goldnaxj" cloneof="goldnaxe" romof="goldnaxe"> + <game name="goldnaxj" sourcefile="system16.c" cloneof="goldnaxe" romof="goldnaxe"> <description>Golden Axe (Version 1, Japan)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -154218,9 +154326,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="jyuohki" cloneof="altbeast" romof="altbeast"> + <game name="jyuohki" sourcefile="system16.c" cloneof="altbeast" romof="altbeast"> <description>Jyuohki (Japan)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -154309,9 +154417,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="moonwalk"> + <game name="moonwalk" sourcefile="system18.c"> <description>Michael Jackson's Moonwalker (Set 1)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -154406,9 +154514,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="moonwlka" cloneof="moonwalk" romof="moonwalk"> + <game name="moonwlka" sourcefile="system18.c" cloneof="moonwalk" romof="moonwalk"> <description>Michael Jackson's Moonwalker (Set 2)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -154503,9 +154611,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="passsht"> + <game name="passsht" sourcefile="system16.c"> <description>Passing Shot (2 Players)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -154594,9 +154702,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sdioj" cloneof="sdi" romof="sdi"> + <game name="sdioj" sourcefile="system16.c" cloneof="sdi" romof="sdi"> <description>SDI - Strategic Defense Initiative (Japan)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -154684,9 +154792,9 @@ <dipvalue name="100000"/> <dipvalue name="None"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shangon"> + <game name="shangon" sourcefile="outrun.c"> <description>Super Hang-On</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -154793,9 +154901,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shinobia" cloneof="shinobi" romof="shinobi"> + <game name="shinobia" sourcefile="system16.c" cloneof="shinobi" romof="shinobi"> <description>Shinobi (set 2)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -154889,9 +154997,9 @@ <dipvalue name="Japanese" default="yes"/> <dipvalue name="English"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shinobib" cloneof="shinobi" romof="shinobi"> + <game name="shinobib" sourcefile="system16.c" cloneof="shinobi" romof="shinobi"> <description>Shinobi (set 3)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -154984,9 +155092,9 @@ <dipvalue name="Japanese" default="yes"/> <dipvalue name="English"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tetris"> + <game name="tetris" sourcefile="system16.c"> <description>Tetris (Sega Set 1)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -155068,9 +155176,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tetrisa" cloneof="tetris" romof="tetris"> + <game name="tetrisa" sourcefile="system16.c" cloneof="tetris" romof="tetris"> <description>Tetris (Sega Set 2)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -155152,9 +155260,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wb3a" cloneof="wb3" romof="wb3"> + <game name="wb3a" sourcefile="system16.c" cloneof="wb3" romof="wb3"> <description>Wonder Boy III - Monster Lair (set 2)</description> <year>1988</year> <manufacturer>Sega / Westone</manufacturer> @@ -155244,9 +155352,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aceattac"> + <game name="aceattac" sourcefile="system18.c"> <description>Ace Attacker</description> <manufacturer>Sega</manufacturer> <rom name="11491.4a" size="65536" crc="77b820f1" sha1="c33183c94c5029e2c4d6444f37404da66aacecc4" region="cpu1" offset="0"/> @@ -155339,9 +155447,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="afighter"> + <game name="afighter" sourcefile="system16.c"> <description>Action Fighter</description> <manufacturer>Sega</manufacturer> <rom name="10348" size="32768" crc="e51e3012" sha1="bb5522aacb55b5f04aa4cb7a642e202f0ddd7c84" region="cpu1" offset="0"/> @@ -155368,9 +155476,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bloxeed"> + <game name="bloxeed" sourcefile="system18.c"> <description>Bloxeed</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -155452,9 +155560,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cltchitr"> + <game name="cltchitr" sourcefile="system18.c"> <description>Clutch Hitter</description> <manufacturer>Sega</manufacturer> <rom name="epr13795.6a" size="262144" crc="b0b60b67" sha1="ee3325ddb7461008f556c1696157a766225b9ef5" region="cpu1" offset="0"/> @@ -155543,9 +155651,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cotton"> + <game name="cotton" sourcefile="system16.c"> <description>Cotton (Japan)</description> <manufacturer>Sega</manufacturer> <rom name="epr13858.a7" size="131072" crc="276f42fe" sha1="47d2f910f6f101628cb0c660e5fd12c0e331bd99" region="cpu1" offset="0"/> @@ -155582,9 +155690,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cottona" cloneof="cotton" romof="cotton"> + <game name="cottona" sourcefile="system16.c" cloneof="cotton" romof="cotton"> <description>Cotton</description> <manufacturer>Sega</manufacturer> <rom name="ep13921a.a7" size="131072" crc="f047a037" sha1="e4a9eeb1f2cf6b5ee3b2fcf74be917ffd3e6ca0e" region="cpu1" offset="0"/> @@ -155621,9 +155729,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ddcrew"> + <game name="ddcrew" sourcefile="system18.c"> <description>DD Crew</description> <manufacturer>Sega</manufacturer> <rom name="14153.6a" size="262144" crc="e01fae0c" sha1="7166f955324f73e94d8ae6d2a5b2f4b497e62933" region="cpu1" offset="0"/> @@ -155715,9 +155823,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dunkshot"> + <game name="dunkshot" sourcefile="system16.c"> <description>Dunk Shot</description> <manufacturer>Sega</manufacturer> <rom name="10468.bin" size="32768" crc="e2d5f97a" sha1="bf7b4a029580633fee65be89d5c9c83ff76a8484" region="cpu1" offset="0"/> @@ -155747,9 +155855,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="exctleag"> + <game name="exctleag" sourcefile="system16.c"> <description>Excite League</description> <manufacturer>Sega</manufacturer> <rom name="epr11937.a02" size="65536" crc="4ebda367" sha1="ab4db50eb0d2e10a3b4b7fc0f4bdc82412379809" region="cpu1" offset="0"/> @@ -155780,9 +155888,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lghost"> + <game name="lghost" sourcefile="system18.c"> <description>Laser Ghost</description> <manufacturer>Sega</manufacturer> <rom name="13429" size="131072" crc="0e0ccf26" sha1="072c39771f4d8806c05499bad9a0e7f63709333e" region="cpu1" offset="0"/> @@ -155874,9 +155982,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="loffire"> + <game name="loffire" sourcefile="aburner.c"> <description>Line of Fire</description> <manufacturer>Sega</manufacturer> <rom name="epr12850.rom" size="131072" crc="14598f2a" sha1="13a51529ed32acefd733d9f638621c3e023dbd6d" region="cpu1" offset="0"/> @@ -155980,9 +156088,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8208"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8208"/> </game> - <game name="mvp"> + <game name="mvp" sourcefile="system16.c"> <description>MVP</description> <manufacturer>Sega</manufacturer> <rom name="13000.rom" size="262144" crc="2e0e21ec" sha1="3b72da0746fb0ece4311d6e935bc6b9ece3549ec" region="cpu1" offset="0"/> @@ -156006,9 +156114,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ryukyu"> + <game name="ryukyu" sourcefile="system16.c"> <description>Ryukyu</description> <manufacturer>Sega</manufacturer> <rom name="13347" size="65536" crc="398031fa" sha1="5c118c85b7af1a83726b95bbeb85cb5020254f57" region="cpu1" offset="0"/> @@ -156028,9 +156136,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="suprleag"> + <game name="suprleag" sourcefile="system16.c"> <description>Super League</description> <manufacturer>Sega</manufacturer> <rom name="epr11131.a02" size="65536" crc="9b78c2cc" sha1="9a453dd999120590c52b17f8ff2b49fd2fde0b35" region="cpu1" offset="0"/> @@ -156061,9 +156169,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="thndrbld"> + <game name="thndrbld" sourcefile="aburner.c"> <description>Thunder Blade</description> <manufacturer>Sega</manufacturer> <rom name="thnbld.58" size="131072" crc="e057dd5a" sha1="4c032db4752dfb44dba3def5ee5377fffd94b79c" region="cpu1" offset="0"/> @@ -156170,9 +156278,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8208"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8208"/> </game> - <game name="thndrbdj" cloneof="thndrbld" romof="thndrbld"> + <game name="thndrbdj" sourcefile="aburner.c" cloneof="thndrbld" romof="thndrbld"> <description>Thunder Blade (Japan)</description> <manufacturer>Sega</manufacturer> <rom name="11304.epr" size="131072" crc="a90630ef" sha1="8f29e020119b2243b1c95e15546af1773327ae85" region="cpu1" offset="0"/> @@ -156279,9 +156387,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8208"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8208"/> </game> - <game name="toutrun"> + <game name="toutrun" sourcefile="outrun.c"> <description>Turbo Outrun (set 1)</description> <manufacturer>Sega</manufacturer> <rom name="epr12397.133" size="65536" crc="e4b57d7d" sha1="62be55356c82b38ebebcc87a5458e23300019339" region="cpu1" offset="0"/> @@ -156390,9 +156498,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="toutruna" cloneof="toutrun" romof="toutrun"> + <game name="toutruna" sourcefile="outrun.c" cloneof="toutrun" romof="toutrun"> <description>Turbo Outrun (set 2)</description> <manufacturer>Sega</manufacturer> <rom name="epr12410.133" size="65536" crc="aa74f3e9" sha1="2daf6b17317542063c0a40beea5b45c797192591" region="cpu1" offset="0"/> @@ -156501,9 +156609,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="aburner" cloneof="aburner2" romof="aburner2"> + <game name="aburner" sourcefile="aburner.c" cloneof="aburner2" romof="aburner2"> <description>After Burner (Japan)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -156607,9 +156715,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8208"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8208"/> </game> - <game name="aburner2"> + <game name="aburner2" sourcefile="aburner.c"> <description>After Burner II</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -156711,9 +156819,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8208"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8208"/> </game> - <game name="alexkida" cloneof="alexkidd" romof="alexkidd"> + <game name="alexkida" sourcefile="system16.c" cloneof="alexkidd" romof="alexkidd"> <description>Alex Kidd: The Lost Stars (set 2)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -156806,9 +156914,9 @@ <dipvalue name="50"/> <dipvalue name="40"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aliensyn"> + <game name="aliensyn" sourcefile="system16.c"> <description>Alien Syndrome (set 1)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -156902,9 +157010,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="altbeas2" cloneof="altbeast" romof="altbeast"> + <game name="altbeas2" sourcefile="system16.c" cloneof="altbeast" romof="altbeast"> <description>Altered Beast (Version 2)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -156993,9 +157101,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="altbeast"> + <game name="altbeast" sourcefile="system16.c"> <description>Altered Beast (Version 1)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -157084,9 +157192,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="astormbl" cloneof="astorm" romof="astorm"> + <game name="astormbl" sourcefile="system18.c" cloneof="astorm" romof="astorm"> <description>Alien Storm (bootleg)</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -157181,9 +157289,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="atomicp"> + <game name="atomicp" sourcefile="system16.c"> <description>Atomic Point</description> <year>1990</year> <manufacturer>Philko</manufacturer> @@ -157253,9 +157361,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="aurail"> + <game name="aurail" sourcefile="system16.c"> <description>Aurail (set 1)</description> <year>1990</year> <manufacturer>Sega / Westone</manufacturer> @@ -157360,9 +157468,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bayroute"> + <game name="bayroute" sourcefile="system16.c"> <description>Bay Route (set 1)</description> <year>1989</year> <manufacturer>Sunsoft / Sega</manufacturer> @@ -157455,9 +157563,9 @@ <dipvalue name="C"/> <dipvalue name="D"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bodyslam"> + <game name="bodyslam" sourcefile="system16.c"> <description>Body Slam</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -157560,9 +157668,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dduxbl"> + <game name="dduxbl" sourcefile="system16.c"> <description>Dynamite Dux (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -157650,9 +157758,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dumpmtmt" cloneof="bodyslam" romof="bodyslam"> + <game name="dumpmtmt" sourcefile="system16.c" cloneof="bodyslam" romof="bodyslam"> <description>Dump Matsumoto (Japan)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -157755,9 +157863,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="endurob2" cloneof="enduror" romof="enduror"> + <game name="endurob2" sourcefile="sharrier.c" cloneof="enduror" romof="enduror"> <description>Enduro Racer (bootleg set 2)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -157880,9 +157988,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="endurobl" cloneof="enduror" romof="enduror"> + <game name="endurobl" sourcefile="sharrier.c" cloneof="enduror" romof="enduror"> <description>Enduro Racer (bootleg set 1)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -158004,9 +158112,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="eswatbl" cloneof="eswat" romof="eswat"> + <game name="eswatbl" sourcefile="system16.c" cloneof="eswat" romof="eswat"> <description>E-Swat - Cyber Police (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -158098,9 +158206,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fantzone"> + <game name="fantzone" sourcefile="system16.c"> <description>Fantasy Zone (Japan New Ver.)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -158188,9 +158296,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fantzono" cloneof="fantzone" romof="fantzone"> + <game name="fantzono" sourcefile="system16.c" cloneof="fantzone" romof="fantzone"> <description>Fantasy Zone (Old Ver.)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -158278,9 +158386,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fpointbl" cloneof="fpoint" romof="fpoint"> + <game name="fpointbl" sourcefile="system16.c" cloneof="fpoint" romof="fpoint"> <description>Flash Point (World, bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -158365,9 +158473,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fpointbj" cloneof="fpoint" romof="fpoint"> + <game name="fpointbj" sourcefile="system16.c" cloneof="fpoint" romof="fpoint"> <description>Flash Point (Japan, bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -158455,9 +158563,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="goldnabl" cloneof="goldnaxe" romof="goldnaxe"> + <game name="goldnabl" sourcefile="system16.c" cloneof="goldnaxe" romof="goldnaxe"> <description>Golden Axe (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -158558,9 +158666,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="goldnaxa" cloneof="goldnaxe" romof="goldnaxe"> + <game name="goldnaxa" sourcefile="system16.c" cloneof="goldnaxe" romof="goldnaxe"> <description>Golden Axe (Version 2)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -158648,9 +158756,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="goldnaxe"> + <game name="goldnaxe" sourcefile="system16.c"> <description>Golden Axe (Version 1)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -158740,9 +158848,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="hangon"> + <game name="hangon" sourcefile="sharrier.c"> <description>Hang-On</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -158837,9 +158945,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="hwchamp"> + <game name="hwchamp" sourcefile="system16.c"> <description>Heavyweight Champ</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -158933,9 +159041,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjleague"> + <game name="mjleague" sourcefile="system16.c"> <description>Major League</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -159036,9 +159144,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="moonwlkb" cloneof="moonwalk" romof="moonwalk"> + <game name="moonwlkb" sourcefile="system18.c" cloneof="moonwalk" romof="moonwalk"> <description>Michael Jackson's Moonwalker (bootleg)</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -159139,9 +159247,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="outrun"> + <game name="outrun" sourcefile="outrun.c"> <description>Out Run (set 1)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -159244,9 +159352,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="outruna" cloneof="outrun" romof="outrun"> + <game name="outruna" sourcefile="outrun.c" cloneof="outrun" romof="outrun"> <description>Out Run (set 2)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -159349,9 +159457,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="outrunb" cloneof="outrun" romof="outrun"> + <game name="outrunb" sourcefile="outrun.c" cloneof="outrun" romof="outrun"> <description>Out Run (set 3)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -159462,9 +159570,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="passht4b" cloneof="passsht" romof="passsht"> + <game name="passht4b" sourcefile="system16.c" cloneof="passsht" romof="passsht"> <description>Passing Shot (4 Players) (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -159550,9 +159658,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="passshtb" cloneof="passsht" romof="passsht"> + <game name="passshtb" sourcefile="system16.c" cloneof="passsht" romof="passsht"> <description>Passing Shot (2 Players) (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -159641,9 +159749,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quartet"> + <game name="quartet" sourcefile="system16.c"> <description>Quartet</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -159740,9 +159848,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quartet2" cloneof="quartet" romof="quartet"> + <game name="quartet2" sourcefile="system16.c" cloneof="quartet" romof="quartet"> <description>Quartet 2</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -159841,9 +159949,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quartt2j" cloneof="quartet" romof="quartet"> + <game name="quartt2j" sourcefile="system16.c" cloneof="quartet" romof="quartet"> <description>Quartet 2 (Japan)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -159942,9 +160050,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quartetj" cloneof="quartet" romof="quartet"> + <game name="quartetj" sourcefile="system16.c" cloneof="quartet" romof="quartet"> <description>Quartet (Japan)</description> <year>1986</year> <manufacturer>Sega</manufacturer> @@ -160041,9 +160149,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="riotcity"> + <game name="riotcity" sourcefile="system16.c"> <description>Riot City</description> <year>1991</year> <manufacturer>Sega / Westone</manufacturer> @@ -160136,9 +160244,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sdi"> + <game name="sdi" sourcefile="system16.c"> <description>SDI - Strategic Defense Initiative</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -160226,9 +160334,9 @@ <dipvalue name="100000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shangonb" cloneof="shangon" romof="shangon"> + <game name="shangonb" sourcefile="outrun.c" cloneof="shangon" romof="shangon"> <description>Super Hang-On (bootleg)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -160333,9 +160441,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sharrier"> + <game name="sharrier" sourcefile="sharrier.c"> <description>Space Harrier</description> <year>1985</year> <manufacturer>Sega</manufacturer> @@ -160461,9 +160569,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shdancbl" cloneof="shdancer" romof="shdancer"> + <game name="shdancbl" sourcefile="system18.c" cloneof="shdancer" romof="shdancer"> <description>Shadow Dancer (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -160585,9 +160693,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shdancer"> + <game name="shdancer" sourcefile="system18.c"> <description>Shadow Dancer (US)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -160676,9 +160784,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shdancrj" cloneof="shdancer" romof="shdancer"> + <game name="shdancrj" sourcefile="system18.c" cloneof="shdancer" romof="shdancer"> <description>Shadow Dancer (Japan)</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -160767,9 +160875,9 @@ <dipvalue name="3.00" default="yes"/> <dipvalue name="3.30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shinobi"> + <game name="shinobi" sourcefile="system16.c"> <description>Shinobi (set 1)</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -160862,9 +160970,9 @@ <dipvalue name="Japanese" default="yes"/> <dipvalue name="English"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shinobl" cloneof="shinobi" romof="shinobi"> + <game name="shinobl" sourcefile="system16.c" cloneof="shinobi" romof="shinobi"> <description>Shinobi (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -160958,9 +161066,9 @@ <dipvalue name="Japanese" default="yes"/> <dipvalue name="English"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tetrisbl" cloneof="tetris" romof="tetris"> + <game name="tetrisbl" sourcefile="system16.c" cloneof="tetris" romof="tetris"> <description>Tetris (Sega bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -161042,9 +161150,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="timscanr"> + <game name="timscanr" sourcefile="system16.c"> <description>Time Scanner</description> <year>1987</year> <manufacturer>Sega</manufacturer> @@ -161174,9 +161282,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="toryumon"> + <game name="toryumon" sourcefile="system16.c"> <description>Toryumon</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -161268,9 +161376,9 @@ <dipvalue name="Hard+4"/> <dipvalue name="Hard+5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tturf"> + <game name="tturf" sourcefile="system16.c"> <description>Tough Turf (Japan)</description> <year>1989</year> <manufacturer>Sega / Sunsoft</manufacturer> @@ -161359,9 +161467,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="tturfbl" cloneof="tturf" romof="tturf"> + <game name="tturfbl" sourcefile="system16.c" cloneof="tturf" romof="tturf"> <description>Tough Turf (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -161451,9 +161559,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="tturfu" cloneof="tturf" romof="tturf"> + <game name="tturfu" sourcefile="system16.c" cloneof="tturf" romof="tturf"> <description>Tough Turf (US)</description> <year>1989</year> <manufacturer>Sega / Sunsoft</manufacturer> @@ -161546,9 +161654,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="wb3"> + <game name="wb3" sourcefile="system16.c"> <description>Wonder Boy III - Monster Lair (set 1)</description> <year>1988</year> <manufacturer>Sega / Westone</manufacturer> @@ -161638,9 +161746,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wb3bl" cloneof="wb3" romof="wb3"> + <game name="wb3bl" sourcefile="system16.c" cloneof="wb3" romof="wb3"> <description>Wonder Boy III - Monster Lair (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -161732,9 +161840,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wrestwar"> + <game name="wrestwar" sourcefile="system16.c"> <description>Wrestle War</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -161831,9 +161939,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="hotrod"> + <game name="hotrod" sourcefile="system24.c"> <description>Hot Rod (turbo 3 player)</description> <year>1988</year> <manufacturer>Sega</manufacturer> @@ -161915,9 +162023,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="bnzabros"> + <game name="bnzabros" sourcefile="system24.c"> <description>Bonanza Bros</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -161999,9 +162107,9 @@ <dipvalue name="2"/> <dipvalue name="1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="dcclub"> + <game name="dcclub" sourcefile="system24.c"> <description>Dynamic Country Club</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -162084,9 +162192,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="mahmajn"> + <game name="mahmajn" sourcefile="system24.c"> <description>Tokoro San no MahMahjan</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -162171,9 +162279,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="qgh"> + <game name="qgh" sourcefile="system24.c"> <description>Quiz Ghost Hunter</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -162258,9 +162366,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="quizmeku"> + <game name="quizmeku" sourcefile="system24.c"> <description>Quiz Mekurumeku Story</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -162343,9 +162451,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="qrouka"> + <game name="qrouka" sourcefile="system24.c"> <description>Quiz Rouka Ni Tattenasai</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -162424,9 +162532,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="mahmajn2"> + <game name="mahmajn2" sourcefile="system24.c"> <description>Tokoro San no MahMahjan 2</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -162511,9 +162619,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="sspirits"> + <game name="sspirits" sourcefile="system24.c"> <description>Scramble Spirits</description> <manufacturer>Sega</manufacturer> <rom name="epr12187.ic2" size="131072" crc="e83783f3" sha1="4b3b32df7de85aef9cd77c8a4ffc17e10466b638" region="cpu1" offset="0"/> @@ -162590,9 +162698,9 @@ <dipvalue name="2"/> <dipvalue name="1"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="sgmast"> + <game name="sgmast" sourcefile="system24.c"> <description>Super Masters Golf</description> <manufacturer>Sega</manufacturer> <rom name="epr12187.ic2" size="131072" crc="e83783f3" sha1="4b3b32df7de85aef9cd77c8a4ffc17e10466b638" region="cpu1" offset="0"/> @@ -162669,9 +162777,9 @@ <dipvalue name="2"/> <dipvalue name="1"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="qsww"> + <game name="qsww" sourcefile="system24.c"> <description>Quiz Syukudai wo Wasuremashita</description> <manufacturer>Sega</manufacturer> <rom name="epr12187.ic2" size="131072" crc="e83783f3" sha1="4b3b32df7de85aef9cd77c8a4ffc17e10466b638" region="cpu1" offset="0"/> @@ -162748,9 +162856,9 @@ <dipvalue name="2"/> <dipvalue name="1"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="gground"> + <game name="gground" sourcefile="system24.c"> <description>Gain Ground</description> <manufacturer>Sega</manufacturer> <rom name="epr12187.ic2" size="131072" crc="e83783f3" sha1="4b3b32df7de85aef9cd77c8a4ffc17e10466b638" region="cpu1" offset="0"/> @@ -162827,9 +162935,9 @@ <dipvalue name="2"/> <dipvalue name="1"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="crkdown"> + <game name="crkdown" sourcefile="system24.c"> <description>Crackdown</description> <manufacturer>Sega</manufacturer> <rom name="epr12187.ic2" size="131072" crc="e83783f3" sha1="4b3b32df7de85aef9cd77c8a4ffc17e10466b638" region="cpu1" offset="0"/> @@ -162906,9 +163014,9 @@ <dipvalue name="2"/> <dipvalue name="1"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="holo"> + <game name="holo" sourcefile="system32.c"> <description>Holosseum</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -162936,9 +163044,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="svf"> + <game name="svf" sourcefile="system32.c"> <description>Super Visual Football: European Sega Cup</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -162968,9 +163076,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="svs" cloneof="svf" romof="svf"> + <game name="svs" sourcefile="system32.c" cloneof="svf" romof="svf"> <description>Super Visual Soccer: Sega Cup (US)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -163000,9 +163108,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="jleague" cloneof="svf" romof="svf"> + <game name="jleague" sourcefile="system32.c" cloneof="svf" romof="svf"> <description>The J.League 1994 (Japan)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -163032,9 +163140,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="brival"> + <game name="brival" sourcefile="system32.c"> <description>Burning Rival (Japan)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163063,9 +163171,9 @@ <video screen="raster" orientation="horizontal" width="416" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="radm"> + <game name="radm" sourcefile="system32.c"> <description>Rad Mobile</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -163113,9 +163221,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="radr"> + <game name="radr" sourcefile="system32.c"> <description>Rad Rally</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -163163,9 +163271,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="f1en"> + <game name="f1en" sourcefile="system32.c"> <description>F1 Exhaust Note</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -163212,9 +163320,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="alien3"> + <game name="alien3" sourcefile="system32.c"> <description>Alien3: The Gun</description> <year>1993</year> <manufacturer>Sega</manufacturer> @@ -163244,9 +163352,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="sonic"> + <game name="sonic" sourcefile="system32.c"> <description>Segasonic the Hedgehog (Japan rev. C)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163276,9 +163384,9 @@ <video screen="raster" orientation="horizontal" width="416" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="3" control="trackball" buttons="1" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="sonicp" cloneof="sonic" romof="sonic"> + <game name="sonicp" sourcefile="system32.c" cloneof="sonic" romof="sonic"> <description>Segasonic the Hedgehog (Japan prototype)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163310,9 +163418,9 @@ <video screen="raster" orientation="horizontal" width="416" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="3" control="trackball" buttons="1" coins="3" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="jpark"> + <game name="jpark" sourcefile="system32.c"> <description>Jurassic Park</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -163343,9 +163451,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="ga2"> + <game name="ga2" sourcefile="system32.c"> <description>Golden Axe: The Revenge of Death Adder (US)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163376,9 +163484,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="ga2j" cloneof="ga2" romof="ga2"> + <game name="ga2j" sourcefile="system32.c" cloneof="ga2" romof="ga2"> <description>Golden Axe: The Revenge of Death Adder (Japan)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163409,9 +163517,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="spidey"> + <game name="spidey" sourcefile="system32.c"> <description>Spider-Man: The Videogame (US)</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -163443,9 +163551,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="spideyj" cloneof="spidey" romof="spidey"> + <game name="spideyj" sourcefile="system32.c" cloneof="spidey" romof="spidey"> <description>Spider-Man: The Videogame (Japan)</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -163477,9 +163585,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="arabfgt"> + <game name="arabfgt" sourcefile="system32.c"> <description>Arabian Fight</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163509,9 +163617,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16384"/> </game> - <game name="f1lap"> + <game name="f1lap" sourcefile="system32.c"> <description>F1 Super Lap</description> <year>1993</year> <manufacturer>Sega</manufacturer> @@ -163542,9 +163650,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" control="stick" buttons="4" coins="1" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="dbzvrvs"> + <game name="dbzvrvs" sourcefile="system32.c"> <description>Dragon Ball Z V.R.V.S.</description> <year>1994</year> <manufacturer>Sega / Banpresto</manufacturer> @@ -163572,9 +163680,9 @@ <video screen="raster" orientation="horizontal" width="416" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="darkedge"> + <game name="darkedge" sourcefile="system32.c"> <description>Dark Edge</description> <year>1993</year> <manufacturer>Sega</manufacturer> @@ -163601,9 +163709,9 @@ <video screen="raster" orientation="horizontal" width="416" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="5" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="slipstrm"> + <game name="slipstrm" sourcefile="system32.c"> <description>Slipstream</description> <year>1995</year> <manufacturer>Capcom</manufacturer> @@ -163632,9 +163740,9 @@ <video screen="raster" orientation="horizontal" width="416" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="orunners"> + <game name="orunners" sourcefile="multi32.c"> <description>Outrunners (US)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163667,9 +163775,9 @@ <dipvalue name="A and B"/> <dipvalue name="B only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="harddunk"> + <game name="harddunk" sourcefile="multi32.c"> <description>Hard Dunk (World)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -163700,9 +163808,9 @@ <dipvalue name="A and B"/> <dipvalue name="B only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="harddunj" cloneof="harddunk" romof="harddunk"> + <game name="harddunj" sourcefile="multi32.c" cloneof="harddunk" romof="harddunk"> <description>Hard Dunk (Japan)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -163733,9 +163841,9 @@ <dipvalue name="A and B"/> <dipvalue name="B only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="titlef"> + <game name="titlef" sourcefile="multi32.c"> <description>Title Fight</description> <manufacturer>Sega</manufacturer> <rom name="tf-15386.rom" size="262144" crc="7ceaf15d" sha1="0295ac248e5814fbe7caecb346ccbcaf8abf67dc" region="cpu1" offset="0"/> @@ -163759,9 +163867,9 @@ <video screen="raster" orientation="horizontal" width="832" height="448" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="4" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="scross"> + <game name="scross" sourcefile="multi32.c"> <description>Stadium Cross (World)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -163794,9 +163902,9 @@ <dipvalue name="A and B"/> <dipvalue name="B only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="astrass" romof="stvbios"> + <game name="astrass" sourcefile="stv.c" romof="stvbios"> <description>Astra SuperStars</description> <year>1998</year> <manufacturer>Sunsoft</manufacturer> @@ -163892,9 +164000,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="bakubaku" romof="stvbios"> + <game name="bakubaku" sourcefile="stv.c" romof="stvbios"> <description>Baku Baku Animal</description> <year>1996</year> <manufacturer>Sega</manufacturer> @@ -163986,9 +164094,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="colmns97" romof="stvbios"> + <game name="colmns97" sourcefile="stv.c" romof="stvbios"> <description>Columns 97</description> <year>1996</year> <manufacturer>Sega</manufacturer> @@ -164078,9 +164186,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="cotton2" romof="stvbios"> + <game name="cotton2" sourcefile="stv.c" romof="stvbios"> <description>Cotton 2</description> <year>1997</year> <manufacturer>Success</manufacturer> @@ -164175,9 +164283,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="cottonbm" romof="stvbios"> + <game name="cottonbm" sourcefile="stv.c" romof="stvbios"> <description>Cotton Boomerang</description> <year>1998</year> <manufacturer>Success</manufacturer> @@ -164271,9 +164379,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="decathlt" romof="stvbios"> + <game name="decathlt" sourcefile="stv.c" romof="stvbios"> <description>Decathlete</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -164366,9 +164474,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="diehard" romof="stvbios"> + <game name="diehard" sourcefile="stv.c" romof="stvbios"> <description>Die Hard Arcade (US)</description> <year>1996</year> <manufacturer>Sega</manufacturer> @@ -164460,9 +164568,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="dnmtdeka" cloneof="diehard" romof="diehard"> + <game name="dnmtdeka" sourcefile="stv.c" cloneof="diehard" romof="diehard"> <description>Dynamite Deka (Japan)</description> <year>1996</year> <manufacturer>Sega</manufacturer> @@ -164554,9 +164662,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="ejihon" romof="stvbios"> + <game name="ejihon" sourcefile="stv.c" romof="stvbios"> <description>Ejihon Tantei Jimusyo</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -164649,9 +164757,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="elandore" romof="stvbios"> + <game name="elandore" sourcefile="stv.c" romof="stvbios"> <description>Fighting Dragon Legend Elan Doree</description> <year>1998</year> <manufacturer>Sai-Mate</manufacturer> @@ -164746,9 +164854,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="ffreveng" romof="stvbios"> + <game name="ffreveng" sourcefile="stv.c" romof="stvbios"> <description>Final Fight Revenge</description> <year>1999</year> <manufacturer>Capcom</manufacturer> @@ -164842,9 +164950,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="fhboxers" romof="stvbios"> + <game name="fhboxers" sourcefile="stv.c" romof="stvbios"> <description>Funky Head Boxers</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -164941,9 +165049,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="findlove" romof="stvbios"> + <game name="findlove" sourcefile="stv.c" romof="stvbios"> <description>Find Love</description> <year>1996</year> <manufacturer>Daiki</manufacturer> @@ -165043,9 +165151,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="finlarch" cloneof="sleague" romof="sleague"> + <game name="finlarch" sourcefile="stv.c" cloneof="sleague" romof="sleague"> <description>Final Arch (Japan)</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -165137,9 +165245,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="gaxeduel" romof="stvbios"> + <game name="gaxeduel" sourcefile="stv.c" romof="stvbios"> <description>Golden Axe - The Duel</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -165233,9 +165341,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="grdforce" romof="stvbios"> + <game name="grdforce" sourcefile="stv.c" romof="stvbios"> <description>Guardian Force</description> <year>1998</year> <manufacturer>Success</manufacturer> @@ -165328,9 +165436,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="groovef" romof="stvbios"> + <game name="groovef" sourcefile="stv.c" romof="stvbios"> <description>Power Instinct 3 - Groove On Fight</description> <year>1996</year> <manufacturer>Atlus</manufacturer> @@ -165426,9 +165534,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="imperfect" palettesize="2048"/> + <driver status="preliminary" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="hanagumi" romof="stvbios"> + <game name="hanagumi" sourcefile="stv.c" romof="stvbios"> <description>Hanagumi Taisen Columns - Sakura Wars</description> <year>1998</year> <manufacturer>Sega</manufacturer> @@ -165527,9 +165635,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="introdon" romof="stvbios"> + <game name="introdon" sourcefile="stv.c" romof="stvbios"> <description>Karaoke Quiz Intro Don Don!</description> <year>1996</year> <manufacturer>Sunsoft / Success</manufacturer> @@ -165624,9 +165732,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="kiwames" romof="stvbios"> + <game name="kiwames" sourcefile="stv.c" romof="stvbios"> <description>Pro Mahjong Kiwame S</description> <year>1995</year> <manufacturer>Athena</manufacturer> @@ -165717,9 +165825,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="maruchan" romof="stvbios"> + <game name="maruchan" sourcefile="stv.c" romof="stvbios"> <description>Maru-Chan de Goo!</description> <year>1997</year> <manufacturer>Sega</manufacturer> @@ -165815,9 +165923,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="myfairld" romof="stvbios"> + <game name="myfairld" sourcefile="stv.c" romof="stvbios"> <description>Virtual Mahjong 2 - My Fair Lady</description> <year>1998</year> <manufacturer>Micronet</manufacturer> @@ -165912,9 +166020,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="othellos" romof="stvbios"> + <game name="othellos" sourcefile="stv.c" romof="stvbios"> <description>Othello Shiyouyo</description> <year>1998</year> <manufacturer>Success</manufacturer> @@ -166006,9 +166114,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="pblbeach" romof="stvbios"> + <game name="pblbeach" sourcefile="stv.c" romof="stvbios"> <description>Pebble Beach - The Great Shot</description> <year>1995</year> <manufacturer>TandE Soft</manufacturer> @@ -166100,9 +166208,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="prikura" romof="stvbios"> + <game name="prikura" sourcefile="stv.c" romof="stvbios"> <description>Princess Clara Daisakusen</description> <year>1996</year> <manufacturer>Atlus</manufacturer> @@ -166194,9 +166302,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="imperfect" palettesize="2048"/> + <driver status="preliminary" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="puyosun" romof="stvbios"> + <game name="puyosun" sourcefile="stv.c" romof="stvbios"> <description>Puyo Puyo Sun</description> <year>1996</year> <manufacturer>Compile</manufacturer> @@ -166292,9 +166400,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="rsgun" romof="stvbios"> + <game name="rsgun" sourcefile="stv.c" romof="stvbios"> <description>Radiant Silvergun</description> <year>1998</year> <manufacturer>Treasure</manufacturer> @@ -166386,9 +166494,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="sandor" romof="stvbios"> + <game name="sandor" sourcefile="stv.c" romof="stvbios"> <description>Sando-R</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -166480,9 +166588,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="thunt" cloneof="sandor" romof="sandor"> + <game name="thunt" sourcefile="stv.c" cloneof="sandor" romof="sandor"> <description>Treasure Hunt</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -166575,9 +166683,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="sassisu" romof="stvbios"> + <game name="sassisu" sourcefile="stv.c" romof="stvbios"> <description>Taisen Tanto-R Sashissu!!</description> <year>1996</year> <manufacturer>Sega</manufacturer> @@ -166671,9 +166779,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="seabass" romof="stvbios"> + <game name="seabass" sourcefile="stv.c" romof="stvbios"> <description>Sea Bass Fishing</description> <year>1998</year> <manufacturer>A Wave inc. (Able license)</manufacturer> @@ -166769,9 +166877,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="shanhigw" romof="stvbios"> + <game name="shanhigw" sourcefile="stv.c" romof="stvbios"> <description>Shanghai - The Great Wall - Shanghai Triple Threat</description> <year>1995</year> <manufacturer>Sunsoft / Activision</manufacturer> @@ -166860,9 +166968,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="shienryu" romof="stvbios"> + <game name="shienryu" sourcefile="stv.c" romof="stvbios"> <description>Shienryu</description> <year>1997</year> <manufacturer>Warashi</manufacturer> @@ -166952,9 +167060,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="sleague" romof="stvbios"> + <game name="sleague" sourcefile="stv.c" romof="stvbios"> <description>Super Major League (US)</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -167047,9 +167155,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="sokyugrt" romof="stvbios"> + <game name="sokyugrt" sourcefile="stv.c" romof="stvbios"> <description>Soukyugurentai - Terra Diver</description> <year>1996</year> <manufacturer>Raizing</manufacturer> @@ -167141,9 +167249,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="sss" romof="stvbios"> + <game name="sss" sourcefile="stv.c" romof="stvbios"> <description>Steep Slope Sliders</description> <year>1998</year> <manufacturer>Victor / Cave / Capcom</manufacturer> @@ -167236,9 +167344,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="suikoenb" romof="stvbios"> + <game name="suikoenb" sourcefile="stv.c" romof="stvbios"> <description>Suikoenbu</description> <year>1995</year> <manufacturer>Data East</manufacturer> @@ -167334,9 +167442,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="twcup98" romof="stvbios"> + <game name="twcup98" sourcefile="stv.c" romof="stvbios"> <description>Tecmo World Cup '98</description> <year>1998</year> <manufacturer>Tecmo</manufacturer> @@ -167428,9 +167536,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="vfkids" romof="stvbios"> + <game name="vfkids" sourcefile="stv.c" romof="stvbios"> <description>Virtua Fighter Kids</description> <year>1996</year> <manufacturer>Sega</manufacturer> @@ -167527,9 +167635,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="vfremix" romof="stvbios"> + <game name="vfremix" sourcefile="stv.c" romof="stvbios"> <description>Virtua Fighter Remix</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -167623,9 +167731,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="vmahjong" romof="stvbios"> + <game name="vmahjong" sourcefile="stv.c" romof="stvbios"> <description>Virtual Mahjong</description> <year>1997</year> <manufacturer>Micronet</manufacturer> @@ -167720,9 +167828,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="winterht" romof="stvbios"> + <game name="winterht" sourcefile="stv.c" romof="stvbios"> <description>Winter Heat</description> <year>1997</year> <manufacturer>Sega</manufacturer> @@ -167817,9 +167925,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="znpwfv" romof="stvbios"> + <game name="znpwfv" sourcefile="stv.c" romof="stvbios"> <description>Zen Nippon Pro-Wrestling Featuring Virtua</description> <year>1997</year> <manufacturer>Sega</manufacturer> @@ -167916,9 +168024,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="danchih" romof="stvbios"> + <game name="danchih" sourcefile="stv.c" romof="stvbios"> <description>Danchi de Hanafuda</description> <year>1999</year> <manufacturer>Altron (Tecmo license)</manufacturer> @@ -168010,9 +168118,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="mausuke" romof="stvbios"> + <game name="mausuke" sourcefile="stv.c" romof="stvbios"> <description>Mausuke no Ojama the World</description> <year>1995</year> <manufacturer>Data East</manufacturer> @@ -168107,9 +168215,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="batmanfr" romof="stvbios"> + <game name="batmanfr" sourcefile="stv.c" romof="stvbios"> <description>Batman Forever</description> <year>1996</year> <manufacturer>Acclaim</manufacturer> @@ -168210,9 +168318,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="sfish2"> + <game name="sfish2" sourcefile="stv.c"> <description>Sport Fishing 2</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -168299,9 +168407,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="sfish2j" cloneof="sfish2" romof="sfish2"> + <game name="sfish2j" sourcefile="stv.c" cloneof="sfish2" romof="sfish2"> <description>Sport Fishing 2 (Japan)</description> <year>1995</year> <manufacturer>Sega</manufacturer> @@ -168387,9 +168495,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="logicpro"> + <game name="logicpro" sourcefile="deniam.c"> <description>Logic Pro (Japan)</description> <year>1996</year> <manufacturer>Deniam</manufacturer> @@ -168435,9 +168543,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="croquis" cloneof="logicpro" romof="logicpro"> + <game name="croquis" sourcefile="deniam.c" cloneof="logicpro" romof="logicpro"> <description>Croquis (Germany)</description> <year>1996</year> <manufacturer>Deniam</manufacturer> @@ -168483,9 +168591,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="karianx"> + <game name="karianx" sourcefile="deniam.c"> <description>Karian Cross (Rev. 1.0)</description> <year>1996</year> <manufacturer>Deniam</manufacturer> @@ -168537,9 +168645,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="logicpr2"> + <game name="logicpr2" sourcefile="deniam.c"> <description>Logic Pro 2 (Japan)</description> <year>1997</year> <manufacturer>Deniam</manufacturer> @@ -168582,9 +168690,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="bloxeedc" cloneof="bloxeed" romof="bloxeed"> + <game name="bloxeedc" sourcefile="segac2.c" cloneof="bloxeed" romof="bloxeed"> <description>Bloxeed (C System)</description> <year>1989</year> <manufacturer>Sega / Elorg</manufacturer> @@ -168666,9 +168774,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="columns"> + <game name="columns" sourcefile="segac2.c"> <description>Columns (US)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -168746,9 +168854,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="columnsj" cloneof="columns" romof="columns"> + <game name="columnsj" sourcefile="segac2.c" cloneof="columns" romof="columns"> <description>Columns (Japan)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -168826,9 +168934,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="columns2"> + <game name="columns2" sourcefile="segac2.c"> <description>Columns II - The Voyage Through Time (Japan)</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -168904,9 +169012,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="borench"> + <game name="borench" sourcefile="segac2.c"> <description>Borench</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -168982,9 +169090,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tfrceac"> + <game name="tfrceac" sourcefile="segac2.c"> <description>ThunderForce AC</description> <year>1990</year> <manufacturer>Sega / Technosoft</manufacturer> @@ -169062,9 +169170,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tfrceacj" cloneof="tfrceac" romof="tfrceac"> + <game name="tfrceacj" sourcefile="segac2.c" cloneof="tfrceac" romof="tfrceac"> <description>ThunderForce AC (Japan)</description> <year>1990</year> <manufacturer>Sega / Technosoft</manufacturer> @@ -169142,9 +169250,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tfrceacb" cloneof="tfrceac" romof="tfrceac"> + <game name="tfrceacb" sourcefile="segac2.c" cloneof="tfrceac" romof="tfrceac"> <description>ThunderForce AC (bootleg)</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -169222,9 +169330,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ribbit"> + <game name="ribbit" sourcefile="segac2.c"> <description>Ribbit!</description> <year>1991</year> <manufacturer>Sega</manufacturer> @@ -169304,9 +169412,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tantr"> + <game name="tantr" sourcefile="segac2.c"> <description>Tant-R (Puzzle & Action) (Japan)</description> <year>1992</year> <manufacturer>Sega</manufacturer> @@ -169388,9 +169496,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tantrbl" cloneof="tantr" romof="tantr"> + <game name="tantrbl" sourcefile="segac2.c" cloneof="tantr" romof="tantr"> <description>Tant-R (Puzzle & Action) (Japan) (bootleg set 1)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -169473,9 +169581,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tantrbl2" cloneof="tantr" romof="tantr"> + <game name="tantrbl2" sourcefile="segac2.c" cloneof="tantr" romof="tantr"> <description>Tant-R (Puzzle & Action) (Japan) (bootleg set 2)</description> <year>1994</year> <manufacturer>bootleg</manufacturer> @@ -169555,9 +169663,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="puyopuyo"> + <game name="puyopuyo" sourcefile="segac2.c"> <description>Puyo Puyo (Japan)</description> <year>1992</year> <manufacturer>Sega / Compile</manufacturer> @@ -169639,9 +169747,9 @@ <dipvalue name="No Use" default="yes"/> <dipvalue name="In Use"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="puyopuya" cloneof="puyopuyo" romof="puyopuyo"> + <game name="puyopuya" sourcefile="segac2.c" cloneof="puyopuyo" romof="puyopuyo"> <description>Puyo Puyo (Japan) (Rev A)</description> <year>1992</year> <manufacturer>Sega / Compile</manufacturer> @@ -169723,9 +169831,9 @@ <dipvalue name="No Use" default="yes"/> <dipvalue name="In Use"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="puyopuyb" cloneof="puyopuyo" romof="puyopuyo"> + <game name="puyopuyb" sourcefile="segac2.c" cloneof="puyopuyo" romof="puyopuyo"> <description>Puyo Puyo (English) (bootleg)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -169807,9 +169915,9 @@ <dipvalue name="No Use" default="yes"/> <dipvalue name="In Use"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ichidant"> + <game name="ichidant" sourcefile="segac2.c"> <description>Ichidant-R (Puzzle & Action 2) (Japan)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -169891,9 +169999,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ichidnte" cloneof="ichidant" romof="ichidant"> + <game name="ichidnte" sourcefile="segac2.c" cloneof="ichidant" romof="ichidant"> <description>Ichidant-R (Puzzle & Action 2) (English)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -169975,9 +170083,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ichidntb" cloneof="ichidant" romof="ichidant"> + <game name="ichidntb" sourcefile="segac2.c" cloneof="ichidant" romof="ichidant"> <description>Ichidant-R (Puzzle & Action 2) (Japan) (bootleg)</description> <year>1994</year> <manufacturer>bootleg</manufacturer> @@ -170057,9 +170165,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="stkclmns"> + <game name="stkclmns" sourcefile="segac2.c"> <description>Stack Columns (Japan)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -170145,9 +170253,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="puyopuy2"> + <game name="puyopuy2" sourcefile="segac2.c"> <description>Puyo Puyo 2 (Japan)</description> <year>1994</year> <manufacturer>Compile (Sega license)</manufacturer> @@ -170225,9 +170333,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="potopoto"> + <game name="potopoto" sourcefile="segac2.c"> <description>Poto Poto (Japan)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -170307,9 +170415,9 @@ <dipvalue name="No Use" default="yes"/> <dipvalue name="In Use"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="zunkyou"> + <game name="zunkyou" sourcefile="segac2.c"> <description>Zunzunkyou No Yabou (Japan)</description> <year>1994</year> <manufacturer>Sega</manufacturer> @@ -170391,9 +170499,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pclubj"> + <game name="pclubj" sourcefile="segac2.c"> <description>Print Club (Japan Vol.1)</description> <year>1995</year> <manufacturer>Atlus</manufacturer> @@ -170471,9 +170579,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pclubjv2" cloneof="pclubj" romof="pclubj"> + <game name="pclubjv2" sourcefile="segac2.c" cloneof="pclubj" romof="pclubj"> <description>Print Club (Japan Vol.2)</description> <year>1995</year> <manufacturer>Atlus</manufacturer> @@ -170551,9 +170659,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pclubjv4" cloneof="pclubj" romof="pclubj"> + <game name="pclubjv4" sourcefile="segac2.c" cloneof="pclubj" romof="pclubj"> <description>Print Club (Japan Vol.4)</description> <year>1996</year> <manufacturer>Atlus</manufacturer> @@ -170631,9 +170739,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pclubjv5" cloneof="pclubj" romof="pclubj"> + <game name="pclubjv5" sourcefile="segac2.c" cloneof="pclubj" romof="pclubj"> <description>Print Club (Japan Vol.5)</description> <year>1996</year> <manufacturer>Atlus</manufacturer> @@ -170711,9 +170819,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="puckpkmn"> + <game name="puckpkmn" sourcefile="segac2.c"> <description>Puckman Pockimon</description> <year>2000</year> <manufacturer>Genie</manufacturer> @@ -170785,9 +170893,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mt_beast" romof="megatech"> + <game name="mt_beast" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Altered Beast</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -170866,9 +170974,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2080"/> </game> - <game name="mt_shar2" romof="megatech"> + <game name="mt_shar2" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Space Harrier 2.</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -170947,9 +171055,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_stbld" romof="megatech"> + <game name="mt_stbld" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Super Thunder Blade</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171028,9 +171136,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_ggolf" romof="megatech"> + <game name="mt_ggolf" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Great Golf</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171109,9 +171217,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_gsocr" romof="megatech"> + <game name="mt_gsocr" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Great Soccer</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171190,9 +171298,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_shnbi" romof="megatech"> + <game name="mt_shnbi" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Shinobi</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171271,9 +171379,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_aftrb" romof="megatech"> + <game name="mt_aftrb" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Afterburner</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171352,9 +171460,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_tfor2" romof="megatech"> + <game name="mt_tfor2" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Thunder Force 2</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171433,9 +171541,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_astro" romof="megatech"> + <game name="mt_astro" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Astro Warrior</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171514,9 +171622,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_lastb" romof="megatech"> + <game name="mt_lastb" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Last Battle.</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171595,9 +171703,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_wcsoc" romof="megatech"> + <game name="mt_wcsoc" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: World Cup Soccer</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171676,9 +171784,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_tetri" romof="megatech"> + <game name="mt_tetri" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Tetris</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171758,9 +171866,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_gng" romof="megatech"> + <game name="mt_gng" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Ghouls and Ghosts</description> <year>1989</year> <manufacturer>Capcom / Sega</manufacturer> @@ -171840,9 +171948,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_gaxe" romof="megatech"> + <game name="mt_gaxe" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Golden Axe</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -171921,9 +172029,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_mystd" romof="megatech"> + <game name="mt_mystd" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Mystic Defender</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172002,9 +172110,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_revsh" romof="megatech"> + <game name="mt_revsh" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: The Revenge Of Shinobi</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172083,9 +172191,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_parlg" romof="megatech"> + <game name="mt_parlg" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Parlour Games</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172164,9 +172272,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_tgolf" romof="megatech"> + <game name="mt_tgolf" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Arnold Palmer Tournament Golf</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172245,9 +172353,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_tlbba" romof="megatech"> + <game name="mt_tlbba" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Tommy Lasorda Baseball</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172326,9 +172434,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_eswat" romof="megatech"> + <game name="mt_eswat" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: E-Swat</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172407,9 +172515,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_smgp" romof="megatech"> + <game name="mt_smgp" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Super Monaco Grand Prix</description> <year>1990</year> <manufacturer>Sega</manufacturer> @@ -172488,9 +172596,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_mwalk" romof="megatech"> + <game name="mt_mwalk" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Moonwalker</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172569,9 +172677,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_bbros" romof="megatech"> + <game name="mt_bbros" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Bonanza Bros.</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172650,9 +172758,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_sonic" romof="megatech"> + <game name="mt_sonic" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Sonic the Hedgehog</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172731,9 +172839,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_fshrk" romof="megatech"> + <game name="mt_fshrk" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Fire Shark</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172812,9 +172920,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_gaxe2" romof="megatech"> + <game name="mt_gaxe2" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Golden Axe 2</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172893,9 +173001,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mt_kcham" romof="megatech"> + <game name="mt_kcham" sourcefile="segac2.c" romof="megatech"> <description>MegaTech: Kid Chameleon</description> <year>1989</year> <manufacturer>Sega</manufacturer> @@ -172974,9 +173082,9 @@ <dipvalue name="1:00"/> <dipvalue name="0:30"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2080"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mp_sonic" romof="megaplay"> + <game name="mp_sonic" sourcefile="segac2.c" romof="megaplay"> <description>MegaPlay - Sonic The Hedgehog</description> <year>1993</year> <manufacturer>Sega</manufacturer> @@ -173045,9 +173153,9 @@ <dipvalue name="Easy"/> <dipvalue name="Normal" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="mp_gaxe2" romof="megaplay"> + <game name="mp_gaxe2" sourcefile="segac2.c" romof="megaplay"> <description>MegaPlay - Golden Axe 2</description> <year>1993</year> <manufacturer>Sega</manufacturer> @@ -173118,9 +173226,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2080"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2080"/> </game> - <game name="lnc"> + <game name="lnc" sourcefile="btime.c"> <description>Lock'n'Chase</description> <year>1981</year> <manufacturer>Data East Corporation</manufacturer> @@ -173196,9 +173304,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="zoar"> + <game name="zoar" sourcefile="btime.c"> <description>Zoar</description> <year>1982</year> <manufacturer>Data East USA</manufacturer> @@ -173280,9 +173388,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="btime"> + <game name="btime" sourcefile="btime.c"> <description>Burger Time (Data East set 1)</description> <year>1982</year> <manufacturer>Data East Corporation</manufacturer> @@ -173360,9 +173468,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="btime2" cloneof="btime" romof="btime"> + <game name="btime2" sourcefile="btime.c" cloneof="btime" romof="btime"> <description>Burger Time (Data East set 2)</description> <year>1982</year> <manufacturer>Data East Corporation</manufacturer> @@ -173440,9 +173548,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="btimem" cloneof="btime" romof="btime"> + <game name="btimem" sourcefile="btime.c" cloneof="btime" romof="btime"> <description>Burger Time (Midway)</description> <year>1982</year> <manufacturer>Data East (Bally Midway license)</manufacturer> @@ -173521,9 +173629,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="cookrace" cloneof="btime" romof="btime"> + <game name="cookrace" sourcefile="btime.c" cloneof="btime" romof="btime"> <description>Cook Race</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -173598,9 +173706,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="wtennis"> + <game name="wtennis" sourcefile="btime.c"> <description>World Tennis</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -173678,9 +173786,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="brubber"> + <game name="brubber" sourcefile="btime.c"> <description>Burnin' Rubber</description> <year>1982</year> <manufacturer>Data East</manufacturer> @@ -173751,9 +173859,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="bnj" cloneof="brubber" romof="brubber"> + <game name="bnj" sourcefile="btime.c" cloneof="brubber" romof="brubber"> <description>Bump 'n' Jump</description> <year>1982</year> <manufacturer>Data East USA (Bally Midway license)</manufacturer> @@ -173825,9 +173933,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="caractn" cloneof="brubber" romof="brubber"> + <game name="caractn" sourcefile="btime.c" cloneof="brubber" romof="brubber"> <description>Car Action</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -173898,9 +174006,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="disco"> + <game name="disco" sourcefile="btime.c"> <description>Disco No.1</description> <year>1982</year> <manufacturer>Data East</manufacturer> @@ -173977,9 +174085,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="discof" cloneof="disco" romof="disco"> + <game name="discof" sourcefile="btime.c" cloneof="disco" romof="disco"> <description>Disco No.1 (Rev.F)</description> <year>1982</year> <manufacturer>Data East</manufacturer> @@ -174056,9 +174164,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="sdtennis"> + <game name="sdtennis" sourcefile="btime.c"> <description>Super Doubles Tennis</description> <year>1983</year> <manufacturer>Data East Corporation</manufacturer> @@ -174122,9 +174230,9 @@ <dipvalue name="Data East Corporation" default="yes"/> <dipvalue name="Data East USA"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mmonkey"> + <game name="mmonkey" sourcefile="btime.c"> <description>Minky Monkey</description> <year>1982</year> <manufacturer>Technos + Roller Tron</manufacturer> @@ -174198,9 +174306,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="ctsttape" romof="decocass"> + <game name="ctsttape" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Test Tape</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174272,9 +174380,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cterrani" romof="decocass"> + <game name="cterrani" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Terranean</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174346,9 +174454,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="castfant" romof="decocass"> + <game name="castfant" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Astro Fantasia</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174420,9 +174528,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="csuperas" romof="decocass"> + <game name="csuperas" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Super Astro Fighter</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174494,9 +174602,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="clocknch" romof="decocass"> + <game name="clocknch" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Lock'n'Chase</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174568,9 +174676,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cprogolf" romof="decocass"> + <game name="cprogolf" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Pro Golf</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174642,9 +174750,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cluckypo" romof="decocass"> + <game name="cluckypo" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Lucky Poker</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174716,9 +174824,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ctisland" romof="decocass"> + <game name="ctisland" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Treasure Island (set 1)</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174790,9 +174898,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32"/> </game> - <game name="ctislnd2" cloneof="ctisland" romof="ctisland"> + <game name="ctislnd2" sourcefile="decocass.c" cloneof="ctisland" romof="ctisland"> <description>Cassette: Treasure Island (set 2)</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174864,9 +174972,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32"/> </game> - <game name="ctislnd3" cloneof="ctisland" romof="ctisland"> + <game name="ctislnd3" sourcefile="decocass.c" cloneof="ctisland" romof="ctisland"> <description>Cassette: Treasure Island (set 3)</description> <year>1981</year> <manufacturer>DECO</manufacturer> @@ -174938,9 +175046,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="32"/> </game> - <game name="cdiscon1" romof="decocass"> + <game name="cdiscon1" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Disco No.1</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175012,9 +175120,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="csweetht" cloneof="cdiscon1" romof="cdiscon1"> + <game name="csweetht" sourcefile="decocass.c" cloneof="cdiscon1" romof="cdiscon1"> <description>Cassette: Sweet Heart</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175086,9 +175194,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ctornado" romof="decocass"> + <game name="ctornado" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Tornado</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175160,9 +175268,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cmissnx" romof="decocass"> + <game name="cmissnx" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Mission-X</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175234,9 +175342,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cptennis" romof="decocass"> + <game name="cptennis" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Pro Tennis</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175308,9 +175416,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cexplore" romof="decocass"> + <game name="cexplore" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Explorer</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175382,9 +175490,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cbtime" romof="decocass"> + <game name="cbtime" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Burger Time</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -175456,9 +175564,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cburnrub" romof="decocass"> + <game name="cburnrub" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Burnin' Rubber (set 1)</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175530,9 +175638,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cburnrb2" cloneof="cburnrub" romof="cburnrub"> + <game name="cburnrb2" sourcefile="decocass.c" cloneof="cburnrub" romof="cburnrub"> <description>Cassette: Burnin' Rubber (set 2)</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175604,9 +175712,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cbnj" cloneof="cburnrub" romof="cburnrub"> + <game name="cbnj" sourcefile="decocass.c" cloneof="cburnrub" romof="cburnrub"> <description>Cassette: Bump N Jump</description> <year>1982</year> <manufacturer>DECO</manufacturer> @@ -175678,9 +175786,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cgraplop" romof="decocass"> + <game name="cgraplop" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Graplop (aka Cluster Buster) (set 1)</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -175752,9 +175860,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cgraplp2" cloneof="cgraplop" romof="cgraplop"> + <game name="cgraplp2" sourcefile="decocass.c" cloneof="cgraplop" romof="cgraplop"> <description>Cassette: Graplop (aka Cluster Buster) (set 2)</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -175826,9 +175934,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="clapapa" romof="decocass"> + <game name="clapapa" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Rootin' Tootin' (aka La.Pa.Pa)</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -175900,9 +176008,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="clapapa2" cloneof="clapapa" romof="clapapa"> + <game name="clapapa2" sourcefile="decocass.c" cloneof="clapapa" romof="clapapa"> <description>Cassette: Rootin' Tootin'</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -175974,9 +176082,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cnightst" romof="decocass"> + <game name="cnightst" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Night Star (set 1)</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -176048,9 +176156,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cnights2" cloneof="cnightst" romof="cnightst"> + <game name="cnights2" sourcefile="decocass.c" cloneof="cnightst" romof="cnightst"> <description>Cassette: Night Star (set 2)</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -176122,9 +176230,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cprosocc" romof="decocass"> + <game name="cprosocc" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Pro Soccer</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -176196,9 +176304,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cprobowl" romof="decocass"> + <game name="cprobowl" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Pro Bowling</description> <year>1983</year> <manufacturer>DECO</manufacturer> @@ -176270,9 +176378,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cscrtry" romof="decocass"> + <game name="cscrtry" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Scrum Try (set 1)</description> <year>1984</year> <manufacturer>DECO</manufacturer> @@ -176344,9 +176452,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cscrtry2" cloneof="cscrtry" romof="cscrtry"> + <game name="cscrtry2" sourcefile="decocass.c" cloneof="cscrtry" romof="cscrtry"> <description>Cassette: Scrum Try (set 2)</description> <year>1984</year> <manufacturer>DECO</manufacturer> @@ -176418,9 +176526,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cppicf" romof="decocass"> + <game name="cppicf" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Peter Pepper's Ice Cream Factory (set 1)</description> <year>1984</year> <manufacturer>DECO</manufacturer> @@ -176492,9 +176600,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cppicf2" cloneof="cppicf" romof="cppicf"> + <game name="cppicf2" sourcefile="decocass.c" cloneof="cppicf" romof="cppicf"> <description>Cassette: Peter Pepper's Ice Cream Factory (set 2)</description> <year>1984</year> <manufacturer>DECO</manufacturer> @@ -176566,9 +176674,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cfghtice" romof="decocass"> + <game name="cfghtice" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Fighting Ice Hockey</description> <year>1984</year> <manufacturer>DECO</manufacturer> @@ -176640,9 +176748,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cbdash" romof="decocass"> + <game name="cbdash" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Boulder Dash</description> <year>1985</year> <manufacturer>DECO</manufacturer> @@ -176713,9 +176821,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="chwy" romof="decocass"> + <game name="chwy" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Highway Chase?</description> <year>1985</year> <manufacturer>DECO</manufacturer> @@ -176786,9 +176894,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cflyball" romof="decocass"> + <game name="cflyball" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Flying Ball?</description> <year>1985</year> <manufacturer>DECO</manufacturer> @@ -176859,9 +176967,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="czeroize" romof="decocass"> + <game name="czeroize" sourcefile="decocass.c" romof="decocass"> <description>Cassette: Zeroize?</description> <year>1985</year> <manufacturer>DECO</manufacturer> @@ -176932,9 +177040,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="astrof"> + <game name="astrof" sourcefile="astrof.c"> <description>Astro Fighter (set 1)</description> <year>1979</year> <manufacturer>Data East</manufacturer> @@ -176986,9 +177094,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="astrof2" cloneof="astrof" romof="astrof" sampleof="astrof"> + <game name="astrof2" sourcefile="astrof.c" cloneof="astrof" romof="astrof" sampleof="astrof"> <description>Astro Fighter (set 2)</description> <year>1979</year> <manufacturer>Data East</manufacturer> @@ -177046,9 +177154,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="astrof3" cloneof="astrof" romof="astrof" sampleof="astrof"> + <game name="astrof3" sourcefile="astrof.c" cloneof="astrof" romof="astrof" sampleof="astrof"> <description>Astro Fighter (set 3)</description> <year>1979</year> <manufacturer>Data East</manufacturer> @@ -177106,9 +177214,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="tomahawk"> + <game name="tomahawk" sourcefile="astrof.c"> <description>Tomahawk 777 (Revision 1)</description> <year>1980</year> <manufacturer>Data East</manufacturer> @@ -177152,9 +177260,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32"/> </game> - <game name="tomahaw5" cloneof="tomahawk" romof="tomahawk"> + <game name="tomahaw5" sourcefile="astrof.c" cloneof="tomahawk" romof="tomahawk"> <description>Tomahawk 777 (Revision 5)</description> <year>1980</year> <manufacturer>Data East</manufacturer> @@ -177198,9 +177306,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32"/> </game> - <game name="prosoccr"> + <game name="prosoccr" sourcefile="liberate.c"> <description>Pro Soccer</description> <year>1983</year> <manufacturer>Data East Corporation</manufacturer> @@ -177280,9 +177388,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="33"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="33"/> </game> - <game name="prosport"> + <game name="prosport" sourcefile="liberate.c"> <description>Prosport</description> <year>1983</year> <manufacturer>Data East Corporation</manufacturer> @@ -177368,9 +177476,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="boomrang"> + <game name="boomrang" sourcefile="liberate.c"> <description>Boomer Rang'r / Genesis</description> <year>1983</year> <manufacturer>Data East Corporation</manufacturer> @@ -177443,9 +177551,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33"/> </game> - <game name="kamikcab"> + <game name="kamikcab" sourcefile="liberate.c"> <description>Kamikaze Cabbie</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -177521,9 +177629,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33"/> </game> - <game name="liberate"> + <game name="liberate" sourcefile="liberate.c"> <description>Liberation</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -177603,9 +177711,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33"/> </game> - <game name="liberatb" cloneof="liberate" romof="liberate"> + <game name="liberatb" sourcefile="liberate.c" cloneof="liberate" romof="liberate"> <description>Liberation (bootleg)</description> <year>1984</year> <manufacturer>bootleg</manufacturer> @@ -177687,9 +177795,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="33"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="33"/> </game> - <game name="bwing"> + <game name="bwing" sourcefile="bwing.c"> <description>B-Wings (Japan)</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -177770,9 +177878,9 @@ <dipvalue name="More Blue"/> <dipvalue name="Max"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="bwings" cloneof="bwing" romof="bwing"> + <game name="bwings" sourcefile="bwing.c" cloneof="bwing" romof="bwing"> <description>Battle Wings</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -177854,9 +177962,9 @@ <dipvalue name="More Blue"/> <dipvalue name="Max"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="batwings" cloneof="bwing" romof="bwing"> + <game name="batwings" sourcefile="bwing.c" cloneof="bwing" romof="bwing"> <description>Battle Wings (alt)</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -177937,9 +178045,9 @@ <dipvalue name="More Blue"/> <dipvalue name="Max"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="64"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="zaviga"> + <game name="zaviga" sourcefile="bwing.c"> <description>Zaviga</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -178020,9 +178128,9 @@ <dipvalue name="More Blue"/> <dipvalue name="Max"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="zavigaj" cloneof="zaviga" romof="zaviga"> + <game name="zavigaj" sourcefile="bwing.c" cloneof="zaviga" romof="zaviga"> <description>Zaviga (Japan)</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -178103,9 +178211,9 @@ <dipvalue name="More Blue"/> <dipvalue name="Max"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="kchamp"> + <game name="kchamp" sourcefile="kchamp.c"> <description>Karate Champ (US)</description> <year>1984</year> <manufacturer>Data East USA</manufacturer> @@ -178175,9 +178283,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="karatedo" cloneof="kchamp" romof="kchamp"> + <game name="karatedo" sourcefile="kchamp.c" cloneof="kchamp" romof="kchamp"> <description>Karate Dou (Japan)</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -178247,9 +178355,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kchampvs" cloneof="kchamp" romof="kchamp"> + <game name="kchampvs" sourcefile="kchamp.c" cloneof="kchamp" romof="kchamp"> <description>Karate Champ (US VS version)</description> <year>1984</year> <manufacturer>Data East USA</manufacturer> @@ -178315,9 +178423,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="karatevs" cloneof="kchamp" romof="kchamp"> + <game name="karatevs" sourcefile="kchamp.c" cloneof="kchamp" romof="kchamp"> <description>Taisen Karate Dou (Japan VS version)</description> <year>1984</year> <manufacturer>Data East Corporation</manufacturer> @@ -178383,9 +178491,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="compgolf"> + <game name="compgolf" sourcefile="compgolf.c"> <description>Competition Golf Final Round (Japan)</description> <year>1985</year> <manufacturer>Data East</manufacturer> @@ -178453,9 +178561,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tryout"> + <game name="tryout" sourcefile="tryout.c"> <description>Pro Yakyuu Nyuudan Test Tryout (JPN Ver.)</description> <year>1985</year> <manufacturer>Data East</manufacturer> @@ -178480,9 +178588,9 @@ <video screen="raster" orientation="vertical" width="256" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> <input players="1" buttons="3" coins="2"/> - <driver status="preliminary" color="preliminary" sound="preliminary" palettesize="32"/> + <driver status="preliminary" color="preliminary" sound="preliminary" graphic="imperfect" palettesize="32"/> </game> - <game name="firetrap"> + <game name="firetrap" sourcefile="firetrap.c"> <description>Fire Trap (US)</description> <year>1986</year> <manufacturer>Data East USA</manufacturer> @@ -178562,9 +178670,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="firetpbl" cloneof="firetrap" romof="firetrap"> + <game name="firetpbl" sourcefile="firetrap.c" cloneof="firetrap" romof="firetrap"> <description>Fire Trap (Japan bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -178645,9 +178753,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="metlclsh"> + <game name="metlclsh" sourcefile="metlclsh.c"> <description>Metal Clash (Japan)</description> <year>1985</year> <manufacturer>Data East</manufacturer> @@ -178714,9 +178822,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="48"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="48"/> </game> - <game name="brkthru"> + <game name="brkthru" sourcefile="brkthru.c"> <description>Break Thru (US)</description> <year>1986</year> <manufacturer>Data East USA</manufacturer> @@ -178784,9 +178892,9 @@ <dipvalue name="Upright 2 Players"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="brkthruj" cloneof="brkthru" romof="brkthru"> + <game name="brkthruj" sourcefile="brkthru.c" cloneof="brkthru" romof="brkthru"> <description>Kyohkoh-Toppa (Japan)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -178852,9 +178960,9 @@ <dipvalue name="Upright 2 Players"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="darwin"> + <game name="darwin" sourcefile="brkthru.c"> <description>Darwin 4078 (Japan)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -178925,9 +179033,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shootout"> + <game name="shootout" sourcefile="shootout.c"> <description>Shoot Out (US)</description> <year>1985</year> <manufacturer>Data East USA</manufacturer> @@ -178993,9 +179101,9 @@ <dipvalue name="Hard"/> <dipvalue name="Very Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shootouj" cloneof="shootout" romof="shootout"> + <game name="shootouj" sourcefile="shootout.c" cloneof="shootout" romof="shootout"> <description>Shoot Out (Japan)</description> <year>1985</year> <manufacturer>Data East USA</manufacturer> @@ -179056,9 +179164,9 @@ <dipvalue name="Hard"/> <dipvalue name="Very Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shootoub" cloneof="shootout" romof="shootout"> + <game name="shootoub" sourcefile="shootout.c" cloneof="shootout" romof="shootout"> <description>Shoot Out (Korean Bootleg)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -179120,9 +179228,9 @@ <dipvalue name="Hard"/> <dipvalue name="Very Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sidepckt"> + <game name="sidepckt" sourcefile="sidepckt.c"> <description>Side Pocket (World)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -179190,9 +179298,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sidepctj" cloneof="sidepckt" romof="sidepckt"> + <game name="sidepctj" sourcefile="sidepckt.c" cloneof="sidepckt" romof="sidepckt"> <description>Side Pocket (Japan)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -179260,9 +179368,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sidepctb" cloneof="sidepckt" romof="sidepckt"> + <game name="sidepctb" sourcefile="sidepckt.c" cloneof="sidepckt" romof="sidepckt"> <description>Side Pocket (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -179331,9 +179439,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="exprraid"> + <game name="exprraid" sourcefile="exprraid.c"> <description>Express Raider (US)</description> <year>1986</year> <manufacturer>Data East USA</manufacturer> @@ -179418,9 +179526,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wexpress" cloneof="exprraid" romof="exprraid"> + <game name="wexpress" sourcefile="exprraid.c" cloneof="exprraid" romof="exprraid"> <description>Western Express (World?)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -179505,9 +179613,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wexpresb" cloneof="exprraid" romof="exprraid"> + <game name="wexpresb" sourcefile="exprraid.c" cloneof="exprraid" romof="exprraid"> <description>Western Express (bootleg set 1)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -179592,9 +179700,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wexpresc" cloneof="exprraid" romof="exprraid"> + <game name="wexpresc" sourcefile="exprraid.c" cloneof="exprraid" romof="exprraid"> <description>Western Express (bootleg set 2)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -179679,9 +179787,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pcktgal"> + <game name="pcktgal" sourcefile="pcktgal.c"> <description>Pocket Gal (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -179730,9 +179838,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="pcktgalb" cloneof="pcktgal" romof="pcktgal"> + <game name="pcktgalb" sourcefile="pcktgal.c" cloneof="pcktgal" romof="pcktgal"> <description>Pocket Gal (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -179782,9 +179890,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="pcktgal2" cloneof="pcktgal" romof="pcktgal"> + <game name="pcktgal2" sourcefile="pcktgal.c" cloneof="pcktgal" romof="pcktgal"> <description>Pocket Gal 2 (World?)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -179833,9 +179941,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="spool3" cloneof="pcktgal" romof="pcktgal"> + <game name="spool3" sourcefile="pcktgal.c" cloneof="pcktgal" romof="pcktgal"> <description>Super Pool III (World?)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -179884,9 +179992,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="spool3i" cloneof="pcktgal" romof="pcktgal"> + <game name="spool3i" sourcefile="pcktgal.c" cloneof="pcktgal" romof="pcktgal"> <description>Super Pool III (I-Vics)</description> <year>1990</year> <manufacturer>Data East Corporation (I-Vics license)</manufacturer> @@ -179935,9 +180043,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="battlera"> + <game name="battlera" sourcefile="battlera.c"> <description>Battle Rangers (World)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -180015,9 +180123,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="512"/> </game> - <game name="bldwolf" cloneof="battlera" romof="battlera"> + <game name="bldwolf" sourcefile="battlera.c" cloneof="battlera" romof="battlera"> <description>Bloody Wolf (US)</description> <year>1988</year> <manufacturer>Data East USA</manufacturer> @@ -180095,9 +180203,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="512"/> </game> - <game name="actfancr"> + <game name="actfancr" sourcefile="actfancr.c"> <description>Act-Fancer Cybernetick Hyper Weapon (World revision 2)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -180184,9 +180292,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="actfanc1" cloneof="actfancr" romof="actfancr"> + <game name="actfanc1" sourcefile="actfancr.c" cloneof="actfancr" romof="actfancr"> <description>Act-Fancer Cybernetick Hyper Weapon (World revision 1)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -180273,9 +180381,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="actfancj" cloneof="actfancr" romof="actfancr"> + <game name="actfancj" sourcefile="actfancr.c" cloneof="actfancr" romof="actfancr"> <description>Act-Fancer Cybernetick Hyper Weapon (Japan revision 1)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -180362,9 +180470,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="triothep"> + <game name="triothep" sourcefile="actfancr.c"> <description>Trio The Punch - Never Forget Me... (Japan)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -180451,9 +180559,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="lastmisn"> + <game name="lastmisn" sourcefile="dec8.c"> <description>Last Mission (US revision 6)</description> <year>1986</year> <manufacturer>Data East USA</manufacturer> @@ -180531,9 +180639,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lastmsno" cloneof="lastmisn" romof="lastmisn"> + <game name="lastmsno" sourcefile="dec8.c" cloneof="lastmisn" romof="lastmisn"> <description>Last Mission (US revision 5)</description> <year>1986</year> <manufacturer>Data East USA</manufacturer> @@ -180611,9 +180719,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lastmsnj" cloneof="lastmisn" romof="lastmisn"> + <game name="lastmsnj" sourcefile="dec8.c" cloneof="lastmisn" romof="lastmisn"> <description>Last Mission (Japan)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -180691,9 +180799,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="shackled"> + <game name="shackled" sourcefile="dec8.c"> <description>Shackled (US)</description> <year>1986</year> <manufacturer>Data East USA</manufacturer> @@ -180785,9 +180893,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="breywood" cloneof="shackled" romof="shackled"> + <game name="breywood" sourcefile="dec8.c" cloneof="shackled" romof="shackled"> <description>Breywood (Japan revision 2)</description> <year>1986</year> <manufacturer>Data East Corporation</manufacturer> @@ -180879,9 +180987,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="csilver"> + <game name="csilver" sourcefile="dec8.c"> <description>Captain Silver (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -180965,9 +181073,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ghostb"> + <game name="ghostb" sourcefile="dec8.c"> <description>The Real Ghostbusters (US 2 Players)</description> <year>1987</year> <manufacturer>Data East USA</manufacturer> @@ -181041,9 +181149,9 @@ <dipvalue name="Up 1.5%"/> <dipvalue name="Normal" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ghostb3" cloneof="ghostb" romof="ghostb"> + <game name="ghostb3" sourcefile="dec8.c" cloneof="ghostb" romof="ghostb"> <description>The Real Ghostbusters (US 3 Players)</description> <year>1987</year> <manufacturer>Data East USA</manufacturer> @@ -181117,9 +181225,9 @@ <dipvalue name="Up 1.5%"/> <dipvalue name="Normal" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="meikyuh" cloneof="ghostb" romof="ghostb"> + <game name="meikyuh" sourcefile="dec8.c" cloneof="ghostb" romof="ghostb"> <description>Meikyuu Hunter G (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -181190,9 +181298,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="srdarwin"> + <game name="srdarwin" sourcefile="dec8.c"> <description>Super Real Darwin (World)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -181272,9 +181380,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="srdarwnj" cloneof="srdarwin" romof="srdarwin"> + <game name="srdarwnj" sourcefile="dec8.c" cloneof="srdarwin" romof="srdarwin"> <description>Super Real Darwin (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -181354,9 +181462,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="gondo"> + <game name="gondo" sourcefile="dec8.c"> <description>Gondomania (US)</description> <year>1987</year> <manufacturer>Data East USA</manufacturer> @@ -181446,9 +181554,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="makyosen" cloneof="gondo" romof="gondo"> + <game name="makyosen" sourcefile="dec8.c" cloneof="gondo" romof="gondo"> <description>Makyou Senshi (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -181538,9 +181646,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="garyoret"> + <game name="garyoret" sourcefile="dec8.c"> <description>Garyo Retsuden (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -181632,9 +181740,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cobracom"> + <game name="cobracom" sourcefile="dec8.c"> <description>Cobra-Command (World revision 5)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -181716,9 +181824,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cobracmj" cloneof="cobracom" romof="cobracom"> + <game name="cobracmj" sourcefile="dec8.c" cloneof="cobracom" romof="cobracom"> <description>Cobra-Command (Japan)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -181800,9 +181908,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="oscar"> + <game name="oscar" sourcefile="dec8.c"> <description>Psycho-Nics Oscar (US)</description> <year>1988</year> <manufacturer>Data East USA</manufacturer> @@ -181879,9 +181987,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="oscarj" cloneof="oscar" romof="oscar"> + <game name="oscarj" sourcefile="dec8.c" cloneof="oscar" romof="oscar"> <description>Psycho-Nics Oscar (Japan revision 2)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -181958,9 +182066,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="oscarj1" cloneof="oscar" romof="oscar"> + <game name="oscarj1" sourcefile="dec8.c" cloneof="oscar" romof="oscar"> <description>Psycho-Nics Oscar (Japan revision 1)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -182037,9 +182145,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="oscarj0" cloneof="oscar" romof="oscar"> + <game name="oscarj0" sourcefile="dec8.c" cloneof="oscar" romof="oscar"> <description>Psycho-Nics Oscar (Japan revision 0)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -182116,9 +182224,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="karnov"> + <game name="karnov" sourcefile="karnov.c"> <description>Karnov (US)</description> <year>1987</year> <manufacturer>Data East USA</manufacturer> @@ -182205,9 +182313,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="karnovj" cloneof="karnov" romof="karnov"> + <game name="karnovj" sourcefile="karnov.c" cloneof="karnov" romof="karnov"> <description>Karnov (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -182294,9 +182402,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Fast"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="wndrplnt"> + <game name="wndrplnt" sourcefile="karnov.c"> <description>Wonder Planet (Japan)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -182385,9 +182493,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="chelnov"> + <game name="chelnov" sourcefile="karnov.c"> <description>Chelnov - Atomic Runner (World)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -182472,9 +182580,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="chelnovu" cloneof="chelnov" romof="chelnov"> + <game name="chelnovu" sourcefile="karnov.c" cloneof="chelnov" romof="chelnov"> <description>Chelnov - Atomic Runner (US)</description> <year>1988</year> <manufacturer>Data East USA</manufacturer> @@ -182559,9 +182667,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="chelnovj" cloneof="chelnov" romof="chelnov"> + <game name="chelnovj" sourcefile="karnov.c" cloneof="chelnov" romof="chelnov"> <description>Chelnov - Atomic Runner (Japan)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -182646,9 +182754,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hbarrel"> + <game name="hbarrel" sourcefile="dec0.c"> <description>Heavy Barrel (US)</description> <year>1987</year> <manufacturer>Data East USA</manufacturer> @@ -182742,9 +182850,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hbarrelw" cloneof="hbarrel" romof="hbarrel"> + <game name="hbarrelw" sourcefile="dec0.c" cloneof="hbarrel" romof="hbarrel"> <description>Heavy Barrel (World)</description> <year>1987</year> <manufacturer>Data East Corporation</manufacturer> @@ -182838,9 +182946,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="baddudes"> + <game name="baddudes" sourcefile="dec0.c"> <description>Bad Dudes vs. Dragonninja (US)</description> <year>1988</year> <manufacturer>Data East USA</manufacturer> @@ -182928,9 +183036,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="drgninja" cloneof="baddudes" romof="baddudes"> + <game name="drgninja" sourcefile="dec0.c" cloneof="baddudes" romof="baddudes"> <description>Dragonninja (Japan)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -183018,9 +183126,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="birdtry"> + <game name="birdtry" sourcefile="dec0.c"> <description>Birdie Try (Japan)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -183110,9 +183218,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="robocop"> + <game name="robocop" sourcefile="dec0.c"> <description>Robocop (World revision 4)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -183206,9 +183314,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="robocopw" cloneof="robocop" romof="robocop"> + <game name="robocopw" sourcefile="dec0.c" cloneof="robocop" romof="robocop"> <description>Robocop (World revision 3)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -183302,9 +183410,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="robocopj" cloneof="robocop" romof="robocop"> + <game name="robocopj" sourcefile="dec0.c" cloneof="robocop" romof="robocop"> <description>Robocop (Japan)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -183398,9 +183506,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="robocopu" cloneof="robocop" romof="robocop"> + <game name="robocopu" sourcefile="dec0.c" cloneof="robocop" romof="robocop"> <description>Robocop (US revision 1)</description> <year>1988</year> <manufacturer>Data East USA</manufacturer> @@ -183494,9 +183602,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="robocpu0" cloneof="robocop" romof="robocop"> + <game name="robocpu0" sourcefile="dec0.c" cloneof="robocop" romof="robocop"> <description>Robocop (US revision 0)</description> <year>1988</year> <manufacturer>Data East USA</manufacturer> @@ -183590,9 +183698,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="robocopb" cloneof="robocop" romof="robocop"> + <game name="robocopb" sourcefile="dec0.c" cloneof="robocop" romof="robocop"> <description>Robocop (World bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -183684,9 +183792,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hippodrm"> + <game name="hippodrm" sourcefile="dec0.c"> <description>Hippodrome (US)</description> <year>1989</year> <manufacturer>Data East USA</manufacturer> @@ -183778,9 +183886,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ffantasy" cloneof="hippodrm" romof="hippodrm"> + <game name="ffantasy" sourcefile="dec0.c" cloneof="hippodrm" romof="hippodrm"> <description>Fighting Fantasy (Japan revision 2)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -183872,9 +183980,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ffantasa" cloneof="hippodrm" romof="hippodrm"> + <game name="ffantasa" sourcefile="dec0.c" cloneof="hippodrm" romof="hippodrm"> <description>Fighting Fantasy (Japan)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -183966,9 +184074,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="slyspy"> + <game name="slyspy" sourcefile="dec0.c"> <description>Sly Spy (US revision 3)</description> <year>1989</year> <manufacturer>Data East USA</manufacturer> @@ -184051,9 +184159,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="slyspy2" cloneof="slyspy" romof="slyspy"> + <game name="slyspy2" sourcefile="dec0.c" cloneof="slyspy" romof="slyspy"> <description>Sly Spy (US revision 2)</description> <year>1989</year> <manufacturer>Data East USA</manufacturer> @@ -184136,9 +184244,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="secretag" cloneof="slyspy" romof="slyspy"> + <game name="secretag" sourcefile="dec0.c" cloneof="slyspy" romof="slyspy"> <description>Secret Agent (World)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -184221,9 +184329,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="secretab" cloneof="slyspy" romof="slyspy"> + <game name="secretab" sourcefile="dec0.c" cloneof="slyspy" romof="slyspy"> <description>Secret Agent (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -184311,9 +184419,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="midres"> + <game name="midres" sourcefile="dec0.c"> <description>Midnight Resistance (World)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -184400,9 +184508,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="midresu" cloneof="midres" romof="midres"> + <game name="midresu" sourcefile="dec0.c" cloneof="midres" romof="midres"> <description>Midnight Resistance (US)</description> <year>1989</year> <manufacturer>Data East USA</manufacturer> @@ -184489,9 +184597,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="midresj" cloneof="midres" romof="midres"> + <game name="midresj" sourcefile="dec0.c" cloneof="midres" romof="midres"> <description>Midnight Resistance (Japan)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -184578,9 +184686,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bouldash"> + <game name="bouldash" sourcefile="dec0.c"> <description>Boulder Dash / Boulder Dash Part 2 (World)</description> <year>1990</year> <manufacturer>Data East Corporation (licensed from First Star)</manufacturer> @@ -184667,9 +184775,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bouldshj" cloneof="bouldash" romof="bouldash"> + <game name="bouldshj" sourcefile="dec0.c" cloneof="bouldash" romof="bouldash"> <description>Boulder Dash / Boulder Dash Part 2 (Japan)</description> <year>1990</year> <manufacturer>Data East Corporation (licensed from First Star)</manufacturer> @@ -184756,9 +184864,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stadhero"> + <game name="stadhero" sourcefile="stadhero.c"> <description>Stadium Hero (Japan)</description> <year>1988</year> <manufacturer>Data East Corporation</manufacturer> @@ -184847,9 +184955,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="madmotor"> + <game name="madmotor" sourcefile="madmotor.c"> <description>Mad Motor</description> <year>1989</year> <manufacturer>Mitchell</manufacturer> @@ -184941,9 +185049,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="vaportra"> + <game name="vaportra" sourcefile="vaportra.c"> <description>Vapor Trail - Hyper Offence Formation (World revision 1)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -185020,9 +185128,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="vaportru" cloneof="vaportra" romof="vaportra"> + <game name="vaportru" sourcefile="vaportra.c" cloneof="vaportra" romof="vaportra"> <description>Vapor Trail - Hyper Offence Formation (US)</description> <year>1989</year> <manufacturer>Data East USA</manufacturer> @@ -185099,9 +185207,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="kuhga" cloneof="vaportra" romof="vaportra"> + <game name="kuhga" sourcefile="vaportra.c" cloneof="vaportra" romof="vaportra"> <description>Kuhga - Operation Code 'Vapor Trail' (Japan revision 3)</description> <year>1989</year> <manufacturer>Data East Corporation</manufacturer> @@ -185178,9 +185286,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="cbuster"> + <game name="cbuster" sourcefile="cbuster.c"> <description>Crude Buster (World FX version)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185267,9 +185375,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cbusterw" cloneof="cbuster" romof="cbuster"> + <game name="cbusterw" sourcefile="cbuster.c" cloneof="cbuster" romof="cbuster"> <description>Crude Buster (World FU version)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185356,9 +185464,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cbusterj" cloneof="cbuster" romof="cbuster"> + <game name="cbusterj" sourcefile="cbuster.c" cloneof="cbuster" romof="cbuster"> <description>Crude Buster (Japan)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185445,9 +185553,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="twocrude" cloneof="cbuster" romof="cbuster"> + <game name="twocrude" sourcefile="cbuster.c" cloneof="cbuster" romof="cbuster"> <description>Two Crude (US)</description> <year>1990</year> <manufacturer>Data East USA</manufacturer> @@ -185534,9 +185642,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="darkseal"> + <game name="darkseal" sourcefile="darkseal.c"> <description>Dark Seal (World revision 3)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185616,9 +185724,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="darksea1" cloneof="darkseal" romof="darkseal"> + <game name="darksea1" sourcefile="darkseal.c" cloneof="darkseal" romof="darkseal"> <description>Dark Seal (World revision 1)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185698,9 +185806,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="darkseaj" cloneof="darkseal" romof="darkseal"> + <game name="darkseaj" sourcefile="darkseal.c" cloneof="darkseal" romof="darkseal"> <description>Dark Seal (Japan)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185780,9 +185888,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gatedoom" cloneof="darkseal" romof="darkseal"> + <game name="gatedoom" sourcefile="darkseal.c" cloneof="darkseal" romof="darkseal"> <description>Gate of Doom (US revision 4)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185862,9 +185970,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gatedom1" cloneof="darkseal" romof="darkseal"> + <game name="gatedom1" sourcefile="darkseal.c" cloneof="darkseal" romof="darkseal"> <description>Gate of Doom (US revision 1)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -185944,9 +186052,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="edrandy"> + <game name="edrandy" sourcefile="cninja.c"> <description>The Cliffhanger - Edward Randy (World revision 2)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -186042,9 +186150,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="edrandy1" cloneof="edrandy" romof="edrandy"> + <game name="edrandy1" sourcefile="cninja.c" cloneof="edrandy" romof="edrandy"> <description>The Cliffhanger - Edward Randy (World revision 1)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -186140,9 +186248,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="edrandyj" cloneof="edrandy" romof="edrandy"> + <game name="edrandyj" sourcefile="cninja.c" cloneof="edrandy" romof="edrandy"> <description>The Cliffhanger - Edward Randy (Japan)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -186238,9 +186346,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="supbtime"> + <game name="supbtime" sourcefile="supbtime.c"> <description>Super Burger Time (World)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -186314,9 +186422,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="supbtimj" cloneof="supbtime" romof="supbtime"> + <game name="supbtimj" sourcefile="supbtime.c" cloneof="supbtime" romof="supbtime"> <description>Super Burger Time (Japan)</description> <year>1990</year> <manufacturer>Data East Corporation</manufacturer> @@ -186390,9 +186498,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mutantf"> + <game name="mutantf" sourcefile="cninja.c"> <description>Mutant Fighter (World Rev 4, EM-5)</description> <year>1992</year> <manufacturer>Data East Corporation</manufacturer> @@ -186480,9 +186588,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mutantfa" cloneof="mutantf" romof="mutantf"> + <game name="mutantfa" sourcefile="cninja.c" cloneof="mutantf" romof="mutantf"> <description>Mutant Fighter (World Rev 3, EM-4)</description> <year>1992</year> <manufacturer>Data East Corporation</manufacturer> @@ -186570,9 +186678,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="deathbrd" cloneof="mutantf" romof="mutantf"> + <game name="deathbrd" sourcefile="cninja.c" cloneof="mutantf" romof="mutantf"> <description>Death Brade (Japan Rev 2, JM-3)</description> <year>1992</year> <manufacturer>Data East Corporation</manufacturer> @@ -186660,9 +186768,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cninja"> + <game name="cninja" sourcefile="cninja.c"> <description>Caveman Ninja (World revision 3)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -186750,9 +186858,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cninja0" cloneof="cninja" romof="cninja"> + <game name="cninja0" sourcefile="cninja.c" cloneof="cninja" romof="cninja"> <description>Caveman Ninja (World revision 0)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -186840,9 +186948,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cninjau" cloneof="cninja" romof="cninja"> + <game name="cninjau" sourcefile="cninja.c" cloneof="cninja" romof="cninja"> <description>Caveman Ninja (US)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -186930,9 +187038,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="joemac" cloneof="cninja" romof="cninja"> + <game name="joemac" sourcefile="cninja.c" cloneof="cninja" romof="cninja"> <description>Tatakae Genshizin Joe & Mac (Japan)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187020,9 +187128,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="stoneage" cloneof="cninja" romof="cninja"> + <game name="stoneage" sourcefile="cninja.c" cloneof="cninja" romof="cninja"> <description>Stoneage</description> <year>1991</year> <manufacturer>bootleg</manufacturer> @@ -187107,9 +187215,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="robocop2"> + <game name="robocop2" sourcefile="cninja.c"> <description>Robocop 2 (World)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187203,9 +187311,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="robocp2u" cloneof="robocop2" romof="robocop2"> + <game name="robocp2u" sourcefile="cninja.c" cloneof="robocop2" romof="robocop2"> <description>Robocop 2 (US)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187299,9 +187407,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="robocp2j" cloneof="robocop2" romof="robocop2"> + <game name="robocp2j" sourcefile="cninja.c" cloneof="robocop2" romof="robocop2"> <description>Robocop 2 (Japan)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187395,9 +187503,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="thndzone"> + <game name="thndzone" sourcefile="dassault.c"> <description>Thunder Zone (World)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187488,8 +187596,8 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Unused"> <dipvalue name="Off" default="yes"/> @@ -187499,9 +187607,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dassault" cloneof="thndzone" romof="thndzone"> + <game name="dassault" sourcefile="dassault.c" cloneof="thndzone" romof="thndzone"> <description>Desert Assault (US)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187588,9 +187696,9 @@ <dipvalue name="Hardest"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> + <dipvalue name="2"/> <dipvalue name="3"/> - <dipvalue name="4"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Unused"> <dipvalue name="Off" default="yes"/> @@ -187600,9 +187708,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="dassaul4" cloneof="thndzone" romof="thndzone"> + <game name="dassaul4" sourcefile="dassault.c" cloneof="thndzone" romof="thndzone"> <description>Desert Assault (US 4 Players)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187706,9 +187814,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="chinatwn"> + <game name="chinatwn" sourcefile="supbtime.c"> <description>China Town (Japan)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187782,9 +187890,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rohga"> + <game name="rohga" sourcefile="rohga.c"> <description>Rohga Armour Force (Asia/Europe v3.0)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -187904,9 +188012,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rohgah" cloneof="rohga" romof="rohga"> + <game name="rohgah" sourcefile="rohga.c" cloneof="rohga" romof="rohga"> <description>Rohga Armour Force (Hong Kong v3.0)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188026,9 +188134,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rohgau" cloneof="rohga" romof="rohga"> + <game name="rohgau" sourcefile="rohga.c" cloneof="rohga" romof="rohga"> <description>Rohga Armour Force (US v1.0)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188148,9 +188256,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="captaven"> + <game name="captaven" sourcefile="deco32.c"> <description>Captain America and The Avengers (Asia Rev 1.9)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188163,19 +188271,19 @@ <rom name="man-14.3k" size="131072" crc="7cb9a4bd" sha1="0af1a7bf0fcfa3cc14b38d92f19e97ad6e5541dd" region="cpu1" offset="80002"/> <rom name="man-15.3m" size="131072" crc="c7854fe8" sha1="ffa87dcda44fa0111de6ab317b77dd2bde015890" region="cpu1" offset="80003"/> <rom name="hj_08.17k" size="65536" crc="361fbd16" sha1="c4bbaf74e09c263044be74bb2c98caf6cfcab618" region="cpu2" offset="0"/> - <rom name="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" dispose="yes" offset="0"/> - <rom name="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" dispose="yes" offset="0"/> - <rom name="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" dispose="yes" offset="40000"/> - <rom name="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" dispose="yes" offset="80000"/> - <rom name="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" dispose="yes" offset="c0000"/> - <rom name="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" dispose="yes" offset="100000"/> - <rom name="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" dispose="yes" offset="0"/> - <rom name="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" dispose="yes" offset="1"/> - <rom name="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" dispose="yes" offset="200000"/> - <rom name="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" dispose="yes" offset="200001"/> + <rom name="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" offset="0"/> + <rom name="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" offset="0"/> + <rom name="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" offset="40000"/> + <rom name="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" offset="80000"/> + <rom name="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" offset="c0000"/> + <rom name="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" offset="100000"/> + <rom name="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" offset="0"/> + <rom name="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" offset="1"/> + <rom name="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" offset="200000"/> + <rom name="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" offset="200001"/> <rom name="man-10.14k" size="524288" crc="0132c578" sha1="70952f39508360bab51e1151531536f0ea6bbe06" region="sound2" offset="0"/> <rom name="man-11.16k" size="524288" crc="0dc60a4c" sha1="4d0daa6a0272852a37f341a0cdc48baee0ad9dd8" region="sound1" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -188230,8 +188338,8 @@ <dipvalue name="Individual"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Allow Continue"> <dipvalue name="Off"/> @@ -188241,9 +188349,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="captavna" cloneof="captaven" romof="captaven"> + <game name="captavna" sourcefile="deco32.c" cloneof="captaven" romof="captaven"> <description>Captain America and The Avengers (Asia Rev 1.0)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188256,19 +188364,19 @@ <rom name="man-14.3k" merge="man-14.3k" size="131072" crc="7cb9a4bd" sha1="0af1a7bf0fcfa3cc14b38d92f19e97ad6e5541dd" region="cpu1" offset="80002"/> <rom name="man-15.3m" merge="man-15.3m" size="131072" crc="c7854fe8" sha1="ffa87dcda44fa0111de6ab317b77dd2bde015890" region="cpu1" offset="80003"/> <rom name="hj_08.17k" merge="hj_08.17k" size="65536" crc="361fbd16" sha1="c4bbaf74e09c263044be74bb2c98caf6cfcab618" region="cpu2" offset="0"/> - <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" dispose="yes" offset="0"/> - <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" dispose="yes" offset="0"/> - <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" dispose="yes" offset="40000"/> - <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" dispose="yes" offset="80000"/> - <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" dispose="yes" offset="c0000"/> - <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" dispose="yes" offset="100000"/> - <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" dispose="yes" offset="0"/> - <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" dispose="yes" offset="1"/> - <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" dispose="yes" offset="200000"/> - <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" dispose="yes" offset="200001"/> + <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" offset="0"/> + <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" offset="0"/> + <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" offset="40000"/> + <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" offset="80000"/> + <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" offset="c0000"/> + <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" offset="100000"/> + <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" offset="0"/> + <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" offset="1"/> + <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" offset="200000"/> + <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" offset="200001"/> <rom name="man-10.14k" merge="man-10.14k" size="524288" crc="0132c578" sha1="70952f39508360bab51e1151531536f0ea6bbe06" region="sound2" offset="0"/> <rom name="man-11.16k" merge="man-11.16k" size="524288" crc="0dc60a4c" sha1="4d0daa6a0272852a37f341a0cdc48baee0ad9dd8" region="sound1" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -188323,8 +188431,8 @@ <dipvalue name="Individual"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Allow Continue"> <dipvalue name="Off"/> @@ -188334,9 +188442,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="captavne" cloneof="captaven" romof="captaven"> + <game name="captavne" sourcefile="deco32.c" cloneof="captaven" romof="captaven"> <description>Captain America and The Avengers (UK Rev 1.4)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188349,19 +188457,19 @@ <rom name="man-14.3k" merge="man-14.3k" size="131072" crc="7cb9a4bd" sha1="0af1a7bf0fcfa3cc14b38d92f19e97ad6e5541dd" region="cpu1" offset="80002"/> <rom name="man-15.3m" merge="man-15.3m" size="131072" crc="c7854fe8" sha1="ffa87dcda44fa0111de6ab317b77dd2bde015890" region="cpu1" offset="80003"/> <rom name="hj_08.17k" merge="hj_08.17k" size="65536" crc="361fbd16" sha1="c4bbaf74e09c263044be74bb2c98caf6cfcab618" region="cpu2" offset="0"/> - <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" dispose="yes" offset="0"/> - <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" dispose="yes" offset="0"/> - <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" dispose="yes" offset="40000"/> - <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" dispose="yes" offset="80000"/> - <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" dispose="yes" offset="c0000"/> - <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" dispose="yes" offset="100000"/> - <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" dispose="yes" offset="0"/> - <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" dispose="yes" offset="1"/> - <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" dispose="yes" offset="200000"/> - <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" dispose="yes" offset="200001"/> + <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" offset="0"/> + <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" offset="0"/> + <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" offset="40000"/> + <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" offset="80000"/> + <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" offset="c0000"/> + <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" offset="100000"/> + <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" offset="0"/> + <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" offset="1"/> + <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" offset="200000"/> + <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" offset="200001"/> <rom name="man-10.14k" merge="man-10.14k" size="524288" crc="0132c578" sha1="70952f39508360bab51e1151531536f0ea6bbe06" region="sound2" offset="0"/> <rom name="man-11.16k" merge="man-11.16k" size="524288" crc="0dc60a4c" sha1="4d0daa6a0272852a37f341a0cdc48baee0ad9dd8" region="sound1" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -188416,8 +188524,8 @@ <dipvalue name="Individual"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Allow Continue"> <dipvalue name="Off"/> @@ -188427,9 +188535,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="captavnu" cloneof="captaven" romof="captaven"> + <game name="captavnu" sourcefile="deco32.c" cloneof="captaven" romof="captaven"> <description>Captain America and The Avengers (US Rev 1.9)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188442,19 +188550,19 @@ <rom name="man-14.3k" merge="man-14.3k" size="131072" crc="7cb9a4bd" sha1="0af1a7bf0fcfa3cc14b38d92f19e97ad6e5541dd" region="cpu1" offset="80002"/> <rom name="man-15.3m" merge="man-15.3m" size="131072" crc="c7854fe8" sha1="ffa87dcda44fa0111de6ab317b77dd2bde015890" region="cpu1" offset="80003"/> <rom name="hj_08.17k" merge="hj_08.17k" size="65536" crc="361fbd16" sha1="c4bbaf74e09c263044be74bb2c98caf6cfcab618" region="cpu2" offset="0"/> - <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" dispose="yes" offset="0"/> - <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" dispose="yes" offset="0"/> - <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" dispose="yes" offset="40000"/> - <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" dispose="yes" offset="80000"/> - <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" dispose="yes" offset="c0000"/> - <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" dispose="yes" offset="100000"/> - <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" dispose="yes" offset="0"/> - <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" dispose="yes" offset="1"/> - <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" dispose="yes" offset="200000"/> - <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" dispose="yes" offset="200001"/> + <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" offset="0"/> + <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" offset="0"/> + <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" offset="40000"/> + <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" offset="80000"/> + <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" offset="c0000"/> + <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" offset="100000"/> + <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" offset="0"/> + <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" offset="1"/> + <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" offset="200000"/> + <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" offset="200001"/> <rom name="man-10.14k" merge="man-10.14k" size="524288" crc="0132c578" sha1="70952f39508360bab51e1151531536f0ea6bbe06" region="sound2" offset="0"/> <rom name="man-11.16k" merge="man-11.16k" size="524288" crc="0dc60a4c" sha1="4d0daa6a0272852a37f341a0cdc48baee0ad9dd8" region="sound1" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -188509,8 +188617,8 @@ <dipvalue name="Individual"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Allow Continue"> <dipvalue name="Off"/> @@ -188520,9 +188628,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="captavuu" cloneof="captaven" romof="captaven"> + <game name="captavuu" sourcefile="deco32.c" cloneof="captaven" romof="captaven"> <description>Captain America and The Avengers (US Rev 1.6)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188535,19 +188643,19 @@ <rom name="man-14.3k" merge="man-14.3k" size="131072" crc="7cb9a4bd" sha1="0af1a7bf0fcfa3cc14b38d92f19e97ad6e5541dd" region="cpu1" offset="80002"/> <rom name="man-15.3m" merge="man-15.3m" size="131072" crc="c7854fe8" sha1="ffa87dcda44fa0111de6ab317b77dd2bde015890" region="cpu1" offset="80003"/> <rom name="hj_08.17k" merge="hj_08.17k" size="65536" crc="361fbd16" sha1="c4bbaf74e09c263044be74bb2c98caf6cfcab618" region="cpu2" offset="0"/> - <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" dispose="yes" offset="0"/> - <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" dispose="yes" offset="0"/> - <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" dispose="yes" offset="40000"/> - <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" dispose="yes" offset="80000"/> - <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" dispose="yes" offset="c0000"/> - <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" dispose="yes" offset="100000"/> - <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" dispose="yes" offset="0"/> - <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" dispose="yes" offset="1"/> - <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" dispose="yes" offset="200000"/> - <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" dispose="yes" offset="200001"/> + <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" offset="0"/> + <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" offset="0"/> + <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" offset="40000"/> + <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" offset="80000"/> + <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" offset="c0000"/> + <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" offset="100000"/> + <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" offset="0"/> + <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" offset="1"/> + <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" offset="200000"/> + <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" offset="200001"/> <rom name="man-10.14k" merge="man-10.14k" size="524288" crc="0132c578" sha1="70952f39508360bab51e1151531536f0ea6bbe06" region="sound2" offset="0"/> <rom name="man-11.16k" merge="man-11.16k" size="524288" crc="0dc60a4c" sha1="4d0daa6a0272852a37f341a0cdc48baee0ad9dd8" region="sound1" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -188602,8 +188710,8 @@ <dipvalue name="Individual"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Allow Continue"> <dipvalue name="Off"/> @@ -188613,9 +188721,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="captavnj" cloneof="captaven" romof="captaven"> + <game name="captavnj" sourcefile="deco32.c" cloneof="captaven" romof="captaven"> <description>Captain America and The Avengers (Japan Rev 0.2)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188628,19 +188736,19 @@ <rom name="man-14.3k" merge="man-14.3k" size="131072" crc="7cb9a4bd" sha1="0af1a7bf0fcfa3cc14b38d92f19e97ad6e5541dd" region="cpu1" offset="80002"/> <rom name="man-15.3m" merge="man-15.3m" size="131072" crc="c7854fe8" sha1="ffa87dcda44fa0111de6ab317b77dd2bde015890" region="cpu1" offset="80003"/> <rom name="hj_08.17k" merge="hj_08.17k" size="65536" crc="361fbd16" sha1="c4bbaf74e09c263044be74bb2c98caf6cfcab618" region="cpu2" offset="0"/> - <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" dispose="yes" offset="0"/> - <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" dispose="yes" offset="0"/> - <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" dispose="yes" offset="40000"/> - <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" dispose="yes" offset="80000"/> - <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" dispose="yes" offset="c0000"/> - <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" dispose="yes" offset="100000"/> - <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" dispose="yes" offset="0"/> - <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" dispose="yes" offset="1"/> - <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" dispose="yes" offset="200000"/> - <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" dispose="yes" offset="200001"/> + <rom name="man-00.8a" merge="man-00.8a" size="524288" crc="7855a607" sha1="fa0be080515482281e5a12fe172eeb9a21af0820" region="gfx1" offset="0"/> + <rom name="man-05.16a" merge="man-05.16a" size="1048576" crc="d44d1995" sha1="e88e1a59a4b24ad058f21538f6e9bbba94a166b4" region="gfx2" offset="0"/> + <rom name="man-04.14a" merge="man-04.14a" size="1048576" crc="541492a1" sha1="2e0ab12555fc46001a815e76e3a0cd21f385f82a" region="gfx2" offset="40000"/> + <rom name="man-03.12a" merge="man-03.12a" size="1048576" crc="2d9c52b2" sha1="8f6f4fe4f1a63099f889068991b34f9432b04fd7" region="gfx2" offset="80000"/> + <rom name="man-02.11a" merge="man-02.11a" size="1048576" crc="07674c05" sha1="08b33721d7eba4a1ff2e282f77eeb56535a52923" region="gfx2" offset="c0000"/> + <rom name="man-01.10a" merge="man-01.10a" size="1048576" crc="ae714ada" sha1="b4d5806265d422c8b837489afe93731f584e4adf" region="gfx2" offset="100000"/> + <rom name="man-06.17a" merge="man-06.17a" size="1048576" crc="a9a64297" sha1="e4cb441207b1907461c90c32c05a461c9bd30756" region="gfx3" offset="0"/> + <rom name="man-07.18a" merge="man-07.18a" size="1048576" crc="b1db200c" sha1="970bb15e90194dd285f53594aca5dec3405e75d5" region="gfx3" offset="1"/> + <rom name="man-08.17c" merge="man-08.17c" size="1048576" crc="28e98e66" sha1="55dbbd945eada81f7dcc874fdcb0b9e62ea453f0" region="gfx3" offset="200000"/> + <rom name="man-09.21c" merge="man-09.21c" size="1048576" crc="1921245d" sha1="88d3b69a38c18c83d5658d057b95974f1bd371e6" region="gfx3" offset="200001"/> <rom name="man-10.14k" merge="man-10.14k" size="524288" crc="0132c578" sha1="70952f39508360bab51e1151531536f0ea6bbe06" region="sound2" offset="0"/> <rom name="man-11.16k" merge="man-11.16k" size="524288" crc="0dc60a4c" sha1="4d0daa6a0272852a37f341a0cdc48baee0ad9dd8" region="sound1" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -188695,8 +188803,8 @@ <dipvalue name="Individual"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Allow Continue"> <dipvalue name="Off"/> @@ -188706,9 +188814,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tumblep"> + <game name="tumblep" sourcefile="tumblep.c"> <description>Tumble Pop (World)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188782,9 +188890,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tumblepj" cloneof="tumblep" romof="tumblep"> + <game name="tumblepj" sourcefile="tumblep.c" cloneof="tumblep" romof="tumblep"> <description>Tumble Pop (Japan)</description> <year>1991</year> <manufacturer>Data East Corporation</manufacturer> @@ -188858,9 +188966,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tumblepb" cloneof="tumblep" romof="tumblep"> + <game name="tumblepb" sourcefile="tumblep.c" cloneof="tumblep" romof="tumblep"> <description>Tumble Pop (bootleg set 1)</description> <year>1991</year> <manufacturer>bootleg</manufacturer> @@ -188932,9 +189040,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="tumblep2" cloneof="tumblep" romof="tumblep"> + <game name="tumblep2" sourcefile="tumblep.c" cloneof="tumblep" romof="tumblep"> <description>Tumble Pop (bootleg set 2)</description> <year>1991</year> <manufacturer>bootleg</manufacturer> @@ -189006,9 +189114,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="jumpkids"> + <game name="jumpkids" sourcefile="tumblep.c"> <description>Jump Kids</description> <year>1993</year> <manufacturer>Comad</manufacturer> @@ -189084,9 +189192,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="fncywld"> + <game name="fncywld" sourcefile="tumblep.c"> <description>Fancy World - Earth of Crisis</description> <year>1996</year> <manufacturer>Unico</manufacturer> @@ -189164,9 +189272,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="htchctch"> + <game name="htchctch" sourcefile="tumblep.c"> <description>Hatch Catch</description> <year>1995</year> <manufacturer>SemiCom</manufacturer> @@ -189243,9 +189351,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bcstry"> + <game name="bcstry" sourcefile="tumblep.c"> <description>BC Story</description> <year>1997</year> <manufacturer>SemiCom</manufacturer> @@ -189327,9 +189435,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lemmings"> + <game name="lemmings" sourcefile="lemmings.c"> <description>Lemmings (US Prototype)</description> <year>1991</year> <manufacturer>Data East USA</manufacturer> @@ -189410,9 +189518,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="dragngun"> + <game name="dragngun" sourcefile="deco32.c"> <description>Dragon Gun (US)</description> <year>1993</year> <manufacturer>Data East Corporation</manufacturer> @@ -189425,22 +189533,22 @@ <rom name="kb01.bin" size="262144" crc="d780ba8d" sha1="0e315c718c038962b6020945b48bcc632de6f5e1" region="cpu1" offset="300002"/> <rom name="kb05.bin" size="262144" crc="fbad737b" sha1="04e16abe8c4cec4f172bea29516535511db9db90" region="cpu1" offset="300003"/> <rom name="kb10.bin" size="65536" crc="ec56f560" sha1="feb9491683ba7f1000edebb568d6b3471fcc87fb" region="cpu2" offset="0"/> - <rom name="kb08.bin" size="65536" crc="8fe4e5f5" sha1="922b94f8ce0c35e965259c11e95891ef4be913d4" region="gfx1" dispose="yes" offset="0"/> - <rom name="kb09.bin" size="65536" crc="e9dcac3f" sha1="0621e601ffae73bbf69623042c9c8ab0526c3de6" region="gfx1" dispose="yes" offset="1"/> - <rom name="mar-00.bin" size="524288" crc="d0491a37" sha1="cc0ae1e9e5f42ba30159fb79bccd2e237cd037d0" region="gfx2" dispose="yes" offset="0"/> - <rom name="mar-01.bin" size="524288" crc="d5970365" sha1="729baf1efbef15c9f3e1d700717f5ba4f10d3014" region="gfx2" dispose="yes" offset="90000"/> - <rom name="mar-02.bin" size="1048576" crc="c6cd4baf" sha1="350286829a330b64f463d0a9cbbfdb71eecf5188" region="gfx3" dispose="yes" offset="0"/> - <rom name="mar-03.bin" size="1048576" crc="793006d7" sha1="7d8aba2fe75917f580a3a931a7defe5939a0874e" region="gfx3" dispose="yes" offset="40000"/> - <rom name="mar-04.bin" size="1048576" crc="56631a2b" sha1="0fa3d6215df8ce923c153b96f39161ba88b2dd53" region="gfx3" dispose="yes" offset="80000"/> - <rom name="mar-05.bin" size="1048576" crc="ac16e7ae" sha1="dca32e0a677a99f47a7b8e8f105483c57382f218" region="gfx3" dispose="yes" offset="c0000"/> - <rom name="mar-09.bin" size="1048576" crc="18fec9e1" sha1="1290a9c13b4fd7d2197b39ec616206796e3a17a8" region="gfx4" dispose="yes" offset="0"/> - <rom name="mar-10.bin" size="1048576" crc="73126fbc" sha1="9b9c31335e4db726863b219072c83810008f88f9" region="gfx4" dispose="yes" offset="400000"/> - <rom name="mar-11.bin" size="1048576" crc="1fc638a4" sha1="003dcfbb65a8f32a1a030502a11432287cf8b4e0" region="gfx4" dispose="yes" offset="1"/> - <rom name="mar-12.bin" size="1048576" crc="4c412512" sha1="ccd5014bc9f9648cf5fa56bb8d54fc72a7099ca3" region="gfx4" dispose="yes" offset="400001"/> - <rom name="mar-13.bin" size="1048576" crc="d675821c" sha1="ff195422d0bef62d1f9c7784bba1e6b7ab5cd211" region="gfx4" dispose="yes" offset="2"/> - <rom name="mar-14.bin" size="1048576" crc="22d38c71" sha1="62273665975f3e6000fa4b01755aeb70e5dd002d" region="gfx4" dispose="yes" offset="400002"/> - <rom name="mar-15.bin" size="1048576" crc="ec976b20" sha1="c120b3c56d5e02162e41dc7f726c260d0f8d2f1a" region="gfx4" dispose="yes" offset="3"/> - <rom name="mar-16.bin" size="1048576" crc="8b329bc8" sha1="6e34eb6e2628a01a699d20a5155afb2febc31255" region="gfx4" dispose="yes" offset="400003"/> + <rom name="kb08.bin" size="65536" crc="8fe4e5f5" sha1="922b94f8ce0c35e965259c11e95891ef4be913d4" region="gfx1" offset="0"/> + <rom name="kb09.bin" size="65536" crc="e9dcac3f" sha1="0621e601ffae73bbf69623042c9c8ab0526c3de6" region="gfx1" offset="1"/> + <rom name="mar-00.bin" size="524288" crc="d0491a37" sha1="cc0ae1e9e5f42ba30159fb79bccd2e237cd037d0" region="gfx2" offset="0"/> + <rom name="mar-01.bin" size="524288" crc="d5970365" sha1="729baf1efbef15c9f3e1d700717f5ba4f10d3014" region="gfx2" offset="90000"/> + <rom name="mar-02.bin" size="1048576" crc="c6cd4baf" sha1="350286829a330b64f463d0a9cbbfdb71eecf5188" region="gfx3" offset="0"/> + <rom name="mar-03.bin" size="1048576" crc="793006d7" sha1="7d8aba2fe75917f580a3a931a7defe5939a0874e" region="gfx3" offset="40000"/> + <rom name="mar-04.bin" size="1048576" crc="56631a2b" sha1="0fa3d6215df8ce923c153b96f39161ba88b2dd53" region="gfx3" offset="80000"/> + <rom name="mar-05.bin" size="1048576" crc="ac16e7ae" sha1="dca32e0a677a99f47a7b8e8f105483c57382f218" region="gfx3" offset="c0000"/> + <rom name="mar-09.bin" size="1048576" crc="18fec9e1" sha1="1290a9c13b4fd7d2197b39ec616206796e3a17a8" region="gfx4" offset="0"/> + <rom name="mar-10.bin" size="1048576" crc="73126fbc" sha1="9b9c31335e4db726863b219072c83810008f88f9" region="gfx4" offset="400000"/> + <rom name="mar-11.bin" size="1048576" crc="1fc638a4" sha1="003dcfbb65a8f32a1a030502a11432287cf8b4e0" region="gfx4" offset="1"/> + <rom name="mar-12.bin" size="1048576" crc="4c412512" sha1="ccd5014bc9f9648cf5fa56bb8d54fc72a7099ca3" region="gfx4" offset="400001"/> + <rom name="mar-13.bin" size="1048576" crc="d675821c" sha1="ff195422d0bef62d1f9c7784bba1e6b7ab5cd211" region="gfx4" offset="2"/> + <rom name="mar-14.bin" size="1048576" crc="22d38c71" sha1="62273665975f3e6000fa4b01755aeb70e5dd002d" region="gfx4" offset="400002"/> + <rom name="mar-15.bin" size="1048576" crc="ec976b20" sha1="c120b3c56d5e02162e41dc7f726c260d0f8d2f1a" region="gfx4" offset="3"/> + <rom name="mar-16.bin" size="1048576" crc="8b329bc8" sha1="6e34eb6e2628a01a699d20a5155afb2febc31255" region="gfx4" offset="400003"/> <rom name="mar-17.bin" size="1048576" crc="7799ed23" sha1="ae28ad4fa6033a3695fa83356701b3774b26e6b0" region="gfx5" offset="0"/> <rom name="mar-18.bin" size="1048576" crc="ded66da9" sha1="5134cb47043cc190a35ebdbf1912166669f9c055" region="gfx5" offset="0"/> <rom name="mar-19.bin" size="1048576" crc="bdd1ed20" sha1="2435b23210b8fee4d39c30d4d3c6ea40afaa3b93" region="gfx5" offset="0"/> @@ -189456,7 +189564,7 @@ <rom name="dgadpcm2.bin" size="524288" crc="3e006c6e" sha1="55786e0fde2bf6ba9802f3f4fa8d4c21625b976a" region="sound1" offset="0"/> <rom name="dgadpcm1.bin" size="524288" crc="b9281dfd" sha1="449faf5d36f3b970d0a9b483e2152a5f68604a77" region="sound2" offset="0"/> <rom name="mar-07.bin" size="524288" crc="40287d62" sha1="c00cb08bcdae55bcddc14c38e88b0484b1bc9e3e" region="sound3" offset="0"/> - <chip type="cpu" name="ARM" clock="14000000"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -189499,9 +189607,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="wizdfire"> + <game name="wizdfire" sourcefile="rohga.c"> <description>Wizard Fire (US v1.1)</description> <year>1992</year> <manufacturer>Data East Corporation</manufacturer> @@ -189589,9 +189697,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="darksel2" cloneof="wizdfire" romof="wizdfire"> + <game name="darksel2" sourcefile="rohga.c" cloneof="wizdfire" romof="wizdfire"> <description>Dark Seal 2 (Japan v2.1)</description> <year>1992</year> <manufacturer>Data East Corporation</manufacturer> @@ -189679,9 +189787,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="funkyjet"> + <game name="funkyjet" sourcefile="funkyjet.c"> <description>Funky Jet</description> <year>1992</year> <manufacturer>[Data East] (Mitchell license)</manufacturer> @@ -189753,9 +189861,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nitrobal"> + <game name="nitrobal" sourcefile="rohga.c"> <description>Nitro Ball (US)</description> <year>1992</year> <manufacturer>Data East Corporation</manufacturer> @@ -189848,9 +189956,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fghthist"> + <game name="fghthist" sourcefile="deco32.c"> <description>Fighter's History (US)</description> <year>1993</year> <manufacturer>Data East Corporation</manufacturer> @@ -189866,7 +189974,7 @@ <rom name="mbf06.bin" size="524288" crc="fb513903" sha1="7727a49ff7977f159ed36d097020edef3b5b36ba" region="sound1" offset="0"/> <rom name="mbf07.bin" size="524288" crc="51d4adc7" sha1="22106ed7a05db94adc5a783ce34529e29d24d41a" region="sound2" offset="0"/> <rom name="mb7124h.8j" size="512" crc="7294354b" sha1="14fe42ad5d26d022c0fe9a46a4a9017af2296f40" region="proms" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -189874,9 +189982,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fghthstw" cloneof="fghthist" romof="fghthist"> + <game name="fghthstw" sourcefile="deco32.c" cloneof="fghthist" romof="fghthist"> <description>Fighter's History (World)</description> <year>1993</year> <manufacturer>Data East Corporation</manufacturer> @@ -189892,7 +190000,7 @@ <rom name="mbf06.bin" merge="mbf06.bin" size="524288" crc="fb513903" sha1="7727a49ff7977f159ed36d097020edef3b5b36ba" region="sound1" offset="0"/> <rom name="mbf07.bin" merge="mbf07.bin" size="524288" crc="51d4adc7" sha1="22106ed7a05db94adc5a783ce34529e29d24d41a" region="sound2" offset="0"/> <rom name="mb7124h.8j" merge="mb7124h.8j" size="512" crc="7294354b" sha1="14fe42ad5d26d022c0fe9a46a4a9017af2296f40" region="proms" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -189900,9 +190008,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fghthsta" cloneof="fghthist" romof="fghthist"> + <game name="fghthsta" sourcefile="deco32.c" cloneof="fghthist" romof="fghthist"> <description>Fighter's History (US Alternate Hardware)</description> <year>1993</year> <manufacturer>Data East Corporation</manufacturer> @@ -189918,7 +190026,7 @@ <rom name="mbf06.bin" merge="mbf06.bin" size="524288" crc="fb513903" sha1="7727a49ff7977f159ed36d097020edef3b5b36ba" region="sound1" offset="0"/> <rom name="mbf07.bin" merge="mbf07.bin" size="524288" crc="51d4adc7" sha1="22106ed7a05db94adc5a783ce34529e29d24d41a" region="sound2" offset="0"/> <rom name="mb7124h.8j" merge="mb7124h.8j" size="512" crc="7294354b" sha1="14fe42ad5d26d022c0fe9a46a4a9017af2296f40" region="proms" offset="0"/> - <chip type="cpu" name="ARM" clock="9333333"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -189926,36 +190034,96 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="nslasher"> - <description>Night Slashers</description> + <game name="nslasher" sourcefile="deco32.c"> + <description>Night Slashers (Korea Rev 1.3)</description> <year>1994</year> <manufacturer>Data East Corporation</manufacturer> <rom name="mainprg.1f" size="524288" crc="507acbae" sha1="329a2bb244f2f3adb8d75cab5aa2dcb129d70712" region="cpu1" offset="0"/> <rom name="mainprg.2f" size="524288" crc="931fc7ee" sha1="54eb12abfa3f332ce9b43a45ec424aaee88641a6" region="cpu1" offset="2"/> <rom name="sndprg.17l" size="65536" crc="18939e92" sha1="50b37a78d9d2259d4b140dd17393c4e5ca92bca5" region="cpu2" offset="0"/> - <rom name="mbh-00.8c" size="2097152" crc="a877f8a3" sha1="79253525f360a73161894f31e211e4d6b38d307a" region="gfx1" dispose="yes" offset="0"/> - <rom name="mbh-01.9c" size="2097152" crc="1853dafc" sha1="b1183c0db301cbed9f079c782202dbfc553b198e" region="gfx2" dispose="yes" offset="0"/> - <rom name="mbh-02.14c" size="2097152" crc="b2f158a1" sha1="4f8c0b324813db198fe1dad7fff4185b828b94de" region="gfx3" dispose="yes" offset="1"/> - <rom name="mbh-04.16c" size="2097152" crc="eecfe06d" sha1="2df817fe5e2ea31207b217bb03dc58979c05d0d2" region="gfx3" dispose="yes" offset="0"/> - <rom name="mbh-03.15c" size="524288" crc="787787e3" sha1="531444e3f28aa9a7539a5a76ca94a9d6b97274c5" region="gfx3" dispose="yes" offset="400001"/> - <rom name="mbh-05.17c" size="524288" crc="1d2b7c17" sha1="ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602" region="gfx3" dispose="yes" offset="400000"/> - <rom name="mbh-06.18c" size="1048576" crc="038c2127" sha1="5bdb215305f1a419fde27a83b623a38b9328e560" region="gfx3" dispose="yes" offset="a00000"/> - <rom name="mbh-07.19c" size="262144" crc="bbd22323" sha1="6ab665b2e6d04cdadc48c52e15098e978b61fe10" region="gfx3" dispose="yes" offset="b00000"/> - <rom name="mbh-08.16e" size="524288" crc="cdd7f8cb" sha1="910bbe8783c0ba722e9d6399b332d658fa059fdb" region="gfx4" dispose="yes" offset="1"/> - <rom name="mbh-09.18e" size="524288" crc="33fa2121" sha1="eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3" region="gfx4" dispose="yes" offset="0"/> + <rom name="mbh-00.8c" size="2097152" crc="a877f8a3" sha1="79253525f360a73161894f31e211e4d6b38d307a" region="gfx1" offset="0"/> + <rom name="mbh-01.9c" size="2097152" crc="1853dafc" sha1="b1183c0db301cbed9f079c782202dbfc553b198e" region="gfx2" offset="0"/> + <rom name="mbh-02.14c" size="2097152" crc="b2f158a1" sha1="4f8c0b324813db198fe1dad7fff4185b828b94de" region="gfx3" offset="1"/> + <rom name="mbh-04.16c" size="2097152" crc="eecfe06d" sha1="2df817fe5e2ea31207b217bb03dc58979c05d0d2" region="gfx3" offset="0"/> + <rom name="mbh-03.15c" size="524288" crc="787787e3" sha1="531444e3f28aa9a7539a5a76ca94a9d6b97274c5" region="gfx3" offset="400001"/> + <rom name="mbh-05.17c" size="524288" crc="1d2b7c17" sha1="ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602" region="gfx3" offset="400000"/> + <rom name="mbh-06.18c" size="1048576" crc="038c2127" sha1="5bdb215305f1a419fde27a83b623a38b9328e560" region="gfx3" offset="500000"/> + <rom name="mbh-07.19c" size="262144" crc="bbd22323" sha1="6ab665b2e6d04cdadc48c52e15098e978b61fe10" region="gfx3" offset="900000"/> + <rom name="mbh-08.16e" size="524288" crc="cdd7f8cb" sha1="910bbe8783c0ba722e9d6399b332d658fa059fdb" region="gfx4" offset="1"/> + <rom name="mbh-09.18e" size="524288" crc="33fa2121" sha1="eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3" region="gfx4" offset="0"/> <rom name="mbh-10.14l" size="524288" crc="c4d6b116" sha1="c5685bce6a6c6a74ca600ebf766ba1007f0dc666" region="sound1" offset="0"/> <rom name="mbh-11.16l" size="524288" crc="0ec40b6b" sha1="9fef44149608ae2a00f6a75a6f77f2efcab6e78e" region="sound2" offset="0"/> - <chip type="cpu" name="ARM" clock="14000000"/> - <chip type="cpu" soundonly="yes" name="M6809" clock="2000000"/> - <chip type="audio" name="BSMT2000" clock="24000000"/> + <chip type="cpu" name="ARM" clock="7080500"/> + <chip type="cpu" soundonly="yes" name="Z80" clock="3580000"/> + <chip type="audio" name="YM2151" clock="3580000"/> + <chip type="audio" name="MSM6295" clock="7627"/> + <chip type="audio" name="MSM6295" clock="7627"/> <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> - <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <input players="3" control="joy8way" buttons="3" coins="2" service="yes"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="lockload"> + <game name="nslasherj" sourcefile="deco32.c" cloneof="nslasher" romof="nslasher"> + <description>Night Slashers (Japan Rev 1.2)</description> + <year>1994</year> + <manufacturer>Data East Corporation</manufacturer> + <rom name="lx-00.1f" size="524288" crc="6ed5fb88" sha1="84350da7939a479968a523c84e254e3ee54b8da2" region="cpu1" offset="0"/> + <rom name="lx-01.2f" size="524288" crc="a6df2152" sha1="6fe7e0b2e71c5f807951dcc81a6a3cff55247961" region="cpu1" offset="2"/> + <rom name="sndprg.17l" merge="sndprg.17l" size="65536" crc="18939e92" sha1="50b37a78d9d2259d4b140dd17393c4e5ca92bca5" region="cpu2" offset="0"/> + <rom name="mbh-00.8c" merge="mbh-00.8c" size="2097152" crc="a877f8a3" sha1="79253525f360a73161894f31e211e4d6b38d307a" region="gfx1" offset="0"/> + <rom name="mbh-01.9c" merge="mbh-01.9c" size="2097152" crc="1853dafc" sha1="b1183c0db301cbed9f079c782202dbfc553b198e" region="gfx2" offset="0"/> + <rom name="mbh-02.14c" merge="mbh-02.14c" size="2097152" crc="b2f158a1" sha1="4f8c0b324813db198fe1dad7fff4185b828b94de" region="gfx3" offset="1"/> + <rom name="mbh-04.16c" merge="mbh-04.16c" size="2097152" crc="eecfe06d" sha1="2df817fe5e2ea31207b217bb03dc58979c05d0d2" region="gfx3" offset="0"/> + <rom name="mbh-03.15c" merge="mbh-03.15c" size="524288" crc="787787e3" sha1="531444e3f28aa9a7539a5a76ca94a9d6b97274c5" region="gfx3" offset="400001"/> + <rom name="mbh-05.17c" merge="mbh-05.17c" size="524288" crc="1d2b7c17" sha1="ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602" region="gfx3" offset="400000"/> + <rom name="mbh-06.18c" merge="mbh-06.18c" size="1048576" crc="038c2127" sha1="5bdb215305f1a419fde27a83b623a38b9328e560" region="gfx3" offset="500000"/> + <rom name="mbh-07.19c" merge="mbh-07.19c" size="262144" crc="bbd22323" sha1="6ab665b2e6d04cdadc48c52e15098e978b61fe10" region="gfx3" offset="900000"/> + <rom name="mbh-08.16e" merge="mbh-08.16e" size="524288" crc="cdd7f8cb" sha1="910bbe8783c0ba722e9d6399b332d658fa059fdb" region="gfx4" offset="1"/> + <rom name="mbh-09.18e" merge="mbh-09.18e" size="524288" crc="33fa2121" sha1="eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3" region="gfx4" offset="0"/> + <rom name="mbh-10.14l" merge="mbh-10.14l" size="524288" crc="c4d6b116" sha1="c5685bce6a6c6a74ca600ebf766ba1007f0dc666" region="sound1" offset="0"/> + <rom name="mbh-11.16l" merge="mbh-11.16l" size="524288" crc="0ec40b6b" sha1="9fef44149608ae2a00f6a75a6f77f2efcab6e78e" region="sound2" offset="0"/> + <chip type="cpu" name="ARM" clock="7080500"/> + <chip type="cpu" soundonly="yes" name="Z80" clock="3580000"/> + <chip type="audio" name="YM2151" clock="3580000"/> + <chip type="audio" name="MSM6295" clock="7627"/> + <chip type="audio" name="MSM6295" clock="7627"/> + <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> + <sound channels="2"/> + <input players="3" control="joy8way" buttons="3" coins="2" service="yes"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> + </game> + <game name="nslashers" sourcefile="deco32.c" cloneof="nslasher" romof="nslasher"> + <description>Night Slashers (Over Sea Rev 1.2)</description> + <year>1994</year> + <manufacturer>Data East Corporation</manufacturer> + <rom name="ly-00.1f" size="524288" crc="fa0646f9" sha1="7f9633bda230a0ced59171cdc5ab40a6d56c3d34" region="cpu1" offset="0"/> + <rom name="ly-01.2f" size="524288" crc="ae508149" sha1="3592949e5fb2770adb9c9daa4e38c4e75f3e2554" region="cpu1" offset="2"/> + <rom name="sndprg.17l" merge="sndprg.17l" size="65536" crc="18939e92" sha1="50b37a78d9d2259d4b140dd17393c4e5ca92bca5" region="cpu2" offset="0"/> + <rom name="mbh-00.8c" merge="mbh-00.8c" size="2097152" crc="a877f8a3" sha1="79253525f360a73161894f31e211e4d6b38d307a" region="gfx1" offset="0"/> + <rom name="mbh-01.9c" merge="mbh-01.9c" size="2097152" crc="1853dafc" sha1="b1183c0db301cbed9f079c782202dbfc553b198e" region="gfx2" offset="0"/> + <rom name="mbh-02.14c" merge="mbh-02.14c" size="2097152" crc="b2f158a1" sha1="4f8c0b324813db198fe1dad7fff4185b828b94de" region="gfx3" offset="1"/> + <rom name="mbh-04.16c" merge="mbh-04.16c" size="2097152" crc="eecfe06d" sha1="2df817fe5e2ea31207b217bb03dc58979c05d0d2" region="gfx3" offset="0"/> + <rom name="mbh-03.15c" merge="mbh-03.15c" size="524288" crc="787787e3" sha1="531444e3f28aa9a7539a5a76ca94a9d6b97274c5" region="gfx3" offset="400001"/> + <rom name="mbh-05.17c" merge="mbh-05.17c" size="524288" crc="1d2b7c17" sha1="ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602" region="gfx3" offset="400000"/> + <rom name="mbh-06.18c" merge="mbh-06.18c" size="1048576" crc="038c2127" sha1="5bdb215305f1a419fde27a83b623a38b9328e560" region="gfx3" offset="500000"/> + <rom name="mbh-07.19c" merge="mbh-07.19c" size="262144" crc="bbd22323" sha1="6ab665b2e6d04cdadc48c52e15098e978b61fe10" region="gfx3" offset="900000"/> + <rom name="mbh-08.16e" merge="mbh-08.16e" size="524288" crc="cdd7f8cb" sha1="910bbe8783c0ba722e9d6399b332d658fa059fdb" region="gfx4" offset="1"/> + <rom name="mbh-09.18e" merge="mbh-09.18e" size="524288" crc="33fa2121" sha1="eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3" region="gfx4" offset="0"/> + <rom name="mbh-10.14l" merge="mbh-10.14l" size="524288" crc="c4d6b116" sha1="c5685bce6a6c6a74ca600ebf766ba1007f0dc666" region="sound1" offset="0"/> + <rom name="mbh-11.16l" merge="mbh-11.16l" size="524288" crc="0ec40b6b" sha1="9fef44149608ae2a00f6a75a6f77f2efcab6e78e" region="sound2" offset="0"/> + <chip type="cpu" name="ARM" clock="7080500"/> + <chip type="cpu" soundonly="yes" name="Z80" clock="3580000"/> + <chip type="audio" name="YM2151" clock="3580000"/> + <chip type="audio" name="MSM6295" clock="7627"/> + <chip type="audio" name="MSM6295" clock="7627"/> + <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> + <sound channels="2"/> + <input players="3" control="joy8way" buttons="3" coins="2" service="yes"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> + </game> + <game name="lockload" sourcefile="deco32.c"> <description>Locked 'n Loaded (US)</description> <year>1994</year> <manufacturer>Data East Corporation</manufacturer> @@ -189983,7 +190151,7 @@ <rom name="mbm-06.n17" size="1048576" crc="f34d5999" sha1="265b5f4e8598bcf9183bf9bd95db69b01536acb2" region="sound1" offset="0"/> <rom name="mbm-07.n21" size="524288" crc="414f3793" sha1="ed5f63e57390d503193fd1e9f7294ae1da6d3539" region="sound2" offset="0"/> <rom name="mar-07.n19" size="524288" crc="40287d62" sha1="c00cb08bcdae55bcddc14c38e88b0484b1bc9e3e" region="sound3" offset="0"/> - <chip type="cpu" name="ARM" clock="14000000"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="HuC6280" clock="4027500"/> <chip type="audio" name="YM2151" clock="3580000"/> <chip type="audio" name="MSM6295" clock="7627"/> @@ -190026,9 +190194,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="tattass"> + <game name="tattass" sourcefile="deco32.c"> <description>Tattoo Assassins (US Prototype)</description> <year>1994</year> <manufacturer>Data East Pinball</manufacturer> @@ -190083,15 +190251,15 @@ <rom name="u21.snd" size="524288" crc="10b2110c" sha1="83e5938ed22da2874022e1dc8df76c72d95c448d" region="sound1" offset="80000"/> <rom name="u36.snd" size="524288" crc="3b73abe2" sha1="195096e2302e84123b23b4ccd982fb3ab9afe42c" region="sound1" offset="100000"/> <rom name="u37.snd" size="524288" crc="986066b5" sha1="9dd1a14de81733617cf51293674a8e26fc5cec68" region="sound1" offset="180000"/> - <chip type="cpu" name="ARM" clock="14000000"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="M6809" clock="2000000"/> <chip type="audio" name="BSMT2000" clock="24000000"/> <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="tattassa" cloneof="tattass" romof="tattass"> + <game name="tattassa" sourcefile="deco32.c" cloneof="tattass" romof="tattass"> <description>Tattoo Assassins (Asia Prototype)</description> <year>1994</year> <manufacturer>Data East Pinball</manufacturer> @@ -190146,15 +190314,15 @@ <rom name="u21.snd" merge="u21.snd" size="524288" crc="10b2110c" sha1="83e5938ed22da2874022e1dc8df76c72d95c448d" region="sound1" offset="80000"/> <rom name="u36.snd" merge="u36.snd" size="524288" crc="3b73abe2" sha1="195096e2302e84123b23b4ccd982fb3ab9afe42c" region="sound1" offset="100000"/> <rom name="u37.snd" merge="u37.snd" size="524288" crc="986066b5" sha1="9dd1a14de81733617cf51293674a8e26fc5cec68" region="sound1" offset="180000"/> - <chip type="cpu" name="ARM" clock="14000000"/> + <chip type="cpu" name="ARM" clock="7000000"/> <chip type="cpu" soundonly="yes" name="M6809" clock="2000000"/> <chip type="audio" name="BSMT2000" clock="24000000"/> <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="6" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="avengrgs"> + <game name="avengrgs" sourcefile="avengrgs.c"> <description>Avengers In Galactic Storm (Japan)</description> <year>1995</year> <manufacturer>Data East Corporation</manufacturer> @@ -190183,9 +190351,9 @@ <input players="2" control="joy8way" buttons="4" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sotsugyo"> + <game name="sotsugyo" sourcefile="funkyjet.c"> <description>Sotsugyo Shousho</description> <year>1995</year> <manufacturer>Mitchell (Atlus license)</manufacturer> @@ -190257,9 +190425,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sshangha"> + <game name="sshangha" sourcefile="sshangha.c"> <description>Super Shanghai Dragon's Eye (Japan)</description> <year>1992</year> <manufacturer>Hot-B.</manufacturer> @@ -190334,9 +190502,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="protection" color="good" sound="preliminary" palettesize="4096"/> + <driver status="protection" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="sshanghb" cloneof="sshangha" romof="sshangha"> + <game name="sshanghb" sourcefile="sshangha.c" cloneof="sshangha" romof="sshangha"> <description>Super Shanghai Dragon's Eye (World, bootleg)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -190411,9 +190579,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4096"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="senjyo"> + <game name="senjyo" sourcefile="senjyo.c"> <description>Senjyo</description> <year>1983</year> <manufacturer>Tehkan</manufacturer> @@ -190503,9 +190671,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="402"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="402"/> </game> - <game name="starforc"> + <game name="starforc" sourcefile="senjyo.c"> <description>Star Force</description> <year>1984</year> <manufacturer>Tehkan</manufacturer> @@ -190589,9 +190757,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="402"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="402"/> </game> - <game name="starfore" cloneof="starforc" romof="starforc"> + <game name="starfore" sourcefile="senjyo.c" cloneof="starforc" romof="starforc"> <description>Star Force (encrypted)</description> <year>1984</year> <manufacturer>Tehkan</manufacturer> @@ -190677,9 +190845,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="402"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="402"/> </game> - <game name="megaforc" cloneof="starforc" romof="starforc"> + <game name="megaforc" sourcefile="senjyo.c" cloneof="starforc" romof="starforc"> <description>Mega Force</description> <year>1985</year> <manufacturer>Tehkan (Video Ware license)</manufacturer> @@ -190763,9 +190931,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="402"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="402"/> </game> - <game name="baluba"> + <game name="baluba" sourcefile="senjyo.c"> <description>Baluba-louk no Densetsu</description> <year>1986</year> <manufacturer>Able Corp, Ltd.</manufacturer> @@ -190851,9 +191019,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="402"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="402"/> </game> - <game name="bombjack"> + <game name="bombjack" sourcefile="bombjack.c"> <description>Bomb Jack (set 1)</description> <year>1984</year> <manufacturer>Tehkan</manufacturer> @@ -190933,9 +191101,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="bombjac2" cloneof="bombjack" romof="bombjack"> + <game name="bombjac2" sourcefile="bombjack.c" cloneof="bombjack" romof="bombjack"> <description>Bomb Jack (set 2)</description> <year>1984</year> <manufacturer>Tehkan</manufacturer> @@ -191015,9 +191183,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="pbaction"> + <game name="pbaction" sourcefile="pbaction.c"> <description>Pinball Action (set 1)</description> <year>1985</year> <manufacturer>Tehkan</manufacturer> @@ -191095,9 +191263,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pbactio2" cloneof="pbaction" romof="pbaction"> + <game name="pbactio2" sourcefile="pbaction.c" cloneof="pbaction" romof="pbaction"> <description>Pinball Action (set 2)</description> <year>1985</year> <manufacturer>Tehkan</manufacturer> @@ -191176,9 +191344,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tehkanwc"> + <game name="tehkanwc" sourcefile="tehkanwc.c"> <description>Tehkan World Cup</description> <year>1985</year> <manufacturer>Tehkan</manufacturer> @@ -191286,9 +191454,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="gridiron"> + <game name="gridiron" sourcefile="tehkanwc.c"> <description>Gridiron Fight</description> <year>1985</year> <manufacturer>Tehkan</manufacturer> @@ -191380,9 +191548,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="teedoff"> + <game name="teedoff" sourcefile="tehkanwc.c"> <description>Tee'd Off (Japan)</description> <year>1986</year> <manufacturer>Tecmo</manufacturer> @@ -191448,9 +191616,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="solomon"> + <game name="solomon" sourcefile="solomon.c"> <description>Solomon's Key (Japan)</description> <year>1986</year> <manufacturer>Tecmo</manufacturer> @@ -191526,9 +191694,9 @@ <dipvalue name="200k"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rygar"> + <game name="rygar" sourcefile="tecmo.c"> <description>Rygar (US set 1)</description> <year>1986</year> <manufacturer>Tecmo</manufacturer> @@ -191611,9 +191779,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rygar2" cloneof="rygar" romof="rygar"> + <game name="rygar2" sourcefile="tecmo.c" cloneof="rygar" romof="rygar"> <description>Rygar (US set 2)</description> <year>1986</year> <manufacturer>Tecmo</manufacturer> @@ -191696,9 +191864,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rygarj" cloneof="rygar" romof="rygar"> + <game name="rygarj" sourcefile="tecmo.c" cloneof="rygar" romof="rygar"> <description>Argus no Senshi (Japan)</description> <year>1986</year> <manufacturer>Tecmo</manufacturer> @@ -191781,9 +191949,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gemini"> + <game name="gemini" sourcefile="tecmo.c"> <description>Gemini Wing</description> <year>1987</year> <manufacturer>Tecmo</manufacturer> @@ -191865,9 +192033,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="silkworm"> + <game name="silkworm" sourcefile="tecmo.c"> <description>Silk Worm (set 1)</description> <year>1988</year> <manufacturer>Tecmo</manufacturer> @@ -191947,9 +192115,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="silkwrm2" cloneof="silkworm" romof="silkworm"> + <game name="silkwrm2" sourcefile="tecmo.c" cloneof="silkworm" romof="silkworm"> <description>Silk Worm (set 2)</description> <year>1988</year> <manufacturer>Tecmo</manufacturer> @@ -192029,9 +192197,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tbowl"> + <game name="tbowl" sourcefile="tbowl.c"> <description>Tecmo Bowl (World?)</description> <year>1987</year> <manufacturer>Tecmo</manufacturer> @@ -192149,9 +192317,9 @@ <dipvalue name="0x08 = 0x54cf"/> <dipvalue name="0x0c = 0x54bd" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="tbowlj" cloneof="tbowl" romof="tbowl"> + <game name="tbowlj" sourcefile="tbowl.c" cloneof="tbowl" romof="tbowl"> <description>Tecmo Bowl (Japan)</description> <year>1987</year> <manufacturer>Tecmo</manufacturer> @@ -192269,9 +192437,9 @@ <dipvalue name="0x08 = 0x54f0"/> <dipvalue name="0x0c = 0x54de" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="shadoww"> + <game name="shadoww" sourcefile="gaiden.c"> <description>Shadow Warriors (World set 1)</description> <year>1988</year> <manufacturer>Tecmo</manufacturer> @@ -192362,9 +192530,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shadowwa" cloneof="shadoww" romof="shadoww"> + <game name="shadowwa" sourcefile="gaiden.c" cloneof="shadoww" romof="shadoww"> <description>Shadow Warriors (World set 2)</description> <year>1988</year> <manufacturer>Tecmo</manufacturer> @@ -192455,9 +192623,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gaiden" cloneof="shadoww" romof="shadoww"> + <game name="gaiden" sourcefile="gaiden.c" cloneof="shadoww" romof="shadoww"> <description>Ninja Gaiden (US)</description> <year>1988</year> <manufacturer>Tecmo</manufacturer> @@ -192546,9 +192714,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ryukendn" cloneof="shadoww" romof="shadoww"> + <game name="ryukendn" sourcefile="gaiden.c" cloneof="shadoww" romof="shadoww"> <description>Ninja Ryukenden (Japan)</description> <year>1989</year> <manufacturer>Tecmo</manufacturer> @@ -192640,9 +192808,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wildfang"> + <game name="wildfang" sourcefile="gaiden.c"> <description>Wild Fang / Tecmo Knight</description> <year>1989</year> <manufacturer>Tecmo</manufacturer> @@ -192719,9 +192887,9 @@ <dipvalue name="Wild Fang" default="yes"/> <dipvalue name="Tecmo Knight"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tknight" cloneof="wildfang" romof="wildfang"> + <game name="tknight" sourcefile="gaiden.c" cloneof="wildfang" romof="wildfang"> <description>Tecmo Knight</description> <year>1989</year> <manufacturer>Tecmo</manufacturer> @@ -192797,9 +192965,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="stratof"> + <game name="stratof" sourcefile="gaiden.c"> <description>Raiga - Strato Fighter (US)</description> <year>1991</year> <manufacturer>Tecmo</manufacturer> @@ -192883,9 +193051,9 @@ <dipvalue name="50k only"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="raiga" cloneof="stratof" romof="stratof"> + <game name="raiga" sourcefile="gaiden.c" cloneof="stratof" romof="stratof"> <description>Raiga - Strato Fighter (Japan)</description> <year>1991</year> <manufacturer>Tecmo</manufacturer> @@ -192969,9 +193137,9 @@ <dipvalue name="50k only"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="wc90"> + <game name="wc90" sourcefile="wc90.c"> <description>Tecmo World Cup '90 (set 1)</description> <year>1989</year> <manufacturer>Tecmo</manufacturer> @@ -193057,9 +193225,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="wc90a" cloneof="wc90" romof="wc90"> + <game name="wc90a" sourcefile="wc90.c" cloneof="wc90" romof="wc90"> <description>Tecmo World Cup '90 (set 2)</description> <year>1989</year> <manufacturer>Tecmo</manufacturer> @@ -193145,9 +193313,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="wc90t" cloneof="wc90" romof="wc90"> + <game name="wc90t" sourcefile="wc90.c" cloneof="wc90" romof="wc90"> <description>Tecmo World Cup '90 (trackball)</description> <year>1989</year> <manufacturer>Tecmo</manufacturer> @@ -193233,9 +193401,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="wc90b" cloneof="wc90" romof="wc90"> + <game name="wc90b" sourcefile="wc90b.c" cloneof="wc90" romof="wc90"> <description>Euro League</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -193328,9 +193496,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="spbactn"> + <game name="spbactn" sourcefile="spbactn.c"> <description>Super Pinball Action (US)</description> <year>1991</year> <manufacturer>Tecmo</manufacturer> @@ -193405,9 +193573,9 @@ <dipvalue name="1/20" default="yes"/> <dipvalue name="1/40"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="5120"/> </game> - <game name="spbactnj" cloneof="spbactn" romof="spbactn"> + <game name="spbactnj" sourcefile="spbactn.c" cloneof="spbactn" romof="spbactn"> <description>Super Pinball Action (Japan)</description> <year>1991</year> <manufacturer>Tecmo</manufacturer> @@ -193482,9 +193650,9 @@ <dipvalue name="1/20" default="yes"/> <dipvalue name="1/40"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="5120"/> </game> - <game name="fstarfrc"> + <game name="fstarfrc" sourcefile="tecmo16.c"> <description>Final Star Force (US)</description> <year>1992</year> <manufacturer>Tecmo</manufacturer> @@ -193556,9 +193724,9 @@ <dipvalue name="240000,1400000"/> <dipvalue name="every 500000,once at highest score"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ginkun"> + <game name="ginkun" sourcefile="tecmo16.c"> <description>Ganbare Ginkun</description> <year>1995</year> <manufacturer>Tecmo</manufacturer> @@ -193634,9 +193802,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="deroon"> + <game name="deroon" sourcefile="tecmosys.c"> <description>Deroon DeroDero</description> <year>1996</year> <manufacturer>Tecmo</manufacturer> @@ -193660,9 +193828,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="tkdensho"> + <game name="tkdensho" sourcefile="tecmosys.c"> <description>Touki Denshou -Angel Eyes-</description> <year>1996</year> <manufacturer>Tecmo</manufacturer> @@ -193693,9 +193861,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="tutankhm"> + <game name="tutankhm" sourcefile="tutankhm.c"> <description>Tutankham</description> <year>1982</year> <manufacturer>Konami</manufacturer> @@ -193787,9 +193955,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="tutankst" cloneof="tutankhm" romof="tutankhm"> + <game name="tutankst" sourcefile="tutankhm.c" cloneof="tutankhm" romof="tutankhm"> <description>Tutankham (Stern)</description> <year>1982</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -193881,9 +194049,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="junofrst"> + <game name="junofrst" sourcefile="junofrst.c"> <description>Juno First</description> <year>1983</year> <manufacturer>Konami</manufacturer> @@ -193973,9 +194141,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="junofstg" cloneof="junofrst" romof="junofrst"> + <game name="junofstg" sourcefile="junofrst.c" cloneof="junofrst" romof="junofrst"> <description>Juno First (Gottlieb)</description> <year>1983</year> <manufacturer>Konami (Gottlieb license)</manufacturer> @@ -194065,9 +194233,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Disabled"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="pooyan"> + <game name="pooyan" sourcefile="pooyan.c"> <description>Pooyan</description> <year>1982</year> <manufacturer>Konami</manufacturer> @@ -194155,9 +194323,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pooyans" cloneof="pooyan" romof="pooyan"> + <game name="pooyans" sourcefile="pooyan.c" cloneof="pooyan" romof="pooyan"> <description>Pooyan (Stern)</description> <year>1982</year> <manufacturer>[Konami] (Stern license)</manufacturer> @@ -194245,9 +194413,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pootan" cloneof="pooyan" romof="pooyan"> + <game name="pootan" sourcefile="pooyan.c" cloneof="pooyan" romof="pooyan"> <description>Pootan</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -194335,9 +194503,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="timeplt"> + <game name="timeplt" sourcefile="timeplt.c"> <description>Time Pilot</description> <year>1982</year> <manufacturer>Konami</manufacturer> @@ -194423,9 +194591,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="timepltc" cloneof="timeplt" romof="timeplt"> + <game name="timepltc" sourcefile="timeplt.c" cloneof="timeplt" romof="timeplt"> <description>Time Pilot (Centuri)</description> <year>1982</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -194511,9 +194679,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="spaceplt" cloneof="timeplt" romof="timeplt"> + <game name="spaceplt" sourcefile="timeplt.c" cloneof="timeplt" romof="timeplt"> <description>Space Pilot</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -194599,9 +194767,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="psurge"> + <game name="psurge" sourcefile="timeplt.c"> <description>Power Surge</description> <year>1988</year> <manufacturer><unknown></manufacturer> @@ -194680,9 +194848,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="megazone"> + <game name="megazone" sourcefile="megazone.c"> <description>Mega Zone</description> <year>1983</year> <manufacturer>Konami</manufacturer> @@ -194774,9 +194942,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="megaznik" cloneof="megazone" romof="megazone"> + <game name="megaznik" sourcefile="megazone.c" cloneof="megazone" romof="megazone"> <description>Mega Zone (Kosuka)</description> <year>1983</year> <manufacturer>Konami / Interlogic + Kosuka</manufacturer> @@ -194868,9 +195036,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pandoras"> + <game name="pandoras" sourcefile="pandoras.c"> <description>Pandora's Palace</description> <year>1984</year> <manufacturer>Konami/Interlogic</manufacturer> @@ -194991,9 +195159,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="gyruss"> + <game name="gyruss" sourcefile="gyruss.c"> <description>Gyruss (Konami)</description> <year>1983</year> <manufacturer>Konami</manufacturer> @@ -195093,9 +195261,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="gyrussce" cloneof="gyruss" romof="gyruss"> + <game name="gyrussce" sourcefile="gyruss.c" cloneof="gyruss" romof="gyruss"> <description>Gyruss (Centuri)</description> <year>1983</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -195195,9 +195363,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="venus" cloneof="gyruss" romof="gyruss"> + <game name="venus" sourcefile="gyruss.c" cloneof="gyruss" romof="gyruss"> <description>Venus</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -195297,9 +195465,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="trackfld"> + <game name="trackfld" sourcefile="trackfld.c"> <description>Track & Field</description> <year>1983</year> <manufacturer>Konami</manufacturer> @@ -195394,9 +195562,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="trackflc" cloneof="trackfld" romof="trackfld"> + <game name="trackflc" sourcefile="trackfld.c" cloneof="trackfld" romof="trackfld"> <description>Track & Field (Centuri)</description> <year>1983</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -195491,9 +195659,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hyprolym" cloneof="trackfld" romof="trackfld"> + <game name="hyprolym" sourcefile="trackfld.c" cloneof="trackfld" romof="trackfld"> <description>Hyper Olympic</description> <year>1983</year> <manufacturer>Konami</manufacturer> @@ -195588,9 +195756,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hyprolyb" cloneof="trackfld" romof="trackfld"> + <game name="hyprolyb" sourcefile="trackfld.c" cloneof="trackfld" romof="trackfld"> <description>Hyper Olympic (bootleg)</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -195688,9 +195856,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="whizquiz"> + <game name="whizquiz" sourcefile="trackfld.c"> <description>Whiz Quiz</description> <year>1985</year> <manufacturer>Zilec-Zenitone</manufacturer> @@ -195786,9 +195954,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="mastkin"> + <game name="mastkin" sourcefile="trackfld.c"> <description>The Masters of Kin</description> <year>1988</year> <manufacturer>Du Tech</manufacturer> @@ -195863,9 +196031,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="32"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="32"/> </game> - <game name="rocnrope"> + <game name="rocnrope" sourcefile="rocnrope.c"> <description>Roc'n Rope</description> <year>1983</year> <manufacturer>Konami</manufacturer> @@ -195984,9 +196152,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="rocnropk" cloneof="rocnrope" romof="rocnrope"> + <game name="rocnropk" sourcefile="rocnrope.c" cloneof="rocnrope" romof="rocnrope"> <description>Roc'n Rope (Kosuka)</description> <year>1983</year> <manufacturer>Konami + Kosuka</manufacturer> @@ -196105,9 +196273,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="circusc"> + <game name="circusc" sourcefile="circusc.c"> <description>Circus Charlie</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -196201,9 +196369,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="circusc2" cloneof="circusc" romof="circusc"> + <game name="circusc2" sourcefile="circusc.c" cloneof="circusc" romof="circusc"> <description>Circus Charlie (no level select)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -196297,9 +196465,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="circuscc" cloneof="circusc" romof="circusc"> + <game name="circuscc" sourcefile="circusc.c" cloneof="circusc" romof="circusc"> <description>Circus Charlie (Centuri)</description> <year>1984</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -196393,9 +196561,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="circusce" cloneof="circusc" romof="circusc"> + <game name="circusce" sourcefile="circusc.c" cloneof="circusc" romof="circusc"> <description>Circus Charlie (Centuri, earlier)</description> <year>1984</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -196489,9 +196657,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="tp84"> + <game name="tp84" sourcefile="tp84.c"> <description>Time Pilot '84 (set 1)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -196583,9 +196751,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tp84a" cloneof="tp84" romof="tp84"> + <game name="tp84a" sourcefile="tp84.c" cloneof="tp84" romof="tp84"> <description>Time Pilot '84 (set 2)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -196677,9 +196845,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hyperspt"> + <game name="hyperspt" sourcefile="hyperspt.c"> <description>Hyper Sports</description> <year>1984</year> <manufacturer>Konami (Centuri license)</manufacturer> @@ -196785,9 +196953,9 @@ <dipvalue name="Difficult 3"/> <dipvalue name="Difficult 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hpolym84" cloneof="hyperspt" romof="hyperspt"> + <game name="hpolym84" sourcefile="hyperspt.c" cloneof="hyperspt" romof="hyperspt"> <description>Hyper Olympic '84</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -196893,9 +197061,9 @@ <dipvalue name="Difficult 3"/> <dipvalue name="Difficult 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="sbasketb"> + <game name="sbasketb" sourcefile="sbasketb.c"> <description>Super Basketball (version G)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -196990,9 +197158,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sbasketo" cloneof="sbasketb" romof="sbasketb"> + <game name="sbasketo" sourcefile="sbasketb.c" cloneof="sbasketb" romof="sbasketb"> <description>Super Basketball (version E)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197087,9 +197255,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sbasketu" cloneof="sbasketb" romof="sbasketb"> + <game name="sbasketu" sourcefile="sbasketb.c" cloneof="sbasketb" romof="sbasketb"> <description>Super Basketball (not encrypted)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197182,9 +197350,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mikie"> + <game name="mikie" sourcefile="mikie.c"> <description>Mikie</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197279,9 +197447,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mikiej" cloneof="mikie" romof="mikie"> + <game name="mikiej" sourcefile="mikie.c" cloneof="mikie" romof="mikie"> <description>Shinnyuushain Tooru-kun</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197376,9 +197544,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mikiehs" cloneof="mikie" romof="mikie"> + <game name="mikiehs" sourcefile="mikie.c" cloneof="mikie" romof="mikie"> <description>Mikie (High School Graffiti)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197473,9 +197641,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="roadf"> + <game name="roadf" sourcefile="hyperspt.c"> <description>Road Fighter (set 1)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197567,9 +197735,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="roadf2" cloneof="roadf" romof="roadf"> + <game name="roadf2" sourcefile="hyperspt.c" cloneof="roadf" romof="roadf"> <description>Road Fighter (set 2)</description> <year>1984</year> <manufacturer>Konami</manufacturer> @@ -197661,9 +197829,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="yiear"> + <game name="yiear" sourcefile="yiear.c"> <description>Yie Ar Kung-Fu (set 1)</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -197752,9 +197920,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="yiear2" cloneof="yiear" romof="yiear"> + <game name="yiear2" sourcefile="yiear.c" cloneof="yiear" romof="yiear"> <description>Yie Ar Kung-Fu (set 2)</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -197843,9 +198011,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="kicker"> + <game name="kicker" sourcefile="shaolins.c"> <description>Kicker</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -197954,9 +198122,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shaolins" cloneof="kicker" romof="kicker"> + <game name="shaolins" sourcefile="shaolins.c" cloneof="kicker" romof="kicker"> <description>Shao-Lin's Road</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -198065,9 +198233,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pingpong"> + <game name="pingpong" sourcefile="pingpong.c"> <description>Ping Pong</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -198131,9 +198299,9 @@ <dipvalue name="Difficult"/> <dipvalue name="Very Difficult"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="gberet"> + <game name="gberet" sourcefile="gberet.c"> <description>Green Beret</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -198230,9 +198398,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="rushatck" cloneof="gberet" romof="gberet"> + <game name="rushatck" sourcefile="gberet.c" cloneof="gberet" romof="gberet"> <description>Rush'n Attack</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -198329,9 +198497,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="gberetb" cloneof="gberet" romof="gberet"> + <game name="gberetb" sourcefile="gberet.c" cloneof="gberet" romof="gberet"> <description>Green Beret (bootleg)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -198427,9 +198595,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="mrgoemon"> + <game name="mrgoemon" sourcefile="gberet.c"> <description>Mr. Goemon (Japan)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -198521,9 +198689,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jailbrek"> + <game name="jailbrek" sourcefile="jailbrek.c"> <description>Jail Break</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -198614,9 +198782,9 @@ <dipvalue name="Single" default="yes"/> <dipvalue name="Dual"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="manhatan" cloneof="jailbrek" romof="jailbrek"> + <game name="manhatan" sourcefile="jailbrek.c" cloneof="jailbrek" romof="jailbrek"> <description>Manhattan 24 Bunsyo (Japan)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -198707,9 +198875,9 @@ <dipvalue name="Single" default="yes"/> <dipvalue name="Dual"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="finalizr"> + <game name="finalizr" sourcefile="finalizr.c"> <description>Finalizer - Super Transformation</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -198813,9 +198981,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="finalizb" cloneof="finalizr" romof="finalizr"> + <game name="finalizb" sourcefile="finalizr.c" cloneof="finalizr" romof="finalizr"> <description>Finalizer - Super Transformation (bootleg)</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -198918,9 +199086,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="ironhors"> + <game name="ironhors" sourcefile="ironhors.c"> <description>Iron Horse</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -199015,9 +199183,9 @@ <dipvalue name="Power Atk Squat" default="yes"/> <dipvalue name="Squat Atk Power"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dairesya" cloneof="ironhors" romof="ironhors"> + <game name="dairesya" sourcefile="ironhors.c" cloneof="ironhors" romof="ironhors"> <description>Dai Ressya Goutou (Japan)</description> <year>1986</year> <manufacturer>[Konami] (Kawakusu license)</manufacturer> @@ -199112,9 +199280,9 @@ <dipvalue name="Power Atk Squat" default="yes"/> <dipvalue name="Squat Atk Power"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="farwest" cloneof="ironhors" romof="ironhors"> + <game name="farwest" sourcefile="ironhors.c" cloneof="ironhors" romof="ironhors"> <description>Far West</description> <year>1986</year> <manufacturer>bootleg?</manufacturer> @@ -199212,9 +199380,9 @@ <dipvalue name="Power Atk Squat" default="yes"/> <dipvalue name="Squat Atk Power"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="jackal"> + <game name="jackal" sourcefile="jackal.c"> <description>Jackal (World)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -199299,9 +199467,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="512"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="512"/> </game> - <game name="topgunr" cloneof="jackal" romof="jackal"> + <game name="topgunr" sourcefile="jackal.c" cloneof="jackal" romof="jackal"> <description>Top Gunner (US)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -199386,9 +199554,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="512"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="512"/> </game> - <game name="jackalj" cloneof="jackal" romof="jackal"> + <game name="jackalj" sourcefile="jackal.c" cloneof="jackal" romof="jackal"> <description>Tokushu Butai Jackal (Japan)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -199473,9 +199641,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="512"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="512"/> </game> - <game name="topgunbl" cloneof="jackal" romof="jackal"> + <game name="topgunbl" sourcefile="jackal.c" cloneof="jackal" romof="jackal"> <description>Top Gunner (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -199561,9 +199729,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="512"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ddribble"> + <game name="ddribble" sourcefile="ddrible.c"> <description>Double Dribble</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -199666,9 +199834,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="contra"> + <game name="contra" sourcefile="contra.c"> <description>Contra (US)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -199764,9 +199932,9 @@ <dipvalue name="Mono"/> <dipvalue name="Stereo" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="contrab" cloneof="contra" romof="contra"> + <game name="contrab" sourcefile="contra.c" cloneof="contra" romof="contra"> <description>Contra (US bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -199863,9 +200031,9 @@ <dipvalue name="Mono"/> <dipvalue name="Stereo" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="contraj" cloneof="contra" romof="contra"> + <game name="contraj" sourcefile="contra.c" cloneof="contra" romof="contra"> <description>Contra (Japan)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -199961,9 +200129,9 @@ <dipvalue name="Mono"/> <dipvalue name="Stereo" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="contrajb" cloneof="contra" romof="contra"> + <game name="contrajb" sourcefile="contra.c" cloneof="contra" romof="contra"> <description>Contra (Japan bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -200059,9 +200227,9 @@ <dipvalue name="Mono"/> <dipvalue name="Stereo" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="gryzor" cloneof="contra" romof="contra"> + <game name="gryzor" sourcefile="contra.c" cloneof="contra" romof="contra"> <description>Gryzor</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -200157,9 +200325,9 @@ <dipvalue name="Mono"/> <dipvalue name="Stereo" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="combasc"> + <game name="combasc" sourcefile="combatsc.c"> <description>Combat School (joystick)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -200262,9 +200430,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="combasct" cloneof="combasc" romof="combasc"> + <game name="combasct" sourcefile="combatsc.c" cloneof="combasc" romof="combasc"> <description>Combat School (trackball)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -200367,9 +200535,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="combascj" cloneof="combasc" romof="combasc"> + <game name="combascj" sourcefile="combatsc.c" cloneof="combasc" romof="combasc"> <description>Combat School (Japan trackball)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -200472,9 +200640,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="bootcamp" cloneof="combasc" romof="combasc"> + <game name="bootcamp" sourcefile="combatsc.c" cloneof="combasc" romof="combasc"> <description>Boot Camp</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -200577,9 +200745,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="combascb" cloneof="combasc" romof="combasc"> + <game name="combascb" sourcefile="combatsc.c" cloneof="combasc" romof="combasc"> <description>Combat School (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -200680,9 +200848,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="128"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="128"/> </game> - <game name="rockrage"> + <game name="rockrage" sourcefile="rockrage.c"> <description>Rock 'n Rage (World?)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -200779,9 +200947,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="rockragj" cloneof="rockrage" romof="rockrage"> + <game name="rockragj" sourcefile="rockrage.c" cloneof="rockrage" romof="rockrage"> <description>Koi no Hotrock (Japan)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -200878,9 +201046,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="mx5000"> + <game name="mx5000" sourcefile="flkatck.c"> <description>MX5000</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -200970,9 +201138,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="flkatck" cloneof="mx5000" romof="mx5000"> + <game name="flkatck" sourcefile="flkatck.c" cloneof="mx5000" romof="mx5000"> <description>Flak Attack (Japan)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201062,9 +201230,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="fastlane"> + <game name="fastlane" sourcefile="fastlane.c"> <description>Fast Lane</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201157,9 +201325,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="1024"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tricktrp"> + <game name="tricktrp" sourcefile="labyrunr.c"> <description>Trick Trap (World?)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201251,9 +201419,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="labyrunr" cloneof="tricktrp" romof="tricktrp"> + <game name="labyrunr" sourcefile="labyrunr.c" cloneof="tricktrp" romof="tricktrp"> <description>Labyrinth Runner (Japan)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201342,9 +201510,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="labyrunk" cloneof="tricktrp" romof="tricktrp"> + <game name="labyrunk" sourcefile="labyrunr.c" cloneof="tricktrp" romof="tricktrp"> <description>Labyrinth Runner (World Ver. K)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201436,9 +201604,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="thehustl"> + <game name="thehustl" sourcefile="battlnts.c"> <description>The Hustler (Japan version M)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201531,9 +201699,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="thehustj" cloneof="thehustl" romof="thehustl"> + <game name="thehustj" sourcefile="battlnts.c" cloneof="thehustl" romof="thehustl"> <description>The Hustler (Japan version J)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201626,9 +201794,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="rackemup" cloneof="thehustl" romof="thehustl"> + <game name="rackemup" sourcefile="battlnts.c" cloneof="thehustl" romof="thehustl"> <description>Rack 'em Up</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201721,9 +201889,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="battlnts"> + <game name="battlnts" sourcefile="battlnts.c"> <description>Battlantis</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201814,9 +201982,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="battlntj" cloneof="battlnts" romof="battlnts"> + <game name="battlntj" sourcefile="battlnts.c" cloneof="battlnts" romof="battlnts"> <description>Battlantis (Japan)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -201907,9 +202075,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="bladestl"> + <game name="bladestl" sourcefile="bladestl.c"> <description>Blades of Steel (version T)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -202005,9 +202173,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="7"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="48"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="48"/> </game> - <game name="bladstle" cloneof="bladestl" romof="bladestl"> + <game name="bladstle" sourcefile="bladestl.c" cloneof="bladestl" romof="bladestl"> <description>Blades of Steel (version E)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -202101,9 +202269,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="48"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="48"/> </game> - <game name="hcastle"> + <game name="hcastle" sourcefile="hcastle.c"> <description>Haunted Castle (version M)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -202205,9 +202373,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="hcastleo" cloneof="hcastle" romof="hcastle"> + <game name="hcastleo" sourcefile="hcastle.c" cloneof="hcastle" romof="hcastle"> <description>Haunted Castle (version K)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -202309,9 +202477,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="hcastlej" cloneof="hcastle" romof="hcastle"> + <game name="hcastlej" sourcefile="hcastle.c" cloneof="hcastle" romof="hcastle"> <description>Akuma-Jou Dracula (Japan version P)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -202413,9 +202581,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="hcastljo" cloneof="hcastle" romof="hcastle"> + <game name="hcastljo" sourcefile="hcastle.c" cloneof="hcastle" romof="hcastle"> <description>Akuma-Jou Dracula (Japan version N)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -202517,9 +202685,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="ajax"> + <game name="ajax" sourcefile="ajax.c"> <description>Ajax</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -202621,9 +202789,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Inverted"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="typhoon" cloneof="ajax" romof="ajax"> + <game name="typhoon" sourcefile="ajax.c" cloneof="ajax" romof="ajax"> <description>Typhoon</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -202725,9 +202893,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Inverted"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ajaxj" cloneof="ajax" romof="ajax"> + <game name="ajaxj" sourcefile="ajax.c" cloneof="ajax" romof="ajax"> <description>Ajax (Japan)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -202829,9 +202997,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Inverted"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="scontra"> + <game name="scontra" sourcefile="thunderx.c"> <description>Super Contra</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -202957,9 +203125,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="scontraj" cloneof="scontra" romof="scontra"> + <game name="scontraj" sourcefile="thunderx.c" cloneof="scontra" romof="scontra"> <description>Super Contra (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203085,9 +203253,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="thunderx"> + <game name="thunderx" sourcefile="thunderx.c"> <description>Thunder Cross</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203192,9 +203360,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="thnderxj" cloneof="thunderx" romof="thunderx"> + <game name="thnderxj" sourcefile="thunderx.c" cloneof="thunderx" romof="thunderx"> <description>Thunder Cross (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203299,9 +203467,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mainevt"> + <game name="mainevt" sourcefile="mainevt.c"> <description>The Main Event (4 Players ver. Y)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203399,9 +203567,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mainevto" cloneof="mainevt" romof="mainevt"> + <game name="mainevto" sourcefile="mainevt.c" cloneof="mainevt" romof="mainevt"> <description>The Main Event (4 Players ver. F)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203499,9 +203667,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mainev2p" cloneof="mainevt" romof="mainevt"> + <game name="mainev2p" sourcefile="mainevt.c" cloneof="mainevt" romof="mainevt"> <description>The Main Event (2 Players ver. X)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203601,9 +203769,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ringohja" cloneof="mainevt" romof="mainevt"> + <game name="ringohja" sourcefile="mainevt.c" cloneof="mainevt" romof="mainevt"> <description>Ring no Ohja (Japan 2 Players ver. N)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203703,9 +203871,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="devstors"> + <game name="devstors" sourcefile="mainevt.c"> <description>Devastators (ver. Z)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203801,9 +203969,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="devstor2" cloneof="devstors" romof="devstors"> + <game name="devstor2" sourcefile="mainevt.c" cloneof="devstors" romof="devstors"> <description>Devastators (ver. X)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203899,9 +204067,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="devstor3" cloneof="devstors" romof="devstors"> + <game name="devstor3" sourcefile="mainevt.c" cloneof="devstors" romof="devstors"> <description>Devastators (ver. V)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -203997,9 +204165,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="garuka" cloneof="devstors" romof="devstors"> + <game name="garuka" sourcefile="mainevt.c" cloneof="devstors" romof="devstors"> <description>Garuka (Japan ver. W)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -204095,9 +204263,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="88games"> + <game name="88games" sourcefile="88games.c"> <description>'88 Games</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -204223,9 +204391,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="konami88" cloneof="88games" romof="88games"> + <game name="konami88" sourcefile="88games.c" cloneof="88games" romof="88games"> <description>Konami '88</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -204351,9 +204519,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hypsptsp" cloneof="88games" romof="88games"> + <game name="hypsptsp" sourcefile="88games.c" cloneof="88games" romof="88games"> <description>Hyper Sports Special (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -204479,9 +204647,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gbusters"> + <game name="gbusters" sourcefile="gbusters.c"> <description>Gang Busters</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -204576,9 +204744,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="crazycop" cloneof="gbusters" romof="gbusters"> + <game name="crazycop" sourcefile="gbusters.c" cloneof="gbusters" romof="gbusters"> <description>Crazy Cop (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -204673,9 +204841,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="crimfght"> + <game name="crimfght" sourcefile="crimfght.c"> <description>Crime Fighters (US 4 players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -204756,9 +204924,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="crimfgt2" cloneof="crimfght" romof="crimfght"> + <game name="crimfgt2" sourcefile="crimfght.c" cloneof="crimfght" romof="crimfght"> <description>Crime Fighters (World 2 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -204854,9 +205022,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="crimfgtj" cloneof="crimfght" romof="crimfght"> + <game name="crimfgtj" sourcefile="crimfght.c" cloneof="crimfght" romof="crimfght"> <description>Crime Fighters (Japan 2 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -204952,9 +205120,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="spy"> + <game name="spy" sourcefile="spy.c"> <description>S.P.Y. - Special Project Y (World ver. N)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205051,9 +205219,9 @@ <dipvalue name="Unlimited" default="yes"/> <dipvalue name="5 Times"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="spyu" cloneof="spy" romof="spy"> + <game name="spyu" sourcefile="spy.c" cloneof="spy" romof="spy"> <description>S.P.Y. - Special Project Y (US ver. M)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205150,9 +205318,9 @@ <dipvalue name="Unlimited" default="yes"/> <dipvalue name="5 Times"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bottom9"> + <game name="bottom9" sourcefile="bottom9.c"> <description>Bottom of the Ninth (version T)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205277,9 +205445,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Auto"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bottom9n" cloneof="bottom9" romof="bottom9"> + <game name="bottom9n" sourcefile="bottom9.c" cloneof="bottom9" romof="bottom9"> <description>Bottom of the Ninth (version N)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205404,9 +205572,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Auto"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mstadium" cloneof="bottom9" romof="bottom9"> + <game name="mstadium" sourcefile="bottom9.c" cloneof="bottom9" romof="bottom9"> <description>Main Stadium (Japan)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205531,9 +205699,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Auto"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="blockhl"> + <game name="blockhl" sourcefile="blockhl.c"> <description>Block Hole</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205633,9 +205801,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="quarth" cloneof="blockhl" romof="blockhl"> + <game name="quarth" sourcefile="blockhl.c" cloneof="blockhl" romof="blockhl"> <description>Quarth (Japan)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -205735,9 +205903,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aliens"> + <game name="aliens" sourcefile="aliens.c"> <description>Aliens (World set 1)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -205838,9 +206006,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="aliens2" cloneof="aliens" romof="aliens"> + <game name="aliens2" sourcefile="aliens.c" cloneof="aliens" romof="aliens"> <description>Aliens (World set 2)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -205941,9 +206109,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="aliensu" cloneof="aliens" romof="aliens"> + <game name="aliensu" sourcefile="aliens.c" cloneof="aliens" romof="aliens"> <description>Aliens (US)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -206044,9 +206212,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="aliensj" cloneof="aliens" romof="aliens"> + <game name="aliensj" sourcefile="aliens.c" cloneof="aliens" romof="aliens"> <description>Aliens (Japan)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -206147,9 +206315,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="surpratk"> + <game name="surpratk" sourcefile="surpratk.c"> <description>Surprise Attack (Japan ver. M)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -206241,9 +206409,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="parodius"> + <game name="parodius" sourcefile="parodius.c"> <description>Parodius DA! (World)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -206337,9 +206505,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="parodisj" cloneof="parodius" romof="parodius"> + <game name="parodisj" sourcefile="parodius.c" cloneof="parodius" romof="parodius"> <description>Parodius DA! (Japan)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -206433,9 +206601,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rollerg"> + <game name="rollerg" sourcefile="rollerg.c"> <description>Rollergames (US)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206528,9 +206696,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rollergj" cloneof="rollerg" romof="rollerg"> + <game name="rollergj" sourcefile="rollerg.c" cloneof="rollerg" romof="rollerg"> <description>Rollergames (Japan)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206623,9 +206791,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="simpsons"> + <game name="simpsons" sourcefile="simpsons.c"> <description>The Simpsons (4 Players)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206649,9 +206817,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="simpsn2p" cloneof="simpsons" romof="simpsons"> + <game name="simpsn2p" sourcefile="simpsons.c" cloneof="simpsons" romof="simpsons"> <description>The Simpsons (2 Players)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206675,9 +206843,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="simps2pa" cloneof="simpsons" romof="simpsons"> + <game name="simps2pa" sourcefile="simpsons.c" cloneof="simpsons" romof="simpsons"> <description>The Simpsons (2 Players alt)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206701,9 +206869,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="simps2pj" cloneof="simpsons" romof="simpsons"> + <game name="simps2pj" sourcefile="simpsons.c" cloneof="simpsons" romof="simpsons"> <description>The Simpsons (2 Players Japan)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206727,9 +206895,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="esckids"> + <game name="esckids" sourcefile="vendetta.c"> <description>Escape Kids (Japan 2 Players)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206749,9 +206917,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vendetta"> + <game name="vendetta" sourcefile="vendetta.c"> <description>Vendetta (World 4 Players ver. T)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206771,9 +206939,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vendetao" cloneof="vendetta" romof="vendetta"> + <game name="vendetao" sourcefile="vendetta.c" cloneof="vendetta" romof="vendetta"> <description>Vendetta (World 4 Players ver. R)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206793,9 +206961,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vendet2p" cloneof="vendetta" romof="vendetta"> + <game name="vendet2p" sourcefile="vendetta.c" cloneof="vendetta" romof="vendetta"> <description>Vendetta (World 2 Players ver. W)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206815,9 +206983,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vendetas" cloneof="vendetta" romof="vendetta"> + <game name="vendetas" sourcefile="vendetta.c" cloneof="vendetta" romof="vendetta"> <description>Vendetta (Asia 2 Players ver. U)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206837,9 +207005,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vendtaso" cloneof="vendetta" romof="vendetta"> + <game name="vendtaso" sourcefile="vendetta.c" cloneof="vendetta" romof="vendetta"> <description>Vendetta (Asia 2 Players ver. D)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206859,9 +207027,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vendettj" cloneof="vendetta" romof="vendetta"> + <game name="vendettj" sourcefile="vendetta.c" cloneof="vendetta" romof="vendetta"> <description>Crime Fighters 2 (Japan 2 Players ver. P)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206881,9 +207049,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mogura"> + <game name="mogura" sourcefile="mogura.c"> <description>Mogura Desse</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -206895,9 +207063,9 @@ <video screen="raster" orientation="horizontal" width="320" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="wecleman"> + <game name="wecleman" sourcefile="wecleman.c"> <description>WEC Le Mans 24</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -207005,9 +207173,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hotchase"> + <game name="hotchase" sourcefile="wecleman.c"> <description>Hot Chase</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -207106,9 +207274,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/99 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="chqflag"> + <game name="chqflag" sourcefile="chqflag.c"> <description>Chequered Flag</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -207211,9 +207379,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="1024"/> + <driver status="protection" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="chqflagj" cloneof="chqflag" romof="chqflag"> + <game name="chqflagj" sourcefile="chqflag.c" cloneof="chqflag" romof="chqflag"> <description>Chequered Flag (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -207316,9 +207484,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="1024"/> + <driver status="protection" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="ultraman"> + <game name="ultraman" sourcefile="ultraman.c"> <description>Ultraman (Japan)</description> <year>1991</year> <manufacturer>Banpresto/Bandai</manufacturer> @@ -207414,9 +207582,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hexion"> + <game name="hexion" sourcefile="hexion.c"> <description>Hexion (Japan)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -207513,9 +207681,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="nemesis"> + <game name="nemesis" sourcefile="nemesis.c"> <description>Nemesis</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -207611,9 +207779,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="nemesuk" cloneof="nemesis" romof="nemesis"> + <game name="nemesuk" sourcefile="nemesis.c" cloneof="nemesis" romof="nemesis"> <description>Nemesis (World?)</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -207709,9 +207877,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="konamigt"> + <game name="konamigt" sourcefile="nemesis.c"> <description>Konami GT</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -207810,9 +207978,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="salamand"> + <game name="salamand" sourcefile="nemesis.c"> <description>Salamander (version D)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -207905,9 +208073,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="salamanj" cloneof="salamand" romof="salamand"> + <game name="salamanj" sourcefile="nemesis.c" cloneof="salamand" romof="salamand"> <description>Salamander (version J)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -208000,9 +208168,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="lifefrce" cloneof="salamand" romof="salamand"> + <game name="lifefrce" sourcefile="nemesis.c" cloneof="salamand" romof="salamand"> <description>Lifeforce (US)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -208095,9 +208263,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="lifefrcj" cloneof="salamand" romof="salamand"> + <game name="lifefrcj" sourcefile="nemesis.c" cloneof="salamand" romof="salamand"> <description>Lifeforce (Japan)</description> <year>1986</year> <manufacturer>Konami</manufacturer> @@ -208192,9 +208360,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blkpnthr"> + <game name="blkpnthr" sourcefile="nemesis.c"> <description>Black Panther</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -208285,9 +208453,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="citybomb"> + <game name="citybomb" sourcefile="nemesis.c"> <description>City Bomber (World)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -208379,9 +208547,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="citybmrj" cloneof="citybomb" romof="citybomb"> + <game name="citybmrj" sourcefile="nemesis.c" cloneof="citybomb" romof="citybomb"> <description>City Bomber (Japan)</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -208473,9 +208641,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="kittenk"> + <game name="kittenk" sourcefile="nemesis.c"> <description>Kitten Kaboodle</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -208551,9 +208719,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="nyanpani" cloneof="kittenk" romof="kittenk"> + <game name="nyanpani" sourcefile="nemesis.c" cloneof="kittenk" romof="kittenk"> <description>Nyan Nyan Panic (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -208629,9 +208797,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rf2" cloneof="konamigt" romof="konamigt"> + <game name="rf2" sourcefile="nemesis.c" cloneof="konamigt" romof="konamigt"> <description>Konami RF2 - Red Fighter</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -208727,9 +208895,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="twinbee"> + <game name="twinbee" sourcefile="nemesis.c"> <description>TwinBee</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -208821,9 +208989,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gradius" cloneof="nemesis" romof="nemesis"> + <game name="gradius" sourcefile="nemesis.c" cloneof="nemesis" romof="nemesis"> <description>Gradius</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -208915,9 +209083,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gwarrior"> + <game name="gwarrior" sourcefile="nemesis.c"> <description>Galactic Warriors</description> <year>1985</year> <manufacturer>Konami</manufacturer> @@ -209009,9 +209177,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="devilw"> + <game name="devilw" sourcefile="twin16.c"> <description>Devil World</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -209100,9 +209268,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="darkadv" cloneof="devilw" romof="devilw"> + <game name="darkadv" sourcefile="twin16.c" cloneof="devilw" romof="devilw"> <description>Dark Adventure</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -209173,9 +209341,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="majuu" cloneof="devilw" romof="devilw"> + <game name="majuu" sourcefile="twin16.c" cloneof="devilw" romof="devilw"> <description>Majuu no Ohkoku</description> <year>1987</year> <manufacturer>Konami</manufacturer> @@ -209264,9 +209432,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="vulcan"> + <game name="vulcan" sourcefile="twin16.c"> <description>Vulcan Venture</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -209367,9 +209535,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gradius2" cloneof="vulcan" romof="vulcan"> + <game name="gradius2" sourcefile="twin16.c" cloneof="vulcan" romof="vulcan"> <description>Gradius II - GOFER no Yabou (Japan New Ver.)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -209470,9 +209638,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="grdius2a" cloneof="vulcan" romof="vulcan"> + <game name="grdius2a" sourcefile="twin16.c" cloneof="vulcan" romof="vulcan"> <description>Gradius II - GOFER no Yabou (Japan Old Ver.)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -209573,9 +209741,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="grdius2b" cloneof="vulcan" romof="vulcan"> + <game name="grdius2b" sourcefile="twin16.c" cloneof="vulcan" romof="vulcan"> <description>Gradius II - GOFER no Yabou (Japan Older Ver.)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -209676,9 +209844,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cuebrick"> + <game name="cuebrick" sourcefile="twin16.c"> <description>Cue Brick (Japan)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -209779,9 +209947,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="fround"> + <game name="fround" sourcefile="twin16.c"> <description>The Final Round (version M)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -209861,9 +210029,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="froundl" cloneof="fround" romof="fround"> + <game name="froundl" sourcefile="twin16.c" cloneof="fround" romof="fround"> <description>The Final Round (version L)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -209943,9 +210111,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hpuncher" cloneof="fround" romof="fround"> + <game name="hpuncher" sourcefile="twin16.c" cloneof="fround" romof="fround"> <description>Hard Puncher (Japan)</description> <year>1988</year> <manufacturer>Konami</manufacturer> @@ -210030,9 +210198,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="miaj" cloneof="mia" romof="mia"> + <game name="miaj" sourcefile="twin16.c" cloneof="mia" romof="mia"> <description>M.I.A. - Missing in Action (Japan)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210126,9 +210294,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cuebrckj" cloneof="cuebrick" romof="cuebrick"> + <game name="cuebrckj" sourcefile="tmnt.c" cloneof="cuebrick" romof="cuebrick"> <description>Cue Brick (World version D)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210214,9 +210382,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mia"> + <game name="mia" sourcefile="tmnt.c"> <description>M.I.A. - Missing in Action (version T)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210305,9 +210473,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mia2" cloneof="mia" romof="mia"> + <game name="mia2" sourcefile="tmnt.c" cloneof="mia" romof="mia"> <description>M.I.A. - Missing in Action (version S)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210396,9 +210564,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmnt"> + <game name="tmnt" sourcefile="tmnt.c"> <description>Teenage Mutant Ninja Turtles (World 4 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210488,9 +210656,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmntu" cloneof="tmnt" romof="tmnt"> + <game name="tmntu" sourcefile="tmnt.c" cloneof="tmnt" romof="tmnt"> <description>Teenage Mutant Ninja Turtles (US 4 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210580,9 +210748,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmht" cloneof="tmnt" romof="tmnt"> + <game name="tmht" sourcefile="tmnt.c" cloneof="tmnt" romof="tmnt"> <description>Teenage Mutant Hero Turtles (UK 4 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210672,9 +210840,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmntj" cloneof="tmnt" romof="tmnt"> + <game name="tmntj" sourcefile="tmnt.c" cloneof="tmnt" romof="tmnt"> <description>Teenage Mutant Ninja Turtles (Japan 4 Players)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -210764,9 +210932,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmht2p" cloneof="tmnt" romof="tmnt"> + <game name="tmht2p" sourcefile="tmnt.c" cloneof="tmnt" romof="tmnt"> <description>Teenage Mutant Hero Turtles (UK 2 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -210873,9 +211041,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmnt2pj" cloneof="tmnt" romof="tmnt"> + <game name="tmnt2pj" sourcefile="tmnt.c" cloneof="tmnt" romof="tmnt"> <description>Teenage Mutant Ninja Turtles (Japan 2 Players)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -210982,9 +211150,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tmnt2po" cloneof="tmnt" romof="tmnt"> + <game name="tmnt2po" sourcefile="tmnt.c" cloneof="tmnt" romof="tmnt"> <description>Teenage Mutant Ninja Turtles (Oceania 2 Players)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -211091,9 +211259,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="punkshot"> + <game name="punkshot" sourcefile="tmnt.c"> <description>Punk Shot (US 4 Players)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -211186,9 +211354,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="punksht2" cloneof="punkshot" romof="punkshot"> + <game name="punksht2" sourcefile="tmnt.c" cloneof="punkshot" romof="punkshot"> <description>Punk Shot (US 2 Players)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -211281,9 +211449,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="punkshtj" cloneof="punkshot" romof="punkshot"> + <game name="punkshtj" sourcefile="tmnt.c" cloneof="punkshot" romof="punkshot"> <description>Punk Shot (Japan 2 Players)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -211376,9 +211544,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="lgtnfght"> + <game name="lgtnfght" sourcefile="tmnt.c"> <description>Lightning Fighters (US)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -211472,9 +211640,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="trigon" cloneof="lgtnfght" romof="lgtnfght"> + <game name="trigon" sourcefile="tmnt.c" cloneof="lgtnfght" romof="lgtnfght"> <description>Trigon (Japan)</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -211568,9 +211736,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blswhstl"> + <game name="blswhstl" sourcefile="tmnt.c"> <description>Bells & Whistles (Version L)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211591,9 +211759,9 @@ <video screen="raster" orientation="vertical" width="224" height="288" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="detatwin" cloneof="blswhstl" romof="blswhstl"> + <game name="detatwin" sourcefile="tmnt.c" cloneof="blswhstl" romof="blswhstl"> <description>Detana!! Twin Bee (Japan ver. J)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211614,9 +211782,9 @@ <video screen="raster" orientation="vertical" width="224" height="288" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="glfgreat"> + <game name="glfgreat" sourcefile="tmnt.c"> <description>Golfing Greats</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211717,9 +211885,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="2048"/> + <driver status="protection" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="glfgretj" cloneof="glfgreat" romof="glfgreat"> + <game name="glfgretj" sourcefile="tmnt.c" cloneof="glfgreat" romof="glfgreat"> <description>Golfing Greats (Japan)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211820,9 +211988,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="imperfect" palettesize="2048"/> + <driver status="protection" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="tmnt2"> + <game name="tmnt2" sourcefile="tmnt.c"> <description>Teenage Mutant Ninja Turtles - Turtles in Time (US 4 Players ver. UAA)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211845,9 +212013,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tmnt22p" cloneof="tmnt2" romof="tmnt2"> + <game name="tmnt22p" sourcefile="tmnt.c" cloneof="tmnt2" romof="tmnt2"> <description>Teenage Mutant Ninja Turtles - Turtles in Time (US 2 Players ver. UDA)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211870,9 +212038,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="tmnt2a" cloneof="tmnt2" romof="tmnt2"> + <game name="tmnt2a" sourcefile="tmnt.c" cloneof="tmnt2" romof="tmnt2"> <description>Teenage Mutant Ninja Turtles - Turtles in Time (Asia 4 Players ver. ADA)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211895,9 +212063,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ssriders"> + <game name="ssriders" sourcefile="tmnt.c"> <description>Sunset Riders (World 4 Players ver. EAC)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211918,9 +212086,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdrebd" cloneof="ssriders" romof="ssriders"> + <game name="ssrdrebd" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (World 2 Players ver. EBD)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211941,9 +212109,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdrebc" cloneof="ssriders" romof="ssriders"> + <game name="ssrdrebc" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (World 2 Players ver. EBC)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211964,9 +212132,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdruda" cloneof="ssriders" romof="ssriders"> + <game name="ssrdruda" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (US 4 Players ver. UDA)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -211987,9 +212155,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdruac" cloneof="ssriders" romof="ssriders"> + <game name="ssrdruac" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (US 4 Players ver. UAC)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212010,9 +212178,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdrubc" cloneof="ssriders" romof="ssriders"> + <game name="ssrdrubc" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (US 2 Players ver. UBC)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212033,9 +212201,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdrabd" cloneof="ssriders" romof="ssriders"> + <game name="ssrdrabd" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (Asia 2 Players ver. ABD)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212056,9 +212224,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="ssrdrjbd" cloneof="ssriders" romof="ssriders"> + <game name="ssrdrjbd" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (Japan 2 Players ver. JBD)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212079,9 +212247,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="sunsetbl" cloneof="ssriders" romof="ssriders"> + <game name="sunsetbl" sourcefile="tmnt.c" cloneof="ssriders" romof="ssriders"> <description>Sunset Riders (bootleg 4 Players ver. ADD)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212100,9 +212268,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="xmen"> + <game name="xmen" sourcefile="xmen.c"> <description>X-Men (US 4 Players)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212125,9 +212293,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="xmen2p" cloneof="xmen" romof="xmen"> + <game name="xmen2p" sourcefile="xmen.c" cloneof="xmen" romof="xmen"> <description>X-Men (World 2 Players)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212150,9 +212318,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="xmen2pj" cloneof="xmen" romof="xmen"> + <game name="xmen2pj" sourcefile="xmen.c" cloneof="xmen" romof="xmen"> <description>X-Men (Japan 2 Players)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212175,9 +212343,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="xmen6p" cloneof="xmen" romof="xmen"> + <game name="xmen6p" sourcefile="xmen.c" cloneof="xmen" romof="xmen"> <description>X-Men (US 6 Players)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212200,9 +212368,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="xexex"> + <game name="xexex" sourcefile="xexex.c"> <description>Xexex (World)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212227,9 +212395,9 @@ <video screen="raster" orientation="horizontal" width="384" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="xexexj" cloneof="xexex" romof="xexex"> + <game name="xexexj" sourcefile="xexex.c" cloneof="xexex" romof="xexex"> <description>Xexex (Japan)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212254,9 +212422,9 @@ <video screen="raster" orientation="horizontal" width="384" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="asterix"> + <game name="asterix" sourcefile="asterix.c"> <description>Asterix (World ver. EAD)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212277,9 +212445,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="astrxeac" cloneof="asterix" romof="asterix"> + <game name="astrxeac" sourcefile="asterix.c" cloneof="asterix" romof="asterix"> <description>Asterix (World ver. EAC)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212300,9 +212468,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="astrxeaa" cloneof="asterix" romof="asterix"> + <game name="astrxeaa" sourcefile="asterix.c" cloneof="asterix" romof="asterix"> <description>Asterix (World ver. EAA)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212323,9 +212491,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="gijoe"> + <game name="gijoe" sourcefile="gijoe.c"> <description>GI Joe (World)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212364,9 +212532,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gijoeu" cloneof="gijoe" romof="gijoe"> + <game name="gijoeu" sourcefile="gijoe.c" cloneof="gijoe" romof="gijoe"> <description>GI Joe (US)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212405,9 +212573,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gijoej" cloneof="gijoe" romof="gijoe"> + <game name="gijoej" sourcefile="gijoe.c" cloneof="gijoe" romof="gijoe"> <description>GI Joe (Japan)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212446,9 +212614,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="thndrx2"> + <game name="thndrx2" sourcefile="tmnt.c"> <description>Thunder Cross II (Japan)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212467,9 +212635,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="thndrx2a" cloneof="thndrx2" romof="thndrx2"> + <game name="thndrx2a" sourcefile="tmnt.c" cloneof="thndrx2" romof="thndrx2"> <description>Thunder Cross II (Asia)</description> <year>1991</year> <manufacturer>Konami</manufacturer> @@ -212488,9 +212656,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="prmrsocr"> + <game name="prmrsocr" sourcefile="tmnt.c"> <description>Premier Soccer (Europe ver. EAB)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212527,9 +212695,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="prmrsocj" cloneof="prmrsocr" romof="prmrsocr"> + <game name="prmrsocj" sourcefile="tmnt.c" cloneof="prmrsocr" romof="prmrsocr"> <description>Premier Soccer (Japan ver. JAB)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212566,9 +212734,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="qgakumon"> + <game name="qgakumon" sourcefile="tmnt.c"> <description>Quiz Gakumon no Susume (Japan ver. JA2 Type L)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212589,9 +212757,9 @@ <video screen="raster" orientation="horizontal" width="304" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="2" buttons="5" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="moo"> + <game name="moo" sourcefile="moo.c"> <description>Wild West C.O.W.-Boys of Moo Mesa (World version EA)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212627,9 +212795,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mooua" cloneof="moo" romof="moo"> + <game name="mooua" sourcefile="moo.c" cloneof="moo" romof="moo"> <description>Wild West C.O.W.-Boys of Moo Mesa (US version UA)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212665,9 +212833,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="moobl" cloneof="moo" romof="moo"> + <game name="moobl" sourcefile="moo.c" cloneof="moo" romof="moo"> <description>Wild West C.O.W.-Boys of Moo Mesa (bootleg version AA)</description> <year>1992</year> <manufacturer><unknown></manufacturer> @@ -212703,9 +212871,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bucky"> + <game name="bucky" sourcefile="moo.c"> <description>Bucky O'Hare (World version EA)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212742,9 +212910,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="buckyua" cloneof="bucky" romof="bucky"> + <game name="buckyua" sourcefile="moo.c" cloneof="bucky" romof="bucky"> <description>Bucky O'Hare (US version UA)</description> <year>1992</year> <manufacturer>Konami</manufacturer> @@ -212781,9 +212949,9 @@ <dipvalue name="3"/> <dipvalue name="4" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gaiapols"> + <game name="gaiapols" sourcefile="mystwarr.c"> <description>Gaiapolis (Japan ver JAF)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212831,9 +212999,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="mystwarr"> + <game name="mystwarr" sourcefile="mystwarr.c"> <description>Mystic Warriors (Europe ver EAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212869,12 +213037,12 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="4"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="4" default="yes"/> + <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="mystwaru" cloneof="mystwarr" romof="mystwarr"> + <game name="mystwaru" sourcefile="mystwarr.c" cloneof="mystwarr" romof="mystwarr"> <description>Mystic Warriors (US ver UAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212910,12 +213078,12 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="4"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="4" default="yes"/> + <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="viostorm"> + <game name="viostorm" sourcefile="mystwarr.c"> <description>Violent Storm (Europe ver EAB)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212950,12 +213118,12 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="3"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="3" default="yes"/> + <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="viostrmu" cloneof="viostorm" romof="viostorm"> + <game name="viostrmu" sourcefile="mystwarr.c" cloneof="viostorm" romof="viostorm"> <description>Violent Storm (US ver UAB)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -212990,12 +213158,12 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="3"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="3" default="yes"/> + <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="viostrmj" cloneof="viostorm" romof="viostorm"> + <game name="viostrmj" sourcefile="mystwarr.c" cloneof="viostorm" romof="viostorm"> <description>Violent Storm (Japan ver JAC)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213030,12 +213198,12 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="3"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="3" default="yes"/> + <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="viostrma" cloneof="viostorm" romof="viostorm"> + <game name="viostrma" sourcefile="mystwarr.c" cloneof="viostorm" romof="viostorm"> <description>Violent Storm (Asia ver AAC)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213070,17 +213238,69 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="3"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="3" default="yes"/> + <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="dadandrn"> + <game name="dadandrn" sourcefile="mystwarr.c" cloneof="mmaulers" romof="mmaulers"> <description>Kyukyoku Sentai Dadandarn (Japan ver JAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> - <rom name="170a07.24m" size="524288" crc="6a55e828" sha1="06be9a45fdddcc826a33ff8d6eb595e11b98a31f" region="cpu1" offset="0"/> - <rom name="170a09.19l" size="524288" crc="9e821cd8" sha1="51e9c3b0a187db62cfcdff23ecaf3205f368f4e0" region="cpu1" offset="1"/> + <rom name="170jaa07.24m" size="524288" crc="6a55e828" sha1="06be9a45fdddcc826a33ff8d6eb595e11b98a31f" region="cpu1" offset="0"/> + <rom name="170jaa09.19l" size="524288" crc="9e821cd8" sha1="51e9c3b0a187db62cfcdff23ecaf3205f368f4e0" region="cpu1" offset="1"/> + <rom name="170a08.21m" merge="170a08.21m" size="262144" crc="03c59ba2" sha1="041473fe5f9004bfb7ca767c2004154c27f726ff" region="cpu1" offset="100000"/> + <rom name="170a10.17l" merge="170a10.17l" size="262144" crc="8a340909" sha1="3e2ef2642e792cdc38b3442df67377ed9e70d3ab" region="cpu1" offset="100001"/> + <rom name="170a13.9c" merge="170a13.9c" size="262144" crc="2ebf4d1c" sha1="33a3f4153dfdc46cc223d216a17ef9428c09129d" region="cpu2" offset="0"/> + <rom name="170a16.2t" merge="170a16.2t" size="1048576" crc="41fee912" sha1="73cf167ac9fc42cb8048a87b6c6d1c3c0ae3c2e2" region="gfx1" offset="0"/> + <rom name="170a17.2x" merge="170a17.2x" size="1048576" crc="96957c91" sha1="b12d356f8a015ec0984bdb86da9c569eb0c67880" region="gfx1" offset="2"/> + <rom name="170a24.5r" merge="170a24.5r" size="524288" crc="562ad4bd" sha1="f55b29142ea39f090244f0945a56760bab25c7a7" region="gfx1" offset="4"/> + <rom name="170a19.34u" merge="170a19.34u" size="2097152" crc="be835141" sha1="b76e1da45bf602dd9eb30fb8b7181cea2e820c3d" region="gfx2" offset="0"/> + <rom name="170a21.34y" merge="170a21.34y" size="2097152" crc="bcb68136" sha1="1d453f59d832b8ea99cf0a60a917edce5c1c90a0" region="gfx2" offset="2"/> + <rom name="170a18.36u" merge="170a18.36u" size="2097152" crc="e1e3c8d2" sha1="2c94fcedd1dcef3d3332af358ae8a67dea507216" region="gfx2" offset="4"/> + <rom name="170a20.36y" merge="170a20.36y" size="2097152" crc="ccb4d88c" sha1="064b4dab0ca6e5a1fa2fc2e9bbb19c7499830ee1" region="gfx2" offset="6"/> + <rom name="170a23.29y" merge="170a23.29y" size="1048576" crc="6b5390e4" sha1="0c5066bc86e782db4b64c2a604aed89ae99af005" region="gfx2" offset="800000"/> + <rom name="170a22.32y" merge="170a22.32y" size="1048576" crc="21628106" sha1="1e025ff53caa5cbbf7695f8a77736d59f8a8af1b" region="gfx2" offset="800001"/> + <rom name="170a04.33n" merge="170a04.33n" size="524288" crc="64b9a73b" sha1="8b984bfd8bdf6d93ad223fca46a4f958a0edb2be" region="gfx3" dispose="yes" offset="0"/> + <rom name="170a05.30n" merge="170a05.30n" size="524288" crc="f2c101d0" sha1="d80045c9a02db08ea6c851bdc12826862e11c381" region="gfx3" dispose="yes" offset="80000"/> + <rom name="170a06.27n" merge="170a06.27n" size="524288" crc="b032e59b" sha1="482300c683db20c2b2fc6e007b8f7e35373e3c00" region="gfx3" dispose="yes" offset="100000"/> + <rom name="170a02.34j" merge="170a02.34j" size="262144" crc="b040cebf" sha1="4d1ba4ee60fd7caf678837ec6f4d68fcbce1ccf2" region="gfx4" offset="0"/> + <rom name="170a03.36m" merge="170a03.36m" size="262144" crc="7fb412b2" sha1="f603a8f0becf88e345f4b7a68cf018962a255a1e" region="gfx4" offset="40000"/> + <rom name="170a14.2g" merge="170a14.2g" size="2097152" crc="83317cda" sha1="c5398c5959ef3ea73835e13db69660dd28c31486" region="sound1" offset="0"/> + <rom name="170a15.2m" merge="170a15.2m" size="2097152" crc="d4113ae9" sha1="e234d06f462e3db64455c384c2f42174f9ef9c6a" region="sound1" offset="200000"/> + <chip type="cpu" name="68000" clock="16000000"/> + <chip type="cpu" soundonly="yes" name="Z80" clock="8000000"/> + <chip type="audio" name="054539" clock="48000"/> + <chip type="audio" name="054539" clock="48000"/> + <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> + <sound channels="2"/> + <input players="4" control="joy8way" buttons="3" coins="2" service="yes"/> + <dipswitch name="Sound Output"> + <dipvalue name="Mono"/> + <dipvalue name="Stereo" default="yes"/> + </dipswitch> + <dipswitch name="Flip Screen"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Background Detail"> + <dipvalue name="Low"/> + <dipvalue name="Med"/> + <dipvalue name="High" default="yes"/> + </dipswitch> + <dipswitch name="Character Detail"> + <dipvalue name="Low"/> + <dipvalue name="Med"/> + <dipvalue name="High" default="yes"/> + </dipswitch> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> + </game> + <game name="mmaulers" sourcefile="mystwarr.c"> + <description>Monster Maulers (ver EAA)</description> + <year>1993</year> + <manufacturer>Konami</manufacturer> + <rom name="170eaa07.24m" size="524288" crc="5458bd93" sha1="d27a29076be3c745e3efdb1c528b07bd5d8aff1c" region="cpu1" offset="0"/> + <rom name="170eaa09.19l" size="524288" crc="99c95c7b" sha1="7f22930c2fe21205ccd01b80566d6bc31fea34d2" region="cpu1" offset="1"/> <rom name="170a08.21m" size="262144" crc="03c59ba2" sha1="041473fe5f9004bfb7ca767c2004154c27f726ff" region="cpu1" offset="100000"/> <rom name="170a10.17l" size="262144" crc="8a340909" sha1="3e2ef2642e792cdc38b3442df67377ed9e70d3ab" region="cpu1" offset="100001"/> <rom name="170a13.9c" size="262144" crc="2ebf4d1c" sha1="33a3f4153dfdc46cc223d216a17ef9428c09129d" region="cpu2" offset="0"/> @@ -213093,9 +213313,9 @@ <rom name="170a20.36y" size="2097152" crc="ccb4d88c" sha1="064b4dab0ca6e5a1fa2fc2e9bbb19c7499830ee1" region="gfx2" offset="6"/> <rom name="170a23.29y" size="1048576" crc="6b5390e4" sha1="0c5066bc86e782db4b64c2a604aed89ae99af005" region="gfx2" offset="800000"/> <rom name="170a22.32y" size="1048576" crc="21628106" sha1="1e025ff53caa5cbbf7695f8a77736d59f8a8af1b" region="gfx2" offset="800001"/> - <rom name="170a04.33n" size="524288" crc="64b9a73b" sha1="8b984bfd8bdf6d93ad223fca46a4f958a0edb2be" region="gfx3" dispose="yes" offset="0"/> - <rom name="170a05.30n" size="524288" crc="f2c101d0" sha1="d80045c9a02db08ea6c851bdc12826862e11c381" region="gfx3" dispose="yes" offset="80000"/> - <rom name="170a06.27n" size="524288" crc="b032e59b" sha1="482300c683db20c2b2fc6e007b8f7e35373e3c00" region="gfx3" dispose="yes" offset="100000"/> + <rom name="170a04.33n" size="524288" crc="64b9a73b" sha1="8b984bfd8bdf6d93ad223fca46a4f958a0edb2be" region="gfx3" offset="0"/> + <rom name="170a05.30n" size="524288" crc="f2c101d0" sha1="d80045c9a02db08ea6c851bdc12826862e11c381" region="gfx3" offset="80000"/> + <rom name="170a06.27n" size="524288" crc="b032e59b" sha1="482300c683db20c2b2fc6e007b8f7e35373e3c00" region="gfx3" offset="100000"/> <rom name="170a02.34j" size="262144" crc="b040cebf" sha1="4d1ba4ee60fd7caf678837ec6f4d68fcbce1ccf2" region="gfx4" offset="0"/> <rom name="170a03.36m" size="262144" crc="7fb412b2" sha1="f603a8f0becf88e345f4b7a68cf018962a255a1e" region="gfx4" offset="40000"/> <rom name="170a14.2g" size="2097152" crc="83317cda" sha1="c5398c5959ef3ea73835e13db69660dd28c31486" region="sound1" offset="0"/> @@ -213125,9 +213345,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="metamrph"> + <game name="metamrph" sourcefile="mystwarr.c"> <description>Metamorphic Force (US ver UAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213161,16 +213381,16 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="4"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="4" default="yes"/> + <dipvalue name="2"/> </dipswitch> <dipswitch name="Continuous Energy Increment"> <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="metamrpj" cloneof="metamrph" romof="metamrph"> + <game name="metamrpj" sourcefile="mystwarr.c" cloneof="metamrph" romof="metamrph"> <description>Metamorphic Force (Japan ver JAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213204,16 +213424,16 @@ <dipvalue name="Independant"/> </dipswitch> <dipswitch name="Number of Players"> - <dipvalue name="4"/> - <dipvalue name="2" default="yes"/> + <dipvalue name="4" default="yes"/> + <dipvalue name="2"/> </dipswitch> <dipswitch name="Continuous Energy Increment"> <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="mtlchamp"> + <game name="mtlchamp" sourcefile="mystwarr.c"> <description>Martial Champion (Europe ver EAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213248,9 +213468,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="mtlchmpj" cloneof="mtlchamp" romof="mtlchamp"> + <game name="mtlchmpj" sourcefile="mystwarr.c" cloneof="mtlchamp" romof="mtlchamp"> <description>Martial Champion (Japan ver JAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213285,9 +213505,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="rungun"> + <game name="rungun" sourcefile="rungun.c"> <description>Run and Gun (World ver. EAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213321,8 +213541,8 @@ <dipvalue name="2"/> </dipswitch> <dipswitch name="Number of players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Sound Output"> <dipvalue name="Mono"/> @@ -213336,9 +213556,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="1024"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="imperfect" palettesize="1024"/> </game> - <game name="rungunu" cloneof="rungun" romof="rungun"> + <game name="rungunu" sourcefile="rungun.c" cloneof="rungun" romof="rungun"> <description>Run and Gun (US ver. UAB)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213371,8 +213591,8 @@ <dipvalue name="2"/> </dipswitch> <dipswitch name="Number of players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Sound Output"> <dipvalue name="Mono"/> @@ -213386,9 +213606,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="1024"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="imperfect" palettesize="1024"/> </game> - <game name="slmdunkj" cloneof="rungun" romof="rungun"> + <game name="slmdunkj" sourcefile="rungun.c" cloneof="rungun" romof="rungun"> <description>Slam Dunk (Japan ver. JAA))</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -213422,8 +213642,8 @@ <dipvalue name="2"/> </dipswitch> <dipswitch name="Number of players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Sound Output"> <dipvalue name="Mono"/> @@ -213437,9 +213657,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="1024"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="imperfect" palettesize="1024"/> </game> - <game name="dbz"> + <game name="dbz" sourcefile="dbz2.c"> <description>Dragonball Z</description> <year>1993</year> <manufacturer>Banpresto</manufacturer> @@ -213529,9 +213749,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="dbz2"> + <game name="dbz2" sourcefile="dbz2.c"> <description>Dragonball Z 2 Super Battle</description> <year>1994</year> <manufacturer>Banpresto</manufacturer> @@ -213621,9 +213841,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="bishi"> + <game name="bishi" sourcefile="bishi.c"> <description>Bishi Bashi Championship Mini Game Senshuken</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -213702,9 +213922,9 @@ <dipvalue name="4 Kinds"/> <dipvalue name="7 Kinds" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="overdriv"> + <game name="overdriv" sourcefile="overdriv.c"> <description>Over Drive</description> <year>1990</year> <manufacturer>Konami</manufacturer> @@ -213735,9 +213955,9 @@ <video screen="raster" orientation="vertical" width="256" height="304" aspectx="3" aspecty="4" refresh="59.000000"/> <sound channels="2"/> <input players="1" control="dial" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="gradius3"> + <game name="gradius3" sourcefile="gradius3.c"> <description>Gradius III (Japan)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -213849,9 +214069,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="grdius3a" cloneof="gradius3" romof="gradius3"> + <game name="grdius3a" sourcefile="gradius3.c" cloneof="gradius3" romof="gradius3"> <description>Gradius III (Asia)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -213963,9 +214183,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="grdius3e" cloneof="gradius3" romof="gradius3"> + <game name="grdius3e" sourcefile="gradius3.c" cloneof="gradius3" romof="gradius3"> <description>Gradius III (World ?)</description> <year>1989</year> <manufacturer>Konami</manufacturer> @@ -214077,9 +214297,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="plygonet"> + <game name="plygonet" sourcefile="plygonet.c"> <description>Polygonet Commanders (ver UAA)</description> <year>1993</year> <manufacturer>Konami</manufacturer> @@ -214101,9 +214321,9 @@ <dipvalue name="1 Monitor" default="yes"/> <dipvalue name="2 Monitors"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="racinfrc" romof="konamigx"> + <game name="racinfrc" sourcefile="konamigx.c" romof="konamigx"> <description>Racin' Force (ver UAB)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214210,9 +214430,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="opengolf" romof="konamigx"> + <game name="opengolf" sourcefile="konamigx.c" romof="konamigx"> <description>Konami's Open Golf Championship (ver EAD)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214322,9 +214542,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="ggreats2" cloneof="opengolf" romof="opengolf"> + <game name="ggreats2" sourcefile="konamigx.c" cloneof="opengolf" romof="opengolf"> <description>Golfing Greats 2 (ver JAC)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214434,9 +214654,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="le2" romof="konamigx"> + <game name="le2" sourcefile="konamigx.c" romof="konamigx"> <description>Lethal Enforcers II: Gun Fighters (ver EAA)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214506,9 +214726,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="le2u" cloneof="le2" romof="le2"> + <game name="le2u" sourcefile="konamigx.c" cloneof="le2" romof="le2"> <description>Lethal Enforcers II: Gun Fighters (ver UAA)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214578,9 +214798,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="puzldama" romof="konamigx"> + <game name="puzldama" sourcefile="konamigx.c" romof="konamigx"> <description>Taisen Puzzle-dama (ver JAA)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214645,9 +214865,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="gokuparo" romof="konamigx"> + <game name="gokuparo" sourcefile="konamigx.c" romof="konamigx"> <description>Gokujyou Parodius (ver JAD)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214712,9 +214932,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="fantjour" cloneof="gokuparo" romof="gokuparo"> + <game name="fantjour" sourcefile="konamigx.c" cloneof="gokuparo" romof="gokuparo"> <description>Fantastic Journey</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -214779,9 +214999,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dragoonj" romof="konamigx"> + <game name="dragoonj" sourcefile="konamigx.c" romof="konamigx"> <description>Dragoon Might (ver JAA)</description> <year>1995</year> <manufacturer>Konami</manufacturer> @@ -214851,9 +215071,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="tbyahhoo" romof="konamigx"> + <game name="tbyahhoo" sourcefile="konamigx.c" romof="konamigx"> <description>Twin Bee Yahhoo! (ver JAA)</description> <year>1995</year> <manufacturer>Konami</manufacturer> @@ -214918,9 +215138,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="tkmmpzdm" romof="konamigx"> + <game name="tkmmpzdm" sourcefile="konamigx.c" romof="konamigx"> <description>Tokimeki Memorial Taisen Puzzle-dama (ver JAB)</description> <year>1995</year> <manufacturer>Konami</manufacturer> @@ -214987,9 +215207,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="salmndr2" romof="konamigx"> + <game name="salmndr2" sourcefile="konamigx.c" romof="konamigx"> <description>Salamander 2 (ver JAA)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215055,9 +215275,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="8192"/> + <driver status="protection" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="sexyparo" romof="konamigx"> + <game name="sexyparo" sourcefile="konamigx.c" romof="konamigx"> <description>Sexy Parodius (ver JAA)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215122,9 +215342,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="daiskiss" romof="konamigx"> + <game name="daiskiss" sourcefile="konamigx.c" romof="konamigx"> <description>Daisu-Kiss (ver JAA)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215188,9 +215408,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="tokkae" romof="konamigx"> + <game name="tokkae" sourcefile="konamigx.c" romof="konamigx"> <description>Taisen Tokkae-dama (ver JAA)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215257,9 +215477,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="winspike" romof="konamigx"> + <game name="winspike" sourcefile="konamigx.c" romof="konamigx"> <description>Winning Spike (ver JAA)</description> <year>1997</year> <manufacturer>Konami</manufacturer> @@ -215356,9 +215576,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="soccerss" romof="konamigx"> + <game name="soccerss" sourcefile="konamigx.c" romof="konamigx"> <description>Soccer Superstars (ver JAA)</description> <year>1994</year> <manufacturer>Konami</manufacturer> @@ -215429,9 +215649,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vsnetscr" romof="konamigx"> + <game name="vsnetscr" sourcefile="konamigx.c" romof="konamigx"> <description>Versus Net Soccer (ver UAB)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215501,9 +215721,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="rungun2" romof="konamigx"> + <game name="rungun2" sourcefile="konamigx.c" romof="konamigx"> <description>Run and Gun 2 (ver UAA)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215580,9 +215800,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="slamdnk2" cloneof="rungun2" romof="rungun2"> + <game name="slamdnk2" sourcefile="konamigx.c" cloneof="rungun2" romof="rungun2"> <description>Slam Dunk 2 (ver JAA)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215659,9 +215879,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="rushhero" romof="konamigx"> + <game name="rushhero" sourcefile="konamigx.c" romof="konamigx"> <description>Rushing Heroes (ver UAB)</description> <year>1996</year> <manufacturer>Konami</manufacturer> @@ -215737,9 +215957,9 @@ <dipvalue name="Med"/> <dipvalue name="High" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16384"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="bm1stmix"> + <game name="bm1stmix" sourcefile="djmain.c"> <description>beatmania (ver JA-B)</description> <year>1997</year> <manufacturer>Konami</manufacturer> @@ -215836,9 +216056,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="bm2ndmix"> + <game name="bm2ndmix" sourcefile="djmain.c"> <description>beatmania 2nd MIX (ver JA-B)</description> <year>1998</year> <manufacturer>Konami</manufacturer> @@ -215935,9 +216155,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="bm2ndmxa" cloneof="bm2ndmix" romof="bm2ndmix"> + <game name="bm2ndmxa" sourcefile="djmain.c" cloneof="bm2ndmix" romof="bm2ndmix"> <description>beatmania 2nd MIX (ver JA-A)</description> <year>1998</year> <manufacturer>Konami</manufacturer> @@ -216034,9 +216254,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="bmcompmx"> + <game name="bmcompmx" sourcefile="djmain.c"> <description>beatmania complete MIX (ver JA-B)</description> <year>1999</year> <manufacturer>Konami</manufacturer> @@ -216133,9 +216353,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="hmcompmx" cloneof="bmcompmx" romof="bmcompmx"> + <game name="hmcompmx" sourcefile="djmain.c" cloneof="bmcompmx" romof="bmcompmx"> <description>hiphopmania complete MIX (ver UA-B)</description> <year>1999</year> <manufacturer>Konami</manufacturer> @@ -216232,9 +216452,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="bm4thmix"> + <game name="bm4thmix" sourcefile="djmain.c"> <description>beatmania 4th MIX (ver JA-A)</description> <year>1999</year> <manufacturer>Konami</manufacturer> @@ -216329,9 +216549,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="hmcompm2"> + <game name="hmcompm2" sourcefile="djmain.c"> <description>hiphopmania complete MIX 2 (ver UA-A)</description> <year>2000</year> <manufacturer>Konami</manufacturer> @@ -216426,9 +216646,9 @@ <dipvalue name="On Stage Middle" default="yes"/> <dipvalue name="On Stage Last"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="bmdct"> + <game name="bmdct" sourcefile="djmain.c"> <description>beatmania f. Dreams Come True (ver JA-A)</description> <year>2000</year> <manufacturer>Konami</manufacturer> @@ -216521,9 +216741,9 @@ <dipvalue name="3 / 4" default="yes"/> <dipvalue name="3 / 5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="bmcorerm"> + <game name="bmcorerm" sourcefile="djmain.c"> <description>beatmania CORE REMIX (ver JA-A)</description> <year>2000</year> <manufacturer>Konami</manufacturer> @@ -216614,9 +216834,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4368"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4368"/> </game> - <game name="carpolo"> + <game name="carpolo" sourcefile="carpolo.c"> <description>Car Polo</description> <year>1977</year> <manufacturer>Exidy</manufacturer> @@ -216707,9 +216927,9 @@ <dipvalue name="7.50"/> <dipvalue name="15.00 (Shortest)"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="17"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="17"/> </game> - <game name="sidetrac" sampleof="targ"> + <game name="sidetrac" sourcefile="exidy.c" sampleof="targ"> <description>Side Track</description> <year>1979</year> <manufacturer>Exidy</manufacturer> @@ -216745,9 +216965,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="targ"> + <game name="targ" sourcefile="exidy.c"> <description>Targ</description> <year>1980</year> <manufacturer>Exidy</manufacturer> @@ -216793,9 +217013,9 @@ <dipvalue name="Quarters" default="yes"/> <dipvalue name="Pence"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="targc" cloneof="targ" romof="targ" sampleof="targ"> + <game name="targc" sourcefile="exidy.c" cloneof="targ" romof="targ" sampleof="targ"> <description>Targ (cocktail?)</description> <year>1980</year> <manufacturer>Exidy</manufacturer> @@ -216841,9 +217061,9 @@ <dipvalue name="Quarters" default="yes"/> <dipvalue name="Pence"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spectar" sampleof="targ"> + <game name="spectar" sourcefile="exidy.c" sampleof="targ"> <description>Spectar (revision 3)</description> <year>1980</year> <manufacturer>Exidy</manufacturer> @@ -216896,9 +217116,9 @@ <dipvalue name="German"/> <dipvalue name="Spanish"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spectar1" cloneof="spectar" romof="spectar" sampleof="targ"> + <game name="spectar1" sourcefile="exidy.c" cloneof="spectar" romof="spectar" sampleof="targ"> <description>Spectar (revision 1?)</description> <year>1980</year> <manufacturer>Exidy</manufacturer> @@ -216952,9 +217172,9 @@ <dipvalue name="German"/> <dipvalue name="Spanish"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="rallys" cloneof="spectar" romof="spectar" sampleof="targ"> + <game name="rallys" sourcefile="exidy.c" cloneof="spectar" romof="spectar" sampleof="targ"> <description>Rallys (bootleg?)</description> <year>1980</year> <manufacturer>Novar</manufacturer> @@ -217006,9 +217226,9 @@ <dipvalue name="Quarters" default="yes"/> <dipvalue name="Pence"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="phantoma" cloneof="spectar" romof="spectar" sampleof="targ"> + <game name="phantoma" sourcefile="exidy.c" cloneof="spectar" romof="spectar" sampleof="targ"> <description>Phantomas</description> <year>1980</year> <manufacturer>Jeutel</manufacturer> @@ -217059,9 +217279,9 @@ <dipvalue name="Mode 1" default="yes"/> <dipvalue name="Mode 2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="venture"> + <game name="venture" sourcefile="exidy.c"> <description>Venture (version 5 set 1)</description> <year>1981</year> <manufacturer>Exidy</manufacturer> @@ -217104,9 +217324,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="venture2" cloneof="venture" romof="venture"> + <game name="venture2" sourcefile="exidy.c" cloneof="venture" romof="venture"> <description>Venture (version 5 set 2)</description> <year>1981</year> <manufacturer>Exidy</manufacturer> @@ -217149,9 +217369,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="venture4" cloneof="venture" romof="venture"> + <game name="venture4" sourcefile="exidy.c" cloneof="venture" romof="venture"> <description>Venture (version 4)</description> <year>1981</year> <manufacturer>Exidy</manufacturer> @@ -217194,9 +217414,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="mtrap"> + <game name="mtrap" sourcefile="exidy.c"> <description>Mouse Trap (version 5)</description> <year>1981</year> <manufacturer>Exidy</manufacturer> @@ -217246,9 +217466,9 @@ </dipswitch> <dipswitch name="Free Play"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="mtrap3" cloneof="mtrap" romof="mtrap"> + <game name="mtrap3" sourcefile="exidy.c" cloneof="mtrap" romof="mtrap"> <description>Mouse Trap (version 3)</description> <year>1981</year> <manufacturer>Exidy</manufacturer> @@ -217298,9 +217518,9 @@ </dipswitch> <dipswitch name="Free Play"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="mtrap4" cloneof="mtrap" romof="mtrap"> + <game name="mtrap4" sourcefile="exidy.c" cloneof="mtrap" romof="mtrap"> <description>Mouse Trap (version 4)</description> <year>1981</year> <manufacturer>Exidy</manufacturer> @@ -217350,9 +217570,9 @@ </dipswitch> <dipswitch name="Free Play"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="pepper2"> + <game name="pepper2" sourcefile="exidy.c"> <description>Pepper II</description> <year>1982</year> <manufacturer>Exidy</manufacturer> @@ -217395,9 +217615,9 @@ <dipvalue name="1 Coin/3 Credits 2C/7C"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="hardhat"> + <game name="hardhat" sourcefile="exidy.c"> <description>Hard Hat</description> <year>1982</year> <manufacturer>Exidy</manufacturer> @@ -217439,9 +217659,9 @@ <dipvalue name="1 Coin/3 Credits 2C/7C"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="fax"> + <game name="fax" sourcefile="exidy.c"> <description>Fax</description> <year>1983</year> <manufacturer>Exidy</manufacturer> @@ -217507,9 +217727,9 @@ <dipvalue name="1 Coin/3 Credits 2C/7C"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="circus"> + <game name="circus" sourcefile="circus.c"> <description>Circus</description> <year>1977</year> <manufacturer>Exidy</manufacturer> @@ -217558,9 +217778,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="robotbwl"> + <game name="robotbwl" sourcefile="circus.c"> <description>Robot Bowl</description> <year>1977</year> <manufacturer>Exidy</manufacturer> @@ -217605,9 +217825,9 @@ <dipvalue name="7 seconds"/> <dipvalue name="9 seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="crash"> + <game name="crash" sourcefile="circus.c"> <description>Crash</description> <year>1979</year> <manufacturer>Exidy</manufacturer> @@ -217644,9 +217864,9 @@ <dipvalue name="No Award" default="yes"/> <dipvalue name="Credit Awarded"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="ripcord"> + <game name="ripcord" sourcefile="circus.c"> <description>Rip Cord</description> <year>1979</year> <manufacturer>Exidy</manufacturer> @@ -217683,9 +217903,9 @@ <dipvalue name="Award Credit"/> <dipvalue name="No Award" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2"/> </game> - <game name="starfire"> + <game name="starfire" sourcefile="starfire.c"> <description>Star Fire (set 1)</description> <year>1979</year> <manufacturer>Exidy</manufacturer> @@ -217730,9 +217950,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="starfira" cloneof="starfire" romof="starfire"> + <game name="starfira" sourcefile="starfire.c" cloneof="starfire" romof="starfire"> <description>Star Fire (set 2)</description> <year>1979</year> <manufacturer>Exidy</manufacturer> @@ -217776,9 +217996,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="fireone"> + <game name="fireone" sourcefile="starfire.c"> <description>Fire One</description> <year>1979</year> <manufacturer>Exidy</manufacturer> @@ -217824,9 +218044,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="64"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="64"/> </game> - <game name="victory"> + <game name="victory" sourcefile="victory.c"> <description>Victory</description> <year>1982</year> <manufacturer>Exidy</manufacturer> @@ -217875,9 +218095,9 @@ <dipvalue name="60 Hz" default="yes"/> <dipvalue name="50 Hz"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="victorba" cloneof="victory" romof="victory"> + <game name="victorba" sourcefile="victory.c" cloneof="victory" romof="victory"> <description>Victor Banana</description> <year>1982</year> <manufacturer>Exidy</manufacturer> @@ -217926,9 +218146,9 @@ <dipvalue name="60 Hz" default="yes"/> <dipvalue name="50 Hz"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="crossbow"> + <game name="crossbow" sourcefile="exidy440.c"> <description>Crossbow (version 2.0)</description> <year>1983</year> <manufacturer>Exidy</manufacturer> @@ -218020,9 +218240,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cheyenne"> + <game name="cheyenne" sourcefile="exidy440.c"> <description>Cheyenne (version 1.0)</description> <year>1984</year> <manufacturer>Exidy</manufacturer> @@ -218111,9 +218331,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="combat"> + <game name="combat" sourcefile="exidy440.c"> <description>Combat (version 3.0)</description> <year>1985</year> <manufacturer>Exidy</manufacturer> @@ -218196,9 +218416,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="catch22" cloneof="combat" romof="combat"> + <game name="catch22" sourcefile="exidy440.c" cloneof="combat" romof="combat"> <description>Catch-22 (version 8.0)</description> <year>1985</year> <manufacturer>Exidy</manufacturer> @@ -218281,9 +218501,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cracksht"> + <game name="cracksht" sourcefile="exidy440.c"> <description>Crackshot (version 2.0)</description> <year>1985</year> <manufacturer>Exidy</manufacturer> @@ -218364,9 +218584,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="claypign"> + <game name="claypign" sourcefile="exidy440.c"> <description>Clay Pigeon (version 2.0)</description> <year>1986</year> <manufacturer>Exidy</manufacturer> @@ -218428,9 +218648,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="chiller"> + <game name="chiller" sourcefile="exidy440.c"> <description>Chiller (version 3.0)</description> <year>1986</year> <manufacturer>Exidy</manufacturer> @@ -218514,9 +218734,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="topsecex"> + <game name="topsecex" sourcefile="exidy440.c"> <description>Top Secret (Exidy) (version 1.0)</description> <year>1986</year> <manufacturer>Exidy</manufacturer> @@ -218607,9 +218827,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hitnmiss"> + <game name="hitnmiss" sourcefile="exidy440.c"> <description>Hit 'n Miss (version 3.0)</description> <year>1987</year> <manufacturer>Exidy</manufacturer> @@ -218691,9 +218911,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hitnmis2" cloneof="hitnmiss" romof="hitnmiss"> + <game name="hitnmis2" sourcefile="exidy440.c" cloneof="hitnmiss" romof="hitnmiss"> <description>Hit 'n Miss (version 2.0)</description> <year>1987</year> <manufacturer>Exidy</manufacturer> @@ -218776,9 +218996,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="whodunit"> + <game name="whodunit" sourcefile="exidy440.c"> <description>Who Dunit (version 8.0)</description> <year>1988</year> <manufacturer>Exidy</manufacturer> @@ -218867,9 +219087,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="showdown"> + <game name="showdown" sourcefile="exidy440.c"> <description>Showdown (version 5.0)</description> <year>1988</year> <manufacturer>Exidy</manufacturer> @@ -218954,9 +219174,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="copsnrob"> + <game name="copsnrob" sourcefile="copsnrob.c"> <description>Cops'n Robbers</description> <year>1976</year> <manufacturer>Atari</manufacturer> @@ -218994,9 +219214,9 @@ <dipvalue name="2min 20sec"/> <dipvalue name="3min" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="flyball"> + <game name="flyball" sourcefile="flyball.c"> <description>Flyball</description> <year>1976</year> <manufacturer>Atari</manufacturer> @@ -219033,9 +219253,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4"/> </game> - <game name="sprint2" cloneof="sprint1" romof="sprint1"> + <game name="sprint2" sourcefile="sprint2.c" cloneof="sprint1" romof="sprint1"> <description>Sprint 2 (set 1)</description> <year>1976</year> <manufacturer>Atari</manufacturer> @@ -219084,9 +219304,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="sprint2a" cloneof="sprint1" romof="sprint1"> + <game name="sprint2a" sourcefile="sprint2.c" cloneof="sprint1" romof="sprint1"> <description>Sprint 2 (set 2)</description> <year>1976</year> <manufacturer>Atari</manufacturer> @@ -219135,9 +219355,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="sprint4"> + <game name="sprint4" sourcefile="sprint4.c"> <description>Sprint 4 (set 1)</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219176,9 +219396,9 @@ <dipvalue name="120 seconds"/> <dipvalue name="150 seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="6"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="6"/> </game> - <game name="sprint4a" cloneof="sprint4" romof="sprint4"> + <game name="sprint4a" sourcefile="sprint4.c" cloneof="sprint4" romof="sprint4"> <description>Sprint 4 (set 2)</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219217,9 +219437,9 @@ <dipvalue name="120 seconds"/> <dipvalue name="150 seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="6"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="6"/> </game> - <game name="nitedrvr"> + <game name="nitedrvr" sourcefile="nitedrvr.c"> <description>Night Driver</description> <year>1976</year> <manufacturer>Atari</manufacturer> @@ -219255,9 +219475,9 @@ <dipvalue name="Normal" default="yes"/> <dipvalue name="Difficult"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4"/> </game> - <game name="dominos"> + <game name="dominos" sourcefile="sprint2.c"> <description>Dominos</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219301,9 +219521,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="triplhnt"> + <game name="triplhnt" sourcefile="triplhnt.c"> <description>Triple Hunt</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219345,9 +219565,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="8"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="sprint8"> + <game name="sprint8" sourcefile="sprint8.c"> <description>Sprint 8</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219379,9 +219599,9 @@ <dipvalue name="181 seconds"/> <dipvalue name="189 seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="18"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="18"/> </game> - <game name="sprint8a" cloneof="sprint8" romof="sprint8"> + <game name="sprint8a" sourcefile="sprint8.c" cloneof="sprint8" romof="sprint8"> <description>Sprint 8 (play tag & chase)</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219408,9 +219628,9 @@ <dipvalue name="Chase"/> <dipvalue name="Tag" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="18"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="18"/> </game> - <game name="dragrace"> + <game name="dragrace" sourcefile="dragrace.c"> <description>Drag Race</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219447,9 +219667,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="poolshrk"> + <game name="poolshrk" sourcefile="poolshrk.c"> <description>Poolshark</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219481,9 +219701,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="4"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="4"/> </game> - <game name="starshp1"> + <game name="starshp1" sourcefile="starshp1.c"> <description>Starship 1</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219518,9 +219738,9 @@ <dipvalue name="90 Seconds" default="yes"/> <dipvalue name="120 Seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="starshpp" cloneof="starshp1" romof="starshp1"> + <game name="starshpp" sourcefile="starshp1.c" cloneof="starshp1" romof="starshp1"> <description>Starship 1 (prototype?)</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219561,9 +219781,9 @@ <dipvalue name="90 Seconds" default="yes"/> <dipvalue name="120 Seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="superbug"> + <game name="superbug" sourcefile="firetrk.c"> <description>Super Bug</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219608,9 +219828,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="canyon"> + <game name="canyon" sourcefile="canyon.c"> <description>Canyon Bomber</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219646,9 +219866,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="canyonp" cloneof="canyon" romof="canyon"> + <game name="canyonp" sourcefile="canyon.c" cloneof="canyon" romof="canyon"> <description>Canyon Bomber (prototype)</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219685,9 +219905,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3"/> </game> - <game name="destroyr"> + <game name="destroyr" sourcefile="destroyr.c"> <description>Destroyer</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -219728,9 +219948,9 @@ <dipvalue name="Spanish"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="sprint1"> + <game name="sprint1" sourcefile="sprint2.c"> <description>Sprint 1</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -219779,9 +219999,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="ultratnk"> + <game name="ultratnk" sourcefile="ultratnk.c"> <description>Ultra Tank</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -219826,9 +220046,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="skyraid"> + <game name="skyraid" sourcefile="skyraid.c"> <description>Sky Raider</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -219891,9 +220111,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="20"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="20"/> </game> - <game name="tourtabl"> + <game name="tourtabl" sourcefile="tourtabl.c"> <description>Tournament Table (set 1)</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -219946,9 +220166,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="tourtab2" cloneof="tourtabl" romof="tourtabl"> + <game name="tourtab2" sourcefile="tourtabl.c" cloneof="tourtabl" romof="tourtabl"> <description>Tournament Table (set 2)</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220001,9 +220221,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="avalnche"> + <game name="avalnche" sourcefile="avalnche.c"> <description>Avalanche</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220038,9 +220258,9 @@ <dipvalue name="3/450 points" default="yes"/> <dipvalue name="5/750 points"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="firetrk"> + <game name="firetrk" sourcefile="firetrk.c"> <description>Fire Truck</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220099,9 +220319,9 @@ <dipvalue name="Smokey Joe (1 Player)"/> <dipvalue name="Fire Truck (2 Players)" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="skydiver"> + <game name="skydiver" sourcefile="skydiver.c"> <description>Sky Diver</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220144,9 +220364,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="3"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="3"/> </game> - <game name="sbrkout"> + <game name="sbrkout" sourcefile="sbrkout.c"> <description>Super Breakout</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220191,9 +220411,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="atarifb"> + <game name="atarifb" sourcefile="atarifb.c"> <description>Atari Football (revision 2)</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220224,9 +220444,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="atarifb1" cloneof="atarifb" romof="atarifb"> + <game name="atarifb1" sourcefile="atarifb.c" cloneof="atarifb" romof="atarifb"> <description>Atari Football (revision 1)</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220257,9 +220477,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="orbit"> + <game name="orbit" sourcefile="orbit.c"> <description>Orbit</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220326,9 +220546,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="boxer"> + <game name="boxer" sourcefile="boxer.c"> <description>Boxer (prototype)</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220367,9 +220587,9 @@ <dipvalue name="30 seconds" default="yes"/> <dipvalue name="45 seconds"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="wolfpack"> + <game name="wolfpack" sourcefile="wolfpack.c"> <description>Wolf Pack (prototype)</description> <year>1978</year> <manufacturer>Atari</manufacturer> @@ -220416,9 +220636,9 @@ <dipvalue name="16000" default="yes"/> <dipvalue name="20000"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="videopin"> + <game name="videopin" sourcefile="videopin.c"> <description>Video Pinball</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -220476,9 +220696,9 @@ <dipvalue name="180000 (3 balls) / 300000 (5 balls)"/> <dipvalue name="210000 (3 balls) / 350000 (5 balls)" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2"/> </game> - <game name="atarifb4" cloneof="atarifb" romof="atarifb"> + <game name="atarifb4" sourcefile="atarifb.c" cloneof="atarifb" romof="atarifb"> <description>Atari Football (4 players)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -220522,9 +220742,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="subs"> + <game name="subs" sourcefile="subs.c"> <description>Subs</description> <year>1977</year> <manufacturer>Atari</manufacturer> @@ -220571,9 +220791,9 @@ <dipvalue name="3:30 Minutes"/> <dipvalue name="4:00 Minutes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4"/> </game> - <game name="bsktball"> + <game name="bsktball" sourcefile="bsktball.c"> <description>Basketball</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -220616,9 +220836,9 @@ <dipvalue name="Spanish"/> <dipvalue name="English" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="abaseb"> + <game name="abaseb" sourcefile="atarifb.c"> <description>Atari Baseball (set 1)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -220650,9 +220870,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="abaseb2" cloneof="abaseb" romof="abaseb"> + <game name="abaseb2" sourcefile="atarifb.c" cloneof="abaseb" romof="abaseb"> <description>Atari Baseball (set 2)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -220696,9 +220916,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="montecar"> + <game name="montecar" sourcefile="firetrk.c"> <description>Monte Carlo</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -220757,9 +220977,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="26"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="26"/> </game> - <game name="soccer"> + <game name="soccer" sourcefile="atarifb.c"> <description>Atari Soccer</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -220824,9 +221044,9 @@ <dipvalue name="1 Coin Minimum" default="yes"/> <dipvalue name="2 Coin Minimum"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4"/> </game> - <game name="missile"> + <game name="missile" sourcefile="missile.c"> <description>Missile Command (set 1)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -220895,9 +221115,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="missile2" cloneof="missile" romof="missile"> + <game name="missile2" sourcefile="missile.c" cloneof="missile" romof="missile"> <description>Missile Command (set 2)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -220966,9 +221186,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="suprmatk" cloneof="missile" romof="missile"> + <game name="suprmatk" sourcefile="missile.c" cloneof="missile" romof="missile"> <description>Super Missile Attack</description> <year>1981</year> <manufacturer>Atari + Gencomp</manufacturer> @@ -221037,9 +221257,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="llander"> + <game name="llander" sourcefile="asteroid.c"> <description>Lunar Lander (rev 2)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -221083,9 +221303,9 @@ <dipvalue name="1550"/> <dipvalue name="1800"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="llander1" cloneof="llander" romof="llander"> + <game name="llander1" sourcefile="asteroid.c" cloneof="llander" romof="llander"> <description>Lunar Lander (rev 1)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -221125,9 +221345,9 @@ <dipvalue name="750" default="yes"/> <dipvalue name="900"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="asteroid"> + <game name="asteroid" sourcefile="asteroid.c"> <description>Asteroids (rev 2)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -221170,9 +221390,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="asteroi1" cloneof="asteroid" romof="asteroid"> + <game name="asteroi1" sourcefile="asteroid.c" cloneof="asteroid" romof="asteroid"> <description>Asteroids (rev 1)</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -221215,9 +221435,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="asteroib" cloneof="asteroid" romof="asteroid"> + <game name="asteroib" sourcefile="asteroid.c" cloneof="asteroid" romof="asteroid"> <description>Asteroids (bootleg on Lunar Lander hardware)</description> <year>1979</year> <manufacturer>bootleg</manufacturer> @@ -221258,9 +221478,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="asterock" cloneof="asteroid" romof="asteroid"> + <game name="asterock" sourcefile="asteroid.c" cloneof="asteroid" romof="asteroid"> <description>Asterock</description> <year>1979</year> <manufacturer>Sidam</manufacturer> @@ -221304,9 +221524,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="astdelux"> + <game name="astdelux" sourcefile="asteroid.c"> <description>Asteroids Deluxe (rev 2)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221373,9 +221593,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="astdelu1" cloneof="astdelux" romof="astdelux"> + <game name="astdelu1" sourcefile="asteroid.c" cloneof="astdelux" romof="astdelux"> <description>Asteroids Deluxe (rev 1)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221442,9 +221662,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bzone"> + <game name="bzone" sourcefile="bzone.c"> <description>Battle Zone (set 1)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221511,9 +221731,9 @@ <dipvalue name="6 credits/4 coins"/> <dipvalue name="6 credits/5 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bzone2" cloneof="bzone" romof="bzone"> + <game name="bzone2" sourcefile="bzone.c" cloneof="bzone" romof="bzone"> <description>Battle Zone (set 2)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221580,9 +221800,9 @@ <dipvalue name="6 credits/4 coins"/> <dipvalue name="6 credits/5 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bzonec" cloneof="bzone" romof="bzone"> + <game name="bzonec" sourcefile="bzone.c" cloneof="bzone" romof="bzone"> <description>Battle Zone (cocktail)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221650,9 +221870,9 @@ <dipvalue name="6 credits/4 coins"/> <dipvalue name="6 credits/5 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bradley"> + <game name="bradley" sourcefile="bzone.c"> <description>Bradley Trainer</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221721,9 +221941,9 @@ <dipvalue name="6 credits/4 coins"/> <dipvalue name="6 credits/5 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="redbaron"> + <game name="redbaron" sourcefile="bzone.c"> <description>Red Baron</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221772,9 +221992,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="tempest"> + <game name="tempest" sourcefile="tempest.c"> <description>Tempest (rev 3)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221864,9 +222084,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tempest1" cloneof="tempest" romof="tempest"> + <game name="tempest1" sourcefile="tempest.c" cloneof="tempest" romof="tempest"> <description>Tempest (rev 1)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -221956,9 +222176,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tempest2" cloneof="tempest" romof="tempest"> + <game name="tempest2" sourcefile="tempest.c" cloneof="tempest" romof="tempest"> <description>Tempest (rev 2)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -222048,9 +222268,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tempest3" cloneof="tempest" romof="tempest"> + <game name="tempest3" sourcefile="tempest.c" cloneof="tempest" romof="tempest"> <description>Tempest (rev ?)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -222134,9 +222354,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="temptube" cloneof="tempest" romof="tempest"> + <game name="temptube" sourcefile="tempest.c" cloneof="tempest" romof="tempest"> <description>Tempest Tubes</description> <year>1980</year> <manufacturer>hack</manufacturer> @@ -222226,9 +222446,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="spacduel"> + <game name="spacduel" sourcefile="bwidow.c"> <description>Space Duel</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -222295,9 +222515,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gravitar"> + <game name="gravitar" sourcefile="bwidow.c"> <description>Gravitar (version 3)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222359,9 +222579,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gravitr2" cloneof="gravitar" romof="gravitar"> + <game name="gravitr2" sourcefile="bwidow.c" cloneof="gravitar" romof="gravitar"> <description>Gravitar (version 2)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222423,9 +222643,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gravp" cloneof="gravitar" romof="gravitar"> + <game name="gravp" sourcefile="bwidow.c" cloneof="gravitar" romof="gravitar"> <description>Gravitar (prototype)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222487,9 +222707,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="lunarbat" cloneof="gravitar" romof="gravitar"> + <game name="lunarbat" sourcefile="bwidow.c" cloneof="gravitar" romof="gravitar"> <description>Lunar Battle (prototype, later)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222550,9 +222770,9 @@ <dipvalue name="1 each 2"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="lunarba1" cloneof="gravitar" romof="gravitar"> + <game name="lunarba1" sourcefile="bwidow.c" cloneof="gravitar" romof="gravitar"> <description>Lunar Battle (prototype, earlier)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222572,9 +222792,9 @@ <input players="1" control="joy8way" buttons="3" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="quantum"> + <game name="quantum" sourcefile="quantum.c"> <description>Quantum (rev 2)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222619,9 +222839,9 @@ <dipvalue name="1 each 3"/> <dipvalue name="2 each 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="quantum1" cloneof="quantum" romof="quantum"> + <game name="quantum1" sourcefile="quantum.c" cloneof="quantum" romof="quantum"> <description>Quantum (rev 1)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222666,9 +222886,9 @@ <dipvalue name="1 each 3"/> <dipvalue name="2 each 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="quantump" cloneof="quantum" romof="quantum"> + <game name="quantump" sourcefile="quantum.c" cloneof="quantum" romof="quantum"> <description>Quantum (prototype)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222713,9 +222933,9 @@ <dipvalue name="1 each 3"/> <dipvalue name="2 each 4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bwidow"> + <game name="bwidow" sourcefile="bwidow.c"> <description>Black Widow</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -222785,9 +223005,9 @@ <dipvalue name="40000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="starwars"> + <game name="starwars" sourcefile="starwars.c"> <description>Star Wars (rev 2)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -222865,9 +223085,9 @@ <dipvalue name="5 gives 1"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="starwar1" cloneof="starwars" romof="starwars"> + <game name="starwar1" sourcefile="starwars.c" cloneof="starwars" romof="starwars"> <description>Star Wars (rev 1)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -222945,9 +223165,9 @@ <dipvalue name="5 gives 1"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mhavoc"> + <game name="mhavoc" sourcefile="mhavoc.c"> <description>Major Havoc (rev 3)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -223023,9 +223243,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mhavoc2" cloneof="mhavoc" romof="mhavoc"> + <game name="mhavoc2" sourcefile="mhavoc.c" cloneof="mhavoc" romof="mhavoc"> <description>Major Havoc (rev 2)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -223101,9 +223321,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mhavocp" cloneof="mhavoc" romof="mhavoc"> + <game name="mhavocp" sourcefile="mhavoc.c" cloneof="mhavoc" romof="mhavoc"> <description>Major Havoc (prototype)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -223177,9 +223397,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mhavocrv" cloneof="mhavoc" romof="mhavoc"> + <game name="mhavocrv" sourcefile="mhavoc.c" cloneof="mhavoc" romof="mhavoc"> <description>Major Havoc (Return to Vax)</description> <year>1983</year> <manufacturer>hack</manufacturer> @@ -223255,9 +223475,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="alphaone" cloneof="mhavoc" romof="mhavoc"> + <game name="alphaone" sourcefile="mhavoc.c" cloneof="mhavoc" romof="mhavoc"> <description>Alpha One (prototype, 3 lives)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -223277,9 +223497,9 @@ <input players="1" control="dial" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="alphaona" cloneof="mhavoc" romof="mhavoc"> + <game name="alphaona" sourcefile="mhavoc.c" cloneof="mhavoc" romof="mhavoc"> <description>Alpha One (prototype, 5 lives)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -223299,9 +223519,9 @@ <input players="1" control="dial" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="esb"> + <game name="esb" sourcefile="starwars.c"> <description>The Empire Strikes Back</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -223380,9 +223600,9 @@ <dipvalue name="5 gives 1"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="warlords"> + <game name="warlords" sourcefile="centiped.c"> <description>Warlords</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -223447,9 +223667,9 @@ <dipvalue name="6 credits/4 coins"/> <dipvalue name="6 credits/5 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="centiped"> + <game name="centiped" sourcefile="centiped.c"> <description>Centipede (revision 3)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -223520,9 +223740,9 @@ <dipvalue name="6 credits/5 coins"/> <dipvalue name="4 credits/3 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="centipd2" cloneof="centiped" romof="centiped"> + <game name="centipd2" sourcefile="centiped.c" cloneof="centiped" romof="centiped"> <description>Centipede (revision 2)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -223593,9 +223813,9 @@ <dipvalue name="6 credits/5 coins"/> <dipvalue name="4 credits/3 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="centtime" cloneof="centiped" romof="centiped"> + <game name="centtime" sourcefile="centiped.c" cloneof="centiped" romof="centiped"> <description>Centipede (1 player, timed)</description> <year>1980</year> <manufacturer>Atari</manufacturer> @@ -223662,9 +223882,9 @@ <dipvalue name="6 credits/5 coins"/> <dipvalue name="4 credits/3 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="centipdb" cloneof="centiped" romof="centiped"> + <game name="centipdb" sourcefile="centiped.c" cloneof="centiped" romof="centiped"> <description>Centipede (bootleg set 1)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -223735,9 +223955,9 @@ <dipvalue name="6 credits/5 coins"/> <dipvalue name="4 credits/3 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="centipb2" cloneof="centiped" romof="centiped"> + <game name="centipb2" sourcefile="centiped.c" cloneof="centiped" romof="centiped"> <description>Centipede (bootleg set 2)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -223809,9 +224029,9 @@ <dipvalue name="6 credits/5 coins"/> <dipvalue name="4 credits/3 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="millpac" cloneof="centiped" romof="centiped"> + <game name="millpac" sourcefile="centiped.c" cloneof="centiped" romof="centiped"> <description>Millpac</description> <year>1980</year> <manufacturer>Valadon Automation</manufacturer> @@ -223883,9 +224103,9 @@ <dipvalue name="6 credits/5 coins"/> <dipvalue name="4 credits/3 coins"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="magworm" cloneof="centiped" romof="centiped"> + <game name="magworm" sourcefile="centiped.c" cloneof="centiped" romof="centiped"> <description>Magic Worm (bootleg)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -223956,9 +224176,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="milliped"> + <game name="milliped" sourcefile="centiped.c"> <description>Millipede</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224057,9 +224277,9 @@ <dipvalue name="4 credits/3 coins"/> <dipvalue name="Demo mode"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="qwak"> + <game name="qwak" sourcefile="runaway.c"> <description>Qwak (prototype)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224109,9 +224329,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="runaway"> + <game name="runaway" sourcefile="runaway.c"> <description>Runaway (prototype)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224193,9 +224413,9 @@ <dipvalue name="French"/> <dipvalue name="Spanish"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="tunhunt"> + <game name="tunhunt" sourcefile="tunhunt.c"> <description>Tunnel Hunt</description> <year>1979</year> <manufacturer>Atari</manufacturer> @@ -224264,9 +224484,9 @@ <dipvalue name="30000" default="yes"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="tunhuntc" cloneof="tunhunt" romof="tunhunt"> + <game name="tunhuntc" sourcefile="tunhunt.c" cloneof="tunhunt" romof="tunhunt"> <description>Tunnel Hunt (Centuri)</description> <year>1981</year> <manufacturer>Atari (Centuri license)</manufacturer> @@ -224335,9 +224555,9 @@ <dipvalue name="30000" default="yes"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="liberatr"> + <game name="liberatr" sourcefile="liberatr.c"> <description>Liberator (set 1)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224420,9 +224640,9 @@ <dipvalue name="Freeze Mode"/> <dipvalue name="Freeze Mode"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="liberat2" cloneof="liberatr" romof="liberatr"> + <game name="liberat2" sourcefile="liberatr.c" cloneof="liberatr" romof="liberatr"> <description>Liberator (set 2)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224504,9 +224724,9 @@ <dipvalue name="Freeze Mode"/> <dipvalue name="Freeze Mode"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="foodf"> + <game name="foodf" sourcefile="foodf.c"> <description>Food Fight (rev 3)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224553,9 +224773,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="foodf2" cloneof="foodf" romof="foodf"> + <game name="foodf2" sourcefile="foodf.c" cloneof="foodf" romof="foodf"> <description>Food Fight (rev 2)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224602,9 +224822,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="foodfc" cloneof="foodf" romof="foodf"> + <game name="foodfc" sourcefile="foodf.c" cloneof="foodf" romof="foodf"> <description>Food Fight (cocktail)</description> <year>1982</year> <manufacturer>Atari</manufacturer> @@ -224651,9 +224871,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ccastles"> + <game name="ccastles" sourcefile="ccastles.c"> <description>Crystal Castles (version 4)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224676,9 +224896,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ccastle3" cloneof="ccastles" romof="ccastles"> + <game name="ccastle3" sourcefile="ccastles.c" cloneof="ccastles" romof="ccastles"> <description>Crystal Castles (version 3)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224701,9 +224921,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ccastle2" cloneof="ccastles" romof="ccastles"> + <game name="ccastle2" sourcefile="ccastles.c" cloneof="ccastles" romof="ccastles"> <description>Crystal Castles (version 2)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224726,9 +224946,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="cloak"> + <game name="cloak" sourcefile="cloak.c"> <description>Cloak & Dagger (rev 5)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224776,9 +224996,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="cloaksp" cloneof="cloak" romof="cloak"> + <game name="cloaksp" sourcefile="cloak.c" cloneof="cloak" romof="cloak"> <description>Cloak & Dagger (Spanish)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224826,9 +225046,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="cloakfr" cloneof="cloak" romof="cloak"> + <game name="cloakfr" sourcefile="cloak.c" cloneof="cloak" romof="cloak"> <description>Cloak & Dagger (French)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224876,9 +225096,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="cloakgr" cloneof="cloak" romof="cloak"> + <game name="cloakgr" sourcefile="cloak.c" cloneof="cloak" romof="cloak"> <description>Cloak & Dagger (German)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224926,9 +225146,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="cloud9"> + <game name="cloud9" sourcefile="cloud9.c"> <description>Cloud 9 (prototype)</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -224971,9 +225191,9 @@ <dipvalue name="2 coins + 1 coin"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="jedi"> + <game name="jedi" sourcefile="jedi.c"> <description>Return of the Jedi</description> <year>1984</year> <manufacturer>Atari</manufacturer> @@ -225005,9 +225225,9 @@ <input players="1" control="stick" buttons="3" coins="2" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1025"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1025"/> </game> - <game name="peterpak"> + <game name="peterpak" sourcefile="atarisy1.c"> <description>Peter Pack-Rat</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -225048,9 +225268,9 @@ <input players="1" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="marble"> + <game name="marble" sourcefile="atarisy1.c"> <description>Marble Madness (set 1)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -225094,9 +225314,9 @@ <input players="2" control="trackball" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="marble2" cloneof="marble" romof="marble"> + <game name="marble2" sourcefile="atarisy1.c" cloneof="marble" romof="marble"> <description>Marble Madness (set 2)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -225136,9 +225356,9 @@ <input players="2" control="trackball" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="marble3" cloneof="marble" romof="marble"> + <game name="marble3" sourcefile="atarisy1.c" cloneof="marble" romof="marble"> <description>Marble Madness (set 3)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -225178,9 +225398,9 @@ <input players="2" control="trackball" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="marble4" cloneof="marble" romof="marble"> + <game name="marble4" sourcefile="atarisy1.c" cloneof="marble" romof="marble"> <description>Marble Madness (set 4)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -225224,9 +225444,9 @@ <input players="2" control="trackball" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="indytemp"> + <game name="indytemp" sourcefile="atarisy1.c"> <description>Indiana Jones and the Temple of Doom (set 1)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225272,9 +225492,9 @@ <input players="1" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="indytem2" cloneof="indytemp" romof="indytemp"> + <game name="indytem2" sourcefile="atarisy1.c" cloneof="indytemp" romof="indytemp"> <description>Indiana Jones and the Temple of Doom (set 2)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225320,9 +225540,9 @@ <input players="1" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="indytem3" cloneof="indytemp" romof="indytemp"> + <game name="indytem3" sourcefile="atarisy1.c" cloneof="indytemp" romof="indytemp"> <description>Indiana Jones and the Temple of Doom (set 3)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225368,9 +225588,9 @@ <input players="1" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="indytem4" cloneof="indytemp" romof="indytemp"> + <game name="indytem4" sourcefile="atarisy1.c" cloneof="indytemp" romof="indytemp"> <description>Indiana Jones and the Temple of Doom (set 4)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225416,9 +225636,9 @@ <input players="1" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="indytemd" cloneof="indytemp" romof="indytemp"> + <game name="indytemd" sourcefile="atarisy1.c" cloneof="indytemp" romof="indytemp"> <description>Indiana Jones and the Temple of Doom (German)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225464,9 +225684,9 @@ <input players="1" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadrunn"> + <game name="roadrunn" sourcefile="atarisy1.c"> <description>Road Runner (rev 2)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225523,9 +225743,9 @@ <input players="1" control="stick" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadrun2" cloneof="roadrunn" romof="roadrunn"> + <game name="roadrun2" sourcefile="atarisy1.c" cloneof="roadrunn" romof="roadrunn"> <description>Road Runner (rev 1+)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225582,9 +225802,9 @@ <input players="1" control="stick" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadrun1" cloneof="roadrunn" romof="roadrunn"> + <game name="roadrun1" sourcefile="atarisy1.c" cloneof="roadrunn" romof="roadrunn"> <description>Road Runner (rev 1)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -225641,9 +225861,9 @@ <input players="1" control="stick" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadblst"> + <game name="roadblst" sourcefile="atarisy1.c"> <description>Road Blasters (upright, rev 4)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -225695,9 +225915,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadblsg" cloneof="roadblst" romof="roadblst"> + <game name="roadblsg" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (upright, German, rev 3)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -225749,9 +225969,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadbls3" cloneof="roadblst" romof="roadblst"> + <game name="roadbls3" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (upright, rev 3)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -225803,9 +226023,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadblg2" cloneof="roadblst" romof="roadblst"> + <game name="roadblg2" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (upright, German, rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -225853,9 +226073,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadbls2" cloneof="roadblst" romof="roadblst"> + <game name="roadbls2" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (upright, rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -225903,9 +226123,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadblg1" cloneof="roadblst" romof="roadblst"> + <game name="roadblg1" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (upright, German, rev 1)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -225953,9 +226173,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadbls1" cloneof="roadblst" romof="roadblst"> + <game name="roadbls1" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (upright, rev 1)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -226003,9 +226223,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadblsc" cloneof="roadblst" romof="roadblst"> + <game name="roadblsc" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (cockpit, rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -226057,9 +226277,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="roadblcg" cloneof="roadblst" romof="roadblst"> + <game name="roadblcg" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (cockpit, German, rev 1)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -226111,9 +226331,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="roadblc1" cloneof="roadblst" romof="roadblst"> + <game name="roadblc1" sourcefile="atarisy1.c" cloneof="roadblst" romof="roadblst"> <description>Road Blasters (cockpit, rev 1)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -226165,9 +226385,9 @@ <input players="1" control="dial" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="paperboy"> + <game name="paperboy" sourcefile="atarisy2.c"> <description>Paperboy (rev 3)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -226260,9 +226480,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="paperbr2" cloneof="paperboy" romof="paperboy"> + <game name="paperbr2" sourcefile="atarisy2.c" cloneof="paperboy" romof="paperboy"> <description>Paperboy (rev 2)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -226355,9 +226575,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="paperbr1" cloneof="paperboy" romof="paperboy"> + <game name="paperbr1" sourcefile="atarisy2.c" cloneof="paperboy" romof="paperboy"> <description>Paperboy (rev 1)</description> <year>1984</year> <manufacturer>Atari Games</manufacturer> @@ -226450,9 +226670,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ssprint"> + <game name="ssprint" sourcefile="atarisy2.c"> <description>Super Sprint (rev 4)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -226545,9 +226765,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ssprint3" cloneof="ssprint" romof="ssprint"> + <game name="ssprint3" sourcefile="atarisy2.c" cloneof="ssprint" romof="ssprint"> <description>Super Sprint (rev 3)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -226640,9 +226860,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ssprint1" cloneof="ssprint" romof="ssprint"> + <game name="ssprint1" sourcefile="atarisy2.c" cloneof="ssprint" romof="ssprint"> <description>Super Sprint (rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -226735,9 +226955,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ssprintg" cloneof="ssprint" romof="ssprint"> + <game name="ssprintg" sourcefile="atarisy2.c" cloneof="ssprint" romof="ssprint"> <description>Super Sprint (German, rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -226830,9 +227050,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sspring1" cloneof="ssprint" romof="ssprint"> + <game name="sspring1" sourcefile="atarisy2.c" cloneof="ssprint" romof="ssprint"> <description>Super Sprint (German, rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -226925,9 +227145,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ssprintf" cloneof="ssprint" romof="ssprint"> + <game name="ssprintf" sourcefile="atarisy2.c" cloneof="ssprint" romof="ssprint"> <description>Super Sprint (French)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227020,9 +227240,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ssprints" cloneof="ssprint" romof="ssprint"> + <game name="ssprints" sourcefile="atarisy2.c" cloneof="ssprint" romof="ssprint"> <description>Super Sprint (Spanish)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227115,9 +227335,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprint"> + <game name="csprint" sourcefile="atarisy2.c"> <description>Championship Sprint (rev 3)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227210,9 +227430,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprint2" cloneof="csprint" romof="csprint"> + <game name="csprint2" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227305,9 +227525,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprint1" cloneof="csprint" romof="csprint"> + <game name="csprint1" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227400,9 +227620,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprintg" cloneof="csprint" romof="csprint"> + <game name="csprintg" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (German, rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227495,9 +227715,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cspring1" cloneof="csprint" romof="csprint"> + <game name="cspring1" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (German, rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227590,9 +227810,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprintf" cloneof="csprint" romof="csprint"> + <game name="csprintf" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (French)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227685,9 +227905,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprints" cloneof="csprint" romof="csprint"> + <game name="csprints" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (Spanish, rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227780,9 +228000,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="csprins1" cloneof="csprint" romof="csprint"> + <game name="csprins1" sourcefile="atarisy2.c" cloneof="csprint" romof="csprint"> <description>Championship Sprint (Spanish, rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227875,9 +228095,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="720"> + <game name="720" sourcefile="atarisy2.c"> <description>720 Degrees (rev 4)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -227977,9 +228197,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="720r3" cloneof="720" romof="720"> + <game name="720r3" sourcefile="atarisy2.c" cloneof="720" romof="720"> <description>720 Degrees (rev 3)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -228079,9 +228299,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="720r2" cloneof="720" romof="720"> + <game name="720r2" sourcefile="atarisy2.c" cloneof="720" romof="720"> <description>720 Degrees (rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -228181,9 +228401,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="720r1" cloneof="720" romof="720"> + <game name="720r1" sourcefile="atarisy2.c" cloneof="720" romof="720"> <description>720 Degrees (rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -228283,9 +228503,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="720g" cloneof="720" romof="720"> + <game name="720g" sourcefile="atarisy2.c" cloneof="720" romof="720"> <description>720 Degrees (German, rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -228385,9 +228605,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="720gr1" cloneof="720" romof="720"> + <game name="720gr1" sourcefile="atarisy2.c" cloneof="720" romof="720"> <description>720 Degrees (German, rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -228487,9 +228707,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb"> + <game name="apb" sourcefile="atarisy2.c"> <description>APB - All Points Bulletin (rev 7)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -228592,9 +228812,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb6" cloneof="apb" romof="apb"> + <game name="apb6" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (rev 6)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -228697,9 +228917,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb5" cloneof="apb" romof="apb"> + <game name="apb5" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (rev 5)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -228802,9 +229022,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb4" cloneof="apb" romof="apb"> + <game name="apb4" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (rev 4)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -228907,9 +229127,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb3" cloneof="apb" romof="apb"> + <game name="apb3" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (rev 3)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -229012,9 +229232,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb2" cloneof="apb" romof="apb"> + <game name="apb2" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -229117,9 +229337,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apb1" cloneof="apb" romof="apb"> + <game name="apb1" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (rev 1)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -229222,9 +229442,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apbg" cloneof="apb" romof="apb"> + <game name="apbg" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (German)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -229327,9 +229547,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="apbf" cloneof="apb" romof="apb"> + <game name="apbf" sourcefile="atarisy2.c" cloneof="apb" romof="apb"> <description>APB - All Points Bulletin (French)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -229432,9 +229652,9 @@ <dipvalue name="2 to Start, 1 to Continue"/> <dipvalue name="1 to Start, 1 to Continue" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="irobot"> + <game name="irobot" sourcefile="irobot.c"> <description>I, Robot</description> <year>1983</year> <manufacturer>Atari</manufacturer> @@ -229526,9 +229746,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="harddriv"> + <game name="harddriv" sourcefile="harddriv.c"> <description>Hard Drivin' (cockpit, rev 7)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229562,9 +229782,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrvb" cloneof="harddriv" romof="harddriv"> + <game name="harddrvb" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, British, rev 7)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229598,9 +229818,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrvg" cloneof="harddriv" romof="harddriv"> + <game name="harddrvg" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, German, rev 7)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229634,9 +229854,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrvj" cloneof="harddriv" romof="harddriv"> + <game name="harddrvj" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, Japan, rev 7)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229672,9 +229892,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrb6" cloneof="harddriv" romof="harddriv"> + <game name="harddrb6" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, British, rev 6)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229708,9 +229928,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrj6" cloneof="harddriv" romof="harddriv"> + <game name="harddrj6" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, Japan, rev 6)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229746,9 +229966,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrb5" cloneof="harddriv" romof="harddriv"> + <game name="harddrb5" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, British, rev 5)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229782,9 +230002,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrg4" cloneof="harddriv" romof="harddriv"> + <game name="harddrg4" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, German, rev 4)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229818,9 +230038,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrv3" cloneof="harddriv" romof="harddriv"> + <game name="harddrv3" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, rev 3)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229854,9 +230074,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrv2" cloneof="harddriv" romof="harddriv"> + <game name="harddrv2" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, rev 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229890,9 +230110,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrv1" cloneof="harddriv" romof="harddriv"> + <game name="harddrv1" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (cockpit, rev 1)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -229926,9 +230146,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrvc" cloneof="harddriv" romof="harddriv"> + <game name="harddrvc" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (compact, rev 2)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -229962,9 +230182,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrcg" cloneof="harddriv" romof="harddriv"> + <game name="harddrcg" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (compact, German, rev 2)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -229998,9 +230218,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrcb" cloneof="harddriv" romof="harddriv"> + <game name="harddrcb" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (compact, British, rev 2)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230034,9 +230254,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="harddrc1" cloneof="harddriv" romof="harddriv"> + <game name="harddrc1" sourcefile="harddriv.c" cloneof="harddriv" romof="harddriv"> <description>Hard Drivin' (compact, rev 1)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230070,9 +230290,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrun"> + <game name="stunrun" sourcefile="harddriv.c"> <description>S.T.U.N. Runner (rev 6)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230110,9 +230330,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrunj" cloneof="stunrun" romof="stunrun"> + <game name="stunrunj" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 7, Japan)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230150,9 +230370,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrun5" cloneof="stunrun" romof="stunrun"> + <game name="stunrun5" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 5)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230190,9 +230410,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrune" cloneof="stunrun" romof="stunrun"> + <game name="stunrune" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 5, Europe)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230230,9 +230450,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrun4" cloneof="stunrun" romof="stunrun"> + <game name="stunrun4" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 4)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230270,9 +230490,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrun3" cloneof="stunrun" romof="stunrun"> + <game name="stunrun3" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 3)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230310,9 +230530,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrn3e" cloneof="stunrun" romof="stunrun"> + <game name="stunrn3e" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 3, Europe)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230350,9 +230570,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrun2" cloneof="stunrun" romof="stunrun"> + <game name="stunrun2" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230390,9 +230610,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrn2e" cloneof="stunrun" romof="stunrun"> + <game name="stunrn2e" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 2, Europe)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230430,9 +230650,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrun0" cloneof="stunrun" romof="stunrun"> + <game name="stunrun0" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (rev 0)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230470,9 +230690,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stunrunp" cloneof="stunrun" romof="stunrun"> + <game name="stunrunp" sourcefile="harddriv.c" cloneof="stunrun" romof="stunrun"> <description>S.T.U.N. Runner (upright prototype)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -230510,9 +230730,9 @@ <input players="1" control="stick" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedriv"> + <game name="racedriv" sourcefile="harddriv.c"> <description>Race Drivin' (cockpit, rev 5)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230557,9 +230777,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrvb" cloneof="racedriv" romof="racedriv"> + <game name="racedrvb" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, British, rev 5)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230604,9 +230824,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrvg" cloneof="racedriv" romof="racedriv"> + <game name="racedrvg" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, German, rev 5)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230651,9 +230871,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrv4" cloneof="racedriv" romof="racedriv"> + <game name="racedrv4" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230698,9 +230918,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrb4" cloneof="racedriv" romof="racedriv"> + <game name="racedrb4" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, British, rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230745,9 +230965,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrg4" cloneof="racedriv" romof="racedriv"> + <game name="racedrg4" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, German, rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230792,9 +231012,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrv3" cloneof="racedriv" romof="racedriv"> + <game name="racedrv3" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, rev 3)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230839,9 +231059,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrv2" cloneof="racedriv" romof="racedriv"> + <game name="racedrv2" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, rev 2)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230886,9 +231106,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrv1" cloneof="racedriv" romof="racedriv"> + <game name="racedrv1" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, rev 1)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230933,9 +231153,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrb1" cloneof="racedriv" romof="racedriv"> + <game name="racedrb1" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, British, rev 1)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -230980,9 +231200,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrg1" cloneof="racedriv" romof="racedriv"> + <game name="racedrg1" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (cockpit, German, rev 2)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231027,9 +231247,9 @@ <input players="3" control="paddle" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrvc" cloneof="racedriv" romof="racedriv"> + <game name="racedrvc" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, rev 5)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231074,9 +231294,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrcb" cloneof="racedriv" romof="racedriv"> + <game name="racedrcb" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, British, rev 5)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231121,9 +231341,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrcg" cloneof="racedriv" romof="racedriv"> + <game name="racedrcg" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, German, rev 5)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231168,9 +231388,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrc4" cloneof="racedriv" romof="racedriv"> + <game name="racedrc4" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231215,9 +231435,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedcb4" cloneof="racedriv" romof="racedriv"> + <game name="racedcb4" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, British, rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231262,9 +231482,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedcg4" cloneof="racedriv" romof="racedriv"> + <game name="racedcg4" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, German, rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231309,9 +231529,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrc2" cloneof="racedriv" romof="racedriv"> + <game name="racedrc2" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, rev 2)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231356,9 +231576,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="racedrc1" cloneof="racedriv" romof="racedriv"> + <game name="racedrc1" sourcefile="harddriv.c" cloneof="racedriv" romof="racedriv"> <description>Race Drivin' (compact, rev 1)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -231403,9 +231623,9 @@ <input players="3" control="paddle" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="steeltal"> + <game name="steeltal" sourcefile="harddriv.c"> <description>Steel Talons (rev 2)</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -231446,9 +231666,9 @@ <input players="2" control="stick" buttons="4" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="steeltag" cloneof="steeltal" romof="steeltal"> + <game name="steeltag" sourcefile="harddriv.c" cloneof="steeltal" romof="steeltal"> <description>Steel Talons (German, rev 2)</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -231489,9 +231709,9 @@ <input players="2" control="stick" buttons="4" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="steelta1" cloneof="steeltal" romof="steeltal"> + <game name="steelta1" sourcefile="harddriv.c" cloneof="steeltal" romof="steeltal"> <description>Steel Talons (rev 1)</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -231532,9 +231752,9 @@ <input players="2" control="stick" buttons="4" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="steeltap" cloneof="steeltal" romof="steeltal"> + <game name="steeltap" sourcefile="harddriv.c" cloneof="steeltal" romof="steeltal"> <description>Steel Talons (prototype)</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -231575,9 +231795,9 @@ <input players="2" control="stick" buttons="4" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hdrivair"> + <game name="hdrivair" sourcefile="harddriv.c"> <description>Hard Drivin's Airborne (prototype)</description> <year>1993</year> <manufacturer>Atari Games</manufacturer> @@ -231623,12 +231843,12 @@ <chip type="audio" name="DAC"/> <video screen="raster" orientation="horizontal" width="512" height="288" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="paddle" buttons="6" coins="3"/> + <input players="1" control="paddle" buttons="6" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="hdrivaip" cloneof="hdrivair" romof="hdrivair"> + <game name="hdrivaip" sourcefile="harddriv.c" cloneof="hdrivair" romof="hdrivair"> <description>Hard Drivin's Airborne (prototype, early rev)</description> <year>1993</year> <manufacturer>Atari Games</manufacturer> @@ -231674,12 +231894,12 @@ <chip type="audio" name="DAC"/> <video screen="raster" orientation="horizontal" width="512" height="288" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="paddle" buttons="6" coins="3"/> + <input players="1" control="paddle" buttons="6" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="1024"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="gauntlet"> + <game name="gauntlet" sourcefile="gauntlet.c"> <description>Gauntlet (rev 14)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231710,9 +231930,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunts" cloneof="gauntlet" romof="gauntlet"> + <game name="gaunts" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (Spanish, rev 15)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231743,9 +231963,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntj" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntj" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (Japanese, rev 13)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231776,9 +231996,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntg" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntg" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (German, rev 10)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231809,9 +232029,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntj12" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntj12" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (Japanese, rev 12)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231842,9 +232062,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntr9" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntr9" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (rev 9)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231875,9 +232095,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntgr8" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntgr8" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (German, rev 8)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231908,9 +232128,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntr7" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntr7" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (rev 7)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231941,9 +232161,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntgr6" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntgr6" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (German, rev 6)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -231974,9 +232194,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntr5" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntr5" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (rev 5)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232007,9 +232227,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntr4" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntr4" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (rev 4)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232040,9 +232260,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntgr3" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntgr3" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (German, rev 3)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232073,9 +232293,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntr2" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntr2" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (rev 2)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232106,9 +232326,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gauntr1" cloneof="gauntlet" romof="gauntlet"> + <game name="gauntr1" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (rev 1)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232139,9 +232359,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunt2p" cloneof="gauntlet" romof="gauntlet"> + <game name="gaunt2p" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (2 Players, rev 6)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232172,9 +232392,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunt2pj" cloneof="gauntlet" romof="gauntlet"> + <game name="gaunt2pj" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (2 Players, Japanese, rev 5)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232205,9 +232425,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunt2pg" cloneof="gauntlet" romof="gauntlet"> + <game name="gaunt2pg" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (2 Players, German, rev 4)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232238,9 +232458,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaun2pr3" cloneof="gauntlet" romof="gauntlet"> + <game name="gaun2pr3" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (2 Players, rev 3)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232271,9 +232491,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaun2pj2" cloneof="gauntlet" romof="gauntlet"> + <game name="gaun2pj2" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (2 Players, Japanese, rev 2)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232304,9 +232524,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaun2pg1" cloneof="gauntlet" romof="gauntlet"> + <game name="gaun2pg1" sourcefile="gauntlet.c" cloneof="gauntlet" romof="gauntlet"> <description>Gauntlet (2 Players, German, rev 1)</description> <year>1985</year> <manufacturer>Atari Games</manufacturer> @@ -232337,9 +232557,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunt2"> + <game name="gaunt2" sourcefile="gauntlet.c"> <description>Gauntlet II</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -232376,9 +232596,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunt2g" cloneof="gaunt2" romof="gaunt2"> + <game name="gaunt2g" sourcefile="gauntlet.c" cloneof="gaunt2" romof="gaunt2"> <description>Gauntlet II (German)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -232415,9 +232635,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaunt22p" cloneof="gaunt2" romof="gaunt2"> + <game name="gaunt22p" sourcefile="gauntlet.c" cloneof="gaunt2" romof="gaunt2"> <description>Gauntlet II (2 Players, rev 2)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -232454,9 +232674,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaun22p1" cloneof="gaunt2" romof="gaunt2"> + <game name="gaun22p1" sourcefile="gauntlet.c" cloneof="gaunt2" romof="gaunt2"> <description>Gauntlet II (2 Players, rev 1)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -232493,9 +232713,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gaun22pg" cloneof="gaunt2" romof="gaunt2"> + <game name="gaun22pg" sourcefile="gauntlet.c" cloneof="gaunt2" romof="gaunt2"> <description>Gauntlet II (2 Players, German)</description> <year>1986</year> <manufacturer>Atari Games</manufacturer> @@ -232532,9 +232752,9 @@ <input players="4" control="joy8way" buttons="2" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="vindctr2"> + <game name="vindctr2" sourcefile="gauntlet.c"> <description>Vindicators Part II (rev 3)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -232587,9 +232807,9 @@ <input players="2" control="joy8way" buttons="4" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="vindc2r2" cloneof="vindctr2" romof="vindctr2"> + <game name="vindc2r2" sourcefile="gauntlet.c" cloneof="vindctr2" romof="vindctr2"> <description>Vindicators Part II (rev 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -232642,9 +232862,9 @@ <input players="2" control="joy8way" buttons="4" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="vindc2r1" cloneof="vindctr2" romof="vindctr2"> + <game name="vindc2r1" sourcefile="gauntlet.c" cloneof="vindctr2" romof="vindctr2"> <description>Vindicators Part II (rev 1)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -232697,9 +232917,9 @@ <input players="2" control="joy8way" buttons="4" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="xybots"> + <game name="xybots" sourcefile="xybots.c"> <description>Xybots (rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232727,9 +232947,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="xybotsg" cloneof="xybots" romof="xybots"> + <game name="xybotsg" sourcefile="xybots.c" cloneof="xybots" romof="xybots"> <description>Xybots (German, rev 3)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232757,9 +232977,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="xybotsf" cloneof="xybots" romof="xybots"> + <game name="xybotsf" sourcefile="xybots.c" cloneof="xybots" romof="xybots"> <description>Xybots (French, rev 3)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232787,9 +233007,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="xybots1" cloneof="xybots" romof="xybots"> + <game name="xybots1" sourcefile="xybots.c" cloneof="xybots" romof="xybots"> <description>Xybots (rev 1)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232817,9 +233037,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="xybots0" cloneof="xybots" romof="xybots"> + <game name="xybots0" sourcefile="xybots.c" cloneof="xybots" romof="xybots"> <description>Xybots (rev 0)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232847,9 +233067,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="blstroid"> + <game name="blstroid" sourcefile="blstroid.c"> <description>Blasteroids (rev 4)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232886,9 +233106,9 @@ <input players="2" control="dial" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="blstroi3" cloneof="blstroid" romof="blstroid"> + <game name="blstroi3" sourcefile="blstroid.c" cloneof="blstroid" romof="blstroid"> <description>Blasteroids (rev 3)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232925,9 +233145,9 @@ <input players="2" control="dial" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="blstroi2" cloneof="blstroid" romof="blstroid"> + <game name="blstroi2" sourcefile="blstroid.c" cloneof="blstroid" romof="blstroid"> <description>Blasteroids (rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -232964,9 +233184,9 @@ <input players="2" control="dial" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="blstroig" cloneof="blstroid" romof="blstroid"> + <game name="blstroig" sourcefile="blstroid.c" cloneof="blstroid" romof="blstroid"> <description>Blasteroids (German, rev 2)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -233003,9 +233223,9 @@ <input players="2" control="dial" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="blsthead" cloneof="blstroid" romof="blstroid"> + <game name="blsthead" sourcefile="blstroid.c" cloneof="blstroid" romof="blstroid"> <description>Blasteroids (with heads)</description> <year>1987</year> <manufacturer>Atari Games</manufacturer> @@ -233042,9 +233262,9 @@ <input players="2" control="dial" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="vindictr"> + <game name="vindictr" sourcefile="vindictr.c"> <description>Vindicators (rev 5)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233073,9 +233293,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindicte" cloneof="vindictr" romof="vindictr"> + <game name="vindicte" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (Europe, rev 5)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233104,9 +233324,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindictg" cloneof="vindictr" romof="vindictr"> + <game name="vindictg" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (German, rev 1)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233135,9 +233355,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindice4" cloneof="vindictr" romof="vindictr"> + <game name="vindice4" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (Europe, rev 4)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233166,9 +233386,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindict4" cloneof="vindictr" romof="vindictr"> + <game name="vindict4" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (rev 4)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233197,9 +233417,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindice3" cloneof="vindictr" romof="vindictr"> + <game name="vindice3" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (Europe, rev 3)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233228,9 +233448,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindict2" cloneof="vindictr" romof="vindictr"> + <game name="vindict2" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (rev 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233259,9 +233479,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="vindict1" cloneof="vindictr" romof="vindictr"> + <game name="vindict1" sourcefile="vindictr.c" cloneof="vindictr" romof="vindictr"> <description>Vindicators (rev 1)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233290,9 +233510,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="toobin"> + <game name="toobin" sourcefile="toobin.c"> <description>Toobin' (rev 3)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233339,9 +233559,9 @@ <input players="2" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="toobine" cloneof="toobin" romof="toobin"> + <game name="toobine" sourcefile="toobin.c" cloneof="toobin" romof="toobin"> <description>Toobin' (Europe, rev 3)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233388,9 +233608,9 @@ <input players="2" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="toobing" cloneof="toobin" romof="toobin"> + <game name="toobing" sourcefile="toobin.c" cloneof="toobin" romof="toobin"> <description>Toobin' (German, rev 3)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233437,9 +233657,9 @@ <input players="2" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="toobin2" cloneof="toobin" romof="toobin"> + <game name="toobin2" sourcefile="toobin.c" cloneof="toobin" romof="toobin"> <description>Toobin' (rev 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233486,9 +233706,9 @@ <input players="2" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="toobin2e" cloneof="toobin" romof="toobin"> + <game name="toobin2e" sourcefile="toobin.c" cloneof="toobin" romof="toobin"> <description>Toobin' (Europe, rev 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233535,9 +233755,9 @@ <input players="2" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="toobin1" cloneof="toobin" romof="toobin"> + <game name="toobin1" sourcefile="toobin.c" cloneof="toobin" romof="toobin"> <description>Toobin' (rev 1)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233584,9 +233804,9 @@ <input players="2" buttons="5" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cyberbal"> + <game name="cyberbal" sourcefile="cyberbal.c"> <description>Cyberball (rev 4)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233635,9 +233855,9 @@ <input players="4" control="joy8way" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cyberba2" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberba2" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Cyberball (rev 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233686,9 +233906,9 @@ <input players="4" control="joy8way" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cyberbap" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberbap" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Cyberball (prototype)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233737,9 +233957,9 @@ <input players="4" control="joy8way" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="atetcktl" cloneof="atetris" romof="atetris"> + <game name="atetcktl" sourcefile="atetris.c" cloneof="atetris" romof="atetris"> <description>Tetris (Cocktail set 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -233761,9 +233981,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="atetckt2" cloneof="atetris" romof="atetris"> + <game name="atetckt2" sourcefile="atetris.c" cloneof="atetris" romof="atetris"> <description>Tetris (Cocktail set 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -233785,9 +234005,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="atetris"> + <game name="atetris" sourcefile="atetris.c"> <description>Tetris (set 1)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233805,9 +234025,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="atetrisa" cloneof="atetris" romof="atetris"> + <game name="atetrisa" sourcefile="atetris.c" cloneof="atetris" romof="atetris"> <description>Tetris (set 2)</description> <year>1988</year> <manufacturer>Atari Games</manufacturer> @@ -233825,9 +234045,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="atetrisb" cloneof="atetris" romof="atetris"> + <game name="atetrisb" sourcefile="atetris.c" cloneof="atetris" romof="atetris"> <description>Tetris (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -233846,9 +234066,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="eprom"> + <game name="eprom" sourcefile="eprom.c"> <description>Escape from the Planet of the Robot Monsters (set 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -233890,9 +234110,9 @@ <input players="2" control="stick" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="eprom2" cloneof="eprom" romof="eprom"> + <game name="eprom2" sourcefile="eprom.c" cloneof="eprom" romof="eprom"> <description>Escape from the Planet of the Robot Monsters (set 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -233936,9 +234156,9 @@ <input players="2" control="stick" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skullxbo"> + <game name="skullxbo" sourcefile="skullxbo.c"> <description>Skull & Crossbones (rev 5)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -233998,9 +234218,9 @@ <input players="2" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skullxb4" cloneof="skullxbo" romof="skullxbo"> + <game name="skullxb4" sourcefile="skullxbo.c" cloneof="skullxbo" romof="skullxbo"> <description>Skull & Crossbones (rev 4)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234060,9 +234280,9 @@ <input players="2" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skullxb3" cloneof="skullxbo" romof="skullxbo"> + <game name="skullxb3" sourcefile="skullxbo.c" cloneof="skullxbo" romof="skullxbo"> <description>Skull & Crossbones (rev 3)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234122,9 +234342,9 @@ <input players="2" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skullxb2" cloneof="skullxbo" romof="skullxbo"> + <game name="skullxb2" sourcefile="skullxbo.c" cloneof="skullxbo" romof="skullxbo"> <description>Skull & Crossbones (rev 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234184,9 +234404,9 @@ <input players="2" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skullxb1" cloneof="skullxbo" romof="skullxbo"> + <game name="skullxb1" sourcefile="skullxbo.c" cloneof="skullxbo" romof="skullxbo"> <description>Skull & Crossbones (rev 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234246,9 +234466,9 @@ <input players="2" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cyberbt" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberbt" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Tournament Cyberball 2072 (rev 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234295,9 +234515,9 @@ <input players="4" control="joy8way" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cyberbt1" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberbt1" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Tournament Cyberball 2072 (rev 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234344,9 +234564,9 @@ <input players="4" control="joy8way" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="badlands"> + <game name="badlands" sourcefile="badlands.c"> <description>Bad Lands</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234372,9 +234592,9 @@ <input players="2" control="dial" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="klax"> + <game name="klax" sourcefile="klax.c"> <description>Klax (set 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234397,9 +234617,9 @@ <input players="2" control="joy8way" buttons="1" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="klax2" cloneof="klax" romof="klax"> + <game name="klax2" sourcefile="klax.c" cloneof="klax" romof="klax"> <description>Klax (set 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234422,9 +234642,9 @@ <input players="2" control="joy8way" buttons="1" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="klax3" cloneof="klax" romof="klax"> + <game name="klax3" sourcefile="klax.c" cloneof="klax" romof="klax"> <description>Klax (set 3)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234447,9 +234667,9 @@ <input players="2" control="joy8way" buttons="1" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="klaxj" cloneof="klax" romof="klax"> + <game name="klaxj" sourcefile="klax.c" cloneof="klax" romof="klax"> <description>Klax (Japan)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234472,9 +234692,9 @@ <input players="2" control="joy8way" buttons="1" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="klaxd" cloneof="klax" romof="klax"> + <game name="klaxd" sourcefile="klax.c" cloneof="klax" romof="klax"> <description>Klax (Germany)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234497,9 +234717,9 @@ <input players="2" control="joy8way" buttons="1" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="klaxp1" cloneof="klax" romof="klax"> + <game name="klaxp1" sourcefile="eprom.c" cloneof="klax" romof="klax"> <description>Klax (prototype set 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234522,9 +234742,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="klaxp2" cloneof="klax" romof="klax"> + <game name="klaxp2" sourcefile="eprom.c" cloneof="klax" romof="klax"> <description>Klax (prototype set 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234547,9 +234767,9 @@ <input players="2" control="joy8way" buttons="4" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="thunderj"> + <game name="thunderj" sourcefile="thunderj.c"> <description>ThunderJaws</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -234613,9 +234833,9 @@ <input players="2" control="joy8way" buttons="2" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cyberb2p" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberb2p" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Cyberball 2072 (2 player, rev 4)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234659,9 +234879,9 @@ <input players="2" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cyberb23" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberb23" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Cyberball 2072 (2 player, rev 3)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234705,9 +234925,9 @@ <input players="2" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cyberb22" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberb22" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Cyberball 2072 (2 player, rev 2)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234751,9 +234971,9 @@ <input players="2" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cyberb21" cloneof="cyberbal" romof="cyberbal"> + <game name="cyberb21" sourcefile="cyberbal.c" cloneof="cyberbal" romof="cyberbal"> <description>Cyberball 2072 (2 player, rev 1)</description> <year>1989</year> <manufacturer>Atari Games</manufacturer> @@ -234797,9 +235017,9 @@ <input players="2" control="joy8way" buttons="1" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hydra"> + <game name="hydra" sourcefile="atarig1.c"> <description>Hydra</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -234854,9 +235074,9 @@ <input players="1" control="stick" buttons="6" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="hydrap" cloneof="hydra" romof="hydra"> + <game name="hydrap" sourcefile="atarig1.c" cloneof="hydra" romof="hydra"> <description>Hydra (prototype 5/14/90)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -234911,9 +235131,9 @@ <input players="1" control="stick" buttons="6" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="hydrap2" cloneof="hydra" romof="hydra"> + <game name="hydrap2" sourcefile="atarig1.c" cloneof="hydra" romof="hydra"> <description>Hydra (prototype 5/25/90)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -234968,9 +235188,9 @@ <input players="1" control="stick" buttons="6" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="pitfight"> + <game name="pitfight" sourcefile="atarig1.c"> <description>Pit Fighter (rev 4)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235017,9 +235237,9 @@ <input players="3" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="pitfigh3" cloneof="pitfight" romof="pitfight"> + <game name="pitfigh3" sourcefile="atarig1.c" cloneof="pitfight" romof="pitfight"> <description>Pit Fighter (rev 3)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235066,9 +235286,9 @@ <input players="3" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="pitfighj" cloneof="pitfight" romof="pitfight"> + <game name="pitfighj" sourcefile="atarig1.c" cloneof="pitfight" romof="pitfight"> <description>Pit Fighter (Japan, 2 players)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235115,9 +235335,9 @@ <input players="2" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="pitfighb" cloneof="pitfight" romof="pitfight"> + <game name="pitfighb" sourcefile="atarig1.c" cloneof="pitfight" romof="pitfight"> <description>Pit Fighter (bootleg)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235164,9 +235384,9 @@ <input players="3" control="joy8way" buttons="3" coins="3"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1280"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1280"/> </game> - <game name="rampart"> + <game name="rampart" sourcefile="rampart.c"> <description>Rampart (Trackball)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235185,9 +235405,9 @@ <input players="3" control="trackball" buttons="2" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ramprt2p" cloneof="rampart" romof="rampart"> + <game name="ramprt2p" sourcefile="rampart.c" cloneof="rampart" romof="rampart"> <description>Rampart (Joystick)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235210,9 +235430,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rampartj" cloneof="rampart" romof="rampart"> + <game name="rampartj" sourcefile="rampart.c" cloneof="rampart" romof="rampart"> <description>Rampart (Japan, Joystick)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235235,9 +235455,9 @@ <input players="2" control="joy8way" buttons="2" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="shuuz"> + <game name="shuuz" sourcefile="shuuz.c"> <description>Shuuz (version 8.0)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235264,9 +235484,9 @@ <input players="1" control="trackball" buttons="2" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="shuuz2" cloneof="shuuz" romof="shuuz"> + <game name="shuuz2" sourcefile="shuuz.c" cloneof="shuuz" romof="shuuz"> <description>Shuuz (version 7.1)</description> <year>1990</year> <manufacturer>Atari Games</manufacturer> @@ -235293,9 +235513,9 @@ <input players="1" control="trackball" buttons="2" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="batman"> + <game name="batman" sourcefile="batman.c"> <description>Batman</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -235336,9 +235556,9 @@ <input players="1" control="joy8way" buttons="2" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="roadriot"> + <game name="roadriot" sourcefile="atarig42.c"> <description>Road Riot 4WD</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -235386,9 +235606,9 @@ <input players="1" control="stick" buttons="3" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="offtwall"> + <game name="offtwall" sourcefile="offtwall.c"> <description>Off the Wall (2/3-player upright)</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -235413,9 +235633,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="offtwalc" cloneof="offtwall" romof="offtwall"> + <game name="offtwalc" sourcefile="offtwall.c" cloneof="offtwall" romof="offtwall"> <description>Off the Wall (2-player cocktail)</description> <year>1991</year> <manufacturer>Atari Games</manufacturer> @@ -235440,9 +235660,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="guardian"> + <game name="guardian" sourcefile="atarig42.c"> <description>Guardians of the Hood</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235480,9 +235700,9 @@ <input players="2" control="joy8way" buttons="5" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="relief"> + <game name="relief" sourcefile="relief.c"> <description>Relief Pitcher (set 1)</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235533,9 +235753,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="relief2" cloneof="relief" romof="relief"> + <game name="relief2" sourcefile="relief.c" cloneof="relief" romof="relief"> <description>Relief Pitcher (set 2)</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235586,9 +235806,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="arcadecl"> + <game name="arcadecl" sourcefile="arcadecl.c"> <description>Arcade Classics (prototype)</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235603,9 +235823,9 @@ <input players="2" control="trackball" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="sparkz"> + <game name="sparkz" sourcefile="arcadecl.c"> <description>Sparkz (prototype)</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235619,9 +235839,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="motofren"> + <game name="motofren" sourcefile="atarigx2.c"> <description>Moto Frenzy</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235662,9 +235882,9 @@ <input players="1" control="stick" buttons="3" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="spclords"> + <game name="spclords" sourcefile="atarigx2.c"> <description>Space Lords</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235699,9 +235919,9 @@ <input players="2" control="stick" buttons="4" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="spclorda" cloneof="spclords" romof="spclords"> + <game name="spclorda" sourcefile="atarigx2.c" cloneof="spclords" romof="spclords"> <description>Space Lords (alternate)</description> <year>1992</year> <manufacturer>Atari Games</manufacturer> @@ -235739,9 +235959,9 @@ <input players="2" control="stick" buttons="4" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rrreveng"> + <game name="rrreveng" sourcefile="atarigx2.c"> <description>Road Riot's Revenge (prototype)</description> <year>1994</year> <manufacturer>Atari Games</manufacturer> @@ -235779,9 +235999,9 @@ <input players="2" control="paddle" buttons="5" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="rrrevenp" cloneof="rrreveng" romof="rrreveng"> + <game name="rrrevenp" sourcefile="atarigx2.c" cloneof="rrreveng" romof="rrreveng"> <description>Road Riot's Revenge (prototype alt)</description> <year>1994</year> <manufacturer>Atari Games</manufacturer> @@ -235819,9 +236039,9 @@ <input players="2" control="paddle" buttons="5" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="2048"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="beathead"> + <game name="beathead" sourcefile="beathead.c"> <description>BeatHead (prototype)</description> <year>1993</year> <manufacturer>Atari Games</manufacturer> @@ -235847,9 +236067,9 @@ <input players="2" control="joy8way" buttons="2" coins="2" service="yes" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="tmek"> + <game name="tmek" sourcefile="atarigt.c"> <description>T-MEK</description> <year>1994</year> <manufacturer>Atari Games</manufacturer> @@ -235899,9 +236119,9 @@ <input players="2" control="stick" buttons="3" coins="2" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="32768"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="tmekprot" cloneof="tmek" romof="tmek"> + <game name="tmekprot" sourcefile="atarigt.c" cloneof="tmek" romof="tmek"> <description>T-MEK (prototype)</description> <year>1994</year> <manufacturer>Atari Games</manufacturer> @@ -235951,9 +236171,9 @@ <input players="2" control="stick" buttons="3" coins="2" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="primrage"> + <game name="primrage" sourcefile="atarigt.c"> <description>Primal Rage (version 2.3)</description> <year>1994</year> <manufacturer>Atari Games</manufacturer> @@ -236005,9 +236225,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="32768"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="primraga" cloneof="primrage" romof="primrage"> + <game name="primraga" sourcefile="atarigt.c" cloneof="primrage" romof="primrage"> <description>Primal Rage (version 2.0)</description> <year>1994</year> <manufacturer>Atari Games</manufacturer> @@ -236059,9 +236279,9 @@ <input players="2" control="joy8way" buttons="3" coins="2" tilt="yes"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="32768"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="area51"> + <game name="area51" sourcefile="cojag.c"> <description>Area 51</description> <year>1995</year> <manufacturer>Atari Games</manufacturer> @@ -236080,9 +236300,9 @@ <input players="2" control="lightgun" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65534"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65534"/> </game> - <game name="area51mx"> + <game name="area51mx" sourcefile="cojag.c"> <description>Area 51 / Maximum Force Duo v2.0</description> <year>1998</year> <manufacturer>Atari Games</manufacturer> @@ -236101,9 +236321,9 @@ <input players="2" control="lightgun" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65534"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65534"/> </game> - <game name="a51mxr3k" cloneof="area51mx" romof="area51mx"> + <game name="a51mxr3k" sourcefile="cojag.c" cloneof="area51mx" romof="area51mx"> <description>Area 51 / Maximum Force Duo (R3000)</description> <year>1998</year> <manufacturer>Atari Games</manufacturer> @@ -236122,9 +236342,9 @@ <input players="2" control="lightgun" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65534"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65534"/> </game> - <game name="maxforce"> + <game name="maxforce" sourcefile="cojag.c"> <description>Maximum Force v1.05</description> <year>1996</year> <manufacturer>Atari Games</manufacturer> @@ -236143,9 +236363,9 @@ <input players="2" control="lightgun" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65534"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65534"/> </game> - <game name="maxf_102" cloneof="maxforce" romof="maxforce"> + <game name="maxf_102" sourcefile="cojag.c" cloneof="maxforce" romof="maxforce"> <description>Maximum Force v1.02</description> <year>1996</year> <manufacturer>Atari Games</manufacturer> @@ -236164,9 +236384,9 @@ <input players="2" control="lightgun" buttons="1" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65534"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65534"/> </game> - <game name="vcircle"> + <game name="vcircle" sourcefile="cojag.c"> <description>Vicious Circle (prototype)</description> <year>1996</year> <manufacturer>Atari Games</manufacturer> @@ -236185,9 +236405,9 @@ <input players="2" control="joy8way" buttons="6" coins="4"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65534"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65534"/> </game> - <game name="sasuke"> + <game name="sasuke" sourcefile="rockola.c"> <description>Sasuke vs. Commander</description> <year>1980</year> <manufacturer>SNK</manufacturer> @@ -236238,9 +236458,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32"/> </game> - <game name="satansat" sampleof="vanguard"> + <game name="satansat" sourcefile="rockola.c" sampleof="vanguard"> <description>Satan of Saturn</description> <year>1981</year> <manufacturer>SNK</manufacturer> @@ -236294,9 +236514,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="zarzon" cloneof="satansat" romof="satansat" sampleof="vanguard"> + <game name="zarzon" sourcefile="rockola.c" cloneof="satansat" romof="satansat" sampleof="vanguard"> <description>Zarzon</description> <year>1981</year> <manufacturer>[SNK] (Taito America license)</manufacturer> @@ -236350,9 +236570,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="vanguard"> + <game name="vanguard" sourcefile="rockola.c"> <description>Vanguard (SNK)</description> <year>1981</year> <manufacturer>SNK</manufacturer> @@ -236405,9 +236625,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="vangrdce" cloneof="vanguard" romof="vanguard" sampleof="vanguard"> + <game name="vangrdce" sourcefile="rockola.c" cloneof="vanguard" romof="vanguard" sampleof="vanguard"> <description>Vanguard (Centuri)</description> <year>1981</year> <manufacturer>SNK (Centuri license)</manufacturer> @@ -236460,9 +236680,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="fantasy" sampleof="vanguard"> + <game name="fantasy" sourcefile="rockola.c" sampleof="vanguard"> <description>Fantasy (US)</description> <year>1981</year> <manufacturer>[SNK] (Rock-ola license)</manufacturer> @@ -236517,9 +236737,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="fantasyj" cloneof="fantasy" romof="fantasy" sampleof="vanguard"> + <game name="fantasyj" sourcefile="rockola.c" cloneof="fantasy" romof="fantasy" sampleof="vanguard"> <description>Fantasy (Japan)</description> <year>1981</year> <manufacturer>SNK</manufacturer> @@ -236574,9 +236794,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="pballoon" sampleof="vanguard"> + <game name="pballoon" sourcefile="rockola.c" sampleof="vanguard"> <description>Pioneer Balloon</description> <year>1982</year> <manufacturer>SNK</manufacturer> @@ -236626,9 +236846,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="nibbler" sampleof="vanguard"> + <game name="nibbler" sourcefile="rockola.c" sampleof="vanguard"> <description>Nibbler (set 1)</description> <year>1982</year> <manufacturer>Rock-ola</manufacturer> @@ -236684,9 +236904,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="nibblera" cloneof="nibbler" romof="nibbler" sampleof="vanguard"> + <game name="nibblera" sourcefile="rockola.c" cloneof="nibbler" romof="nibbler" sampleof="vanguard"> <description>Nibbler (set 2)</description> <year>1982</year> <manufacturer>Rock-ola</manufacturer> @@ -236742,9 +236962,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="64"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="64"/> </game> - <game name="lasso"> + <game name="lasso" sourcefile="lasso.c"> <description>Lasso</description> <year>1982</year> <manufacturer>SNK</manufacturer> @@ -236804,9 +237024,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="chameleo"> + <game name="chameleo" sourcefile="lasso.c"> <description>Chameleon</description> <year>1983</year> <manufacturer>Jaleco</manufacturer> @@ -236868,9 +237088,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="wwjgtin"> + <game name="wwjgtin" sourcefile="lasso.c"> <description>Wai Wai Jockey Gate-In!</description> <year>1984</year> <manufacturer>Jaleco / Casio</manufacturer> @@ -236936,9 +237156,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="pinbo"> + <game name="pinbo" sourcefile="lasso.c"> <description>Pinbo</description> <year>1984</year> <manufacturer>Jaleco</manufacturer> @@ -237001,9 +237221,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pinbos" cloneof="pinbo" romof="pinbo"> + <game name="pinbos" sourcefile="lasso.c" cloneof="pinbo" romof="pinbo"> <description>Pinbo (Strike)</description> <year>1984</year> <manufacturer>bootleg?</manufacturer> @@ -237066,9 +237286,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="joyfulr"> + <game name="joyfulr" sourcefile="munchmo.c"> <description>Joyful Road (Japan)</description> <year>1983</year> <manufacturer>SNK</manufacturer> @@ -237146,9 +237366,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="mnchmobl" cloneof="joyfulr" romof="joyfulr"> + <game name="mnchmobl" sourcefile="munchmo.c" cloneof="joyfulr" romof="joyfulr"> <description>Munch Mobile (US)</description> <year>1983</year> <manufacturer>SNK (Centuri license)</manufacturer> @@ -237226,9 +237446,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="marvins"> + <game name="marvins" sourcefile="marvins.c"> <description>Marvin's Maze</description> <year>1983</year> <manufacturer>SNK</manufacturer> @@ -237310,9 +237530,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="madcrash"> + <game name="madcrash" sourcefile="marvins.c"> <description>Mad Crasher</description> <year>1984</year> <manufacturer>SNK</manufacturer> @@ -237400,9 +237620,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="288"/> </game> - <game name="vangrd2"> + <game name="vangrd2" sourcefile="marvins.c"> <description>Vanguard II</description> <year>1984</year> <manufacturer>SNK</manufacturer> @@ -237489,9 +237709,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="jcross"> + <game name="jcross" sourcefile="jcross.c"> <description>Jumping Cross</description> <year>1984</year> <manufacturer>SNK</manufacturer> @@ -237577,9 +237797,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="288"/> </game> - <game name="mainsnk"> + <game name="mainsnk" sourcefile="mainsnk.c"> <description>Main Event (1984)</description> <year>1984</year> <manufacturer>SNK</manufacturer> @@ -237642,9 +237862,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="288"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="288"/> </game> - <game name="sgladiat"> + <game name="sgladiat" sourcefile="sgladiat.c"> <description>Gladiator 1984</description> <year>1984</year> <manufacturer>SNK</manufacturer> @@ -237723,9 +237943,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hal21"> + <game name="hal21" sourcefile="hal21.c"> <description>HAL21</description> <year>1985</year> <manufacturer>SNK</manufacturer> @@ -237809,9 +238029,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="1024"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hal21j" cloneof="hal21" romof="hal21"> + <game name="hal21j" sourcefile="hal21.c" cloneof="hal21" romof="hal21"> <description>HAL21 (Japan)</description> <year>1985</year> <manufacturer>SNK</manufacturer> @@ -237895,9 +238115,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="1024"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aso"> + <game name="aso" sourcefile="hal21.c"> <description>ASO - Armored Scrum Object</description> <year>1985</year> <manufacturer>SNK</manufacturer> @@ -237976,9 +238196,9 @@ <dipvalue name="3"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tnk3"> + <game name="tnk3" sourcefile="snk.c"> <description>T.N.K. III (US)</description> <year>1985</year> <manufacturer>SNK</manufacturer> @@ -238058,9 +238278,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tnk3j" cloneof="tnk3" romof="tnk3"> + <game name="tnk3j" sourcefile="snk.c" cloneof="tnk3" romof="tnk3"> <description>T.A.N.K. (Japan)</description> <year>1985</year> <manufacturer>SNK</manufacturer> @@ -238140,9 +238360,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="athena"> + <game name="athena" sourcefile="snk.c"> <description>Athena</description> <year>1986</year> <manufacturer>SNK</manufacturer> @@ -238224,9 +238444,9 @@ <dipvalue name="12" default="yes"/> <dipvalue name="14"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="fitegolf"> + <game name="fitegolf" sourcefile="snk.c"> <description>Fighting Golf (World?)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -238301,9 +238521,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="fitegol2" cloneof="fitegolf" romof="fitegolf"> + <game name="fitegol2" sourcefile="snk.c" cloneof="fitegolf" romof="fitegolf"> <description>Fighting Golf (US)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -238378,9 +238598,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="countryc" cloneof="fitegolf" romof="fitegolf"> + <game name="countryc" sourcefile="snk.c" cloneof="fitegolf" romof="fitegolf"> <description>Country Club</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -238457,9 +238677,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ikari"> + <game name="ikari" sourcefile="snk.c"> <description>Ikari Warriors (US)</description> <year>1986</year> <manufacturer>SNK</manufacturer> @@ -238545,9 +238765,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ikarijp" cloneof="ikari" romof="ikari"> + <game name="ikarijp" sourcefile="snk.c" cloneof="ikari" romof="ikari"> <description>Ikari (Japan)</description> <year>1986</year> <manufacturer>SNK</manufacturer> @@ -238636,9 +238856,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ikarijpb" cloneof="ikari" romof="ikari"> + <game name="ikarijpb" sourcefile="snk.c" cloneof="ikari" romof="ikari"> <description>Ikari (Japan bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -238727,9 +238947,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="victroad"> + <game name="victroad" sourcefile="snk.c"> <description>Victory Road</description> <year>1986</year> <manufacturer>SNK</manufacturer> @@ -238815,9 +239035,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="dogosoke" cloneof="victroad" romof="victroad"> + <game name="dogosoke" sourcefile="snk.c" cloneof="victroad" romof="victroad"> <description>Dogou Souken</description> <year>1986</year> <manufacturer>SNK</manufacturer> @@ -238903,9 +239123,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gwar"> + <game name="gwar" sourcefile="snk.c"> <description>Guerrilla War (US)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -238997,9 +239217,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gwarj" cloneof="gwar" romof="gwar"> + <game name="gwarj" sourcefile="snk.c" cloneof="gwar" romof="gwar"> <description>Guevara (Japan)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239091,9 +239311,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gwara" cloneof="gwar" romof="gwar"> + <game name="gwara" sourcefile="snk.c" cloneof="gwar" romof="gwar"> <description>Guerrilla War (Version 1)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239185,9 +239405,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gwarb" cloneof="gwar" romof="gwar"> + <game name="gwarb" sourcefile="snk.c" cloneof="gwar" romof="gwar"> <description>Guerrilla War (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -239279,9 +239499,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bermudat"> + <game name="bermudat" sourcefile="snk.c"> <description>Bermuda Triangle (Japan)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239372,9 +239592,9 @@ <dipvalue name="Time attack 3 minutes"/> <dipvalue name="Time attack 5 minutes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bermudao" cloneof="bermudat" romof="bermudat"> + <game name="bermudao" sourcefile="snk.c" cloneof="bermudat" romof="bermudat"> <description>Bermuda Triangle (Japan old version)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239465,9 +239685,9 @@ <dipvalue name="Time attack 3 minutes"/> <dipvalue name="Time attack 5 minutes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bermudaa" cloneof="bermudat" romof="bermudat"> + <game name="bermudaa" sourcefile="snk.c" cloneof="bermudat" romof="bermudat"> <description>Bermuda Triangle (US older version)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239564,9 +239784,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="worldwar" cloneof="bermudat" romof="bermudat"> + <game name="worldwar" sourcefile="snk.c" cloneof="bermudat" romof="bermudat"> <description>World Wars (World)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239659,9 +239879,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="psychos"> + <game name="psychos" sourcefile="snk.c"> <description>Psycho Soldier (US)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239756,9 +239976,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="psychosj" cloneof="psychos" romof="psychos"> + <game name="psychosj" sourcefile="snk.c" cloneof="psychos" romof="psychos"> <description>Psycho Soldier (Japan)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -239853,9 +240073,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="chopper"> + <game name="chopper" sourcefile="snk.c"> <description>Chopper I (US set 1)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -239943,9 +240163,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="choppera" cloneof="chopper" romof="chopper"> + <game name="choppera" sourcefile="snk.c" cloneof="chopper" romof="chopper"> <description>Chopper I (US set 2)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240033,9 +240253,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="chopperb" cloneof="chopper" romof="chopper"> + <game name="chopperb" sourcefile="snk.c" cloneof="chopper" romof="chopper"> <description>Chopper I (US set 3)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240123,9 +240343,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="legofair" cloneof="chopper" romof="chopper"> + <game name="legofair" sourcefile="snk.c" cloneof="chopper" romof="chopper"> <description>Koukuu Kihei Monogatari - The Legend of Air Cavalry (Japan)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240213,9 +240433,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ftsoccer"> + <game name="ftsoccer" sourcefile="snk.c"> <description>Fighting Soccer</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240293,9 +240513,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tdfever"> + <game name="tdfever" sourcefile="snk.c"> <description>TouchDown Fever</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -240385,9 +240605,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tdfeverj" cloneof="tdfever" romof="tdfever"> + <game name="tdfeverj" sourcefile="snk.c" cloneof="tdfever" romof="tdfever"> <description>TouchDown Fever (Japan)</description> <year>1987</year> <manufacturer>SNK</manufacturer> @@ -240477,9 +240697,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tdfever2" cloneof="tdfever" romof="tdfever"> + <game name="tdfever2" sourcefile="snk.c" cloneof="tdfever" romof="tdfever"> <description>TouchDown Fever 2</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240572,9 +240792,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ikari3"> + <game name="ikari3" sourcefile="snk68.c"> <description>Ikari III - The Rescue</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -240665,9 +240885,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pow"> + <game name="pow" sourcefile="snk68.c"> <description>P.O.W. - Prisoners of War (US)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240752,9 +240972,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="powj" cloneof="pow" romof="pow"> + <game name="powj" sourcefile="snk68.c" cloneof="pow" romof="pow"> <description>Datsugoku - Prisoners of War (Japan)</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -240839,9 +241059,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="searchar"> + <game name="searchar" sourcefile="snk68.c"> <description>SAR - Search And Rescue (World)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -240918,9 +241138,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sercharu" cloneof="searchar" romof="searchar"> + <game name="sercharu" sourcefile="snk68.c" cloneof="searchar" romof="searchar"> <description>SAR - Search And Rescue (US)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -240997,9 +241217,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="streetsm"> + <game name="streetsm" sourcefile="snk68.c"> <description>Street Smart (US version 2)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241074,9 +241294,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="streets1" cloneof="streetsm" romof="streetsm"> + <game name="streets1" sourcefile="snk68.c" cloneof="streetsm" romof="streetsm"> <description>Street Smart (US version 1)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241151,9 +241371,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="streetsw" cloneof="streetsm" romof="streetsm"> + <game name="streetsw" sourcefile="snk68.c" cloneof="streetsm" romof="streetsm"> <description>Street Smart (World version 1)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241228,9 +241448,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="streetsj" cloneof="streetsm" romof="streetsm"> + <game name="streetsj" sourcefile="snk68.c" cloneof="streetsm" romof="streetsm"> <description>Street Smart (Japan version 1)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241305,9 +241525,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="prehisle"> + <game name="prehisle" sourcefile="prehisle.c"> <description>Prehistoric Isle in 1930 (World)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241378,9 +241598,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="prehislu" cloneof="prehisle" romof="prehisle"> + <game name="prehislu" sourcefile="prehisle.c" cloneof="prehisle" romof="prehisle"> <description>Prehistoric Isle in 1930 (US)</description> <year>1989</year> <manufacturer>SNK of America</manufacturer> @@ -241451,9 +241671,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gensitou" cloneof="prehisle" romof="prehisle"> + <game name="gensitou" sourcefile="prehisle.c" cloneof="prehisle" romof="prehisle"> <description>Genshi-Tou 1930's</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241524,9 +241744,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="mechatt"> + <game name="mechatt" sourcefile="bbusters.c"> <description>Mechanized Attack (World)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241601,9 +241821,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bbusters"> + <game name="bbusters" sourcefile="bbusters.c"> <description>Beast Busters (World ?)</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -241683,9 +241903,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="shougi"> + <game name="shougi" sourcefile="shougi.c"> <description>Shougi</description> <manufacturer>Alpha Denshi</manufacturer> <rom name="1.3a" size="4096" crc="b601303f" sha1="ed07fb09053e15be49f4cb66e8916d1bdff48336" region="cpu1" offset="0"/> @@ -241704,9 +241924,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="4" coins="4"/> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="shougi2" cloneof="shougi" romof="shougi"> + <game name="shougi2" sourcefile="shougi.c" cloneof="shougi" romof="shougi"> <description>Shougi 2</description> <manufacturer>Alpha Denshi</manufacturer> <rom name="1-2.3a" size="4096" crc="16d75306" sha1="2d090396abd1fe2b31cb8450cc5d2fbde75e0230" region="cpu1" offset="0"/> @@ -241726,9 +241946,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="4" coins="4"/> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="champbas"> + <game name="champbas" sourcefile="champbas.c"> <description>Champion Baseball</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -241779,9 +241999,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="champbbj" cloneof="champbas" romof="champbas"> + <game name="champbbj" sourcefile="champbas.c" cloneof="champbas" romof="champbas"> <description>Champion Baseball (Japan set 1)</description> <year>1983</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -241832,9 +242052,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="champbja" cloneof="champbas" romof="champbas"> + <game name="champbja" sourcefile="champbas.c" cloneof="champbas" romof="champbas"> <description>Champion Baseball (Japan set 2)</description> <year>1983</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -241885,9 +242105,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="champbb2"> + <game name="champbb2" sourcefile="champbas.c"> <description>Champion Baseball II</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -241939,9 +242159,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="exctsccr"> + <game name="exctsccr" sourcefile="exctsccr.c"> <description>Exciting Soccer</description> <year>1983</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -241996,9 +242216,9 @@ <dipvalue name="3 Min."/> <dipvalue name="4 Min."/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="exctscca" cloneof="exctsccr" romof="exctsccr"> + <game name="exctscca" sourcefile="exctsccr.c" cloneof="exctsccr" romof="exctsccr"> <description>Exciting Soccer (alternate music)</description> <year>1983</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242053,9 +242273,9 @@ <dipvalue name="3 Min."/> <dipvalue name="4 Min."/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="exctsccb" cloneof="exctsccr" romof="exctsccr"> + <game name="exctsccb" sourcefile="exctsccr.c" cloneof="exctsccr" romof="exctsccr"> <description>Exciting Soccer (bootleg)</description> <year>1983</year> <manufacturer>bootleg</manufacturer> @@ -242104,9 +242324,9 @@ <dipvalue name="3 Min."/> <dipvalue name="4 Min."/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="exctscc2" cloneof="exctsccr" romof="exctsccr"> + <game name="exctscc2" sourcefile="exctsccr.c" cloneof="exctsccr" romof="exctsccr"> <description>Exciting Soccer II</description> <year>1984</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242161,9 +242381,9 @@ <dipvalue name="3 Min."/> <dipvalue name="4 Min."/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="equites"> + <game name="equites" sourcefile="equites.c"> <description>Equites</description> <year>1984</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242237,9 +242457,9 @@ <dipvalue name="A 1C/2C B 1C/4C"/> <dipvalue name="A 1C/3C B 1C/6C"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="equitess" cloneof="equites" romof="equites"> + <game name="equitess" sourcefile="equites.c" cloneof="equites" romof="equites"> <description>Equites (Sega)</description> <year>1984</year> <manufacturer>Alpha Denshi Co. (Sega license)</manufacturer> @@ -242313,9 +242533,9 @@ <dipvalue name="A 1C/2C B 1C/4C"/> <dipvalue name="A 1C/3C B 1C/6C"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bullfgtr"> + <game name="bullfgtr" sourcefile="equites.c"> <description>Bull Fighter</description> <year>1984</year> <manufacturer>Alpha Denshi Co. (Sega license)</manufacturer> @@ -242384,9 +242604,9 @@ <dipvalue name="A 1C/1C B 1C/4C"/> <dipvalue name="A 1C/2C B 1C/3C"/> </dipswitch> - <driver status="protection" color="preliminary" sound="good" palettesize="256"/> + <driver status="protection" color="preliminary" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kouyakyu"> + <game name="kouyakyu" sourcefile="equites.c"> <description>The Koukouyakyuh</description> <year>1985</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242458,9 +242678,9 @@ <dipvalue name="1C/1C (1C for 2 players)"/> <dipvalue name="1C/3C (1C per player)"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="splndrbt"> + <game name="splndrbt" sourcefile="equites.c"> <description>Splendor Blast</description> <year>1985</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242520,9 +242740,9 @@ <dipvalue name="A 1C/2C B 1C/4C"/> <dipvalue name="A 1C/3C B 1C/6C"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hvoltage"> + <game name="hvoltage" sourcefile="equites.c"> <description>High Voltage</description> <year>1985</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242581,9 +242801,9 @@ <dipvalue name="A 1C/2C B 1C/4C"/> <dipvalue name="A 1C/3C B 1C/6C"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sstingry"> + <game name="sstingry" sourcefile="alpha68k.c"> <description>Super Stingray</description> <year>1986</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242642,9 +242862,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="256"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kyros"> + <game name="kyros" sourcefile="alpha68k.c"> <description>Kyros</description> <year>1987</year> <manufacturer>World Games Inc</manufacturer> @@ -242709,9 +242929,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kyrosj" cloneof="kyros" romof="kyros"> + <game name="kyrosj" sourcefile="alpha68k.c" cloneof="kyros" romof="kyros"> <description>Kyros No Yakata (Japan)</description> <year>1986</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -242776,9 +242996,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="paddlema"> + <game name="paddlema" sourcefile="alpha68k.c"> <description>Paddle Mania</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -242857,9 +243077,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="timesold"> + <game name="timesold" sourcefile="alpha68k.c"> <description>Time Soldiers (US Rev 3)</description> <year>1987</year> <manufacturer>[Alpha Denshi Co.] (SNK/Romstar license)</manufacturer> @@ -242931,9 +243151,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="timesol1" cloneof="timesold" romof="timesold"> + <game name="timesol1" sourcefile="alpha68k.c" cloneof="timesold" romof="timesold"> <description>Time Soldiers (US Rev 1)</description> <year>1987</year> <manufacturer>[Alpha Denshi Co.] (SNK/Romstar license)</manufacturer> @@ -243005,9 +243225,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="btlfield" cloneof="timesold" romof="timesold"> + <game name="btlfield" sourcefile="alpha68k.c" cloneof="timesold" romof="timesold"> <description>Battle Field (Japan)</description> <year>1987</year> <manufacturer>[Alpha Denshi Co.] (SNK license)</manufacturer> @@ -243079,9 +243299,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skysoldr"> + <game name="skysoldr" sourcefile="alpha68k.c"> <description>Sky Soldiers (US)</description> <year>1988</year> <manufacturer>[Alpha Denshi Co.] (SNK of America/Romstar license)</manufacturer> @@ -243162,9 +243382,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="goldmedl"> + <game name="goldmedl" sourcefile="alpha68k.c"> <description>Gold Medalist</description> <year>1988</year> <manufacturer>SNK</manufacturer> @@ -243230,9 +243450,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="goldmedb" cloneof="goldmedl" romof="goldmedl"> + <game name="goldmedb" sourcefile="alpha68k.c" cloneof="goldmedl" romof="goldmedl"> <description>Gold Medalist (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -243301,9 +243521,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="skyadvnt"> + <game name="skyadvnt" sourcefile="alpha68k.c"> <description>Sky Adventure (World)</description> <year>1989</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -243368,9 +243588,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="skyadvnu" cloneof="skyadvnt" romof="skyadvnt"> + <game name="skyadvnu" sourcefile="alpha68k.c" cloneof="skyadvnt" romof="skyadvnt"> <description>Sky Adventure (US)</description> <year>1989</year> <manufacturer>Alpha Denshi Co. (SNK of America license)</manufacturer> @@ -243435,9 +243655,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="skyadvnj" cloneof="skyadvnt" romof="skyadvnt"> + <game name="skyadvnj" sourcefile="alpha68k.c" cloneof="skyadvnt" romof="skyadvnt"> <description>Sky Adventure (Japan)</description> <year>1989</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -243502,9 +243722,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gangwars"> + <game name="gangwars" sourcefile="alpha68k.c"> <description>Gang Wars (US)</description> <year>1989</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -243607,9 +243827,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gangwarb" cloneof="gangwars" romof="gangwars"> + <game name="gangwarb" sourcefile="alpha68k.c" cloneof="gangwars" romof="gangwars"> <description>Gang Wars (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -243714,9 +243934,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sbasebal"> + <game name="sbasebal" sourcefile="alpha68k.c"> <description>Super Champion Baseball (US)</description> <year>1989</year> <manufacturer>Alpha Denshi Co. (SNK of America license)</manufacturer> @@ -243781,9 +244001,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tnexspce"> + <game name="tnexspce" sourcefile="alpha68k.c"> <description>The Next Space</description> <year>1989</year> <manufacturer>SNK</manufacturer> @@ -243854,9 +244074,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="scregg"> + <game name="scregg" sourcefile="scregg.c"> <description>Scrambled Egg</description> <year>1983</year> <manufacturer>Technos</manufacturer> @@ -243933,9 +244153,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="eggs" cloneof="scregg" romof="scregg"> + <game name="eggs" sourcefile="scregg.c" cloneof="scregg" romof="scregg"> <description>Eggs</description> <year>1983</year> <manufacturer>[Technos] Universal USA</manufacturer> @@ -244012,9 +244232,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="dommy"> + <game name="dommy" sourcefile="scregg.c"> <description>Dommy</description> <manufacturer>Technos</manufacturer> <rom name="dommy.e01" size="8192" crc="9ae064ed" sha1="73082e5254d54d8386f580cc82a74242a6debd84" region="cpu1" offset="a000"/> @@ -244085,9 +244305,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="bigprowr"> + <game name="bigprowr" sourcefile="tagteam.c"> <description>The Big Pro Wrestling!</description> <year>1983</year> <manufacturer>Technos</manufacturer> @@ -244173,9 +244393,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="tagteam" cloneof="bigprowr" romof="bigprowr"> + <game name="tagteam" sourcefile="tagteam.c" cloneof="bigprowr" romof="bigprowr"> <description>Tag Team Wrestling</description> <year>1983</year> <manufacturer>Technos (Data East license)</manufacturer> @@ -244253,9 +244473,9 @@ <dipvalue name="Mode 1" default="yes"/> <dipvalue name="Mode 2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ssozumo"> + <game name="ssozumo" sourcefile="ssozumo.c"> <description>Syusse Oozumou (Japan)</description> <year>1984</year> <manufacturer>Technos</manufacturer> @@ -244359,9 +244579,9 @@ <dipvalue name="Single" default="yes"/> <dipvalue name="Dual"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="mystston"> + <game name="mystston" sourcefile="mystston.c"> <description>Mysterious Stones - Dr. John's Adventure</description> <year>1984</year> <manufacturer>Technos</manufacturer> @@ -244422,9 +244642,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="56"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="56"/> </game> - <game name="myststno" cloneof="mystston" romof="mystston"> + <game name="myststno" sourcefile="mystston.c" cloneof="mystston" romof="mystston"> <description>Mysterious Stones - Dr. Kick in Adventure</description> <year>1984</year> <manufacturer>Technos</manufacturer> @@ -244485,9 +244705,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="56"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="56"/> </game> - <game name="dogfgt"> + <game name="dogfgt" sourcefile="dogfgt.c"> <description>Acrobatic Dog-Fight</description> <year>1984</year> <manufacturer>Technos</manufacturer> @@ -244565,9 +244785,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="dogfgtj" cloneof="dogfgt" romof="dogfgt"> + <game name="dogfgtj" sourcefile="dogfgt.c" cloneof="dogfgt" romof="dogfgt"> <description>Dog-Fight (Japan) </description> <year>1984</year> <manufacturer>Technos</manufacturer> @@ -244645,9 +244865,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="bogeyman"> + <game name="bogeyman" sourcefile="bogeyman.c"> <description>Bogey Manor</description> <manufacturer>Technos Japan</manufacturer> <rom name="j20.c14" size="16384" crc="ea90d637" sha1="aa89bee806badb05119516d84e7674cd302aaf4e" region="cpu1" offset="4000"/> @@ -244713,9 +244933,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="272"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="272"/> </game> - <game name="matmania"> + <game name="matmania" sourcefile="matmania.c"> <description>Mat Mania</description> <year>1985</year> <manufacturer>Technos (Taito America license)</manufacturer> @@ -244815,9 +245035,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="excthour" cloneof="matmania" romof="matmania"> + <game name="excthour" sourcefile="matmania.c" cloneof="matmania" romof="matmania"> <description>Exciting Hour</description> <year>1985</year> <manufacturer>Technos (Taito license)</manufacturer> @@ -244917,9 +245137,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="maniach"> + <game name="maniach" sourcefile="matmania.c"> <description>Mania Challenge (set 1)</description> <year>1986</year> <manufacturer>Technos (Taito America license)</manufacturer> @@ -245021,9 +245241,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="maniach2" cloneof="maniach" romof="maniach"> + <game name="maniach2" sourcefile="matmania.c" cloneof="maniach" romof="maniach"> <description>Mania Challenge (set 2)</description> <year>1986</year> <manufacturer>Technos (Taito America license)</manufacturer> @@ -245125,9 +245345,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="80"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="80"/> </game> - <game name="renegade"> + <game name="renegade" sourcefile="renegade.c"> <description>Renegade (US)</description> <year>1986</year> <manufacturer>Technos (Taito America license)</manufacturer> @@ -245198,9 +245418,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kuniokun" cloneof="renegade" romof="renegade"> + <game name="kuniokun" sourcefile="renegade.c" cloneof="renegade" romof="renegade"> <description>Nekketsu Kouha Kunio-kun (Japan)</description> <year>1986</year> <manufacturer>Technos</manufacturer> @@ -245271,9 +245491,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kuniokub" cloneof="renegade" romof="renegade"> + <game name="kuniokub" sourcefile="renegade.c" cloneof="renegade" romof="renegade"> <description>Nekketsu Kouha Kunio-kun (Japan bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -245343,9 +245563,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="xsleena"> + <game name="xsleena" sourcefile="xain.c"> <description>Xain'd Sleena</description> <year>1986</year> <manufacturer>Technos</manufacturer> @@ -245438,9 +245658,9 @@ <dipvalue name="6"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="xsleenab" cloneof="xsleena" romof="xsleena"> + <game name="xsleenab" sourcefile="xain.c" cloneof="xsleena" romof="xsleena"> <description>Xain'd Sleena (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -245533,9 +245753,9 @@ <dipvalue name="6"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="solarwar" cloneof="xsleena" romof="xsleena"> + <game name="solarwar" sourcefile="xain.c" cloneof="xsleena" romof="xsleena"> <description>Solar-Warrior</description> <year>1986</year> <manufacturer>[Technos] Taito (Memetron license)</manufacturer> @@ -245628,9 +245848,9 @@ <dipvalue name="6"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="battlane"> + <game name="battlane" sourcefile="battlane.c"> <description>Battle Lane! Vol. 5 (set 1)</description> <year>1986</year> <manufacturer>Technos (Taito license)</manufacturer> @@ -245689,9 +245909,9 @@ <dipvalue name="20000 90000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="battlan2" cloneof="battlane" romof="battlane"> + <game name="battlan2" sourcefile="battlane.c" cloneof="battlane" romof="battlane"> <description>Battle Lane! Vol. 5 (set 2)</description> <year>1986</year> <manufacturer>Technos (Taito license)</manufacturer> @@ -245750,9 +245970,9 @@ <dipvalue name="20000 90000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="battlan3" cloneof="battlane" romof="battlane"> + <game name="battlan3" sourcefile="battlane.c" cloneof="battlane" romof="battlane"> <description>Battle Lane! Vol. 5 (set 3)</description> <year>1986</year> <manufacturer>Technos (Taito license)</manufacturer> @@ -245811,9 +246031,9 @@ <dipvalue name="20000 90000"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="ddragon"> + <game name="ddragon" sourcefile="ddragon.c"> <description>Double Dragon (Japan)</description> <year>1987</year> <manufacturer>Technos</manufacturer> @@ -245903,9 +246123,9 @@ <dipvalue name="4"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="ddragonu" cloneof="ddragon" romof="ddragon"> + <game name="ddragonu" sourcefile="ddragon.c" cloneof="ddragon" romof="ddragon"> <description>Double Dragon (US)</description> <year>1987</year> <manufacturer>[Technos] (Taito America license)</manufacturer> @@ -245995,9 +246215,9 @@ <dipvalue name="4"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="ddragonw" cloneof="ddragon" romof="ddragon"> + <game name="ddragonw" sourcefile="ddragon.c" cloneof="ddragon" romof="ddragon"> <description>Double Dragon (World)</description> <year>1987</year> <manufacturer>[Technos] (Taito license)</manufacturer> @@ -246087,9 +246307,9 @@ <dipvalue name="4"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="ddragonb" cloneof="ddragon" romof="ddragon"> + <game name="ddragonb" sourcefile="ddragon.c" cloneof="ddragon" romof="ddragon"> <description>Double Dragon (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -246179,9 +246399,9 @@ <dipvalue name="4"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="spdodgeb"> + <game name="spdodgeb" sourcefile="spdodgeb.c"> <description>Super Dodge Ball (US)</description> <year>1987</year> <manufacturer>Technos</manufacturer> @@ -246246,9 +246466,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nkdodgeb" cloneof="spdodgeb" romof="spdodgeb"> + <game name="nkdodgeb" sourcefile="spdodgeb.c" cloneof="spdodgeb" romof="spdodgeb"> <description>Nekketsu Koukou Dodgeball Bu (Japan bootleg)</description> <year>1987</year> <manufacturer>Technos</manufacturer> @@ -246317,9 +246537,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="chinagat"> + <game name="chinagat" sourcefile="chinagat.c"> <description>China Gate (US)</description> <year>1988</year> <manufacturer>[Technos] (Taito Romstar license)</manufacturer> @@ -246393,9 +246613,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="saiyugou" cloneof="chinagat" romof="chinagat"> + <game name="saiyugou" sourcefile="chinagat.c" cloneof="chinagat" romof="chinagat"> <description>Sai Yu Gou Ma Roku (Japan)</description> <year>1988</year> <manufacturer>Technos</manufacturer> @@ -246469,9 +246689,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="saiyugb1" cloneof="chinagat" romof="chinagat"> + <game name="saiyugb1" sourcefile="chinagat.c" cloneof="chinagat" romof="chinagat"> <description>Sai Yu Gou Ma Roku (Japan bootleg 1)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -246549,9 +246769,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="384"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="384"/> </game> - <game name="saiyugb2" cloneof="chinagat" romof="chinagat"> + <game name="saiyugb2" sourcefile="chinagat.c" cloneof="chinagat" romof="chinagat"> <description>Sai Yu Gou Ma Roku (Japan bootleg 2)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -246627,9 +246847,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="wwfsstar"> + <game name="wwfsstar" sourcefile="wwfsstar.c"> <description>WWF Superstars (US)</description> <year>1989</year> <manufacturer>Technos Japan</manufacturer> @@ -246743,9 +246963,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="vball"> + <game name="vball" sourcefile="vball.c"> <description>U.S. Championship V'ball (set 1)</description> <year>1988</year> <manufacturer>Technos</manufacturer> @@ -246827,9 +247047,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vball2pj" cloneof="vball" romof="vball"> + <game name="vball2pj" sourcefile="vball.c" cloneof="vball" romof="vball"> <description>U.S. Championship V'ball (Japan)</description> <year>1988</year> <manufacturer>Technos</manufacturer> @@ -246889,9 +247109,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ddragon2"> + <game name="ddragon2" sourcefile="ddragon.c"> <description>Double Dragon II - The Revenge (World)</description> <year>1988</year> <manufacturer>Technos</manufacturer> @@ -246975,9 +247195,9 @@ <dipvalue name="3"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="ddragn2u" cloneof="ddragon2" romof="ddragon2"> + <game name="ddragn2u" sourcefile="ddragon.c" cloneof="ddragon2" romof="ddragon2"> <description>Double Dragon II - The Revenge (US)</description> <year>1988</year> <manufacturer>Technos</manufacturer> @@ -247061,9 +247281,9 @@ <dipvalue name="3"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="toffy"> + <game name="toffy" sourcefile="ddragon.c"> <description>Toffy</description> <year>1993</year> <manufacturer>Midas</manufacturer> @@ -247142,9 +247362,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="stoffy"> + <game name="stoffy" sourcefile="ddragon.c"> <description>Super Toffy</description> <year>1994</year> <manufacturer>Midas (Unico license)</manufacturer> @@ -247223,9 +247443,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="384"/> </game> - <game name="ddungeon"> + <game name="ddungeon" sourcefile="ddragon.c"> <description>Dangerous Dungeons</description> <year>1992</year> <manufacturer>East Coast Coin Company (Melbourne)</manufacturer> @@ -247309,9 +247529,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="darktowr"> + <game name="darktowr" sourcefile="ddragon.c"> <description>Dark Tower</description> <year>1992</year> <manufacturer>Game Room</manufacturer> @@ -247416,9 +247636,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tstrike"> + <game name="tstrike" sourcefile="ddragon.c"> <description>Thunder Strike</description> <manufacturer>Game Room</manufacturer> <rom name="tstrike.26" size="32768" crc="871b10bc" sha1="c824775cf72c039612fda76c4a518cd89e4c8657" region="cpu1" offset="8000"/> @@ -247522,9 +247742,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ctribe"> + <game name="ctribe" sourcefile="ddragon3.c"> <description>The Combatribes (US)</description> <year>1990</year> <manufacturer>Technos</manufacturer> @@ -247589,12 +247809,12 @@ <dipvalue name="150"/> </dipswitch> <dipswitch name="Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="3"/> + <dipvalue name="2"/> + <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="ctribeb" cloneof="ctribe" romof="ctribe"> + <game name="ctribeb" sourcefile="ddragon3.c" cloneof="ctribe" romof="ctribe"> <description>The Combatribes (bootleg)</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -247659,12 +247879,12 @@ <dipvalue name="150"/> </dipswitch> <dipswitch name="Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="3"/> + <dipvalue name="2"/> + <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="blockout"> + <game name="blockout" sourcefile="blockout.c"> <description>Block Out (set 1)</description> <year>1989</year> <manufacturer>Technos + California Dreams</manufacturer> @@ -247732,9 +247952,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="513"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="513"/> </game> - <game name="blckout2" cloneof="blockout" romof="blockout"> + <game name="blckout2" sourcefile="blockout.c" cloneof="blockout" romof="blockout"> <description>Block Out (set 2)</description> <year>1989</year> <manufacturer>Technos + California Dreams</manufacturer> @@ -247802,9 +248022,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="513"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="513"/> </game> - <game name="blckoutj" cloneof="blockout" romof="blockout"> + <game name="blckoutj" sourcefile="blockout.c" cloneof="blockout" romof="blockout"> <description>Block Out (Japan)</description> <year>1989</year> <manufacturer>Technos + California Dreams</manufacturer> @@ -247872,9 +248092,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="513"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="513"/> </game> - <game name="ddragon3"> + <game name="ddragon3" sourcefile="ddragon3.c"> <description>Double Dragon 3 - The Rosetta Stone (US)</description> <year>1990</year> <manufacturer>Technos</manufacturer> @@ -247957,9 +248177,9 @@ <dipvalue name="2"/> <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="ddrago3b" cloneof="ddragon3" romof="ddragon3"> + <game name="ddrago3b" sourcefile="ddragon3.c" cloneof="ddragon3" romof="ddragon3"> <description>Double Dragon 3 - The Rosetta Stone (bootleg)</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -248040,12 +248260,12 @@ <dipvalue name="230" default="yes"/> </dipswitch> <dipswitch name="Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="3"/> + <dipvalue name="2"/> + <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="wwfwfest"> + <game name="wwfwfest" sourcefile="wwfwfest.c"> <description>WWF WrestleFest (US)</description> <year>1991</year> <manufacturer>Technos Japan</manufacturer> @@ -248126,9 +248346,9 @@ <dipvalue name="4th"/> <dipvalue name="5th" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="wwfwfsta" cloneof="wwfwfest" romof="wwfwfest"> + <game name="wwfwfsta" sourcefile="wwfwfest.c" cloneof="wwfwfest" romof="wwfwfest"> <description>WWF WrestleFest (US Tecmo)</description> <year>1991</year> <manufacturer>Technos Japan (Tecmo license)</manufacturer> @@ -248209,9 +248429,9 @@ <dipvalue name="4th"/> <dipvalue name="5th" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="wwfwfstj" cloneof="wwfwfest" romof="wwfwfest"> + <game name="wwfwfstj" sourcefile="wwfwfest.c" cloneof="wwfwfest" romof="wwfwfest"> <description>WWF WrestleFest (Japan)</description> <year>1991</year> <manufacturer>Technos Japan</manufacturer> @@ -248292,9 +248512,9 @@ <dipvalue name="4th"/> <dipvalue name="5th" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="shadfrce"> + <game name="shadfrce" sourcefile="shadfrce.c"> <description>Shadow Force (US Version 2)</description> <year>1993</year> <manufacturer>Technos Japan</manufacturer> @@ -248376,9 +248596,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16384"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16384"/> </game> - <game name="berzerk"> + <game name="berzerk" sourcefile="berzerk.c"> <description>Berzerk (set 1)</description> <year>1980</year> <manufacturer>Stern</manufacturer> @@ -248503,9 +248723,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="berzerk1" cloneof="berzerk" romof="berzerk" sampleof="berzerk"> + <game name="berzerk1" sourcefile="berzerk.c" cloneof="berzerk" romof="berzerk" sampleof="berzerk"> <description>Berzerk (set 2)</description> <year>1980</year> <manufacturer>Stern</manufacturer> @@ -248630,9 +248850,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="frenzy" sampleof="berzerk"> + <game name="frenzy" sourcefile="berzerk.c" sampleof="berzerk"> <description>Frenzy</description> <year>1982</year> <manufacturer>Stern</manufacturer> @@ -248760,9 +248980,9 @@ <dipvalue name="14"/> <dipvalue name="15"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mazerbla"> + <game name="mazerbla" sourcefile="mazerbla.c"> <description>Mazer Blazer</description> <year>1983</year> <manufacturer>Stern</manufacturer> @@ -248912,9 +249132,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="greatgun"> + <game name="greatgun" sourcefile="mazerbla.c"> <description>Great Guns</description> <year>1983</year> <manufacturer>Stern</manufacturer> @@ -249087,9 +249307,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="supdrapo"> + <game name="supdrapo" sourcefile="supdrapo.c"> <description>Super Draw Poker</description> <year>1983</year> <manufacturer>Stern</manufacturer> @@ -249233,9 +249453,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="16"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="toratora"> + <game name="toratora" sourcefile="toratora.c"> <description>Tora Tora</description> <year>1980</year> <manufacturer>GamePlan</manufacturer> @@ -249268,9 +249488,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="megatack"> + <game name="megatack" sourcefile="gameplan.c"> <description>MegaTack</description> <year>1980</year> <manufacturer>GamePlan (Centuri license)</manufacturer> @@ -249325,9 +249545,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="killcom"> + <game name="killcom" sourcefile="gameplan.c"> <description>Killer Comet</description> <year>1980</year> <manufacturer>GamePlan (Centuri license)</manufacturer> @@ -249370,9 +249590,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="challeng"> + <game name="challeng" sourcefile="gameplan.c"> <description>Challenger</description> <year>1981</year> <manufacturer>GamePlan (Centuri license)</manufacturer> @@ -249427,9 +249647,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="kaos"> + <game name="kaos" sourcefile="gameplan.c"> <description>Kaos</description> <year>1981</year> <manufacturer>GamePlan</manufacturer> @@ -249504,9 +249724,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="sia2650"> + <game name="sia2650" sourcefile="zac2650.c"> <description>Super Invader Attack</description> <year>1978</year> <manufacturer>Zaccaria/Zelco</manufacturer> @@ -249540,9 +249760,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="tinv2650" cloneof="sia2650" romof="sia2650"> + <game name="tinv2650" sourcefile="zac2650.c" cloneof="sia2650" romof="sia2650"> <description>The Invaders</description> <year>1978</year> <manufacturer>Zaccaria/Zelco</manufacturer> @@ -249580,9 +249800,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="dodgem"> + <game name="dodgem" sourcefile="zac2650.c"> <description>Dodgem</description> <year>1979</year> <manufacturer>Zaccaria</manufacturer> @@ -249660,9 +249880,9 @@ </dipswitch> <dipswitch name="Collision Detection"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="monymony"> + <game name="monymony" sourcefile="zaccaria.c"> <description>Money Money</description> <year>1983</year> <manufacturer>Zaccaria</manufacturer> @@ -249774,9 +249994,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="jackrabt"> + <game name="jackrabt" sourcefile="zaccaria.c"> <description>Jack Rabbit (set 1)</description> <year>1984</year> <manufacturer>Zaccaria</manufacturer> @@ -249895,9 +250115,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="jackrab2" cloneof="jackrabt" romof="jackrabt"> + <game name="jackrab2" sourcefile="zaccaria.c" cloneof="jackrabt" romof="jackrabt"> <description>Jack Rabbit (set 2)</description> <year>1984</year> <manufacturer>Zaccaria</manufacturer> @@ -250011,9 +250231,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="jackrabs" cloneof="jackrabt" romof="jackrabt"> + <game name="jackrabs" sourcefile="zaccaria.c" cloneof="jackrabt" romof="jackrabt"> <description>Jack Rabbit (special)</description> <year>1984</year> <manufacturer>Zaccaria</manufacturer> @@ -250127,9 +250347,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="512"/> </game> - <game name="mouser"> + <game name="mouser" sourcefile="mouser.c"> <description>Mouser</description> <year>1983</year> <manufacturer>UPL</manufacturer> @@ -250180,9 +250400,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="mouserc" cloneof="mouser" romof="mouser"> + <game name="mouserc" sourcefile="mouser.c" cloneof="mouser" romof="mouser"> <description>Mouser (Cosmos)</description> <year>1983</year> <manufacturer>[UPL] (Cosmos license)</manufacturer> @@ -250233,9 +250453,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="nova2001"> + <game name="nova2001" sourcefile="nova2001.c"> <description>Nova 2001 (Japan)</description> <year>1983</year> <manufacturer>UPL</manufacturer> @@ -250298,9 +250518,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="nov2001u" cloneof="nova2001" romof="nova2001"> + <game name="nov2001u" sourcefile="nova2001.c" cloneof="nova2001" romof="nova2001"> <description>Nova 2001 (US)</description> <year>1983</year> <manufacturer>UPL (Universal license)</manufacturer> @@ -250363,9 +250583,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="ninjakun"> + <game name="ninjakun" sourcefile="ninjakid.c"> <description>Ninjakun Majou no Bouken</description> <year>1984</year> <manufacturer>[UPL] (Taito license)</manufacturer> @@ -250449,9 +250669,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="raiders5"> + <game name="raiders5" sourcefile="raiders5.c"> <description>Raiders5</description> <year>1985</year> <manufacturer>UPL</manufacturer> @@ -250528,9 +250748,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="raidrs5t" cloneof="raiders5" romof="raiders5"> + <game name="raidrs5t" sourcefile="raiders5.c" cloneof="raiders5" romof="raiders5"> <description>Raiders5 (Japan)</description> <year>1985</year> <manufacturer>UPL (Taito license)</manufacturer> @@ -250607,9 +250827,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="pkunwar"> + <game name="pkunwar" sourcefile="pkunwar.c"> <description>Penguin-Kun Wars (US)</description> <manufacturer>UPL</manufacturer> <rom name="pkwar.01r" size="16384" crc="ce2d2c7b" sha1="2ffe2eb339fd668ec4fe90eff66124a334db0693" region="cpu1" offset="0"/> @@ -250688,9 +250908,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="pkunwarj" cloneof="pkunwar" romof="pkunwar"> + <game name="pkunwarj" sourcefile="pkunwar.c" cloneof="pkunwar" romof="pkunwar"> <description>Penguin-Kun Wars (Japan)</description> <manufacturer>UPL</manufacturer> <rom name="pgunwar.6" size="16384" crc="357f3ef3" sha1="bc651fb7701b395ae8cda1888814af5c5aa325a6" region="cpu1" offset="0"/> @@ -250769,9 +250989,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="xxmissio"> + <game name="xxmissio" sourcefile="xxmissio.c"> <description>XX Mission</description> <year>1986</year> <manufacturer>UPL</manufacturer> @@ -250847,9 +251067,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="ninjakd2"> + <game name="ninjakd2" sourcefile="ninjakd2.c"> <description>Ninja-Kid II (set 1)</description> <year>1987</year> <manufacturer>UPL</manufacturer> @@ -250927,9 +251147,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="ninjak2a" cloneof="ninjakd2" romof="ninjakd2"> + <game name="ninjak2a" sourcefile="ninjakd2.c" cloneof="ninjakd2" romof="ninjakd2"> <description>Ninja-Kid II (set 2)</description> <year>1987</year> <manufacturer>UPL</manufacturer> @@ -251010,9 +251230,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="ninjak2b" cloneof="ninjakd2" romof="ninjakd2"> + <game name="ninjak2b" sourcefile="ninjakd2.c" cloneof="ninjakd2" romof="ninjakd2"> <description>Ninja-Kid II (set 3)</description> <year>1987</year> <manufacturer>UPL</manufacturer> @@ -251093,9 +251313,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="rdaction" cloneof="ninjakd2" romof="ninjakd2"> + <game name="rdaction" sourcefile="ninjakd2.c" cloneof="ninjakd2" romof="ninjakd2"> <description>Rad Action</description> <year>1987</year> <manufacturer>UPL (World Games license)</manufacturer> @@ -251176,9 +251396,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="mnight"> + <game name="mnight" sourcefile="mnight.c"> <description>Mutant Night</description> <year>1987</year> <manufacturer>UPL (Kawakus license)</manufacturer> @@ -251260,9 +251480,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="arkarea"> + <game name="arkarea" sourcefile="mnight.c"> <description>Ark Area</description> <manufacturer>UPL</manufacturer> <rom name="arkarea.008" size="32768" crc="1ce1b5b9" sha1="ab7755523d58736b124deb59779dedee870fd7d2" region="cpu1" offset="0"/> @@ -251345,9 +251565,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="robokid"> + <game name="robokid" sourcefile="omegaf.c"> <description>Atomic Robo-kid</description> <year>1988</year> <manufacturer>UPL</manufacturer> @@ -251431,9 +251651,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="robokidj" cloneof="robokid" romof="robokid"> + <game name="robokidj" sourcefile="omegaf.c" cloneof="robokid" romof="robokid"> <description>Atomic Robo-kid (Japan)</description> <year>1988</year> <manufacturer>UPL</manufacturer> @@ -251517,9 +251737,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="omegaf"> + <game name="omegaf" sourcefile="omegaf.c"> <description>Omega Fighter</description> <year>1989</year> <manufacturer>UPL</manufacturer> @@ -251590,9 +251810,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="omegafs" cloneof="omegaf" romof="omegaf"> + <game name="omegafs" sourcefile="omegaf.c" cloneof="omegaf" romof="omegaf"> <description>Omega Fighter Special</description> <year>1989</year> <manufacturer>UPL</manufacturer> @@ -251663,9 +251883,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="urashima"> + <game name="urashima" sourcefile="nmk16.c"> <description>Urashima Mahjong</description> <year>1989</year> <manufacturer>UPL</manufacturer> @@ -251747,9 +251967,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tharrier"> + <game name="tharrier" sourcefile="nmk16.c"> <description>Task Force Harrier</description> <year>1989</year> <manufacturer>UPL (American Sammy license)</manufacturer> @@ -251840,9 +252060,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tharierj" cloneof="tharrier" romof="tharrier"> + <game name="tharierj" sourcefile="nmk16.c" cloneof="tharrier" romof="tharrier"> <description>Task Force Harrier (Japan)</description> <year>1989</year> <manufacturer>UPL</manufacturer> @@ -251933,9 +252153,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mustang"> + <game name="mustang" sourcefile="nmk16.c"> <description>US AAF Mustang (Japan)</description> <year>1990</year> <manufacturer>UPL</manufacturer> @@ -252013,9 +252233,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="protection" color="good" sound="preliminary" palettesize="1024"/> + <driver status="protection" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="mustangs" cloneof="mustang" romof="mustang"> + <game name="mustangs" sourcefile="nmk16.c" cloneof="mustang" romof="mustang"> <description>US AAF Mustang (Seoul Trading)</description> <year>1990</year> <manufacturer>UPL (Seoul Trading license)</manufacturer> @@ -252093,9 +252313,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="protection" color="good" sound="preliminary" palettesize="1024"/> + <driver status="protection" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="mustangb" cloneof="mustang" romof="mustang"> + <game name="mustangb" sourcefile="nmk16.c" cloneof="mustang" romof="mustang"> <description>US AAF Mustang (bootleg)</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -252170,9 +252390,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bioship"> + <game name="bioship" sourcefile="nmk16.c"> <description>Bio-ship Paladin</description> <year>1990</year> <manufacturer>UPL (American Sammy license)</manufacturer> @@ -252247,9 +252467,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="vandyke"> + <game name="vandyke" sourcefile="nmk16.c"> <description>Vandyke (Japan)</description> <year>1990</year> <manufacturer>UPL</manufacturer> @@ -252332,9 +252552,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="vandyjal" cloneof="vandyke" romof="vandyke"> + <game name="vandyjal" sourcefile="nmk16.c" cloneof="vandyke" romof="vandyke"> <description>Vandyke (Jaleco)</description> <year>1990</year> <manufacturer>UPL (Jaleco license)</manufacturer> @@ -252417,9 +252637,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="blkheart"> + <game name="blkheart" sourcefile="nmk16.c"> <description>Black Heart</description> <year>1991</year> <manufacturer>UPL</manufacturer> @@ -252495,9 +252715,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="protection" color="good" sound="preliminary" palettesize="1024"/> + <driver status="protection" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="blkhearj" cloneof="blkheart" romof="blkheart"> + <game name="blkhearj" sourcefile="nmk16.c" cloneof="blkheart" romof="blkheart"> <description>Black Heart (Japan)</description> <year>1991</year> <manufacturer>UPL</manufacturer> @@ -252573,9 +252793,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="protection" color="good" sound="preliminary" palettesize="1024"/> + <driver status="protection" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="acrobatm"> + <game name="acrobatm" sourcefile="nmk16.c"> <description>Acrobat Mission</description> <year>1991</year> <manufacturer>UPL (Taito license)</manufacturer> @@ -252648,9 +252868,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="strahl"> + <game name="strahl" sourcefile="nmk16.c"> <description>Koutetsu Yousai Strahl (Japan set 1)</description> <year>1992</year> <manufacturer>UPL</manufacturer> @@ -252723,9 +252943,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="strahla" cloneof="strahl" romof="strahl"> + <game name="strahla" sourcefile="nmk16.c" cloneof="strahl" romof="strahl"> <description>Koutetsu Yousai Strahl (Japan set 2)</description> <year>1992</year> <manufacturer>UPL</manufacturer> @@ -252798,9 +253018,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="bjtwin"> + <game name="bjtwin" sourcefile="nmk16.c"> <description>Bombjack Twin</description> <year>1993</year> <manufacturer>NMK</manufacturer> @@ -252873,9 +253093,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tdragon2"> + <game name="tdragon2" sourcefile="nmk16.c"> <description>Thunder Dragon 2</description> <year>1993</year> <manufacturer>NMK</manufacturer> @@ -252961,9 +253181,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bigbang" cloneof="tdragon2" romof="tdragon2"> + <game name="bigbang" sourcefile="nmk16.c" cloneof="tdragon2" romof="tdragon2"> <description>Big Bang</description> <year>1993</year> <manufacturer>NMK</manufacturer> @@ -253049,9 +253269,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tdragon"> + <game name="tdragon" sourcefile="nmk16.c"> <description>Thunder Dragon</description> <year>1991</year> <manufacturer>NMK / Tecmo</manufacturer> @@ -253189,9 +253409,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="1024"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="tdragonb" cloneof="tdragon" romof="tdragon"> + <game name="tdragonb" sourcefile="nmk16.c" cloneof="tdragon" romof="tdragon"> <description>Thunder Dragon (Bootleg)</description> <year>1991</year> <manufacturer>NMK / Tecmo</manufacturer> @@ -253331,9 +253551,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hachamf"> + <game name="hachamf" sourcefile="nmk16.c"> <description>Hacha Mecha Fighter</description> <year>1991</year> <manufacturer>NMK</manufacturer> @@ -253407,9 +253627,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="1024"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="macross"> + <game name="macross" sourcefile="nmk16.c"> <description>Super Spacefortress Macross / Chou-Jikuu Yousai Macross</description> <year>1992</year> <manufacturer>Banpresto</manufacturer> @@ -253491,9 +253711,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="gunnail"> + <game name="gunnail" sourcefile="nmk16.c"> <description>GunNail</description> <year>1993</year> <manufacturer>NMK / Tecmo</manufacturer> @@ -253574,9 +253794,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="macross2"> + <game name="macross2" sourcefile="nmk16.c"> <description>Super Spacefortress Macross II / Chou-Jikuu Yousai Macross II</description> <year>1993</year> <manufacturer>Banpresto</manufacturer> @@ -253664,9 +253884,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sabotenb"> + <game name="sabotenb" sourcefile="nmk16.c"> <description>Saboten Bombers</description> <year>1992</year> <manufacturer>NMK / Tecmo</manufacturer> @@ -253731,9 +253951,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nouryoku"> + <game name="nouryoku" sourcefile="nmk16.c"> <description>Nouryoku Koujou Iinkai</description> <year>1995</year> <manufacturer>Tecmo</manufacturer> @@ -253806,9 +254026,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="manybloc"> + <game name="manybloc" sourcefile="nmk16.c"> <description>Many Block</description> <year>1991</year> <manufacturer>Bee-Oh</manufacturer> @@ -253890,9 +254110,9 @@ <dipvalue name="Better"/> <dipvalue name="Best"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="512"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="512"/> </game> - <game name="ssmissin"> + <game name="ssmissin" sourcefile="nmk16.c"> <description>S.S. Mission</description> <year>1992</year> <manufacturer>Comad</manufacturer> @@ -253972,9 +254192,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="raphero"> + <game name="raphero" sourcefile="nmk16.c"> <description>Rapid Hero (Japan?)</description> <year>1994</year> <manufacturer>Media Trading Corp</manufacturer> @@ -254062,9 +254282,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="daireika"> + <game name="daireika" sourcefile="jalmah.c"> <description>Mahjong Daireikai</description> <year>1989</year> <manufacturer>Jaleco / NMK</manufacturer> @@ -254083,9 +254303,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="mjzoomin"> + <game name="mjzoomin" sourcefile="jalmah.c"> <description>Mahjong Channel Zoom In</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -254103,9 +254323,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="kakumei"> + <game name="kakumei" sourcefile="jalmah.c"> <description>Mahjong Kakumei</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -254123,9 +254343,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="kakumei2"> + <game name="kakumei2" sourcefile="jalmah.c"> <description>Mahjong Kakumei 2 - Princess League</description> <year>1992</year> <manufacturer>Jaleco</manufacturer> @@ -254143,9 +254363,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="quizpani"> + <game name="quizpani" sourcefile="quizpani.c"> <description>Quiz Panicuru Fantasy</description> <year>1993</year> <manufacturer>NMK</manufacturer> @@ -254321,9 +254541,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="macrossp"> + <game name="macrossp" sourcefile="macrossp.c"> <description>Macross Plus</description> <year>1996</year> <manufacturer>Banpresto</manufacturer> @@ -254522,9 +254742,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="quizmoon"> + <game name="quizmoon" sourcefile="macrossp.c"> <description>Quiz Bisyoujo Senshi Sailor Moon - Chiryoku Tairyoku Toki no Un</description> <year>1997</year> <manufacturer>Banpresto</manufacturer> @@ -254726,9 +254946,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="gakupara"> + <game name="gakupara" sourcefile="quizdna.c"> <description>Quiz Gakuen Paradise (Japan)</description> <year>1991</year> <manufacturer>NMK</manufacturer> @@ -254810,9 +255030,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="quizdna"> + <game name="quizdna" sourcefile="quizdna.c"> <description>Quiz DNA no Hanran (Japan)</description> <year>1992</year> <manufacturer>Face</manufacturer> @@ -254887,9 +255107,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gekiretu"> + <game name="gekiretu" sourcefile="quizdna.c"> <description>Quiz Gekiretsu Scramble (Japan)</description> <year>1992</year> <manufacturer>Face</manufacturer> @@ -254965,9 +255185,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="narc"> + <game name="narc" sourcefile="midyunit.c"> <description>Narc (rev 7.00)</description> <year>1988</year> <manufacturer>Williams</manufacturer> @@ -255056,9 +255276,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="narc3" cloneof="narc" romof="narc"> + <game name="narc3" sourcefile="midyunit.c" cloneof="narc" romof="narc"> <description>Narc (rev 3.20)</description> <year>1988</year> <manufacturer>Williams</manufacturer> @@ -255151,9 +255371,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="trog"> + <game name="trog" sourcefile="midyunit.c"> <description>Trog (rev LA4 03/11/91)</description> <year>1990</year> <manufacturer>Midway</manufacturer> @@ -255235,9 +255455,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="trog3" cloneof="trog" romof="trog"> + <game name="trog3" sourcefile="midyunit.c" cloneof="trog" romof="trog"> <description>Trog (rev LA3 02/14/91)</description> <year>1990</year> <manufacturer>Midway</manufacturer> @@ -255319,9 +255539,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="trogpa6" cloneof="trog" romof="trog"> + <game name="trogpa6" sourcefile="midyunit.c" cloneof="trog" romof="trog"> <description>Trog (rev PA6-PAC 09/09/90)</description> <year>1990</year> <manufacturer>Midway</manufacturer> @@ -255403,9 +255623,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="trogp" cloneof="trog" romof="trog"> + <game name="trogp" sourcefile="midyunit.c" cloneof="trog" romof="trog"> <description>Trog (prototype, rev 4.00 07/27/90)</description> <year>1990</year> <manufacturer>Midway</manufacturer> @@ -255487,9 +255707,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="smashtv"> + <game name="smashtv" sourcefile="midyunit.c"> <description>Smash T.V. (rev 8.00)</description> <year>1990</year> <manufacturer>Williams</manufacturer> @@ -255512,9 +255732,9 @@ <chip type="audio" name="YM2151" clock="3579580"/> <chip type="audio" name="DAC"/> <chip type="audio" name="HC55516"/> - <video screen="raster" orientation="horizontal" width="410" height="256" aspectx="4" aspecty="3" refresh="53.204948"/> + <video screen="raster" orientation="horizontal" width="400" height="255" aspectx="4" aspecty="3" refresh="53.204948"/> <sound channels="2"/> - <input players="2" control="doublejoy8way" buttons="4" coins="4" service="yes" tilt="yes"/> + <input players="2" control="doublejoy8way" coins="4" service="yes" tilt="yes"/> <dipswitch name="1-8"> <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> @@ -255579,9 +255799,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="smashtv6" cloneof="smashtv" romof="smashtv"> + <game name="smashtv6" sourcefile="midyunit.c" cloneof="smashtv" romof="smashtv"> <description>Smash T.V. (rev 6.00)</description> <year>1990</year> <manufacturer>Williams</manufacturer> @@ -255604,9 +255824,9 @@ <chip type="audio" name="YM2151" clock="3579580"/> <chip type="audio" name="DAC"/> <chip type="audio" name="HC55516"/> - <video screen="raster" orientation="horizontal" width="410" height="256" aspectx="4" aspecty="3" refresh="53.204948"/> + <video screen="raster" orientation="horizontal" width="400" height="255" aspectx="4" aspecty="3" refresh="53.204948"/> <sound channels="2"/> - <input players="2" control="doublejoy8way" buttons="4" coins="4" service="yes" tilt="yes"/> + <input players="2" control="doublejoy8way" coins="4" service="yes" tilt="yes"/> <dipswitch name="1-8"> <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> @@ -255671,9 +255891,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="smashtv5" cloneof="smashtv" romof="smashtv"> + <game name="smashtv5" sourcefile="midyunit.c" cloneof="smashtv" romof="smashtv"> <description>Smash T.V. (rev 5.00)</description> <year>1990</year> <manufacturer>Williams</manufacturer> @@ -255696,9 +255916,9 @@ <chip type="audio" name="YM2151" clock="3579580"/> <chip type="audio" name="DAC"/> <chip type="audio" name="HC55516"/> - <video screen="raster" orientation="horizontal" width="410" height="256" aspectx="4" aspecty="3" refresh="53.204948"/> + <video screen="raster" orientation="horizontal" width="400" height="255" aspectx="4" aspecty="3" refresh="53.204948"/> <sound channels="2"/> - <input players="2" control="doublejoy8way" buttons="4" coins="4" service="yes" tilt="yes"/> + <input players="2" control="doublejoy8way" coins="4" service="yes" tilt="yes"/> <dipswitch name="1-8"> <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> @@ -255763,9 +255983,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="smashtv4" cloneof="smashtv" romof="smashtv"> + <game name="smashtv4" sourcefile="midyunit.c" cloneof="smashtv" romof="smashtv"> <description>Smash T.V. (rev 4.00)</description> <year>1990</year> <manufacturer>Williams</manufacturer> @@ -255788,9 +256008,9 @@ <chip type="audio" name="YM2151" clock="3579580"/> <chip type="audio" name="DAC"/> <chip type="audio" name="HC55516"/> - <video screen="raster" orientation="horizontal" width="410" height="256" aspectx="4" aspecty="3" refresh="53.204948"/> + <video screen="raster" orientation="horizontal" width="400" height="255" aspectx="4" aspecty="3" refresh="53.204948"/> <sound channels="2"/> - <input players="2" control="doublejoy8way" buttons="4" coins="4" service="yes" tilt="yes"/> + <input players="2" control="doublejoy8way" coins="4" service="yes" tilt="yes"/> <dipswitch name="1-8"> <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> @@ -255855,9 +256075,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="hiimpact"> + <game name="hiimpact" sourcefile="midyunit.c"> <description>High Impact Football (rev LA3 12/27/90)</description> <year>1990</year> <manufacturer>Williams</manufacturer> @@ -255941,9 +256161,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shimpact"> + <game name="shimpact" sourcefile="midyunit.c"> <description>Super High Impact (rev LA1 09/30/91)</description> <year>1991</year> <manufacturer>Midway</manufacturer> @@ -256027,9 +256247,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shimpacp" cloneof="shimpact" romof="shimpact"> + <game name="shimpacp" sourcefile="midyunit.c" cloneof="shimpact" romof="shimpact"> <description>Super High Impact (prototype, rev 5.0 09/15/91)</description> <year>1991</year> <manufacturer>Midway</manufacturer> @@ -256113,9 +256333,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="strkforc"> + <game name="strkforc" sourcefile="midyunit.c"> <description>Strike Force (rev 1 02/25/91)</description> <year>1991</year> <manufacturer>Midway</manufacturer> @@ -256204,9 +256424,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mk"> + <game name="mk" sourcefile="midtunit.c"> <description>Mortal Kombat (rev 5.0 T-Unit 03/19/93)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256300,9 +256520,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mkr4" cloneof="mk" romof="mk"> + <game name="mkr4" sourcefile="midtunit.c" cloneof="mk" romof="mk"> <description>Mortal Kombat (rev 4.0 T-Unit 02/11/93)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256396,9 +256616,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mkprot9" cloneof="mk" romof="mk"> + <game name="mkprot9" sourcefile="midyunit.c" cloneof="mk" romof="mk"> <description>Mortal Kombat (prototype, rev 9.0 07/28/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256476,9 +256696,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mkla1" cloneof="mk" romof="mk"> + <game name="mkla1" sourcefile="midyunit.c" cloneof="mk" romof="mk"> <description>Mortal Kombat (rev 1.0 08/08/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256556,9 +256776,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mkla2" cloneof="mk" romof="mk"> + <game name="mkla2" sourcefile="midyunit.c" cloneof="mk" romof="mk"> <description>Mortal Kombat (rev 2.0 08/18/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256636,9 +256856,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mkla3" cloneof="mk" romof="mk"> + <game name="mkla3" sourcefile="midyunit.c" cloneof="mk" romof="mk"> <description>Mortal Kombat (rev 3.0 08/31/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256720,9 +256940,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mkla4" cloneof="mk" romof="mk"> + <game name="mkla4" sourcefile="midyunit.c" cloneof="mk" romof="mk"> <description>Mortal Kombat (rev 4.0 09/28/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -256804,9 +257024,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="term2"> + <game name="term2" sourcefile="midyunit.c"> <description>Terminator 2 - Judgment Day (rev LA3 03/27/92)</description> <year>1991</year> <manufacturer>Midway</manufacturer> @@ -256854,8 +257074,8 @@ <dipvalue name="Free Play"/> </dipswitch> <dipswitch name="Dipswitch Coinage"> - <dipvalue name="Off"/> - <dipvalue name="On" default="yes"/> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> </dipswitch> <dipswitch name="Normal Display"> <dipvalue name="Off"/> @@ -256890,9 +257110,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="term2la2" cloneof="term2" romof="term2"> + <game name="term2la2" sourcefile="midyunit.c" cloneof="term2" romof="term2"> <description>Terminator 2 - Judgment Day (rev LA2 12/09/91)</description> <year>1991</year> <manufacturer>Midway</manufacturer> @@ -256940,8 +257160,8 @@ <dipvalue name="Free Play"/> </dipswitch> <dipswitch name="Dipswitch Coinage"> - <dipvalue name="Off"/> - <dipvalue name="On" default="yes"/> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> </dipswitch> <dipswitch name="Normal Display"> <dipvalue name="Off"/> @@ -256976,9 +257196,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="term2la1" cloneof="term2" romof="term2"> + <game name="term2la1" sourcefile="midyunit.c" cloneof="term2" romof="term2"> <description>Terminator 2 - Judgment Day (rev LA1 11/01/91)</description> <year>1991</year> <manufacturer>Midway</manufacturer> @@ -257026,8 +257246,8 @@ <dipvalue name="Free Play"/> </dipswitch> <dipswitch name="Dipswitch Coinage"> - <dipvalue name="Off"/> - <dipvalue name="On" default="yes"/> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> </dipswitch> <dipswitch name="Normal Display"> <dipvalue name="Off"/> @@ -257062,9 +257282,9 @@ <dipvalue name="French"/> <dipvalue name="German"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="totcarn"> + <game name="totcarn" sourcefile="midyunit.c"> <description>Total Carnage (rev LA1 03/10/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -257092,7 +257312,7 @@ <chip type="audio" name="MSM6295" clock="8000"/> <video screen="raster" orientation="horizontal" width="400" height="256" aspectx="4" aspecty="3" refresh="53.204948"/> <sound channels="2"/> - <input players="2" control="doublejoy8way" buttons="4" coins="4" service="yes" tilt="yes"/> + <input players="2" control="doublejoy8way" coins="4" service="yes" tilt="yes"/> <dipswitch name="Coinage"> <dipvalue name="USA 1" default="yes"/> <dipvalue name="USA 2"/> @@ -257166,9 +257386,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="totcarnp" cloneof="totcarn" romof="totcarn"> + <game name="totcarnp" sourcefile="midyunit.c" cloneof="totcarn" romof="totcarn"> <description>Total Carnage (prototype, rev 1.0 01/25/92)</description> <year>1992</year> <manufacturer>Midway</manufacturer> @@ -257196,7 +257416,7 @@ <chip type="audio" name="MSM6295" clock="8000"/> <video screen="raster" orientation="horizontal" width="400" height="256" aspectx="4" aspecty="3" refresh="53.204948"/> <sound channels="2"/> - <input players="2" control="doublejoy8way" buttons="4" coins="4" service="yes" tilt="yes"/> + <input players="2" control="doublejoy8way" coins="4" service="yes" tilt="yes"/> <dipswitch name="Coinage"> <dipvalue name="USA 1" default="yes"/> <dipvalue name="USA 2"/> @@ -257270,9 +257490,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mk2"> + <game name="mk2" sourcefile="midtunit.c"> <description>Mortal Kombat II (rev L3.1)</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -257367,9 +257587,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk2r32" cloneof="mk2" romof="mk2"> + <game name="mk2r32" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> <description>Mortal Kombat II (rev L3.2 (European))</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -257464,9 +257684,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk2r21" cloneof="mk2" romof="mk2"> + <game name="mk2r21" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> <description>Mortal Kombat II (rev L2.1)</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -257561,9 +257781,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk2r14" cloneof="mk2" romof="mk2"> + <game name="mk2r14" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> <description>Mortal Kombat II (rev L1.4)</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -257658,9 +257878,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk2r42" cloneof="mk2" romof="mk2"> + <game name="mk2r42" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> <description>Mortal Kombat II (rev L4.2, hack)</description> <year>1993</year> <manufacturer>hack</manufacturer> @@ -257755,9 +257975,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk2r91" cloneof="mk2" romof="mk2"> + <game name="mk2r91" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> <description>Mortal Kombat II (rev L9.1, hack)</description> <year>1993</year> <manufacturer>hack</manufacturer> @@ -257852,9 +258072,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk2chal" cloneof="mk2" romof="mk2"> + <game name="mk2chal" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> <description>Mortal Kombat II Challenger (hack)</description> <year>1993</year> <manufacturer>hack</manufacturer> @@ -257949,9 +258169,106 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="jdreddp"> + <game name="mk2p" sourcefile="midtunit.c" cloneof="mk2" romof="mk2"> + <description>Mortal Kombat II Plus (Beta 2)</description> + <year>2019</year> + <manufacturer>hack</manufacturer> + <rom name="su2.l1" size="524288" crc="65d11dd7" sha1="bb94cca5a35f8f285d32314f8762c3c52ec48f5b" region="cpu2" offset="20000"/> + <rom name="su3.l1" merge="su3.l1" size="524288" crc="d6d92bf9" sha1="397351c6b707f2595e36360471015f9fa494e894" region="cpu2" offset="120000"/> + <rom name="su4.l1" merge="su4.l1" size="524288" crc="eebc8e0f" sha1="705ab63ff7672a4857d546afda6dca4973cce1ad" region="cpu2" offset="220000"/> + <rom name="su5.l1" merge="su5.l1" size="524288" crc="2b0b7961" sha1="1cdc64aab74d14afbd8c3531e3d0bd49271a281f" region="cpu2" offset="320000"/> + <rom name="su6.l1" merge="su6.l1" size="524288" crc="f694b27f" sha1="d43e38a124665f49ebb4ffc5a55e8f19a1a64686" region="cpu2" offset="420000"/> + <rom name="su7.l1" merge="su7.l1" size="524288" crc="20387e0a" sha1="505d05173b2a1f1ee3ebc2898ccd3a95c98dd04a" region="cpu2" offset="520000"/> + <rom name="uj12.l31" size="524288" crc="05ff15a9" sha1="23e9c47644c756d7568b6e5122801b19cf594e9b" region="user1" dispose="yes" offset="0"/> + <rom name="ug12.l31" size="524288" crc="b6d8ff5c" sha1="ad974cc0dcdf35c7175f7cb8c620b58b82843523" region="user1" dispose="yes" offset="1"/> + <rom name="ug14-vid" merge="ug14-vid" size="1048576" crc="01e73af6" sha1="6598cfd704cc92a7f358a0e1f1c973ab79dcc493" region="gfx1" dispose="yes" offset="0"/> + <rom name="ug16-vid" size="1048576" crc="b2af2798" sha1="3d679fb59753b72f961fe60a65e4e03a76b64266" region="gfx1" dispose="yes" offset="100000"/> + <rom name="ug17-vid" merge="ug17-vid" size="1048576" crc="937d8620" sha1="8b9f80a460b124a747a6d1495b53f01f580e28f1" region="gfx1" dispose="yes" offset="200000"/> + <rom name="uj14-vid" merge="uj14-vid" size="1048576" crc="d4985cbb" sha1="367865da7efae38d83de3c0868d02a705177ae63" region="gfx1" dispose="yes" offset="300000"/> + <rom name="uj16-vid" size="1048576" crc="d70dd149" sha1="1add61f22a68c0bd8dba3fa0da18f5ecc7f51c6f" region="gfx1" dispose="yes" offset="400000"/> + <rom name="uj17-vid" merge="uj17-vid" size="1048576" crc="218de160" sha1="87aea173720d2a33d8183903f4fe8ba1d47e3348" region="gfx1" dispose="yes" offset="500000"/> + <rom name="ug19-vid" merge="ug19-vid" size="1048576" crc="fec137be" sha1="f11ecb8a7993f5c4f4449564b4911f69bd6e9bf8" region="gfx1" dispose="yes" offset="600000"/> + <rom name="ug20-vid" size="1048576" crc="d05e970a" sha1="0f07d72c0ae9ed77c79b4a39abbc047df68a6b1d" region="gfx1" dispose="yes" offset="700000"/> + <rom name="ug22-vid" merge="ug22-vid" size="1048576" crc="154d53b1" sha1="58ff0aa59101f40a9a3b5fbae1c904d0b0b31612" region="gfx1" dispose="yes" offset="800000"/> + <rom name="uj19-vid" merge="uj19-vid" size="1048576" crc="2d763156" sha1="06536006da49ab5fb6b75b25f801b83fad000ff5" region="gfx1" dispose="yes" offset="900000"/> + <rom name="uj20-vid" size="1048576" crc="0f9c9a12" sha1="6c593ab037f9e203e50a13bef1cdbba765a45845" region="gfx1" dispose="yes" offset="a00000"/> + <rom name="uj22-vid" merge="uj22-vid" size="1048576" crc="8891d785" sha1="fd460df1ef8f4306ea42f7dc41488a80fd2c8f53" region="gfx1" dispose="yes" offset="b00000"/> + <chip type="cpu" name="TMS34010" clock="6250000"/> + <chip type="cpu" soundonly="yes" name="ADSP2105" clock="10000000"/> + <chip type="audio" name="Custom"/> + <video screen="raster" orientation="horizontal" width="400" height="254" aspectx="4" aspecty="3" refresh="53.204948"/> + <sound channels="1"/> + <input players="2" control="joy8way" buttons="6" coins="4" service="yes" tilt="yes"/> + <dipswitch name="Test Switch"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Counters"> + <dipvalue name="One"/> + <dipvalue name="Two" default="yes"/> + </dipswitch> + <dipswitch name="Coinage"> + <dipvalue name="USA-1" default="yes"/> + <dipvalue name="USA-2"/> + <dipvalue name="USA-3"/> + <dipvalue name="USA-4"/> + <dipvalue name="USA-ECA"/> + <dipvalue name="USA-Free Play"/> + <dipvalue name="German-1"/> + <dipvalue name="German-2"/> + <dipvalue name="German-3"/> + <dipvalue name="German-4"/> + <dipvalue name="German-5"/> + <dipvalue name="German-ECA"/> + <dipvalue name="German-Free Play"/> + <dipvalue name="French-1"/> + <dipvalue name="French-2"/> + <dipvalue name="French-3"/> + <dipvalue name="French-4"/> + <dipvalue name="French-ECA"/> + <dipvalue name="French-Free Play"/> + </dipswitch> + <dipswitch name="Coinage Source"> + <dipvalue name="Dipswitch"/> + <dipvalue name="CMOS" default="yes"/> + </dipswitch> + <dipswitch name="Circuit Boards"> + <dipvalue name="2"/> + <dipvalue name="1" default="yes"/> + </dipswitch> + <dipswitch name="Powerup Test"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Bill Validator"> + <dipvalue name="Installed"/> + <dipvalue name="Not Present" default="yes"/> + </dipswitch> + <dipswitch name="Comic Book Offer"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Attract Sound"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Low Blows"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Blood"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Violence"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> + </game> + <game name="jdreddp" sourcefile="midtunit.c"> <description>Judge Dredd (rev LA1, prototype)</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -258039,9 +258356,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbajam"> + <game name="nbajam" sourcefile="midtunit.c"> <description>NBA Jam (rev 3.01 04/07/93)</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -258128,9 +258445,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbajamr2" cloneof="nbajam" romof="nbajam"> + <game name="nbajamr2" sourcefile="midtunit.c" cloneof="nbajam" romof="nbajam"> <description>NBA Jam (rev 2.00 02/10/93)</description> <year>1993</year> <manufacturer>Midway</manufacturer> @@ -258217,9 +258534,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbajamte" cloneof="nbajam" romof="nbajam"> + <game name="nbajamte" sourcefile="midtunit.c" cloneof="nbajam" romof="nbajam"> <description>NBA Jam TE (rev 4.0 03/23/94)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258306,9 +258623,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbajamt1" cloneof="nbajam" romof="nbajam"> + <game name="nbajamt1" sourcefile="midtunit.c" cloneof="nbajam" romof="nbajam"> <description>NBA Jam TE (rev 1.0 01/17/94)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258395,9 +258712,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbajamt2" cloneof="nbajam" romof="nbajam"> + <game name="nbajamt2" sourcefile="midtunit.c" cloneof="nbajam" romof="nbajam"> <description>NBA Jam TE (rev 2.0 01/28/94)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258484,9 +258801,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbajamt3" cloneof="nbajam" romof="nbajam"> + <game name="nbajamt3" sourcefile="midtunit.c" cloneof="nbajam" romof="nbajam"> <description>NBA Jam TE (rev 3.0 03/04/94)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258573,9 +258890,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="revx"> + <game name="revx" sourcefile="midxunit.c"> <description>Revolution X (Rev. 1.0 6/16/94)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258645,12 +258962,12 @@ <dipvalue name="Free Play"/> </dipswitch> <dipswitch name="Credits"> - <dipvalue name="3 Start/1 Continue"/> + <dipvalue name="4 Start/2 Continue"/> <dipvalue name="2 Start/2 Continue"/> - <dipvalue name="2 Start/1 Continue"/> - <dipvalue name="1 Start/4 Continue"/> - <dipvalue name="1 Start/3 Continue"/> <dipvalue name="1 Start/1 Continue" default="yes"/> + <dipvalue name="3 Start/3 Continue"/> + <dipvalue name="3 Start/2 Continue"/> + <dipvalue name="4 Start/1 Continue"/> </dipswitch> <dipswitch name="Country"> <dipvalue name="USA" default="yes"/> @@ -258681,9 +258998,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk3"> + <game name="mk3" sourcefile="midwunit.c"> <description>Mortal Kombat 3 (rev 2.1)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258772,9 +259089,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk3r20" cloneof="mk3" romof="mk3"> + <game name="mk3r20" sourcefile="midwunit.c" cloneof="mk3" romof="mk3"> <description>Mortal Kombat 3 (rev 2.0)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258863,9 +259180,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mk3r10" cloneof="mk3" romof="mk3"> + <game name="mk3r10" sourcefile="midwunit.c" cloneof="mk3" romof="mk3"> <description>Mortal Kombat 3 (rev 1.0)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -258954,9 +259271,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="umk3" cloneof="mk3" romof="mk3"> + <game name="umk3" sourcefile="midwunit.c" cloneof="mk3" romof="mk3"> <description>Ultimate Mortal Kombat 3 (rev 1.2)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -259045,9 +259362,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="umk3r11" cloneof="mk3" romof="mk3"> + <game name="umk3r11" sourcefile="midwunit.c" cloneof="mk3" romof="mk3"> <description>Ultimate Mortal Kombat 3 (rev 1.1)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -259136,9 +259453,104 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wwfmania"> + <game name="umk3p" sourcefile="midwunit.c" cloneof="mk3" romof="mk3"> + <description>Ultimate Mortal Kombat 3 Plus (Beta 1)</description> + <year>2019</year> + <manufacturer>hack</manufacturer> + <rom name="umk3-u2.bin" merge="umk3-u2.bin" size="1048576" crc="3838cfe5" sha1="e3d2901f3bae1362742fc6ee0aa31c9f63b4dfa3" region="cpu2" offset="20000"/> + <rom name="umk3-u3.bin" merge="umk3-u3.bin" size="1048576" crc="856fe411" sha1="6165ebecfce7500e948d84492ffa19eed7f47091" region="cpu2" offset="120000"/> + <rom name="umk3-u4.bin" merge="umk3-u4.bin" size="1048576" crc="428a406f" sha1="e70ec83cd054de0da1e178720ed0035b8887f797" region="cpu2" offset="220000"/> + <rom name="umk3-u5.bin" merge="umk3-u5.bin" size="1048576" crc="3b98a09f" sha1="edf1d02a56dcf3349e6b4bb4097acfe7592305f4" region="cpu2" offset="320000"/> + <rom name="um312u54.bin" size="524288" crc="a46ee73c" sha1="2ad13bf20b9e42729773307b55fa67e430b1cf87" region="user1" dispose="yes" offset="0"/> + <rom name="um312u63.bin" size="524288" crc="4f200db2" sha1="25bab2c52df59056e3018d88491de1f2b1a8eed2" region="user1" dispose="yes" offset="1"/> + <rom name="umk-u133.bin" merge="umk-u133.bin" size="1048576" crc="79b94667" sha1="31bba640c351fdccc6685cadb74dd79a3f910ce8" region="gfx1" offset="0"/> + <rom name="umk-u132.bin" merge="umk-u132.bin" size="1048576" crc="13e95228" sha1="405b05f5a5a55667c2be17d4b399129bdacefd90" region="gfx1" offset="100000"/> + <rom name="umk-u131.bin" merge="umk-u131.bin" size="1048576" crc="41001e30" sha1="2cec91116771951c0380cec5debf4cbb40c14c61" region="gfx1" offset="200000"/> + <rom name="umk-u130.bin" merge="umk-u130.bin" size="1048576" crc="49379dd7" sha1="e6dfab4e23d9cc38ae56c1bbf10ccd160e8fad5e" region="gfx1" offset="300000"/> + <rom name="umk-u129.bin" merge="umk-u129.bin" size="1048576" crc="a8b41803" sha1="9697e35e8bb51d6d36b1d7ae47377b446e57682f" region="gfx1" offset="400000"/> + <rom name="umk-u128.bin" merge="umk-u128.bin" size="1048576" crc="b410d72f" sha1="ac5c1c6f744186540f4ab100d9bd4ce6007e600b" region="gfx1" offset="500000"/> + <rom name="umk-u127.bin" merge="umk-u127.bin" size="1048576" crc="bd985be7" sha1="f5183abea2e5eb2c2c8cefa72c9ed321679f5128" region="gfx1" offset="600000"/> + <rom name="umk-u126.bin" merge="umk-u126.bin" size="1048576" crc="e7c32cf4" sha1="94ea7b2eed7dae66f5dd676c20d6b360140e3e0e" region="gfx1" offset="700000"/> + <rom name="umk-u125.bin" merge="umk-u125.bin" size="1048576" crc="9a52227e" sha1="0474a14fa8dbfea0b0889c1d1756b86391683558" region="gfx1" offset="800000"/> + <rom name="umk-u124.bin" merge="umk-u124.bin" size="1048576" crc="5c750ebc" sha1="45d68af1a56994376e086d840502453c8d6be700" region="gfx1" offset="900000"/> + <rom name="umk-u123.bin" merge="umk-u123.bin" size="1048576" crc="f0ab88a8" sha1="cdc9dc12e162255845c6627b1e35182b7e8502d0" region="gfx1" offset="a00000"/> + <rom name="umk-u122.bin" merge="umk-u122.bin" size="1048576" crc="9b87cdac" sha1="a5f8db559293978f23e6f105543d8b2e170a2e0d" region="gfx1" offset="b00000"/> + <rom name="umk-u121.bin" size="1048576" crc="cc4b95db" sha1="3d53180eec649e9616c4b87db55573f12d9bfee3" region="gfx1" offset="c00000"/> + <rom name="umk-u120.bin" size="1048576" crc="1c8144cd" sha1="77cdc1eaf630ccb7233f5532f8b08191d00f0816" region="gfx1" offset="d00000"/> + <rom name="umk-u119.bin" size="1048576" crc="5f10c543" sha1="24dc83b7aa531ebd399258ffa7b2e028f1c4a28e" region="gfx1" offset="e00000"/> + <rom name="umk-u118.bin" size="1048576" crc="de0c4488" sha1="227cab34798c440b2a45223567113df5f17d913f" region="gfx1" offset="f00000"/> + <rom name="umk-u117.bin" size="524288" crc="52ee547e" sha1="97dba4d6dd503a623dad5709767e4617de211af0" region="gfx1" offset="1000000"/> + <rom name="umk-u116.bin" size="524288" crc="f6df5c98" sha1="e8317cf46d23738223f034c10f0f6f874d72165f" region="gfx1" offset="1100000"/> + <rom name="umk-u115.bin" size="524288" crc="e003a51b" sha1="e11c0cb0a9d647f17398b48d0b7d088526a18af8" region="gfx1" offset="1200000"/> + <rom name="umk-u114.bin" size="524288" crc="b8504598" sha1="fce32581d6ff9e1a7455c30fb10812ba9dc70db5" region="gfx1" offset="1300000"/> + <rom name="umk-u113.bin" size="1048576" crc="99d74a1e" sha1="ed3068afa98287ea290d1f537f5009d3b6d683da" region="gfx1" offset="1400000"/> + <rom name="umk-u112.bin" size="1048576" crc="b5a46488" sha1="dbf22e55d200eb9ff550f48b223cf0c6114a9357" region="gfx1" offset="1500000"/> + <rom name="umk-u111.bin" size="1048576" crc="a87523c8" sha1="e70b7599fef82001f762fc2c48f7b85474431ccc" region="gfx1" offset="1600000"/> + <rom name="umk-u110.bin" size="1048576" crc="0038f205" sha1="059c1c71a2d92ee6db36c09831d213a48a7e81d0" region="gfx1" offset="1700000"/> + <chip type="cpu" name="TMS34010" clock="6250000"/> + <chip type="cpu" soundonly="yes" name="ADSP2105" clock="10000000"/> + <chip type="audio" name="Custom"/> + <video screen="raster" orientation="horizontal" width="400" height="254" aspectx="4" aspecty="3" refresh="53.204948"/> + <sound channels="1"/> + <input players="2" control="joy8way" buttons="6" coins="4" service="yes" tilt="yes"/> + <dipswitch name="Test Switch"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Counters"> + <dipvalue name="One"/> + <dipvalue name="Two" default="yes"/> + </dipswitch> + <dipswitch name="Coinage"> + <dipvalue name="USA-1" default="yes"/> + <dipvalue name="USA-2"/> + <dipvalue name="USA-3"/> + <dipvalue name="USA-4"/> + <dipvalue name="USA-ECA"/> + <dipvalue name="USA-Free Play"/> + <dipvalue name="German-1"/> + <dipvalue name="German-2"/> + <dipvalue name="German-3"/> + <dipvalue name="German-4"/> + <dipvalue name="German-5"/> + <dipvalue name="German-ECA"/> + <dipvalue name="German-Free Play"/> + <dipvalue name="French-1"/> + <dipvalue name="French-2"/> + <dipvalue name="French-3"/> + <dipvalue name="French-4"/> + <dipvalue name="French-ECA"/> + <dipvalue name="French-Free Play"/> + </dipswitch> + <dipswitch name="Coinage Source"> + <dipvalue name="Dipswitch"/> + <dipvalue name="CMOS" default="yes"/> + </dipswitch> + <dipswitch name="Powerup Test"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Bill Validator"> + <dipvalue name="Off" default="yes"/> + <dipvalue name="On"/> + </dipswitch> + <dipswitch name="Attract Sound"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Blood"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <dipswitch name="Violence"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> + </dipswitch> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> + </game> + <game name="wwfmania" sourcefile="midwunit.c"> <description>WWF: Wrestlemania (rev 1.30 08/10/95)</description> <year>1995</year> <manufacturer>Midway</manufacturer> @@ -259208,9 +259620,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="openice"> + <game name="openice" sourcefile="midwunit.c"> <description>2 On 2 Open Ice Challenge (rev 1.21)</description> <year>1995</year> <manufacturer>Midway</manufacturer> @@ -259292,16 +259704,16 @@ <dipvalue name="Large"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="2-player" default="yes"/> - <dipvalue name="4-player"/> + <dipvalue name="2-player"/> + <dipvalue name="4-player" default="yes"/> </dipswitch> <dipswitch name="Test Switch"> <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbahangt"> + <game name="nbahangt" sourcefile="midwunit.c"> <description>NBA Hangtime (rev L1.1 04/16/96)</description> <year>1996</year> <manufacturer>Midway</manufacturer> @@ -259350,8 +259762,8 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="2-player" default="yes"/> - <dipvalue name="4-player"/> + <dipvalue name="2-player"/> + <dipvalue name="4-player" default="yes"/> </dipswitch> <dipswitch name="Counters"> <dipvalue name="One, 1/1" default="yes"/> @@ -259375,9 +259787,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="nbamaxht" cloneof="nbahangt" romof="nbahangt"> + <game name="nbamaxht" sourcefile="midwunit.c" cloneof="nbahangt" romof="nbahangt"> <description>NBA Maximum Hangtime (rev 1.0 11/8/96)</description> <year>1996</year> <manufacturer>Midway</manufacturer> @@ -259426,8 +259838,8 @@ <dipvalue name="On"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="2-player" default="yes"/> - <dipvalue name="4-player"/> + <dipvalue name="2-player"/> + <dipvalue name="4-player" default="yes"/> </dipswitch> <dipswitch name="Counters"> <dipvalue name="One, 1/1" default="yes"/> @@ -259451,9 +259863,9 @@ <dipvalue name="Dipswitch"/> <dipvalue name="CMOS" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="rmpgwt"> + <game name="rmpgwt" sourcefile="midwunit.c"> <description>Rampage: World Tour (rev 1.3)</description> <year>1997</year> <manufacturer>Midway</manufacturer> @@ -259530,9 +259942,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="rmpgwt11" cloneof="rmpgwt" romof="rmpgwt"> + <game name="rmpgwt11" sourcefile="midwunit.c" cloneof="rmpgwt" romof="rmpgwt"> <description>Rampage: World Tour (rev 1.1)</description> <year>1997</year> <manufacturer>Midway</manufacturer> @@ -259609,9 +260021,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="crusnusa"> + <game name="crusnusa" sourcefile="midvunit.c"> <description>Cruis'n USA (rev L4.1)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -259740,9 +260152,9 @@ <dipvalue name="Spain-4"/> <dipvalue name="Netherland-1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="crusnu40" cloneof="crusnusa" romof="crusnusa"> + <game name="crusnu40" sourcefile="midvunit.c" cloneof="crusnusa" romof="crusnusa"> <description>Cruis'n USA (rev L4.0)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -259871,9 +260283,9 @@ <dipvalue name="Spain-4"/> <dipvalue name="Netherland-1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="crusnu21" cloneof="crusnusa" romof="crusnusa"> + <game name="crusnu21" sourcefile="midvunit.c" cloneof="crusnusa" romof="crusnusa"> <description>Cruis'n USA (rev L2.1)</description> <year>1994</year> <manufacturer>Midway</manufacturer> @@ -260002,9 +260414,9 @@ <dipvalue name="Spain-4"/> <dipvalue name="Netherland-1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="crusnwld"> + <game name="crusnwld" sourcefile="midvunit.c"> <description>Cruis'n World (rev L2.3)</description> <year>1996</year> <manufacturer>Midway</manufacturer> @@ -260124,9 +260536,9 @@ <dipvalue name="Spain-4"/> <dipvalue name="Netherland-1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="crusnw20" cloneof="crusnwld" romof="crusnwld"> + <game name="crusnw20" sourcefile="midvunit.c" cloneof="crusnwld" romof="crusnwld"> <description>Cruis'n World (rev L2.0)</description> <year>1996</year> <manufacturer>Midway</manufacturer> @@ -260246,9 +260658,9 @@ <dipvalue name="Spain-4"/> <dipvalue name="Netherland-1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="crusnw13" cloneof="crusnwld" romof="crusnwld"> + <game name="crusnw13" sourcefile="midvunit.c" cloneof="crusnwld" romof="crusnwld"> <description>Cruis'n World (rev L1.3)</description> <year>1996</year> <manufacturer>Midway</manufacturer> @@ -260368,9 +260780,9 @@ <dipvalue name="Spain-4"/> <dipvalue name="Netherland-1"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="offroadc"> + <game name="offroadc" sourcefile="midvunit.c"> <description>Off Road Challenge</description> <year>1997</year> <manufacturer>Midway</manufacturer> @@ -260467,9 +260879,9 @@ <dipvalue name="Denmark 1"/> <dipvalue name="Hungary 1"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wargods"> + <game name="wargods" sourcefile="midvunit.c"> <description>War Gods</description> <year>1995</year> <manufacturer>Midway</manufacturer> @@ -260549,9 +260961,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wg3dh"> + <game name="wg3dh" sourcefile="seattle.c"> <description>Wayne Gretzky's 3D Hockey</description> <year>1996</year> <manufacturer>Atari Games</manufacturer> @@ -260626,9 +261038,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="mace"> + <game name="mace" sourcefile="seattle.c"> <description>Mace: The Dark Age</description> <year>1996</year> <manufacturer>Atari Games</manufacturer> @@ -260703,9 +261115,9 @@ <dipvalue name="Low"/> <dipvalue name="Medium" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="sfrush"> + <game name="sfrush" sourcefile="seattle.c"> <description>San Francisco Rush</description> <year>1996</year> <manufacturer>Atari Games</manufacturer> @@ -260782,9 +261194,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65536"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="calspeed"> + <game name="calspeed" sourcefile="seattle.c"> <description>California Speed</description> <year>1998</year> <manufacturer>Atari Games</manufacturer> @@ -260857,9 +261269,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="carnevil"> + <game name="carnevil" sourcefile="seattle.c"> <description>CarnEvil</description> <year>1998</year> <manufacturer>Midway Games</manufacturer> @@ -260941,9 +261353,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="biofreak"> + <game name="biofreak" sourcefile="seattle.c"> <description>BioFreaks (prototype)</description> <year>1997</year> <manufacturer>Midway Games</manufacturer> @@ -261020,9 +261432,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="blitz"> + <game name="blitz" sourcefile="seattle.c"> <description>NFL Blitz</description> <year>1997</year> <manufacturer>Midway Games</manufacturer> @@ -261087,9 +261499,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="blitz99"> + <game name="blitz99" sourcefile="seattle.c"> <description>NFL Blitz '99</description> <year>1998</year> <manufacturer>Midway Games</manufacturer> @@ -261172,9 +261584,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="blitz2k"> + <game name="blitz2k" sourcefile="seattle.c"> <description>NFL Blitz 2000</description> <year>1999</year> <manufacturer>Midway Games</manufacturer> @@ -261257,9 +261669,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65536"/> </game> - <game name="embargo"> + <game name="embargo" sourcefile="embargo.c"> <description>Embargo</description> <year>1977</year> <manufacturer>Cinematronics</manufacturer> @@ -261281,9 +261693,9 @@ <dipvalue name="5"/> <dipvalue name="6"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="tripool"> + <game name="tripool" sourcefile="jack.c"> <description>Tri-Pool (Casino Tech)</description> <year>1981</year> <manufacturer>Noma (Casino Tech license)</manufacturer> @@ -261367,9 +261779,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="tripoola" cloneof="tripool" romof="tripool"> + <game name="tripoola" sourcefile="jack.c" cloneof="tripool" romof="tripool"> <description>Tri-Pool (Costal Games)</description> <year>1981</year> <manufacturer>Noma (Costal Games license)</manufacturer> @@ -261453,9 +261865,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jack"> + <game name="jack" sourcefile="jack.c"> <description>Jack the Giantkiller (set 1)</description> <year>1982</year> <manufacturer>Cinematronics</manufacturer> @@ -261516,9 +261928,9 @@ </dipswitch> <dipswitch name="255 Lives"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jack2" cloneof="jack" romof="jack"> + <game name="jack2" sourcefile="jack.c" cloneof="jack" romof="jack"> <description>Jack the Giantkiller (set 2)</description> <year>1982</year> <manufacturer>Cinematronics</manufacturer> @@ -261579,9 +261991,9 @@ </dipswitch> <dipswitch name="255 Lives"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="jack3" cloneof="jack" romof="jack"> + <game name="jack3" sourcefile="jack.c" cloneof="jack" romof="jack"> <description>Jack the Giantkiller (set 3)</description> <year>1982</year> <manufacturer>Cinematronics</manufacturer> @@ -261642,9 +262054,9 @@ </dipswitch> <dipswitch name="255 Lives"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="treahunt" cloneof="jack" romof="jack"> + <game name="treahunt" sourcefile="jack.c" cloneof="jack" romof="jack"> <description>Treasure Hunt (Japan?)</description> <year>1982</year> <manufacturer>Hara Industries</manufacturer> @@ -261705,9 +262117,9 @@ </dipswitch> <dipswitch name="255 Lives"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="zzyzzyxx"> + <game name="zzyzzyxx" sourcefile="jack.c"> <description>Zzyzzyxx (set 1)</description> <year>1982</year> <manufacturer>Cinematronics + Advanced Microcomputer Systems</manufacturer> @@ -261786,9 +262198,9 @@ <dipvalue name="5 under 4000 pts"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="zzyzzyx2" cloneof="zzyzzyxx" romof="zzyzzyxx"> + <game name="zzyzzyx2" sourcefile="jack.c" cloneof="zzyzzyxx" romof="zzyzzyxx"> <description>Zzyzzyxx (set 2)</description> <year>1982</year> <manufacturer>Cinematronics + Advanced Microcomputer Systems</manufacturer> @@ -261867,9 +262279,9 @@ <dipvalue name="5 under 4000 pts"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="brix" cloneof="zzyzzyxx" romof="zzyzzyxx"> + <game name="brix" sourcefile="jack.c" cloneof="zzyzzyxx" romof="zzyzzyxx"> <description>Brix</description> <year>1982</year> <manufacturer>Cinematronics + Advanced Microcomputer Systems</manufacturer> @@ -261948,9 +262360,9 @@ <dipvalue name="5 under 4000 pts"/> <dipvalue name="None" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="freeze"> + <game name="freeze" sourcefile="jack.c"> <description>Freeze</description> <year>1984</year> <manufacturer>Cinematronics</manufacturer> @@ -261999,9 +262411,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="sucasino"> + <game name="sucasino" sourcefile="jack.c"> <description>Super Casino</description> <year>1984</year> <manufacturer>Data Amusement</manufacturer> @@ -262046,9 +262458,9 @@ <dipvalue name="6"/> <dipvalue name="7"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="spacewar"> + <game name="spacewar" sourcefile="cinemat.c"> <description>Space Wars</description> <year>1978</year> <manufacturer>Cinematronics</manufacturer> @@ -262077,9 +262489,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="barrier"> + <game name="barrier" sourcefile="cinemat.c"> <description>Barrier</description> <year>1979</year> <manufacturer>Vectorbeam</manufacturer> @@ -262117,9 +262529,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="starcas"> + <game name="starcas" sourcefile="cinemat.c"> <description>Star Castle (version 3)</description> <year>1980</year> <manufacturer>Cinematronics</manufacturer> @@ -262162,9 +262574,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="starcas1" cloneof="starcas" romof="starcas" sampleof="starcas"> + <game name="starcas1" sourcefile="cinemat.c" cloneof="starcas" romof="starcas" sampleof="starcas"> <description>Star Castle (older)</description> <year>1980</year> <manufacturer>Cinematronics</manufacturer> @@ -262207,9 +262619,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="starcasp" cloneof="starcas" romof="starcas" sampleof="starcas"> + <game name="starcasp" sourcefile="cinemat.c" cloneof="starcas" romof="starcas" sampleof="starcas"> <description>Star Castle (prototype)</description> <year>1980</year> <manufacturer>Cinematronics</manufacturer> @@ -262252,9 +262664,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="starcase" cloneof="starcas" romof="starcas" sampleof="starcas"> + <game name="starcase" sourcefile="cinemat.c" cloneof="starcas" romof="starcas" sampleof="starcas"> <description>Star Castle (Mottoeis)</description> <year>1980</year> <manufacturer>Cinematronics (Mottoeis license)</manufacturer> @@ -262297,9 +262709,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="stellcas" cloneof="starcas" romof="starcas" sampleof="starcas"> + <game name="stellcas" sourcefile="cinemat.c" cloneof="starcas" romof="starcas" sampleof="starcas"> <description>Stellar Castle (Elettronolo)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -262342,9 +262754,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="tailg"> + <game name="tailg" sourcefile="cinemat.c"> <description>Tailgunner</description> <year>1979</year> <manufacturer>Cinematronics</manufacturer> @@ -262382,9 +262794,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="ripoff"> + <game name="ripoff" sourcefile="cinemat.c"> <description>Rip Off</description> <year>1979</year> <manufacturer>Cinematronics</manufacturer> @@ -262432,9 +262844,9 @@ <dipvalue name="12"/> <dipvalue name="16"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="armora"> + <game name="armora" sourcefile="cinemat.c"> <description>Armor Attack</description> <year>1980</year> <manufacturer>Cinematronics</manufacturer> @@ -262471,9 +262883,9 @@ <dipvalue name="4"/> <dipvalue name="5" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="armorap" cloneof="armora" romof="armora" sampleof="armora"> + <game name="armorap" sourcefile="cinemat.c" cloneof="armora" romof="armora" sampleof="armora"> <description>Armor Attack (prototype)</description> <year>1980</year> <manufacturer>Cinematronics</manufacturer> @@ -262510,9 +262922,9 @@ <dipvalue name="4"/> <dipvalue name="5" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="armorar" cloneof="armora" romof="armora" sampleof="armora"> + <game name="armorar" sourcefile="cinemat.c" cloneof="armora" romof="armora" sampleof="armora"> <description>Armor Attack (Rock-ola)</description> <year>1980</year> <manufacturer>Cinematronics (Rock-ola license)</manufacturer> @@ -262549,9 +262961,9 @@ <dipvalue name="4"/> <dipvalue name="5" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="wotw"> + <game name="wotw" sourcefile="cinemat.c"> <description>War of the Worlds</description> <year>1981</year> <manufacturer>Cinematronics</manufacturer> @@ -262589,9 +263001,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="32768"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="warrior"> + <game name="warrior" sourcefile="cinemat.c"> <description>Warrior</description> <year>1978</year> <manufacturer>Vectorbeam</manufacturer> @@ -262635,9 +263047,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="starhawk"> + <game name="starhawk" sourcefile="cinemat.c"> <description>Star Hawk</description> <year>1981</year> <manufacturer>Cinematronics</manufacturer> @@ -262657,9 +263069,9 @@ <dipvalue name="1:00/2:00"/> <dipvalue name="0:45/1:30"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="solarq"> + <game name="solarq" sourcefile="cinemat.c"> <description>Solar Quest</description> <year>1981</year> <manufacturer>Cinematronics</manufacturer> @@ -262705,9 +263117,9 @@ <dipvalue name="4" default="yes"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="boxingb"> + <game name="boxingb" sourcefile="cinemat.c"> <description>Boxing Bugs</description> <year>1981</year> <manufacturer>Cinematronics</manufacturer> @@ -262747,9 +263159,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="2 Coins/3 Credits"/> </dipswitch> - <driver status="good" color="imperfect" sound="preliminary" palettesize="32768"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="speedfrk"> + <game name="speedfrk" sourcefile="cinemat.c"> <description>Speed Freak</description> <year>1979</year> <manufacturer>Vectorbeam</manufacturer> @@ -262787,9 +263199,9 @@ <dipvalue name="129" default="yes"/> <dipvalue name="159"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="sundance"> + <game name="sundance" sourcefile="cinemat.c"> <description>Sundance</description> <year>1979</year> <manufacturer>Cinematronics</manufacturer> @@ -262834,9 +263246,9 @@ <dipvalue name="1:30/coin"/> <dipvalue name="2:00/coin"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="demon"> + <game name="demon" sourcefile="cinemat.c"> <description>Demon</description> <year>1982</year> <manufacturer>Rock-ola</manufacturer> @@ -262879,9 +263291,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="cchasm"> + <game name="cchasm" sourcefile="cchasm.c"> <description>Cosmic Chasm (set 1)</description> <year>1983</year> <manufacturer>Cinematronics / GCE</manufacturer> @@ -262938,9 +263350,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="cchasm1" cloneof="cchasm" romof="cchasm"> + <game name="cchasm1" sourcefile="cchasm.c" cloneof="cchasm" romof="cchasm"> <description>Cosmic Chasm (set 2)</description> <year>1983</year> <manufacturer>Cinematronics / GCE</manufacturer> @@ -262997,9 +263409,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="roundup"> + <game name="roundup" sourcefile="thepit.c"> <description>Round-Up</description> <year>1981</year> <manufacturer>Amenip/Centuri</manufacturer> @@ -263046,9 +263458,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="fitter" cloneof="roundup" romof="roundup"> + <game name="fitter" sourcefile="thepit.c" cloneof="roundup" romof="roundup"> <description>Fitter</description> <year>1981</year> <manufacturer>Taito Corporation</manufacturer> @@ -263095,9 +263507,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="thepit"> + <game name="thepit" sourcefile="thepit.c"> <description>The Pit</description> <year>1982</year> <manufacturer>Centuri</manufacturer> @@ -263147,9 +263559,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="dockman"> + <game name="dockman" sourcefile="thepit.c"> <description>Dock Man</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -263198,9 +263610,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="portman" cloneof="dockman" romof="dockman"> + <game name="portman" sourcefile="thepit.c" cloneof="dockman" romof="dockman"> <description>Port Man</description> <year>1982</year> <manufacturer>Nova Games Ltd.</manufacturer> @@ -263249,9 +263661,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="funnymou"> + <game name="funnymou" sourcefile="thepit.c"> <description>Funny Mouse</description> <year>1982</year> <manufacturer>Chuo Co. Ltd</manufacturer> @@ -263297,9 +263709,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="suprmous" cloneof="funnymou" romof="funnymou"> + <game name="suprmous" sourcefile="thepit.c" cloneof="funnymou" romof="funnymou"> <description>Super Mouse</description> <year>1982</year> <manufacturer>Taito Corporation</manufacturer> @@ -263345,9 +263757,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="machomou"> + <game name="machomou" sourcefile="thepit.c"> <description>Macho Mouse</description> <year>1982</year> <manufacturer>Techstar</manufacturer> @@ -263393,9 +263805,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="intrepid"> + <game name="intrepid" sourcefile="thepit.c"> <description>Intrepid (set 1)</description> <year>1983</year> <manufacturer>Nova Games Ltd.</manufacturer> @@ -263444,9 +263856,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="intrepi2" cloneof="intrepid" romof="intrepid"> + <game name="intrepi2" sourcefile="thepit.c" cloneof="intrepid" romof="intrepid"> <description>Intrepid (set 2)</description> <year>1983</year> <manufacturer>Nova Games Ltd.</manufacturer> @@ -263495,9 +263907,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="40"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="zaryavos"> + <game name="zaryavos" sourcefile="thepit.c"> <description>Zarya Vostoka</description> <year>1984</year> <manufacturer>Nova Games of Canada</manufacturer> @@ -263549,9 +263961,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="40"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="40"/> </game> - <game name="timelimt"> + <game name="timelimt" sourcefile="timelimt.c"> <description>Time Limit</description> <year>1983</year> <manufacturer>Chuo Co. Ltd</manufacturer> @@ -263601,9 +264013,9 @@ </dipswitch> <dipswitch name="Invincibility"> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="64"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="64"/> </game> - <game name="progress"> + <game name="progress" sourcefile="timelimt.c"> <description>Progress</description> <year>1984</year> <manufacturer>Chuo Co. Ltd</manufacturer> @@ -263655,9 +264067,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="96"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="96"/> </game> - <game name="bagman"> + <game name="bagman" sourcefile="bagman.c"> <description>Bagman</description> <year>1982</year> <manufacturer>Valadon Automation</manufacturer> @@ -263681,7 +264093,7 @@ <chip type="audio" name="TMS5110" clock="640000"/> <video screen="raster" orientation="vertical" width="224" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="joy8way" buttons="1" coins="4"/> + <input players="2" control="joy4way" buttons="1" coins="4"/> <dipswitch name="Lives"> <dipvalue name="2"/> <dipvalue name="3" default="yes"/> @@ -263710,9 +264122,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="bagnard" cloneof="bagman" romof="bagman"> + <game name="bagnard" sourcefile="bagman.c" cloneof="bagman" romof="bagman"> <description>Le Bagnard</description> <year>1982</year> <manufacturer>Valadon Automation</manufacturer> @@ -263736,7 +264148,7 @@ <chip type="audio" name="TMS5110" clock="640000"/> <video screen="raster" orientation="vertical" width="224" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="joy8way" buttons="1" coins="4"/> + <input players="2" control="joy4way" buttons="1" coins="4"/> <dipswitch name="Lives"> <dipvalue name="2"/> <dipvalue name="3" default="yes"/> @@ -263765,9 +264177,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="bagmans" cloneof="bagman" romof="bagman"> + <game name="bagmans" sourcefile="bagman.c" cloneof="bagman" romof="bagman"> <description>Bagman (Stern set 1)</description> <year>1982</year> <manufacturer>Valadon Automation (Stern license)</manufacturer> @@ -263791,7 +264203,7 @@ <chip type="audio" name="TMS5110" clock="640000"/> <video screen="raster" orientation="vertical" width="224" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="joy8way" buttons="1" coins="4"/> + <input players="2" control="joy4way" buttons="1" coins="4"/> <dipswitch name="Lives"> <dipvalue name="2"/> <dipvalue name="3" default="yes"/> @@ -263820,9 +264232,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="bagmans2" cloneof="bagman" romof="bagman"> + <game name="bagmans2" sourcefile="bagman.c" cloneof="bagman" romof="bagman"> <description>Bagman (Stern set 2)</description> <year>1982</year> <manufacturer>Valadon Automation (Stern license)</manufacturer> @@ -263846,7 +264258,7 @@ <chip type="audio" name="TMS5110" clock="640000"/> <video screen="raster" orientation="vertical" width="224" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="joy8way" buttons="1" coins="4"/> + <input players="2" control="joy4way" buttons="1" coins="4"/> <dipswitch name="Lives"> <dipvalue name="2"/> <dipvalue name="3" default="yes"/> @@ -263875,9 +264287,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sbagman"> + <game name="sbagman" sourcefile="bagman.c"> <description>Super Bagman</description> <year>1984</year> <manufacturer>Valadon Automation</manufacturer> @@ -263905,7 +264317,7 @@ <chip type="audio" name="TMS5110" clock="640000"/> <video screen="raster" orientation="vertical" width="224" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="joy8way" buttons="2" coins="4"/> + <input players="2" control="joy4way" buttons="2" coins="4"/> <dipswitch name="Lives"> <dipvalue name="2"/> <dipvalue name="3" default="yes"/> @@ -263934,9 +264346,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="sbagmans" cloneof="sbagman" romof="sbagman"> + <game name="sbagmans" sourcefile="bagman.c" cloneof="sbagman" romof="sbagman"> <description>Super Bagman (Stern)</description> <year>1984</year> <manufacturer>Valadon Automation (Stern license)</manufacturer> @@ -263964,7 +264376,7 @@ <chip type="audio" name="TMS5110" clock="640000"/> <video screen="raster" orientation="vertical" width="224" height="256" aspectx="3" aspecty="4" refresh="60.000000"/> <sound channels="1"/> - <input players="2" control="joy8way" buttons="2" coins="4"/> + <input players="2" control="joy4way" buttons="2" coins="4"/> <dipswitch name="Lives"> <dipvalue name="2"/> <dipvalue name="3" default="yes"/> @@ -263993,9 +264405,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="pickin"> + <game name="pickin" sourcefile="bagman.c"> <description>Pickin'</description> <year>1983</year> <manufacturer>Valadon Automation</manufacturer> @@ -264044,9 +264456,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="tankbust"> + <game name="tankbust" sourcefile="tankbust.c"> <description>Tank Busters</description> <year>1985</year> <manufacturer>Valadon Automation</manufacturer> @@ -264103,9 +264515,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="128"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="128"/> </game> - <game name="stinger"> + <game name="stinger" sourcefile="wiz.c"> <description>Stinger</description> <year>1983</year> <manufacturer>Seibu Denshi</manufacturer> @@ -264186,9 +264598,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="stinger2" cloneof="stinger" romof="stinger"> + <game name="stinger2" sourcefile="wiz.c" cloneof="stinger" romof="stinger"> <description>Stinger (prototype?)</description> <year>1983</year> <manufacturer>Seibu Denshi</manufacturer> @@ -264271,9 +264683,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="scion"> + <game name="scion" sourcefile="wiz.c"> <description>Scion</description> <year>1984</year> <manufacturer>Seibu Denshi</manufacturer> @@ -264354,9 +264766,9 @@ <dipswitch name="Unused"> <dipvalue name="Off" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="256"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="scionc" cloneof="scion" romof="scion"> + <game name="scionc" sourcefile="wiz.c" cloneof="scion" romof="scion"> <description>Scion (Cinematronics)</description> <year>1984</year> <manufacturer>Seibu Denshi (Cinematronics license)</manufacturer> @@ -264436,9 +264848,9 @@ <dipswitch name="Unused"> <dipvalue name="Off" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="256"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="kungfut"> + <game name="kungfut" sourcefile="wiz.c"> <description>Kung-Fu Taikun</description> <year>1984</year> <manufacturer>Seibu Kaihatsu Inc.</manufacturer> @@ -264518,9 +264930,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wiz"> + <game name="wiz" sourcefile="wiz.c"> <description>Wiz</description> <year>1985</year> <manufacturer>Seibu Kaihatsu Inc.</manufacturer> @@ -264597,9 +265009,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wizt" cloneof="wiz" romof="wiz"> + <game name="wizt" sourcefile="wiz.c" cloneof="wiz" romof="wiz"> <description>Wiz (Taito)</description> <year>1985</year> <manufacturer>[Seibu] (Taito license)</manufacturer> @@ -264676,9 +265088,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kncljoe"> + <game name="kncljoe" sourcefile="kncljoe.c"> <description>Knuckle Joe (set 1)</description> <year>1985</year> <manufacturer>[Seibu Kaihatsu] (Taito license)</manufacturer> @@ -264761,9 +265173,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="kncljoea" cloneof="kncljoe" romof="kncljoe"> + <game name="kncljoea" sourcefile="kncljoe.c" cloneof="kncljoe" romof="kncljoe"> <description>Knuckle Joe (set 2)</description> <year>1985</year> <manufacturer>[Seibu Kaihatsu] (Taito license)</manufacturer> @@ -264846,9 +265258,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="bcrusher" cloneof="kncljoe" romof="kncljoe"> + <game name="bcrusher" sourcefile="kncljoe.c" cloneof="kncljoe" romof="kncljoe"> <description>Bone Crusher</description> <year>1985</year> <manufacturer>bootleg</manufacturer> @@ -264931,9 +265343,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="144"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="144"/> </game> - <game name="empcity"> + <game name="empcity" sourcefile="stfight.c"> <description>Empire City: 1931 (bootleg?)</description> <year>1986</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -265026,9 +265438,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="257"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="empcityj" cloneof="empcity" romof="empcity"> + <game name="empcityj" sourcefile="stfight.c" cloneof="empcity" romof="empcity"> <description>Empire City: 1931 (Japan)</description> <year>1986</year> <manufacturer>[Seibu Kaihatsu] (Taito license)</manufacturer> @@ -265121,9 +265533,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="257"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="stfight" cloneof="empcity" romof="empcity"> + <game name="stfight" sourcefile="stfight.c" cloneof="empcity" romof="empcity"> <description>Street Fight (Germany)</description> <year>1986</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -265216,9 +265628,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="257"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="mustache"> + <game name="mustache" sourcefile="mustache.c"> <description>Mustache Boy</description> <year>1987</year> <manufacturer>[Seibu Kaihatsu] (March license)</manufacturer> @@ -265282,9 +265694,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="cshooter"> + <game name="cshooter" sourcefile="cshooter.c"> <description>Cross Shooter (not encrypted)</description> <year>1987</year> <manufacturer>[Seibu Kaihatsu] (Taito license)</manufacturer> @@ -265355,9 +265767,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="4096"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="cshootre" cloneof="cshooter" romof="cshooter"> + <game name="cshootre" sourcefile="cshooter.c" cloneof="cshooter" romof="cshooter"> <description>Cross Shooter (encrypted)</description> <year>1987</year> <manufacturer>[Seibu Kaihatsu] (J.K.H. license)</manufacturer> @@ -265425,9 +265837,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="4096"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="airraid" cloneof="cshooter" romof="cshooter"> + <game name="airraid" sourcefile="cshooter.c" cloneof="cshooter" romof="cshooter"> <description>Air Raid (encrypted)</description> <year>1987</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -265495,9 +265907,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="4096"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="4096"/> </game> - <game name="deadang"> + <game name="deadang" sourcefile="deadang.c"> <description>Dead Angle</description> <year>1988</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -265584,9 +265996,9 @@ <dipvalue name="Japan"/> <dipvalue name="Overseas" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ghunter" cloneof="deadang" romof="deadang"> + <game name="ghunter" sourcefile="deadang.c" cloneof="deadang" romof="deadang"> <description>Gang Hunter (Spain)</description> <year>1988</year> <manufacturer>Seibu Kaihatsu (Segasa/Sonic license)</manufacturer> @@ -265675,9 +266087,9 @@ <dipvalue name="Japan"/> <dipvalue name="Overseas" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="dynduke"> + <game name="dynduke" sourcefile="dynduke.c"> <description>Dynamite Duke</description> <year>1989</year> <manufacturer>Seibu Kaihatsu (Fabtek license)</manufacturer> @@ -265772,9 +266184,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3072"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3072"/> </game> - <game name="dbldyn" cloneof="dynduke" romof="dynduke"> + <game name="dbldyn" sourcefile="dynduke.c" cloneof="dynduke" romof="dynduke"> <description>The Double Dynamites</description> <year>1989</year> <manufacturer>Seibu Kaihatsu (Fabtek license)</manufacturer> @@ -265869,9 +266281,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3072"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="3072"/> </game> - <game name="raiden"> + <game name="raiden" sourcefile="raiden.c"> <description>Raiden</description> <year>1990</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -265956,9 +266368,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="raidena" cloneof="raiden" romof="raiden"> + <game name="raidena" sourcefile="raiden.c" cloneof="raiden" romof="raiden"> <description>Raiden (Alternate Hardware)</description> <year>1990</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -266043,9 +266455,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="raidenk" cloneof="raiden" romof="raiden"> + <game name="raidenk" sourcefile="raiden.c" cloneof="raiden" romof="raiden"> <description>Raiden (Korea)</description> <year>1990</year> <manufacturer>Seibu Kaihatsu (IBL Corporation license)</manufacturer> @@ -266130,9 +266542,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="raident" cloneof="raiden" romof="raiden"> + <game name="raident" sourcefile="raiden.c" cloneof="raiden" romof="raiden"> <description>Raiden (Taiwan)</description> <year>1990</year> <manufacturer>Seibu Kaihatsu (Liang HWA Electronics license)</manufacturer> @@ -266217,9 +266629,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sdgndmps"> + <game name="sdgndmps" sourcefile="dcon.c"> <description>SD Gundam Psycho Salamander no Kyoui</description> <year>1991</year> <manufacturer>Banpresto / Bandai</manufacturer> @@ -266310,9 +266722,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="dcon"> + <game name="dcon" sourcefile="dcon.c"> <description>D-Con</description> <year>1992</year> <manufacturer>Success</manufacturer> @@ -266398,9 +266810,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sengokmj"> + <game name="sengokmj" sourcefile="sengokmj.c"> <description>Sengoku Mahjong (Japan)</description> <year>1991</year> <manufacturer>Sigma</manufacturer> @@ -266481,9 +266893,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="2048"/> + <driver status="good" color="imperfect" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="raiden2"> + <game name="raiden2" sourcefile="raiden2.c"> <description>Raiden 2</description> <year>1993</year> <manufacturer>Seibu Kaihatsu</manufacturer> @@ -266531,9 +266943,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="cabal"> + <game name="cabal" sourcefile="cabal.c"> <description>Cabal (US set 1)</description> <year>1988</year> <manufacturer>Tad (Fabtek license)</manufacturer> @@ -266618,9 +267030,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cabal2" cloneof="cabal" romof="cabal"> + <game name="cabal2" sourcefile="cabal.c" cloneof="cabal" romof="cabal"> <description>Cabal (US set 2)</description> <year>1988</year> <manufacturer>Tad (Fabtek license)</manufacturer> @@ -266705,9 +267117,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cabalbl" cloneof="cabal" romof="cabal"> + <game name="cabalbl" sourcefile="cabal.c" cloneof="cabal" romof="cabal"> <description>Cabal (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -266789,9 +267201,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="toki"> + <game name="toki" sourcefile="toki.c"> <description>Toki (World set 1)</description> <year>1989</year> <manufacturer>Tad</manufacturer> @@ -266875,9 +267287,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tokia" cloneof="toki" romof="toki"> + <game name="tokia" sourcefile="toki.c" cloneof="toki" romof="toki"> <description>Toki (World set 2)</description> <year>1989</year> <manufacturer>Tad</manufacturer> @@ -266961,9 +267373,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tokij" cloneof="toki" romof="toki"> + <game name="tokij" sourcefile="toki.c" cloneof="toki" romof="toki"> <description>JuJu Densetsu (Japan)</description> <year>1989</year> <manufacturer>Tad</manufacturer> @@ -267047,9 +267459,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tokiu" cloneof="toki" romof="toki"> + <game name="tokiu" sourcefile="toki.c" cloneof="toki" romof="toki"> <description>Toki (US)</description> <year>1989</year> <manufacturer>Tad (Fabtek license)</manufacturer> @@ -267133,9 +267545,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tokib" cloneof="toki" romof="toki"> + <game name="tokib" sourcefile="toki.c" cloneof="toki" romof="toki"> <description>Toki (bootleg)</description> <year>1989</year> <manufacturer>bootleg</manufacturer> @@ -267239,9 +267651,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bloodbro"> + <game name="bloodbro" sourcefile="bloodbro.c"> <description>Blood Bros.</description> <year>1990</year> <manufacturer>Tad</manufacturer> @@ -267322,9 +267734,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="weststry" cloneof="bloodbro" romof="bloodbro"> + <game name="weststry" sourcefile="bloodbro.c" cloneof="bloodbro" romof="bloodbro"> <description>West Story</description> <year>1990</year> <manufacturer>bootleg</manufacturer> @@ -267421,9 +267833,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="skysmash"> + <game name="skysmash" sourcefile="bloodbro.c"> <description>Sky Smasher</description> <year>1990</year> <manufacturer>Nihon System</manufacturer> @@ -267504,9 +267916,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="legionna"> + <game name="legionna" sourcefile="legionna.c"> <description>Legionnaire (World)</description> <year>1992</year> <manufacturer>Tad</manufacturer> @@ -267590,9 +268002,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="legionnu" cloneof="legionna" romof="legionna"> + <game name="legionnu" sourcefile="legionna.c" cloneof="legionna" romof="legionna"> <description>Legionnaire (US)</description> <year>1992</year> <manufacturer>Tad (Fabtek license)</manufacturer> @@ -267676,9 +268088,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="heatbrl"> + <game name="heatbrl" sourcefile="legionna.c"> <description>Heated Barrel (World)</description> <year>1992</year> <manufacturer>Tad</manufacturer> @@ -267764,9 +268176,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="heatbrlo" cloneof="heatbrl" romof="heatbrl"> + <game name="heatbrlo" sourcefile="legionna.c" cloneof="heatbrl" romof="heatbrl"> <description>Heated Barrel (World old version)</description> <year>1992</year> <manufacturer>Tad</manufacturer> @@ -267852,9 +268264,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="heatbrlu" cloneof="heatbrl" romof="heatbrl"> + <game name="heatbrlu" sourcefile="legionna.c" cloneof="heatbrl" romof="heatbrl"> <description>Heated Barrel (US)</description> <year>1992</year> <manufacturer>Tad</manufacturer> @@ -267940,9 +268352,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="godzilla"> + <game name="godzilla" sourcefile="legionna.c"> <description>Godzilla</description> <year>1993</year> <manufacturer>Banpresto</manufacturer> @@ -268029,9 +268441,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sdgndmrb"> + <game name="sdgndmrb" sourcefile="legionna.c"> <description>SD Gundam Sangokushi Rainbow Tairiku Senki</description> <year>1993</year> <manufacturer>Banpresto</manufacturer> @@ -268175,9 +268587,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cupsoc"> + <game name="cupsoc" sourcefile="legionna.c"> <description>Seibu Cup Soccer</description> <year>1992</year> <manufacturer>Seibu</manufacturer> @@ -268283,9 +268695,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cupsoc2" cloneof="cupsoc" romof="cupsoc"> + <game name="cupsoc2" sourcefile="legionna.c" cloneof="cupsoc" romof="cupsoc"> <description>Seibu Cup Soccer (set 2)</description> <year>1992</year> <manufacturer>Seibu</manufacturer> @@ -268392,9 +268804,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="olysoc92" cloneof="cupsoc" romof="cupsoc"> + <game name="olysoc92" sourcefile="legionna.c" cloneof="cupsoc" romof="cupsoc"> <description>Olympic Soccer '92</description> <year>1992</year> <manufacturer>Seibu</manufacturer> @@ -268500,9 +268912,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="cupsocbl" cloneof="cupsoc" romof="cupsoc"> + <game name="cupsocbl" sourcefile="goal92.c" cloneof="cupsoc" romof="cupsoc"> <description>Seibu Cup Soccer (bootleg)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -268607,9 +269019,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2048"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="goal92" cloneof="cupsoc" romof="cupsoc"> + <game name="goal92" sourcefile="goal92.c" cloneof="cupsoc" romof="cupsoc"> <description>Goal '92</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -268711,9 +269123,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="exerion"> + <game name="exerion" sourcefile="exerion.c"> <description>Exerion</description> <year>1983</year> <manufacturer>Jaleco</manufacturer> @@ -268776,9 +269188,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="exeriont" cloneof="exerion" romof="exerion"> + <game name="exeriont" sourcefile="exerion.c" cloneof="exerion" romof="exerion"> <description>Exerion (Taito)</description> <year>1983</year> <manufacturer>Jaleco (Taito America license)</manufacturer> @@ -268840,9 +269252,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="exerionb" cloneof="exerion" romof="exerion"> + <game name="exerionb" sourcefile="exerion.c" cloneof="exerion" romof="exerion"> <description>Exerion (bootleg)</description> <year>1983</year> <manufacturer>Jaleco</manufacturer> @@ -268904,9 +269316,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="fcombat"> + <game name="fcombat" sourcefile="fcombat.c"> <description>Field Combat</description> <year>1985</year> <manufacturer>Jaleco</manufacturer> @@ -268968,9 +269380,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="formatz"> + <game name="formatz" sourcefile="aeroboto.c"> <description>Formation Z</description> <year>1984</year> <manufacturer>Jaleco</manufacturer> @@ -269045,9 +269457,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="aeroboto" cloneof="formatz" romof="formatz"> + <game name="aeroboto" sourcefile="aeroboto.c" cloneof="formatz" romof="formatz"> <description>Aeroboto</description> <year>1984</year> <manufacturer>[Jaleco] (Williams license)</manufacturer> @@ -269122,9 +269534,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="citycon"> + <game name="citycon" sourcefile="citycon.c"> <description>City Connection (set 1)</description> <year>1985</year> <manufacturer>Jaleco</manufacturer> @@ -269204,9 +269616,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1664"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1664"/> </game> - <game name="citycona" cloneof="citycon" romof="citycon"> + <game name="citycona" sourcefile="citycon.c" cloneof="citycon" romof="citycon"> <description>City Connection (set 2)</description> <year>1985</year> <manufacturer>Jaleco</manufacturer> @@ -269286,9 +269698,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1664"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1664"/> </game> - <game name="cruisin" cloneof="citycon" romof="citycon"> + <game name="cruisin" sourcefile="citycon.c" cloneof="citycon" romof="citycon"> <description>Cruisin</description> <year>1985</year> <manufacturer>Jaleco (Kitkorp license)</manufacturer> @@ -269368,9 +269780,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1664"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1664"/> </game> - <game name="momoko"> + <game name="momoko" sourcefile="momoko.c"> <description>Momoko 120%</description> <year>1986</year> <manufacturer>Jaleco</manufacturer> @@ -269456,9 +269868,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="argus"> + <game name="argus" sourcefile="argus.c"> <description>Argus</description> <year>1986</year> <manufacturer>[NMK] (Jaleco license)</manufacturer> @@ -269541,9 +269953,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="896"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="896"/> </game> - <game name="valtric"> + <game name="valtric" sourcefile="argus.c"> <description>Valtric</description> <year>1986</year> <manufacturer>[NMK] (Jaleco license)</manufacturer> @@ -269619,9 +270031,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="butasan"> + <game name="butasan" sourcefile="argus.c"> <description>Butasan (Japan)</description> <year>1987</year> <manufacturer>[NMK] (Jaleco license)</manufacturer> @@ -269706,9 +270118,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="psychic5"> + <game name="psychic5" sourcefile="psychic5.c"> <description>Psychic 5</description> <year>1987</year> <manufacturer>Jaleco</manufacturer> @@ -269783,9 +270195,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="ginganin"> + <game name="ginganin" sourcefile="ginganin.c"> <description>Ginga NinkyouDen</description> <year>1987</year> <manufacturer>Jaleco</manufacturer> @@ -269863,9 +270275,9 @@ </dipswitch> <dipswitch name="Freeze"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="skyfox"> + <game name="skyfox" sourcefile="skyfox.c"> <description>Sky Fox</description> <year>1987</year> <manufacturer>Jaleco (Nichibutsu USA license)</manufacturer> @@ -269933,9 +270345,9 @@ <dipvalue name="5"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="exerizrb" cloneof="skyfox" romof="skyfox"> + <game name="exerizrb" sourcefile="skyfox.c" cloneof="skyfox" romof="skyfox"> <description>Exerizer (Japan) (bootleg)</description> <year>1987</year> <manufacturer>Jaleco</manufacturer> @@ -270003,9 +270415,9 @@ <dipvalue name="5"/> <dipvalue name="Infinite"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="homerun"> + <game name="homerun" sourcefile="homerun.c"> <description>Moero Pro Yakyuu Homerun</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -270032,9 +270444,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="64"/> </game> - <game name="bigrun"> + <game name="bigrun" sourcefile="cischeat.c"> <description>Big Run (11th Rallye version)</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -270148,9 +270560,9 @@ <dipvalue name="3 (Red-White Car)"/> <dipvalue name="4 (Yellow Car)"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="3840"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="3840"/> </game> - <game name="cischeat"> + <game name="cischeat" sourcefile="cischeat.c"> <description>Cisco Heat</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -270270,9 +270682,9 @@ <dipvalue name="1 (Blue Car)"/> <dipvalue name="2 (Yellow Car)"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5632"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="5632"/> </game> - <game name="f1gpstar"> + <game name="f1gpstar" sourcefile="cischeat.c"> <description>Grand Prix Star</description> <year>1991</year> <manufacturer>Jaleco</manufacturer> @@ -270413,9 +270825,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4864"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4864"/> </game> - <game name="f1gpstr2"> + <game name="f1gpstr2" sourcefile="cischeat.c"> <description>F-1 Grand Prix Star II</description> <year>1993</year> <manufacturer>Jaleco</manufacturer> @@ -270562,9 +270974,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="4864"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="4864"/> </game> - <game name="scudhamm"> + <game name="scudhamm" sourcefile="cischeat.c"> <description>Scud Hammer</description> <year>1994</year> <manufacturer>Jaleco</manufacturer> @@ -270650,9 +271062,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2560"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2560"/> </game> - <game name="tetrisp2"> + <game name="tetrisp2" sourcefile="tetrisp2.c"> <description>Tetris Plus 2 (World?)</description> <year>1997</year> <manufacturer>Jaleco / The Tetris Company</manufacturer> @@ -270726,9 +271138,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="teplus2j" cloneof="tetrisp2" romof="tetrisp2"> + <game name="teplus2j" sourcefile="tetrisp2.c" cloneof="tetrisp2" romof="tetrisp2"> <description>Tetris Plus 2 (Japan)</description> <year>1997</year> <manufacturer>Jaleco / The Tetris Company</manufacturer> @@ -270799,9 +271211,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="rockn"> + <game name="rockn" sourcefile="tetrisp2.c"> <description>Rock'n Tread (Japan)</description> <year>1999</year> <manufacturer>Jaleco</manufacturer> @@ -270850,9 +271262,9 @@ </dipswitch> <dipswitch name="DIPSW 2-8"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="lomakai"> + <game name="lomakai" sourcefile="megasys1.c"> <description>Legend of Makai (World)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -270924,9 +271336,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="makaiden" cloneof="lomakai" romof="lomakai"> + <game name="makaiden" sourcefile="megasys1.c" cloneof="lomakai" romof="lomakai"> <description>Makai Densetsu (Japan)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -270998,9 +271410,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="p47"> + <game name="p47" sourcefile="megasys1.c"> <description>P-47 - The Phantom Fighter (World)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -271084,9 +271496,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="p47j" cloneof="p47" romof="p47"> + <game name="p47j" sourcefile="megasys1.c" cloneof="p47" romof="p47"> <description>P-47 - The Freedom Fighter (Japan)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -271170,9 +271582,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="kickoff"> + <game name="kickoff" sourcefile="megasys1.c"> <description>Kick Off (Japan)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -271258,9 +271670,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tshingen"> + <game name="tshingen" sourcefile="megasys1.c"> <description>Takeda Shingen (Japan, Japanese)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -271345,9 +271757,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tshingna" cloneof="tshingen" romof="tshingen"> + <game name="tshingna" sourcefile="megasys1.c" cloneof="tshingen" romof="tshingen"> <description>Shingen Samurai-Fighter (Japan, English)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -271432,9 +271844,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="iganinju"> + <game name="iganinju" sourcefile="megasys1.c"> <description>Iga Ninjyutsuden (Japan)</description> <year>1988</year> <manufacturer>Jaleco</manufacturer> @@ -271513,9 +271925,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="astyanax"> + <game name="astyanax" sourcefile="megasys1.c"> <description>The Astyanax</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -271601,9 +272013,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="lordofk" cloneof="astyanax" romof="astyanax"> + <game name="lordofk" sourcefile="megasys1.c" cloneof="astyanax" romof="astyanax"> <description>The Lord of King (Japan)</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -271689,9 +272101,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hachoo"> + <game name="hachoo" sourcefile="megasys1.c"> <description>Hachoo!</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -271780,9 +272192,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="jitsupro"> + <game name="jitsupro" sourcefile="megasys1.c"> <description>Jitsuryoku!! Pro Yakyuu (Japan)</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -271867,9 +272279,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="plusalph"> + <game name="plusalph" sourcefile="megasys1.c"> <description>Plus Alpha</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -271958,9 +272370,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="stdragon"> + <game name="stdragon" sourcefile="megasys1.c"> <description>Saint Dragon</description> <year>1989</year> <manufacturer>Jaleco</manufacturer> @@ -272050,9 +272462,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rodland"> + <game name="rodland" sourcefile="megasys1.c"> <description>Rod-Land (World)</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -272131,9 +272543,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rodlandj" cloneof="rodland" romof="rodland"> + <game name="rodlandj" sourcefile="megasys1.c" cloneof="rodland" romof="rodland"> <description>Rod-Land (Japan)</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -272212,9 +272624,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rodlndjb" cloneof="rodland" romof="rodland"> + <game name="rodlndjb" sourcefile="megasys1.c" cloneof="rodland" romof="rodland"> <description>Rod-Land (Japan bootleg)</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -272295,9 +272707,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="avspirit"> + <game name="avspirit" sourcefile="megasys1.c"> <description>Avenging Spirit</description> <year>1991</year> <manufacturer>Jaleco</manufacturer> @@ -272374,9 +272786,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="phantasm" cloneof="avspirit" romof="avspirit"> + <game name="phantasm" sourcefile="megasys1.c" cloneof="avspirit" romof="avspirit"> <description>Phantasm (Japan)</description> <year>1990</year> <manufacturer>Jaleco</manufacturer> @@ -272455,9 +272867,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="edf"> + <game name="edf" sourcefile="megasys1.c"> <description>E.D.F. : Earth Defense Force</description> <year>1991</year> <manufacturer>Jaleco</manufacturer> @@ -272534,9 +272946,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="64street"> + <game name="64street" sourcefile="megasys1.c"> <description>64th. Street - A Detective Story (World)</description> <year>1991</year> <manufacturer>Jaleco</manufacturer> @@ -272612,9 +273024,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="64streej" cloneof="64street" romof="64street"> + <game name="64streej" sourcefile="megasys1.c" cloneof="64street" romof="64street"> <description>64th. Street - A Detective Story (Japan)</description> <year>1991</year> <manufacturer>Jaleco</manufacturer> @@ -272690,9 +273102,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="soldamj"> + <game name="soldamj" sourcefile="megasys1.c"> <description>Soldam (Japan)</description> <year>1992</year> <manufacturer>Jaleco</manufacturer> @@ -272771,9 +273183,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bigstrik"> + <game name="bigstrik" sourcefile="megasys1.c"> <description>Big Striker</description> <year>1992</year> <manufacturer>Jaleco</manufacturer> @@ -272848,9 +273260,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bigstrkb" cloneof="bigstrik" romof="bigstrik"> + <game name="bigstrkb" sourcefile="bigstrkb.c" cloneof="bigstrik" romof="bigstrik"> <description>Big Striker (bootleg)</description> <year>1992</year> <manufacturer>bootleg</manufacturer> @@ -272930,9 +273342,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="chimerab"> + <game name="chimerab" sourcefile="megasys1.c"> <description>Chimera Beast (prototype)</description> <year>1993</year> <manufacturer>Jaleco</manufacturer> @@ -273008,9 +273420,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cybattlr"> + <game name="cybattlr" sourcefile="megasys1.c"> <description>Cybattler</description> <year>1993</year> <manufacturer>Jaleco</manufacturer> @@ -273092,9 +273504,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="peekaboo"> + <game name="peekaboo" sourcefile="megasys1.c"> <description>Peek-a-Boo!</description> <year>1993</year> <manufacturer>Jaleco</manufacturer> @@ -273164,9 +273576,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="hayaosi1"> + <game name="hayaosi1" sourcefile="ms32.c"> <description>Hayaoshi Quiz Ouza Ketteisen</description> <year>1994</year> <manufacturer>Jaleco</manufacturer> @@ -273278,9 +273690,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="bbbxing"> + <game name="bbbxing" sourcefile="ms32.c"> <description>Best Bout Boxing</description> <year>1994</year> <manufacturer>Jaleco</manufacturer> @@ -273396,9 +273808,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="47pie2"> + <game name="47pie2" sourcefile="ms32.c"> <description>Idol Janshi Su-Chi-Pie 2 (v1.1)</description> <year>1994</year> <manufacturer>Jaleco</manufacturer> @@ -273546,9 +273958,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="47pie2o" cloneof="47pie2" romof="47pie2"> + <game name="47pie2o" sourcefile="ms32.c" cloneof="47pie2" romof="47pie2"> <description>Idol Janshi Su-Chi-Pie 2 (v1.0)</description> <year>1994</year> <manufacturer>Jaleco</manufacturer> @@ -273696,9 +274108,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="desertwr"> + <game name="desertwr" sourcefile="ms32.c"> <description>Desert War / Wangan Sensou</description> <year>1995</year> <manufacturer>Jaleco</manufacturer> @@ -273813,9 +274225,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="gametngk"> + <game name="gametngk" sourcefile="ms32.c"> <description>The Game Paradise - Master of Shooting! / Game Tengoku - The Game Paradise</description> <year>1995</year> <manufacturer>Jaleco</manufacturer> @@ -273929,9 +274341,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="tetrisp"> + <game name="tetrisp" sourcefile="ms32.c"> <description>Tetris Plus</description> <year>1995</year> <manufacturer>Jaleco / BPS</manufacturer> @@ -274036,9 +274448,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="p47aces"> + <game name="p47aces" sourcefile="ms32.c"> <description>P-47 Aces</description> <year>1995</year> <manufacturer>Jaleco</manufacturer> @@ -274151,9 +274563,9 @@ <dipvalue name="5/5"/> <dipvalue name="2/4"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="akiss"> + <game name="akiss" sourcefile="ms32.c"> <description>Mahjong Angel Kiss</description> <year>1995</year> <manufacturer>Jaleco</manufacturer> @@ -274301,9 +274713,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="gratia"> + <game name="gratia" sourcefile="ms32.c"> <description>Gratia - Second Earth (92047-01 version)</description> <year>1996</year> <manufacturer>Jaleco</manufacturer> @@ -274414,9 +274826,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="gratiaa" cloneof="gratia" romof="gratia"> + <game name="gratiaa" sourcefile="ms32.c" cloneof="gratia" romof="gratia"> <description>Gratia - Second Earth (91022-10 version)</description> <year>1996</year> <manufacturer>Jaleco</manufacturer> @@ -274527,9 +274939,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="kirarast"> + <game name="kirarast" sourcefile="ms32.c"> <description>Ryuusei Janshi Kirara Star</description> <year>1996</year> <manufacturer>Jaleco</manufacturer> @@ -274678,9 +275090,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="tp2m32" cloneof="tetrisp2" romof="tetrisp2"> + <game name="tp2m32" sourcefile="ms32.c" cloneof="tetrisp2" romof="tetrisp2"> <description>Tetris Plus 2 (MegaSystem 32 Version)</description> <year>1997</year> <manufacturer>Jaleco</manufacturer> @@ -274783,9 +275195,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="32768"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="32768"/> </game> - <game name="f1superb"> + <game name="f1superb" sourcefile="ms32.c"> <description>F1 Super Battle</description> <year>1994</year> <manufacturer>Jaleco</manufacturer> @@ -274950,9 +275362,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="32768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="rabiolep"> + <game name="rabiolep" sourcefile="rpunch.c"> <description>Rabio Lepus (Japan)</description> <year>1987</year> <manufacturer>V-System Co.</manufacturer> @@ -275041,9 +275453,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="rpunch" cloneof="rabiolep" romof="rabiolep"> + <game name="rpunch" sourcefile="rpunch.c" cloneof="rabiolep" romof="rabiolep"> <description>Rabbit Punch (US)</description> <year>1987</year> <manufacturer>V-System Co. (Bally/Midway/Sente license)</manufacturer> @@ -275132,9 +275544,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="svolley"> + <game name="svolley" sourcefile="rpunch.c"> <description>Super Volleyball (Japan)</description> <year>1989</year> <manufacturer>V-System Co.</manufacturer> @@ -275222,9 +275634,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="svolleyk" cloneof="svolley" romof="svolley"> + <game name="svolleyk" sourcefile="rpunch.c" cloneof="svolley" romof="svolley"> <description>Super Volleyball (Korea)</description> <year>1989</year> <manufacturer>V-System Co.</manufacturer> @@ -275313,9 +275725,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="svolleyu" cloneof="svolley" romof="svolley"> + <game name="svolleyu" sourcefile="rpunch.c" cloneof="svolley" romof="svolley"> <description>Super Volleyball (US)</description> <year>1989</year> <manufacturer>V-System Co. (Data East license)</manufacturer> @@ -275404,9 +275816,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tail2nos"> + <game name="tail2nos" sourcefile="tail2nos.c"> <description>Tail to Nose - Great Championship</description> <year>1989</year> <manufacturer>V-System Co.</manufacturer> @@ -275492,9 +275904,9 @@ <dipvalue name="Domestic" default="yes"/> <dipvalue name="Overseas"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sformula" cloneof="tail2nos" romof="tail2nos"> + <game name="sformula" sourcefile="tail2nos.c" cloneof="tail2nos" romof="tail2nos"> <description>Super Formula (Japan)</description> <year>1989</year> <manufacturer>V-System Co.</manufacturer> @@ -275580,9 +275992,9 @@ <dipvalue name="Domestic" default="yes"/> <dipvalue name="Overseas"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="ojankoc"> + <game name="ojankoc" sourcefile="ojankohs.c"> <description>Ojanko Club (Japan)</description> <year>1986</year> <manufacturer>V-System Co.</manufacturer> @@ -275665,9 +276077,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="ojankoy"> + <game name="ojankoy" sourcefile="ojankohs.c"> <description>Ojanko Yakata (Japan)</description> <year>1986</year> <manufacturer>V-System Co.</manufacturer> @@ -275745,9 +276157,9 @@ <dipvalue name="Yes / No"/> <dipvalue name="No / Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ojanko2"> + <game name="ojanko2" sourcefile="ojankohs.c"> <description>Ojanko Yakata 2bankan (Japan)</description> <year>1987</year> <manufacturer>V-System Co.</manufacturer> @@ -275824,9 +276236,9 @@ <dipvalue name="Yes / No"/> <dipvalue name="No / Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ccasino"> + <game name="ccasino" sourcefile="ojankohs.c"> <description>Chinese Casino [BET] (Japan)</description> <year>1987</year> <manufacturer>V-System Co.</manufacturer> @@ -275975,9 +276387,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="ojankohs"> + <game name="ojankohs" sourcefile="ojankohs.c"> <description>Ojanko High School (Japan)</description> <year>1988</year> <manufacturer>V-System Co.</manufacturer> @@ -276023,9 +276435,9 @@ <dipvalue name="2000" default="yes"/> <dipvalue name="3000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nekkyoku"> + <game name="nekkyoku" sourcefile="fromance.c"> <description>Rettou Juudan Nekkyoku Janshi - Higashi Nippon Hen (Japan)</description> <year>1988</year> <manufacturer>Video System Co.</manufacturer> @@ -276113,9 +276525,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="idolmj"> + <game name="idolmj" sourcefile="fromance.c"> <description>Idol-Mahjong Housoukyoku (Japan)</description> <year>1988</year> <manufacturer>System Service</manufacturer> @@ -276199,9 +276611,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mjnatsu"> + <game name="mjnatsu" sourcefile="fromance.c"> <description>Mahjong Natsu Monogatari (Japan)</description> <year>1989</year> <manufacturer>Video System Co.</manufacturer> @@ -276287,9 +276699,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="natsuiro" cloneof="mjnatsu" romof="mjnatsu"> + <game name="natsuiro" sourcefile="fromance.c" cloneof="mjnatsu" romof="mjnatsu"> <description>Natsuiro Mahjong (Japan)</description> <year>1989</year> <manufacturer>Video System Co.</manufacturer> @@ -276376,9 +276788,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mfunclub"> + <game name="mfunclub" sourcefile="fromance.c"> <description>Mahjong Fun Club - Idol Saizensen (Japan)</description> <year>1989</year> <manufacturer>Video System Co.</manufacturer> @@ -276463,9 +276875,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="daiyogen"> + <game name="daiyogen" sourcefile="fromance.c"> <description>Mahjong Daiyogen (Japan)</description> <year>1990</year> <manufacturer>Video System Co.</manufacturer> @@ -276549,9 +276961,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="nmsengen"> + <game name="nmsengen" sourcefile="fromance.c"> <description>Nekketsu Mahjong Sengen! AFTER 5 (Japan)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -276635,9 +277047,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fromance"> + <game name="fromance" sourcefile="fromance.c"> <description>Idol-Mahjong Final Romance (Japan)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -276720,9 +277132,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pipedrm"> + <game name="pipedrm" sourcefile="pipedrm.c"> <description>Pipe Dream (US)</description> <year>1990</year> <manufacturer>Video System Co.</manufacturer> @@ -276803,9 +277215,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pipedrmj" cloneof="pipedrm" romof="pipedrm"> + <game name="pipedrmj" sourcefile="pipedrm.c" cloneof="pipedrm" romof="pipedrm"> <description>Pipe Dream (Japan)</description> <year>1990</year> <manufacturer>Video System Co.</manufacturer> @@ -276886,9 +277298,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="hatris"> + <game name="hatris" sourcefile="pipedrm.c"> <description>Hatris (Japan)</description> <year>1990</year> <manufacturer>Video System Co.</manufacturer> @@ -276961,9 +277373,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="spinlbrk"> + <game name="spinlbrk" sourcefile="aerofgt.c"> <description>Spinal Breakers (World)</description> <year>1990</year> <manufacturer>V-System Co.</manufacturer> @@ -277058,9 +277470,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="spinlbru" cloneof="spinlbrk" romof="spinlbrk"> + <game name="spinlbru" sourcefile="aerofgt.c" cloneof="spinlbrk" romof="spinlbrk"> <description>Spinal Breakers (US)</description> <year>1990</year> <manufacturer>V-System Co.</manufacturer> @@ -277155,9 +277567,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="spinlbrj" cloneof="spinlbrk" romof="spinlbrk"> + <game name="spinlbrj" sourcefile="aerofgt.c" cloneof="spinlbrk" romof="spinlbrk"> <description>Spinal Breakers (Japan)</description> <year>1990</year> <manufacturer>V-System Co.</manufacturer> @@ -277252,9 +277664,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="pspikes"> + <game name="pspikes" sourcefile="aerofgt.c"> <description>Power Spikes (World)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -277325,9 +277737,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="pspikesk" cloneof="pspikes" romof="pspikes"> + <game name="pspikesk" sourcefile="aerofgt.c" cloneof="pspikes" romof="pspikes"> <description>Power Spikes (Korea)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -277398,9 +277810,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="svolly91" cloneof="pspikes" romof="pspikes"> + <game name="svolly91" sourcefile="aerofgt.c" cloneof="pspikes" romof="pspikes"> <description>Super Volley '91 (Japan)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -277471,9 +277883,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="karatblz"> + <game name="karatblz" sourcefile="aerofgt.c"> <description>Karate Blazers (World?)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -277515,9 +277927,9 @@ <dipvalue name="2" default="yes"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="2 Players" default="yes"/> + <dipvalue name="2 Players"/> <dipvalue name="3 Players"/> - <dipvalue name="4 Players"/> + <dipvalue name="4 Players" default="yes"/> <dipvalue name="4 Players (Team)"/> </dipswitch> <dipswitch name="Coin Slot"> @@ -277552,9 +277964,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="karatblu" cloneof="karatblz" romof="karatblz"> + <game name="karatblu" sourcefile="aerofgt.c" cloneof="karatblz" romof="karatblz"> <description>Karate Blazers (US)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -277596,9 +278008,9 @@ <dipvalue name="2" default="yes"/> </dipswitch> <dipswitch name="Cabinet"> - <dipvalue name="2 Players" default="yes"/> + <dipvalue name="2 Players"/> <dipvalue name="3 Players"/> - <dipvalue name="4 Players"/> + <dipvalue name="4 Players" default="yes"/> <dipvalue name="4 Players (Team)"/> </dipswitch> <dipswitch name="Coin Slot"> @@ -277633,9 +278045,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="turbofrc"> + <game name="turbofrc" sourcefile="aerofgt.c"> <description>Turbo Force</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -277701,9 +278113,9 @@ <dipvalue name="200000" default="yes"/> <dipvalue name="300000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aerofgt"> + <game name="aerofgt" sourcefile="aerofgt.c"> <description>Aero Fighters</description> <year>1992</year> <manufacturer>Video System Co.</manufacturer> @@ -277782,9 +278194,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aerofgtb" cloneof="aerofgt" romof="aerofgt"> + <game name="aerofgtb" sourcefile="aerofgt.c" cloneof="aerofgt" romof="aerofgt"> <description>Aero Fighters (Turbo Force hardware set 1)</description> <year>1992</year> <manufacturer>Video System Co.</manufacturer> @@ -277863,9 +278275,9 @@ <dipvalue name="Japan" default="yes"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aerofgtc" cloneof="aerofgt" romof="aerofgt"> + <game name="aerofgtc" sourcefile="aerofgt.c" cloneof="aerofgt" romof="aerofgt"> <description>Aero Fighters (Turbo Force hardware set 2)</description> <year>1992</year> <manufacturer>Video System Co.</manufacturer> @@ -277944,9 +278356,9 @@ <dipvalue name="Japan" default="yes"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="sonicwi" cloneof="aerofgt" romof="aerofgt"> + <game name="sonicwi" sourcefile="aerofgt.c" cloneof="aerofgt" romof="aerofgt"> <description>Sonic Wings (Japan)</description> <year>1992</year> <manufacturer>Video System Co.</manufacturer> @@ -278025,9 +278437,9 @@ <dipvalue name="Japan" default="yes"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="welltris"> + <game name="welltris" sourcefile="welltris.c"> <description>Welltris (Japan, 2 players)</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -278112,9 +278524,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="quiz18k"> + <game name="quiz18k" sourcefile="welltris.c"> <description>Miyasu Nonki no Quiz 18-Kin</description> <year>1992</year> <manufacturer>EIM</manufacturer> @@ -278199,9 +278611,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="f1gp"> + <game name="f1gp" sourcefile="f1gp.c"> <description>F-1 Grand Prix</description> <year>1991</year> <manufacturer>Video System Co.</manufacturer> @@ -278329,9 +278741,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="f1gp2"> + <game name="f1gp2" sourcefile="f1gp.c"> <description>F-1 Grand Prix Part II</description> <year>1992</year> <manufacturer>Video System Co.</manufacturer> @@ -278447,9 +278859,9 @@ <dipvalue name="World" default="yes"/> <dipvalue name="Japan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="crshrace"> + <game name="crshrace" sourcefile="crshrace.c"> <description>Lethal Crash Race (set 1)</description> <year>1993</year> <manufacturer>Video System Co.</manufacturer> @@ -278566,9 +278978,9 @@ <dipvalue name="Korea"/> <dipvalue name="Hong Kong & Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="crshrac2" cloneof="crshrace" romof="crshrace"> + <game name="crshrac2" sourcefile="crshrace.c" cloneof="crshrace" romof="crshrace"> <description>Lethal Crash Race (set 2)</description> <year>1993</year> <manufacturer>Video System Co.</manufacturer> @@ -278685,9 +279097,9 @@ <dipvalue name="Korea"/> <dipvalue name="Hong Kong & Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="taotaido"> + <game name="taotaido" sourcefile="taotaido.c"> <description>Tao Taido (set 1)</description> <year>1993</year> <manufacturer>Video System Co.</manufacturer> @@ -278803,9 +279215,9 @@ <dipvalue name="Korea"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="taotaida" cloneof="taotaido" romof="taotaido"> + <game name="taotaida" sourcefile="taotaido.c" cloneof="taotaido" romof="taotaido"> <description>Tao Taido (set 2)</description> <year>1993</year> <manufacturer>Video System Co.</manufacturer> @@ -278921,9 +279333,9 @@ <dipvalue name="Korea"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="gstriker"> + <game name="gstriker" sourcefile="gstriker.c"> <description>Grand Striker</description> <year>1993</year> <manufacturer>Human</manufacturer> @@ -278999,9 +279411,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="vgoalsoc"> + <game name="vgoalsoc" sourcefile="gstriker.c"> <description>V Goal Soccer</description> <manufacturer>Tecmo</manufacturer> <rom name="c16_u37.u37" size="524288" crc="18c05440" sha1="0fc78ee0ba6d7817d4a93a80f668f193c352c00d" region="cpu1" offset="0"/> @@ -279073,9 +279485,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="vgoalsca" cloneof="vgoalsoc" romof="vgoalsoc"> + <game name="vgoalsca" sourcefile="gstriker.c" cloneof="vgoalsoc" romof="vgoalsoc"> <description>V Goal Soccer (alt)</description> <manufacturer>Tecmo</manufacturer> <rom name="vgoalc16.u37" size="524288" crc="775ef300" sha1="d0ab1c13a19ce646c6edfc25a0c0994989560cbc" region="cpu1" offset="0"/> @@ -279147,9 +279559,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="worldc94"> + <game name="worldc94" sourcefile="gstriker.c"> <description>World Cup '94</description> <manufacturer>Tecmo</manufacturer> <rom name="13" size="524288" crc="42adb463" sha1="ec7bcb684489b56f81ab851a9d8f42d54679363b" region="cpu1" offset="0"/> @@ -279223,9 +279635,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="suprslam"> + <game name="suprslam" sourcefile="suprslam.c"> <description>Super Slams</description> <year>1995</year> <manufacturer>Banpresto / Toei Animation</manufacturer> @@ -279301,9 +279713,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="fromanc2"> + <game name="fromanc2" sourcefile="fromanc2.c"> <description>Taisen Idol-Mahjong Final Romance 2 (Japan)</description> <year>1995</year> <manufacturer>Video System Co.</manufacturer> @@ -279327,9 +279739,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fromancr"> + <game name="fromancr" sourcefile="fromanc2.c"> <description>Taisen Mahjong FinalRomance R (Japan)</description> <year>1995</year> <manufacturer>Video System Co.</manufacturer> @@ -279357,9 +279769,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fromanc4"> + <game name="fromanc4" sourcefile="fromanc2.c"> <description>Taisen Mahjong FinalRomance 4 (Japan)</description> <year>1998</year> <manufacturer>Video System Co.</manufacturer> @@ -279391,9 +279803,9 @@ <video screen="raster" orientation="horizontal" width="352" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="inufuku"> + <game name="inufuku" sourcefile="inufuku.c"> <description>Quiz & Variety Sukusuku Inufuku (Japan)</description> <year>1998</year> <manufacturer>Video System Co.</manufacturer> @@ -279417,9 +279829,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="samuraia"> + <game name="samuraia" sourcefile="psikyo.c"> <description>Samurai Aces (World)</description> <year>1993</year> <manufacturer>Psikyo</manufacturer> @@ -279498,9 +279910,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sngkace" cloneof="samuraia" romof="samuraia"> + <game name="sngkace" sourcefile="psikyo.c" cloneof="samuraia" romof="samuraia"> <description>Sengoku Ace (Japan)</description> <year>1993</year> <manufacturer>Psikyo</manufacturer> @@ -279572,9 +279984,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On [Free Play]"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gunbird"> + <game name="gunbird" sourcefile="psikyo.c"> <description>Gunbird (World)</description> <year>1994</year> <manufacturer>Psikyo</manufacturer> @@ -279656,9 +280068,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gunbirdk" cloneof="gunbird" romof="gunbird"> + <game name="gunbirdk" sourcefile="psikyo.c" cloneof="gunbird" romof="gunbird"> <description>Gunbird (Korea)</description> <year>1994</year> <manufacturer>Psikyo</manufacturer> @@ -279733,9 +280145,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On [Free Play]"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gunbirdj" cloneof="gunbird" romof="gunbird"> + <game name="gunbirdj" sourcefile="psikyo.c" cloneof="gunbird" romof="gunbird"> <description>Gunbird (Japan)</description> <year>1994</year> <manufacturer>Psikyo</manufacturer> @@ -279810,9 +280222,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On [Free Play]"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="btlkroad"> + <game name="btlkroad" sourcefile="psikyo.c"> <description>Battle K-Road</description> <year>1994</year> <manufacturer>Psikyo</manufacturer> @@ -279928,9 +280340,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="s1945"> + <game name="s1945" sourcefile="psikyo.c"> <description>Strikers 1945</description> <year>1995</year> <manufacturer>Psikyo</manufacturer> @@ -280011,9 +280423,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="Taiwan"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="s1945j" cloneof="s1945" romof="s1945"> + <game name="s1945j" sourcefile="psikyo.c" cloneof="s1945" romof="s1945"> <description>Strikers 1945 (Japan)</description> <year>1995</year> <manufacturer>Psikyo</manufacturer> @@ -280087,9 +280499,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="s1945jn" cloneof="s1945" romof="s1945"> + <game name="s1945jn" sourcefile="psikyo.c" cloneof="s1945" romof="s1945"> <description>Strikers 1945 (Japan, unprotected)</description> <year>1995</year> <manufacturer>Psikyo</manufacturer> @@ -280164,9 +280576,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tengai"> + <game name="tengai" sourcefile="psikyo.c"> <description>Tengai / Sengoku Blade: Sengoku Ace Episode II</description> <year>1996</year> <manufacturer>Psikyo</manufacturer> @@ -280244,9 +280656,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="s1945ii"> + <game name="s1945ii" sourcefile="psikyosh.c"> <description>Strikers 1945 II</description> <year>1997</year> <manufacturer>Psikyo</manufacturer> @@ -280274,9 +280686,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="5120"/> </game> - <game name="soldivid"> + <game name="soldivid" sourcefile="psikyosh.c"> <description>Sol Divide - The Sword Of Darkness</description> <year>1997</year> <manufacturer>Psikyo</manufacturer> @@ -280302,9 +280714,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="5120"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="5120"/> </game> - <game name="sbomberb"> + <game name="sbomberb" sourcefile="psikyosh.c"> <description>Space Bomber (ver. B)</description> <year>1998</year> <manufacturer>Psikyo</manufacturer> @@ -280334,9 +280746,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5120"/> </game> - <game name="daraku"> + <game name="daraku" sourcefile="psikyosh.c"> <description>Daraku Tenshi - The Fallen Angels</description> <year>1998</year> <manufacturer>Psikyo</manufacturer> @@ -280371,9 +280783,9 @@ <dipvalue name="Japan"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5120"/> </game> - <game name="gunbird2"> + <game name="gunbird2" sourcefile="psikyosh.c"> <description>Gunbird 2</description> <year>1998</year> <manufacturer>Psikyo</manufacturer> @@ -280403,9 +280815,9 @@ <dipvalue name="International Ver A."/> <dipvalue name="International Ver B." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="5120"/> </game> - <game name="s1945iii"> + <game name="s1945iii" sourcefile="psikyosh.c"> <description>Strikers 1945 III (World) / Strikers 1999 (Japan)</description> <year>1999</year> <manufacturer>Psikyo</manufacturer> @@ -280435,9 +280847,9 @@ <dipvalue name="International Ver A."/> <dipvalue name="International Ver B." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="5120"/> </game> - <game name="dragnblz"> + <game name="dragnblz" sourcefile="psikyosh.c"> <description>Dragon Blaze</description> <year>2000</year> <manufacturer>Psikyo</manufacturer> @@ -280478,9 +280890,9 @@ <dipvalue name="International Ver A."/> <dipvalue name="International Ver B." default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="5120"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="5120"/> </game> - <game name="hotgmck"> + <game name="hotgmck" sourcefile="psikyo4.c"> <description>Taisen Hot Gimmick (Japan)</description> <year>1997</year> <manufacturer>Psikyo</manufacturer> @@ -280502,9 +280914,9 @@ <video screen="raster" orientation="horizontal" width="640" height="224" aspectx="8" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="4098"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4098"/> </game> - <game name="hgkairak"> + <game name="hgkairak" sourcefile="psikyo4.c"> <description>Taisen Hot Gimmick Kairakuten (Japan)</description> <year>1998</year> <manufacturer>Psikyo</manufacturer> @@ -280530,9 +280942,9 @@ <video screen="raster" orientation="horizontal" width="640" height="224" aspectx="8" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="4098"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4098"/> </game> - <game name="hotgmck3"> + <game name="hotgmck3" sourcefile="psikyo4.c"> <description>Taisen Hot Gimmick 3 Digital Surfing (Japan)</description> <year>1999</year> <manufacturer>Psikyo</manufacturer> @@ -280562,9 +280974,9 @@ <video screen="raster" orientation="horizontal" width="640" height="224" aspectx="8" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="imperfect" palettesize="4098"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4098"/> </game> - <game name="loderndf"> + <game name="loderndf" sourcefile="psikyo4.c"> <description>Lode Runner - The Dig Fight (ver. B) (Japan)</description> <year>2000</year> <manufacturer>Psikyo</manufacturer> @@ -280580,9 +280992,9 @@ <video screen="raster" orientation="horizontal" width="640" height="240" aspectx="8" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4098"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4098"/> </game> - <game name="loderdfa" cloneof="loderndf" romof="loderndf"> + <game name="loderdfa" sourcefile="psikyo4.c" cloneof="loderndf" romof="loderndf"> <description>Lode Runner - The Dig Fight (ver. A) (Japan)</description> <year>2000</year> <manufacturer>Psikyo</manufacturer> @@ -280598,9 +281010,9 @@ <video screen="raster" orientation="horizontal" width="640" height="240" aspectx="8" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4098"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4098"/> </game> - <game name="hotdebut"> + <game name="hotdebut" sourcefile="psikyo4.c"> <description>Quiz de Idol! Hot Debut (Japan)</description> <year>2000</year> <manufacturer>Psikyo / Moss</manufacturer> @@ -280618,9 +281030,9 @@ <video screen="raster" orientation="horizontal" width="640" height="240" aspectx="8" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="4" buttons="4" coins="4" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="4098"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4098"/> </game> - <game name="marineb"> + <game name="marineb" sourcefile="marineb.c"> <description>Marine Boy</description> <year>1982</year> <manufacturer>Orca</manufacturer> @@ -280661,9 +281073,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="changes"> + <game name="changes" sourcefile="marineb.c"> <description>Changes</description> <year>1982</year> <manufacturer>Orca</manufacturer> @@ -280707,9 +281119,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="looper" cloneof="changes" romof="changes"> + <game name="looper" sourcefile="marineb.c" cloneof="changes" romof="changes"> <description>Looper</description> <year>1982</year> <manufacturer>Orca</manufacturer> @@ -280753,9 +281165,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="springer"> + <game name="springer" sourcefile="marineb.c"> <description>Springer</description> <year>1982</year> <manufacturer>Orca</manufacturer> @@ -280797,9 +281209,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hoccer"> + <game name="hoccer" sourcefile="marineb.c"> <description>Hoccer (set 1)</description> <year>1983</year> <manufacturer>Eastern Micro Electronics, Inc.</manufacturer> @@ -280842,9 +281254,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hoccer2" cloneof="hoccer" romof="hoccer"> + <game name="hoccer2" sourcefile="marineb.c" cloneof="hoccer" romof="hoccer"> <description>Hoccer (set 2)</description> <year>1983</year> <manufacturer>Eastern Micro Electronics, Inc.</manufacturer> @@ -280887,9 +281299,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bcruzm12"> + <game name="bcruzm12" sourcefile="marineb.c"> <description>Battle Cruiser M-12</description> <year>1983</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -280964,9 +281376,9 @@ <dipvalue name=" A 1C/1C B 1C/6C"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hopprobo"> + <game name="hopprobo" sourcefile="marineb.c"> <description>Hopper Robo</description> <year>1983</year> <manufacturer>Sega</manufacturer> @@ -281008,9 +281420,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="wanted"> + <game name="wanted" sourcefile="marineb.c"> <description>Wanted</description> <year>1984</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -281093,9 +281505,9 @@ <dipvalue name=" A 1C/1C B 1C/6C"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="funkybee"> + <game name="funkybee" sourcefile="funkybee.c"> <description>Funky Bee</description> <year>1982</year> <manufacturer>Orca</manufacturer> @@ -281141,9 +281553,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="skylancr"> + <game name="skylancr" sourcefile="funkybee.c"> <description>Sky Lancer</description> <year>1983</year> <manufacturer>Orca (Esco Trading Co license)</manufacturer> @@ -281188,9 +281600,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="zodiack"> + <game name="zodiack" sourcefile="zodiack.c"> <description>Zodiack</description> <year>1983</year> <manufacturer>Orca (Esco Trading Co)</manufacturer> @@ -281237,9 +281649,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="49"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="49"/> </game> - <game name="dogfight"> + <game name="dogfight" sourcefile="zodiack.c"> <description>Dog Fight (Thunderbolt)</description> <year>1983</year> <manufacturer>[Orca] Thunderbolt</manufacturer> @@ -281315,9 +281727,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="49"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="49"/> </game> - <game name="moguchan"> + <game name="moguchan" sourcefile="zodiack.c"> <description>Moguchan</description> <year>1982</year> <manufacturer>Orca (Eastern Commerce Inc. license) (bootleg?)</manufacturer> @@ -281364,9 +281776,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="49"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="49"/> </game> - <game name="percuss"> + <game name="percuss" sourcefile="zodiack.c"> <description>The Percussor</description> <year>1981</year> <manufacturer>Orca</manufacturer> @@ -281442,9 +281854,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="49"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="49"/> </game> - <game name="bounty"> + <game name="bounty" sourcefile="zodiack.c"> <description>The Bounty</description> <year>1982</year> <manufacturer>Orca</manufacturer> @@ -281521,9 +281933,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="49"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="49"/> </game> - <game name="espial"> + <game name="espial" sourcefile="espial.c"> <description>Espial (US?)</description> <year>1983</year> <manufacturer>[Orca] Thunderbolt</manufacturer> @@ -281581,9 +281993,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="espiale" cloneof="espial" romof="espial"> + <game name="espiale" sourcefile="espial.c" cloneof="espial" romof="espial"> <description>Espial (Europe)</description> <year>1983</year> <manufacturer>[Orca] Thunderbolt</manufacturer> @@ -281641,9 +282053,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="netwars"> + <game name="netwars" sourcefile="espial.c"> <description>Net Wars</description> <year>1983</year> <manufacturer>Orca (Esco Trading Co license)</manufacturer> @@ -281707,9 +282119,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vastar"> + <game name="vastar" sourcefile="vastar.c"> <description>Vastar (set 1)</description> <year>1983</year> <manufacturer>Sesame Japan</manufacturer> @@ -281794,9 +282206,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vastar2" cloneof="vastar" romof="vastar"> + <game name="vastar2" sourcefile="vastar.c" cloneof="vastar" romof="vastar"> <description>Vastar (set 2)</description> <year>1983</year> <manufacturer>Sesame Japan</manufacturer> @@ -281881,9 +282293,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="xorworld"> + <game name="xorworld" sourcefile="xorworld.c"> <description>Xor World (prototype)</description> <year>1990</year> <manufacturer>Gaelco</manufacturer> @@ -281921,9 +282333,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="bigkarnk"> + <game name="bigkarnk" sourcefile="gaelco.c"> <description>Big Karnak</description> <year>1991</year> <manufacturer>Gaelco</manufacturer> @@ -281998,9 +282410,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="splash"> + <game name="splash" sourcefile="splash.c"> <description>Splash! (Ver. 1.2 World)</description> <year>1992</year> <manufacturer>Gaelco</manufacturer> @@ -282077,9 +282489,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="wrally"> + <game name="wrally" sourcefile="wrally.c"> <description>World Rally (set 1)</description> <year>1993</year> <manufacturer>Gaelco</manufacturer> @@ -282149,9 +282561,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="wrallya" cloneof="wrally" romof="wrally"> + <game name="wrallya" sourcefile="wrally.c" cloneof="wrally" romof="wrally"> <description>World Rally (set 2)</description> <year>1993</year> <manufacturer>Gaelco</manufacturer> @@ -282221,9 +282633,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="glass"> + <game name="glass" sourcefile="glass.c"> <description>Glass</description> <year>1993</year> <manufacturer>Gaelco</manufacturer> @@ -282292,9 +282704,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="targeth"> + <game name="targeth" sourcefile="targeth.c"> <description>Target Hits</description> <year>1994</year> <manufacturer>Gaelco</manufacturer> @@ -282367,9 +282779,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="thoop2"> + <game name="thoop2" sourcefile="thoop2.c"> <description>TH Strikes Back</description> <year>1994</year> <manufacturer>Gaelco</manufacturer> @@ -282437,9 +282849,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="1024"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="aligator"> + <game name="aligator" sourcefile="gaelco2.c"> <description>Alligator Hunt</description> <year>1994</year> <manufacturer>Gaelco</manufacturer> @@ -282508,9 +282920,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="65520"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="aligatun" cloneof="aligator" romof="aligator"> + <game name="aligatun" sourcefile="gaelco2.c" cloneof="aligator" romof="aligator"> <description>Alligator Hunt (unprotected)</description> <year>1994</year> <manufacturer>Gaelco</manufacturer> @@ -282579,9 +282991,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65520"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="biomtoy"> + <game name="biomtoy" sourcefile="gaelco.c"> <description>Biomechanical Toy (unprotected)</description> <year>1995</year> <manufacturer>Gaelco</manufacturer> @@ -282656,9 +283068,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="touchgo"> + <game name="touchgo" sourcefile="gaelco2.c"> <description>Touch & Go</description> <year>1995</year> <manufacturer>Gaelco</manufacturer> @@ -282734,9 +283146,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="65520"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="wrally2"> + <game name="wrally2" sourcefile="gaelco2.c"> <description>World Rally 2: Twin Racing</description> <year>1995</year> <manufacturer>Gaelco</manufacturer> @@ -282817,9 +283229,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="65520"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="maniacsp" cloneof="maniacsq" romof="maniacsq"> + <game name="maniacsp" sourcefile="gaelco.c" cloneof="maniacsq" romof="maniacsq"> <description>Maniac Square (prototype)</description> <year>1996</year> <manufacturer>Gaelco</manufacturer> @@ -282891,9 +283303,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1C/1C or Free Play (if Coin B too)"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="maniacsq"> + <game name="maniacsq" sourcefile="gaelco2.c"> <description>Maniac Square (unprotected)</description> <year>1996</year> <manufacturer>Gaelco</manufacturer> @@ -282964,9 +283376,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65520"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="snowboar"> + <game name="snowboar" sourcefile="gaelco2.c"> <description>Snow Board Championship (set 1)</description> <year>1996</year> <manufacturer>Gaelco</manufacturer> @@ -282981,9 +283393,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="59.099998"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="protection" color="good" sound="good" palettesize="65520"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="snowbalt" cloneof="snowboar" romof="snowboar"> + <game name="snowbalt" sourcefile="gaelco2.c" cloneof="snowboar" romof="snowboar"> <description>Snow Board Championship (set 2)</description> <year>1996</year> <manufacturer>Gaelco</manufacturer> @@ -283018,9 +283430,9 @@ <video screen="raster" orientation="horizontal" width="384" height="240" aspectx="4" aspecty="3" refresh="59.099998"/> <sound channels="2"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="protection" color="good" sound="good" palettesize="65520"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="bang"> + <game name="bang" sourcefile="gaelco2.c"> <description>Bang!</description> <year>1998</year> <manufacturer>Gaelco</manufacturer> @@ -283045,9 +283457,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="59.099998"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="65520"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="bangj" cloneof="bang" romof="bang"> + <game name="bangj" sourcefile="gaelco2.c" cloneof="bang" romof="bang"> <description>Gun Gabacho (Japan)</description> <year>1998</year> <manufacturer>Gaelco</manufacturer> @@ -283072,9 +283484,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="59.099998"/> <sound channels="2"/> <input players="2" control="lightgun" buttons="1" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="65520"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65520"/> </game> - <game name="airbustr"> + <game name="airbustr" sourcefile="airbustr.c"> <description>Air Buster</description> <year>1990</year> <manufacturer>Kaneko (Namco license)</manufacturer> @@ -283147,9 +283559,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="airbustj" cloneof="airbustr" romof="airbustr"> + <game name="airbustj" sourcefile="airbustr.c" cloneof="airbustr" romof="airbustr"> <description>Air Buster (Japan)</description> <year>1990</year> <manufacturer>Kaneko (Namco license)</manufacturer> @@ -283222,9 +283634,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="djboy"> + <game name="djboy" sourcefile="djboy.c"> <description>DJ Boy</description> <year>1989</year> <manufacturer>Kaneko</manufacturer> @@ -283304,9 +283716,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="galpanic"> + <game name="galpanic" sourcefile="galpanic.c"> <description>Gals Panic (set 1)</description> <year>1990</year> <manufacturer>Kaneko</manufacturer> @@ -283382,9 +283794,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="galpanib" cloneof="galpanic" romof="galpanic"> + <game name="galpanib" sourcefile="galpanic.c" cloneof="galpanic" romof="galpanic"> <description>Gals Panic (set 2)</description> <year>1990</year> <manufacturer>Kaneko</manufacturer> @@ -283458,9 +283870,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="galpani2"> + <game name="galpani2" sourcefile="galpani2.c"> <description>Gals Panic II (Japan?)</description> <year>1993</year> <manufacturer>Kaneko</manufacturer> @@ -283555,9 +283967,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="49664"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="49664"/> </game> - <game name="jchan"> + <game name="jchan" sourcefile="jchan.c"> <description>Jackie Chan - Kung Fu Master</description> <year>1995</year> <manufacturer>Kaneko</manufacturer> @@ -283683,9 +284095,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="8192"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="berlwall"> + <game name="berlwall" sourcefile="kaneko16.c"> <description>The Berlin Wall (set 1)</description> <year>1991</year> <manufacturer>Kaneko</manufacturer> @@ -283763,9 +284175,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="34816"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="34816"/> </game> - <game name="berlwalt" cloneof="berlwall" romof="berlwall"> + <game name="berlwalt" sourcefile="kaneko16.c" cloneof="berlwall" romof="berlwall"> <description>The Berlin Wall (set 2)</description> <year>1991</year> <manufacturer>Kaneko</manufacturer> @@ -283843,9 +284255,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="34816"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="34816"/> </game> - <game name="mgcrystl"> + <game name="mgcrystl" sourcefile="kaneko16.c"> <description>Magical Crystals (World)</description> <year>1991</year> <manufacturer>Kaneko</manufacturer> @@ -283926,9 +284338,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mgcrystj" cloneof="mgcrystl" romof="mgcrystl"> + <game name="mgcrystj" sourcefile="kaneko16.c" cloneof="mgcrystl" romof="mgcrystl"> <description>Magical Crystals (Japan)</description> <year>1991</year> <manufacturer>Kaneko (Atlus license)</manufacturer> @@ -284009,9 +284421,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blazeon"> + <game name="blazeon" sourcefile="kaneko16.c"> <description>Blaze On (Japan)</description> <year>1992</year> <manufacturer>Atlus</manufacturer> @@ -284085,9 +284497,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="sandscrp"> + <game name="sandscrp" sourcefile="kaneko16.c"> <description>Sand Scorpion</description> <year>1992</year> <manufacturer>Face</manufacturer> @@ -284162,9 +284574,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bakubrkr"> + <game name="bakubrkr" sourcefile="kaneko16.c"> <description>Bakuretsu Breaker</description> <year>1992</year> <manufacturer>Kaneko</manufacturer> @@ -284213,9 +284625,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="shogwarr"> + <game name="shogwarr" sourcefile="kaneko16.c"> <description>Shogun Warriors</description> <year>1992</year> <manufacturer>Kaneko</manufacturer> @@ -284271,9 +284683,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="fjbuster" cloneof="shogwarr" romof="shogwarr"> + <game name="fjbuster" sourcefile="kaneko16.c" cloneof="shogwarr" romof="shogwarr"> <description>Fujiyama Buster (Japan)</description> <year>1992</year> <manufacturer>Kaneko</manufacturer> @@ -284327,9 +284739,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="brapboys"> + <game name="brapboys" sourcefile="kaneko16.c"> <description>B.Rap Boys</description> <year>1992</year> <manufacturer>Kaneko</manufacturer> @@ -284385,9 +284797,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2048"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="bloodwar"> + <game name="bloodwar" sourcefile="kaneko16.c"> <description>Blood Warrior</description> <year>1994</year> <manufacturer>Kaneko</manufacturer> @@ -284454,9 +284866,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="bonkadv"> + <game name="bonkadv" sourcefile="kaneko16.c"> <description>Bonks Adventure</description> <year>1994</year> <manufacturer>Kaneko</manufacturer> @@ -284510,9 +284922,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32768"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gtmr"> + <game name="gtmr" sourcefile="kaneko16.c"> <description>Great 1000 Miles Rally</description> <year>1994</year> <manufacturer>Kaneko</manufacturer> @@ -284560,9 +284972,9 @@ <dipvalue name="Flag Only"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gtmre" cloneof="gtmr" romof="gtmr"> + <game name="gtmre" sourcefile="kaneko16.c" cloneof="gtmr" romof="gtmr"> <description>Great 1000 Miles Rally (Evolution Model)</description> <year>1994</year> <manufacturer>Kaneko</manufacturer> @@ -284611,9 +285023,9 @@ <dipvalue name="Flag Only"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gtmrusa" cloneof="gtmr" romof="gtmr"> + <game name="gtmrusa" sourcefile="kaneko16.c" cloneof="gtmr" romof="gtmr"> <description>Great 1000 Miles Rally (USA)</description> <year>1994</year> <manufacturer>Kaneko</manufacturer> @@ -284662,9 +285074,9 @@ <dipvalue name="Flag Only"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gtmr2"> + <game name="gtmr2" sourcefile="kaneko16.c"> <description>Mille Miglia 2: Great 1000 Miles Rally</description> <year>1995</year> <manufacturer>Kaneko</manufacturer> @@ -284714,9 +285126,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="galpani4" romof="skns"> + <game name="galpani4" sourcefile="suprnova.c" romof="skns"> <description>Gals Panic 4 (Japan)</description> <year>1996</year> <manufacturer>Kaneko</manufacturer> @@ -284763,9 +285175,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="galpanis" romof="skns"> + <game name="galpanis" sourcefile="suprnova.c" romof="skns"> <description>Gals Panic S - Extra Edition (Japan)</description> <year>1997</year> <manufacturer>Kaneko</manufacturer> @@ -284813,9 +285225,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="sengekis" romof="skns"> + <game name="sengekis" sourcefile="suprnova.c" romof="skns"> <description>Sengeki Striker (Asia)</description> <year>1997</year> <manufacturer>Kaneko / Warashi</manufacturer> @@ -284865,9 +285277,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="sengekij" cloneof="sengekis" romof="sengekis"> + <game name="sengekij" sourcefile="suprnova.c" cloneof="sengekis" romof="sengekis"> <description>Sengeki Striker (Japan)</description> <year>1997</year> <manufacturer>Kaneko / Warashi</manufacturer> @@ -284917,9 +285329,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="vblokbrk" romof="skns"> + <game name="vblokbrk" sourcefile="suprnova.c" romof="skns"> <description>VS Block Breaker (Asia)</description> <year>1997</year> <manufacturer>Kaneko / Mediaworks</manufacturer> @@ -284965,9 +285377,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="sarukani" cloneof="vblokbrk" romof="vblokbrk"> + <game name="sarukani" sourcefile="suprnova.c" cloneof="vblokbrk" romof="vblokbrk"> <description>Saru-Kani-Hamu-Zou (Japan)</description> <year>1997</year> <manufacturer>Kaneko / Mediaworks</manufacturer> @@ -285013,9 +285425,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="cyvern" romof="skns"> + <game name="cyvern" sourcefile="suprnova.c" romof="skns"> <description>Cyvern (Japan)</description> <year>1998</year> <manufacturer>Kaneko</manufacturer> @@ -285063,9 +285475,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="galpans2" romof="skns"> + <game name="galpans2" sourcefile="suprnova.c" romof="skns"> <description>Gals Panic S2 (Japan)</description> <year>1999</year> <manufacturer>Kaneko</manufacturer> @@ -285115,9 +285527,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="panicstr" romof="skns"> + <game name="panicstr" sourcefile="suprnova.c" romof="skns"> <description>Panic Street (Japan)</description> <year>1999</year> <manufacturer>Kaneko</manufacturer> @@ -285163,9 +285575,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="senknow" romof="skns"> + <game name="senknow" sourcefile="suprnova.c" romof="skns"> <description>Sen-Know (Japan)</description> <year>1999</year> <manufacturer>Kaneko / Kouyousha</manufacturer> @@ -285213,9 +285625,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="gutsn" romof="skns"> + <game name="gutsn" sourcefile="suprnova.c" romof="skns"> <description>Guts'n (Japan)</description> <year>2000</year> <manufacturer>Kaneko / Kouyousha</manufacturer> @@ -285260,9 +285672,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="puzzloop" romof="skns"> + <game name="puzzloop" sourcefile="suprnova.c" romof="skns"> <description>Puzz Loop (Europe)</description> <year>1998</year> <manufacturer>Mitchell</manufacturer> @@ -285308,9 +285720,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="puzloopj" cloneof="puzzloop" romof="puzzloop"> + <game name="puzloopj" sourcefile="suprnova.c" cloneof="puzzloop" romof="puzzloop"> <description>Puzz Loop (Japan)</description> <year>1998</year> <manufacturer>Mitchell</manufacturer> @@ -285356,9 +285768,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="puzloopu" cloneof="puzzloop" romof="puzzloop"> + <game name="puzloopu" sourcefile="suprnova.c" cloneof="puzzloop" romof="puzzloop"> <description>Puzz Loop (USA)</description> <year>1998</year> <manufacturer>Mitchell</manufacturer> @@ -285404,9 +285816,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="jjparads" romof="skns"> + <game name="jjparads" sourcefile="suprnova.c" romof="skns"> <description>Jan Jan Paradise</description> <year>1996</year> <manufacturer>Electro Design</manufacturer> @@ -285453,9 +285865,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="jjparad2" romof="skns"> + <game name="jjparad2" sourcefile="suprnova.c" romof="skns"> <description>Jan Jan Paradise 2</description> <year>1997</year> <manufacturer>Electro Design</manufacturer> @@ -285503,9 +285915,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="ryouran" romof="skns"> + <game name="ryouran" sourcefile="suprnova.c" romof="skns"> <description>VS Mahjong Otome Ryouran</description> <year>1998</year> <manufacturer>Electro Design</manufacturer> @@ -285553,9 +285965,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="teljan" romof="skns"> + <game name="teljan" sourcefile="suprnova.c" romof="skns"> <description>Tel Jan</description> <year>1999</year> <manufacturer>Electro Design</manufacturer> @@ -285602,9 +286014,9 @@ <dipvalue name="Freezes the game"/> <dipvalue name="Right value" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="hanaawas"> + <game name="hanaawas" sourcefile="hanaawas.c"> <description>Hana Awase (Flower Matching)</description> <year>1982</year> <manufacturer>Seta</manufacturer> @@ -285652,9 +286064,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="speedatk"> + <game name="speedatk" sourcefile="speedatk.c"> <description>Speed Attack!</description> <year>1984</year> <manufacturer>Seta Kikaku Corp.</manufacturer> @@ -285698,9 +286110,9 @@ <dipvalue name="1 Coin/5 Credits"/> <dipvalue name="1 Coin/10 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="srmp2"> + <game name="srmp2" sourcefile="srmp2.c"> <description>Super Real Mahjong Part 2 (Japan)</description> <year>1987</year> <manufacturer>Seta</manufacturer> @@ -285781,9 +286193,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="srmp3"> + <game name="srmp3" sourcefile="srmp2.c"> <description>Super Real Mahjong Part 3 (Japan)</description> <year>1988</year> <manufacturer>Seta</manufacturer> @@ -285861,9 +286273,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mjyuugi"> + <game name="mjyuugi" sourcefile="srmp2.c"> <description>Mahjong Yuugi (Japan set 1)</description> <year>1990</year> <manufacturer>Visco</manufacturer> @@ -285963,9 +286375,9 @@ </dipswitch> <dipswitch name="Debug 7"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mjyuugia" cloneof="mjyuugi" romof="mjyuugi"> + <game name="mjyuugia" sourcefile="srmp2.c" cloneof="mjyuugi" romof="mjyuugi"> <description>Mahjong Yuugi (Japan set 2)</description> <year>1990</year> <manufacturer>Visco</manufacturer> @@ -286065,9 +286477,9 @@ </dipswitch> <dipswitch name="Debug 7"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ponchin"> + <game name="ponchin" sourcefile="srmp2.c"> <description>Mahjong Pon Chin Kan (Japan set 1)</description> <year>1991</year> <manufacturer>Visco</manufacturer> @@ -286156,9 +286568,9 @@ </dipswitch> <dipswitch name="Debug 7"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="ponchina" cloneof="ponchin" romof="ponchin"> + <game name="ponchina" sourcefile="srmp2.c" cloneof="ponchin" romof="ponchin"> <description>Mahjong Pon Chin Kan (Japan set 2)</description> <year>1991</year> <manufacturer>Visco</manufacturer> @@ -286247,9 +286659,9 @@ </dipswitch> <dipswitch name="Debug 7"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tndrcade"> + <game name="tndrcade" sourcefile="seta.c"> <description>Thundercade / Twin Formation</description> <year>1987</year> <manufacturer>[Seta] (Taito license)</manufacturer> @@ -286325,9 +286737,9 @@ <dipvalue name="2 Coins/3 Credits"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="tndrcadj" cloneof="tndrcade" romof="tndrcade"> + <game name="tndrcadj" sourcefile="seta.c" cloneof="tndrcade" romof="tndrcade"> <description>Tokusyu Butai U.A.G. (Japan)</description> <year>1987</year> <manufacturer>[Seta] (Taito license)</manufacturer> @@ -286401,9 +286813,9 @@ <dipvalue name="2 Coins/3 Credits"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="twineagl"> + <game name="twineagl" sourcefile="seta.c"> <description>Twin Eagle - Revenge Joe's Brother</description> <year>1988</year> <manufacturer>Seta (Taito license)</manufacturer> @@ -286475,9 +286887,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="downtown"> + <game name="downtown" sourcefile="seta.c"> <description>DownTown</description> <year>1989</year> <manufacturer>Seta</manufacturer> @@ -286551,9 +286963,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="usclssic"> + <game name="usclssic" sourcefile="seta.c"> <description>U.S. Classic</description> <year>1989</year> <manufacturer>Seta</manufacturer> @@ -286637,9 +287049,9 @@ <dipvalue name="Taito"/> <dipvalue name="Taito America"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="512"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="512"/> </game> - <game name="calibr50"> + <game name="calibr50" sourcefile="seta.c"> <description>Caliber 50</description> <year>1989</year> <manufacturer>Athena / Seta</manufacturer> @@ -286716,9 +287128,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="arbalest"> + <game name="arbalest" sourcefile="seta.c"> <description>Arbalester</description> <year>1989</year> <manufacturer>Seta</manufacturer> @@ -286790,9 +287202,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="metafox"> + <game name="metafox" sourcefile="seta.c"> <description>Meta Fox</description> <year>1989</year> <manufacturer>Seta</manufacturer> @@ -286869,9 +287281,9 @@ <dipvalue name="1" default="yes"/> <dipvalue name="2"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="drgnunit"> + <game name="drgnunit" sourcefile="seta.c"> <description>Dragon Unit / Castle of Dragon</description> <year>1989</year> <manufacturer>Seta</manufacturer> @@ -286972,9 +287384,9 @@ <dipvalue name="2 Coins/3 Credits"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="wits"> + <game name="wits" sourcefile="seta.c"> <description>Wit's (Japan)</description> <year>1989</year> <manufacturer>Athena (Visco license)</manufacturer> @@ -287024,8 +287436,8 @@ <dipvalue name="5"/> </dipswitch> <dipswitch name="Max Players"> - <dipvalue name="2" default="yes"/> - <dipvalue name="4"/> + <dipvalue name="2"/> + <dipvalue name="4" default="yes"/> </dipswitch> <dipswitch name="Unknown 1-7*"> <dipvalue name="Off" default="yes"/> @@ -287057,9 +287469,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="thunderl"> + <game name="thunderl" sourcefile="seta.c"> <description>Thunder & Lightning</description> <year>1990</year> <manufacturer>Seta</manufacturer> @@ -287151,9 +287563,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rezon"> + <game name="rezon" sourcefile="seta.c"> <description>Rezon</description> <year>1991</year> <manufacturer>Allumer</manufacturer> @@ -287228,9 +287640,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="stg"> + <game name="stg" sourcefile="seta.c"> <description>Strike Gunner S.T.G</description> <year>1991</year> <manufacturer>Athena / Tecmo</manufacturer> @@ -287305,9 +287717,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="blandia"> + <game name="blandia" sourcefile="seta.c"> <description>Blandia</description> <year>1992</year> <manufacturer>Allumer</manufacturer> @@ -287383,9 +287795,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="blandiap" cloneof="blandia" romof="blandia"> + <game name="blandiap" sourcefile="seta.c" cloneof="blandia" romof="blandia"> <description>Blandia (prototype)</description> <year>1992</year> <manufacturer>Allumer</manufacturer> @@ -287480,9 +287892,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="blockcar"> + <game name="blockcar" sourcefile="seta.c"> <description>Block Carnival / Thunder & Lightning 2</description> <year>1992</year> <manufacturer>Visco</manufacturer> @@ -287554,9 +287966,9 @@ <dipvalue name="2 Coins/3 Credits"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="qzkklogy"> + <game name="qzkklogy" sourcefile="seta.c"> <description>Quiz Kokology</description> <year>1992</year> <manufacturer>Tecmo</manufacturer> @@ -287627,9 +288039,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="neobattl"> + <game name="neobattl" sourcefile="seta.c"> <description>SD Gundam Neo Battling (Japan)</description> <year>1992</year> <manufacturer>Banpresto / Sotsu Agency. Sunrise</manufacturer> @@ -287701,9 +288113,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="umanclub"> + <game name="umanclub" sourcefile="seta.c"> <description>Ultraman Club - Tatakae! Ultraman Kyoudai!!</description> <year>1992</year> <manufacturer>Tsuburaya Prod. / Banpresto</manufacturer> @@ -287775,9 +288187,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="zingzip"> + <game name="zingzip" sourcefile="seta.c"> <description>Zing Zing Zip</description> <year>1992</year> <manufacturer>Allumer + Tecmo</manufacturer> @@ -287854,9 +288266,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="atehate"> + <game name="atehate" sourcefile="seta.c"> <description>Athena no Hatena ?</description> <year>1993</year> <manufacturer>Athena</manufacturer> @@ -287921,9 +288333,9 @@ <dipvalue name="20K, Every 30K"/> <dipvalue name="30K, Every 40K"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="jjsquawk"> + <game name="jjsquawk" sourcefile="seta.c"> <description>J. J. Squawkers</description> <year>1993</year> <manufacturer>Athena / Able</manufacturer> @@ -287998,9 +288410,9 @@ <dipvalue name="70K, 200K Only"/> <dipvalue name="100K Only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="kamenrid"> + <game name="kamenrid" sourcefile="seta.c"> <description>Masked Riders Club Battle Race</description> <year>1993</year> <manufacturer>Toei / Banpresto</manufacturer> @@ -288092,9 +288504,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="madshark"> + <game name="madshark" sourcefile="seta.c"> <description>Mad Shark</description> <year>1993</year> <manufacturer>Allumer</manufacturer> @@ -288177,9 +288589,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="msgundam"> + <game name="msgundam" sourcefile="seta.c"> <description>Mobile Suit Gundam</description> <year>1993</year> <manufacturer>Banpresto</manufacturer> @@ -288255,9 +288667,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="msgunda1" cloneof="msgundam" romof="msgundam"> + <game name="msgunda1" sourcefile="seta.c" cloneof="msgundam" romof="msgundam"> <description>Mobile Suit Gundam (Japan)</description> <year>1993</year> <manufacturer>Banpresto</manufacturer> @@ -288332,9 +288744,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="daioh"> + <game name="daioh" sourcefile="seta.c"> <description>Daioh</description> <year>1993</year> <manufacturer>Athena</manufacturer> @@ -288418,9 +288830,9 @@ <dipvalue name="800k and 2000k only"/> <dipvalue name="1000k Only"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="oisipuzl"> + <game name="oisipuzl" sourcefile="seta.c"> <description>Oishii Puzzle Ha Irimasenka</description> <year>1993</year> <manufacturer>Sunsoft + Atlus</manufacturer> @@ -288492,9 +288904,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="triplfun" cloneof="oisipuzl" romof="oisipuzl"> + <game name="triplfun" sourcefile="seta.c" cloneof="oisipuzl" romof="oisipuzl"> <description>Triple Fun</description> <year>1993</year> <manufacturer>bootleg</manufacturer> @@ -288566,9 +288978,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="utoukond"> + <game name="utoukond" sourcefile="seta.c"> <description>Ultra Toukon Densetsu (Japan)</description> <year>1993</year> <manufacturer>Banpresto + Tsuburaya Prod.</manufacturer> @@ -288668,9 +289080,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="qzkklgy2"> + <game name="qzkklgy2" sourcefile="seta.c"> <description>Quiz Kokology 2</description> <year>1993</year> <manufacturer>Tecmo</manufacturer> @@ -288736,9 +289148,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="wrofaero"> + <game name="wrofaero" sourcefile="seta.c"> <description>War of Aero - Project MEIOU</description> <year>1993</year> <manufacturer>Yang Cheng</manufacturer> @@ -288813,9 +289225,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="eightfrc"> + <game name="eightfrc" sourcefile="seta.c"> <description>Eight Forces</description> <year>1994</year> <manufacturer>Tecmo</manufacturer> @@ -288886,9 +289298,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="kiwame"> + <game name="kiwame" sourcefile="seta.c"> <description>Pro Mahjong Kiwame</description> <year>1994</year> <manufacturer>Athena</manufacturer> @@ -288956,9 +289368,9 @@ <dipvalue name="-6000"/> <dipvalue name="-8000"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="krzybowl"> + <game name="krzybowl" sourcefile="seta.c"> <description>Krazy Bowl</description> <year>1994</year> <manufacturer>American Sammy</manufacturer> @@ -289029,9 +289441,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="extdwnhl"> + <game name="extdwnhl" sourcefile="seta.c"> <description>Extreme Downhill (v1.5)</description> <year>1995</year> <manufacturer>Sammy Industries Japan</manufacturer> @@ -289116,9 +289528,9 @@ <dipvalue name="Finals Only" default="yes"/> <dipvalue name="Semi-Finals & Finals"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1536"/> </game> - <game name="gundhara"> + <game name="gundhara" sourcefile="seta.c"> <description>Gundhara</description> <year>1995</year> <manufacturer>Banpresto</manufacturer> @@ -289192,9 +289604,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="sokonuke"> + <game name="sokonuke" sourcefile="seta.c"> <description>Sokonuke Taisen Game (Japan)</description> <year>1995</year> <manufacturer>Sammy Industries</manufacturer> @@ -289265,9 +289677,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1536"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1536"/> </game> - <game name="zombraid"> + <game name="zombraid" sourcefile="seta.c"> <description>Zombie Raid (US)</description> <year>1995</year> <manufacturer>American Sammy</manufacturer> @@ -289343,9 +289755,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1536"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1536"/> </game> - <game name="gundamex"> + <game name="gundamex" sourcefile="seta2.c"> <description>Mobile Suit Gundam EX Revue</description> <year>1994</year> <manufacturer>Banpresto</manufacturer> @@ -289427,9 +289839,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="grdians"> + <game name="grdians" sourcefile="seta2.c"> <description>Guardians / Denjin Makai II</description> <year>1995</year> <manufacturer>Banpresto</manufacturer> @@ -289513,9 +289925,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="mj4simai"> + <game name="mj4simai" sourcefile="seta2.c"> <description>Wakakusamonogatari Mahjong Yonshimai (Japan)</description> <year>1996</year> <manufacturer>Maboroshi Ware</manufacturer> @@ -289593,9 +290005,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="myangel"> + <game name="myangel" sourcefile="seta2.c"> <description>Kosodate Quiz My Angel (Japan)</description> <year>1996</year> <manufacturer>Namco</manufacturer> @@ -289677,9 +290089,9 @@ </dipswitch> <dipswitch name="Push Start To Freeze (Cheat)"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="myangel2"> + <game name="myangel2" sourcefile="seta2.c"> <description>Kosodate Quiz My Angel 2 (Japan)</description> <year>1997</year> <manufacturer>Namco</manufacturer> @@ -289763,9 +290175,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="pzlbowl"> + <game name="pzlbowl" sourcefile="seta2.c"> <description>Puzzle De Bowling (Japan)</description> <year>1999</year> <manufacturer>Nihon System / Moss</manufacturer> @@ -289833,9 +290245,9 @@ <dipvalue name="English" default="yes"/> <dipvalue name="Japanese"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="penbros"> + <game name="penbros" sourcefile="seta2.c"> <description>Penguin Brothers (Japan)</description> <year>2000</year> <manufacturer>Subsino</manufacturer> @@ -289900,9 +290312,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="srmp4"> + <game name="srmp4" sourcefile="ssv.c"> <description>Super Real Mahjong PIV (Japan)</description> <year>1993</year> <manufacturer>Seta</manufacturer> @@ -289979,9 +290391,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="srmp4o" cloneof="srmp4" romof="srmp4"> + <game name="srmp4o" sourcefile="ssv.c" cloneof="srmp4" romof="srmp4"> <description>Super Real Mahjong PIV (Japan, older set)</description> <year>1993</year> <manufacturer>Seta</manufacturer> @@ -290058,9 +290470,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="twineag2"> + <game name="twineag2" sourcefile="ssv.c"> <description>Twin Eagle II - The Rescue Mission</description> <year>1994</year> <manufacturer>Seta</manufacturer> @@ -290143,9 +290555,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="33024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="srmp7"> + <game name="srmp7" sourcefile="ssv.c"> <description>Super Real Mahjong P7 (Japan)</description> <year>1997</year> <manufacturer>Seta</manufacturer> @@ -290237,9 +290649,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="33024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="33024"/> </game> - <game name="survarts"> + <game name="survarts" sourcefile="ssv.c"> <description>Survival Arts (USA)</description> <year>1993</year> <manufacturer>American Sammy</manufacturer> @@ -290323,9 +290735,9 @@ <dipvalue name="Heavy"/> <dipvalue name="Heaviest" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="eaglshot"> + <game name="eaglshot" sourcefile="ssv.c"> <description>Eagle Shot Golf</description> <year>1994</year> <manufacturer>Sammy</manufacturer> @@ -290403,9 +290815,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="33024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="eaglshta" cloneof="eaglshot" romof="eaglshot"> + <game name="eaglshta" sourcefile="ssv.c" cloneof="eaglshot" romof="eaglshot"> <description>Eagle Shot Golf (alt)</description> <year>1994</year> <manufacturer>Sammy</manufacturer> @@ -290483,9 +290895,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="33024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="hypreact"> + <game name="hypreact" sourcefile="ssv.c"> <description>Mahjong Hyper Reaction (Japan)</description> <year>1995</year> <manufacturer>Sammy</manufacturer> @@ -290563,9 +290975,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="koikois2"> + <game name="koikois2" sourcefile="ssv.c"> <description>Koi Koi Shimasyo 2 - Super Real Hanafuda (Japan)</description> <year>1997</year> <manufacturer>Visco</manufacturer> @@ -290641,9 +291053,9 @@ <dipvalue name="Board 1 (Main)"/> <dipvalue name="Board 2 (Sub)"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="meosism"> + <game name="meosism" sourcefile="ssv.c"> <description>Meosis Magic (Japan)</description> <manufacturer>Sammy</manufacturer> <rom name="s15-2-2.u47" size="524288" crc="2ab0373f" sha1="826aec3b9698ec5db5d7a72c3a24b1ef779fb227" region="user1" offset="0"/> @@ -290718,9 +291130,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="hypreac2"> + <game name="hypreac2" sourcefile="ssv.c"> <description>Mahjong Hyper Reaction 2 (Japan)</description> <year>1997</year> <manufacturer>Sammy</manufacturer> @@ -290800,9 +291212,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="sxyreact"> + <game name="sxyreact" sourcefile="ssv.c"> <description>Pachinko Sexy Reaction (Japan)</description> <year>1998</year> <manufacturer>Sammy</manufacturer> @@ -290872,9 +291284,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="cairblad"> + <game name="cairblad" sourcefile="ssv.c"> <description>Change Air Blade (Japan)</description> <year>1999</year> <manufacturer>Sammy</manufacturer> @@ -290945,9 +291357,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="keithlcy"> + <game name="keithlcy" sourcefile="ssv.c"> <description>Dramatic Adventure Quiz Keith & Lucy (Japan)</description> <year>1993</year> <manufacturer>Visco</manufacturer> @@ -291017,9 +291429,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="drifto94"> + <game name="drifto94" sourcefile="ssv.c"> <description>Drift Out '94 - The Hard Order (Japan)</description> <year>1994</year> <manufacturer>Visco</manufacturer> @@ -291103,9 +291515,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="janjans1"> + <game name="janjans1" sourcefile="ssv.c"> <description>Lovely Pop Mahjong Jan Jan Shimasyo (Japan)</description> <year>1996</year> <manufacturer>Visco</manufacturer> @@ -291184,9 +291596,9 @@ <dipvalue name="Board 1 (Main)"/> <dipvalue name="Board 2 (Sub)"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="33024"/> </game> - <game name="stmblade"> + <game name="stmblade" sourcefile="ssv.c"> <description>Storm Blade (US)</description> <year>1996</year> <manufacturer>Visco</manufacturer> @@ -291262,9 +291674,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="33024"/> </game> - <game name="mslider"> + <game name="mslider" sourcefile="ssv.c"> <description>Monster Slider (Japan)</description> <year>1997</year> <manufacturer>Visco / Datt Japan</manufacturer> @@ -291337,9 +291749,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="ryorioh"> + <game name="ryorioh" sourcefile="ssv.c"> <description>Gourmet Battle Quiz Ryohrioh CooKing (Japan)</description> <year>1998</year> <manufacturer>Visco</manufacturer> @@ -291418,9 +291830,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="vasara"> + <game name="vasara" sourcefile="ssv.c"> <description>Vasara</description> <year>2000</year> <manufacturer>Visco</manufacturer> @@ -291490,9 +291902,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="ultrax"> + <game name="ultrax" sourcefile="ssv.c"> <description>Ultra X Weapons / Ultra Keibitai</description> <year>1995</year> <manufacturer>Banpresto + Tsuburaya Prod.</manufacturer> @@ -291558,9 +291970,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="33024"/> </game> - <game name="jsk"> + <game name="jsk" sourcefile="ssv.c"> <description>Joryuu Syougi Kyoushitsu (Japan)</description> <year>1997</year> <manufacturer>Visco</manufacturer> @@ -291633,9 +292045,9 @@ <dipvalue name="Board 1 (Main)"/> <dipvalue name="Board 2 (Sub)"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="33024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="33024"/> </game> - <game name="powerins"> + <game name="powerins" sourcefile="powerins.c"> <description>Power Instinct (USA bootleg) (set 1)</description> <year>1993</year> <manufacturer>Atlus</manufacturer> @@ -291710,9 +292122,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="powerina" cloneof="powerins" romof="powerins"> + <game name="powerina" sourcefile="powerins.c" cloneof="powerins" romof="powerins"> <description>Power Instinct (USA bootleg) (set 2)</description> <year>1993</year> <manufacturer>Atlus</manufacturer> @@ -291814,9 +292226,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2048"/> </game> - <game name="ohmygod"> + <game name="ohmygod" sourcefile="ohmygod.c"> <description>Oh My God! (Japan)</description> <year>1993</year> <manufacturer>Atlus</manufacturer> @@ -291891,9 +292303,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="naname"> + <game name="naname" sourcefile="ohmygod.c"> <description>Naname de Magic! (Japan)</description> <year>1994</year> <manufacturer>Atlus</manufacturer> @@ -291968,9 +292380,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="blmbycar"> + <game name="blmbycar" sourcefile="blmbycar.c"> <description>Blomby Car</description> <year>1994</year> <manufacturer>ABM & Gecas</manufacturer> @@ -292038,9 +292450,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="blmbycau" cloneof="blmbycar" romof="blmbycar"> + <game name="blmbycau" sourcefile="blmbycar.c" cloneof="blmbycar" romof="blmbycar"> <description>Blomby Car (not encrypted)</description> <year>1994</year> <manufacturer>ABM & Gecas</manufacturer> @@ -292108,9 +292520,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="speakres"> + <game name="speakres" sourcefile="route16.c"> <description>Speak & Rescue</description> <year>1980</year> <manufacturer>Sun Electronics</manufacturer> @@ -292160,9 +292572,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="stratvox" cloneof="speakres" romof="speakres"> + <game name="stratvox" sourcefile="route16.c" cloneof="speakres" romof="speakres"> <description>Stratovox</description> <year>1980</year> <manufacturer>[Sun Electronics] (Taito license)</manufacturer> @@ -292214,9 +292626,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spacecho" cloneof="speakres" romof="speakres"> + <game name="spacecho" sourcefile="route16.c" cloneof="speakres" romof="speakres"> <description>Space Echo</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -292269,9 +292681,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="route16"> + <game name="route16" sourcefile="route16.c"> <description>Route 16</description> <year>1981</year> <manufacturer>Tehkan/Sun (Centuri license)</manufacturer> @@ -292322,9 +292734,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="route16a" cloneof="route16" romof="route16"> + <game name="route16a" sourcefile="route16.c" cloneof="route16" romof="route16"> <description>Route 16 (set 2)</description> <year>1981</year> <manufacturer>Tehkan/Sun (Centuri license)</manufacturer> @@ -292375,9 +292787,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="route16b" cloneof="route16" romof="route16"> + <game name="route16b" sourcefile="route16.c" cloneof="route16" romof="route16"> <description>Route 16 (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -292428,9 +292840,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="routex" cloneof="route16" romof="route16"> + <game name="routex" sourcefile="route16.c" cloneof="route16" romof="route16"> <description>Route X (bootleg)</description> <year>1981</year> <manufacturer>bootleg</manufacturer> @@ -292482,9 +292894,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="ttmahjng"> + <game name="ttmahjng" sourcefile="ttmahjng.c"> <description>Mahjong</description> <year>1981</year> <manufacturer>Taito</manufacturer> @@ -292535,9 +292947,9 @@ <dipvalue name="00" default="yes"/> <dipvalue name="80"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="fnkyfish"> + <game name="fnkyfish" sourcefile="kangaroo.c"> <description>Funky Fish</description> <year>1981</year> <manufacturer>Sun Electronics</manufacturer> @@ -292588,9 +293000,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="24"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="24"/> </game> - <game name="kangaroo"> + <game name="kangaroo" sourcefile="kangaroo.c"> <description>Kangaroo</description> <year>1982</year> <manufacturer>Sun Electronics</manufacturer> @@ -292658,9 +293070,9 @@ <dipvalue name="A 1C/2C B 1C/12C"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="24"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="24"/> </game> - <game name="kangaroa" cloneof="kangaroo" romof="kangaroo"> + <game name="kangaroa" sourcefile="kangaroo.c" cloneof="kangaroo" romof="kangaroo"> <description>Kangaroo (Atari)</description> <year>1982</year> <manufacturer>[Sun Electronics] (Atari license)</manufacturer> @@ -292728,9 +293140,9 @@ <dipvalue name="A 1C/2C B 1C/12C"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="24"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="24"/> </game> - <game name="kangarob" cloneof="kangaroo" romof="kangaroo"> + <game name="kangarob" sourcefile="kangaroo.c" cloneof="kangaroo" romof="kangaroo"> <description>Kangaroo (bootleg)</description> <year>1982</year> <manufacturer>bootleg</manufacturer> @@ -292797,9 +293209,9 @@ <dipvalue name="A 1C/2C B 1C/12C"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="24"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="24"/> </game> - <game name="arabian"> + <game name="arabian" sourcefile="arabian.c"> <description>Arabian</description> <year>1983</year> <manufacturer>Sun Electronics</manufacturer> @@ -292865,9 +293277,9 @@ <dipvalue name="20000 50000 +100K"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="arabiana" cloneof="arabian" romof="arabian"> + <game name="arabiana" sourcefile="arabian.c" cloneof="arabian" romof="arabian"> <description>Arabian (Atari)</description> <year>1983</year> <manufacturer>[Sun Electronics] (Atari license)</manufacturer> @@ -292933,9 +293345,9 @@ <dipvalue name="20000 50000 +100K"/> <dipvalue name="None"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="64"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="64"/> </game> - <game name="markham"> + <game name="markham" sourcefile="markham.c"> <description>Markham</description> <year>1983</year> <manufacturer>Sun Electronics</manufacturer> @@ -293028,9 +293440,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="strnskil"> + <game name="strnskil" sourcefile="strnskil.c"> <description>Strength & Skill</description> <year>1984</year> <manufacturer>Sun Electronics</manufacturer> @@ -293127,9 +293539,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="guiness" cloneof="strnskil" romof="strnskil"> + <game name="guiness" sourcefile="strnskil.c" cloneof="strnskil" romof="strnskil"> <description>The Guiness (Japan)</description> <year>1984</year> <manufacturer>Sun Electronics</manufacturer> @@ -293226,9 +293638,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pettanp"> + <game name="pettanp" sourcefile="strnskil.c"> <description>Pettan Pyuu (Japan)</description> <year>1984</year> <manufacturer>Sun Electronics</manufacturer> @@ -293322,9 +293734,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ikki"> + <game name="ikki" sourcefile="ikki.c"> <description>Ikki (Japan)</description> <year>1985</year> <manufacturer>Sun Electronics</manufacturer> @@ -293417,9 +293829,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="257"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="257"/> </game> - <game name="shanghai"> + <game name="shanghai" sourcefile="shanghai.c"> <description>Shanghai (Japan)</description> <year>1988</year> <manufacturer>Sunsoft</manufacturer> @@ -293486,9 +293898,9 @@ <dipvalue name="90" default="yes"/> <dipvalue name="120"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="shangha2"> + <game name="shangha2" sourcefile="shanghai.c"> <description>Shanghai II (Japan)</description> <year>1989</year> <manufacturer>Sunsoft</manufacturer> @@ -293551,9 +293963,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shangha3"> + <game name="shangha3" sourcefile="shangha3.c"> <description>Shanghai III (Japan)</description> <year>1993</year> <manufacturer>Sunsoft</manufacturer> @@ -293621,9 +294033,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="heberpop"> + <game name="heberpop" sourcefile="shangha3.c"> <description>Hebereke no Popoon (Japan)</description> <year>1994</year> <manufacturer>Sunsoft / Atlus</manufacturer> @@ -293703,9 +294115,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="blocken"> + <game name="blocken" sourcefile="shangha3.c"> <description>Blocken (Japan)</description> <year>1994</year> <manufacturer>KID / Visco</manufacturer> @@ -293785,9 +294197,9 @@ <dipvalue name="1 Coin/6 Credits"/> <dipvalue name="1 Coin/7 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="goindol"> + <game name="goindol" sourcefile="goindol.c"> <description>Goindol (World)</description> <year>1987</year> <manufacturer>Sun a Electronics</manufacturer> @@ -293862,9 +294274,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="goindolu" cloneof="goindol" romof="goindol"> + <game name="goindolu" sourcefile="goindol.c" cloneof="goindol" romof="goindol"> <description>Goindol (US)</description> <year>1987</year> <manufacturer>Sun a Electronics</manufacturer> @@ -293939,9 +294351,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="goindolj" cloneof="goindol" romof="goindol"> + <game name="goindolj" sourcefile="goindol.c" cloneof="goindol" romof="goindol"> <description>Goindol (Japan)</description> <year>1987</year> <manufacturer>Sun a Electronics</manufacturer> @@ -294016,9 +294428,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="256"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rranger"> + <game name="rranger" sourcefile="suna8.c"> <description>Rough Ranger (v2.0)</description> <year>1988</year> <manufacturer>SunA (Sharp Image license)</manufacturer> @@ -294098,9 +294510,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="sranger" cloneof="rranger" romof="rranger"> + <game name="sranger" sourcefile="suna8.c" cloneof="rranger" romof="rranger"> <description>Super Ranger (v2.0)</description> <year>1988</year> <manufacturer>SunA</manufacturer> @@ -294180,9 +294592,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="srangerb" cloneof="rranger" romof="rranger"> + <game name="srangerb" sourcefile="suna8.c" cloneof="rranger" romof="rranger"> <description>Super Ranger (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -294263,9 +294675,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="srangerw" cloneof="rranger" romof="rranger"> + <game name="srangerw" sourcefile="suna8.c" cloneof="rranger" romof="rranger"> <description>Super Ranger (WDK)</description> <year>1988</year> <manufacturer>SunA (WDK license)</manufacturer> @@ -294345,9 +294757,9 @@ </dipswitch> <dipswitch name="Invulnerability"> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sparkman"> + <game name="sparkman" sourcefile="suna8.c"> <description>Spark Man (v 2.0)</description> <year>1989</year> <manufacturer>SunA</manufacturer> @@ -294428,9 +294840,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="hardhead"> + <game name="hardhead" sourcefile="suna8.c"> <description>Hard Head</description> <year>1988</year> <manufacturer>SunA</manufacturer> @@ -294509,9 +294921,9 @@ <dipvalue name="Very Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="hardhedb" cloneof="hardhead" romof="hardhead"> + <game name="hardhedb" sourcefile="suna8.c" cloneof="hardhead" romof="hardhead"> <description>Hard Head (bootleg)</description> <year>1988</year> <manufacturer>bootleg</manufacturer> @@ -294590,9 +295002,9 @@ <dipvalue name="Very Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="256"/> </game> - <game name="starfigh"> + <game name="starfigh" sourcefile="suna8.c"> <description>Star Fighter (v1)</description> <year>1990</year> <manufacturer>SunA</manufacturer> @@ -294672,9 +295084,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hardhea2"> + <game name="hardhea2" sourcefile="suna8.c"> <description>Hard Head 2 (v2.0)</description> <year>1991</year> <manufacturer>SunA</manufacturer> @@ -294759,9 +295171,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="brickzn"> + <game name="brickzn" sourcefile="suna8.c"> <description>Brick Zone (v5.0)</description> <year>1992</year> <manufacturer>SunA</manufacturer> @@ -294842,9 +295254,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="brickzn3" cloneof="brickzn" romof="brickzn"> + <game name="brickzn3" sourcefile="suna8.c" cloneof="brickzn" romof="brickzn"> <description>Brick Zone (v3.0)</description> <year>1992</year> <manufacturer>SunA</manufacturer> @@ -294925,9 +295337,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="bssoccer"> + <game name="bssoccer" sourcefile="suna16.c"> <description>Back Street Soccer</description> <year>1996</year> <manufacturer>SunA</manufacturer> @@ -295022,9 +295434,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="uballoon"> + <game name="uballoon" sourcefile="suna16.c"> <description>Ultra Balloon</description> <year>1996</year> <manufacturer>SunA</manufacturer> @@ -295103,9 +295515,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gundealr"> + <game name="gundealr" sourcefile="gundealr.c"> <description>Gun Dealer (set 1)</description> <year>1990</year> <manufacturer>Dooyong</manufacturer> @@ -295173,9 +295585,9 @@ <dipvalue name="2"/> <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gundeala" cloneof="gundealr" romof="gundealr"> + <game name="gundeala" sourcefile="gundealr.c" cloneof="gundealr" romof="gundealr"> <description>Gun Dealer (set 2)</description> <manufacturer>Dooyong</manufacturer> <rom name="gundeala.1" size="65536" crc="d87e24f1" sha1="5ac3e20e5848b9cab2a23e083d2566bfd54502d4" region="cpu1" offset="0"/> @@ -295242,9 +295654,9 @@ <dipvalue name="2"/> <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gundealt" cloneof="gundealr" romof="gundealr"> + <game name="gundealt" sourcefile="gundealr.c" cloneof="gundealr" romof="gundealr"> <description>Gun Dealer (Tecmo)</description> <year>1990</year> <manufacturer>Tecmo</manufacturer> @@ -295312,9 +295724,9 @@ <dipvalue name="2"/> <dipvalue name="3" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="yamyam"> + <game name="yamyam" sourcefile="gundealr.c"> <description>Yam! Yam!?</description> <year>1990</year> <manufacturer>Dooyong</manufacturer> @@ -295374,9 +295786,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="wiseguy" cloneof="yamyam" romof="yamyam"> + <game name="wiseguy" sourcefile="gundealr.c" cloneof="yamyam" romof="yamyam"> <description>Wise Guy</description> <year>1990</year> <manufacturer>Dooyong</manufacturer> @@ -295436,9 +295848,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="lastday"> + <game name="lastday" sourcefile="dooyong.c"> <description>The Last Day (set 1)</description> <year>1990</year> <manufacturer>Dooyong</manufacturer> @@ -295516,9 +295928,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="lastdaya" cloneof="lastday" romof="lastday"> + <game name="lastdaya" sourcefile="dooyong.c" cloneof="lastday" romof="lastday"> <description>The Last Day (set 2)</description> <year>1990</year> <manufacturer>Dooyong</manufacturer> @@ -295596,9 +296008,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="gulfstrm"> + <game name="gulfstrm" sourcefile="dooyong.c"> <description>Gulf Storm</description> <year>1991</year> <manufacturer>Dooyong</manufacturer> @@ -295679,9 +296091,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="gulfstr2" cloneof="gulfstrm" romof="gulfstrm"> + <game name="gulfstr2" sourcefile="dooyong.c" cloneof="gulfstrm" romof="gulfstrm"> <description>Gulf Storm (Media Shoji)</description> <year>1991</year> <manufacturer>Dooyong (Media Shoji license)</manufacturer> @@ -295762,9 +296174,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="pollux"> + <game name="pollux" sourcefile="dooyong.c"> <description>Pollux (set 1)</description> <year>1991</year> <manufacturer>Dooyong</manufacturer> @@ -295839,9 +296251,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="polluxa" cloneof="pollux" romof="pollux"> + <game name="polluxa" sourcefile="dooyong.c" cloneof="pollux" romof="pollux"> <description>Pollux (set 2)</description> <year>1991</year> <manufacturer>Dooyong</manufacturer> @@ -295916,9 +296328,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bluehawk"> + <game name="bluehawk" sourcefile="dooyong.c"> <description>Blue Hawk</description> <year>1993</year> <manufacturer>Dooyong</manufacturer> @@ -295991,9 +296403,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="bluehawn" cloneof="bluehawk" romof="bluehawk"> + <game name="bluehawn" sourcefile="dooyong.c" cloneof="bluehawk" romof="bluehawk"> <description>Blue Hawk (NTC)</description> <year>1993</year> <manufacturer>[Dooyong] (NTC license)</manufacturer> @@ -296066,9 +296478,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="sadari"> + <game name="sadari" sourcefile="dooyong.c"> <description>Sadari</description> <year>1993</year> <manufacturer>[Dooyong] (NTC license)</manufacturer> @@ -296144,9 +296556,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="gundl94"> + <game name="gundl94" sourcefile="dooyong.c"> <description>Gun Dealer '94</description> <year>1994</year> <manufacturer>Dooyong</manufacturer> @@ -296221,9 +296633,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="primella" cloneof="gundl94" romof="gundl94"> + <game name="primella" sourcefile="dooyong.c" cloneof="gundl94" romof="gundl94"> <description>Primella</description> <year>1994</year> <manufacturer>[Dooyong] (NTC license)</manufacturer> @@ -296295,9 +296707,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="superx"> + <game name="superx" sourcefile="dooyong.c"> <description>Super-X (NTC)</description> <year>1994</year> <manufacturer>NTC</manufacturer> @@ -296375,9 +296787,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="superxm" cloneof="superx" romof="superx"> + <game name="superxm" sourcefile="dooyong.c" cloneof="superx" romof="superx"> <description>Super-X (Mitchell)</description> <year>1994</year> <manufacturer>Mitchell</manufacturer> @@ -296455,9 +296867,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="rshark"> + <game name="rshark" sourcefile="dooyong.c"> <description>R-Shark</description> <year>1995</year> <manufacturer>Dooyong</manufacturer> @@ -296542,9 +296954,9 @@ <dipvalue name="No"/> <dipvalue name="Yes" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="2048"/> </game> - <game name="leprechn"> + <game name="leprechn" sourcefile="leprechn.c"> <description>Leprechaun</description> <year>1982</year> <manufacturer>Tong Electronic</manufacturer> @@ -296619,9 +297031,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="potogold" cloneof="leprechn" romof="leprechn"> + <game name="potogold" sourcefile="leprechn.c" cloneof="leprechn" romof="leprechn"> <description>Pot of Gold</description> <year>1982</year> <manufacturer>GamePlan</manufacturer> @@ -296696,9 +297108,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="beezer"> + <game name="beezer" sourcefile="beezer.c"> <description>Beezer (set 1)</description> <year>1982</year> <manufacturer>Tong Electronic</manufacturer> @@ -296746,9 +297158,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="beezer1" cloneof="beezer" romof="beezer"> + <game name="beezer1" sourcefile="beezer.c" cloneof="beezer" romof="beezer"> <description>Beezer (set 2)</description> <year>1982</year> <manufacturer>Tong Electronic</manufacturer> @@ -296796,9 +297208,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="16"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="16"/> </game> - <game name="pushman"> + <game name="pushman" sourcefile="pushman.c"> <description>Pushman</description> <year>1990</year> <manufacturer>Comad (American Sammy license)</manufacturer> @@ -296882,9 +297294,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="bballs"> + <game name="bballs" sourcefile="pushman.c"> <description>Bouncing Balls</description> <year>1991</year> <manufacturer>Comad</manufacturer> @@ -296967,9 +297379,9 @@ <dipvalue name="Inputs/Outputs"/> <dipvalue name="Graphics"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="zerozone"> + <game name="zerozone" sourcefile="zerozone.c"> <description>Zero Zone</description> <year>1993</year> <manufacturer>Comad</manufacturer> @@ -297043,9 +297455,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="lvgirl94"> + <game name="lvgirl94" sourcefile="zerozone.c"> <description>Las Vegas Girl (Girl '94)</description> <year>1994</year> <manufacturer>Comad</manufacturer> @@ -297119,9 +297531,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hotpinbl"> + <game name="hotpinbl" sourcefile="galspnbl.c"> <description>Hot Pinball</description> <year>1995</year> <manufacturer>Comad & New Japan System</manufacturer> @@ -297210,9 +297622,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="galspnbl"> + <game name="galspnbl" sourcefile="galspnbl.c"> <description>Gals Pinball</description> <year>1996</year> <manufacturer>Comad</manufacturer> @@ -297301,9 +297713,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="fantasia"> + <game name="fantasia" sourcefile="galpanic.c"> <description>Fantasia</description> <year>1994</year> <manufacturer>Comad & New Japan System</manufacturer> @@ -297383,9 +297795,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="newfant"> + <game name="newfant" sourcefile="galpanic.c"> <description>New Fantasia</description> <year>1995</year> <manufacturer>Comad & New Japan System</manufacturer> @@ -297461,9 +297873,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="fantsy95"> + <game name="fantsy95" sourcefile="galpanic.c"> <description>Fantasy '95</description> <year>1995</year> <manufacturer>Hi-max Technology Inc.</manufacturer> @@ -297539,9 +297951,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="missw96"> + <game name="missw96" sourcefile="galpanic.c"> <description>Miss World '96 Nude</description> <year>1996</year> <manufacturer>Comad</manufacturer> @@ -297617,9 +298029,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="fantsia2"> + <game name="fantsia2" sourcefile="galpanic.c"> <description>Fantasia II</description> <year>1997</year> <manufacturer>Comad</manufacturer> @@ -297698,9 +298110,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/6 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="galhustl"> + <game name="galhustl" sourcefile="galpanic.c"> <description>Gals Hustler</description> <year>1997</year> <manufacturer>ACE International</manufacturer> @@ -297768,9 +298180,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="33792"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="33792"/> </game> - <game name="sslam"> + <game name="sslam" sourcefile="sslam.c"> <description>Super Slam</description> <year>1993</year> <manufacturer>Playmark</manufacturer> @@ -297845,9 +298257,9 @@ <dipvalue name="Common" default="yes"/> <dipvalue name="Individual"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="bigtwin"> + <game name="bigtwin" sourcefile="playmark.c"> <description>Big Twin</description> <year>1995</year> <manufacturer>Playmark</manufacturer> @@ -297935,9 +298347,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="wbeachvl"> + <game name="wbeachvl" sourcefile="playmark.c"> <description>World Beach Volley</description> <year>1995</year> <manufacturer>Playmark</manufacturer> @@ -297962,9 +298374,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="4" control="joy8way" buttons="3" coins="4" service="yes"/> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="sharkatt"> + <game name="sharkatt" sourcefile="thief.c"> <description>Shark Attack</description> <year>1980</year> <manufacturer>Pacific Novelty</manufacturer> @@ -298025,9 +298437,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="thief"> + <game name="thief" sourcefile="thief.c"> <description>Thief</description> <year>1981</year> <manufacturer>Pacific Novelty</manufacturer> @@ -298103,9 +298515,9 @@ <dipvalue name="I/O Board Test"/> <dipvalue name="Reserved"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="natodef"> + <game name="natodef" sourcefile="thief.c"> <description>NATO Defense</description> <year>1982</year> <manufacturer>Pacific Novelty</manufacturer> @@ -298184,9 +298596,9 @@ <dipvalue name="I/O Board Test"/> <dipvalue name="Reserved"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="natodefa" cloneof="natodef" romof="natodef" sampleof="natodef"> + <game name="natodefa" sourcefile="thief.c" cloneof="natodef" romof="natodef" sampleof="natodef"> <description>NATO Defense (alternate mazes)</description> <year>1982</year> <manufacturer>Pacific Novelty</manufacturer> @@ -298265,9 +298677,9 @@ <dipvalue name="I/O Board Test"/> <dipvalue name="Reserved"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mrflea"> + <game name="mrflea" sourcefile="mrflea.c"> <description>The Amazing Adventures of Mr. F. Lea</description> <year>1982</year> <manufacturer>Pacific Novelty</manufacturer> @@ -298360,9 +298772,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="holeland"> + <game name="holeland" sourcefile="holeland.c"> <description>Hole Land</description> <year>1984</year> <manufacturer>Tecfri</manufacturer> @@ -298442,9 +298854,9 @@ <dipvalue name="Stop"/> <dipvalue name="Play" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="crzrally"> + <game name="crzrally" sourcefile="holeland.c"> <description>Crazy Rally</description> <year>1985</year> <manufacturer>Tecfri</manufacturer> @@ -298520,9 +298932,9 @@ <dipvalue name="Stop"/> <dipvalue name="Play" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="speedbal"> + <game name="speedbal" sourcefile="speedbal.c"> <description>Speed Ball</description> <year>1987</year> <manufacturer>Tecfri</manufacturer> @@ -298593,9 +299005,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="sauro"> + <game name="sauro" sourcefile="sauro.c"> <description>Sauro</description> <year>1987</year> <manufacturer>Tecfri</manufacturer> @@ -298673,9 +299085,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="trckydoc"> + <game name="trckydoc" sourcefile="sauro.c"> <description>Tricky Doc</description> <year>1987</year> <manufacturer>Tecfri</manufacturer> @@ -298750,9 +299162,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="karatour"> + <game name="karatour" sourcefile="metro.c"> <description>The Karate Tournament</description> <year>1992</year> <manufacturer>Mitchell</manufacturer> @@ -298822,9 +299234,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="ladykill"> + <game name="ladykill" sourcefile="metro.c"> <description>Lady Killer</description> <manufacturer>Yanyaka (Mitchell license)</manufacturer> <rom name="e2.bin" size="262144" crc="211a4865" sha1="4315c0a708383d357d8dd89a1820fe6cf7652adb" region="cpu1" offset="0"/> @@ -298893,9 +299305,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="moegonta" cloneof="ladykill" romof="ladykill"> + <game name="moegonta" sourcefile="metro.c" cloneof="ladykill" romof="ladykill"> <description>Moeyo Gonta!! (Japan)</description> <manufacturer>Yanyaka</manufacturer> <rom name="j2.8g" size="262144" crc="aa18d130" sha1="6e0fd3b95d8589665b418bcae4fe64b288289c78" region="cpu1" offset="0"/> @@ -298964,9 +299376,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="pangpoms"> + <game name="pangpoms" sourcefile="metro.c"> <description>Pang Poms</description> <year>1992</year> <manufacturer>Metro</manufacturer> @@ -299038,9 +299450,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="pangpomm" cloneof="pangpoms" romof="pangpoms"> + <game name="pangpomm" sourcefile="metro.c" cloneof="pangpoms" romof="pangpoms"> <description>Pang Poms (Mitchell)</description> <year>1992</year> <manufacturer>Metro (Mitchell license)</manufacturer> @@ -299112,9 +299524,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="skyalert"> + <game name="skyalert" sourcefile="metro.c"> <description>Sky Alert</description> <year>1992</year> <manufacturer>Metro</manufacturer> @@ -299186,9 +299598,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="poitto"> + <game name="poitto" sourcefile="metro.c"> <description>Poitto!</description> <year>1993</year> <manufacturer>Metro / Able Corp.</manufacturer> @@ -299260,9 +299672,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="dharma"> + <game name="dharma" sourcefile="metro.c"> <description>Dharma Doujou</description> <year>1994</year> <manufacturer>Metro</manufacturer> @@ -299328,9 +299740,9 @@ </dipswitch> <dipswitch name="Freeze"> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="lastfort"> + <game name="lastfort" sourcefile="metro.c"> <description>Last Fortress - Toride</description> <year>1994</year> <manufacturer>Metro</manufacturer> @@ -299405,9 +299817,9 @@ <dipswitch name="Tiles"> <dipvalue name="Mahjong" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="lastfero" cloneof="lastfort" romof="lastfort"> + <game name="lastfero" sourcefile="metro.c" cloneof="lastfort" romof="lastfort"> <description>Last Fortress - Toride (Erotic)</description> <year>1994</year> <manufacturer>Metro</manufacturer> @@ -299483,9 +299895,9 @@ <dipvalue name="Mahjong" default="yes"/> <dipvalue name="Cards"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="toride2g"> + <game name="toride2g" sourcefile="metro.c"> <description>Toride II Adauchi Gaiden</description> <year>1994</year> <manufacturer>Metro</manufacturer> @@ -299557,9 +299969,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="daitorid"> + <game name="daitorid" sourcefile="metro.c"> <description>Daitoride</description> <year>1995</year> <manufacturer>Metro</manufacturer> @@ -299631,9 +300043,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="dokyusei"> + <game name="dokyusei" sourcefile="metro.c"> <description>Mahjong Doukyuusei</description> <year>1995</year> <manufacturer>Make Software / Elf / Media Trading</manufacturer> @@ -299708,9 +300120,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="dokyusp"> + <game name="dokyusp" sourcefile="metro.c"> <description>Mahjong Doukyuusei Special</description> <year>1995</year> <manufacturer>Make Software / Elf / Media Trading</manufacturer> @@ -299727,9 +300139,9 @@ <video screen="raster" orientation="horizontal" width="384" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="puzzli"> + <game name="puzzli" sourcefile="metro.c"> <description>Puzzli</description> <year>1995</year> <manufacturer>Metro / Banpresto</manufacturer> @@ -299800,9 +300212,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="3kokushi"> + <game name="3kokushi" sourcefile="metro.c"> <description>Sankokushi (Japan)</description> <year>1996</year> <manufacturer>Mitchell</manufacturer> @@ -299874,9 +300286,9 @@ <dipvalue name="3" default="yes"/> <dipvalue name="4"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="pururun"> + <game name="pururun" sourcefile="metro.c"> <description>Pururun</description> <year>1995</year> <manufacturer>Metro / Banpresto</manufacturer> @@ -299948,9 +300360,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8192"/> </game> - <game name="balcube"> + <game name="balcube" sourcefile="metro.c"> <description>Bal Cube</description> <year>1996</year> <manufacturer>Metro</manufacturer> @@ -300023,9 +300435,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="mouja"> + <game name="mouja" sourcefile="metro.c"> <description>Mouja (Japan)</description> <year>1996</year> <manufacturer>Etona</manufacturer> @@ -300100,9 +300512,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="bangball"> + <game name="bangball" sourcefile="metro.c"> <description>Bang Bang Ball (v1.05)</description> <year>1996</year> <manufacturer>Banpresto / Kunihiko Tashiro+Goodhouse</manufacturer> @@ -300173,9 +300585,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="gakusai"> + <game name="gakusai" sourcefile="metro.c"> <description>Mahjong Gakuensai (Japan)</description> <year>1997</year> <manufacturer>MakeSoft</manufacturer> @@ -300196,9 +300608,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="gakusai2"> + <game name="gakusai2" sourcefile="metro.c"> <description>Mahjong Gakuensai 2 (Japan)</description> <year>1998</year> <manufacturer>MakeSoft</manufacturer> @@ -300219,9 +300631,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="2"/> <input players="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="blzntrnd"> + <game name="blzntrnd" sourcefile="metro.c"> <description>Blazing Tornado</description> <year>1994</year> <manufacturer>Human Amusement</manufacturer> @@ -300357,9 +300769,9 @@ <dipvalue name="4:00"/> <dipvalue name="5:00"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="gstrik2"> + <game name="gstrik2" sourcefile="metro.c"> <description>Grand Striker 2 (Japan)</description> <year>1996</year> <manufacturer>Human Amusement</manufacturer> @@ -300509,9 +300921,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="8192"/> </game> - <game name="hyprduel"> + <game name="hyprduel" sourcefile="hyprduel.c"> <description>Hyper Duel (World)</description> <year>1993</year> <manufacturer>Technosoft</manufacturer> @@ -300577,9 +300989,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="8192"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="hyprdelj" cloneof="hyprduel" romof="hyprduel"> + <game name="hyprdelj" sourcefile="hyprduel.c" cloneof="hyprduel" romof="hyprduel"> <description>Hyper Duel (Japan)</description> <year>1993</year> <manufacturer>Technosoft</manufacturer> @@ -300645,9 +301057,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="spcforce"> + <game name="spcforce" sourcefile="spcforce.c"> <description>Space Force</description> <year>1980</year> <manufacturer>Venture Line</manufacturer> @@ -300701,9 +301113,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="8"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spcforc2" cloneof="spcforce" romof="spcforce"> + <game name="spcforc2" sourcefile="spcforce.c" cloneof="spcforce" romof="spcforce"> <description>Space Force (set 2)</description> <manufacturer>Elcon (bootleg?)</manufacturer> <rom name="spacefor.1a" size="2048" crc="ef6fdccb" sha1="2fff28437597958b39a821f93ac30f32c24f50aa" region="cpu1" offset="0"/> @@ -300756,9 +301168,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="8"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="8"/> </game> - <game name="meteor" cloneof="spcforce" romof="spcforce"> + <game name="meteor" sourcefile="spcforce.c" cloneof="spcforce" romof="spcforce"> <description>Meteoroids</description> <year>1981</year> <manufacturer>Venture Line</manufacturer> @@ -300812,9 +301224,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="8"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="8"/> </game> - <game name="looping"> + <game name="looping" sourcefile="looping.c"> <description>Looping (set 1)</description> <year>1982</year> <manufacturer>Venture Line</manufacturer> @@ -300863,9 +301275,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="loopinga" cloneof="looping" romof="looping"> + <game name="loopinga" sourcefile="looping.c" cloneof="looping" romof="looping"> <description>Looping (set 2)</description> <year>1982</year> <manufacturer>Venture Line</manufacturer> @@ -300915,9 +301327,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="skybump"> + <game name="skybump" sourcefile="looping.c"> <description>Sky Bumper</description> <year>1982</year> <manufacturer>Venture Line</manufacturer> @@ -300967,9 +301379,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="paradise"> + <game name="paradise" sourcefile="paradise.c"> <description>Paradise</description> <manufacturer>Yun Sung</manufacturer> <rom name="u128" size="262144" crc="8e5b5a24" sha1="a4e559d9329f8a7a9d12cd90d98d0525958085d8" region="cpu1" offset="0"/> @@ -301044,9 +301456,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2064"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2064"/> </game> - <game name="tgtball"> + <game name="tgtball" sourcefile="paradise.c"> <description>Target Ball</description> <manufacturer>Yun Sung</manufacturer> <rom name="rom7.bin" size="262144" crc="8dbeab12" sha1="7181c23459990aecbe2d13377aaf19f65108eac6" region="cpu1" offset="0"/> @@ -301120,9 +301532,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="2064"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="2064"/> </game> - <game name="cannball"> + <game name="cannball" sourcefile="yunsung8.c"> <description>Cannon Ball</description> <year>1995</year> <manufacturer>Yun Sung / Soft Vision</manufacturer> @@ -301197,9 +301609,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="magix"> + <game name="magix" sourcefile="yunsung8.c"> <description>Magix / Rock</description> <year>1995</year> <manufacturer>Yun Sung</manufacturer> @@ -301276,9 +301688,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="magicbub"> + <game name="magicbub" sourcefile="yunsun16.c"> <description>Magic Bubble</description> <manufacturer>Yun Sung</manufacturer> <rom name="magbuble.u33" size="262144" crc="18fdd582" sha1="89f4c52ec0e213285a04743da88f6e39408b573d" region="cpu1" offset="0"/> @@ -301356,9 +301768,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="shocking"> + <game name="shocking" sourcefile="yunsun16.c"> <description>Shocking</description> <year>1997</year> <manufacturer>Yun Sung</manufacturer> @@ -301434,9 +301846,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="blueprnt"> + <game name="blueprnt" sourcefile="blueprnt.c"> <description>Blue Print (Midway)</description> <year>1982</year> <manufacturer>[Zilec Electronics] Bally Midway</manufacturer> @@ -301519,9 +301931,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="blueprnj" cloneof="blueprnt" romof="blueprnt"> + <game name="blueprnj" sourcefile="blueprnt.c" cloneof="blueprnt" romof="blueprnt"> <description>Blue Print (Jaleco)</description> <year>1982</year> <manufacturer>[Zilec Electronics] Jaleco</manufacturer> @@ -301604,9 +302016,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="saturn"> + <game name="saturn" sourcefile="blueprnt.c"> <description>Saturn</description> <year>1983</year> <manufacturer>[Zilec Electronics] Jaleco</manufacturer> @@ -301692,9 +302104,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="gogomile"> + <game name="gogomile" sourcefile="fuukifg2.c"> <description>Go Go! Mile Smile</description> <year>1995</year> <manufacturer>Fuuki</manufacturer> @@ -301769,9 +302181,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8192"/> </game> - <game name="gogomilj" cloneof="gogomile" romof="gogomile"> + <game name="gogomilj" sourcefile="fuukifg2.c" cloneof="gogomile" romof="gogomile"> <description>Susume! Mile Smile (Japan)</description> <year>1995</year> <manufacturer>Fuuki</manufacturer> @@ -301846,9 +302258,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8192"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8192"/> </game> - <game name="pbancho"> + <game name="pbancho" sourcefile="fuukifg2.c"> <description>Gyakuten!! Puzzle Bancho (Japan)</description> <year>1996</year> <manufacturer>Fuuki</manufacturer> @@ -301918,9 +302330,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="asurabld"> + <game name="asurabld" sourcefile="fuukifg3.c"> <description>Asura Blade - Sword of Dynasty (Japan)</description> <year>1998</year> <manufacturer>Fuuki</manufacturer> @@ -302017,9 +302429,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="drgnmst"> + <game name="drgnmst" sourcefile="drgnmst.c"> <description>Dragon Master</description> <year>1994</year> <manufacturer>Unico</manufacturer> @@ -302098,9 +302510,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="burglarx"> + <game name="burglarx" sourcefile="unico.c"> <description>Burglar X</description> <year>1997</year> <manufacturer>Unico</manufacturer> @@ -302183,9 +302595,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="zeropnt"> + <game name="zeropnt" sourcefile="unico.c"> <description>Zero Point (set 1)</description> <year>1998</year> <manufacturer>Unico</manufacturer> @@ -302263,9 +302675,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="zeropnta" cloneof="zeropnt" romof="zeropnt"> + <game name="zeropnta" sourcefile="unico.c" cloneof="zeropnt" romof="zeropnt"> <description>Zero Point (set 2)</description> <year>1998</year> <manufacturer>Unico</manufacturer> @@ -302343,9 +302755,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="zeropnt2"> + <game name="zeropnt2" sourcefile="unico.c"> <description>Zero Point 2</description> <year>1999</year> <manufacturer>Unico</manufacturer> @@ -302420,9 +302832,9 @@ <dipvalue name="Harder"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="silkroad"> + <game name="silkroad" sourcefile="silkroad.c"> <description>The Legend of Silkroad</description> <year>1999</year> <manufacturer>Unico</manufacturer> @@ -302509,9 +302921,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="stagger1"> + <game name="stagger1" sourcefile="afega.c"> <description>Stagger I (Japan)</description> <year>1998</year> <manufacturer>Afega</manufacturer> @@ -302583,9 +302995,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="redhawk" cloneof="stagger1" romof="stagger1"> + <game name="redhawk" sourcefile="afega.c" cloneof="stagger1" romof="stagger1"> <description>Red Hawk (US)</description> <year>1997</year> <manufacturer>Afega</manufacturer> @@ -302657,9 +303069,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="grdnstrm"> + <game name="grdnstrm" sourcefile="afega.c"> <description>Sen Jin - Guardian Storm (Korea)</description> <year>1998</year> <manufacturer>Afega</manufacturer> @@ -302732,9 +303144,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="bubl2000"> + <game name="bubl2000" sourcefile="afega.c"> <description>Bubble 2000</description> <year>1998</year> <manufacturer>Tuning</manufacturer> @@ -302812,9 +303224,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="768"/> </game> - <game name="multchmp"> + <game name="multchmp" sourcefile="esd16.c"> <description>Multi Champ (Korea)</description> <year>1998</year> <manufacturer>ESD</manufacturer> @@ -302895,9 +303307,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="hedpanic"> + <game name="hedpanic" sourcefile="esd16.c"> <description>Head Panic (Korea?)</description> <year>2000</year> <manufacturer>ESD / Fuuki</manufacturer> @@ -302917,9 +303329,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="2" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="royalmah"> + <game name="royalmah" sourcefile="royalmah.c"> <description>Royal Mahjong (Japan)</description> <year>1982</year> <manufacturer>Falcon</manufacturer> @@ -302969,9 +303381,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="suzume"> + <game name="suzume" sourcefile="royalmah.c"> <description>Watashiha Suzumechan (Japan)</description> <year>1986</year> <manufacturer>Dyna Electronics</manufacturer> @@ -303111,9 +303523,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="32"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hnayayoi"> + <game name="hnayayoi" sourcefile="hnayayoi.c"> <description>Hana Yayoi (Japan)</description> <year>1987</year> <manufacturer>Dyna Electronics</manufacturer> @@ -303225,9 +303637,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dondenmj"> + <game name="dondenmj" sourcefile="royalmah.c"> <description>Don Den Mahjong [BET] (Japan)</description> <year>1986</year> <manufacturer>Dyna Electronics</manufacturer> @@ -303361,9 +303773,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hnfubuki" cloneof="hnayayoi" romof="hnayayoi"> + <game name="hnfubuki" sourcefile="hnayayoi.c" cloneof="hnayayoi" romof="hnayayoi"> <description>Hana Fubuki [BET] (Japan)</description> <year>1987</year> <manufacturer>Dynax</manufacturer> @@ -303473,9 +303885,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mjdiplob"> + <game name="mjdiplob" sourcefile="royalmah.c"> <description>Mahjong Diplomat [BET] (Japan)</description> <year>1987</year> <manufacturer>Dynax</manufacturer> @@ -303583,9 +303995,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="untoucha"> + <game name="untoucha" sourcefile="hnayayoi.c"> <description>Untouchable (Japan)</description> <year>1987</year> <manufacturer>Dynax</manufacturer> @@ -303672,9 +304084,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="tontonb"> + <game name="tontonb" sourcefile="royalmah.c"> <description>Tonton [BET] (Japan)</description> <year>1987</year> <manufacturer>Dynax</manufacturer> @@ -303781,9 +304193,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hanamai"> + <game name="hanamai" sourcefile="dynax.c"> <description>Hana no Mai (Japan)</description> <year>1988</year> <manufacturer>Dynax</manufacturer> @@ -303870,9 +304282,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="majs101b"> + <game name="majs101b" sourcefile="royalmah.c"> <description>Mahjong Studio 101 [BET] (Japan)</description> <year>1988</year> <manufacturer>Dynax</manufacturer> @@ -304005,9 +304417,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="hnkochou" cloneof="hanamai" romof="hanamai"> + <game name="hnkochou" sourcefile="dynax.c" cloneof="hanamai" romof="hanamai"> <description>Hana Kochou [BET] (Japan)</description> <year>1989</year> <manufacturer>Dynax</manufacturer> @@ -304093,9 +304505,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mjderngr"> + <game name="mjderngr" sourcefile="royalmah.c"> <description>Mahjong Derringer (Japan)</description> <year>1989</year> <manufacturer>Dynax</manufacturer> @@ -304230,9 +304642,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="hnoridur"> + <game name="hnoridur" sourcefile="dynax.c"> <description>Hana Oriduru (Japan)</description> <year>1989</year> <manufacturer>Dynax</manufacturer> @@ -304378,9 +304790,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="drgpunch"> + <game name="drgpunch" sourcefile="dynax.c"> <description>Dragon Punch (Japan)</description> <year>1989</year> <manufacturer>Dynax</manufacturer> @@ -304453,9 +304865,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mjfriday"> + <game name="mjfriday" sourcefile="dynax.c"> <description>Mahjong Friday (Japan)</description> <year>1989</year> <manufacturer>Dynax</manufacturer> @@ -304532,9 +304944,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mjifb"> + <game name="mjifb" sourcefile="royalmah.c"> <description>Mahjong If [BET] (Japan)</description> <year>1990</year> <manufacturer>Dynax</manufacturer> @@ -304670,9 +305082,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="sprtmtch" cloneof="drgpunch" romof="drgpunch"> + <game name="sprtmtch" sourcefile="dynax.c" cloneof="drgpunch" romof="drgpunch"> <description>Sports Match</description> <year>1989</year> <manufacturer>Dynax (Fabtek license)</manufacturer> @@ -304740,9 +305152,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="maya"> + <game name="maya" sourcefile="dynax.c"> <description>Maya</description> <year>1994</year> <manufacturer>Promat</manufacturer> @@ -304812,9 +305224,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="roldfrog"> + <game name="roldfrog" sourcefile="dynax.c"> <description>The Return of Lady Frog</description> <year>1993</year> <manufacturer>Microhard</manufacturer> @@ -304890,9 +305302,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="roldfrga" cloneof="roldfrog" romof="roldfrog"> + <game name="roldfrga" sourcefile="dynax.c" cloneof="roldfrog" romof="roldfrog"> <description>The Return of Lady Frog (set 2)</description> <year>1993</year> <manufacturer>Microhard</manufacturer> @@ -304968,9 +305380,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="mcnpshnt"> + <game name="mcnpshnt" sourcefile="dynax.c"> <description>Mahjong Campus Hunting (Japan)</description> <year>1990</year> <manufacturer>Dynax</manufacturer> @@ -305052,9 +305464,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="7jigen"> + <game name="7jigen" sourcefile="dynax.c"> <description>7jigen no Youseitachi - Mahjong 7 Dimensions (Japan)</description> <year>1990</year> <manufacturer>Dynax</manufacturer> @@ -305172,9 +305584,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="mjdialq2"> + <game name="mjdialq2" sourcefile="dynax.c"> <description>Mahjong Dial Q2 (Japan)</description> <year>1991</year> <manufacturer>Dynax</manufacturer> @@ -305256,9 +305668,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="512"/> </game> - <game name="yarunara"> + <game name="yarunara" sourcefile="dynax.c"> <description>Mahjong Yarunara (Japan)</description> <year>1991</year> <manufacturer>Dynax</manufacturer> @@ -305340,9 +305752,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mjangels"> + <game name="mjangels" sourcefile="dynax.c"> <description>Mahjong Angels - Comic Theater Vol.2 (Japan)</description> <year>1991</year> <manufacturer>Dynax</manufacturer> @@ -305420,9 +305832,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="4096"/> </game> - <game name="quiztvqq"> + <game name="quiztvqq" sourcefile="dynax.c"> <description>Quiz TV Gassyuukoku Q&Q (Japan)</description> <year>1992</year> <manufacturer>Dynax</manufacturer> @@ -305502,9 +305914,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mmpanic"> + <game name="mmpanic" sourcefile="ddenlovr.c"> <description>Monkey Mole Panic (USA)</description> <year>1992</year> <manufacturer>Nakanihon + East Technology (Taito license)</manufacturer> @@ -305608,9 +306020,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="quizchq"> + <game name="quizchq" sourcefile="ddenlovr.c"> <description>Quiz Channel Question (Ver 1.00) (Japan)</description> <year>1993</year> <manufacturer>Nakanihon</manufacturer> @@ -305704,9 +306116,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="256"/> </game> - <game name="quizchql" cloneof="quizchq" romof="quizchq"> + <game name="quizchql" sourcefile="ddenlovr.c" cloneof="quizchq" romof="quizchq"> <description>Quiz Channel Question (Ver 1.23) (Taiwan?)</description> <year>1993</year> <manufacturer>Nakanihon (Laxan license)</manufacturer> @@ -305802,9 +306214,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="256"/> </game> - <game name="quiz365"> + <game name="quiz365" sourcefile="ddenlovr.c"> <description>Quiz 365 (Hong Kong & Taiwan)</description> <year>1994</year> <manufacturer>Nakanihon</manufacturer> @@ -305903,9 +306315,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="rongrong"> + <game name="rongrong" sourcefile="ddenlovr.c"> <description>Rong Rong (Germany)</description> <year>1994</year> <manufacturer>Nakanihon</manufacturer> @@ -306002,9 +306414,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="nettoqc"> + <game name="nettoqc" sourcefile="ddenlovr.c"> <description>Nettoh Quiz Champion (Japan)</description> <year>1995</year> <manufacturer>Nakanihon</manufacturer> @@ -306102,9 +306514,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ddenlovr"> + <game name="ddenlovr" sourcefile="ddenlovr.c"> <description>Don Den Lover Vol. 1 (Hong Kong)</description> <year>1996</year> <manufacturer>Dynax</manufacturer> @@ -306154,9 +306566,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hanakanz"> + <game name="hanakanz" sourcefile="ddenlovr.c"> <description>Hanakanzashi (Japan)</description> <year>1996</year> <manufacturer>Dynax</manufacturer> @@ -306254,9 +306666,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="realbrk"> + <game name="realbrk" sourcefile="realbrk.c"> <description>Billiard Academy Real Break (Japan)</description> <year>1998</year> <manufacturer>Nakanihon</manufacturer> @@ -306338,9 +306750,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="nyny"> + <game name="nyny" sourcefile="nyny.c"> <description>New York New York</description> <year>1980</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -306426,9 +306838,9 @@ <dipvalue name="-2"/> <dipvalue name="-3"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="8"/> </game> - <game name="nynyg" cloneof="nyny" romof="nyny"> + <game name="nynyg" sourcefile="nyny.c" cloneof="nyny" romof="nyny"> <description>New York New York (Gottlieb)</description> <year>1980</year> <manufacturer>Sigma Enterprises Inc. (Gottlieb license)</manufacturer> @@ -306514,9 +306926,9 @@ <dipvalue name="-2"/> <dipvalue name="-3"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="8"/> </game> - <game name="arcadia" cloneof="nyny" romof="nyny"> + <game name="arcadia" sourcefile="nyny.c" cloneof="nyny" romof="nyny"> <description>Waga Seishun no Arcadia</description> <year>1980</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -306602,9 +307014,9 @@ <dipvalue name="-2"/> <dipvalue name="-3"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="8"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="8"/> </game> - <game name="r2dtank"> + <game name="r2dtank" sourcefile="r2dtank.c"> <description>R2D Tank</description> <year>1980</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -306712,9 +307124,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="spiders"> + <game name="spiders" sourcefile="spiders.c"> <description>Spiders (set 1)</description> <year>1981</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -306797,9 +307209,9 @@ <dipvalue name="6"/> <dipvalue name="7"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="spiders2" cloneof="spiders" romof="spiders"> + <game name="spiders2" sourcefile="spiders.c" cloneof="spiders" romof="spiders"> <description>Spiders (set 2)</description> <year>1981</year> <manufacturer>Sigma Enterprises Inc.</manufacturer> @@ -306882,9 +307294,9 @@ <dipvalue name="6"/> <dipvalue name="7"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="iqblock"> + <game name="iqblock" sourcefile="iqblock.c"> <description>IQ-Block</description> <year>1993</year> <manufacturer>IGS</manufacturer> @@ -306956,9 +307368,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="grndtour"> + <game name="grndtour" sourcefile="iqblock.c"> <description>Grand Tour</description> <year>1993</year> <manufacturer>IGS</manufacturer> @@ -307030,9 +307442,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="cabaret"> + <game name="cabaret" sourcefile="iqblock.c"> <description>Cabaret</description> <manufacturer>IGS</manufacturer> <rom name="cg-8v204.u97" size="65536" crc="44cebf77" sha1="e3f4e4abf41388f0eed50cf9a0fd0b14aa2f8b93" region="cpu1" offset="0"/> @@ -307104,9 +307516,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="1024"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="chindrag"> + <game name="chindrag" sourcefile="chindrag.c"> <description>China Dragon / Dragon World</description> <year>1994</year> <manufacturer>IGS</manufacturer> @@ -307118,9 +307530,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="grtwall"> + <game name="grtwall" sourcefile="grtwall.c"> <description>The Great Wall</description> <year>1994</year> <manufacturer>IGS</manufacturer> @@ -307131,9 +307543,9 @@ <video screen="raster" orientation="horizontal" width="320" height="232" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="orlegend" romof="pgm"> + <game name="orlegend" sourcefile="pgm.c" romof="pgm"> <description>Oriental Legend / Xi Yo Gi Shi Re Zuang (ver. 126)</description> <year>1997</year> <manufacturer>IGS</manufacturer> @@ -307191,9 +307603,9 @@ <dipvalue name="Korea"/> <dipvalue name="China"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="orlegnde" cloneof="orlegend" romof="orlegend"> + <game name="orlegnde" sourcefile="pgm.c" cloneof="orlegend" romof="orlegend"> <description>Oriental Legend / Xi Yo Gi Shi Re Zuang (ver. 112)</description> <year>1997</year> <manufacturer>IGS</manufacturer> @@ -307251,9 +307663,9 @@ <dipvalue name="Korea"/> <dipvalue name="China"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="orlegndc" cloneof="orlegend" romof="orlegend"> + <game name="orlegndc" sourcefile="pgm.c" cloneof="orlegend" romof="orlegend"> <description>Oriental Legend / Xi Yo Gi Shi Re Zuang (ver. 112, Chinese Board)</description> <year>1997</year> <manufacturer>IGS</manufacturer> @@ -307311,9 +307723,9 @@ <dipvalue name="Korea"/> <dipvalue name="China"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="dragwld2" romof="pgm"> + <game name="dragwld2" sourcefile="pgm.c" romof="pgm"> <description>Zhong Guo Long II (ver. 100C, China)</description> <year>1997</year> <manufacturer>IGS</manufacturer> @@ -307363,9 +307775,9 @@ <dipvalue name="Korea"/> <dipvalue name="China"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="kov" romof="pgm"> + <game name="kov" sourcefile="pgm.c" romof="pgm"> <description>Knights of Valour / Sangoku Senki (ver. 117)</description> <year>1999</year> <manufacturer>IGS</manufacturer> @@ -307423,9 +307835,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="kovplus" cloneof="kov" romof="kov"> + <game name="kovplus" sourcefile="pgm.c" cloneof="kov" romof="kov"> <description>Knights of Valour Plus / Sangoku Senki Plus (ver. 119)</description> <year>1999</year> <manufacturer>IGS</manufacturer> @@ -307483,9 +307895,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="kov115" cloneof="kov" romof="kov"> + <game name="kov115" sourcefile="pgm.c" cloneof="kov" romof="kov"> <description>Knights of Valour / Sangoku Senki (ver. 115)</description> <year>1999</year> <manufacturer>IGS</manufacturer> @@ -307543,9 +307955,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2304"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="kovsh" cloneof="kov" romof="kov"> + <game name="kovsh" sourcefile="pgm.c" cloneof="kov" romof="kov"> <description>Knights of Valour Superheroes / Sangoku Senki Superheroes (ver. 322)</description> <year>1999</year> <manufacturer>IGS</manufacturer> @@ -307603,9 +308015,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2304"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="photoy2k" romof="pgm"> + <game name="photoy2k" sourcefile="pgm.c" romof="pgm"> <description>Photo Y2K</description> <year>1999</year> <manufacturer>IGS</manufacturer> @@ -307665,9 +308077,9 @@ <dipvalue name="Hong Kong"/> <dipvalue name="World" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="2304"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="imperfect" palettesize="2304"/> </game> - <game name="hitme"> + <game name="hitme" sourcefile="hitme.c"> <description>Hit Me</description> <year>1976</year> <manufacturer>RamTek</manufacturer> @@ -307704,9 +308116,9 @@ <dipvalue name="35 Hands"/> <dipvalue name="40 Hands"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2"/> </game> - <game name="mblkjack" cloneof="hitme" romof="hitme"> + <game name="mblkjack" sourcefile="hitme.c" cloneof="hitme" romof="hitme"> <description>Black Jack (Mirco)</description> <manufacturer>Mirco</manufacturer> <rom name="mirco1.bin" size="512" crc="aa796ad7" sha1="2908bdb4ab17a2f5bc4da2f957906bf2b57afa50" region="cpu1" offset="0"/> @@ -307742,9 +308154,9 @@ <dipvalue name="35 Hands"/> <dipvalue name="40 Hands"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2"/> </game> - <game name="barricad"> + <game name="barricad" sourcefile="hitme.c"> <description>Barricade</description> <year>1976</year> <manufacturer>RamTek</manufacturer> @@ -307777,9 +308189,9 @@ <dipvalue name="2"/> <dipvalue name="Slow Slow"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="brickyrd" cloneof="barricad" romof="barricad"> + <game name="brickyrd" sourcefile="hitme.c" cloneof="barricad" romof="barricad"> <description>Brickyard</description> <year>1976</year> <manufacturer>RamTek</manufacturer> @@ -307812,9 +308224,9 @@ <dipvalue name="2"/> <dipvalue name="Slow Slow"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="starcrus"> + <game name="starcrus" sourcefile="starcrus.c"> <description>Star Cruiser</description> <year>1977</year> <manufacturer>RamTek</manufacturer> @@ -307853,9 +308265,9 @@ <dipvalue name="Standard" default="yes"/> <dipvalue name="Alternate"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2"/> </game> - <game name="battlex"> + <game name="battlex" sourcefile="battlex.c"> <description>Battle Cross</description> <year>1982</year> <manufacturer>Omori Electric</manufacturer> @@ -307918,8 +308330,8 @@ <dipvalue name="5"/> </dipswitch> <dipswitch name="Bonus Life"> - <dipvalue name="5000" default="yes"/> - <dipvalue name="10000"/> + <dipvalue name="5000"/> + <dipvalue name="10000" default="yes"/> <dipvalue name="15000"/> <dipvalue name="20000"/> </dipswitch> @@ -307927,9 +308339,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="192"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="192"/> </game> - <game name="carjmbre"> + <game name="carjmbre" sourcefile="carjmbre.c"> <description>Car Jamboree</description> <year>1983</year> <manufacturer>Omori Electric Co., Ltd.</manufacturer> @@ -307985,9 +308397,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="64"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="64"/> </game> - <game name="popper"> + <game name="popper" sourcefile="popper.c"> <description>Popper</description> <year>1983</year> <manufacturer>Omori Electric Co., Ltd.</manufacturer> @@ -308059,9 +308471,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="64"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="64"/> </game> - <game name="speedspn"> + <game name="speedspn" sourcefile="speedspn.c"> <description>Speed Spin</description> <year>1994</year> <manufacturer>TCH</manufacturer> @@ -308142,9 +308554,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="kickgoal"> + <game name="kickgoal" sourcefile="kickgoal.c"> <description>Kick Goal</description> <year>1995</year> <manufacturer>TCH</manufacturer> @@ -308160,9 +308572,9 @@ <video screen="raster" orientation="horizontal" width="368" height="448" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="preliminary" palettesize="1024"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="1024"/> </game> - <game name="usg32"> + <game name="usg32" sourcefile="usgames.c"> <description>Super Duper Casino (California V3.2)</description> <year>1987</year> <manufacturer>U.S. Games</manufacturer> @@ -308267,9 +308679,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="usg82" cloneof="usg83" romof="usg83"> + <game name="usg82" sourcefile="usgames.c" cloneof="usg83" romof="usg83"> <description>Super Ten V8.2</description> <year>1988</year> <manufacturer>U.S. Games</manufacturer> @@ -308375,9 +308787,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="usg83"> + <game name="usg83" sourcefile="usgames.c"> <description>Super Ten V8.3</description> <year>1988</year> <manufacturer>U.S. Games</manufacturer> @@ -308483,9 +308895,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="usg83x" cloneof="usg83" romof="usg83"> + <game name="usg83x" sourcefile="usgames.c" cloneof="usg83" romof="usg83"> <description>Super Ten V8.3X</description> <year>1988</year> <manufacturer>U.S. Games</manufacturer> @@ -308591,9 +309003,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="usg185"> + <game name="usg185" sourcefile="usgames.c"> <description>Games V18.7C</description> <year>1991</year> <manufacturer>U.S. Games</manufacturer> @@ -308699,9 +309111,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="usg252"> + <game name="usg252" sourcefile="usgames.c"> <description>Games V25.4X</description> <year>1992</year> <manufacturer>U.S. Games</manufacturer> @@ -308807,9 +309219,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="mermaid"> + <game name="mermaid" sourcefile="mermaid.c"> <description>Mermaid</description> <year>1982</year> <manufacturer>[Sanritsu] Rock-ola</manufacturer> @@ -308897,9 +309309,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="rougien"> + <game name="rougien" sourcefile="mermaid.c"> <description>Rougien</description> <year>1982</year> <manufacturer>Sanritsu</manufacturer> @@ -308997,9 +309409,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="65"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="65"/> </game> - <game name="drmicro"> + <game name="drmicro" sourcefile="drmicro.c"> <description>Dr. Micro</description> <year>1983</year> <manufacturer>Sanritsu</manufacturer> @@ -309063,9 +309475,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="appoooh"> + <game name="appoooh" sourcefile="appoooh.c"> <description>Appoooh</description> <year>1984</year> <manufacturer>[Sanritsu] Sega</manufacturer> @@ -309128,9 +309540,9 @@ <dipvalue name="Easy" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="bankp"> + <game name="bankp" sourcefile="bankp.c"> <description>Bank Panic</description> <year>1984</year> <manufacturer>[Sanritsu] Sega</manufacturer> @@ -309186,9 +309598,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="mjkjidai"> + <game name="mjkjidai" sourcefile="mjkjidai.c"> <description>Mahjong Kyou Jidai (Japan)</description> <year>1986</year> <manufacturer>Sanritsu</manufacturer> @@ -309278,9 +309690,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="mayumi"> + <game name="mayumi" sourcefile="mayumi.c"> <description>Kikiippatsu Mayumi-chan (Japan)</description> <year>1988</year> <manufacturer>[Sanritsu] Victory L.L.C.</manufacturer> @@ -309361,9 +309773,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="btoads"> + <game name="btoads" sourcefile="btoads.c"> <description>Battle Toads</description> <year>1994</year> <manufacturer>Rare</manufacturer> @@ -309390,8 +309802,8 @@ <dipvalue name="On" default="yes"/> </dipswitch> <dipswitch name="Three Players"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> </dipswitch> <dipswitch name="Free Play"> <dipvalue name="Off" default="yes"/> @@ -309409,9 +309821,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="kinst"> + <game name="kinst" sourcefile="kinst.c"> <description>Killer Instinct (v1.0)</description> <year>1994</year> <manufacturer>Rare</manufacturer> @@ -309490,9 +309902,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="kinst2"> + <game name="kinst2" sourcefile="kinst.c"> <description>Killer Instinct 2 (v2.1)</description> <year>1994</year> <manufacturer>Rare</manufacturer> @@ -309571,9 +309983,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="gigasb"> + <game name="gigasb" sourcefile="freekick.c"> <description>Gigas (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -309663,9 +310075,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="gigasm2b"> + <game name="gigasm2b" sourcefile="freekick.c"> <description>Gigas Mark II (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -309756,9 +310168,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="oigas" cloneof="gigasb" romof="gigasb"> + <game name="oigas" sourcefile="freekick.c" cloneof="gigasb" romof="gigasb"> <description>Oigas (bootleg)</description> <year>1986</year> <manufacturer>bootleg</manufacturer> @@ -309849,9 +310261,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="pbillrd"> + <game name="pbillrd" sourcefile="freekick.c"> <description>Perfect Billiard</description> <year>1987</year> <manufacturer>Nihon System</manufacturer> @@ -309944,9 +310356,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="pbillrds" cloneof="pbillrd" romof="pbillrd"> + <game name="pbillrds" sourcefile="freekick.c" cloneof="pbillrd" romof="pbillrd"> <description>Perfect Billiard (Sega)</description> <year>1987</year> <manufacturer>Nihon System</manufacturer> @@ -310039,9 +310451,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="protection" color="good" sound="good" palettesize="512"/> + <driver status="protection" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="freekick"> + <game name="freekick" sourcefile="freekick.c"> <description>Free Kick</description> <year>1987</year> <manufacturer>Nihon System (Sega license)</manufacturer> @@ -310163,9 +310575,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="freekckb" cloneof="freekick" romof="freekick"> + <game name="freekckb" sourcefile="freekick.c" cloneof="freekick" romof="freekick"> <description>Free Kick (bootleg)</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -310287,9 +310699,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="countrun"> + <game name="countrun" sourcefile="freekick.c"> <description>Counter Run</description> <manufacturer>Nihon System (Sega license)</manufacturer> <rom name="countrun.cpu" size="65536" region="cpu1" status="nodump" offset="0"/> @@ -310410,9 +310822,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="countrnb" cloneof="countrun" romof="countrun"> + <game name="countrnb" sourcefile="freekick.c" cloneof="countrun" romof="countrun"> <description>Counter Run (bootleg)</description> <manufacturer>bootleg</manufacturer> <rom name="crunbl.8" size="65536" crc="318f95d9" sha1="f2386b9d26d1bc98728aad9e257363b381043dc9" region="cpu1" offset="0"/> @@ -310534,9 +310946,9 @@ <dipvalue name="1"/> <dipvalue name="2" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="512"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rmhaihai"> + <game name="rmhaihai" sourcefile="rmhaihai.c"> <description>Real Mahjong Haihai (Japan)</description> <year>1985</year> <manufacturer>Alba</manufacturer> @@ -310601,9 +311013,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rmhaihib" cloneof="rmhaihai" romof="rmhaihai"> + <game name="rmhaihib" sourcefile="rmhaihai.c" cloneof="rmhaihai" romof="rmhaihai"> <description>Real Mahjong Haihai [BET] (Japan)</description> <year>1985</year> <manufacturer>Alba</manufacturer> @@ -310682,9 +311094,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rmhaijin"> + <game name="rmhaijin" sourcefile="rmhaihai.c"> <description>Real Mahjong Haihai Jinji Idou Hen (Japan)</description> <year>1986</year> <manufacturer>Alba</manufacturer> @@ -310749,9 +311161,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="rmhaisei"> + <game name="rmhaisei" sourcefile="rmhaihai.c"> <description>Real Mahjong Haihai Seichouhen (Japan)</description> <year>1986</year> <manufacturer>Visco</manufacturer> @@ -310817,9 +311229,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="themj"> + <game name="themj" sourcefile="rmhaihai.c"> <description>The Mah-jong (Japan)</description> <year>1987</year> <manufacturer>Visco</manufacturer> @@ -310885,9 +311297,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="hanaroku"> + <game name="hanaroku" sourcefile="hanaroku.c"> <description>Hanaroku</description> <year>1988</year> <manufacturer>Alba</manufacturer> @@ -310925,9 +311337,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="512"/> + <driver status="good" color="imperfect" sound="good" graphic="imperfect" palettesize="512"/> </game> - <game name="yumefuda"> + <game name="yumefuda" sourcefile="yumefuda.c"> <description>(Medal) Yumefuda</description> <manufacturer>Alba</manufacturer> <rom name="zg004y02.u43" size="32768" crc="974c543c" sha1="56aeb318cb00445f133246dfddc8c24bb0c23f2d" region="cpu1" offset="0"/> @@ -311069,9 +311481,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="hourouki"> + <game name="hourouki" sourcefile="homedata.c"> <description>Mahjong Hourouki Part 1 - Seisyun Hen (Japan)</description> <year>1987</year> <manufacturer>Home Data</manufacturer> @@ -311154,9 +311566,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="mhgaiden"> + <game name="mhgaiden" sourcefile="homedata.c"> <description>Mahjong Hourouki Gaiden (Japan)</description> <year>1987</year> <manufacturer>Home Data</manufacturer> @@ -311239,9 +311651,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mjhokite"> + <game name="mjhokite" sourcefile="homedata.c"> <description>Mahjong Hourouki Okite (Japan)</description> <year>1988</year> <manufacturer>Home Data</manufacturer> @@ -311326,9 +311738,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mjclinic"> + <game name="mjclinic" sourcefile="homedata.c"> <description>Mahjong Clinic (Japan)</description> <year>1988</year> <manufacturer>Home Data</manufacturer> @@ -311413,9 +311825,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mrokumei"> + <game name="mrokumei" sourcefile="homedata.c"> <description>Mahjong Rokumeikan (Japan)</description> <year>1988</year> <manufacturer>Home Data</manufacturer> @@ -311500,9 +311912,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="reikaids"> + <game name="reikaids" sourcefile="homedata.c"> <description>Reikai Doushi (Japan)</description> <year>1988</year> <manufacturer>Home Data</manufacturer> @@ -311583,9 +311995,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mjkojink"> + <game name="mjkojink" sourcefile="homedata.c"> <description>Mahjong Kojinkyouju (Private Teacher) (Japan)</description> <year>1989</year> <manufacturer>Home Data</manufacturer> @@ -311655,9 +312067,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="vitaminc"> + <game name="vitaminc" sourcefile="homedata.c"> <description>Mahjong Vitamin C (Japan)</description> <year>1989</year> <manufacturer>Home Data</manufacturer> @@ -311727,9 +312139,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mjyougo"> + <game name="mjyougo" sourcefile="homedata.c"> <description>Mahjong-yougo no Kisotairyoku (Japan)</description> <year>1989</year> <manufacturer>Home Data</manufacturer> @@ -311799,9 +312211,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="lemnangl"> + <game name="lemnangl" sourcefile="homedata.c"> <description>Mahjong Lemon Angel (Japan)</description> <year>1990</year> <manufacturer>Home Data</manufacturer> @@ -311871,9 +312283,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mjkinjas"> + <game name="mjkinjas" sourcefile="homedata.c"> <description>Mahjong Kinjirareta Asobi (Japan)</description> <year>1991</year> <manufacturer>Home Data</manufacturer> @@ -311943,9 +312355,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="battlcry"> + <game name="battlcry" sourcefile="homedata.c"> <description>Battlecry</description> <year>1991</year> <manufacturer>Home Data</manufacturer> @@ -312006,9 +312418,9 @@ <dipvalue name="1 Coin/4 Credits"/> <dipvalue name="Free Play"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="32768"/> </game> - <game name="jogakuen"> + <game name="jogakuen" sourcefile="homedata.c"> <description>Mahjong Jogakuen (Japan)</description> <manufacturer>Windom</manufacturer> <rom name="a01.bin" size="65536" crc="a189490a" sha1="0d9f6389d4b16c3b885cdc8be20b19db25812aad" region="cpu1" offset="10000"/> @@ -312077,9 +312489,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mjikaga"> + <game name="mjikaga" sourcefile="homedata.c"> <description>Mahjong Ikaga Desu ka (Japan)</description> <manufacturer>Mitchell</manufacturer> <rom name="m15a01.bin" size="65536" crc="938cc4fb" sha1="f979c6eee0b72bf53be8c7ebbc4e1dc05bd447d4" region="cpu1" offset="10000"/> @@ -312148,9 +312560,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="32768"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="32768"/> </game> - <game name="ultennis"> + <game name="ultennis" sourcefile="artmagic.c"> <description>Ultimate Tennis</description> <year>1993</year> <manufacturer>Art & Magic</manufacturer> @@ -312218,9 +312630,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="cheesech"> + <game name="cheesech" sourcefile="artmagic.c"> <description>Cheese Chase</description> <year>1994</year> <manufacturer>Art & Magic</manufacturer> @@ -312287,9 +312699,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="stonebal"> + <game name="stonebal" sourcefile="artmagic.c"> <description>Stone Ball (4 Players)</description> <year>1994</year> <manufacturer>Art & Magic</manufacturer> @@ -312358,9 +312770,9 @@ <dipvalue name="4 Players" default="yes"/> <dipvalue name="2 Players"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="stoneba2" cloneof="stonebal" romof="stonebal"> + <game name="stoneba2" sourcefile="artmagic.c" cloneof="stonebal" romof="stonebal"> <description>Stone Ball (2 Players)</description> <year>1994</year> <manufacturer>Art & Magic</manufacturer> @@ -312429,9 +312841,9 @@ <dipvalue name="4 Players" default="yes"/> <dipvalue name="2 Players"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dynamski"> + <game name="dynamski" sourcefile="shangkid.c"> <description>Dynamic Ski</description> <year>1984</year> <manufacturer>Taiyo</manufacturer> @@ -312484,9 +312896,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="chinhero"> + <game name="chinhero" sourcefile="shangkid.c"> <description>Chinese Hero</description> <year>1984</year> <manufacturer>Taiyo</manufacturer> @@ -312554,9 +312966,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="chinher2" cloneof="chinhero" romof="chinhero"> + <game name="chinher2" sourcefile="shangkid.c" cloneof="chinhero" romof="chinhero"> <description>Chinese Hero (older)</description> <year>1984</year> <manufacturer>Taiyo</manufacturer> @@ -312620,9 +313032,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="shangkid"> + <game name="shangkid" sourcefile="shangkid.c"> <description>Shanghai Kid</description> <year>1985</year> <manufacturer>Taiyo (Data East license)</manufacturer> @@ -312697,9 +313109,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hiryuken" cloneof="shangkid" romof="shangkid"> + <game name="hiryuken" sourcefile="shangkid.c" cloneof="shangkid" romof="shangkid"> <description>Hokuha Syourin Hiryu no Ken</description> <year>1985</year> <manufacturer>[Nihon Game] (Taito license)</manufacturer> @@ -312772,9 +313184,9 @@ <dipvalue name="Hard"/> <dipvalue name="Hardest"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="astinvad" sampleof="invaders"> + <game name="astinvad" sourcefile="astinvad.c" sampleof="invaders"> <description>Astro Invader</description> <year>1980</year> <manufacturer>Stern</manufacturer> @@ -312818,9 +313230,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="kamikaze" cloneof="astinvad" romof="astinvad" sampleof="invaders"> + <game name="kamikaze" sourcefile="astinvad.c" cloneof="astinvad" romof="astinvad" sampleof="invaders"> <description>Kamikaze</description> <year>1979</year> <manufacturer>Leijac</manufacturer> @@ -312863,9 +313275,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spcking2" sampleof="invaders"> + <game name="spcking2" sourcefile="astinvad.c" sampleof="invaders"> <description>Space King 2</description> <year>1979</year> <manufacturer>Konami</manufacturer> @@ -312912,9 +313324,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spaceint" sampleof="invaders"> + <game name="spaceint" sourcefile="astinvad.c" sampleof="invaders"> <description>Space Intruder</description> <year>1980</year> <manufacturer>Shoei</manufacturer> @@ -312956,9 +313368,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="8"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="8"/> </game> - <game name="spacefb"> + <game name="spacefb" sourcefile="spacefb.c"> <description>Space Firebird (Nintendo)</description> <year>1980</year> <manufacturer>Nintendo</manufacturer> @@ -313001,9 +313413,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="32"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="spacefbg" cloneof="spacefb" romof="spacefb"> + <game name="spacefbg" sourcefile="spacefb.c" cloneof="spacefb" romof="spacefb"> <description>Space Firebird (Gremlin)</description> <year>1980</year> <manufacturer>Gremlin</manufacturer> @@ -313046,9 +313458,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="32"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="spacefbb" cloneof="spacefb" romof="spacefb"> + <game name="spacefbb" sourcefile="spacefb.c" cloneof="spacefb" romof="spacefb"> <description>Space Firebird (bootleg)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -313091,9 +313503,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="32"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="spacebrd" cloneof="spacefb" romof="spacefb"> + <game name="spacebrd" sourcefile="spacefb.c" cloneof="spacefb" romof="spacefb"> <description>Space Bird (bootleg)</description> <year>1980</year> <manufacturer>bootleg</manufacturer> @@ -313136,9 +313548,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="32"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="spacedem" cloneof="spacefb" romof="spacefb"> + <game name="spacedem" sourcefile="spacefb.c" cloneof="spacefb" romof="spacefb"> <description>Space Demon</description> <year>1980</year> <manufacturer>Nintendo (Fortrek license)</manufacturer> @@ -313183,9 +313595,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="imperfect" sound="imperfect" palettesize="32"/> + <driver status="good" color="imperfect" sound="imperfect" graphic="good" palettesize="32"/> </game> - <game name="omegrace"> + <game name="omegrace" sourcefile="omegrace.c"> <description>Omega Race</description> <year>1981</year> <manufacturer>Midway</manufacturer> @@ -313259,9 +313671,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="deltrace" cloneof="omegrace" romof="omegrace"> + <game name="deltrace" sourcefile="omegrace.c" cloneof="omegrace" romof="omegrace"> <description>Delta Race</description> <year>1981</year> <manufacturer>Allied Leisure</manufacturer> @@ -313335,9 +313747,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="dday"> + <game name="dday" sourcefile="dday.c"> <description>D-Day</description> <year>1982</year> <manufacturer>Olympia</manufacturer> @@ -313427,9 +313839,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ddayc" cloneof="dday" romof="dday"> + <game name="ddayc" sourcefile="dday.c" cloneof="dday" romof="dday"> <description>D-Day (Centuri)</description> <year>1982</year> <manufacturer>Olympia (Centuri license)</manufacturer> @@ -313516,9 +313928,9 @@ <dipvalue name="1 Coin/7 Credits"/> <dipvalue name="1 Coin/8 Credits"/> </dipswitch> - <driver status="good" color="imperfect" sound="good" palettesize="256"/> + <driver status="good" color="imperfect" sound="good" graphic="good" palettesize="256"/> </game> - <game name="hexa"> + <game name="hexa" sourcefile="hexa.c"> <description>Hexa</description> <manufacturer>D. R. Korea</manufacturer> <rom name="hexa.20" size="32768" crc="98b00586" sha1="3591a3b0486d720f0aaa9f0bf4be352cd0ffcbc7" region="cpu1" offset="0"/> @@ -313562,9 +313974,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="stactics"> + <game name="stactics" sourcefile="stactics.c"> <description>Space Tactics</description> <year>1981</year> <manufacturer>Sega</manufacturer> @@ -313630,9 +314042,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="16"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="16"/> </game> - <game name="exterm"> + <game name="exterm" sourcefile="exterm.c"> <description>Exterminator</description> <year>1989</year> <manufacturer>Gottlieb / Premier Technology</manufacturer> @@ -313698,9 +314110,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="36864"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="36864"/> </game> - <game name="kingofb"> + <game name="kingofb" sourcefile="kingobox.c"> <description>King of Boxer (English)</description> <year>1985</year> <manufacturer>Woodplace</manufacturer> @@ -313792,9 +314204,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="264"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="264"/> </game> - <game name="ringking" cloneof="kingofb" romof="kingofb"> + <game name="ringking" sourcefile="kingobox.c" cloneof="kingofb" romof="kingofb"> <description>Ring King (US set 1)</description> <year>1985</year> <manufacturer>Data East USA</manufacturer> @@ -313872,9 +314284,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="264"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="264"/> </game> - <game name="ringkin2" cloneof="kingofb" romof="kingofb"> + <game name="ringkin2" sourcefile="kingobox.c" cloneof="kingofb" romof="kingofb"> <description>Ring King (US set 2)</description> <year>1985</year> <manufacturer>Data East USA</manufacturer> @@ -313952,9 +314364,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="264"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="264"/> </game> - <game name="ringkin3" cloneof="kingofb" romof="kingofb"> + <game name="ringkin3" sourcefile="kingobox.c" cloneof="kingofb" romof="kingofb"> <description>Ring King (US set 3)</description> <year>1985</year> <manufacturer>Data East USA</manufacturer> @@ -314046,9 +314458,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="264"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="264"/> </game> - <game name="ambush"> + <game name="ambush" sourcefile="ambush.c"> <description>Ambush</description> <year>1983</year> <manufacturer>Nippon Amuse Co-Ltd</manufacturer> @@ -314096,9 +314508,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ambusht" cloneof="ambush" romof="ambush"> + <game name="ambusht" sourcefile="ambush.c" cloneof="ambush" romof="ambush"> <description>Ambush (Tecfri)</description> <year>1983</year> <manufacturer>Tecfri</manufacturer> @@ -314146,9 +314558,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="homo" cloneof="goindol" romof="goindol"> + <game name="homo" sourcefile="goindol.c" cloneof="goindol" romof="goindol"> <description>Homo</description> <year>1987</year> <manufacturer>bootleg</manufacturer> @@ -314225,9 +314637,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="dlair"> + <game name="dlair" sourcefile="dlair.c"> <description>Dragon's Lair</description> <year>1983</year> <manufacturer>Cinematronics</manufacturer> @@ -314240,9 +314652,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="1"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="8"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="aztarac"> + <game name="aztarac" sourcefile="aztarac.c"> <description>Aztarac</description> <year>1983</year> <manufacturer>Centuri</manufacturer> @@ -314269,9 +314681,9 @@ <video screen="vector" orientation="horizontal" aspectx="4" aspecty="3" refresh="40.000000"/> <sound channels="1"/> <input players="1" control="dial" buttons="2" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="mole"> + <game name="mole" sourcefile="mole.c"> <description>Mole Attack</description> <year>1982</year> <manufacturer>Yachiyo Electronics, Ltd.</manufacturer> @@ -314321,9 +314733,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="thehand"> + <game name="thehand" sourcefile="gotya.c"> <description>The Hand</description> <year>1981</year> <manufacturer>T.I.C.</manufacturer> @@ -314392,9 +314804,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="gotya" cloneof="thehand" romof="thehand" sampleof="thehand"> + <game name="gotya" sourcefile="gotya.c" cloneof="thehand" romof="thehand" sampleof="thehand"> <description>Got-Ya (12/24/1981, prototype?)</description> <year>1981</year> <manufacturer>Game-A-Tron</manufacturer> @@ -314463,9 +314875,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="8"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="mrjong"> + <game name="mrjong" sourcefile="mrjong.c"> <description>Mr. Jong (Japan)</description> <year>1983</year> <manufacturer>Kiwako</manufacturer> @@ -314511,9 +314923,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="crazyblk" cloneof="mrjong" romof="mrjong"> + <game name="crazyblk" sourcefile="mrjong.c" cloneof="mrjong" romof="mrjong"> <description>Crazy Blocks</description> <year>1983</year> <manufacturer>Kiwako (ECI license)</manufacturer> @@ -314559,9 +314971,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="blkbustr" cloneof="mrjong" romof="mrjong"> + <game name="blkbustr" sourcefile="mrjong.c" cloneof="mrjong" romof="mrjong"> <description>BlockBuster</description> <year>1983</year> <manufacturer>Kiwako (ECI license)</manufacturer> @@ -314607,9 +315019,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/3 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="16"/> </game> - <game name="polyplay"> + <game name="polyplay" sourcefile="polyplay.c"> <description>Poly-Play</description> <year>1985</year> <manufacturer>VEB Polytechnik Karl-Marx-Stadt</manufacturer> @@ -314654,9 +315066,9 @@ <video screen="raster" orientation="horizontal" width="512" height="256" aspectx="4" aspecty="3" refresh="50.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="1" coins="1" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="10"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="10"/> </game> - <game name="amspdwy"> + <game name="amspdwy" sourcefile="amspdwy.c"> <description>American Speedway (set 1)</description> <year>1987</year> <manufacturer>Enerdyne Technologies, Inc.</manufacturer> @@ -314706,9 +315118,9 @@ <dipvalue name="45 sec"/> <dipvalue name="60 sec" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="amspdwya" cloneof="amspdwy" romof="amspdwy"> + <game name="amspdwya" sourcefile="amspdwy.c" cloneof="amspdwy" romof="amspdwy"> <description>American Speedway (set 2)</description> <year>1987</year> <manufacturer>Enerdyne Technologies, Inc.</manufacturer> @@ -314758,9 +315170,9 @@ <dipvalue name="45 sec"/> <dipvalue name="60 sec" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="othldrby"> + <game name="othldrby" sourcefile="othldrby.c"> <description>Othello Derby (Japan)</description> <year>1995</year> <manufacturer>Sunwise</manufacturer> @@ -314829,9 +315241,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="2048"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="2048"/> </game> - <game name="mosaic"> + <game name="mosaic" sourcefile="mosaic.c"> <description>Mosaic</description> <year>1990</year> <manufacturer>Space</manufacturer> @@ -314877,9 +315289,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="mosaica" cloneof="mosaic" romof="mosaic"> + <game name="mosaica" sourcefile="mosaic.c" cloneof="mosaic" romof="mosaic"> <description>Mosaic (Fuuki)</description> <year>1990</year> <manufacturer>Space (Fuuki license)</manufacturer> @@ -314925,9 +315337,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gfire2"> + <game name="gfire2" sourcefile="mosaic.c"> <description>Golden Fire II</description> <year>1992</year> <manufacturer>Topis Corp</manufacturer> @@ -314970,9 +315382,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="spdbuggy"> + <game name="spdbuggy" sourcefile="spdbuggy.c"> <description>Speed Buggy</description> <year>1986</year> <manufacturer>Tatsumi</manufacturer> @@ -315063,9 +315475,9 @@ <dipvalue name="2" default="yes"/> <dipvalue name="3"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="768"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="768"/> </game> - <game name="sprcros2"> + <game name="sprcros2" sourcefile="sprcros2.c"> <description>Super Cross 2 (Japan)</description> <year>1986</year> <manufacturer>GM Shoji</manufacturer> @@ -315115,9 +315527,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="18"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="18"/> </game> - <game name="mugsmash"> + <game name="mugsmash" sourcefile="mugsmash.c"> <description>Mug Smashers</description> <manufacturer>Electronic Devices Italy / 3D Games England</manufacturer> <rom name="mugs_04.bin" size="262144" crc="2498fd27" sha1="7b746efe8aaf346e4489118ac2a3fc9929a55b83" region="cpu1" offset="0"/> @@ -315198,9 +315610,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="stlforce"> + <game name="stlforce" sourcefile="stlforce.c"> <description>Steel Force</description> <year>1994</year> <manufacturer>Electronic Devices Italy / Ecogames S.L. Spain</manufacturer> @@ -315222,9 +315634,9 @@ <input players="2" control="joy8way" buttons="3" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="2048"/> </game> - <game name="fantland"> + <game name="fantland" sourcefile="fantland.c"> <description>Fantasy Land</description> <manufacturer>Electronic Devices Italy</manufacturer> <rom name="fantasyl.ev2" size="131072" crc="f5bdca0e" sha1="d05cf6f68d4d1a3dcc0171f7cf220c4920bd47bb" region="cpu1" offset="0"/> @@ -315304,9 +315716,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="galaxygn"> + <game name="galaxygn" sourcefile="fantland.c"> <description>Galaxy Gunners</description> <year>1989</year> <manufacturer>Electronic Devices Italy</manufacturer> @@ -315401,9 +315813,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="gcpinbal"> + <game name="gcpinbal" sourcefile="gcpinbal.c"> <description>Grand Cross</description> <year>1994</year> <manufacturer>Excellent System</manufacturer> @@ -315476,9 +315888,9 @@ <dipvalue name="4"/> <dipvalue name="5"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="4096"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="4096"/> </game> - <game name="aquarium"> + <game name="aquarium" sourcefile="aquarium.c"> <description>Aquarium (Japan)</description> <year>1996</year> <manufacturer>Excellent System</manufacturer> @@ -315552,9 +315964,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="2048"/> + <driver status="good" color="good" sound="imperfect" graphic="imperfect" palettesize="2048"/> </game> - <game name="policetr"> + <game name="policetr" sourcefile="policetr.c"> <description>Police Trainer (Rev 1.3)</description> <year>1996</year> <manufacturer>P&P Marketing</manufacturer> @@ -315607,9 +316019,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="policeto" cloneof="policetr" romof="policetr"> + <game name="policeto" sourcefile="policetr.c" cloneof="policetr" romof="policetr"> <description>Police Trainer (Rev 1.1)</description> <year>1996</year> <manufacturer>P&P Marketing</manufacturer> @@ -315662,9 +316074,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="plctr13b" cloneof="policetr" romof="policetr"> + <game name="plctr13b" sourcefile="policetr.c" cloneof="policetr" romof="policetr"> <description>Police Trainer (Rev 1.3B)</description> <year>1996</year> <manufacturer>P&P Marketing</manufacturer> @@ -315717,9 +316129,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="sshooter"> + <game name="sshooter" sourcefile="policetr.c"> <description>Sharpshooter (Rev 1.7)</description> <year>1998</year> <manufacturer>P&P Marketing</manufacturer> @@ -315776,9 +316188,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="pass"> + <game name="pass" sourcefile="pass.c"> <description>Pass</description> <year>1992</year> <manufacturer>Oksan</manufacturer> @@ -315856,9 +316268,9 @@ <dipvalue name="1 Coin/3 Credits"/> <dipvalue name="1 Coin/4 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="news"> + <game name="news" sourcefile="news.c"> <description>News</description> <year>1993</year> <manufacturer>Poby / Virus</manufacturer> @@ -315899,9 +316311,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="taxidrvr"> + <game name="taxidrvr" sourcefile="taxidrvr.c"> <description>Taxi Driver</description> <year>1984</year> <manufacturer>Graphic Techno</manufacturer> @@ -316018,9 +316430,9 @@ <dipvalue name="20/15"/> <dipvalue name="10/10"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="16"/> </game> - <game name="xyonix"> + <game name="xyonix" sourcefile="xyonix.c"> <description>Xyonix</description> <year>1989</year> <manufacturer>Philko</manufacturer> @@ -316058,9 +316470,9 @@ <dipvalue name="2 Coins/3 Credits"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="findout"> + <game name="findout" sourcefile="findout.c"> <description>Find Out</description> <year>1987</year> <manufacturer>Elettronolo</manufacturer> @@ -316109,9 +316521,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="256"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="dribling"> + <game name="dribling" sourcefile="dribling.c"> <description>Dribbling</description> <year>1983</year> <manufacturer>Model Racing</manufacturer> @@ -316137,9 +316549,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="driblino" cloneof="dribling" romof="dribling"> + <game name="driblino" sourcefile="dribling.c" cloneof="dribling" romof="dribling"> <description>Dribbling (Olympia)</description> <year>1983</year> <manufacturer>Model Racing (Olympia license)</manufacturer> @@ -316165,9 +316577,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="256"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="ace"> + <game name="ace" sourcefile="ace.c"> <description>Ace</description> <year>1976</year> <manufacturer>Allied Leisure</manufacturer> @@ -316181,9 +316593,9 @@ <video screen="raster" orientation="horizontal" width="224" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="2" control="joy8way" buttons="1" coins="1"/> - <driver status="good" color="imperfect" sound="preliminary" palettesize="2"/> + <driver status="good" color="imperfect" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="clayshoo"> + <game name="clayshoo" sourcefile="clayshoo.c"> <description>Clay Shoot</description> <year>1979</year> <manufacturer>Allied Leisure</manufacturer> @@ -316220,9 +316632,9 @@ <dipvalue name="90/11.5k-150/11.5k"/> <dipvalue name="90/11.5k-190/13k"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="pirates"> + <game name="pirates" sourcefile="pirates.c"> <description>Pirates</description> <year>1994</year> <manufacturer>NIX</manufacturer> @@ -316242,9 +316654,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="genix"> + <game name="genix" sourcefile="pirates.c"> <description>Genix Family</description> <year>1994</year> <manufacturer>NIX</manufacturer> @@ -316264,9 +316676,9 @@ <video screen="raster" orientation="horizontal" width="288" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="3" coins="2" service="yes"/> - <driver status="good" color="good" sound="good" palettesize="8192"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8192"/> </game> - <game name="fitfight"> + <game name="fitfight" sourcefile="fitfight.c"> <description>Fit of Fighting</description> <manufacturer>bootleg</manufacturer> <rom name="u138_ff1.bin" size="524288" crc="165600fe" sha1="b1987dbf34abdb6d08bdf7f71b256b62125e6517" region="cpu1" offset="1"/> @@ -316389,9 +316801,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="histryma"> + <game name="histryma" sourcefile="fitfight.c"> <description>The History of Martial Arts</description> <manufacturer>bootleg</manufacturer> <rom name="l_th.bin" size="524288" crc="5af9356a" sha1="f3d797dcc528a3a2a4f0ebbf07d59bd2cc868622" region="cpu1" offset="1"/> @@ -316511,9 +316923,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="bbprot"> + <game name="bbprot" sourcefile="fitfight.c"> <description>Untitled Fighter 'BB' (prototype)</description> <manufacturer><unknown></manufacturer> <rom name="l_bb.bin" size="524288" crc="2b7b9a9a" sha1="51088358814cc337af150526ac7fd6216c102299" region="cpu1" offset="1"/> @@ -316640,9 +317052,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8192"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="8192"/> </game> - <game name="flower"> + <game name="flower" sourcefile="flower.c"> <description>Flower</description> <year>1986</year> <manufacturer>Komax</manufacturer> @@ -316714,9 +317126,9 @@ <dipvalue name="30k, 80k then every 50k" default="yes"/> <dipvalue name="50k, 130k then every 80k"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="32768"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="32768"/> </game> - <game name="diverboy"> + <game name="diverboy" sourcefile="diverboy.c"> <description>Diver Boy</description> <year>1992</year> <manufacturer>Electronic Devices Italy</manufacturer> @@ -316765,9 +317177,9 @@ <dipvalue name="No" default="yes"/> <dipvalue name="Yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="imperfect" graphic="good" palettesize="1024"/> </game> - <game name="beaminv"> + <game name="beaminv" sourcefile="beaminv.c"> <description>Beam Invader</description> <manufacturer>Tekunon Kougyou</manufacturer> <rom name="0a" size="1024" crc="17503086" sha1="18c789216e5c4330dba3eeb24919dae636bf803d" region="cpu1" offset="0"/> @@ -316806,9 +317218,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="mcatadv"> + <game name="mcatadv" sourcefile="mcatadv.c"> <description>Magical Cat Adventure</description> <year>1993</year> <manufacturer>Wintechno</manufacturer> @@ -316881,9 +317293,9 @@ <dipvalue name="Upright 2 Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mcatadvj" cloneof="mcatadv" romof="mcatadv"> + <game name="mcatadvj" sourcefile="mcatadv.c" cloneof="mcatadv" romof="mcatadv"> <description>Magical Cat Adventure (Japan)</description> <year>1993</year> <manufacturer>Wintechno</manufacturer> @@ -316956,9 +317368,9 @@ <dipvalue name="Upright 2 Players" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nost"> + <game name="nost" sourcefile="mcatadv.c"> <description>Nostradamus</description> <year>1993</year> <manufacturer>Face</manufacturer> @@ -317034,9 +317446,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nostj" cloneof="nost" romof="nost"> + <game name="nostj" sourcefile="mcatadv.c" cloneof="nost" romof="nost"> <description>Nostradamus (Japan)</description> <year>1993</year> <manufacturer>Face</manufacturer> @@ -317112,9 +317524,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nostk" cloneof="nost" romof="nost"> + <game name="nostk" sourcefile="mcatadv.c" cloneof="nost" romof="nost"> <description>Nostradamus (Korea)</description> <year>1993</year> <manufacturer>Face</manufacturer> @@ -317190,9 +317602,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="4enraya"> + <game name="4enraya" sourcefile="4enraya.c"> <description>4 En Raya</description> <year>1990</year> <manufacturer>IDSA</manufacturer> @@ -317235,9 +317647,9 @@ <dipvalue name="2 Coins/3 Credits"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="oneshot"> + <game name="oneshot" sourcefile="oneshot.c"> <description>One Shot One Kill</description> <manufacturer><unknown></manufacturer> <rom name="1shot-u.a24" size="131072" crc="0ecd33da" sha1="d050e9a1900cd9f629818034b1445e034b6cf81c" region="cpu1" offset="0"/> @@ -317315,9 +317727,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="1024"/> </game> - <game name="maddonna"> + <game name="maddonna" sourcefile="oneshot.c"> <description>Mad Donna (set 1)</description> <year>1995</year> <manufacturer>Tuning</manufacturer> @@ -317393,9 +317805,9 @@ <dipvalue name="On - 01"/> <dipvalue name="On - 11"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="maddonnb" cloneof="maddonna" romof="maddonna"> + <game name="maddonnb" sourcefile="oneshot.c" cloneof="maddonna" romof="maddonna"> <description>Mad Donna (set 2)</description> <year>1995</year> <manufacturer>Tuning</manufacturer> @@ -317471,9 +317883,9 @@ <dipvalue name="On - 01"/> <dipvalue name="On - 11"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="1024"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="tugboat"> + <game name="tugboat" sourcefile="tugboat.c"> <description>Tugboat</description> <year>1982</year> <manufacturer>ETM</manufacturer> @@ -317512,9 +317924,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="imperfect" palettesize="256"/> </game> - <game name="gotcha"> + <game name="gotcha" sourcefile="gotcha.c"> <description>Got-cha</description> <year>1997</year> <manufacturer>Dongsung</manufacturer> @@ -317593,9 +318005,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="768"/> </game> - <game name="amerdart"> + <game name="amerdart" sourcefile="coolpool.c"> <description>AmeriDarts</description> <year>1989</year> <manufacturer>Ameri</manufacturer> @@ -317685,9 +318097,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="preliminary" color="preliminary" sound="preliminary" palettesize="16"/> + <driver status="preliminary" color="preliminary" sound="preliminary" graphic="good" palettesize="16"/> </game> - <game name="coolpool"> + <game name="coolpool" sourcefile="coolpool.c"> <description>Cool Pool</description> <year>1992</year> <manufacturer>Catalina</manufacturer> @@ -317717,9 +318129,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="4" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="9ballsht" cloneof="coolpool" romof="coolpool"> + <game name="9ballsht" sourcefile="coolpool.c" cloneof="coolpool" romof="coolpool"> <description>9-Ball Shootout (set 1)</description> <year>1993</year> <manufacturer>E-Scape EnterMedia (Bundra license)</manufacturer> @@ -317737,9 +318149,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="4" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="9ballsh2" cloneof="coolpool" romof="coolpool"> + <game name="9ballsh2" sourcefile="coolpool.c" cloneof="coolpool" romof="coolpool"> <description>9-Ball Shootout (set 2)</description> <year>1993</year> <manufacturer>E-Scape EnterMedia (Bundra license)</manufacturer> @@ -317757,9 +318169,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="4" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="9ballsh3" cloneof="coolpool" romof="coolpool"> + <game name="9ballsh3" sourcefile="coolpool.c" cloneof="coolpool" romof="coolpool"> <description>9-Ball Shootout (set 3)</description> <year>1993</year> <manufacturer>E-Scape EnterMedia (Bundra license)</manufacturer> @@ -317777,9 +318189,9 @@ <video screen="raster" orientation="horizontal" width="320" height="240" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="4" coins="3" service="yes"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="gumbo"> + <game name="gumbo" sourcefile="gumbo.c"> <description>Gumbo</description> <year>1994</year> <manufacturer>Min Corp.</manufacturer> @@ -317821,9 +318233,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="trivquiz"> + <game name="trivquiz" sourcefile="statriv2.c"> <description>Triv Quiz</description> <year>1984</year> <manufacturer>Status Games</manufacturer> @@ -317839,9 +318251,9 @@ <rom name="qmt16.rom" size="8192" crc="1d2ecf1d" sha1="1d833b57bf4b3ccb3dc60307641ef9476289fe07" region="user1" offset="a000"/> <rom name="qmt17.rom" size="8192" crc="01840f9c" sha1="d9b4f7f931657d4e16cf981d887508fd1db5e4c0" region="user1" offset="c000"/> <rom name="qmt18.rom" size="8192" crc="004a9480" sha1="7adff194a1549fa42577f969706aab6bb6a58851" region="user1" offset="e000"/> - <chip type="cpu" name="8085A" clock="12400000"/> - <chip type="audio" name="AY-3-8910" clock="1500000"/> - <video screen="raster" orientation="horizontal" width="288" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> + <chip type="cpu" name="8085A" clock="12440000"/> + <chip type="audio" name="AY-3-8910" clock="1555000"/> + <video screen="raster" orientation="horizontal" width="272" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" buttons="4" coins="1"/> <dipswitch name="Service Mode"> @@ -317850,10 +318262,10 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="statriv2"> - <description>(Status) Triv Two</description> + <game name="statriv2" sourcefile="statriv2.c"> + <description>Triv Two</description> <year>1984</year> <manufacturer>Status Games</manufacturer> <rom name="trivii1c.u7" size="4096" crc="89326d7b" sha1="4878a3aabe51a4de5ff5927a0707b2d121ff87fa" region="cpu1" offset="0"/> @@ -317868,8 +318280,8 @@ <rom name="statuspb.u6" size="8192" crc="7ee1cea0" sha1="00ef768524e54890ebd1fdb3dd52d0080a18fc03" region="user1" offset="a000"/> <rom name="statuspb.u7" size="8192" crc="121d6976" sha1="2e4da8f2c3620c8f46fd4951551b0747b3c38caf" region="user1" offset="c000"/> <rom name="statuspb.u8" size="8192" crc="5080df10" sha1="b5cb0868d844bbb598159177fd5ce65ff3f18eda" region="user1" offset="e000"/> - <chip type="cpu" name="8085A" clock="12400000"/> - <chip type="audio" name="AY-3-8910" clock="1500000"/> + <chip type="cpu" name="8085A" clock="12440000"/> + <chip type="audio" name="AY-3-8910" clock="1555000"/> <video screen="raster" orientation="horizontal" width="272" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" buttons="4" coins="1"/> @@ -317879,9 +318291,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="supertr2"> + <game name="supertr2" sourcefile="statriv2.c"> <description>Super Triv II</description> <year>1986</year> <manufacturer>Status Games</manufacturer> @@ -317898,16 +318310,16 @@ <rom name="astq2-6.rom" size="32768" crc="c0f61b5f" sha1="65398f9d22fce95c4146a2cb8174edd6b336b9e4" region="user1" offset="28000"/> <rom name="astq2-7.rom" size="32768" crc="72461937" sha1="2f95a708b24f56d9b1293a88aa53eb4a32f89869" region="user1" offset="30000"/> <rom name="astq2-8.rom" size="32768" crc="cd2674d5" sha1="7fb6513172ffe8e3b9e0f4dc9ecdb42d954b1ff0" region="user1" offset="38000"/> - <chip type="cpu" name="8085A" clock="12400000"/> - <chip type="audio" name="AY-3-8910" clock="1500000"/> + <chip type="cpu" name="8085A" clock="12440000"/> + <chip type="audio" name="AY-3-8910" clock="1555000"/> <video screen="raster" orientation="horizontal" width="272" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="1" buttons="4" coins="2"/> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="16"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="8"/> </game> - <game name="tickee"> + <game name="tickee" sourcefile="tickee.c"> <description>Tickee Tickats</description> <year>1994</year> <manufacturer>Raster Elite</manufacturer> @@ -317949,9 +318361,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="256"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="crgolf"> + <game name="crgolf" sourcefile="crgolf.c"> <description>Crowns Golf (set 1)</description> <year>1984</year> <manufacturer>Nasco Japan</manufacturer> @@ -318002,9 +318414,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="crgolfa" cloneof="crgolf" romof="crgolf"> + <game name="crgolfa" sourcefile="crgolf.c" cloneof="crgolf" romof="crgolf"> <description>Crowns Golf (set 2)</description> <year>1984</year> <manufacturer>Nasco Japan</manufacturer> @@ -318055,9 +318467,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="crgolfb" cloneof="crgolf" romof="crgolf"> + <game name="crgolfb" sourcefile="crgolf.c" cloneof="crgolf" romof="crgolf"> <description>Champion Golf (bootleg Set 1)</description> <year>1984</year> <manufacturer>Nasco Japan</manufacturer> @@ -318108,9 +318520,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="crgolfc" cloneof="crgolf" romof="crgolf"> + <game name="crgolfc" sourcefile="crgolf.c" cloneof="crgolf" romof="crgolf"> <description>Champion Golf</description> <year>1984</year> <manufacturer>Nasco Japan</manufacturer> @@ -318161,9 +318573,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="truco"> + <game name="truco" sourcefile="truco.c"> <description>Truco-Tron</description> <manufacturer>Playtronic SRL</manufacturer> <rom name="truco.u3" size="16384" crc="4642fb96" sha1="e821f6fd582b141a5ca2d5bd53f817697048fb81" region="cpu1" offset="8000"/> @@ -318204,9 +318616,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="16"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="16"/> </game> - <game name="thedeep"> + <game name="thedeep" sourcefile="thedeep.c"> <description>The Deep (Japan)</description> <year>1987</year> <manufacturer>Woodplace Inc.</manufacturer> @@ -318282,9 +318694,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rundeep" cloneof="thedeep" romof="thedeep"> + <game name="rundeep" sourcefile="thedeep.c" cloneof="thedeep" romof="thedeep"> <description>Run Deep</description> <year>1988</year> <manufacturer>Cream</manufacturer> @@ -318360,9 +318772,9 @@ </dipswitch> <dipswitch name="Service Mode"> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="wallc"> + <game name="wallc" sourcefile="wallc.c"> <description>Wall Crash</description> <year>1984</year> <manufacturer>Midcoin</manufacturer> @@ -318421,9 +318833,9 @@ <dipvalue name="1 Coin/2 Credits"/> <dipvalue name="1 Coin/5 Credits"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="skyarmy"> + <game name="skyarmy" sourcefile="skyarmy.c"> <description>Sky Army</description> <year>1982</year> <manufacturer>Shoei</manufacturer> @@ -318451,9 +318863,9 @@ <dipvalue name="1 Coin/1 Credit" default="yes"/> <dipvalue name="1 Coin/2 Credits"/> </dipswitch> - <driver status="good" color="preliminary" sound="good" palettesize="32"/> + <driver status="good" color="preliminary" sound="good" graphic="good" palettesize="32"/> </game> - <game name="lethalj"> + <game name="lethalj" sourcefile="lethalj.c"> <description>Lethal Justice</description> <year>1996</year> <manufacturer>The Game Room</manufacturer> @@ -318515,9 +318927,9 @@ <dipvalue name="-2.5"/> <dipvalue name="+0" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="eggventr"> + <game name="eggventr" sourcefile="lethalj.c"> <description>Egg Venture</description> <year>1997</year> <manufacturer>The Game Room</manufacturer> @@ -318565,9 +318977,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="eggvntdx" cloneof="eggventr" romof="eggventr"> + <game name="eggvntdx" sourcefile="lethalj.c" cloneof="eggventr" romof="eggventr"> <description>Egg Venture Deluxe</description> <year>1997</year> <manufacturer>The Game Room</manufacturer> @@ -318611,9 +319023,9 @@ <dipvalue name="Medium" default="yes"/> <dipvalue name="Hard"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32768"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32768"/> </game> - <game name="rotaryf" sampleof="invaders"> + <game name="rotaryf" sourcefile="rotaryf.c" sampleof="invaders"> <description>Rotary Fighter</description> <manufacturer><unknown></manufacturer> <rom name="krf-1.bin" size="1024" crc="f7b2d3e6" sha1="be7afc1a14be60cb895fc4180167353c7156fc4c" region="cpu1" offset="0"/> @@ -318671,9 +319083,9 @@ <dipvalue name="Upright" default="yes"/> <dipvalue name="Cocktail"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="2"/> </game> - <game name="sbugger"> + <game name="sbugger" sourcefile="sbugger.c"> <description>Space Bugger</description> <year>1981</year> <manufacturer>Game-A-Tron</manufacturer> @@ -318773,9 +319185,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="good" sound="preliminary" palettesize="512"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="512"/> </game> - <game name="portrait"> + <game name="portrait" sourcefile="portrait.c"> <description>Portraits</description> <year>1983</year> <manufacturer>Olympia</manufacturer> @@ -318868,9 +319280,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="preliminary" color="preliminary" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="preliminary" sound="preliminary" graphic="imperfect" palettesize="256"/> </game> - <game name="enigma2"> + <game name="enigma2" sourcefile="enigma2.c"> <description>Enigma 2</description> <year>1981</year> <manufacturer>GamePlan (Zilec Electronics license)</manufacturer> @@ -318913,9 +319325,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="8"/> + <driver status="good" color="preliminary" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="enigma2a" cloneof="enigma2" romof="enigma2"> + <game name="enigma2a" sourcefile="enigma2.c" cloneof="enigma2" romof="enigma2"> <description>Enigma 2 (Space Invaders Hardware)</description> <year>1984</year> <manufacturer>Zilec Electronics</manufacturer> @@ -318956,9 +319368,9 @@ <dipvalue name="2 Coins/1 Credit"/> <dipvalue name="1 Coin/1 Credit" default="yes"/> </dipswitch> - <driver status="good" color="preliminary" sound="preliminary" palettesize="8"/> + <driver status="good" color="preliminary" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="ltcasino"> + <game name="ltcasino" sourcefile="ltcasino.c"> <description>Little Casino</description> <year>1982</year> <manufacturer>Digital Controls Inc.</manufacturer> @@ -319152,9 +319564,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="ltcasin2"> + <game name="ltcasin2" sourcefile="ltcasino.c"> <description>Little Casino 2</description> <year>1984</year> <manufacturer>Digital Controls Inc.</manufacturer> @@ -319356,9 +319768,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="preliminary" color="good" sound="good" palettesize="256"/> + <driver status="preliminary" color="good" sound="good" graphic="good" palettesize="256"/> </game> - <game name="vamphalf"> + <game name="vamphalf" sourcefile="vamphalf.c"> <description>Vamp 1/2</description> <manufacturer>Danbi</manufacturer> <rom name="prom1" size="524288" crc="f05e8e96" sha1="c860e65c811cbda2dc70300437430fb4239d3e2d" region="user1" offset="0"/> @@ -319371,9 +319783,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="hidnctch"> + <game name="hidnctch" sourcefile="vamphalf.c"> <description>Hidden Catch</description> <manufacturer>Eolith</manufacturer> <rom name="hc_u43.bin" size="524288" crc="635b4478" sha1="31ea4a9725e0c329447c7d221c22494c905f6940" region="user1" offset="0"/> @@ -319391,9 +319803,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="landbrk"> + <game name="landbrk" sourcefile="vamphalf.c"> <description>Land Breaker</description> <manufacturer>Eolith</manufacturer> <rom name="lb_1.u43" size="524288" crc="f8bbcf44" sha1="ad85a890ae2f921cd08c1897b4d9a230ccf9e072" region="user1" offset="0"/> @@ -319412,9 +319824,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="racoon"> + <game name="racoon" sourcefile="vamphalf.c"> <description>Racoon World</description> <manufacturer>Eolith</manufacturer> <rom name="racoon-u.43" size="524288" crc="711ee026" sha1="c55dfaa24cbaa7a613657cfb25e7f0085f1e4cbf" region="user1" offset="0"/> @@ -319432,9 +319844,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="xfiles"> + <game name="xfiles" sourcefile="vamphalf.c"> <description>X-Files</description> <manufacturer>dfPIX Entertainment Inc.</manufacturer> <rom name="u9.bin" size="4194304" crc="ebdb75c0" sha1="9aa5736bbf3215c35d62b424c2e5e40223227baf" region="user1" offset="0"/> @@ -319444,9 +319856,9 @@ <video screen="raster" orientation="horizontal" width="256" height="256" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="256"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="256"/> </game> - <game name="strvmstr"> + <game name="strvmstr" sourcefile="strvmstr.c"> <description>Super Trivia Master</description> <year>1986</year> <manufacturer>Enerdyne Technologies Inc.</manufacturer> @@ -319518,9 +319930,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="preliminary" sound="imperfect" palettesize="8"/> + <driver status="good" color="preliminary" sound="imperfect" graphic="good" palettesize="8"/> </game> - <game name="dorachan"> + <game name="dorachan" sourcefile="dorachan.c"> <description>Dorachan</description> <year>1980</year> <manufacturer>Craul Denshi</manufacturer> @@ -319554,9 +319966,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="8"/> + <driver status="good" color="good" sound="preliminary" graphic="good" palettesize="8"/> </game> - <game name="ladyfrog"> + <game name="ladyfrog" sourcefile="ladyfrog.c"> <description>Lady Frog</description> <year>1990</year> <manufacturer>Mondial Games</manufacturer> @@ -319609,9 +320021,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="512"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="512"/> </game> - <game name="rabbit"> + <game name="rabbit" sourcefile="rabbit.c"> <description>Rabbit</description> <year>1997</year> <manufacturer>Electronic Arts</manufacturer> @@ -319631,9 +320043,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="512"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="512"/> </game> - <game name="tmmjprd"> + <game name="tmmjprd" sourcefile="rabbit.c"> <description>Tokimeki Mahjong Paradise - Dear My Love</description> <year>1997</year> <manufacturer>Media / Sonnet</manufacturer> @@ -319662,9 +320074,9 @@ <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="0"/> <input players="0"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="512"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="512"/> </game> - <game name="malzak"> + <game name="malzak" sourcefile="malzak.c"> <description>Malzak</description> <manufacturer>Kitronix</manufacturer> <rom name="malzak.5" size="4096" crc="75355c98" sha1="7036ed5d9ee38585b1a6bc204d410d5fb5ddd81f" region="cpu1" offset="0"/> @@ -319679,9 +320091,9 @@ <video screen="raster" orientation="horizontal" width="240" height="240" aspectx="4" aspecty="3" refresh="50.000000"/> <sound channels="1"/> <input players="1" control="joy8way" buttons="1" coins="1"/> - <driver status="preliminary" color="good" sound="preliminary" palettesize="16"/> + <driver status="preliminary" color="good" sound="preliminary" graphic="good" palettesize="16"/> </game> - <game name="supertnk"> + <game name="supertnk" sourcefile="supertnk.c"> <description>Super Tank</description> <year>1981</year> <manufacturer>Video Games GmbH</manufacturer> @@ -319760,9 +320172,9 @@ <dipvalue name="Off"/> <dipvalue name="On" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="32"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="32"/> </game> - <game name="crospang"> + <game name="crospang" sourcefile="crospang.c"> <description>Cross Pang</description> <manufacturer>Oksan?</manufacturer> <rom name="p1.bin" size="131072" crc="0bcbbaad" sha1="807f07be340d7af0aad8d49461b5a7f0221ea3b7" region="cpu1" offset="1"/> @@ -319907,9 +320319,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="preliminary" palettesize="2048"/> + <driver status="good" color="good" sound="preliminary" graphic="imperfect" palettesize="2048"/> </game> - <game name="funybubl"> + <game name="funybubl" sourcefile="funybubl.c"> <description>Funny Bubble</description> <year>1999</year> <manufacturer>Comad</manufacturer> @@ -319928,80 +320340,43 @@ <rom name="12.bin" size="524288" crc="63f0e810" sha1="5c7ed32ee8dc1d9aabc8d136ec370471096356c2" region="gfx2" dispose="yes" offset="180000"/> <rom name="1.bin" size="65536" crc="b8b5b675" sha1="0a02ccd09bb2ae20efe49e3ca2006331aea0e2a7" region="cpu2" offset="0"/> <rom name="3.bin" size="131072" crc="a2d780f4" sha1="bebba3db21ab9ddde8c6f19db3b67c869df582eb" region="sound1" offset="0"/> - <rom name="4.bin" size="262144" crc="1f7e9269" sha1="5c16b49a4e94aec7606d088c2d45a77842ab565b" region="sound2" offset="0"/> + <rom name="4.bin" size="262144" crc="1f7e9269" sha1="5c16b49a4e94aec7606d088c2d45a77842ab565b" region="sound1" offset="20000"/> <chip type="cpu" name="Z80" clock="8000000"/> <chip type="cpu" name="Z80" clock="8000000"/> <chip type="audio" name="MSM6295" clock="8000"/> <video screen="raster" orientation="horizontal" width="320" height="224" aspectx="4" aspecty="3" refresh="60.000000"/> <sound channels="1"/> <input players="2" control="joy8way" buttons="1" coins="2"/> - <dipswitch name="3"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="6"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> - </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipswitch name="Coin A"> + <dipvalue name="3 Coins/1 Credit"/> + <dipvalue name="2 Coins/1 Credit"/> + <dipvalue name="3 Coins/2 Credits"/> + <dipvalue name="1 Coin/1 Credit" default="yes"/> + <dipvalue name="2 Coins/3 Credits"/> + <dipvalue name="1 Coin/2 Credits"/> + <dipvalue name="1 Coin/3 Credits"/> + <dipvalue name="Free Play"/> </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipswitch name="Difficulty"> + <dipvalue name="Very Easy"/> + <dipvalue name="Easy"/> + <dipvalue name="Normal" default="yes"/> + <dipvalue name="Hard 1"/> + <dipvalue name="Hard 2"/> + <dipvalue name="Hard 3"/> + <dipvalue name="Hard 4"/> </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipswitch name="Demo Sounds"> + <dipvalue name="Off"/> + <dipvalue name="On" default="yes"/> </dipswitch> - <dipswitch name="Unknown"> - <dipvalue name="Off" default="yes"/> - <dipvalue name="On"/> + <dipswitch name="Nudity"> + <dipvalue name="Semi"/> + <dipvalue name="Full" default="yes"/> </dipswitch> - <driver status="good" color="good" sound="imperfect" palettesize="1024"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="1024"/> </game> - <game name="nam1975" romof="neogeo"> + <game name="nam1975" sourcefile="neogeo.c" romof="neogeo"> <description>NAM-1975</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320068,9 +320443,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bstars" romof="neogeo"> + <game name="bstars" sourcefile="neogeo.c" romof="neogeo"> <description>Baseball Stars Professional</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320138,9 +320513,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tpgolf" romof="neogeo"> + <game name="tpgolf" sourcefile="neogeo.c" romof="neogeo"> <description>Top Player's Golf</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320211,9 +320586,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mahretsu" romof="neogeo"> + <game name="mahretsu" sourcefile="neogeo.c" romof="neogeo"> <description>Mahjong Kyoretsuden</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320279,9 +320654,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="maglord" romof="neogeo"> + <game name="maglord" sourcefile="neogeo.c" romof="neogeo"> <description>Magician Lord (set 1)</description> <year>1990</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -320347,9 +320722,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="maglordh" cloneof="maglord" romof="maglord"> + <game name="maglordh" sourcefile="neogeo.c" cloneof="maglord" romof="maglord"> <description>Magician Lord (set 2)</description> <year>1990</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -320415,9 +320790,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ridhero" romof="neogeo"> + <game name="ridhero" sourcefile="neogeo.c" romof="neogeo"> <description>Riding Hero (set 1)</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320484,9 +320859,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ridheroh" cloneof="ridhero" romof="ridhero"> + <game name="ridheroh" sourcefile="neogeo.c" cloneof="ridhero" romof="ridhero"> <description>Riding Hero (set 2)</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320553,9 +320928,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="alpham2" romof="neogeo"> + <game name="alpham2" sourcefile="neogeo.c" romof="neogeo"> <description>Alpha Mission II / ASO II - Last Guardian</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -320619,9 +320994,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ncombat" romof="neogeo"> + <game name="ncombat" sourcefile="neogeo.c" romof="neogeo"> <description>Ninja Combat</description> <year>1990</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -320688,9 +321063,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="cyberlip" romof="neogeo"> + <game name="cyberlip" sourcefile="neogeo.c" romof="neogeo"> <description>Cyber-Lip</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320758,9 +321133,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="superspy" romof="neogeo"> + <game name="superspy" sourcefile="neogeo.c" romof="neogeo"> <description>The Super Spy</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -320825,9 +321200,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mutnat" romof="neogeo"> + <game name="mutnat" sourcefile="neogeo.c" romof="neogeo"> <description>Mutation Nation</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -320890,9 +321265,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kotm" romof="neogeo"> + <game name="kotm" sourcefile="neogeo.c" romof="neogeo"> <description>King of the Monsters (set 1)</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -320956,9 +321331,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kotmh" cloneof="kotm" romof="kotm"> + <game name="kotmh" sourcefile="neogeo.c" cloneof="kotm" romof="kotm"> <description>King of the Monsters (set 2)</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321022,9 +321397,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sengoku" romof="neogeo"> + <game name="sengoku" sourcefile="neogeo.c" romof="neogeo"> <description>Sengoku / Sengoku Denshou (set 1)</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321088,9 +321463,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sengokh" cloneof="sengoku" romof="sengoku"> + <game name="sengokh" sourcefile="neogeo.c" cloneof="sengoku" romof="sengoku"> <description>Sengoku / Sengoku Denshou (set 2)</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321154,9 +321529,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="burningf" romof="neogeo"> + <game name="burningf" sourcefile="neogeo.c" romof="neogeo"> <description>Burning Fight (set 1)</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321219,9 +321594,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="burningh" cloneof="burningf" romof="burningf"> + <game name="burningh" sourcefile="neogeo.c" cloneof="burningf" romof="burningf"> <description>Burning Fight (set 2)</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321284,9 +321659,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lbowling" romof="neogeo"> + <game name="lbowling" sourcefile="neogeo.c" romof="neogeo"> <description>League Bowling</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -321348,9 +321723,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gpilots" romof="neogeo"> + <game name="gpilots" sourcefile="neogeo.c" romof="neogeo"> <description>Ghost Pilots</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321415,9 +321790,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="joyjoy" romof="neogeo"> + <game name="joyjoy" sourcefile="neogeo.c" romof="neogeo"> <description>Puzzled / Joy Joy Kid</description> <year>1990</year> <manufacturer>SNK</manufacturer> @@ -321478,9 +321853,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bjourney" romof="neogeo"> + <game name="bjourney" sourcefile="neogeo.c" romof="neogeo"> <description>Blue's Journey / Raguy</description> <year>1990</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -321543,9 +321918,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quizdais" romof="neogeo"> + <game name="quizdais" sourcefile="neogeo.c" romof="neogeo"> <description>Quiz Daisousa Sen - The Last Count Down</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321605,9 +321980,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lresort" romof="neogeo"> + <game name="lresort" sourcefile="neogeo.c" romof="neogeo"> <description>Last Resort</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -321670,9 +322045,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="eightman" romof="neogeo"> + <game name="eightman" sourcefile="neogeo.c" romof="neogeo"> <description>Eight Man</description> <year>1991</year> <manufacturer>SNK / Pallas</manufacturer> @@ -321735,9 +322110,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="minasan" romof="neogeo"> + <game name="minasan" sourcefile="neogeo.c" romof="neogeo"> <description>Minnasanno Okagesamadesu</description> <year>1990</year> <manufacturer>Monolith Corp.</manufacturer> @@ -321800,9 +322175,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="legendos" romof="neogeo"> + <game name="legendos" sourcefile="neogeo.c" romof="neogeo"> <description>Legend of Success Joe / Ashitano Joe Densetsu</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -321864,9 +322239,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="2020bb" romof="neogeo"> + <game name="2020bb" sourcefile="neogeo.c" romof="neogeo"> <description>2020 Super Baseball (set 1)</description> <year>1991</year> <manufacturer>SNK / Pallas</manufacturer> @@ -321929,9 +322304,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="2020bbh" cloneof="2020bb" romof="2020bb"> + <game name="2020bbh" sourcefile="neogeo.c" cloneof="2020bb" romof="2020bb"> <description>2020 Super Baseball (set 2)</description> <year>1991</year> <manufacturer>SNK / Pallas</manufacturer> @@ -321994,9 +322369,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="socbrawl" romof="neogeo"> + <game name="socbrawl" sourcefile="neogeo.c" romof="neogeo"> <description>Soccer Brawl</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -322059,9 +322434,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="roboarmy" romof="neogeo"> + <game name="roboarmy" sourcefile="neogeo.c" romof="neogeo"> <description>Robo Army</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -322128,9 +322503,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fatfury1" romof="neogeo"> + <game name="fatfury1" sourcefile="neogeo.c" romof="neogeo"> <description>Fatal Fury - King of Fighters / Garou Densetsu - shukumei no tatakai</description> <year>1991</year> <manufacturer>SNK</manufacturer> @@ -322194,9 +322569,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fbfrenzy" romof="neogeo"> + <game name="fbfrenzy" sourcefile="neogeo.c" romof="neogeo"> <description>Football Frenzy</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -322259,9 +322634,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bakatono" romof="neogeo"> + <game name="bakatono" sourcefile="neogeo.c" romof="neogeo"> <description>Bakatonosama Mahjong Manyuki</description> <year>1991</year> <manufacturer>Monolith Corp.</manufacturer> @@ -322324,9 +322699,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="crsword" romof="neogeo"> + <game name="crsword" sourcefile="neogeo.c" romof="neogeo"> <description>Crossed Swords</description> <year>1991</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -322388,9 +322763,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="trally" romof="neogeo"> + <game name="trally" sourcefile="neogeo.c" romof="neogeo"> <description>Thrash Rally</description> <year>1991</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -322454,9 +322829,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kotm2" romof="neogeo"> + <game name="kotm2" sourcefile="neogeo.c" romof="neogeo"> <description>King of the Monsters 2 - The Next Thing</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -322520,9 +322895,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sengoku2" romof="neogeo"> + <game name="sengoku2" sourcefile="neogeo.c" romof="neogeo"> <description>Sengoku 2 / Sengoku Denshou 2</description> <year>1993</year> <manufacturer>SNK</manufacturer> @@ -322587,9 +322962,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bstars2" romof="neogeo"> + <game name="bstars2" sourcefile="neogeo.c" romof="neogeo"> <description>Baseball Stars 2</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -322653,9 +323028,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quizdai2" romof="neogeo"> + <game name="quizdai2" sourcefile="neogeo.c" romof="neogeo"> <description>Quiz Meitantei Neo & Geo - Quiz Daisousa Sen part 2</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -322718,9 +323093,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="3countb" romof="neogeo"> + <game name="3countb" sourcefile="neogeo.c" romof="neogeo"> <description>3 Count Bout / Fire Suplex</description> <year>1993</year> <manufacturer>SNK</manufacturer> @@ -322784,9 +323159,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aof" romof="neogeo"> + <game name="aof" sourcefile="neogeo.c" romof="neogeo"> <description>Art of Fighting / Ryuuko no Ken</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -322849,9 +323224,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="samsho" romof="neogeo"> + <game name="samsho" sourcefile="neogeo.c" romof="neogeo"> <description>Samurai Shodown / Samurai Spirits</description> <year>1993</year> <manufacturer>SNK</manufacturer> @@ -322918,9 +323293,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tophuntr" romof="neogeo"> + <game name="tophuntr" sourcefile="neogeo.c" romof="neogeo"> <description>Top Hunter - Roddy & Cathy</description> <year>1994</year> <manufacturer>SNK</manufacturer> @@ -322990,9 +323365,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fatfury2" romof="neogeo"> + <game name="fatfury2" sourcefile="neogeo.c" romof="neogeo"> <description>Fatal Fury 2 / Garou Densetsu 2 - arata-naru tatakai</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -323056,9 +323431,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="janshin" romof="neogeo"> + <game name="janshin" sourcefile="neogeo.c" romof="neogeo"> <description>Jyanshin Densetsu - Quest of Jongmaster</description> <year>1994</year> <manufacturer>Aicom</manufacturer> @@ -323118,9 +323493,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="androdun" romof="neogeo"> + <game name="androdun" sourcefile="neogeo.c" romof="neogeo"> <description>Andro Dunos</description> <year>1992</year> <manufacturer>Visco</manufacturer> @@ -323182,9 +323557,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ncommand" romof="neogeo"> + <game name="ncommand" sourcefile="neogeo.c" romof="neogeo"> <description>Ninja Commando</description> <year>1992</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -323247,9 +323622,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="viewpoin" romof="neogeo"> + <game name="viewpoin" sourcefile="neogeo.c" romof="neogeo"> <description>Viewpoint</description> <year>1992</year> <manufacturer>Sammy</manufacturer> @@ -323310,9 +323685,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssideki" romof="neogeo"> + <game name="ssideki" sourcefile="neogeo.c" romof="neogeo"> <description>Super Sidekicks / Tokuten Ou</description> <year>1992</year> <manufacturer>SNK</manufacturer> @@ -323372,9 +323747,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wh1" romof="neogeo"> + <game name="wh1" sourcefile="neogeo.c" romof="neogeo"> <description>World Heroes (set 1)</description> <year>1992</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -323438,9 +323813,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wh1h" cloneof="wh1" romof="wh1"> + <game name="wh1h" sourcefile="neogeo.c" cloneof="wh1" romof="wh1"> <description>World Heroes (set 2)</description> <year>1992</year> <manufacturer>Alpha Denshi Co.</manufacturer> @@ -323504,9 +323879,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof94" romof="neogeo"> + <game name="kof94" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters '94</description> <year>1994</year> <manufacturer>SNK</manufacturer> @@ -323574,9 +323949,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aof2" romof="neogeo"> + <game name="aof2" sourcefile="neogeo.c" romof="neogeo"> <description>Art of Fighting 2 / Ryuuko no Ken 2</description> <year>1994</year> <manufacturer>SNK</manufacturer> @@ -323644,9 +324019,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wh2" romof="neogeo"> + <game name="wh2" sourcefile="neogeo.c" romof="neogeo"> <description>World Heroes 2</description> <year>1993</year> <manufacturer>ADK</manufacturer> @@ -323711,9 +324086,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fatfursp" romof="neogeo"> + <game name="fatfursp" sourcefile="neogeo.c" romof="neogeo"> <description>Fatal Fury Special / Garou Densetsu Special (set 1)</description> <year>1993</year> <manufacturer>SNK</manufacturer> @@ -323780,9 +324155,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fatfursa" cloneof="fatfursp" romof="fatfursp"> + <game name="fatfursa" sourcefile="neogeo.c" cloneof="fatfursp" romof="fatfursp"> <description>Fatal Fury Special / Garou Densetsu Special (set 2)</description> <year>1993</year> <manufacturer>SNK</manufacturer> @@ -323849,9 +324224,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="savagere" romof="neogeo"> + <game name="savagere" sourcefile="neogeo.c" romof="neogeo"> <description>Savage Reign / Fu'un Mokushiroku - kakutou sousei</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -323919,9 +324294,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fightfev" romof="neogeo"> + <game name="fightfev" sourcefile="neogeo.c" romof="neogeo"> <description>Fight Fever (set 1)</description> <year>1994</year> <manufacturer>Viccom</manufacturer> @@ -323985,9 +324360,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fightfva" cloneof="fightfev" romof="fightfev"> + <game name="fightfva" sourcefile="neogeo.c" cloneof="fightfev" romof="fightfev"> <description>Fight Fever (set 2)</description> <year>1994</year> <manufacturer>Viccom</manufacturer> @@ -324050,9 +324425,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssideki2" romof="neogeo"> + <game name="ssideki2" sourcefile="neogeo.c" romof="neogeo"> <description>Super Sidekicks 2 - The World Championship / Tokuten Ou 2 - real fight football</description> <year>1994</year> <manufacturer>SNK</manufacturer> @@ -324115,9 +324490,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="spinmast" romof="neogeo"> + <game name="spinmast" sourcefile="neogeo.c" romof="neogeo"> <description>Spin Master / Miracle Adventure</description> <year>1993</year> <manufacturer>Data East Corporation</manufacturer> @@ -324184,9 +324559,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="samsho2" romof="neogeo"> + <game name="samsho2" sourcefile="neogeo.c" romof="neogeo"> <description>Samurai Shodown II / Shin Samurai Spirits - Haohmaru jigokuhen</description> <year>1994</year> <manufacturer>SNK</manufacturer> @@ -324255,9 +324630,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wh2j" romof="neogeo"> + <game name="wh2j" sourcefile="neogeo.c" romof="neogeo"> <description>World Heroes 2 Jet</description> <year>1994</year> <manufacturer>ADK / SNK</manufacturer> @@ -324324,9 +324699,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wjammers" romof="neogeo"> + <game name="wjammers" sourcefile="neogeo.c" romof="neogeo"> <description>Windjammers / Flying Power Disc</description> <year>1994</year> <manufacturer>Data East Corporation</manufacturer> @@ -324391,9 +324766,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="karnovr" romof="neogeo"> + <game name="karnovr" sourcefile="neogeo.c" romof="neogeo"> <description>Karnov's Revenge / Fighter's History Dynamite</description> <year>1994</year> <manufacturer>Data East Corporation</manufacturer> @@ -324457,9 +324832,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gururin" romof="neogeo"> + <game name="gururin" sourcefile="neogeo.c" romof="neogeo"> <description>Gururin</description> <year>1994</year> <manufacturer>Face</manufacturer> @@ -324519,9 +324894,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pspikes2" romof="neogeo"> + <game name="pspikes2" sourcefile="neogeo.c" romof="neogeo"> <description>Power Spikes II</description> <year>1994</year> <manufacturer>Video System Co.</manufacturer> @@ -324587,9 +324962,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="fatfury3" romof="neogeo"> + <game name="fatfury3" sourcefile="neogeo.c" romof="neogeo"> <description>Fatal Fury 3 - Road to the Final Victory / Garou Densetsu 3 - haruka-naru tatakai</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -324656,9 +325031,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="panicbom" romof="neogeo"> + <game name="panicbom" sourcefile="neogeo.c" romof="neogeo"> <description>Panic Bomber</description> <year>1994</year> <manufacturer>Eighting / Hudson</manufacturer> @@ -324719,9 +325094,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aodk" romof="neogeo"> + <game name="aodk" sourcefile="neogeo.c" romof="neogeo"> <description>Aggressors of Dark Kombat / Tsuukai GANGAN Koushinkyoku</description> <year>1994</year> <manufacturer>ADK / SNK</manufacturer> @@ -324788,9 +325163,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sonicwi2" romof="neogeo"> + <game name="sonicwi2" sourcefile="neogeo.c" romof="neogeo"> <description>Aero Fighters 2 / Sonic Wings 2</description> <year>1994</year> <manufacturer>Video System Co.</manufacturer> @@ -324853,9 +325228,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="zedblade" romof="neogeo"> + <game name="zedblade" sourcefile="neogeo.c" romof="neogeo"> <description>Zed Blade / Operation Ragnarok</description> <year>1994</year> <manufacturer>NMK</manufacturer> @@ -324919,9 +325294,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="galaxyfg" romof="neogeo"> + <game name="galaxyfg" sourcefile="neogeo.c" romof="neogeo"> <description>Galaxy Fight - Universal Warriors</description> <year>1995</year> <manufacturer>Sunsoft</manufacturer> @@ -324989,9 +325364,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="strhoop" romof="neogeo"> + <game name="strhoop" sourcefile="neogeo.c" romof="neogeo"> <description>Street Hoop / Street Slam / Dunk Dream</description> <year>1994</year> <manufacturer>Data East Corporation</manufacturer> @@ -325054,9 +325429,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="quizkof" romof="neogeo"> + <game name="quizkof" sourcefile="neogeo.c" romof="neogeo"> <description>Quiz King of Fighters</description> <year>1995</year> <manufacturer>Saurus</manufacturer> @@ -325120,9 +325495,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssideki3" romof="neogeo"> + <game name="ssideki3" sourcefile="neogeo.c" romof="neogeo"> <description>Super Sidekicks 3 - The Next Glory / Tokuten Ou 3 - eikoue no michi</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -325188,9 +325563,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="doubledr" romof="neogeo"> + <game name="doubledr" sourcefile="neogeo.c" romof="neogeo"> <description>Double Dragon (Neo-Geo)</description> <year>1995</year> <manufacturer>Technos</manufacturer> @@ -325257,9 +325632,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pbobblen" romof="neogeo"> + <game name="pbobblen" sourcefile="neogeo.c" romof="neogeo"> <description>Puzzle Bobble / Bust-A-Move (Neo-Geo) (set 1)</description> <year>1994</year> <manufacturer>Taito</manufacturer> @@ -325320,9 +325695,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pbobblna" cloneof="pbobblen" romof="pbobblen"> + <game name="pbobblna" sourcefile="neogeo.c" cloneof="pbobblen" romof="pbobblen"> <description>Puzzle Bobble / Bust-A-Move (Neo-Geo) (set 2)</description> <year>1994</year> <manufacturer>Taito</manufacturer> @@ -325383,9 +325758,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof95" romof="neogeo"> + <game name="kof95" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters '95 (set 1)</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -325453,9 +325828,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof95a" cloneof="kof95" romof="kof95"> + <game name="kof95a" sourcefile="neogeo.c" cloneof="kof95" romof="kof95"> <description>The King of Fighters '95 (set 2)</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -325523,9 +325898,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="tws96" romof="neogeo"> + <game name="tws96" sourcefile="neogeo.c" romof="neogeo"> <description>Tecmo World Soccer '96</description> <year>1996</year> <manufacturer>Tecmo</manufacturer> @@ -325588,9 +325963,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="samsho3" romof="neogeo"> + <game name="samsho3" sourcefile="neogeo.c" romof="neogeo"> <description>Samurai Shodown III / Samurai Spirits - Zankurou Musouken</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -325658,9 +326033,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="stakwin" romof="neogeo"> + <game name="stakwin" sourcefile="neogeo.c" romof="neogeo"> <description>Stakes Winner / Stakes Winner - GI kinzen seihae no michi</description> <year>1995</year> <manufacturer>Saurus</manufacturer> @@ -325722,9 +326097,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pulstar" romof="neogeo"> + <game name="pulstar" sourcefile="neogeo.c" romof="neogeo"> <description>Pulstar</description> <year>1995</year> <manufacturer>Aicom</manufacturer> @@ -325792,9 +326167,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="whp" romof="neogeo"> + <game name="whp" sourcefile="neogeo.c" romof="neogeo"> <description>World Heroes Perfect</description> <year>1995</year> <manufacturer>ADK / SNK</manufacturer> @@ -325862,9 +326237,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kabukikl" romof="neogeo"> + <game name="kabukikl" sourcefile="neogeo.c" romof="neogeo"> <description>Far East of Eden - Kabuki Klash / Tengai Makyou - Shin Den</description> <year>1995</year> <manufacturer>Hudson</manufacturer> @@ -325929,9 +326304,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="neobombe" romof="neogeo"> + <game name="neobombe" sourcefile="neogeo.c" romof="neogeo"> <description>Neo Bomberman</description> <year>1997</year> <manufacturer>Hudson</manufacturer> @@ -325994,9 +326369,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="gowcaizr" romof="neogeo"> + <game name="gowcaizr" sourcefile="neogeo.c" romof="neogeo"> <description>Voltage Fighter - Gowcaizer / Choujin Gakuen Gowcaizer</description> <year>1995</year> <manufacturer>Technos</manufacturer> @@ -326064,9 +326439,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rbff1" romof="neogeo"> + <game name="rbff1" sourcefile="neogeo.c" romof="neogeo"> <description>Real Bout Fatal Fury / Real Bout Garou Densetsu</description> <year>1995</year> <manufacturer>SNK</manufacturer> @@ -326135,9 +326510,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="aof3" romof="neogeo"> + <game name="aof3" sourcefile="neogeo.c" romof="neogeo"> <description>Art of Fighting 3 - The Path of the Warrior / Art of Fighting - Ryuuko no Ken Gaiden</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -326206,9 +326581,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sonicwi3" romof="neogeo"> + <game name="sonicwi3" sourcefile="neogeo.c" romof="neogeo"> <description>Aero Fighters 3 / Sonic Wings 3</description> <year>1995</year> <manufacturer>Video System Co.</manufacturer> @@ -326271,9 +326646,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="turfmast" romof="neogeo"> + <game name="turfmast" sourcefile="neogeo.c" romof="neogeo"> <description>Neo Turf Masters / Big Tournament Golf</description> <year>1996</year> <manufacturer>Nazca</manufacturer> @@ -326336,9 +326711,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mslug" romof="neogeo"> + <game name="mslug" sourcefile="neogeo.c" romof="neogeo"> <description>Metal Slug - Super Vehicle-001</description> <year>1996</year> <manufacturer>Nazca</manufacturer> @@ -326401,9 +326776,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="puzzledp" romof="neogeo"> + <game name="puzzledp" sourcefile="neogeo.c" romof="neogeo"> <description>Puzzle De Pon!</description> <year>1995</year> <manufacturer>Taito (Visco license)</manufacturer> @@ -326463,9 +326838,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mosyougi" romof="neogeo"> + <game name="mosyougi" sourcefile="neogeo.c" romof="neogeo"> <description>Syougi No Tatsujin - Master of Syougi</description> <year>1995</year> <manufacturer>ADK / SNK</manufacturer> @@ -326525,9 +326900,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="marukodq" romof="neogeo"> + <game name="marukodq" sourcefile="neogeo.c" romof="neogeo"> <description>Chibi Marukochan Deluxe Quiz</description> <year>1995</year> <manufacturer>Takara</manufacturer> @@ -326590,9 +326965,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="neomrdo" romof="neogeo"> + <game name="neomrdo" sourcefile="neogeo.c" romof="neogeo"> <description>Neo Mr. Do!</description> <year>1996</year> <manufacturer>Visco</manufacturer> @@ -326652,9 +327027,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="sdodgeb" romof="neogeo"> + <game name="sdodgeb" sourcefile="neogeo.c" romof="neogeo"> <description>Super Dodge Ball / Kunio no Nekketsu Toukyuu Densetsu</description> <year>1996</year> <manufacturer>Technos</manufacturer> @@ -326717,9 +327092,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="goalx3" romof="neogeo"> + <game name="goalx3" sourcefile="neogeo.c" romof="neogeo"> <description>Goal! Goal! Goal!</description> <year>1995</year> <manufacturer>Visco</manufacturer> @@ -326781,9 +327156,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="overtop" romof="neogeo"> + <game name="overtop" sourcefile="neogeo.c" romof="neogeo"> <description>Over Top</description> <year>1996</year> <manufacturer>ADK</manufacturer> @@ -326847,9 +327222,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="neodrift" romof="neogeo"> + <game name="neodrift" sourcefile="neogeo.c" romof="neogeo"> <description>Neo Drift Out - New Technology</description> <year>1996</year> <manufacturer>Visco</manufacturer> @@ -326910,9 +327285,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof96" romof="neogeo"> + <game name="kof96" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters '96 (set 1)</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -326981,9 +327356,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof96h" cloneof="kof96" romof="kof96"> + <game name="kof96h" sourcefile="neogeo.c" cloneof="kof96" romof="kof96"> <description>The King of Fighters '96 (set 2)</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -327052,9 +327427,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ssideki4" romof="neogeo"> + <game name="ssideki4" sourcefile="neogeo.c" romof="neogeo"> <description>Ultimate 11 - The SNK Football Championship / Tokuten Ou - Honoo no Libero, The</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -327119,9 +327494,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kizuna" romof="neogeo"> + <game name="kizuna" sourcefile="neogeo.c" romof="neogeo"> <description>Kizuna Encounter - Super Tag Battle / Fu'un Super Tag Battle</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -327190,9 +327565,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ninjamas" romof="neogeo"> + <game name="ninjamas" sourcefile="neogeo.c" romof="neogeo"> <description>Ninja Master's - haoh-ninpo-cho</description> <year>1996</year> <manufacturer>ADK / SNK</manufacturer> @@ -327260,9 +327635,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ragnagrd" romof="neogeo"> + <game name="ragnagrd" sourcefile="neogeo.c" romof="neogeo"> <description>Ragnagard / Shin-Oh-Ken</description> <year>1996</year> <manufacturer>Saurus</manufacturer> @@ -327329,9 +327704,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pgoal" romof="neogeo"> + <game name="pgoal" sourcefile="neogeo.c" romof="neogeo"> <description>Pleasure Goal / Futsal - 5 on 5 Mini Soccer</description> <year>1996</year> <manufacturer>Saurus</manufacturer> @@ -327396,9 +327771,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="magdrop2" romof="neogeo"> + <game name="magdrop2" sourcefile="neogeo.c" romof="neogeo"> <description>Magical Drop II</description> <year>1996</year> <manufacturer>Data East Corporation</manufacturer> @@ -327458,9 +327833,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="samsho4" romof="neogeo"> + <game name="samsho4" sourcefile="neogeo.c" romof="neogeo"> <description>Samurai Shodown IV - Amakusa's Revenge / Samurai Spirits - Amakusa Kourin</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -327529,9 +327904,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rbffspec" romof="neogeo"> + <game name="rbffspec" sourcefile="neogeo.c" romof="neogeo"> <description>Real Bout Fatal Fury Special / Real Bout Garou Densetsu Special</description> <year>1996</year> <manufacturer>SNK</manufacturer> @@ -327600,9 +327975,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="twinspri" romof="neogeo"> + <game name="twinspri" sourcefile="neogeo.c" romof="neogeo"> <description>Twinkle Star Sprites</description> <year>1996</year> <manufacturer>ADK</manufacturer> @@ -327665,9 +328040,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="wakuwak7" romof="neogeo"> + <game name="wakuwak7" sourcefile="neogeo.c" romof="neogeo"> <description>Waku Waku 7</description> <year>1996</year> <manufacturer>Sunsoft</manufacturer> @@ -327733,9 +328108,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="stakwin2" romof="neogeo"> + <game name="stakwin2" sourcefile="neogeo.c" romof="neogeo"> <description>Stakes Winner 2</description> <year>1996</year> <manufacturer>Saurus</manufacturer> @@ -327798,9 +328173,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="breakers" romof="neogeo"> + <game name="breakers" sourcefile="neogeo.c" romof="neogeo"> <description>Breakers</description> <year>1996</year> <manufacturer>Visco</manufacturer> @@ -327863,9 +328238,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="miexchng" romof="neogeo"> + <game name="miexchng" sourcefile="neogeo.c" romof="neogeo"> <description>Money Puzzle Exchanger / Money Idol Exchanger</description> <year>1997</year> <manufacturer>Face</manufacturer> @@ -327927,9 +328302,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof97" romof="neogeo"> + <game name="kof97" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters '97 (set 1)</description> <year>1997</year> <manufacturer>SNK</manufacturer> @@ -327996,9 +328371,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof97a" cloneof="kof97" romof="kof97"> + <game name="kof97a" sourcefile="neogeo.c" cloneof="kof97" romof="kof97"> <description>The King of Fighters '97 (set 2)</description> <year>1997</year> <manufacturer>SNK</manufacturer> @@ -328065,9 +328440,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="magdrop3" romof="neogeo"> + <game name="magdrop3" sourcefile="neogeo.c" romof="neogeo"> <description>Magical Drop III</description> <year>1997</year> <manufacturer>Data East Corporation</manufacturer> @@ -328130,9 +328505,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lastblad" romof="neogeo"> + <game name="lastblad" sourcefile="neogeo.c" romof="neogeo"> <description>Last Blade / Bakumatsu Roman - Gekka no Kenshi, The (set 1)</description> <year>1997</year> <manufacturer>SNK</manufacturer> @@ -328200,9 +328575,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lastblda" cloneof="lastblad" romof="lastblad"> + <game name="lastblda" sourcefile="neogeo.c" cloneof="lastblad" romof="lastblad"> <description>Last Blade / Bakumatsu Roman - Gekka no Kenshi, The (set 2)</description> <year>1997</year> <manufacturer>SNK</manufacturer> @@ -328270,9 +328645,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="puzzldpr" cloneof="puzzledp" romof="puzzledp"> + <game name="puzzldpr" sourcefile="neogeo.c" cloneof="puzzledp" romof="puzzledp"> <description>Puzzle De Pon! R!</description> <year>1997</year> <manufacturer>Taito (Visco license)</manufacturer> @@ -328332,9 +328707,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="irrmaze" romof="neogeo"> + <game name="irrmaze" sourcefile="neogeo.c" romof="neogeo"> <description>The Irritating Maze / Ultra Denryu Iraira Bou</description> <year>1997</year> <manufacturer>SNK / Saurus</manufacturer> @@ -328389,9 +328764,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="popbounc" romof="neogeo"> + <game name="popbounc" sourcefile="neogeo.c" romof="neogeo"> <description>Pop 'n Bounce / Gapporin</description> <year>1997</year> <manufacturer>Video System Co.</manufacturer> @@ -328451,9 +328826,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shocktro" romof="neogeo"> + <game name="shocktro" sourcefile="neogeo.c" romof="neogeo"> <description>Shock Troopers (set 1)</description> <year>1997</year> <manufacturer>Saurus</manufacturer> @@ -328521,9 +328896,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shocktra" cloneof="shocktro" romof="shocktro"> + <game name="shocktra" sourcefile="neogeo.c" cloneof="shocktro" romof="shocktro"> <description>Shock Troopers (set 2)</description> <year>1997</year> <manufacturer>Saurus</manufacturer> @@ -328591,9 +328966,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="blazstar" romof="neogeo"> + <game name="blazstar" sourcefile="neogeo.c" romof="neogeo"> <description>Blazing Star</description> <year>1998</year> <manufacturer>Yumekobo</manufacturer> @@ -328661,9 +329036,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rbff2" romof="neogeo"> + <game name="rbff2" sourcefile="neogeo.c" romof="neogeo"> <description>Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - the newcomers (set 1)</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -328731,9 +329106,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="rbff2a" cloneof="rbff2" romof="rbff2"> + <game name="rbff2a" sourcefile="neogeo.c" cloneof="rbff2" romof="rbff2"> <description>Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - the newcomers (set 2)</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -328801,9 +329176,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mslug2" romof="neogeo"> + <game name="mslug2" sourcefile="neogeo.c" romof="neogeo"> <description>Metal Slug 2 - Super Vehicle-001/II</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -328867,9 +329242,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof98" romof="neogeo"> + <game name="kof98" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters '98 - The Slugfest / King of Fighters '98 - dream match never ends</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -328939,9 +329314,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof98n" cloneof="kof98" romof="kof98"> + <game name="kof98n" sourcefile="neogeo.c" cloneof="kof98" romof="kof98"> <description>The King of Fighters '98 - The Slugfest / King of Fighters '98 - dream match never ends (not encrypted)</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -329011,9 +329386,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="lastbld2" romof="neogeo"> + <game name="lastbld2" sourcefile="neogeo.c" romof="neogeo"> <description>Last Blade 2 / Bakumatsu Roman - Dai Ni Maku Gekka no Kenshi, The</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -329081,9 +329456,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="neocup98" romof="neogeo"> + <game name="neocup98" sourcefile="neogeo.c" romof="neogeo"> <description>Neo-Geo Cup '98 - The Road to the Victory</description> <year>1998</year> <manufacturer>SNK</manufacturer> @@ -329144,9 +329519,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="breakrev" cloneof="breakers" romof="breakers"> + <game name="breakrev" sourcefile="neogeo.c" cloneof="breakers" romof="breakers"> <description>Breakers Revenge</description> <year>1998</year> <manufacturer>Visco</manufacturer> @@ -329211,9 +329586,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="shocktr2" romof="neogeo"> + <game name="shocktr2" sourcefile="neogeo.c" romof="neogeo"> <description>Shock Troopers - 2nd Squad</description> <year>1998</year> <manufacturer>Saurus</manufacturer> @@ -329280,9 +329655,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="flipshot" romof="neogeo"> + <game name="flipshot" sourcefile="neogeo.c" romof="neogeo"> <description>Battle Flip Shot</description> <year>1998</year> <manufacturer>Visco</manufacturer> @@ -329342,9 +329717,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="pbobbl2n" romof="neogeo"> + <game name="pbobbl2n" sourcefile="neogeo.c" romof="neogeo"> <description>Puzzle Bobble 2 / Bust-A-Move Again (Neo-Geo)</description> <year>1999</year> <manufacturer>Taito (SNK license)</manufacturer> @@ -329407,9 +329782,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ctomaday" romof="neogeo"> + <game name="ctomaday" sourcefile="neogeo.c" romof="neogeo"> <description>Captain Tomaday</description> <year>1999</year> <manufacturer>Visco</manufacturer> @@ -329470,9 +329845,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mslugx" romof="neogeo"> + <game name="mslugx" sourcefile="neogeo.c" romof="neogeo"> <description>Metal Slug X - Super Vehicle-001</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -329539,9 +329914,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof99" romof="neogeo"> + <game name="kof99" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters '99 - Millennium Battle (set 1)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -329611,9 +329986,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof99a" cloneof="kof99" romof="kof99"> + <game name="kof99a" sourcefile="neogeo.c" cloneof="kof99" romof="kof99"> <description>The King of Fighters '99 - Millennium Battle (set 2)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -329683,9 +330058,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof99e" cloneof="kof99" romof="kof99"> + <game name="kof99e" sourcefile="neogeo.c" cloneof="kof99" romof="kof99"> <description>The King of Fighters '99 - Millennium Battle (earlier)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -329757,9 +330132,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof99n" cloneof="kof99" romof="kof99"> + <game name="kof99n" sourcefile="neogeo.c" cloneof="kof99" romof="kof99"> <description>The King of Fighters '99 - Millennium Battle (not encrypted)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -329828,9 +330203,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof99p" cloneof="kof99" romof="kof99"> + <game name="kof99p" sourcefile="neogeo.c" cloneof="kof99" romof="kof99"> <description>The King of Fighters '99 - Millennium Battle (prototype)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -329900,9 +330275,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="ganryu" romof="neogeo"> + <game name="ganryu" sourcefile="neogeo.c" romof="neogeo"> <description>Musashi Ganryuuki</description> <year>1999</year> <manufacturer>Visco</manufacturer> @@ -329961,9 +330336,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="garou" romof="neogeo"> + <game name="garou" sourcefile="neogeo.c" romof="neogeo"> <description>Garou - Mark of the Wolves (set 1)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -330035,9 +330410,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="garouo" cloneof="garou" romof="garou"> + <game name="garouo" sourcefile="neogeo.c" cloneof="garou" romof="garou"> <description>Garou - Mark of the Wolves (set 2)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -330107,9 +330482,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="garoup" cloneof="garou" romof="garou"> + <game name="garoup" sourcefile="neogeo.c" cloneof="garou" romof="garou"> <description>Garou - Mark of the Wolves (prototype)</description> <year>1999</year> <manufacturer>SNK</manufacturer> @@ -330179,9 +330554,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="s1945p" romof="neogeo"> + <game name="s1945p" sourcefile="neogeo.c" romof="neogeo"> <description>Strikers 1945 Plus</description> <year>1999</year> <manufacturer>Psikyo</manufacturer> @@ -330250,9 +330625,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="preisle2" romof="neogeo"> + <game name="preisle2" sourcefile="neogeo.c" romof="neogeo"> <description>Prehistoric Isle 2</description> <year>1999</year> <manufacturer>Yumekobo</manufacturer> @@ -330317,9 +330692,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mslug3" romof="neogeo"> + <game name="mslug3" sourcefile="neogeo.c" romof="neogeo"> <description>Metal Slug 3</description> <year>2000</year> <manufacturer>SNK</manufacturer> @@ -330389,9 +330764,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="mslug3n" cloneof="mslug3" romof="mslug3"> + <game name="mslug3n" sourcefile="neogeo.c" cloneof="mslug3" romof="mslug3"> <description>Metal Slug 3 (not encrypted)</description> <year>2000</year> <manufacturer>SNK</manufacturer> @@ -330460,9 +330835,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof2000" romof="neogeo"> + <game name="kof2000" sourcefile="neogeo.c" romof="neogeo"> <description>The King of Fighters 2000</description> <year>2000</year> <manufacturer>SNK</manufacturer> @@ -330533,9 +330908,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="kof2000n" cloneof="kof2000" romof="kof2000"> + <game name="kof2000n" sourcefile="neogeo.c" cloneof="kof2000" romof="kof2000"> <description>The King of Fighters 2000 (not encrypted)</description> <year>2000</year> <manufacturer>SNK</manufacturer> @@ -330605,9 +330980,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="bangbead" romof="neogeo"> + <game name="bangbead" sourcefile="neogeo.c" romof="neogeo"> <description>Bang Bead</description> <year>2000</year> <manufacturer>Visco</manufacturer> @@ -330667,9 +331042,9 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> - <game name="nitd" romof="neogeo"> + <game name="nitd" sourcefile="neogeo.c" romof="neogeo"> <description>Nightmare in the Dark</description> <year>2000</year> <manufacturer>Eleven / Gavaking</manufacturer> @@ -330728,7 +331103,7 @@ <dipvalue name="Off" default="yes"/> <dipvalue name="On"/> </dipswitch> - <driver status="good" color="good" sound="good" palettesize="4096"/> + <driver status="good" color="good" sound="good" graphic="good" palettesize="4096"/> </game> <game runnable="no" name="neogeo"> <description>Neo-Geo</description>
View file
libretro-mame2003-0~git20200805.tar.xz/precompile/hiscore_dat.h -> libretro-mame2003-0~git20210529.tar.xz/precompile/hiscore_dat.h
Changed
@@ -1,12018 +1,12770 @@ -const unsigned char hiscoredat_bytes[] = { +static const unsigned char hiscoredat_bytes[] = { 59, 32, 32, 32, 32, 32, 95, 95, 95, 32, 32, 32, 95, 95, 95, 32, 95, 95, 95, 32, 95, 95, 95, 95, 95, 95, 95, 95, 32, 95, 95, 95, 95, 95, 95, 32, 32, 95, 95, 95, 95, 95, 95, 95, 95, 32, 95, 95, 95, 95, 95, 32, 32, 32, 32, 32, 95, 95, 95, 95, 95, 95, 95, 32, 32, 32, 32, 95, 95, 95, 95, 95, 95, 32, 32, 32, 95, 95, 95, 95, 95, 95, 95, 32, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 10, 59, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 47, 32, - 32, 47, 47, 32, 32, 47, 47, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, 32, - 95, 95, 95, 47, 32, 47, 32, 95, 95, 95, 95, 32, 32, 47, 47, 32, 95, 32, - 32, 32, 92, 32, 32, 32, 47, 32, 32, 32, 32, 32, 32, 47, 32, 32, 32, 47, - 32, 95, 95, 32, 32, 32, 92, 32, 47, 32, 95, 95, 32, 32, 32, 47, 47, 95, - 95, 95, 32, 32, 32, 95, 95, 95, 47, 10, 59, 32, 32, 32, 47, 32, 32, 47, - 95, 95, 47, 32, 32, 47, 47, 32, 32, 47, 47, 32, 32, 95, 95, 95, 95, 95, - 47, 47, 32, 32, 47, 32, 32, 32, 32, 47, 32, 47, 32, 32, 32, 47, 32, 47, - 47, 32, 47, 95, 47, 32, 32, 47, 32, 32, 47, 32, 32, 95, 95, 95, 95, 47, - 32, 32, 32, 47, 32, 47, 32, 32, 92, 32, 32, 47, 47, 32, 47, 95, 47, 32, - 32, 47, 32, 32, 32, 32, 47, 32, 32, 47, 10, 59, 32, 32, 47, 32, 32, 95, - 95, 32, 32, 32, 32, 47, 47, 32, 32, 47, 47, 95, 95, 95, 95, 32, 32, 32, - 47, 47, 32, 32, 47, 32, 32, 32, 32, 47, 32, 47, 32, 32, 32, 47, 32, 47, - 47, 32, 32, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 95, 95, 95, 95, 47, - 32, 32, 32, 47, 32, 47, 32, 32, 32, 47, 32, 47, 47, 32, 95, 95, 32, 32, - 32, 47, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 10, 59, 32, 47, 32, 32, - 47, 32, 32, 47, 32, 32, 47, 47, 32, 32, 47, 47, 32, 32, 32, 32, 32, 32, - 32, 47, 47, 32, 32, 47, 95, 95, 95, 32, 47, 32, 47, 95, 95, 95, 47, 32, - 47, 47, 32, 32, 47, 92, 32, 32, 92, 32, 32, 47, 32, 32, 32, 32, 32, 32, - 47, 95, 32, 32, 47, 32, 47, 95, 95, 95, 47, 32, 47, 47, 32, 47, 32, 32, - 47, 32, 47, 32, 32, 32, 32, 47, 32, 32, 47, 32, 10, 59, 47, 95, 95, 47, - 32, 32, 47, 95, 95, 47, 47, 95, 95, 47, 47, 95, 95, 95, 95, 95, 95, 95, - 47, 47, 95, 95, 95, 95, 95, 95, 47, 47, 95, 95, 95, 95, 95, 95, 95, 47, - 47, 95, 95, 47, 32, 32, 92, 95, 95, 92, 47, 95, 95, 95, 95, 95, 95, 47, - 47, 95, 47, 47, 95, 95, 95, 95, 95, 95, 95, 47, 47, 95, 47, 32, 32, 47, - 95, 47, 32, 32, 32, 32, 47, 95, 95, 47, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 10, 59, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 13, 10, 59, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 47, + 32, 32, 47, 47, 32, 32, 47, 47, 32, 32, 32, 32, 32, 32, 32, 47, 47, 32, + 32, 95, 95, 95, 47, 32, 47, 32, 95, 95, 95, 95, 32, 32, 47, 47, 32, 95, + 32, 32, 32, 92, 32, 32, 32, 47, 32, 32, 32, 32, 32, 32, 47, 32, 32, 32, + 47, 32, 95, 95, 32, 32, 32, 92, 32, 47, 32, 95, 95, 32, 32, 32, 47, 47, + 95, 95, 95, 32, 32, 32, 95, 95, 95, 47, 13, 10, 59, 32, 32, 32, 47, 32, + 32, 47, 95, 95, 47, 32, 32, 47, 47, 32, 32, 47, 47, 32, 32, 95, 95, 95, + 95, 95, 47, 47, 32, 32, 47, 32, 32, 32, 32, 47, 32, 47, 32, 32, 32, 47, + 32, 47, 47, 32, 47, 95, 47, 32, 32, 47, 32, 32, 47, 32, 32, 95, 95, 95, + 95, 47, 32, 32, 32, 47, 32, 47, 32, 32, 92, 32, 32, 47, 47, 32, 47, 95, + 47, 32, 32, 47, 32, 32, 32, 32, 47, 32, 32, 47, 13, 10, 59, 32, 32, 47, + 32, 32, 95, 95, 32, 32, 32, 32, 47, 47, 32, 32, 47, 47, 95, 95, 95, 95, + 32, 32, 32, 47, 47, 32, 32, 47, 32, 32, 32, 32, 47, 32, 47, 32, 32, 32, + 47, 32, 47, 47, 32, 32, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 95, 95, + 95, 95, 47, 32, 32, 32, 47, 32, 47, 32, 32, 32, 47, 32, 47, 47, 32, 95, + 95, 32, 32, 32, 47, 32, 32, 32, 32, 47, 32, 32, 47, 13, 10, 59, 32, 47, + 32, 32, 47, 32, 32, 47, 32, 32, 47, 47, 32, 32, 47, 47, 32, 32, 32, 32, + 32, 32, 32, 47, 47, 32, 32, 47, 95, 95, 95, 32, 47, 32, 47, 95, 95, 95, + 47, 32, 47, 47, 32, 32, 47, 92, 32, 32, 92, 32, 32, 47, 32, 32, 32, 32, + 32, 32, 47, 95, 32, 32, 47, 32, 47, 95, 95, 95, 47, 32, 47, 47, 32, 47, + 32, 32, 47, 32, 47, 32, 32, 32, 32, 47, 32, 32, 47, 13, 10, 59, 47, 95, + 95, 47, 32, 32, 47, 95, 95, 47, 47, 95, 95, 47, 47, 95, 95, 95, 95, 95, + 95, 95, 47, 47, 95, 95, 95, 95, 95, 95, 47, 47, 95, 95, 95, 95, 95, 95, + 95, 47, 47, 95, 95, 47, 32, 32, 92, 95, 95, 92, 47, 95, 95, 95, 95, 95, + 95, 47, 47, 95, 47, 47, 95, 95, 95, 95, 95, 95, 95, 47, 47, 95, 47, 32, + 32, 47, 95, 47, 32, 32, 32, 32, 47, 95, 95, 47, 13, 10, 59, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 10, 10, 59, 84,104,105,115, 32,102,105, - 108,101, 32, 99, 97,110, 32, 98,101, 32,101,100,105,116,101,100, 32,119, - 105,116,104, 32, 97, 32,116,101,120,116, 32,101,100,105,116,111,114, 44, - 32, 98,117,116, 32,107,101,101,112, 32,116,104,101, 32,115, 97,109,101, - 32,102,111,114,109, 97,116, 58, 10, 59, 32, 97,108,108, 32,102,105,101, - 108,100,115, 32, 97,114,101, 32,115,101,112, 97,114, 97,116,101,100, 32, - 98,121, 32, 97, 32, 99,111,108,111,110, 32, 40, 58, 41, 10, 59, 32, 60, - 103, 97,109,101,110, 97,109,101, 62, 58, 10, 59, 32, 60, 99,112,117, 62, - 58, 60, 97,100,100,114,101,115,115, 62, 58, 60,108,101,110,103,116,104, - 62, 58, 60,118, 97,108,117,101, 32,116,111, 32,119, 97,105,116, 32,102, - 111,114, 32, 10, 59, 32,105,110, 32,116,104,101, 32,102,105,114,115,116, - 32, 98,121,116,101, 47,119,111,114,100, 62, 58, 60,118, 97,108,117,101, - 32,116,111, 32,119, 97,105,116, 32,102,111,114, 32,105,110, 32,116,104, - 101, 32,108, 97,115,116, 32, 98,121,116,101, 47,119,111,114,100, 62, 10, - 59, 32, 91,114,101,112,101, 97,116, 32,116,104,101, 32, 97, 98,111,118, - 101, 32, 97,115, 32,109, 97,110,121, 32,116,105,109,101,115, 32, 97,115, - 32,110,101, 99,101,115,115, 97,114,121, 93, 10, 59, 10, 59, 32, 42, 42, - 42, 32, 65,108,108, 32, 69,110,116,114,105,101,115, 32, 87,105,116,104, - 111,117,116, 32, 78, 97,109,101, 32, 68,111,110,101, 32, 66,121, 32, 77, - 101, 32, 33, 33, 32, 40, 32, 76,101,101,122,101,114, 32, 41, 32, 59, 48, - 41, 32,108,101,101,122,101,114, 64,108,101,101,122,101,114, 46,107, 97, - 114,111,111, 46, 99,111, 46,117,107, 32, 42, 42, 42, 10, 59, 10, 59, 32, - 99,111,110,116, 97, 99,116, 32,102,105,114,101, 98,114, 97,110,100, 32, - 97,116, 32, 58, 45, 32,102,105,114,101, 98,114, 97,110,100, 55, 53, 64, - 104,111,116,109, 97,105,108, 46, 99,111,109, 10, 59, 32, 85,110,111,102, - 102,105, 99,105, 97,108, 32,104,105,115, 99,111,114,101, 46,100, 97,116, - 32,102,105,108,101, 32,111,102,102,105, 99,105, 97,108, 32,119,101, 98, - 115,105,116,101, 32, 58, 45, 32,104,116,116,112, 58, 47, 47,104,105,103, - 104,115, 99,111,114,101, 46,109, 97,109,101,119,111,114,108,100, 46,105, - 110,102,111, 47, 10, 59, 32, 84,104,105,115, 32,104,105,115, 99,111,114, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 13, 10, 13, 10, + 59, 84,104,105,115, 32,102,105,108,101, 32, 99, 97,110, 32, 98,101, 32, + 101,100,105,116,101,100, 32,119,105,116,104, 32, 97, 32,116,101,120,116, + 32,101,100,105,116,111,114, 44, 32, 98,117,116, 32,107,101,101,112, 32, + 116,104,101, 32,115, 97,109,101, 32,102,111,114,109, 97,116, 58, 13, 10, + 59, 32, 97,108,108, 32,102,105,101,108,100,115, 32, 97,114,101, 32,115, + 101,112, 97,114, 97,116,101,100, 32, 98,121, 32, 97, 32, 99,111,108,111, + 110, 32, 40, 58, 41, 13, 10, 59, 32, 60,103, 97,109,101,110, 97,109,101, + 62, 58, 13, 10, 59, 32, 60, 99,112,117, 62, 58, 60, 97,100,100,114,101, + 115,115, 62, 58, 60,108,101,110,103,116,104, 62, 58, 60,118, 97,108,117, + 101, 32,116,111, 32,119, 97,105,116, 32,102,111,114, 13, 10, 59, 32,105, + 110, 32,116,104,101, 32,102,105,114,115,116, 32, 98,121,116,101, 47,119, + 111,114,100, 62, 58, 60,118, 97,108,117,101, 32,116,111, 32,119, 97,105, + 116, 32,102,111,114, 32,105,110, 32,116,104,101, 32,108, 97,115,116, 32, + 98,121,116,101, 47,119,111,114,100, 62, 13, 10, 59, 32, 91,114,101,112, + 101, 97,116, 32,116,104,101, 32, 97, 98,111,118,101, 32, 97,115, 32,109, + 97,110,121, 32,116,105,109,101,115, 32, 97,115, 32,110,101, 99,101,115, + 115, 97,114,121, 93, 13, 10, 59, 13, 10, 59, 32, 42, 42, 42, 32, 65,108, + 108, 32, 69,110,116,114,105,101,115, 32, 87,105,116,104,111,117,116, 32, + 78, 97,109,101, 32, 68,111,110,101, 32, 66,121, 32, 77,101, 32, 33, 33, + 32, 40, 32, 76,101,101,122,101,114, 32, 41, 32, 59, 48, 41, 32,108,101, + 101,122,101,114, 64,108,101,101,122,101,114, 46,107, 97,114,111,111, 46, + 99,111, 46,117,107, 32, 42, 42, 42, 13, 10, 59, 13, 10, 59, 32, 99,111, + 110,116, 97, 99,116, 32,102,105,114,101, 98,114, 97,110,100, 32, 97,116, + 32, 58, 45, 32,102,105,114,101, 98,114, 97,110,100, 55, 53, 64,104,111, + 116,109, 97,105,108, 46, 99,111,109, 13, 10, 59, 32, 85,110,111,102,102, + 105, 99,105, 97,108, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32, + 102,105,108,101, 32,111,102,102,105, 99,105, 97,108, 32,119,101, 98,115, + 105,116,101, 32, 58, 45, 32,104,116,116,112, 58, 47, 47,104,105,103,104, + 115, 99,111,114,101, 46,109, 97,109,101,119,111,114,108,100, 46,105,110, + 102,111, 47, 13, 10, 59, 32, 84,104,105,115, 32,104,105,115, 99,111,114, 101, 46,100, 97,116, 32,105,115, 32,102,111,114, 32,117,115,101, 32,119, 105,116,104, 32,109, 97,109,101, 32,118,101,114,115,105,111,110, 32, 48, 46, 49, 51, 51,117, 49, 32, 97,110,100, 32,110,101,119,101,114, 32, 98, 117,105,108,100,115, 32, 40, 97,117,103, 32, 49, 53,116,104, 32, 48, 57, - 41, 10, 59, 32, 77, 97,109,101,112,108,117,115, 32, 97,108,115,111, 32, - 115,117,112,112,111,114,116,115, 32,104,105,115, 99,111,114,101, 46,100, - 97,116, 32, 58, 45, 32,104,116,116,112, 58, 47, 47,109, 97,109,101,105, - 99,111,110,115, 46,102,114,101,101, 46,102,114, 47,109, 97,109,101, 51, - 50,112, 47, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 41, 13, 10, 59, 32, 77, 97,109,101,112,108,117,115, 32, 97,108,115,111, + 32,115,117,112,112,111,114,116,115, 32,104,105,115, 99,111,114,101, 46, + 100, 97,116, 32, 58, 45, 32,104,116,116,112, 58, 47, 47,109, 97,109,101, + 105, 99,111,110,115, 46,102,114,101,101, 46,102,114, 47,109, 97,109,101, + 51, 50,112, 47, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, 97, - 116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105, - 103,104,115, 99,111,114,101, 95,118, 95,105,110,102,105,110,105,116,121, - 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, - 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, 10, 59, 42, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,105,115, 99,111,114,101, - 46,100, 97,116, 32,100,105,115, 99,111,110,116,105,110,117,101,100, 32, - 97,115, 32,102,114,111,109, 32,109, 97,109,101, 32,118, 48, 46, 49, 48, - 55,117, 50, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 42, 10, 59, 42, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 91, 32,102,111,114, 32, 76,101,101,122,101,114, 39,115, 32, - 112,101,114,115,111,110, 97,108, 32,117,115,101, 32,111,110,108,121, 32, - 93, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 42, 32, 10, 59, 42, 32, 40,116,111, 32,117,115,101, - 32,116,104,105,115, 32, 46,100, 97,116, 32,102,105,108,101, 32, 97,102, - 116,101,114, 32,116,104,101, 32,114,101,108,101, 97,115,101, 32,111,102, - 32,109, 97,109,101, 32,118, 48, 46, 49, 48, 55,117, 50, 32,121,111,117, - 32,109,117,115,116, 32,117,115,101, 41, 32, 42, 10, 59, 42, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 40, 97, 32,104, 97, 99,107,101,100, 32,109, - 97,109,101, 32,116,104, 97,116, 32,101,110, 97, 98,108,101,115, 32,104, - 105,115, 99,111,114,101, 46,100, 97,116, 32,115, 97,118,101,115, 46, 41, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 10, 10,109,101,116,108,102,114,122,114, 58, 10, 48, 58, - 100, 56, 50, 50, 58, 97, 48, 58, 48, 48, 58, 51, 55, 10, 10,112, 97, 99, - 109, 97,110, 98,108, 98, 58, 10, 48, 58, 52, 54, 56, 56, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 53, 49, 56, 48, 58, 49, 58, 52, 48, 58, 52, - 48, 10, 48, 58, 53, 49, 97, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, - 58, 53, 49, 99, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 49, - 101, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 48, 48, 58, - 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 50, 48, 58, 49, 58, 52, - 48, 58, 52, 48, 10, 48, 58, 52, 54, 54,102, 58, 49, 58, 48, 51, 58, 48, - 51, 10, 10, 59,108,111, 99,107,111,110,112,104, 58, 32, 32, 32, 32, 32, - 32, 32, 32, 59, 42, 42, 42, 42, 42, 32,110,101,101,100,115, 32,119,111, - 114,107, 32, 33, 33, 32, 42, 42, 42, 42, 42, 42, 10, 59, 48, 58,102,102, - 101, 52, 53, 57, 58, 56, 55, 58, 48, 51, 58, 48, 48, 10, 59, 48, 58,102, - 102,101, 52, 52, 97, 58, 49, 58, 48, 52, 58, 48, 52, 10, 10,107,110,111, - 99,107,111,117,116, 58, 10,109, 97,114,105,110,101,114, 58, 10,115, 99, - 114, 97,109, 98,108,101,115, 58, 10,116,114,105,112,108,101,112, 58, 10, - 116,114,105,112,108,101,112, 97, 58, 10, 56, 48, 48,102, 97,116,104, 58, - 10,115,116,114,102, 98,111,109, 98, 58, 10,115, 99,114, 97,109, 98, 50, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, 99,114, 97,109, 98,108,101, - 32, 40, 98,111,111,116,108,101,103, 41, 10,107,110,111, 99,107,111,117, - 116, 98, 58, 10,107,110,111, 99,107,111,117,116, 99, 58, 10, 48, 58, 52, - 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 10, 48, 58, 52, 48, 97, - 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 10, 10,102, 98, 97,108,108, 58, - 10, 48, 58,100, 56, 52, 48, 58, 54, 57, 58, 48, 48, 58, 52, 56, 10, 10, - 119,105,110,103,102,111,114, 99, 58, 10, 48, 58, 51, 48,100, 55,101, 55, - 58, 49, 51,102, 58, 48, 48, 58, 51, 53, 10, 10,115,116,114,105,100,101, - 114, 58, 32, 59, 42, 77,105,115,115,105,110,103, 58, 32, 83,116, 97,103, - 101, 32, 99,111,109,112,108,101,116,105,111,110, 32,105,110,102,111,114, - 109, 97,116,105,111,110, 32, 40, 80,108, 97,121,101,114, 32,110, 97,109, - 101, 32, 43, 32, 83, 99,111,114,101, 41, 10,115,116,114,105,100,101,114, - 106, 58, 32, 10,115,116,114,105,100,114,106,114, 58, 32, 10,115,116,114, - 105,100,101,114,117, 97, 58, 10,115,116,114,105,100,101,114,117, 99, 58, - 10, 48, 58,102,102, 56, 57, 97, 97, 58, 55, 56, 58,102,102, 58, 50, 48, - 10, 48, 58,102,102, 48, 99, 97, 52, 58, 48, 52, 58, 48, 48, 58, 48, 48, - 10, 59, 42, 68, 79, 69, 83, 32, 78, 79, 84, 32, 87, 79, 82, 75, 58, 32, - 83,116, 97,103,101, 32, 99,111,109,112,108,101,116,105,111,110, 32,105, - 110,102,111,114,109, 97,116,105,111,110, 32, 40, 80,108, 97,121,101,114, - 32,110, 97,109,101, 32, 43, 32, 83, 99,111,114,101, 41, 10, 59, 42, 48, - 58, 57, 50, 48, 48, 48, 48, 58, 49, 52, 58, 48, 48, 58, 48, 48, 32, 65, - 100,100,114,101,115,115, 32,112,111,105,110,116,101,114,115, 10, 59, 42, - 48, 58, 57, 50, 49, 48, 48, 52, 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, - 83,116, 97,103,101, 58, 32, 83,116, 46, 32, 80,101,116,101,114,115, 98, - 117,114,103, 10, 59, 42, 48, 58, 57, 50, 49, 56, 48, 52, 58, 48, 56, 58, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, 32, + 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97, + 108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 95,105,110,102,105, + 110,105,116,121, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, + 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, + 13, 10, 59, 42, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,105, + 115, 99,111,114,101, 46,100, 97,116, 32,100,105,115, 99,111,110,116,105, + 110,117,101,100, 32, 97,115, 32,102,114,111,109, 32,109, 97,109,101, 32, + 118, 48, 46, 49, 48, 55,117, 50, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 42, 13, 10, 59, 42, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 91, 32,102,111,114, 32, 76,101,101, + 122,101,114, 39,115, 32,112,101,114,115,111,110, 97,108, 32,117,115,101, + 32,111,110,108,121, 32, 93, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 13, 10, 59, 42, 32, 40, + 116,111, 32,117,115,101, 32,116,104,105,115, 32, 46,100, 97,116, 32,102, + 105,108,101, 32, 97,102,116,101,114, 32,116,104,101, 32,114,101,108,101, + 97,115,101, 32,111,102, 32,109, 97,109,101, 32,118, 48, 46, 49, 48, 55, + 117, 50, 32,121,111,117, 32,109,117,115,116, 32,117,115,101, 41, 32, 42, + 13, 10, 59, 42, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 97, 32,104, + 97, 99,107,101,100, 32,109, 97,109,101, 32,116,104, 97,116, 32,101,110, + 97, 98,108,101,115, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32, + 115, 97,118,101,115, 46, 41, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10,109,101, + 116,108,102,114,122,114, 58, 13, 10, 48, 58,100, 56, 50, 50, 58, 97, 48, + 58, 48, 48, 58, 51, 55, 13, 10, 13, 10,112, 97, 99,109, 97,110, 98,108, + 98, 58, 13, 10, 48, 58, 52, 54, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 53, 49, 56, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, + 48, 58, 53, 49, 97, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, + 53, 49, 99, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 49, + 101, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 50, 48, 48, + 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 50, 50, 48, 58, 49, + 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 52, 54, 54,102, 58, 49, 58, 48, + 51, 58, 48, 51, 13, 10, 13, 10, 59,108,111, 99,107,111,110,112,104, 58, + 32, 32, 32, 32, 32, 32, 32, 32, 59, 42, 42, 42, 42, 42, 32,110,101,101, + 100,115, 32,119,111,114,107, 32, 33, 33, 32, 42, 42, 42, 42, 42, 42, 13, + 10, 59, 48, 58,102,102,101, 52, 53, 57, 58, 56, 55, 58, 48, 51, 58, 48, + 48, 13, 10, 59, 48, 58,102,102,101, 52, 52, 97, 58, 49, 58, 48, 52, 58, + 48, 52, 13, 10, 13, 10,107,110,111, 99,107,111,117,116, 58, 13, 10,109, + 97,114,105,110,101,114, 58, 13, 10,115, 99,114, 97,109, 98,108,101,115, + 58, 13, 10,116,114,105,112,108,101,112, 58, 13, 10,116,114,105,112,108, + 101,112, 97, 58, 13, 10, 56, 48, 48,102, 97,116,104, 58, 13, 10,115,116, + 114,102, 98,111,109, 98, 58, 13, 10,115, 99,114, 97,109, 98, 50, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 83, 99,114, 97,109, 98,108,101, 32, 40, + 98,111,111,116,108,101,103, 41, 13, 10,107,110,111, 99,107,111,117,116, + 98, 58, 13, 10,107,110,111, 99,107,111,117,116, 99, 58, 13, 10, 48, 58, + 52, 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, + 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,102, 98, + 97,108,108, 58, 13, 10, 48, 58,100, 56, 52, 48, 58, 54, 57, 58, 48, 48, + 58, 52, 56, 13, 10, 13, 10,119,105,110,103,102,111,114, 99, 58, 13, 10, + 48, 58, 51, 48,100, 55,101, 55, 58, 49, 51,102, 58, 48, 48, 58, 51, 53, + 13, 10, 13, 10,115,116,114,105,100,101,114, 58, 32, 59, 42, 77,105,115, + 115,105,110,103, 58, 32, 83,116, 97,103,101, 32, 99,111,109,112,108,101, + 116,105,111,110, 32,105,110,102,111,114,109, 97,116,105,111,110, 32, 40, + 80,108, 97,121,101,114, 32,110, 97,109,101, 32, 43, 32, 83, 99,111,114, + 101, 41, 13, 10,115,116,114,105,100,101,114,106, 58, 13, 10,115,116,114, + 105,100,114,106,114, 58, 13, 10,115,116,114,105,100,101,114,117, 97, 58, + 13, 10,115,116,114,105,100,101,114,117, 99, 58, 13, 10, 48, 58,102,102, + 56, 57, 97, 97, 58, 55, 56, 58,102,102, 58, 50, 48, 13, 10, 48, 58,102, + 102, 48, 99, 97, 52, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 59, 42, + 68, 79, 69, 83, 32, 78, 79, 84, 32, 87, 79, 82, 75, 58, 32, 83,116, 97, + 103,101, 32, 99,111,109,112,108,101,116,105,111,110, 32,105,110,102,111, + 114,109, 97,116,105,111,110, 32, 40, 80,108, 97,121,101,114, 32,110, 97, + 109,101, 32, 43, 32, 83, 99,111,114,101, 41, 13, 10, 59, 42, 48, 58, 57, + 50, 48, 48, 48, 48, 58, 49, 52, 58, 48, 48, 58, 48, 48, 32, 65,100,100, + 114,101,115,115, 32,112,111,105,110,116,101,114,115, 13, 10, 59, 42, 48, + 58, 57, 50, 49, 48, 48, 52, 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, 83, + 116, 97,103,101, 58, 32, 83,116, 46, 32, 80,101,116,101,114,115, 98,117, + 114,103, 13, 10, 59, 42, 48, 58, 57, 50, 49, 56, 48, 52, 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, 83,116, 97,103,101, 58, 32, 83,105, 98,101,114, - 105, 97,110, 32, 87,105,108,100,101,114,110,101,115,115, 10, 59, 42, 48, - 58, 57, 50, 50, 48, 48, 52, 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, 83, - 116, 97,103,101, 58, 32, 65,100,118,101,110,116,117,114,101, 32, 73,110, - 32, 65,109, 97,122,111,110, 10, 59, 42, 48, 58, 57, 50, 50, 56, 48, 52, - 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, 83,116, 97,103,101, 58, 32, 84, - 104,101, 32, 65,114,105, 97,108, 32, 66, 97,116,116,108,101,115,104,105, - 112, 10, 59, 42, 48, 58, 57, 50, 51, 48, 48, 52, 58, 48, 56, 58, 48, 48, - 58, 48, 48, 32, 83,116, 97,103,101, 58, 32, 60,115,101, 99,114,101,116, - 62, 10, 10,105,107, 97,114,105, 58, 10,105,107, 97,114,105,106,112, 58, - 10,105,107, 97,114,105,106,112, 98, 58, 10,105,107, 97,114,105,110, 99, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,105,107, 97,114,105, 32,119, 97, - 114,114,105,111,114,115, 32, 40,117,115, 32,110,111, 32, 99,111,110,116, - 105,110,117,101,115, 41, 10,105,107, 97,114,105, 97, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,105,107, 97,114,105, 32,119, 97,114,114,105,111,114, - 115, 32, 40,117,115, 41, 10, 48, 58,102,102, 48, 98, 58, 53, 48, 58, 48, - 48, 58, 52, 57, 10, 48, 58,102, 99, 53,102, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 10,105,107, 97,114,105,114, 97,109, 58, 10, 48, 58,102,102, 48, - 98, 58, 53, 48, 58, 48, 48, 58, 52,102, 10, 48, 58,102, 99, 53,102, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10,112,105,114, 97,116,101,115, 98, 58, - 10,112,105,114, 97,116,101,115, 58, 10, 48, 58, 49, 48, 97, 53, 52, 52, - 58, 55, 54, 58, 52,101, 58, 49, 48, 10, 48, 58, 49, 48, 97, 53, 98, 48, - 58, 49, 58, 52,101, 58, 52,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,109,101,120,105, 99,111, 56, 54, 46, 99, 10,109,101,120,105, 99,111, - 56, 54, 58, 10,107,105, 99,107,110,114,117,110, 58, 10,107,105, 99,107, - 110,114,117,110,117, 58, 10,109,101,120,105, 99,111, 56, 54, 97, 58, 10, - 48, 58,101,101, 49, 56, 58, 50,100, 58, 49, 55, 58, 52, 57, 10, 10, 97, - 110,116,101, 97,116,101,114,103,103, 58, 10, 48, 58, 52, 48,101,102, 58, - 51, 99, 58, 48, 48, 58, 50, 48, 10, 10, 97,110,116,101, 97,116,101,114, - 103, 58, 10, 48, 58, 52,101,102, 58, 51, 99, 58, 48, 48, 58, 50, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 65,110,116,101, 97,116, - 101,114, 32, 40, 85, 75, 41, 10, 97,110,116,101, 97,116,101,114,117,107, - 58, 10, 48, 58, 52,101,102, 58, 51, 99, 58, 48, 48, 58, 53, 57, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,115, 99,111, 98,114, 97, 46, 99, 10, - 97,110,116,101, 97,116,101,114, 58, 10, 48, 58, 56, 48,101,102, 58, 51, - 99, 58, 48, 49, 58, 52, 99, 10, 10,115,102, 50,118, 48, 48, 52, 58, 10, - 48, 58,102,102,100, 50, 55, 54, 58, 51, 48, 58, 48, 49, 58, 50, 48, 10, - 48, 58,102,102,100, 50, 99, 54, 58, 49, 56, 58,102,102, 58, 57,101, 10, - 48, 58,102,102,100, 50,101,101, 58, 48, 52, 58, 48, 49, 58, 54, 55, 10, - 10,116, 97,111,116, 97,105,100,111, 58, 10, 48, 58,102,101, 57, 49,101, - 52, 58, 52,101, 58, 49, 52, 58, 48, 50, 10, 10,116, 97,111,116, 97,105, - 100,111, 97, 58, 10, 48, 58,102,101, 57, 51, 52, 48, 58, 52,101, 58, 48, - 49, 58, 48, 50, 10, 10,116, 97,111,116, 97,105,100,111, 51, 58, 10, 48, - 58,102,101, 57, 49,100, 52, 58, 52,101, 58, 48, 49, 58, 48, 50, 10, 10, - 59, 40,115,100,105, 32, 45, 32,115,116,114, 97,116,101,103,105, 99, 32, - 100,101,102,101,110, 99,101, 32,105,110,105,116,105, 97,116,105,118,101, - 41, 10,115,100,105, 58, 10,100,101,102,101,110,115,101, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 68,101,102,101,110,115,101, 32, 40, 83,121,115, - 116,101,109, 32, 49, 54, 66, 44, 32, 70, 68, 49, 48, 56, 57, 65, 32, 51, - 49, 55, 45, 48, 48, 50, 56, 41, 32, 10,115,100,105, 98,108, 58, 10,115, - 100,105, 98, 58, 10,115,100,105, 98,108, 50, 58, 10,115,100,105, 98,108, - 51, 58, 10,115,100,105, 98,108, 52, 58, 10,115,100,105, 98,108, 53, 58, - 10,115,100,105, 98,108, 54, 58, 10, 48, 58,102,102,102, 56, 48, 48, 58, - 51, 50, 48, 58, 48, 48, 58, 50, 48, 10, 48, 58,102,102,102, 98, 56, 56, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,102, 98, 99, 97, 58, - 51, 58, 52, 98, 58, 53, 97, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 84,119,105,110, 32, 67,111, 98,114, 97, 32, 50, 32, 40, 87,111,114,108, - 100, 41, 32, 38, 32, 40,117,115, 41, 10,116, 99,111, 98,114, 97, 50, 58, - 10,116, 99,111, 98,114, 97, 50,117, 58, 10, 48, 58, 52, 48, 48, 54,101, - 48, 58, 49, 49, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 48, 55, - 100, 51, 58, 49, 58, 48, 50, 58, 48, 50, 10, 48, 58, 52, 48, 48, 56, 52, - 53, 58, 49, 58, 56, 48, 58, 56, 48, 10, 10,107,116,105,103,101,114, 50, - 58, 10, 48, 58, 52, 48, 48, 54,101, 48, 58, 49, 49,101, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 48, 48, 55,102, 57, 58, 49, 58, 48, 49, 58, 48, - 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,109,110,116, 46, 99, - 10, 98,108,115,119,104,115,116,108, 58, 10,100,101,116, 97,116,119,105, - 110, 58, 10, 98,108,115,119,104,115,116,108, 97, 58, 10, 48, 58, 50, 48, - 55, 48, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50,101, 10, 48, 58, 50, 48, - 52, 48, 52, 56, 58, 52, 58, 48, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,116,101, 99,109,111, 46, 99, 10,103,101,109,105,110, - 105, 58, 10, 48, 58, 99,102, 52, 49, 58, 52, 54, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 99, 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 99, 48, 50, 55, 58, 49, 58, 53, 48, 58, 53, 48, 10, 48, 58,100, 50, 52, - 49, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58,100, 50, 50, 49, 58, 49, - 58, 52, 48, 58, 52, 48, 10, 48, 58,100, 50, 48, 49, 58, 49, 58, 51, 53, - 58, 51, 53, 10, 48, 58,100, 49,101, 49, 58, 49, 58, 51, 48, 58, 51, 48, - 10, 48, 58,100, 49, 99, 49, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, - 100, 49, 97, 49, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58,100, 49, 56, - 49, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 67,114,121,112,116, 32, 75,105,108,108,101,114, 32, 40,107,111,110, 97, - 109,105,103,113, 46, 99, 41, 32, 40, 98,121, 32, 71,114,101, 97,116, 83, - 116,111,110,101, 41, 10, 99,114,121,112,116,107,108,114, 58, 10, 48, 58, - 50, 51, 55,100, 99, 48, 58, 53, 48, 58, 52, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, - 10, 97,107,107, 97,110,118,100,114, 58, 10,115,112, 99,105,110,118, 57, - 53, 58, 10,115,112, 99,105,110,118, 57, 53,117, 58, 10, 48, 58, 52, 49, - 55, 52, 56, 52, 58, 54, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 49, - 55, 52,101, 55, 58, 49, 58, 53, 53, 58, 53, 53, 10, 48, 58, 52, 49, 48, - 98, 56, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,101,100,102, 58, 10, - 101,100,102,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69, 46, 68, 46, - 70, 46, 32, 58, 32, 69, 97,114,116,104, 32, 68,101,102,101,110,115,101, - 32, 70,111,114, 99,101, 32, 40, 78,111,114,116,104, 32, 65,109,101,114, - 105, 99, 97, 41, 10,101,100,102, 98,108, 58, 10,101,100,102, 97, 58, 10, - 48, 58, 54, 52, 99, 49, 55, 58, 49, 48, 55, 58, 48, 49, 58, 48, 48, 10, - 48, 58, 54, 49,100, 51,101, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54, 52, 99, 99, 98, 58, 49, 58, 48, 57, 58, 48, 57, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,119, 97,114,112,119, 97,114,112, 46, 99, 10,119, - 97,114,112,119, 97,114,112, 58, 10, 48, 58, 56, 51, 49,100, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10,119, 97,114,112,119, 97,114,112,114, 58, 10, - 119, 97,114,112,119, 97,114,112,114, 50, 58, 10, 48, 58, 56, 51, 49,100, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 51, 53, 56, 58, 49,101, - 58, 48, 48, 58, 49, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 109, 99,114, 51, 46, 99, 32, 40,116,117,114, 98,111, 41, 10, 59, 42, 42, - 32,104,105,103,104,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, - 32, 97,102,116,101,114, 32,102,105,114,115,116, 32,103, 97,109,101, 32, - 42, 42, 10,116,117,114, 98,111, 58, 10,116,117,114, 98,111, 97, 58, 10, - 116,117,114, 98,111, 98, 99, 58, 10,116,117,114, 98,111, 98, 58, 10,116, - 117,114, 98,111, 98,108, 58, 10,116,117,114, 98,111,100, 58, 10, 48, 58, - 101, 52, 48, 48, 58, 49,101, 58, 57, 52, 58, 57, 52, 10, 48, 58,102, 51, - 49, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 50, 57, 50, - 58,100, 58, 48,102, 58,102, 48, 10, 10, 59, 32,102,101,110,105,120, 32, - 105,115, 32,110,111,116, 32,119,111,114,107,105,110,103, 32,121,101,116, - 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32, - 116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, - 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, - 10,112,104,111,101,110,105,120, 58, 10, 99,111,110,100,111,114, 58, 10, - 102, 97,108, 99,111,110, 58, 10,110,101,120,116,102, 97,115,101, 58, 10, - 112,104,111,101,110,105,120, 51, 58, 10,112,104,111,101,110,105,120, 97, - 58, 10,112,104,111,101,110,105,120, 98, 58, 10,112,104,111,101,110,105, - 120, 99, 58, 10,112,104,111,101,110,105,120, 99, 50, 58, 10,112,104,111, - 101,110,105,120,106, 58, 32, 10,112,104,111,101,110,105,120,116, 58, 10, - 118, 97,117,116,111,117,114, 58, 10,112,108,101,105, 97,100,115, 58, 10, - 112,108,101,105, 97,100, 98,108, 58, 10,112,108,101,105, 97,100, 99,101, - 58, 10,112,104,111,101,110,105,120, 99, 51, 58, 10,112,104,111,101,110, - 105,120, 99, 52, 58, 10,112,108,101,105, 97,100,115, 98, 50, 58, 10,112, - 104,111,101,110,105,120,115, 58, 10, 97,118,101,102,101,110,105,120, 58, - 10,112,108,101,105, 97,100,115,105, 58, 10,112,108,101,105, 97,100,115, - 115, 58, 10,112,104,111,101,110,105,120,100, 97,108, 58, 10, 97,118,101, - 102,101,110,105,120,114,102, 58, 10, 97,118,101,102,101,110,105,120,108, - 58, 10,112,104,111,101,110,105,120, 97,115,115, 58, 10,118, 97,117,116, - 111,117,114,122, 97, 58, 10,112,108,101,105, 97,100,115,110, 58, 10, 48, - 58, 52, 51, 56, 57, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, - 49,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 99, - 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 97, 49, 58, - 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 56, 49, 58, 48, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 54, 49, 58, 48, 49, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 52, 49, 52, 49, 58, 48, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58, 52, 51, 56, 49, 58, 48, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 52, 51, 48, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 52, 50,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, - 50, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 97, - 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 56, 49, 58, - 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 54, 49, 58, 48, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 51, 56, 53, 58, 48, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 52, 48, 99, 49, 58, 48, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58, 52, 48, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 52, 48, 56, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 52, 48, 54, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, - 48, 52, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 48, 50, - 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 10, 98, 97,116,109, 97,110, - 50, 58, 10, 48, 58, 52, 50, 56, 57, 58, 48, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 53, 49,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 53, 49, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, - 49, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, 56, - 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, 54, 49, 58, - 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, 52, 49, 58, 48, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 56, 49, 58, 48, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 53, 51, 48, 49, 58, 48, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58, 53, 50,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 53, 50, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 53, 50, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, - 50, 56, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 50, 54, - 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 56, 53, 58, - 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 48, 99, 49, 58, 48, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 48, 97, 49, 58, 48, 49, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 53, 48, 56, 49, 58, 48, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58, 53, 48, 54, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 53, 48, 52, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 53, 48, 50, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 10,109,109, - 97,103,105, 99, 58, 10, 48, 58, 50, 48, 48, 48, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 97,121, 97, 32, 38, - 32,105,110, 99, 97, 10,109, 97,121, 97, 58, 10,105,110, 99, 97, 58, 10, - 109, 97,121, 97, 97, 58, 10,109, 97,121, 97, 99, 58, 10, 48, 58, 55, 53, - 48, 48, 58, 50, 50, 58, 52, 49, 58, 48, 48, 10, 48, 58, 55, 55, 52, 49, - 58, 50, 58,102, 97, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,112, - 97,114, 97,100,105,115,101, 10,112, 97,114, 97,100,105,115,101, 58, 10, - 112, 97,114, 97,100,105,115,101, 97, 58, 10,112, 97,114, 97,100,105,115, - 101,101, 58, 10, 48, 58,101, 54, 99, 51, 58, 51, 58, 48, 48, 58, 48, 49, - 10, 48, 58,101, 54,101, 51, 58, 50, 50, 58, 52, 49, 58, 48, 48, 10, 10, - 118,105,103,105,108, 97,110,116, 58, 10,118,105,103,105,108, 97,110,116, - 98,108, 58, 10,118,105,103,105,108, 97,110,116, 99, 58, 10,118,105,103, - 105,108, 97,110,116,100, 58, 32, 59, 91, 67,108,111,110,101, 32, 97,100, - 100,101,100, 32, 98,121, 32, 87,111, 98, 93, 10,118,105,103,105,108, 97, - 110,116,111, 58, 32, 59, 91, 67,108,111,110,101, 32, 97,100,100,101,100, - 32, 98,121, 32, 87,111, 98, 93, 10,118,105,103,105,108, 97,110,116,103, - 58, 10,118,105,103,105,108, 97,110,116, 98, 58, 10,118,105,103,105,108, - 97,110,116, 97, 58, 10, 48, 58,101, 48, 52, 56, 58, 51,102, 58, 48, 48, - 58, 52, 56, 10, 10,100,102,107, 98,108, 58, 10, 48, 58, 99, 97, 48, 50, - 48, 50, 56, 58, 50,102, 99, 98, 58, 48, 56, 58, 53, 54, 10, 10,109, 99, - 104,101,111,110,114,117, 58, 10, 48, 58, 49, 48, 57, 48,100, 99, 58, 49, - 49,102, 58, 48, 48, 58, 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 40,100, 97,105,111,104, 41, 10,100, 97,105,111,104, 58, 10,100, 97, - 105,111,104, 97, 58, 10, 48, 58, 49, 48, 55, 52, 56, 99, 58, 97, 51, 58, - 48, 48, 58, 48, 53, 10, 48, 58, 49, 48, 55, 52, 56,102, 58, 49, 58,101, - 56, 58,101, 56, 10, 10,100, 97,105,111,104, 99, 58, 10, 48, 58, 50, 48, - 55, 52, 57, 54, 58, 57, 57, 58, 48, 48, 58, 48, 53, 10, 10,100, 97,105, - 111,104,112, 58, 10, 48, 58, 50, 48, 54, 99, 57, 54, 58, 57, 57, 58, 48, - 48, 58, 48, 53, 10, 10, 99, 97,114,104,110,116,100,115, 58, 10, 48, 58, - 56, 52, 53,101, 58, 54, 58, 48, 48, 58, 48, 52, 10, 48, 58, 56, 51, 97, - 49, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 98,101,114,122,101,114,107, 46, 99, 10, 98,101,114,122,101,114, - 107, 58, 32, 10, 98,101,114,122,101,114,107, 49, 58, 10, 98,101,114,122, - 101,114,107,103, 58, 10, 98,101,114,122,101,114,107,115, 58, 10, 98,101, - 114,122,101,114,107,102, 58, 10, 48, 58, 52, 51, 48, 50, 58, 51, 99, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 52, 51, 48, 49, 58, 49, 58, 52, 50, 58, - 52, 50, 10, 10,103,112,114,105,100,101,114, 58, 10,103,112,114,105,100, - 101,114,117, 58, 10,103,112,114,105,100,101,114,106, 58, 10,103,112,114, - 105,100,101,114,106,115, 58, 10,103,112,114,105,100,101,114,115, 58, 10, - 103,112,114,105,100,101,114,117,115, 58, 10, 48, 58, 50, 56, 48, 49, 57, - 50, 58, 97, 97, 58, 51, 52, 58, 51, 48, 10, 48, 58, 57, 99, 55, 48, 56, - 58, 56, 58, 48, 49, 58, 50, 48, 10, 10,115,112,105,100,101,114, 58, 10, - 48, 58, 54,102, 54, 99, 58, 49, 51, 58, 53, 48, 58, 48, 48, 10, 48, 58, - 101, 48, 55, 99, 58, 50, 99, 58, 52, 49, 58, 48, 48, 10, 48, 58,101, 53, - 52, 50, 58, 98, 58, 48, 49, 58, 48, 49, 10, 48, 58, 54,102, 55,100, 58, - 49, 58, 50, 55, 58, 50, 55, 10, 10, 99,100,114, 97, 99,117,108, 97, 58, - 10, 48, 58, 99, 51, 57,102, 58, 54, 97, 58, 52, 51, 58, 48, 48, 10, 48, - 58, 99, 52, 48, 54, 58, 49, 58, 49, 51, 58, 49, 51, 10, 48, 58, 99, 99, - 50, 98, 58, 52, 58, 53, 48, 58, 48, 48, 10, 10, 98,114,105, 99,107,122, - 110, 58, 10, 98,114,105, 99,107,122,110,118, 52, 58, 10, 98,114,105, 99, - 107,122,110,118, 53, 58, 10, 98,114,105, 99,107,122,110, 49, 49, 58, 10, - 48, 58, 99,102, 49, 48, 58, 52,101, 58, 50, 51, 58, 52,100, 10, 48, 58, - 99, 56, 97, 48, 58, 50, 58, 48, 48, 58, 48, 51, 10, 10,115,109,105,115, - 115,119, 58, 10, 48, 58, 99, 48, 50, 53, 98, 54, 58, 54, 51, 58, 51, 48, - 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,115,105,100,101, - 97,114,109,115, 32, 38, 32, 99,108,111,110,101,115, 41, 10,115,105,100, - 101, 97,114,109,115, 58, 10,115,105,100,101, 97,114,109,115,114, 58, 10, - 115,105,100,101, 97,114,109,115,117,114, 49, 58, 10, 48, 58,101, 54, 56, - 50, 58, 52,101, 58, 48, 48, 58, 48, 51, 10, 48, 58,101, 54, 48, 49, 58, - 55, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 99,101, 58, 49, 58, 51, - 98, 58, 51, 98, 10, 10,115,105,100,101, 97,114,109,115,117, 58, 10, 48, - 58,101, 54, 56, 50, 58, 52,101, 58, 48, 48, 58, 48, 51, 10, 48, 58,101, - 54, 48, 49, 58, 55, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 99,101, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,115,105,100,101, 97,114,109,115, - 106, 58, 10, 48, 58,101, 54, 56, 50, 58, 52,101, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 54, 48, 49, 58, 55, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 54, 99,101, 58, 49, 58, 51, 98, 58, 51, 98, 10, 10,120,109,117,108, - 116,105,112,108,109, 55, 50, 58, 10, 48, 58, 56, 48, 57, 57,101, 58, 52, - 51, 58, 53, 48, 58, 48, 48, 10, 48, 58, 56, 48, 57, 57, 56, 58, 48, 54, - 58, 48, 48, 58, 48, 48, 10, 10,120,109,117,108,116,105,112,108, 58, 10, - 48, 58, 57, 99, 57, 57, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 57, 99, 57, 57,100, 58, 52, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, - 99, 57,100, 97, 58, 49, 58, 54, 50, 58, 54, 50, 10, 10,115,116, 97,114, - 116,114,107,115, 58, 10, 48, 58,100, 55, 56, 97, 58, 53, 58, 51, 48, 58, - 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 98,108, 97, 99,107, 32,119, - 105,100,111,119, 10, 98,119,105,100,111,119, 58, 10, 48, 58, 51, 48, 50, - 58, 50, 52, 58, 50, 48, 58,100, 98, 10, 48, 58, 51, 50, 54, 58, 55, 54, - 58, 49, 98, 58, 49, 49, 10, 10, 98,119,105,100,111,119,112, 58, 10, 48, - 58, 51, 50, 98, 58, 51, 49, 58, 48, 48, 58, 48, 48, 10, 10,115,117,112, - 100,117, 99,107, 58, 10, 48, 58,102,102, 99, 51, 51, 50, 58, 51, 48, 58, - 52, 49, 58, 48, 48, 10, 48, 58,102,102, 99, 51, 54, 48, 58, 49, 58, 49, - 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 68,114, 97, - 103,111,110, 32, 87,111,114,108,100, 32, 73, 73, 32, 40,118,101,114, 46, - 32, 49, 49, 48, 88, 44, 32, 69,120,112,111,114,116, 41, 10,100,114,103, - 119, 50, 58, 10,100,119, 50,118, 49, 48, 48,120, 58, 10, 48, 58, 56, 48, - 99, 97,102, 56, 58, 52, 54, 58, 52, 57, 58, 52, 48, 10, 10,100,114,103, - 119, 50,104,107, 58, 10, 48, 58, 56, 48,102, 49, 51, 97, 58, 52, 54, 58, - 52, 57, 58, 52, 48, 10, 10, 97,108,105,110,118, 97,100,101, 58, 10, 48, - 58, 57,102, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,104, 97, 99,104, 97, - 109,102, 58, 10,104, 97, 99,104, 97,109,102, 98, 58, 10, 48, 58,102, 99, - 48, 48, 48, 58, 51,102, 48, 58, 48, 49, 58, 52,101, 10, 10,110,122,101, - 114,111,116,101, 97,109, 58, 10, 48, 58, 57, 50, 53, 99, 58, 52, 98, 58, - 52, 48, 58, 53, 53, 10, 10,122,101,114,111,116,109, 50,107, 58, 10, 48, - 58, 57, 50, 52,101, 58, 52, 98, 58, 52, 48, 58, 53, 53, 10, 10,122,101, - 114,111,116,101, 97,109, 58, 10,122,101,114,111,116,101, 97,109,100, 58, - 10,122,101,114,111,116,101, 97,109, 99, 58, 10,122,101,114,111,116,101, - 97,109,115, 58, 10,122,101,114,111,116,101, 97,109,115,114, 58, 10,122, - 101,114,111,116,101, 97,109, 97, 58, 10,122,101,114,111,116,101, 97,109, - 98, 58, 10, 48, 58, 57, 50, 49, 50, 58, 52, 98, 58, 52, 48, 58, 53, 53, - 10, 10,114, 97,105,100,101,110,100,120, 58, 10,114, 97,105,100,101,110, - 100,120,117, 58, 10,114, 97,105,100,101,110,100,120,107, 58, 10,114, 97, - 105,100,101,110,100,120,106, 58, 10,114, 97,105,100,101,110,100,120, 97, - 50, 58, 10,114, 97,105,100,101,110,100,120, 97, 49, 58, 10,114, 97,105, - 100,101,110,100,120,110,108, 58, 10,114, 97,105,100,101,110,100,120,103, - 58, 10,114, 97,105,100,101,110,100,120, 99,104, 58, 10,114, 97,105,100, - 101,110,100,120,106, 97, 58, 10, 48, 58, 97, 50, 53, 97, 58, 50, 99,102, - 58, 97, 48, 58, 50, 97, 10, 10,114, 50,100,120, 95,118, 51, 51, 95,114, - 50, 58, 10, 48, 58, 57,101, 52, 54, 58,101,102, 58, 53, 48, 58, 50, 97, - 10, 10,114, 50,100,120, 95,118, 51, 51, 58, 10, 48, 58, 97, 50,100, 56, - 58, 50, 99,102, 58, 97, 48, 58, 50, 97, 10, 10,114, 97,105,100,101,110, - 50, 58, 10,114, 97,105,100,101,110, 50,100,120, 58, 10,114, 97,105,100, - 101,110, 50,110,108, 58, 10,114, 97,105,100,101,110, 50,104,107, 58, 10, - 114, 97,105,100,101,110, 50,105, 58, 10,114, 97,105,100,101,110, 50,106, - 58, 10,114, 97,105,100,101,110, 50,117, 58, 10,114, 97,105,100,101,110, - 50,115,119, 58, 10,114, 97,105,100,101,110, 50,102, 58, 10, 48, 58, 57, - 100,100, 52, 58,101,102, 58, 53, 48, 58, 50, 97, 10, 10,114, 97,105,100, - 101,110, 50,103, 58, 10,114, 97,105,100,101,110, 50,101, 97, 58, 10,114, - 97,105,100,101,110, 50,101, 58, 10,114, 97,105,100,101,110, 50,101,117, - 97, 58, 10,114, 97,105,100,101,110, 50,101,117, 58, 10, 48, 58, 57,100, - 101, 52, 58,101,102, 58, 53, 48, 58, 50, 97, 10, 10, 97,114,101,115, 99, - 117,101, 58, 10, 97,114,101,115, 99,117,101,106, 58, 10, 48, 58, 50, 48, - 102, 98, 48, 48, 58, 57,102, 58, 97, 48, 58, 52, 57, 10, 10,102,105,120, - 101,105,103,104,116, 98,108, 58, 10,102,105,120,101,105,103,104,116, 58, - 10,102,105,120,101,105,103,104,116,116, 58, 10,102,105,120,101,105,103, - 104,116,104, 58, 10,102,105,120,101,105,103,104,116,104,116, 58, 10,102, - 105,120,101,105,103,104,116,106, 58, 32, 10,102,105,120,101,105,103,104, - 116,106,116, 58, 10,102,105,120,101,105,103,104,116, 97, 58, 32, 10,102, - 105,120,101,105,103,104,116, 97,116, 58, 10,102,105,120,101,105,103,104, - 116,107, 58, 10,102,105,120,101,105,103,104,116,107,116, 58, 10,102,105, - 120,101,105,103,104,116,116,119, 58, 10,102,105,120,101,105,103,104,116, - 116,119,116, 58, 10,102,105,120,101,105,103,104,116,117, 58, 10,102,105, - 120,101,105,103,104,116,117,116, 58, 10, 48, 58, 49, 48, 48, 52, 48, 56, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 48, 52, 51, 99, 58, - 56, 50, 58, 48, 48, 58, 48, 52, 10, 48, 58, 49, 48, 48, 52, 48, 97, 58, - 49, 58, 53, 51, 58, 53, 51, 10, 10, 97,105,114, 97,115,115, 58, 10,102, - 105,114,101, 98, 97,114,114, 58, 10, 48, 58,101, 51, 50, 53, 50, 58, 56, - 99, 58, 48, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 99,111,115,109,105, 99, 32, 99,111,112, 40,119,111,114,108,100, 41, 40, - 98,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10, 99,111,115,109, - 99, 99,111,112, 58, 10, 48, 58,101, 51, 99, 53,101, 58, 54,101, 58, 49, - 48, 58, 52, 49, 10, 48, 58,101, 51,100, 55, 50, 58, 48, 51, 58, 49, 48, - 58, 48, 54, 10, 48, 58,101, 51,100, 49, 56, 58, 51, 99, 58, 48, 48, 58, - 53, 97, 10, 10,103, 97,108,108,111,112, 58, 10, 48, 58, 97, 51,100, 48, - 48, 58, 54,101, 58, 49, 48, 58, 52, 49, 10, 48, 58, 97, 51,101, 49, 52, - 58, 48, 51, 58, 49, 48, 58, 48, 54, 10, 48, 58, 97, 51,100, 98, 97, 58, - 51, 99, 58, 48, 48, 58, 53, 97, 10, 10, 98, 99,104,111,112,112,101,114, - 58, 10,109,114,104,101,108,105, 58, 10, 48, 58, 97, 51, 55, 99, 48, 58, - 55, 56, 58, 54, 51, 58, 54, 48, 10, 48, 58, 97, 51, 55, 98, 97, 58, 48, - 51, 58, 54, 51, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 107, 97,110,103, 97,114,111,111, 46, 99, 10,107, 97,110,103, 97,114,111, - 111, 58, 10,107, 97,110,103, 97,114,111,111, 97, 58, 10,107, 97,110,103, - 97,114,111,111, 98, 58, 10, 48, 58,101, 49, 97, 48, 58, 51, 99, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 49,100, 97, 58, 49, 58, 53, 48, 58, 53, - 48, 10, 10,110,101,109,101,115,105,115, 58, 32, 10,110,101,109,101,115, - 105,115,117,107, 58, 32, 10, 48, 58, 48, 54, 53, 48, 57, 97, 58, 49, 58, - 55, 54, 58, 55, 54, 10, 48, 58, 48, 54, 53, 48, 49, 48, 58, 56, 99, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 48, 54, 48, 48, 57, 56, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 48, 54, 48, 48, 57, 97, 58, 49, 58, 55, 51, - 58, 55, 51, 10, 10,119,121,118,101,114,110,102, 48, 58, 10, 48, 58, 56, - 56, 48, 48, 58, 49, 57, 48, 58, 48, 48, 58, 50, 54, 10, 10,114,111,108, - 99,114,117,115,104, 58, 10, 48, 58,102,101,100,101, 55, 54, 58, 55, 54, - 58, 52, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97, - 108,112,104, 97, 54, 56,107, 46, 99, 10,103, 97,110,103,119, 97,114,115, - 117, 58, 10,103, 97,110,103,119, 97,114,115, 98, 58, 10,103, 97,110,103, - 119, 97,114,115, 58, 10,103, 97,110,103,119, 97,114,115,106, 58, 10, 48, - 58, 52, 51, 98, 98, 50, 58, 51, 52, 58, 48, 48, 58, 52, 53, 10, 10, 59, - 115,112,101, 99, 50,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 32,110,111, - 116, 32,119,111,114,107,105,110,103, 32,121,101,116, 10, 59, 48, 58, 99, - 48, 51, 48, 49, 58, 51, 98, 58, 48,102, 58, 57, 56, 10, 59, 48, 58, 99, - 48, 51, 51, 97, 58, 49, 58, 51, 97, 58, 51, 97, 10, 10, 59, 40,100, 97, - 105, 32,116,111,114,105,100,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10,100, 97,105,116,111,114,105,100, 58, 10, 48, 58, 56, 48, - 52, 50, 98, 97, 58, 50, 56, 58, 48, 48, 58, 52, 48, 32, 32, 10, 48, 58, - 56, 48, 52, 50,101, 50, 58, 50, 56, 58, 48, 50, 58, 48, 48, 10, 10,100, - 97,105,116,111,114,105,100, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 68, 97,105,116,111,114,105,100,101, 32, 40, 89, 77, 70, 50, 55, 56, 66, - 32,118,101,114,115,105,111,110, 41, 10, 48, 58,102, 48, 52, 50, 98, 97, - 58, 52, 97, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 32, 97,102,116, + 105, 97,110, 32, 87,105,108,100,101,114,110,101,115,115, 13, 10, 59, 42, + 48, 58, 57, 50, 50, 48, 48, 52, 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, + 83,116, 97,103,101, 58, 32, 65,100,118,101,110,116,117,114,101, 32, 73, + 110, 32, 65,109, 97,122,111,110, 13, 10, 59, 42, 48, 58, 57, 50, 50, 56, + 48, 52, 58, 48, 56, 58, 48, 48, 58, 48, 48, 32, 83,116, 97,103,101, 58, + 32, 84,104,101, 32, 65,114,105, 97,108, 32, 66, 97,116,116,108,101,115, + 104,105,112, 13, 10, 59, 42, 48, 58, 57, 50, 51, 48, 48, 52, 58, 48, 56, + 58, 48, 48, 58, 48, 48, 32, 83,116, 97,103,101, 58, 32, 60,115,101, 99, + 114,101,116, 62, 13, 10, 13, 10,105,107, 97,114,105, 58, 13, 10,105,107, + 97,114,105,106,112, 58, 13, 10,105,107, 97,114,105,106,112, 98, 58, 13, + 10,105,107, 97,114,105,110, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 105,107, 97,114,105, 32,119, 97,114,114,105,111,114,115, 32, 40,117,115, + 32,110,111, 32, 99,111,110,116,105,110,117,101,115, 41, 13, 10,105,107, + 97,114,105, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,105,107, 97,114, + 105, 32,119, 97,114,114,105,111,114,115, 32, 40,117,115, 41, 13, 10, 48, + 58,102,102, 48, 98, 58, 53, 48, 58, 48, 48, 58, 52, 57, 13, 10, 48, 58, + 102, 99, 53,102, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,105,107, + 97,114,105,114, 97,109, 58, 13, 10, 48, 58,102,102, 48, 98, 58, 53, 48, + 58, 48, 48, 58, 52,102, 13, 10, 48, 58,102, 99, 53,102, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,112,105,114, 97,116,101,115, 98, 58, 13, + 10,112,105,114, 97,116,101,115, 58, 13, 10, 48, 58, 49, 48, 97, 53, 52, + 52, 58, 55, 54, 58, 52,101, 58, 49, 48, 13, 10, 48, 58, 49, 48, 97, 53, + 98, 48, 58, 49, 58, 52,101, 58, 52,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,109,101,120,105, 99,111, 56, 54, 46, 99, 13, 10,109, + 101,120,105, 99,111, 56, 54, 58, 13, 10,107,105, 99,107,110,114,117,110, + 58, 13, 10,107,105, 99,107,110,114,117,110,117, 58, 13, 10,109,101,120, + 105, 99,111, 56, 54, 97, 58, 13, 10, 48, 58,101,101, 49, 56, 58, 50,100, + 58, 49, 55, 58, 52, 57, 13, 10, 13, 10, 97,110,116,101, 97,116,101,114, + 103,103, 58, 13, 10, 48, 58, 52, 48,101,102, 58, 51, 99, 58, 48, 48, 58, + 50, 48, 13, 10, 13, 10, 97,110,116,101, 97,116,101,114,103, 58, 13, 10, + 48, 58, 52,101,102, 58, 51, 99, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 65,110,116,101, 97,116,101, + 114, 32, 40, 85, 75, 41, 13, 10, 97,110,116,101, 97,116,101,114,117,107, + 58, 13, 10, 48, 58, 52,101,102, 58, 51, 99, 58, 48, 48, 58, 53, 57, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, 99,111, 98,114, 97, + 46, 99, 13, 10, 97,110,116,101, 97,116,101,114, 58, 13, 10, 48, 58, 56, + 48,101,102, 58, 51, 99, 58, 48, 49, 58, 52, 99, 13, 10, 13, 10,115,102, + 50,118, 48, 48, 52, 58, 13, 10, 48, 58,102,102,100, 50, 55, 54, 58, 51, + 48, 58, 48, 49, 58, 50, 48, 13, 10, 48, 58,102,102,100, 50, 99, 54, 58, + 49, 56, 58,102,102, 58, 57,101, 13, 10, 48, 58,102,102,100, 50,101,101, + 58, 48, 52, 58, 48, 49, 58, 54, 55, 13, 10, 13, 10,116, 97,111,116, 97, + 105,100,111, 58, 13, 10, 48, 58,102,101, 57, 49,101, 52, 58, 52,101, 58, + 49, 52, 58, 48, 50, 13, 10, 13, 10,116, 97,111,116, 97,105,100,111, 97, + 58, 13, 10, 48, 58,102,101, 57, 51, 52, 48, 58, 52,101, 58, 48, 49, 58, + 48, 50, 13, 10, 13, 10,116, 97,111,116, 97,105,100,111, 51, 58, 13, 10, + 48, 58,102,101, 57, 49,100, 52, 58, 52,101, 58, 48, 49, 58, 48, 50, 13, + 10, 13, 10, 59, 40,115,100,105, 32, 45, 32,115,116,114, 97,116,101,103, + 105, 99, 32,100,101,102,101,110, 99,101, 32,105,110,105,116,105, 97,116, + 105,118,101, 41, 13, 10,115,100,105, 58, 13, 10,100,101,102,101,110,115, + 101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,101,102,101,110,115,101, + 32, 40, 83,121,115,116,101,109, 32, 49, 54, 66, 44, 32, 70, 68, 49, 48, + 56, 57, 65, 32, 51, 49, 55, 45, 48, 48, 50, 56, 41, 13, 10,115,100,105, + 98,108, 58, 13, 10,115,100,105, 98, 58, 13, 10,115,100,105, 98,108, 50, + 58, 13, 10,115,100,105, 98,108, 51, 58, 13, 10,115,100,105, 98,108, 52, + 58, 13, 10,115,100,105, 98,108, 53, 58, 13, 10,115,100,105, 98,108, 54, + 58, 13, 10, 48, 58,102,102,102, 56, 48, 48, 58, 51, 50, 48, 58, 48, 48, + 58, 50, 48, 13, 10, 48, 58,102,102,102, 98, 56, 56, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102,102,102, 98, 99, 97, 58, 51, 58, 52, 98, + 58, 53, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 84,119,105, + 110, 32, 67,111, 98,114, 97, 32, 50, 32, 40, 87,111,114,108,100, 41, 32, + 38, 32, 40,117,115, 41, 13, 10,116, 99,111, 98,114, 97, 50, 58, 13, 10, + 116, 99,111, 98,114, 97, 50,117, 58, 13, 10, 48, 58, 52, 48, 48, 54,101, + 48, 58, 49, 49, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 48, + 55,100, 51, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, 58, 52, 48, 48, + 56, 52, 53, 58, 49, 58, 56, 48, 58, 56, 48, 13, 10, 13, 10,107,116,105, + 103,101,114, 50, 58, 13, 10, 48, 58, 52, 48, 48, 54,101, 48, 58, 49, 49, + 101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 48, 55,102, 57, 58, + 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,116,109,110,116, 46, 99, 13, 10, 98,108,115,119,104,115,116,108, + 58, 13, 10,100,101,116, 97,116,119,105,110, 58, 13, 10, 98,108,115,119, + 104,115,116,108, 97, 58, 13, 10, 48, 58, 50, 48, 55, 48, 48, 48, 58, 53, + 48, 58, 48, 48, 58, 50,101, 13, 10, 48, 58, 50, 48, 52, 48, 52, 56, 58, + 52, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,116,101, 99,109,111, 46, 99, 13, 10,103,101,109,105,110,105, 58, + 13, 10, 48, 58, 99,102, 52, 49, 58, 52, 54, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 99, 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 99, 48, 50, 55, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 48, 58,100, + 50, 52, 49, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58,100, 50, 50, + 49, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58,100, 50, 48, 49, 58, + 49, 58, 51, 53, 58, 51, 53, 13, 10, 48, 58,100, 49,101, 49, 58, 49, 58, + 51, 48, 58, 51, 48, 13, 10, 48, 58,100, 49, 99, 49, 58, 49, 58, 51, 48, + 58, 51, 48, 13, 10, 48, 58,100, 49, 97, 49, 58, 49, 58, 51, 48, 58, 51, + 48, 13, 10, 48, 58,100, 49, 56, 49, 58, 49, 58, 51, 48, 58, 51, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 67,114,121,112,116, 32, 75,105, + 108,108,101,114, 32, 40,107,111,110, 97,109,105,103,113, 46, 99, 41, 32, + 40, 98,121, 32, 71,114,101, 97,116, 83,116,111,110,101, 41, 13, 10, 99, + 114,121,112,116,107,108,114, 58, 13, 10, 48, 58, 50, 51, 55,100, 99, 48, + 58, 53, 48, 58, 52, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 13, 10, 97,107, + 107, 97,110,118,100,114, 58, 13, 10,115,112, 99,105,110,118, 57, 53, 58, + 13, 10,115,112, 99,105,110,118, 57, 53,117, 58, 13, 10, 48, 58, 52, 49, + 55, 52, 56, 52, 58, 54, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, + 49, 55, 52,101, 55, 58, 49, 58, 53, 53, 58, 53, 53, 13, 10, 48, 58, 52, + 49, 48, 98, 56, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,101, + 100,102, 58, 13, 10,101,100,102,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 69, 46, 68, 46, 70, 46, 32, 58, 32, 69, 97,114,116,104, 32, 68,101, + 102,101,110,115,101, 32, 70,111,114, 99,101, 32, 40, 78,111,114,116,104, + 32, 65,109,101,114,105, 99, 97, 41, 13, 10,101,100,102, 98,108, 58, 13, + 10,101,100,102, 97, 58, 13, 10, 48, 58, 54, 52, 99, 49, 55, 58, 49, 48, + 55, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 54, 49,100, 51,101, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 52, 99, 99, 98, 58, 49, 58, + 48, 57, 58, 48, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 119, 97,114,112,119, 97,114,112, 46, 99, 13, 10,119, 97,114,112,119, 97, + 114,112, 58, 13, 10, 48, 58, 56, 51, 49,100, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,119, 97,114,112,119, 97,114,112,114, 58, 13, 10,119, + 97,114,112,119, 97,114,112,114, 50, 58, 13, 10, 48, 58, 56, 51, 49,100, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 51, 53, 56, 58, 49, + 101, 58, 48, 48, 58, 49, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42,109, 99,114, 51, 46, 99, 32, 40,116,117,114, 98,111, 41, 13, + 10, 59, 42, 42, 32,104,105,103,104,115, 99,111,114,101, 32,117,112,100, + 97,116,101,115, 32, 97,102,116,101,114, 32,102,105,114,115,116, 32,103, + 97,109,101, 32, 42, 42, 13, 10,116,117,114, 98,111, 58, 13, 10,116,117, + 114, 98,111, 97, 58, 13, 10,116,117,114, 98,111, 98, 99, 58, 13, 10,116, + 117,114, 98,111, 98, 58, 13, 10,116,117,114, 98,111, 98,108, 58, 13, 10, + 116,117,114, 98,111,100, 58, 13, 10, 48, 58,101, 52, 48, 48, 58, 49,101, + 58, 57, 52, 58, 57, 52, 13, 10, 48, 58,102, 51, 49, 48, 58, 49,101, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 50, 57, 50, 58,100, 58, 48,102, + 58,102, 48, 13, 10, 13, 10, 59, 32,102,101,110,105,120, 32,105,115, 32, + 110,111,116, 32,119,111,114,107,105,110,103, 32,121,101,116, 32, 59, 91, + 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, + 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99, + 105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10,112, + 104,111,101,110,105,120, 58, 13, 10, 99,111,110,100,111,114, 58, 13, 10, + 102, 97,108, 99,111,110, 58, 13, 10,110,101,120,116,102, 97,115,101, 58, + 13, 10,112,104,111,101,110,105,120, 51, 58, 13, 10,112,104,111,101,110, + 105,120, 97, 58, 13, 10,112,104,111,101,110,105,120, 98, 58, 13, 10,112, + 104,111,101,110,105,120, 99, 58, 13, 10,112,104,111,101,110,105,120, 99, + 50, 58, 13, 10,112,104,111,101,110,105,120,106, 58, 13, 10,112,104,111, + 101,110,105,120,116, 58, 13, 10,118, 97,117,116,111,117,114, 58, 13, 10, + 112,108,101,105, 97,100,115, 58, 13, 10,112,108,101,105, 97,100, 98,108, + 58, 13, 10,112,108,101,105, 97,100, 99,101, 58, 13, 10,112,104,111,101, + 110,105,120, 99, 51, 58, 13, 10,112,104,111,101,110,105,120, 99, 52, 58, + 13, 10,112,108,101,105, 97,100,115, 98, 50, 58, 13, 10,112,104,111,101, + 110,105,120,115, 58, 13, 10, 97,118,101,102,101,110,105,120, 58, 13, 10, + 112,108,101,105, 97,100,115,105, 58, 13, 10,112,108,101,105, 97,100,115, + 115, 58, 13, 10,112,104,111,101,110,105,120,100, 97,108, 58, 13, 10, 97, + 118,101,102,101,110,105,120,114,102, 58, 13, 10, 97,118,101,102,101,110, + 105,120,108, 58, 13, 10,112,104,111,101,110,105,120, 97,115,115, 58, 13, + 10,118, 97,117,116,111,117,114,122, 97, 58, 13, 10,112,108,101,105, 97, + 100,115,110, 58, 13, 10, 48, 58, 52, 51, 56, 57, 58, 48, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 52, 49,101, 49, 58, 48, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 52, 49, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 48, 58, 52, 49, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 52, 49, 56, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 48, 58, 52, 49, 54, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 52, 49, 52, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, + 58, 52, 51, 56, 49, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 52, 51, 48, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, + 50,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 50, + 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 50, 97, + 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 50, 56, 49, + 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 50, 54, 49, 58, + 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 51, 56, 53, 58, 48, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 99, 49, 58, 48, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 97, 49, 58, 48, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 56, 49, 58, 48, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 54, 49, 58, 48, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58, 52, 48, 52, 49, 58, 48, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 52, 48, 50, 49, 58, 48, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 13, 10, 98, 97,116,109, 97,110, 50, 58, 13, 10, 48, 58, 52, + 50, 56, 57, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 49, + 101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 49, 99, + 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 49, 97, 49, + 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 49, 56, 49, 58, + 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 49, 54, 49, 58, 48, + 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 49, 52, 49, 58, 48, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 50, 56, 49, 58, 48, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 51, 48, 49, 58, 48, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 48, 58, 53, 50,101, 49, 58, 48, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58, 53, 50, 99, 49, 58, 48, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 53, 50, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 48, 58, 53, 50, 56, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 53, 50, 54, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 48, 58, 52, 50, 56, 53, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 53, 48, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, + 58, 53, 48, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 53, 48, 56, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, + 48, 54, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 48, + 52, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 48, 50, + 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10,109,109, 97,103, + 105, 99, 58, 13, 10, 48, 58, 50, 48, 48, 48, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 97,121, 97, 32, + 38, 32,105,110, 99, 97, 13, 10,109, 97,121, 97, 58, 13, 10,105,110, 99, + 97, 58, 13, 10,109, 97,121, 97, 97, 58, 13, 10,109, 97,121, 97, 99, 58, + 13, 10, 48, 58, 55, 53, 48, 48, 58, 50, 50, 58, 52, 49, 58, 48, 48, 13, + 10, 48, 58, 55, 55, 52, 49, 58, 50, 58,102, 97, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42,112, 97,114, 97,100,105,115,101, 13, 10, + 112, 97,114, 97,100,105,115,101, 58, 13, 10,112, 97,114, 97,100,105,115, + 101, 97, 58, 13, 10,112, 97,114, 97,100,105,115,101,101, 58, 13, 10, 48, + 58,101, 54, 99, 51, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,101, + 54,101, 51, 58, 50, 50, 58, 52, 49, 58, 48, 48, 13, 10, 13, 10,118,105, + 103,105,108, 97,110,116, 58, 13, 10,118,105,103,105,108, 97,110,116, 98, + 108, 58, 13, 10,118,105,103,105,108, 97,110,116, 99, 58, 13, 10,118,105, + 103,105,108, 97,110,116,100, 58, 32, 59, 91, 67,108,111,110,101, 32, 97, + 100,100,101,100, 32, 98,121, 32, 87,111, 98, 93, 13, 10,118,105,103,105, + 108, 97,110,116,111, 58, 32, 59, 91, 67,108,111,110,101, 32, 97,100,100, + 101,100, 32, 98,121, 32, 87,111, 98, 93, 13, 10,118,105,103,105,108, 97, + 110,116,103, 58, 13, 10,118,105,103,105,108, 97,110,116, 98, 58, 13, 10, + 118,105,103,105,108, 97,110,116, 97, 58, 13, 10, 48, 58,101, 48, 52, 56, + 58, 51,102, 58, 48, 48, 58, 52, 56, 13, 10, 13, 10,100,102,107, 98,108, + 58, 13, 10, 48, 58, 99, 97, 48, 50, 48, 50, 56, 58, 50,102, 99, 98, 58, + 48, 56, 58, 53, 54, 13, 10, 13, 10,109, 99,104,101,111,110,114,117, 58, + 13, 10, 48, 58, 49, 48, 57, 48,100, 99, 58, 49, 49,102, 58, 48, 48, 58, + 48, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,100, 97, + 105,111,104, 41, 13, 10,100, 97,105,111,104, 58, 13, 10,100, 97,105,111, + 104, 97, 58, 13, 10, 48, 58, 49, 48, 55, 52, 56, 99, 58, 97, 51, 58, 48, + 48, 58, 48, 53, 13, 10, 48, 58, 49, 48, 55, 52, 56,102, 58, 49, 58,101, + 56, 58,101, 56, 13, 10, 13, 10,100, 97,105,111,104, 99, 58, 13, 10, 48, + 58, 50, 48, 55, 52, 57, 54, 58, 57, 57, 58, 48, 48, 58, 48, 53, 13, 10, + 13, 10,100, 97,105,111,104,112, 58, 13, 10, 48, 58, 50, 48, 54, 99, 57, + 54, 58, 57, 57, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10, 99, 97,114,104, + 110,116,100,115, 58, 13, 10, 48, 58, 56, 52, 53,101, 58, 54, 58, 48, 48, + 58, 48, 52, 13, 10, 48, 58, 56, 51, 97, 49, 58, 54, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,101,114,122, + 101,114,107, 46, 99, 13, 10, 98,101,114,122,101,114,107, 58, 13, 10, 98, + 101,114,122,101,114,107, 49, 58, 13, 10, 98,101,114,122,101,114,107,103, + 58, 13, 10, 98,101,114,122,101,114,107,115, 58, 13, 10, 98,101,114,122, + 101,114,107,102, 58, 13, 10, 48, 58, 52, 51, 48, 50, 58, 51, 99, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 52, 51, 48, 49, 58, 49, 58, 52, 50, 58, + 52, 50, 13, 10, 13, 10,103,112,114,105,100,101,114, 58, 13, 10,103,112, + 114,105,100,101,114,117, 58, 13, 10,103,112,114,105,100,101,114,106, 58, + 13, 10,103,112,114,105,100,101,114,106,115, 58, 13, 10,103,112,114,105, + 100,101,114,115, 58, 13, 10,103,112,114,105,100,101,114,117,115, 58, 13, + 10, 48, 58, 50, 56, 48, 49, 57, 50, 58, 97, 97, 58, 51, 52, 58, 51, 48, + 13, 10, 48, 58, 57, 99, 55, 48, 56, 58, 56, 58, 48, 49, 58, 50, 48, 13, + 10, 13, 10,115,112,105,100,101,114, 58, 13, 10, 48, 58, 54,102, 54, 99, + 58, 49, 51, 58, 53, 48, 58, 48, 48, 13, 10, 48, 58,101, 48, 55, 99, 58, + 50, 99, 58, 52, 49, 58, 48, 48, 13, 10, 48, 58,101, 53, 52, 50, 58, 98, + 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 54,102, 55,100, 58, 49, 58, 50, + 55, 58, 50, 55, 13, 10, 13, 10, 99,100,114, 97, 99,117,108, 97, 58, 13, + 10, 48, 58, 99, 51, 57,102, 58, 54, 97, 58, 52, 51, 58, 48, 48, 13, 10, + 48, 58, 99, 52, 48, 54, 58, 49, 58, 49, 51, 58, 49, 51, 13, 10, 48, 58, + 99, 99, 50, 98, 58, 52, 58, 53, 48, 58, 48, 48, 13, 10, 13, 10, 98,114, + 105, 99,107,122,110, 58, 13, 10, 98,114,105, 99,107,122,110,118, 52, 58, + 13, 10, 98,114,105, 99,107,122,110,118, 53, 58, 13, 10, 98,114,105, 99, + 107,122,110, 49, 49, 58, 13, 10, 48, 58, 99,102, 49, 48, 58, 52,101, 58, + 50, 51, 58, 52,100, 13, 10, 48, 58, 99, 56, 97, 48, 58, 50, 58, 48, 48, + 58, 48, 51, 13, 10, 13, 10,115,109,105,115,115,119, 58, 13, 10, 48, 58, + 99, 48, 50, 53, 98, 54, 58, 54, 51, 58, 51, 48, 58, 50, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,115,105,100,101, 97,114,109,115, + 32, 38, 32, 99,108,111,110,101,115, 41, 13, 10,115,105,100,101, 97,114, + 109,115, 58, 13, 10,115,105,100,101, 97,114,109,115,114, 58, 13, 10,115, + 105,100,101, 97,114,109,115,117,114, 49, 58, 13, 10, 48, 58,101, 54, 56, + 50, 58, 52,101, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58,101, 54, 48, 49, + 58, 55, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 99,101, 58, 49, + 58, 51, 98, 58, 51, 98, 13, 10, 13, 10,115,105,100,101, 97,114,109,115, + 117, 58, 13, 10, 48, 58,101, 54, 56, 50, 58, 52,101, 58, 48, 48, 58, 48, + 51, 13, 10, 48, 58,101, 54, 48, 49, 58, 55, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 54, 99,101, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, + 10,115,105,100,101, 97,114,109,115,106, 58, 13, 10, 48, 58,101, 54, 56, + 50, 58, 52,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 49, + 58, 55, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 99,101, 58, 49, + 58, 51, 98, 58, 51, 98, 13, 10, 13, 10,120,109,117,108,116,105,112,108, + 109, 55, 50, 58, 13, 10, 48, 58, 56, 48, 57, 57,101, 58, 52, 51, 58, 53, + 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 57, 57, 56, 58, 48, 54, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,120,109,117,108,116,105,112,108, 58, 13, + 10, 48, 58, 57, 99, 57, 57, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 57, 99, 57, 57,100, 58, 52, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 57, 99, 57,100, 97, 58, 49, 58, 54, 50, 58, 54, 50, 13, 10, 13, + 10,115,116, 97,114,116,114,107,115, 58, 13, 10, 48, 58,100, 55, 56, 97, + 58, 53, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 98,108, 97, 99,107, 32,119,105,100,111,119, 13, 10, 98,119,105,100, + 111,119, 58, 13, 10, 48, 58, 51, 48, 50, 58, 50, 52, 58, 50, 48, 58,100, + 98, 13, 10, 48, 58, 51, 50, 54, 58, 55, 54, 58, 49, 98, 58, 49, 49, 13, + 10, 13, 10, 98,119,105,100,111,119,112, 58, 13, 10, 48, 58, 51, 50, 98, + 58, 51, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,117,112,100,117, + 99,107, 58, 13, 10, 48, 58,102,102, 99, 51, 51, 50, 58, 51, 48, 58, 52, + 49, 58, 48, 48, 13, 10, 48, 58,102,102, 99, 51, 54, 48, 58, 49, 58, 49, + 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 68, + 114, 97,103,111,110, 32, 87,111,114,108,100, 32, 73, 73, 32, 40,118,101, + 114, 46, 32, 49, 49, 48, 88, 44, 32, 69,120,112,111,114,116, 41, 13, 10, + 100,114,103,119, 50, 58, 13, 10,100,119, 50,118, 49, 48, 48,120, 58, 13, + 10, 48, 58, 56, 48, 99, 97,102, 56, 58, 52, 54, 58, 52, 57, 58, 52, 48, + 13, 10, 13, 10,100,114,103,119, 50,104,107, 58, 13, 10, 48, 58, 56, 48, + 102, 49, 51, 97, 58, 52, 54, 58, 52, 57, 58, 52, 48, 13, 10, 13, 10, 97, + 108,105,110,118, 97,100,101, 58, 13, 10, 48, 58, 57,102, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,104, 97, 99,104, 97,109,102, 58, 13, 10, + 104, 97, 99,104, 97,109,102, 98, 58, 13, 10, 48, 58,102, 99, 48, 48, 48, + 58, 51,102, 48, 58, 48, 49, 58, 52,101, 13, 10, 13, 10,110,122,101,114, + 111,116,101, 97,109, 58, 13, 10, 48, 58, 57, 50, 53, 99, 58, 52, 98, 58, + 52, 48, 58, 53, 53, 13, 10, 13, 10,122,101,114,111,116,109, 50,107, 58, + 13, 10, 48, 58, 57, 50, 52,101, 58, 52, 98, 58, 52, 48, 58, 53, 53, 13, + 10, 13, 10,122,101,114,111,116,101, 97,109, 58, 13, 10,122,101,114,111, + 116,101, 97,109,100, 58, 13, 10,122,101,114,111,116,101, 97,109, 99, 58, + 13, 10,122,101,114,111,116,101, 97,109,115, 58, 13, 10,122,101,114,111, + 116,101, 97,109,115,114, 58, 13, 10,122,101,114,111,116,101, 97,109, 97, + 58, 13, 10,122,101,114,111,116,101, 97,109, 98, 58, 13, 10, 48, 58, 57, + 50, 49, 50, 58, 52, 98, 58, 52, 48, 58, 53, 53, 13, 10, 13, 10,114, 97, + 105,100,101,110,100,120, 58, 13, 10,114, 97,105,100,101,110,100,120,117, + 58, 13, 10,114, 97,105,100,101,110,100,120,107, 58, 13, 10,114, 97,105, + 100,101,110,100,120,106, 58, 13, 10,114, 97,105,100,101,110,100,120, 97, + 50, 58, 13, 10,114, 97,105,100,101,110,100,120, 97, 49, 58, 13, 10,114, + 97,105,100,101,110,100,120,110,108, 58, 13, 10,114, 97,105,100,101,110, + 100,120,103, 58, 13, 10,114, 97,105,100,101,110,100,120, 99,104, 58, 13, + 10,114, 97,105,100,101,110,100,120,106, 97, 58, 13, 10, 48, 58, 97, 50, + 53, 97, 58, 50, 99,102, 58, 97, 48, 58, 50, 97, 13, 10, 13, 10,114, 50, + 100,120, 95,118, 51, 51, 95,114, 50, 58, 13, 10, 48, 58, 57,101, 52, 54, + 58,101,102, 58, 53, 48, 58, 50, 97, 13, 10, 13, 10,114, 50,100,120, 95, + 118, 51, 51, 58, 13, 10, 48, 58, 97, 50,100, 56, 58, 50, 99,102, 58, 97, + 48, 58, 50, 97, 13, 10, 13, 10,114, 97,105,100,101,110, 50, 58, 13, 10, + 114, 97,105,100,101,110, 50,100,120, 58, 13, 10,114, 97,105,100,101,110, + 50,110,108, 58, 13, 10,114, 97,105,100,101,110, 50,104,107, 58, 13, 10, + 114, 97,105,100,101,110, 50,105, 58, 13, 10,114, 97,105,100,101,110, 50, + 106, 58, 13, 10,114, 97,105,100,101,110, 50,117, 58, 13, 10,114, 97,105, + 100,101,110, 50,115,119, 58, 13, 10,114, 97,105,100,101,110, 50,102, 58, + 13, 10, 48, 58, 57,100,100, 52, 58,101,102, 58, 53, 48, 58, 50, 97, 13, + 10, 13, 10,114, 97,105,100,101,110, 50,103, 58, 13, 10,114, 97,105,100, + 101,110, 50,101, 97, 58, 13, 10,114, 97,105,100,101,110, 50,101, 58, 13, + 10,114, 97,105,100,101,110, 50,101,117, 97, 58, 13, 10,114, 97,105,100, + 101,110, 50,101,117, 58, 13, 10, 48, 58, 57,100,101, 52, 58,101,102, 58, + 53, 48, 58, 50, 97, 13, 10, 13, 10, 97,114,101,115, 99,117,101, 58, 13, + 10, 97,114,101,115, 99,117,101,106, 58, 13, 10, 48, 58, 50, 48,102, 98, + 48, 48, 58, 57,102, 58, 97, 48, 58, 52, 57, 13, 10, 13, 10,102,105,120, + 101,105,103,104,116, 98,108, 58, 13, 10,102,105,120,101,105,103,104,116, + 58, 13, 10,102,105,120,101,105,103,104,116,116, 58, 13, 10,102,105,120, + 101,105,103,104,116,104, 58, 13, 10,102,105,120,101,105,103,104,116,104, + 116, 58, 13, 10,102,105,120,101,105,103,104,116,106, 58, 13, 10,102,105, + 120,101,105,103,104,116,106,116, 58, 13, 10,102,105,120,101,105,103,104, + 116, 97, 58, 13, 10,102,105,120,101,105,103,104,116, 97,116, 58, 13, 10, + 102,105,120,101,105,103,104,116,107, 58, 13, 10,102,105,120,101,105,103, + 104,116,107,116, 58, 13, 10,102,105,120,101,105,103,104,116,116,119, 58, + 13, 10,102,105,120,101,105,103,104,116,116,119,116, 58, 13, 10,102,105, + 120,101,105,103,104,116,117, 58, 13, 10,102,105,120,101,105,103,104,116, + 117,116, 58, 13, 10, 48, 58, 49, 48, 48, 52, 48, 56, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 52, 51, 99, 58, 56, 50, 58, 48, + 48, 58, 48, 52, 13, 10, 48, 58, 49, 48, 48, 52, 48, 97, 58, 49, 58, 53, + 51, 58, 53, 51, 13, 10, 13, 10, 97,105,114, 97,115,115, 58, 13, 10,102, + 105,114,101, 98, 97,114,114, 58, 13, 10, 48, 58,101, 51, 50, 53, 50, 58, + 56, 99, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 99,111,115,109,105, 99, 32, 99,111,112, 40,119,111,114,108, + 100, 41, 40, 98,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, + 99,111,115,109, 99, 99,111,112, 58, 13, 10, 48, 58,101, 51, 99, 53,101, + 58, 54,101, 58, 49, 48, 58, 52, 49, 13, 10, 48, 58,101, 51,100, 55, 50, + 58, 48, 51, 58, 49, 48, 58, 48, 54, 13, 10, 48, 58,101, 51,100, 49, 56, + 58, 51, 99, 58, 48, 48, 58, 53, 97, 13, 10, 13, 10,103, 97,108,108,111, + 112, 58, 13, 10, 48, 58, 97, 51,100, 48, 48, 58, 54,101, 58, 49, 48, 58, + 52, 49, 13, 10, 48, 58, 97, 51,101, 49, 52, 58, 48, 51, 58, 49, 48, 58, + 48, 54, 13, 10, 48, 58, 97, 51,100, 98, 97, 58, 51, 99, 58, 48, 48, 58, + 53, 97, 13, 10, 13, 10, 98, 99,104,111,112,112,101,114, 58, 13, 10,109, + 114,104,101,108,105, 58, 13, 10, 48, 58, 97, 51, 55, 99, 48, 58, 55, 56, + 58, 54, 51, 58, 54, 48, 13, 10, 48, 58, 97, 51, 55, 98, 97, 58, 48, 51, + 58, 54, 51, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,107, 97,110,103, 97,114,111,111, 46, 99, 13, 10,107, 97,110,103, 97, + 114,111,111, 58, 13, 10,107, 97,110,103, 97,114,111,111, 97, 58, 13, 10, + 107, 97,110,103, 97,114,111,111, 98, 58, 13, 10, 48, 58,101, 49, 97, 48, + 58, 51, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 49,100, 97, 58, + 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10,110,101,109,101,115,105,115, + 58, 13, 10,110,101,109,101,115,105,115,117,107, 58, 13, 10, 48, 58, 48, + 54, 53, 48, 57, 97, 58, 49, 58, 55, 54, 58, 55, 54, 13, 10, 48, 58, 48, + 54, 53, 48, 49, 48, 58, 56, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 48, 54, 48, 48, 57, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 48, 54, 48, 48, 57, 97, 58, 49, 58, 55, 51, 58, 55, 51, 13, 10, 13, 10, + 119,121,118,101,114,110,102, 48, 58, 13, 10, 48, 58, 56, 56, 48, 48, 58, + 49, 57, 48, 58, 48, 48, 58, 50, 54, 13, 10, 13, 10,114,111,108, 99,114, + 117,115,104, 58, 13, 10, 48, 58,102,101,100,101, 55, 54, 58, 55, 54, 58, + 52, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 97,108,112,104, 97, 54, 56,107, 46, 99, 13, 10,103, 97,110,103,119, 97, + 114,115,117, 58, 13, 10,103, 97,110,103,119, 97,114,115, 98, 58, 13, 10, + 103, 97,110,103,119, 97,114,115, 58, 13, 10,103, 97,110,103,119, 97,114, + 115,106, 58, 13, 10, 48, 58, 52, 51, 98, 98, 50, 58, 51, 52, 58, 48, 48, + 58, 52, 53, 13, 10, 13, 10, 59,115,112,101, 99, 50,107, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 32,110,111,116, 32,119,111,114,107,105,110,103, 32, + 121,101,116, 13, 10, 59, 48, 58, 99, 48, 51, 48, 49, 58, 51, 98, 58, 48, + 102, 58, 57, 56, 13, 10, 59, 48, 58, 99, 48, 51, 51, 97, 58, 49, 58, 51, + 97, 58, 51, 97, 13, 10, 13, 10, 59, 40,100, 97,105, 32,116,111,114,105, + 100,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,100, + 97,105,116,111,114,105,100, 58, 13, 10, 48, 58, 56, 48, 52, 50, 98, 97, + 58, 50, 56, 58, 48, 48, 58, 52, 48, 13, 10, 48, 58, 56, 48, 52, 50,101, + 50, 58, 50, 56, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10,100, 97,105,116, + 111,114,105,100, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68, 97,105, + 116,111,114,105,100,101, 32, 40, 89, 77, 70, 50, 55, 56, 66, 32,118,101, + 114,115,105,111,110, 41, 13, 10, 48, 58,102, 48, 52, 50, 98, 97, 58, 52, + 97, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 32, 97,102,116, 101,114, 32,121,111,117, 32,103,101,116, 32, 97, 32,104,105,115, 99,111, 114,101, 44, 32,121,111,117, 32,109,117,115,116, 32,115,116, 97,114,116, 32, 97, 32,110,101,119, 32,103, 97,109,101, 32,116,104,101,110, 32,101, - 120,105,116, 32, 42, 42, 10, 59, 42, 42, 32,102,111,114, 32,115, 97,118, - 101, 32,116,111, 32,119,111,114,107, 32, 40,105, 46,101, 32,109, 97,107, - 101, 32,115,117,114,101, 32,116,104,101, 32,110,101,119, 32,116,111,112, - 32,115, 99,111,114,101, 32,105,115, 32,100,105,115,112,108, 97,121,105, - 110,103, 32,105,110, 32,116,111,112, 32,115, 99,111,114,101, 32,115,112, - 111,116, 41, 32, 42, 42, 10,103,114,105,102,102,111,110, 58, 10, 48, 58, - 52, 51, 56, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 49,101, - 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 99, 48, 58, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 97, 48, 58, 49, 58, 50, 48, - 58, 50, 48, 10, 48, 58, 52, 49, 56, 48, 58, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 52, 49, 54, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, - 52, 49, 52, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10,102, 97,108, 99, - 111,110,122, 58, 10,118, 97,117,116,111,117,114,122, 58, 10, 48, 58, 52, - 51, 56, 57, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 49,101, - 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 99, 48, 58, - 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 97, 48, 58, 48, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 56, 48, 58, 48, 49, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 52, 49, 54, 48, 58, 48, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58, 52, 49, 52, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 52, 51, 56, 49, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 52, 51, 48, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, - 50,101, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 99, - 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 97, 48, 58, - 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 56, 48, 58, 48, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 50, 54, 48, 58, 48, 49, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 52, 51, 56, 53, 58, 48, 51, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 48, 99, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 52, 48, 97, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 52, 48, 56, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, - 48, 54, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 48, 52, - 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 48, 50, 48, 58, - 48, 49, 58, 50, 48, 58, 50, 48, 10, 10,112,104,111,101,110,120,112, 50, - 58, 10, 48, 58, 52, 50, 56, 57, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 53, 49,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, - 53, 49, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, - 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, 56, 49, - 58, 48, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, 54, 49, 58, 48, - 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 53, 49, 52, 49, 58, 48, 49, 58, - 50, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,112, 97, - 115,115,105,110,103, 32,115,104,111,116, 32, 40, 50, 32,112,108, 97,121, - 101,114,115, 41, 40, 98,111,111,116,108,101,103, 41, 41, 10,112, 97,115, - 115,115,104,116, 98, 58, 10,112, 97,115,115,115,104,116, 58, 10,112, 97, - 115,115,104,116, 52, 98, 58, 10,112, 97,115,115,115,104,116,106, 58, 10, - 112, 97,115,115,115,104,116, 49, 54, 97, 58, 10,112, 97,115,115,115,104, - 116, 97, 58, 10,112, 97,115,115,115,104,116, 97,100, 58, 10,112, 97,115, - 115,115,104,116,100, 58, 10,112, 97,115,115,115,104,116,106,100, 58, 10, + 120,105,116, 32, 42, 42, 13, 10, 59, 42, 42, 32,102,111,114, 32,115, 97, + 118,101, 32,116,111, 32,119,111,114,107, 32, 40,105, 46,101, 32,109, 97, + 107,101, 32,115,117,114,101, 32,116,104,101, 32,110,101,119, 32,116,111, + 112, 32,115, 99,111,114,101, 32,105,115, 32,100,105,115,112,108, 97,121, + 105,110,103, 32,105,110, 32,116,111,112, 32,115, 99,111,114,101, 32,115, + 112,111,116, 41, 32, 42, 42, 13, 10,103,114,105,102,102,111,110, 58, 13, + 10, 48, 58, 52, 51, 56, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 52, 49,101, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, + 49, 99, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 97, + 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 56, 48, 58, + 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 54, 48, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 52, 48, 58, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 13, 10,102, 97,108, 99,111,110,122, 58, 13, 10,118, + 97,117,116,111,117,114,122, 58, 13, 10, 48, 58, 52, 51, 56, 57, 58, 48, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 49,101, 48, 58, 48, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 99, 48, 58, 48, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 97, 48, 58, 48, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 56, 48, 58, 48, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58, 52, 49, 54, 48, 58, 48, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 52, 49, 52, 48, 58, 48, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 48, 58, 52, 51, 56, 49, 58, 48, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 51, 48, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 48, 58, 52, 50,101, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 52, 50, 99, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, + 58, 52, 50, 97, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 52, 50, 56, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, + 50, 54, 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 51, + 56, 53, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 99, + 48, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 97, 48, + 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 56, 48, 58, + 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 54, 48, 58, 48, + 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 52, 48, 58, 48, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 50, 48, 58, 48, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 13, 10,112,104,111,101,110,120,112, 50, 58, + 13, 10, 48, 58, 52, 50, 56, 57, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 53, 49,101, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 53, 49, 99, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, + 58, 53, 49, 97, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 53, 49, 56, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, + 49, 54, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 53, 49, + 52, 49, 58, 48, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 40,112, 97,115,115,105,110,103, 32,115,104,111,116, + 32, 40, 50, 32,112,108, 97,121,101,114,115, 41, 40, 98,111,111,116,108, + 101,103, 41, 41, 13, 10,112, 97,115,115,115,104,116, 98, 58, 13, 10,112, + 97,115,115,115,104,116, 58, 13, 10,112, 97,115,115,104,116, 52, 98, 58, + 13, 10,112, 97,115,115,115,104,116,106, 58, 13, 10,112, 97,115,115,115, + 104,116, 49, 54, 97, 58, 13, 10,112, 97,115,115,115,104,116, 97, 58, 13, + 10,112, 97,115,115,115,104,116, 97,100, 58, 13, 10,112, 97,115,115,115, + 104,116,100, 58, 13, 10,112, 97,115,115,115,104,116,106,100, 58, 13, 10, 48, 58,102,102,101,101, 48, 48, 58, 53, 57,101, 58, 52,100, 58, 52, 49, - 10, 10, 99,101,110, 99,111,117,114,116, 58, 10, 48, 58,102,102,101, 99, - 48, 48, 58, 53, 57,101, 58, 52,100, 58, 52, 49, 10, 10, 98,111,109, 98, - 115, 97, 58, 32, 32, 59,110,111,116, 32,119,111,114,107,105,110,103, 32, - 121,101,116, 32, 63, 63, 10,100, 56, 52, 99, 58, 51, 99, 58, 49, 55, 58, - 48, 48, 10, 10, 59, 40,115,117,112,101,114, 32,116,111,102,102,121, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,116,111,102,102, - 121,117, 58, 10,115,116,111,102,102,121, 58, 10, 48, 58, 56, 51, 51, 58, - 101, 48, 58, 48, 48, 58,102, 50, 10, 48, 58, 57, 49, 51, 58,102, 48, 58, - 50, 48, 58, 48, 48, 10, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115, - 116, 32,108,101,116, 32,116,104,101, 32,104,105,103,104,115, 99,111,114, - 101, 32,100,105,115,112,108, 97,121, 32,105,110, 32, 97,116,116,114, 97, - 99,116, 32,109,111,100,101, 32, 98,101,102,111,114,101, 32,115,116, 97, - 114,116,105,110,103, 32, 97, 32,103, 97,109,101, 32, 32, 42, 42, 32, 10, - 115,104, 97,110,103,104, 97, 51,117, 58, 10,115,104, 97,110,103,104, 97, - 51,106, 58, 10, 48, 58, 51, 48, 55, 98,101, 50, 58, 55, 56, 58, 48, 48, - 58, 49,100, 10, 10,115,104, 97,110,103,104, 97, 51, 58, 10, 48, 58, 51, - 48, 55, 98,101, 52, 58, 55, 56, 58, 48, 48, 58, 49,100, 10, 10,109,101, - 103, 97,112,104,120, 58, 10, 48, 58, 99, 53, 52, 58, 57,102, 58, 49,102, - 58, 51, 48, 10, 10,105,110,116,114,101,112,105,100, 58, 10,105,110,116, - 114,101,112,105,100, 50, 58, 10,105,110,116,114,101,112,105,100, 98, 58, - 10, 48, 58, 56, 48, 51, 99, 58, 51,100, 58, 48, 50, 58,102,100, 10, 48, - 58, 56, 48, 51, 53, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10,105,110,116, - 114,101,112,105,100, 98, 50, 58, 10,105,110,116,114,101,112,105,100, 98, - 51, 58, 10, 48, 58, 56, 48, 51, 99, 58, 51,100, 58, 48, 50, 58,102,100, - 10, 48, 58, 56, 48, 51, 53, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10,103, - 97,108, 97,120,105, 97, 58, 10,103, 97,108, 97,120,105, 97, 97, 58, 10, - 103, 97,108, 97,120,105, 97, 98, 58, 10,103, 97,108, 97,120,105, 97, 99, - 58, 10, 48, 58, 49,100, 49,100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 49, 99, 57, 49, 58, 49, 58, 53, 53, 58, 53, 53, 10, 10,102,117,110, - 107,121,106,101,116, 97, 58, 10,102,117,110,107,121,106,101,116,106, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 70,117,110,107,121, 32, 74,101,116, - 32, 40, 74, 97,112, 97,110, 41, 10,102,117,110,107,121,106,101,116, 58, - 10, 48, 58, 49, 52, 51, 97, 48, 49, 58, 50, 48, 58, 48, 48, 58, 49, 48, - 10, 48, 58, 49, 52, 51, 97, 50, 49, 58, 49, 52, 48, 58, 49, 50, 58, 48, - 48, 10, 10,100,105,115, 99,111, 98,111,121, 58, 10,100,105,115, 99,111, - 98,111,121,112, 58, 10, 48, 58,102, 56, 48, 48, 58, 56, 48, 58, 48, 48, - 58, 50,101, 10, 10,100,100,112,100,102,107, 58, 10, 48, 58, 99, 56, 56, - 57, 98, 49, 99, 58, 50, 99,102,102, 58, 48, 54, 58, 52,101, 10, 10,100, - 100,112,100,102,107, 49, 48, 58, 10, 48, 58, 99, 56, 56, 56, 55, 55, 99, - 58, 50, 99,102,102, 58, 48, 54, 58, 52,101, 10, 10,101,115,112,103, 97, - 108, 50, 58, 10, 48, 58, 99, 52, 51,101, 48, 54, 52, 58,101,100, 58, 48, - 48, 58, 52,100, 10, 10,102,117,116, 97,114,105, 49, 48, 58, 10, 48, 58, - 99, 53, 49, 99, 48, 98, 48, 58, 49, 56,100, 58, 48, 48, 58, 52, 56, 10, - 10,102,117,116, 97,114,105, 49, 53, 58, 10, 48, 58, 99, 53, 49,102, 55, - 97, 52, 58, 49,100,100, 58, 48, 48, 58, 52, 49, 10, 10,102,117,116, 97, - 114,105, 49, 53, 97, 58, 10, 48, 58, 99, 53, 49,102, 55, 57, 52, 58, 49, - 100,100, 58, 48, 48, 58, 52, 49, 10, 10,102,117,116, 97,114,105, 98,108, - 58, 10,102,117,116, 97,114,105, 98,108,106, 58, 10, 48, 58, 99, 53, 49, - 57, 51, 97, 99, 58, 50, 55, 53, 58, 48, 48, 58, 52, 52, 10, 10,109,117, - 115,104,105,115, 97,109, 58, 10, 48, 58, 99, 50, 52, 52,100, 56, 99, 58, - 101,100, 58, 48, 48, 58, 52,100, 10, 10,109,117,115,104,105,115, 97,109, - 97, 58, 10, 48, 58, 99, 50, 52, 52,100, 49, 99, 58,101,100, 58, 48, 48, - 58, 52,100, 10, 10,109,117,115,104,105,115, 97,109, 98, 58, 10, 48, 58, - 99, 50, 52, 52,100,101, 99, 58, 57,100, 58, 48, 48, 58, 52,101, 10, 10, - 100,101, 97,116,104,115,109,108, 58, 10, 48, 58, 99, 53, 51, 97, 98,100, - 56, 58, 54, 51,102, 58, 48, 48, 58, 52,100, 10, 10,100,115,109, 98,108, - 58, 10, 48, 58, 99, 56, 57, 97,101,101, 57, 58, 57, 53,101, 58, 48, 48, - 58, 52,100, 10, 10,100, 97,110, 99,101,121,101,115,106, 58, 10, 48, 58, - 50, 98, 53, 51, 53, 48, 58, 51, 48, 58, 97, 48, 58, 52, 56, 10, 10,100, - 97,110, 99,101,121,101,115, 58, 10, 48, 58, 50, 98, 53, 56, 51, 48, 58, - 51, 48, 58, 97, 48, 58, 52, 56, 10, 10, 98,108,111, 99,107, 99, 97,114, - 58, 10, 98,108,111, 99,107, 99, 97,114, 98, 58, 10, 48, 58,102, 48, 48, - 48, 53, 56, 58, 53, 52, 58, 48, 48, 58, 48, 56, 10, 10,115,111,107,121, - 117,103,114,116, 58, 10, 48, 58, 54, 48, 56,100, 99, 51, 48, 58, 57,100, - 58, 56, 50, 58, 52, 55, 10, 48, 58, 54, 48, 98,100, 97, 51, 56, 58, 52, - 58, 48, 48, 58, 99, 48, 10, 10,107,114,122,121, 98,111,119,108, 58, 10, - 48, 58, 56, 48, 48, 49, 48, 53, 58, 54, 51, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 99, 48, 48, 48, 56, 48, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, - 119,105,118,101,114,110,119,103, 58, 10, 48, 58, 99, 55, 57,102, 98, 58, - 102, 57, 58, 50, 52, 58, 52, 48, 10, 10,101, 97,114,116,104,106,107,114, - 58, 10,101, 97,114,116,104,106,107,114,112, 58, 10, 48, 58, 49, 48, 51, - 50, 48, 52, 58, 50,102, 58, 48, 48, 58, 52, 50, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 40, 52, 32,101,110, 32,114, 97,121, 97, 41, 10, 52, - 101,110,114, 97,121, 97, 58, 10, 48, 58, 99, 49, 53, 50, 58, 54, 99, 58, - 48, 49, 58, 48, 99, 10, 10, 52,101,110,114, 97,121, 97, 97, 58, 10, 48, - 58, 99, 49, 51,101, 58, 54, 99, 58, 48, 49, 58, 48, 99, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,115,101,103, 97,114, 46, 99, 32, 40, 97,115, - 116,114,111, 32, 98,108, 97,115,116,101,114, 32, 40,118,101,114,115,105, - 111,110, 32, 50, 32, 38, 32, 51, 41, 41, 10, 97,115,116,114,111, 98, 58, - 10, 97,115,116,114,111, 98, 50, 58, 10, 48, 58, 99, 98, 51,102, 58, 70, - 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 67, 67, 49, 56, 58, 49, 58, 53, - 67, 58, 53, 67, 10, 10, 59, 42, 42, 42, 42, 42, 42, 65,115,116,114,111, - 32, 66,108, 97,115,116,101,114, 32, 40,118,101,114,115,105,111,110, 32, - 50, 97, 41, 10, 97,115,116,114,111, 98, 50, 97, 58, 10, 97,115,116,114, - 111, 98,103, 58, 10, 97,115,116,114,111, 98, 49, 58, 10, 48, 58, 99, 98, - 51,102, 58,100, 97, 58, 48, 48, 58, 53, 99, 10, 10,115,116,114,105,100, - 101,114, 50, 58, 10,115,116,114,105,100,101,114, 50, 97, 58, 10,115,104, - 105,114,121,117, 50, 58, 10, 48, 58, 52,100,102,101, 48, 56, 58, 97, 56, - 58, 48, 49, 58, 50, 52, 10, 10, 97,113,117, 97,114,117,115,104, 58, 10, - 48, 58,102, 52,102, 54, 56, 58, 49, 51, 54, 58, 52, 97, 58, 98, 98, 10, - 48, 58,102, 53, 52, 54, 56, 58, 51, 99,101,102, 58, 52, 97, 58, 48, 50, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, - 50, 46, 99, 32, 40,103,114,111,119,108, 32, 40,117,115, 41, 41, 10,103, - 114,111,119,108, 58, 10,103,114,111,119,108, 97, 58, 10,114,117,110, 97, - 114,107, 58, 10,103,114,111,119,108,117, 58, 10, 48, 58, 49, 48,101, 51, - 52, 48, 58,102, 57, 58, 48, 49, 58, 52, 51, 10, 10,103,114,111,119,108, - 112, 58, 10, 48, 58, 49, 48,100, 55, 50, 52, 58, 50, 56, 58, 48, 57, 58, - 52, 53, 10, 10,101,114,116,105, 99,116, 97, 99, 58, 10, 48, 58, 98, 98, - 49, 99, 58, 50,101, 58, 52, 54, 58, 99, 97, 10, 10,101,114,116,105, 99, - 116, 97, 99, 98, 58, 10,101,114,116,105, 99,116, 97, 99, 97, 58, 10, 48, - 58, 98, 49, 56, 52, 58, 50,101, 58, 52, 54, 58, 99, 49, 10, 10,100,111, - 108,109,101,110, 58, 10, 48, 58,102, 48, 54, 48, 50, 58, 52, 99, 58, 52, - 101, 58, 53, 51, 10, 10, 99, 97,114,107,101,116, 58, 10, 48, 58, 49, 50, - 48,101, 55, 57, 58, 50,101, 58, 48, 48, 58, 52, 49, 10, 10,116,101,107, - 107,101,110, 50,106, 99, 58, 10, 48, 58, 51, 53, 57,100,100, 56, 58, 49, - 48,102, 58, 51,102, 58, 52,101, 10, 10,116,101,107,107,101,110, 50, 97, - 98, 58, 10,116,101,107,107,101,110, 50,117, 98, 58, 10,116,101,107,107, - 101,110, 50,106, 98, 58, 10, 48, 58, 51, 53, 97, 53, 48, 52, 58, 49, 48, - 102, 58, 51,102, 58, 52,101, 10, 10,116,101,107,107,101,110, 50, 58, 10, - 48, 58, 51, 53, 52, 98,100, 52, 58, 49, 48,102, 58, 51,102, 58, 52,101, - 10, 10,116,101,107,107,101,110, 50, 97, 97, 58, 10, 48, 58, 51, 53, 50, - 99, 98, 56, 58, 49, 48,102, 58, 51,102, 58, 52,101, 10, 10,116,101,107, - 107,101,110, 58, 10, 48, 58, 49,101, 48, 52, 53, 56, 58, 49, 98,102, 58, - 48, 49, 58, 53, 51, 10, 10,116,101,107,107,101,110, 97, 99, 58, 10, 48, - 58, 49,101, 48, 52, 57, 56, 58, 49, 55,102, 58, 48, 52, 58, 52, 98, 10, - 10,116,101,107,107,101,110, 97, 98, 58, 10, 48, 58, 49,101, 48, 49, 52, - 56, 58, 49, 55,102, 58, 48, 52, 58, 52, 53, 10, 10,116,101,107,107,101, - 110,106, 98, 58, 10, 48, 58, 49,101, 48, 49, 52, 56, 58, 49, 55,102, 58, - 48, 52, 58, 52,101, 10, 10,112,105,112,101,100,114,109, 58, 10,112,105, - 112,101,100,114,109,106, 58, 10,112,105,112,101,100,114,109,117, 58, 10, - 112,105,112,101,100,114,109,116, 58, 10, 48, 58, 56,100, 56, 48, 58, 53, - 57, 58, 48, 99, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 103, 97,108,112, 97,110,105, 99, 46, 99, 32, 40,110,101,119, 32,102, 97, - 110,116, 97,115,105, 97, 41, 10,110,101,119,102, 97,110,116, 58, 10,110, - 101,119,102, 97,110,116, 97, 58, 10, 48, 58, 99, 56, 50, 53, 98, 55, 58, - 54, 50, 58, 51, 48, 58, 50, 48, 10, 10,105,107, 97,114,105, 51, 58, 10, - 105,107, 97,114,105, 51,117, 58, 32, 32, 10,105,107, 97,114,105, 51,106, - 58, 10,105,107, 97,114,105, 51,107, 58, 10, 48, 58, 52, 48, 48, 55,101, - 58, 53, 56, 58, 48, 48, 58, 49,100, 10, 10, 99,111,115,109,105, 99,103, - 105, 58, 32, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32,102,105,120,101,100, - 32, 42, 42, 42, 42, 42, 42, 10, 99,111,115,109,105, 99,103, 58, 10, 48, - 58, 51, 67, 49, 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, - 100, 53,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,100, 55, - 100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,100, 57,100, 58, - 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,100, 98,100, 58, 48, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,100,100,100, 58, 48, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 50,101, 53,100, 58, 48, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 50,101, 55,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 50,101, 57,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 50,101, 98,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, - 101,100,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, 53, - 100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, 55,100, 58, - 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, 57,100, 58, 48, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, 97,100, 58, 48, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 50,102, 98,100, 58, 48, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 50,102,100,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 51, 48, 53,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 48, 55,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, - 48, 57,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 98, - 100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48,100,100, 58, - 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, 53,100, 58, 48, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, 55,100, 58, 48, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 49, 57,100, 58, 48, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 51, 49, 98,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 51, 49,100,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 50, 53,100, 58, 48, 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 51, - 50, 55,100, 58, 48, 49, 58, 56, 50, 58, 56, 50, 10, 48, 58, 51, 50, 57, - 100, 58, 48, 49, 58, 56, 50, 58, 56, 50, 10, 48, 58, 51, 50, 98,100, 58, - 48, 49, 58, 56, 50, 58, 56, 50, 10, 48, 58, 51, 50,100,100, 58, 48, 49, - 58, 55, 99, 58, 55, 99, 10, 10, 98,117, 98,108, 98,111, 98, 50,112, 58, - 10, 48, 58, 52, 48, 54, 56, 52, 56, 58, 48, 52, 58, 48, 48, 58, 51, 52, - 10, 10,114,118,115, 99,104,111,111,108, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 32,114,105,118, 97,108, 32,115, 99,104,111,111,108, 32, 38, 32, - 99,108,111,110,101,115, 32,100,111, 32,110,111,116, 32,115, 97,118,101, - 32,116,111,112, 32,115, 99,111,114,101,115, 32,116,101, 97,109, 32,108, - 111,103,111, 32, 42, 42, 42, 42, 42, 42, 10,114,118,115, 99,104,111,111, - 108, 97, 58, 10,114,118,115, 99,104,111,111,108,117, 58, 10,106,103, 97, - 107,117,101,110, 58, 10, 48, 58, 49,102, 54, 53, 50, 52, 58, 52, 56, 58, - 53, 48, 58, 48,102, 10, 10,115,101, 97, 98, 97,116,116,108, 58, 10, 48, - 58, 49, 99, 48, 98, 58, 49, 53, 58, 48, 48, 58, 48, 97, 10, 10, 97,114, - 99, 97,100,105, 97,110, 58, 10, 48, 58, 49,102,101, 54, 48, 49, 58, 53, - 98, 58, 48, 49, 58, 50, 97, 10, 10,100,101,115,101,114,116,100,110, 58, - 10, 48, 58, 56, 50, 99, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 56, 50, 99, 56, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10,116,101,116,114, - 105,115,116,104, 58, 10, 48, 58, 49, 48, 53, 49, 97, 52, 58, 54, 52, 58, - 52, 53, 58, 48, 56, 10, 10,116,119,114,108,100, 99, 57, 52, 58, 10, 48, - 58,102,102,101, 53,101, 51, 58, 53, 56, 58, 52, 55, 58, 48,100, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,119, 99, 57, 48, 32,102,105,120,101, - 100, 32, 33, 33, 32, 32, 42, 42, 42, 42, 42, 42, 42, 42, 10,119, 99, 57, - 48, 58, 10,119, 99, 57, 48, 98, 58, 10,119, 99, 57, 48, 98, 50, 58, 10, - 119, 99, 57, 48,116, 58, 10,119, 99, 57, 48, 97, 58, 10,119, 99, 57, 48, - 98, 49, 58, 10,119, 99, 57, 48, 98, 97, 58, 10, 48, 58, 56, 48, 48,102, - 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 52,100, 58, 48, - 49, 58, 49, 49, 58, 49, 49, 10, 10,116,101,100,100,121, 98, 98, 58, 10, - 116,101,100,100,121, 98, 98,111, 58, 10,116,101,100,100,121, 98, 98,111, - 98,108, 58, 10, 48, 58, 99, 53, 55, 56, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101,102, 48, 51, 58, 51, 49, 58, 48, 48, 58, 52, 57, 10, 10, - 59, 40,115, 97,116, 97,110, 32,111,102, 32,115, 97,116,117,114,110, 41, - 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,115, 97,116, 97,110,115, 97,116, 58, 32, 10,122, - 97,114,122,111,110, 58, 10,115, 97,116, 97,110,115, 97,116, 97, 58, 10, - 115, 97,116, 97,110,115, 97,116,105,110,100, 58, 10, 48, 58, 50, 52, 58, - 50, 58, 48, 48, 58, 48, 53, 10, 10,109,105,115,110, 99,114,102,116, 58, - 10, 48, 58, 55, 54,102,100, 52, 58, 54, 48, 58, 52, 54, 58, 49, 48, 10, - 10,109,105,115,110, 99,114,102,116, 97, 58, 10, 48, 58, 55,102, 50, 57, - 48, 58, 54, 48, 58, 52, 54, 58, 49, 48, 10, 10,103,117,116,116, 97,110, - 103,116, 58, 10, 48, 58, 52, 55, 48, 48, 58, 55, 56, 58, 48, 48, 58, 51, - 101, 10, 48, 58, 52, 49, 99, 54, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, - 108,111, 99,111,109,111,116,110, 58, 10,108,111, 99,111, 98,111,111,116, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 76,111, 99,111, 45, 77,111,116, - 105,111,110, 32, 40, 98,111,111,116,108,101,103, 41, 10, 99,111,116,116, - 111,110,103, 58, 10,103,117,116, 97,110,103,116,110, 58, 10, 48, 58, 57, - 102, 48, 48, 58, 55, 56, 58, 48, 48, 58, 51,101, 10, 48, 58, 57, 57, 99, - 54, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, 99, 97,114, 97, 99,116,110, - 58, 10, 99, 97,114, 97, 99,116,110, 50, 58, 10, 48, 58, 48, 53, 48, 48, - 58,102, 58, 48, 49, 58, 56, 50, 10, 48, 58, 48, 54, 52, 48, 58,102, 58, - 52, 50, 58, 53, 51, 10, 48, 58, 48, 48, 48, 97, 58, 51, 58, 49, 50, 58, - 48, 49, 10, 10, 97,116,116, 97, 99,107,102, 99, 58, 10, 48, 58, 50, 48, - 56, 48, 58, 54, 48, 58, 48, 48, 58, 50, 52, 10, 48, 58, 50, 48, 52, 55, - 58, 50, 58, 48, 48, 58, 48, 48, 10, 10,116,105,109,101,102,103,116,114, - 58, 10, 48, 58, 56, 53, 51, 53, 58, 49, 98, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 56, 53, 52,100, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10,115,116, - 117,110,116, 97,105,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32,104, - 105,115, 99,111,114,101, 32,117,112,100, 97,116,101,100, 32,119,104,101, - 110, 32,121,111,117, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, - 32, 32, 42, 42, 42, 42, 42, 42, 10, 48, 58, 99, 49, 51,100, 58, 51, 99, - 58, 48, 48, 58, 53, 98, 10, 48, 58,102, 97, 52, 49, 58, 48, 49, 58, 97, - 48, 58, 97, 48, 10, 48, 58,102, 97, 50, 49, 58, 48, 49, 58, 98, 52, 58, - 98, 52, 10, 48, 58,102, 97, 48, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, - 10, 48, 58,102, 57,101, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, 10, 48, - 58,102, 57, 99, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, 10, 48, 58,102, - 57, 97, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,115,105,108,107,114,111, 97,100, 46, 99, 32, 40,116, - 104,101, 32,108,101,103,101,110,100, 32,111,102, 32,115,105,108,107,114, - 111, 97,100, 41, 10,115,105,108,107,114,111, 97,100, 58, 10,115,105,108, - 107,114,111, 97,100, 97, 58, 10, 48, 58,102,101, 51, 48, 53,101, 58, 56, - 99, 58, 52,100, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, - 112,111,119,101,114, 32,115,112,105,107,101,115, 32, 40,119,111,114,108, - 100, 41, 41, 10,112,115,112,105,107,101,115, 58, 10,115,112,105,107,101, - 115, 57, 49, 58, 10,112,115,112,105,107,101,115, 98, 58, 10,115,118,111, - 108,108,121, 57, 49, 58, 10,115,112,105,107,101,115, 57, 49, 98, 58, 10, - 112,115,112,105,107,101,115, 98, 97, 58, 10, 48, 58, 49, 48, 50, 51,102, - 49, 58, 52,100, 58, 48, 48, 58, 48, 51, 10, 10,112,115,112,105,107,101, - 115, 99, 58, 10,112,115,112,105,107,101,115,107, 58, 10, 48, 58, 49, 48, - 50, 51,102, 49, 58, 52,100, 58, 48, 48, 58, 48, 55, 10, 10,112,115,112, - 105,107,101,115,117, 58, 10, 48, 58, 49, 48, 50, 51,102, 49, 58, 52,100, - 58, 48, 48, 58, 48, 54, 10, 10,105,110,100,105, 97,110, 98,116, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 73,110,100,105, 97,110, 32, 66, 97,116, - 116,108,101, 10,105,110,100,105, 97,110, 98,116, 98,114, 58, 10, 48, 58, - 50, 51, 49, 52, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 99, 99, 98,111, - 111,116,109,114, 58, 10, 48, 58, 56, 48, 56, 51, 58, 53, 52, 58, 48, 50, - 58, 53, 50, 10, 48, 58, 56, 48, 56,102, 58, 49, 58, 48, 50, 58, 48, 50, - 10, 10, 98, 97,103,109, 97,110, 58, 32, 59, 91, 83,112,101, 99,105, 97, - 108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97, - 115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104, - 105,115, 32,101,110,116,114,121, 93, 10, 98, 97,103,109, 97,110,109, 99, - 58, 10, 98, 97,103,110, 97,114,100, 58, 10, 98, 97,103,110, 97,114,100, - 97, 58, 10, 98, 97,103,109, 97,110,115, 58, 10, 98, 97,103,109, 97,110, - 115, 50, 58, 10,115, 98, 97,103,109, 97,110, 58, 10,115, 98, 97,103,109, - 97,110,115, 58, 10, 98, 97,103,109, 97,110,102, 58, 10, 98, 97,103,109, - 97,110,109, 50, 58, 10, 98, 97,103,110, 97,114,100,105, 58, 10, 48, 58, - 54, 50, 49, 55, 58, 53, 48, 58, 48, 48, 58, 49, 48, 10, 10, 59, 42, 42, - 32,116,111,112, 32,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, - 32, 97,115, 32,115,111,111,110, 32, 97,115, 32, 97, 32,103, 97,109,101, - 32,105,115, 32,115,116, 97,114,116,101,100, 32, 42, 42, 10,115,110,111, - 119, 98,114,111,115, 58, 10,115,110,111,119, 98,114,111,115,106, 58, 10, - 115,110,111,119, 98,114,111,115, 97, 58, 10,115,110,111,119, 98,114,111, - 115, 98, 58, 10,115,110,111,119, 98,114,111,115, 99, 58, 10,115,110,111, - 119, 98,114,111,115,100, 58, 10,119,105,110,116, 98,111, 98, 58, 10,115, - 110,111,119, 98,114,111,115, 51, 58, 10,115,110,111,119, 98,114,111, 51, - 58, 10, 98, 97,108,108, 98,111,121, 58, 10,115,110,111,119, 98,114,111, - 115,119, 98, 58, 10,116,111,116,111, 58, 10, 48, 58, 49, 48, 48, 49, 99, - 97, 58, 52, 48, 58, 48, 48, 58, 52,102, 10, 48, 58, 49, 48, 49, 52, 97, - 100, 58, 49, 58, 49,102, 58, 49,102, 10, 48, 58, 49, 48, 49, 52, 98, 55, - 58, 49, 58, 49,102, 58, 49,102, 10, 48, 58, 49, 48, 49, 52, 99, 49, 58, - 49, 58, 48, 56, 58, 48, 56, 10, 48, 58, 49, 48, 49, 52, 99, 98, 58, 49, - 58, 48, 52, 58, 48, 52, 10, 48, 58, 49, 48, 49, 52,100, 53, 58, 49, 58, - 48, 52, 58, 48, 52, 10, 48, 58, 49, 48, 49, 52,100,102, 58, 49, 58, 48, - 52, 58, 48, 52, 10, 48, 58, 49, 48, 49, 52,101, 57, 58, 49, 58, 48, 52, - 58, 48, 52, 10, 10,112,111,112,111, 98,101, 97,114, 58, 10, 48, 58, 50, - 49, 48, 99, 52, 50, 58, 50, 55, 99, 58, 48, 48, 58, 48, 49, 10, 10, 59, + 13, 10, 13, 10, 99,101,110, 99,111,117,114,116, 58, 13, 10, 48, 58,102, + 102,101, 99, 48, 48, 58, 53, 57,101, 58, 52,100, 58, 52, 49, 13, 10, 13, + 10, 98,111,109, 98,115, 97, 58, 32, 32, 59,110,111,116, 32,119,111,114, + 107,105,110,103, 32,121,101,116, 32, 63, 63, 13, 10,100, 56, 52, 99, 58, + 51, 99, 58, 49, 55, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,117,112,101, + 114, 32,116,111,102,102,121, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,115,116,111,102,102,121,117, 58, 13, 10,115,116,111,102, + 102,121, 58, 13, 10, 48, 58, 56, 51, 51, 58,101, 48, 58, 48, 48, 58,102, + 50, 13, 10, 48, 58, 57, 49, 51, 58,102, 48, 58, 50, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,108,101, + 116, 32,116,104,101, 32,104,105,103,104,115, 99,111,114,101, 32,100,105, + 115,112,108, 97,121, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109, + 111,100,101, 32, 98,101,102,111,114,101, 32,115,116, 97,114,116,105,110, + 103, 32, 97, 32,103, 97,109,101, 32, 32, 42, 42, 13, 10,115,104, 97,110, + 103,104, 97, 51,117, 58, 13, 10,115,104, 97,110,103,104, 97, 51,106, 58, + 13, 10, 48, 58, 51, 48, 55, 98,101, 50, 58, 55, 56, 58, 48, 48, 58, 49, + 100, 13, 10, 13, 10,115,104, 97,110,103,104, 97, 51, 58, 13, 10, 48, 58, + 51, 48, 55, 98,101, 52, 58, 55, 56, 58, 48, 48, 58, 49,100, 13, 10, 13, + 10,109,101,103, 97,112,104,120, 58, 13, 10, 48, 58, 99, 53, 52, 58, 57, + 102, 58, 49,102, 58, 51, 48, 13, 10, 13, 10,105,110,116,114,101,112,105, + 100, 58, 13, 10,105,110,116,114,101,112,105,100, 50, 58, 13, 10,105,110, + 116,114,101,112,105,100, 98, 58, 13, 10, 48, 58, 56, 48, 51, 99, 58, 51, + 100, 58, 48, 50, 58,102,100, 13, 10, 48, 58, 56, 48, 51, 53, 58, 50, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,105,110,116,114,101,112,105,100, 98, + 50, 58, 13, 10,105,110,116,114,101,112,105,100, 98, 51, 58, 13, 10, 48, + 58, 56, 48, 51, 99, 58, 51,100, 58, 48, 50, 58,102,100, 13, 10, 48, 58, + 56, 48, 51, 53, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103, 97, + 108, 97,120,105, 97, 58, 13, 10,103, 97,108, 97,120,105, 97, 97, 58, 13, + 10,103, 97,108, 97,120,105, 97, 98, 58, 13, 10,103, 97,108, 97,120,105, + 97, 99, 58, 13, 10, 48, 58, 49,100, 49,100, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 49, 99, 57, 49, 58, 49, 58, 53, 53, 58, 53, 53, 13, + 10, 13, 10,102,117,110,107,121,106,101,116, 97, 58, 13, 10,102,117,110, + 107,121,106,101,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70,117, + 110,107,121, 32, 74,101,116, 32, 40, 74, 97,112, 97,110, 41, 13, 10,102, + 117,110,107,121,106,101,116, 58, 13, 10, 48, 58, 49, 52, 51, 97, 48, 49, + 58, 50, 48, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, 49, 52, 51, 97, 50, + 49, 58, 49, 52, 48, 58, 49, 50, 58, 48, 48, 13, 10, 13, 10,100,105,115, + 99,111, 98,111,121, 58, 13, 10,100,105,115, 99,111, 98,111,121,112, 58, + 13, 10, 48, 58,102, 56, 48, 48, 58, 56, 48, 58, 48, 48, 58, 50,101, 13, + 10, 13, 10,100,100,112,100,102,107, 58, 13, 10, 48, 58, 99, 56, 56, 57, + 98, 49, 99, 58, 50, 99,102,102, 58, 48, 54, 58, 52,101, 13, 10, 13, 10, + 100,100,112,100,102,107, 49, 48, 58, 13, 10, 48, 58, 99, 56, 56, 56, 55, + 55, 99, 58, 50, 99,102,102, 58, 48, 54, 58, 52,101, 13, 10, 13, 10,101, + 115,112,103, 97,108, 50, 58, 13, 10, 48, 58, 99, 52, 51,101, 48, 54, 52, + 58,101,100, 58, 48, 48, 58, 52,100, 13, 10, 13, 10,102,117,116, 97,114, + 105, 49, 48, 58, 13, 10, 48, 58, 99, 53, 49, 99, 48, 98, 48, 58, 49, 56, + 100, 58, 48, 48, 58, 52, 56, 13, 10, 13, 10,102,117,116, 97,114,105, 49, + 53, 58, 13, 10, 48, 58, 99, 53, 49,102, 55, 97, 52, 58, 49,100,100, 58, + 48, 48, 58, 52, 49, 13, 10, 13, 10,102,117,116, 97,114,105, 49, 53, 97, + 58, 13, 10, 48, 58, 99, 53, 49,102, 55, 57, 52, 58, 49,100,100, 58, 48, + 48, 58, 52, 49, 13, 10, 13, 10,102,117,116, 97,114,105, 98,108, 58, 13, + 10,102,117,116, 97,114,105, 98,108,106, 58, 13, 10, 48, 58, 99, 53, 49, + 57, 51, 97, 99, 58, 50, 55, 53, 58, 48, 48, 58, 52, 52, 13, 10, 13, 10, + 109,117,115,104,105,115, 97,109, 58, 13, 10, 48, 58, 99, 50, 52, 52,100, + 56, 99, 58,101,100, 58, 48, 48, 58, 52,100, 13, 10, 13, 10,109,117,115, + 104,105,115, 97,109, 97, 58, 13, 10, 48, 58, 99, 50, 52, 52,100, 49, 99, + 58,101,100, 58, 48, 48, 58, 52,100, 13, 10, 13, 10,109,117,115,104,105, + 115, 97,109, 98, 58, 13, 10, 48, 58, 99, 50, 52, 52,100,101, 99, 58, 57, + 100, 58, 48, 48, 58, 52,101, 13, 10, 13, 10,100,101, 97,116,104,115,109, + 108, 58, 13, 10, 48, 58, 99, 53, 51, 97, 98,100, 56, 58, 54, 51,102, 58, + 48, 48, 58, 52,100, 13, 10, 13, 10,100,115,109, 98,108, 58, 13, 10, 48, + 58, 99, 56, 57, 97,101,101, 57, 58, 57, 53,101, 58, 48, 48, 58, 52,100, + 13, 10, 13, 10,100, 97,110, 99,101,121,101,115,106, 58, 13, 10, 48, 58, + 50, 98, 53, 51, 53, 48, 58, 51, 48, 58, 97, 48, 58, 52, 56, 13, 10, 13, + 10,100, 97,110, 99,101,121,101,115, 58, 13, 10, 48, 58, 50, 98, 53, 56, + 51, 48, 58, 51, 48, 58, 97, 48, 58, 52, 56, 13, 10, 13, 10, 98,108,111, + 99,107, 99, 97,114, 58, 13, 10, 98,108,111, 99,107, 99, 97,114, 98, 58, + 13, 10, 48, 58,102, 48, 48, 48, 53, 56, 58, 53, 52, 58, 48, 48, 58, 48, + 56, 13, 10, 13, 10,115,111,107,121,117,103,114,116, 58, 13, 10, 48, 58, + 54, 48, 56,100, 99, 51, 48, 58, 57,100, 58, 56, 50, 58, 52, 55, 13, 10, + 48, 58, 54, 48, 98,100, 97, 51, 56, 58, 52, 58, 48, 48, 58, 99, 48, 13, + 10, 13, 10,107,114,122,121, 98,111,119,108, 58, 13, 10, 48, 58, 56, 48, + 48, 49, 48, 53, 58, 54, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, + 48, 48, 48, 56, 48, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10,119, + 105,118,101,114,110,119,103, 58, 13, 10, 48, 58, 99, 55, 57,102, 98, 58, + 102, 57, 58, 50, 52, 58, 52, 48, 13, 10, 13, 10,101, 97,114,116,104,106, + 107,114, 58, 13, 10,101, 97,114,116,104,106,107,114,112, 58, 13, 10, 48, + 58, 49, 48, 51, 50, 48, 52, 58, 50,102, 58, 48, 48, 58, 52, 50, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, 52, 32,101,110, 32,114, + 97,121, 97, 41, 13, 10, 52,101,110,114, 97,121, 97, 58, 13, 10, 48, 58, + 99, 49, 53, 50, 58, 54, 99, 58, 48, 49, 58, 48, 99, 13, 10, 13, 10, 52, + 101,110,114, 97,121, 97, 97, 58, 13, 10, 48, 58, 99, 49, 51,101, 58, 54, + 99, 58, 48, 49, 58, 48, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,115,101,103, 97,114, 46, 99, 32, 40, 97,115,116,114,111, 32, 98, + 108, 97,115,116,101,114, 32, 40,118,101,114,115,105,111,110, 32, 50, 32, + 38, 32, 51, 41, 41, 13, 10, 97,115,116,114,111, 98, 58, 13, 10, 97,115, + 116,114,111, 98, 50, 58, 13, 10, 48, 58, 99, 98, 51,102, 58, 70, 54, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 67, 67, 49, 56, 58, 49, 58, 53, 67, + 58, 53, 67, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 65,115,116,114, + 111, 32, 66,108, 97,115,116,101,114, 32, 40,118,101,114,115,105,111,110, + 32, 50, 97, 41, 13, 10, 97,115,116,114,111, 98, 50, 97, 58, 13, 10, 97, + 115,116,114,111, 98,103, 58, 13, 10, 97,115,116,114,111, 98, 49, 58, 13, + 10, 48, 58, 99, 98, 51,102, 58,100, 97, 58, 48, 48, 58, 53, 99, 13, 10, + 13, 10,115,116,114,105,100,101,114, 50, 58, 13, 10,115,116,114,105,100, + 101,114, 50, 97, 58, 13, 10,115,104,105,114,121,117, 50, 58, 13, 10, 48, + 58, 52,100,102,101, 48, 56, 58, 97, 56, 58, 48, 49, 58, 50, 52, 13, 10, + 13, 10, 97,113,117, 97,114,117,115,104, 58, 13, 10, 48, 58,102, 52,102, + 54, 56, 58, 49, 51, 54, 58, 52, 97, 58, 98, 98, 13, 10, 48, 58,102, 53, + 52, 54, 56, 58, 51, 99,101,102, 58, 52, 97, 58, 48, 50, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, + 99, 32, 40,103,114,111,119,108, 32, 40,117,115, 41, 41, 13, 10,103,114, + 111,119,108, 58, 13, 10,103,114,111,119,108, 97, 58, 13, 10,114,117,110, + 97,114,107, 58, 13, 10,103,114,111,119,108,117, 58, 13, 10, 48, 58, 49, + 48,101, 51, 52, 48, 58,102, 57, 58, 48, 49, 58, 52, 51, 13, 10, 13, 10, + 103,114,111,119,108,112, 58, 13, 10, 48, 58, 49, 48,100, 55, 50, 52, 58, + 50, 56, 58, 48, 57, 58, 52, 53, 13, 10, 13, 10,101,114,116,105, 99,116, + 97, 99, 58, 13, 10, 48, 58, 98, 98, 49, 99, 58, 50,101, 58, 52, 54, 58, + 99, 97, 13, 10, 13, 10,101,114,116,105, 99,116, 97, 99, 98, 58, 13, 10, + 101,114,116,105, 99,116, 97, 99, 97, 58, 13, 10, 48, 58, 98, 49, 56, 52, + 58, 50,101, 58, 52, 54, 58, 99, 49, 13, 10, 13, 10,100,111,108,109,101, + 110, 58, 13, 10, 48, 58,102, 48, 54, 48, 50, 58, 52, 99, 58, 52,101, 58, + 53, 51, 13, 10, 13, 10, 99, 97,114,107,101,116, 58, 13, 10, 48, 58, 49, + 50, 48,101, 55, 57, 58, 50,101, 58, 48, 48, 58, 52, 49, 13, 10, 13, 10, + 116,101,107,107,101,110, 50,106, 99, 58, 13, 10, 48, 58, 51, 53, 57,100, + 100, 56, 58, 49, 48,102, 58, 51,102, 58, 52,101, 13, 10, 13, 10,116,101, + 107,107,101,110, 50, 97, 98, 58, 13, 10,116,101,107,107,101,110, 50,117, + 98, 58, 13, 10,116,101,107,107,101,110, 50,106, 98, 58, 13, 10, 48, 58, + 51, 53, 97, 53, 48, 52, 58, 49, 48,102, 58, 51,102, 58, 52,101, 13, 10, + 13, 10,116,101,107,107,101,110, 50, 58, 13, 10, 48, 58, 51, 53, 52, 98, + 100, 52, 58, 49, 48,102, 58, 51,102, 58, 52,101, 13, 10, 13, 10,116,101, + 107,107,101,110, 50, 97, 97, 58, 13, 10, 48, 58, 51, 53, 50, 99, 98, 56, + 58, 49, 48,102, 58, 51,102, 58, 52,101, 13, 10, 13, 10,116,101,107,107, + 101,110, 58, 13, 10, 48, 58, 49,101, 48, 52, 53, 56, 58, 49, 98,102, 58, + 48, 49, 58, 53, 51, 13, 10, 13, 10,116,101,107,107,101,110, 97, 99, 58, + 13, 10, 48, 58, 49,101, 48, 52, 57, 56, 58, 49, 55,102, 58, 48, 52, 58, + 52, 98, 13, 10, 13, 10,116,101,107,107,101,110, 97, 98, 58, 13, 10, 48, + 58, 49,101, 48, 49, 52, 56, 58, 49, 55,102, 58, 48, 52, 58, 52, 53, 13, + 10, 13, 10,116,101,107,107,101,110,106, 98, 58, 13, 10, 48, 58, 49,101, + 48, 49, 52, 56, 58, 49, 55,102, 58, 48, 52, 58, 52,101, 13, 10, 13, 10, + 112,105,112,101,100,114,109, 58, 13, 10,112,105,112,101,100,114,109,106, + 58, 13, 10,112,105,112,101,100,114,109,117, 58, 13, 10,112,105,112,101, + 100,114,109,116, 58, 13, 10, 48, 58, 56,100, 56, 48, 58, 53, 57, 58, 48, + 99, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, + 97,108,112, 97,110,105, 99, 46, 99, 32, 40,110,101,119, 32,102, 97,110, + 116, 97,115,105, 97, 41, 13, 10,110,101,119,102, 97,110,116, 58, 13, 10, + 110,101,119,102, 97,110,116, 97, 58, 13, 10, 48, 58, 99, 56, 50, 53, 98, + 55, 58, 54, 50, 58, 51, 48, 58, 50, 48, 13, 10, 13, 10,105,107, 97,114, + 105, 51, 58, 13, 10,105,107, 97,114,105, 51,117, 58, 13, 10,105,107, 97, + 114,105, 51,106, 58, 13, 10,105,107, 97,114,105, 51,107, 58, 13, 10, 48, + 58, 52, 48, 48, 55,101, 58, 53, 56, 58, 48, 48, 58, 49,100, 13, 10, 13, + 10, 99,111,115,109,105, 99,103,105, 58, 32, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 32,102,105,120,101,100, 32, 42, 42, 42, 42, 42, 42, 13, 10, 99, + 111,115,109,105, 99,103, 58, 13, 10, 48, 58, 51, 67, 49, 48, 58, 48, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,100, 53,100, 58, 48, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,100, 55,100, 58, 48, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 50,100, 57,100, 58, 48, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 50,100, 98,100, 58, 48, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 50,100,100,100, 58, 48, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 50,101, 53,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 50,101, 55,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 50,101, 57,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 50,101, 98,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 50,101,100,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 50,102, 53,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, + 102, 55,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, + 57,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 97, + 100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 98,100, + 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102,100,100, 58, + 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 53,100, 58, 48, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 55,100, 58, 48, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 57,100, 58, 48, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 98,100, 58, 48, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 51, 48,100,100, 58, 48, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 51, 49, 53,100, 58, 48, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 49, 55,100, 58, 48, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 51, 49, 57,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 51, 49, 98,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 51, 49,100,100, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 51, 50, 53,100, 58, 48, 49, 58, 55, 99, 58, 55, 99, 13, 10, 48, + 58, 51, 50, 55,100, 58, 48, 49, 58, 56, 50, 58, 56, 50, 13, 10, 48, 58, + 51, 50, 57,100, 58, 48, 49, 58, 56, 50, 58, 56, 50, 13, 10, 48, 58, 51, + 50, 98,100, 58, 48, 49, 58, 56, 50, 58, 56, 50, 13, 10, 48, 58, 51, 50, + 100,100, 58, 48, 49, 58, 55, 99, 58, 55, 99, 13, 10, 13, 10, 98,117, 98, + 108, 98,111, 98, 50,112, 58, 13, 10, 48, 58, 52, 48, 54, 56, 52, 56, 58, + 48, 52, 58, 48, 48, 58, 51, 52, 13, 10, 13, 10,114,118,115, 99,104,111, + 111,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32,114,105,118, 97,108, + 32,115, 99,104,111,111,108, 32, 38, 32, 99,108,111,110,101,115, 32,100, + 111, 32,110,111,116, 32,115, 97,118,101, 32,116,111,112, 32,115, 99,111, + 114,101,115, 32,116,101, 97,109, 32,108,111,103,111, 32, 42, 42, 42, 42, + 42, 42, 13, 10,114,118,115, 99,104,111,111,108, 97, 58, 13, 10,114,118, + 115, 99,104,111,111,108,117, 58, 13, 10,106,103, 97,107,117,101,110, 58, + 13, 10, 48, 58, 49,102, 54, 53, 50, 52, 58, 52, 56, 58, 53, 48, 58, 48, + 102, 13, 10, 13, 10,115,101, 97, 98, 97,116,116,108, 58, 13, 10, 48, 58, + 49, 99, 48, 98, 58, 49, 53, 58, 48, 48, 58, 48, 97, 13, 10, 13, 10, 97, + 114, 99, 97,100,105, 97,110, 58, 13, 10, 48, 58, 49,102,101, 54, 48, 49, + 58, 53, 98, 58, 48, 49, 58, 50, 97, 13, 10, 13, 10,100,101,115,101,114, + 116,100,110, 58, 13, 10, 48, 58, 56, 50, 99, 55, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 56, 50, 99, 56, 58, 49, 58, 53, 48, 58, 53, 48, + 13, 10, 13, 10,116,101,116,114,105,115,116,104, 58, 13, 10, 48, 58, 49, + 48, 53, 49, 97, 52, 58, 54, 52, 58, 52, 53, 58, 48, 56, 13, 10, 13, 10, + 116,119,114,108,100, 99, 57, 52, 58, 13, 10, 48, 58,102,102,101, 53,101, + 51, 58, 53, 56, 58, 52, 55, 58, 48,100, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,119, 99, 57, 48, 32,102,105,120,101,100, 32, 33, 33, + 32, 32, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10,119, 99, 57, 48, 58, 13, + 10,119, 99, 57, 48, 98, 58, 13, 10,119, 99, 57, 48, 98, 50, 58, 13, 10, + 119, 99, 57, 48,116, 58, 13, 10,119, 99, 57, 48, 97, 58, 13, 10,119, 99, + 57, 48, 98, 49, 58, 13, 10,119, 99, 57, 48, 98, 97, 58, 13, 10, 48, 58, + 56, 48, 48,102, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, + 48, 52,100, 58, 48, 49, 58, 49, 49, 58, 49, 49, 13, 10, 13, 10,116,101, + 100,100,121, 98, 98, 58, 13, 10,116,101,100,100,121, 98, 98,111, 58, 13, + 10,116,101,100,100,121, 98, 98,111, 98,108, 58, 13, 10, 48, 58, 99, 53, + 55, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101,102, 48, 51, + 58, 51, 49, 58, 48, 48, 58, 52, 57, 13, 10, 13, 10, 59, 40,115, 97,116, + 97,110, 32,111,102, 32,115, 97,116,117,114,110, 41, 32, 97,110,100, 32, + 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,115, 97,116, 97,110,115, 97,116, 58, 13, 10,122, 97,114,122,111, + 110, 58, 13, 10,115, 97,116, 97,110,115, 97,116, 97, 58, 13, 10,115, 97, + 116, 97,110,115, 97,116,105,110,100, 58, 13, 10, 48, 58, 50, 52, 58, 50, + 58, 48, 48, 58, 48, 53, 13, 10, 13, 10,109,105,115,110, 99,114,102,116, + 58, 13, 10, 48, 58, 55, 54,102,100, 52, 58, 54, 48, 58, 52, 54, 58, 49, + 48, 13, 10, 13, 10,109,105,115,110, 99,114,102,116, 97, 58, 13, 10, 48, + 58, 55,102, 50, 57, 48, 58, 54, 48, 58, 52, 54, 58, 49, 48, 13, 10, 13, + 10,103,117,116,116, 97,110,103,116, 58, 13, 10, 48, 58, 52, 55, 48, 48, + 58, 55, 56, 58, 48, 48, 58, 51,101, 13, 10, 48, 58, 52, 49, 99, 54, 58, + 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,108,111, 99,111,109,111,116, + 110, 58, 13, 10,108,111, 99,111, 98,111,111,116, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 76,111, 99,111, 45, 77,111,116,105,111,110, 32, 40, 98, + 111,111,116,108,101,103, 41, 13, 10, 99,111,116,116,111,110,103, 58, 13, + 10,103,117,116, 97,110,103,116,110, 58, 13, 10, 48, 58, 57,102, 48, 48, + 58, 55, 56, 58, 48, 48, 58, 51,101, 13, 10, 48, 58, 57, 57, 99, 54, 58, + 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 99, 97,114, 97, 99,116,110, + 58, 13, 10, 99, 97,114, 97, 99,116,110, 50, 58, 13, 10, 48, 58, 48, 53, + 48, 48, 58,102, 58, 48, 49, 58, 56, 50, 13, 10, 48, 58, 48, 54, 52, 48, + 58,102, 58, 52, 50, 58, 53, 51, 13, 10, 48, 58, 48, 48, 48, 97, 58, 51, + 58, 49, 50, 58, 48, 49, 13, 10, 13, 10, 97,116,116, 97, 99,107,102, 99, + 58, 13, 10, 48, 58, 50, 48, 56, 48, 58, 54, 48, 58, 48, 48, 58, 50, 52, + 13, 10, 48, 58, 50, 48, 52, 55, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,116,105,109,101,102,103,116,114, 58, 13, 10, 48, 58, 56, 53, 51, + 53, 58, 49, 98, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 53, 52,100, + 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10,115,116,117,110,116, 97, + 105,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32,104,105,115, 99,111, + 114,101, 32,117,112,100, 97,116,101,100, 32,119,104,101,110, 32,121,111, + 117, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 32, 32, 42, 42, + 42, 42, 42, 42, 13, 10, 48, 58, 99, 49, 51,100, 58, 51, 99, 58, 48, 48, + 58, 53, 98, 13, 10, 48, 58,102, 97, 52, 49, 58, 48, 49, 58, 97, 48, 58, + 97, 48, 13, 10, 48, 58,102, 97, 50, 49, 58, 48, 49, 58, 98, 52, 58, 98, + 52, 13, 10, 48, 58,102, 97, 48, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, + 13, 10, 48, 58,102, 57,101, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, 13, + 10, 48, 58,102, 57, 99, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, 13, 10, + 48, 58,102, 57, 97, 49, 58, 48, 49, 58, 98, 48, 58, 98, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,105,108,107,114,111, 97,100, + 46, 99, 32, 40,116,104,101, 32,108,101,103,101,110,100, 32,111,102, 32, + 115,105,108,107,114,111, 97,100, 41, 13, 10,115,105,108,107,114,111, 97, + 100, 58, 13, 10,115,105,108,107,114,111, 97,100, 97, 58, 13, 10, 48, 58, + 102,101, 51, 48, 53,101, 58, 56, 99, 58, 52,100, 58, 48, 49, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,112,111,119,101,114, 32,115,112, + 105,107,101,115, 32, 40,119,111,114,108,100, 41, 41, 13, 10,112,115,112, + 105,107,101,115, 58, 13, 10,115,112,105,107,101,115, 57, 49, 58, 13, 10, + 112,115,112,105,107,101,115, 98, 58, 13, 10,115,118,111,108,108,121, 57, + 49, 58, 13, 10,115,112,105,107,101,115, 57, 49, 98, 58, 13, 10,112,115, + 112,105,107,101,115, 98, 97, 58, 13, 10, 48, 58, 49, 48, 50, 51,102, 49, + 58, 52,100, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10,112,115,112,105,107, + 101,115, 99, 58, 13, 10,112,115,112,105,107,101,115,107, 58, 13, 10, 48, + 58, 49, 48, 50, 51,102, 49, 58, 52,100, 58, 48, 48, 58, 48, 55, 13, 10, + 13, 10,112,115,112,105,107,101,115,117, 58, 13, 10, 48, 58, 49, 48, 50, + 51,102, 49, 58, 52,100, 58, 48, 48, 58, 48, 54, 13, 10, 13, 10,105,110, + 100,105, 97,110, 98,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 73,110, + 100,105, 97,110, 32, 66, 97,116,116,108,101, 13, 10,105,110,100,105, 97, + 110, 98,116, 98,114, 58, 13, 10, 48, 58, 50, 51, 49, 52, 58, 50, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 99, 99, 98,111,111,116,109,114, 58, 13, + 10, 48, 58, 56, 48, 56, 51, 58, 53, 52, 58, 48, 50, 58, 53, 50, 13, 10, + 48, 58, 56, 48, 56,102, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, + 98, 97,103,109, 97,110, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32, + 116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32, + 102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, + 32,101,110,116,114,121, 93, 13, 10, 98, 97,103,109, 97,110,109, 99, 58, + 13, 10, 98, 97,103,110, 97,114,100, 58, 13, 10, 98, 97,103,110, 97,114, + 100, 97, 58, 13, 10, 98, 97,103,109, 97,110,115, 58, 13, 10, 98, 97,103, + 109, 97,110,115, 50, 58, 13, 10,115, 98, 97,103,109, 97,110, 58, 13, 10, + 115, 98, 97,103,109, 97,110,115, 58, 13, 10, 98, 97,103,109, 97,110,102, + 58, 13, 10, 98, 97,103,109, 97,110,109, 50, 58, 13, 10, 98, 97,103,110, + 97,114,100,105, 58, 13, 10, 48, 58, 54, 50, 49, 55, 58, 53, 48, 58, 48, + 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 32,116,111,112, 32,115, 99, + 111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,115, 32,115,111,111, + 110, 32, 97,115, 32, 97, 32,103, 97,109,101, 32,105,115, 32,115,116, 97, + 114,116,101,100, 32, 42, 42, 13, 10,115,110,111,119, 98,114,111,115, 58, + 13, 10,115,110,111,119, 98,114,111,115,106, 58, 13, 10,115,110,111,119, + 98,114,111,115, 97, 58, 13, 10,115,110,111,119, 98,114,111,115, 98, 58, + 13, 10,115,110,111,119, 98,114,111,115, 99, 58, 13, 10,115,110,111,119, + 98,114,111,115,100, 58, 13, 10,119,105,110,116, 98,111, 98, 58, 13, 10, + 115,110,111,119, 98,114,111,115, 51, 58, 13, 10,115,110,111,119, 98,114, + 111, 51, 58, 13, 10, 98, 97,108,108, 98,111,121, 58, 13, 10,115,110,111, + 119, 98,114,111,115,119, 98, 58, 13, 10,116,111,116,111, 58, 13, 10, 48, + 58, 49, 48, 48, 49, 99, 97, 58, 52, 48, 58, 48, 48, 58, 52,102, 13, 10, + 48, 58, 49, 48, 49, 52, 97,100, 58, 49, 58, 49,102, 58, 49,102, 13, 10, + 48, 58, 49, 48, 49, 52, 98, 55, 58, 49, 58, 49,102, 58, 49,102, 13, 10, + 48, 58, 49, 48, 49, 52, 99, 49, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, + 48, 58, 49, 48, 49, 52, 99, 98, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, + 48, 58, 49, 48, 49, 52,100, 53, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, + 48, 58, 49, 48, 49, 52,100,102, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, + 48, 58, 49, 48, 49, 52,101, 57, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, + 13, 10,112,111,112,111, 98,101, 97,114, 58, 13, 10, 48, 58, 50, 49, 48, + 99, 52, 50, 58, 50, 55, 99, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 109,112, 95,115,111,110,105, 99, 58, 32, 32, 59, 42, 42, 42, 32,110,111, - 116, 32,119,111,114,107,105,110,103, 32, 42, 42, 10, 59, 48, 58, 97, 48, - 50, 55, 50, 51, 58, 52,101, 58, 48, 48, 58, 53, 97, 10, 59, 48, 58,102, - 101,102,101, 48,102, 58, 49, 58, 54, 53, 58, 54, 53, 10, 10,103,104,111, - 115,116,109,117,110, 58, 10, 48, 58, 52, 50, 56, 56, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 53, 49, 56, 48, 58, 49, 58, 52, 48, 58, 52, 48, - 10, 48, 58, 53, 49, 97, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, - 53, 49, 99, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 49,101, - 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 48, 48, 58, 49, - 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 50, 48, 58, 49, 58, 52, 48, - 58, 52, 48, 10, 48, 58, 52, 48, 56, 55, 58, 49, 58, 48, 49, 58, 48, 49, - 10, 10,115,114, 97,110,103,101,114, 58, 32, 32, 10,115,114, 97,110,103, - 101,114,111, 58, 10,115,114, 97,110,103,101,114,110, 58, 10,115,114, 97, - 110,103,101,114,119, 58, 10,114,114, 97,110,103,101,114, 58, 10, 48, 58, - 100, 50, 50, 48, 58, 52, 99, 58, 48, 48, 58, 50, 48, 10, 48, 58, 99, 56, - 53, 49, 58, 50, 58, 48, 48, 58, 48, 51, 10, 10,115,114, 97,110,103,101, - 114, 98, 58, 10, 48, 58,100, 50, 50, 48, 58, 52, 99, 58, 48, 48, 58, 50, - 101, 10, 48, 58, 99, 56, 53, 49, 58, 50, 58, 48, 48, 58, 48, 51, 10, 10, - 112,112,114,111, 98,101, 58, 10, 48, 58,102, 51, 56, 48, 58, 52, 53, 58, - 48, 48, 58, 49, 53, 10, 48, 58, 99,100, 57,101, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 99,100, 98,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 99,100,100,101, 58, 49, 58, 48, 51, 58, 48, 51, 10, 48, 58, 99, - 100,102,101, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 99,101, 49,101, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 99,101, 51,101, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 48, 58, 99,101, 53,101, 58, 49, 58, 48, 49, 58, - 48, 49, 10, 10,115,112, 97,114,107,109, 97,110, 58, 10,115,112, 97,114, - 107,109, 97,110, 97, 58, 10, 48, 58, 99, 57, 51, 48, 58, 54, 97, 58, 48, - 48, 58, 48, 49, 10, 48, 58, 99, 56, 56, 48, 58, 50, 58, 48, 48, 58, 48, - 51, 10, 10, 99, 97,100, 97,110,103,108,114, 58, 10, 48, 58, 52, 99, 48, - 58, 49, 57, 58, 49, 56, 58, 48, 48, 10, 48, 58, 52,100, 55, 58, 49, 58, - 53, 48, 58, 53, 48, 10, 48, 58, 54, 49, 58, 50, 58, 48, 48, 58, 48, 48, - 10, 10,115,116, 97,114,102,105,103,104, 58, 10, 48, 58,100, 98, 51, 48, - 58, 50, 54, 58, 48, 48, 58, 52, 99, 10, 48, 58, 99, 56,100, 48, 58, 50, - 58, 48, 48, 58, 48, 51, 10, 10,108,105,116,116,108,101,114, 98, 58, 10, - 48, 58, 50, 48, 50, 48, 50,101, 58, 57,102, 58, 49, 49, 58, 51, 48, 10, - 48, 58, 50, 48, 50, 48, 51,100, 58, 49, 58,101, 56, 58,101, 56, 10, 10, - 103,110,103, 58, 10,103,110,103, 97, 58, 10,103,110,103,116, 58, 10,109, - 97,107, 97,105,109,117,114, 58, 10,109, 97,107, 97,105,109,117,114, 99, - 58, 10,109, 97,107, 97,105,109,117,114,103, 58, 10,103,110,103, 98,108, - 58, 32, 32, 10,103,110,103, 98,108,105,116, 97, 58, 10,103,110,103, 99, - 58, 10, 48, 58, 49, 53, 49, 56, 58, 53, 97, 58, 49, 53, 58, 55, 50, 10, - 48, 58, 48, 48,100, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,103,110, - 103,112,114,111,116, 58, 10, 48, 58, 49, 53, 48, 56, 58, 53, 97, 58, 49, - 53, 58, 55, 50, 10, 48, 58, 48, 48,100, 48, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10,112, 97,110,105, 99,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42,112, 97,110,105, 99, 32,114,111, 97,100, 10,112, 97,110,105, 99,114, - 103, 58, 10, 48, 58, 49, 56,102, 99, 58, 57, 53, 58, 52, 48, 58, 50, 48, - 10, 10,115,107,121,100,101,115,116, 58, 10, 48, 58, 98, 56, 48, 49, 58, - 54, 99, 58, 52, 98, 58, 48, 48, 10, 48, 58, 98, 56, 54, 98, 58, 49, 58, - 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 74,117,109, - 112,105,110,103, 32, 80,111,112, 10,106,117,109,112,112,111,112, 58, 10, - 106,117,109,112,112,111,112,101, 58, 10, 48, 58, 49, 50, 51, 99, 49, 48, - 58, 97, 48, 58, 52, 53, 58, 53, 48, 10, 48, 58, 49, 50, 51, 99, 48, 49, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,100, 98,122, 97, 58, 10, 48, 58, - 52, 56, 54, 54, 53, 99, 58, 53, 52, 58, 48, 48, 58, 49,101, 10, 48, 58, - 52, 56, 54, 51,102, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,100, 98, - 122, 58, 10, 48, 58, 52, 56, 54, 54, 54, 48, 58, 53, 52, 58, 48, 48, 58, - 49,101, 10, 48, 58, 52, 56, 54, 51,102, 50, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10, 99,102,105,115,104,105,110,103, 58, 10, 48, 58, 52, 99, 48, - 58, 49, 56, 58, 49, 56, 58, 53, 48, 10, 10,102,108,105,112,106, 97, 99, - 107, 58, 10, 48, 58, 54, 53, 48, 48, 58,102, 48, 58, 48, 48, 58, 52,102, - 10, 48, 58, 54, 48, 54, 49, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, 97,115,115, 46, 99, - 32, 40, 99, 97,115,115,101,116,116,101, 58, 32, 98,117,114,103,101,114, - 32,116,105,109,101, 41, 10, 99, 98,116,105,109,101, 58, 10, 48, 58, 51, - 51, 58, 50, 52, 58, 48, 48, 58, 49, 50, 10, 10, 99,104, 97,109, 98,117, - 114,103,101,114, 58, 10, 48, 58, 51, 50, 58, 50, 52, 58, 48, 48, 58, 49, - 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101,102, - 98, 46, 99, 32, 40,115,112, 97, 99,101, 32,102,105,114,101, 98,105,114, - 100, 32, 40,110,105,110,116,101,110,100,111, 32, 38, 32,103,114,101,109, - 108,105,110, 32, 38, 32, 98,111,111,116,108,101,103, 41, 41, 10, 59, 42, - 42, 32,116,111,112, 32,115, 99,111,114,101, 32,100,111,110, 96,116, 32, - 117,112,100, 97,116,101, 32,117,110,116,105,108, 32,121,111,117, 32,108, - 111,115,101, 32,121,111,117,114, 32,102,105,114,115,116, 32,108,105,102, - 101, 44, 32,112,114,101,116,116,121, 32, 42, 42, 10, 59, 42, 42, 32,108, - 97,109,101, 32,119, 97,121, 32,102,111,114, 32,100,111,105,110,103, 32, - 97, 32,104,105,115, 99,111,114,101, 32, 45, 32, 98,117,116, 32,119,104, - 111, 32, 97,109, 32,105, 32,116,111, 32, 99,111,109,112,108, 97,105,110, - 33, 33, 32, 59, 48, 41, 32, 42, 42, 10,115,112, 97, 99,101,102, 98, 58, - 10,115,112, 97, 99,101,102, 98, 98, 58, 10,115,112, 97, 99,101,102, 98, - 101, 58, 10,115,112, 97, 99,101,102, 98,117, 58, 10,115,112, 97, 99,101, - 102, 98,101, 50, 58, 10,115,116, 97,114,119, 97,114,114, 58, 10, 48, 58, - 99, 48, 97, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 48, - 101, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 55, 55, 51, 58, - 54, 58, 48, 53, 58, 48, 53, 10, 48, 58, 57, 97, 53, 49, 58, 54, 58, 48, - 53, 58, 48, 53, 10, 10,115,112, 97, 99,101,102, 98,103, 58, 10, 48, 58, - 99, 48, 97, 48, 58, 50, 98, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 51, - 99, 48, 58, 49,101, 58, 49, 49, 58, 49, 48, 10, 48, 58, 99, 48,101, 48, - 58, 51, 58, 48, 48, 58, 51, 48, 10, 10,115,112, 97, 99,101,102, 98, 97, - 58, 10, 48, 58, 99, 55, 55, 51, 58, 54, 58, 48, 53, 58, 48, 53, 10, 48, - 58, 57, 97, 53, 49, 58, 54, 58, 48, 53, 58, 48, 53, 10, 48, 58, 99, 48, - 101, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,114, 97,115,116, 97,110, 46, 99, 10,114, 97,115,116, 97,110, - 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, - 32,116,111, 32, 87,111, 98, 32,102,111,114, 32,101,110,104, 97,110, 99, - 105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10,114, 97, - 115,116, 97,110,117, 58, 10,114, 97,115,116, 97,110,117, 50, 58, 10,114, - 97,115,116,115, 97,103, 97, 58, 10,114, 97,115,116,115, 97,103, 97, 49, - 58, 10,114, 97,115,116, 97,110, 50, 58, 10,114, 97,115,116, 97,110,117, - 97, 58, 10,114, 97,115,116, 97,110,117, 98, 58, 10,114, 97,115,116,115, - 97,103, 97, 97, 58, 10, 48, 58, 49, 48, 99, 49, 52, 48, 58, 50, 54, 58, - 51, 49, 58, 52,101, 10, 48, 58,100, 48, 48, 48, 98, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,100, 48, 48, 48, 98, 53, 58, 49, 58, 50, 98, - 58, 50, 98, 10, 48, 58,100, 48, 48, 48, 98, 97, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,100, 48, 48, 48, 98,100, 58, 49, 58, 50,100, 58, 50, - 100, 10, 48, 58,100, 48, 48, 48, 99, 50, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,100, 48, 48, 48, 99, 53, 58, 49, 58, 51, 49, 58, 51, 49, 10, - 48, 58,100, 48, 48, 48, 99, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,100, 48, 48, 48, 99,100, 58, 49, 58, 50, 99, 58, 50, 99, 10, 48, 58, - 100, 48, 48, 48,100, 50, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58,100, - 48, 48, 48,100, 53, 58, 49, 58, 50, 97, 58, 50, 97, 10, 48, 58,100, 48, - 48, 48,100, 97, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58,100, 48, 48, - 48,100,100, 58, 49, 58, 50, 97, 58, 50, 97, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 75,110,105,103,104,116,115, 32,111,102, 32,116,104,101, 32, - 82,111,117,110,100, 32, 40,119,111,114,108,100, 32, 57, 49, 49, 49, 50, - 55, 32, 38, 32, 99,108,111,110,101,115, 41, 41, 10,107,110,105,103,104, - 116,115, 58, 10,107,110,105,103,104,116,115,106, 58, 32, 10,107,110,105, - 103,104,116,115,117, 58, 32, 10,107,110,105,103,104,116,115, 98, 58, 10, - 107,110,105,103,104,116,115,106, 97, 58, 10, 48, 58,102,102,101, 53, 51, - 97, 58, 50, 53, 55, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,101, 55, - 56,102, 58, 49, 58, 48, 53, 58, 48, 53, 10, 48, 58,102,102,101, 55, 99, - 97, 58, 49, 58, 48, 50, 58, 48, 50, 10, 48, 58,102,102, 97, 52, 98, 54, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,107,111,110,103, 58, 10, 48, 58, - 56, 50, 55,102, 58, 49, 57, 58, 49, 48, 58, 48, 48, 10, 48, 58, 56, 50, - 57, 54, 58, 49, 58, 52, 54, 58, 52, 54, 10, 10,102, 97,110,116, 97,115, - 116, 99, 58, 10, 48, 58, 56, 50, 97,102, 58, 49, 98, 58,100, 48, 58, 48, - 55, 10, 10,102,111,114,103,111,116,116,110, 58, 10,108,111,115,116,119, - 114,108,100, 58, 10,102,111,114,103,111,116,116,110,117, 58, 10,108,111, - 115,116,119,114,108,100,111, 58, 10,102,111,114,103,111,116,116,110,117, - 97, 58, 10,102,111,114,103,111,116,116,110,117, 49, 58, 10,102,111,114, - 103,111,116,116,110,117, 97, 97, 58, 10,102,111,114,103,111,116,116,110, - 97, 58, 10, 48, 58,102,102,101, 49, 52, 50, 58, 53, 48, 58, 48, 48, 58, - 50, 48, 10, 48, 58,102,102, 98, 50, 97, 48, 58, 48, 52, 58, 48, 48, 58, - 48, 48, 10, 10,110,111, 97,104,115, 97,114,107, 58, 10, 48, 58, 50, 56, - 48, 49, 58, 49,101, 58, 56, 49, 58, 52, 52, 10, 10,105,116, 97,116,101, - 110, 58, 10, 48, 58, 97, 50, 54, 54, 58, 49,101, 58, 53, 54, 58, 52, 98, - 10, 48, 58, 97, 48, 50, 99, 58, 49, 58, 53, 52, 58, 53, 52, 10, 10, 98, - 114, 97,112, 98,111,121,115, 58, 32, 32, 59,104,105,115, 99,111,114,101, - 32, 98,114,111,107,101,110, 32,105,110, 32,103, 97,109,101, 32, 32, 98, - 114, 97,112, 98,111,121,115, 32,103, 97,109,101,115, 32, 63, 63, 10, 98, - 114, 97,112, 98,111,121,115,106, 58, 10, 98,114, 97,112, 98,111,121,115, - 117, 58, 10, 48, 58, 49, 48, 51, 48, 99, 53, 58, 51, 49, 58, 48, 48, 58, - 52, 97, 10, 10, 98,105,114,100,105,121, 58, 32, 32, 32, 10, 48, 58, 52, - 99, 50, 57, 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 51,101, - 100, 58, 54, 58, 51, 48, 58, 50, 48, 10, 48, 58, 52,100, 48, 51, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 10,102,115,112,105,100,101,114, 98, 58, 10, - 48, 58, 56, 48, 54, 54, 58, 52, 53, 58, 48, 48, 58, 49, 57, 10, 10, 99, - 97,110,100,121, 58, 32, 32, 59, 42, 42, 32,121,111,117, 32,109,117,115, - 116, 32,119, 97,105,116, 32,117,110,116,105,108,108, 32,104,105,115, 99, - 111,114,101, 32,116, 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112, - 108, 97,121,101,100, 32, 98,101,102,111,114,101, 32,115,116, 97,114,116, - 105,110,103, 32, 97, 32,103, 97,109,101, 32, 32, 42, 42, 10, 48, 58, 52, - 48, 48, 50, 53, 54, 54, 48, 58,102, 48, 58, 52, 49, 58, 48, 50, 10, 10, - 59,112,101,110,107,121, 58, 32, 32, 32, 59, 32, 32, 42, 42, 32, 32,110, - 101,101,100,115, 32,119,111,114,107, 32, 33, 33, 32, 42, 42, 10, 59, 48, - 58,101, 54, 56, 55, 58, 50, 51, 58, 52,102, 58, 48, 52, 10, 59, 48, 58, - 101, 49, 56, 55, 58, 48, 51, 58, 48, 49, 58, 48, 49, 10, 10,108, 97,110, - 100,103,101, 97,114, 58, 10, 48, 58, 56, 48, 51, 54,102, 56, 99, 58,101, - 97, 58, 48, 49, 58, 52, 97, 10, 10,114, 97,105,100,101,114,115,114, 51, - 58, 10,114, 97,105,100,101,114,115, 58, 10, 48, 58, 49, 99, 48, 56, 58, - 52, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 99, 50, 49, 58, 49, 58, - 51, 49, 58, 51, 49, 10, 48, 58, 49, 99, 48,101, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 10,120,101,118,105, 51,100,103, 58, 10, 48, 58, 49, 53, 49, - 50, 98, 56, 58, 51, 98, 58, 52, 56, 58, 52, 98, 10, 10,115,117,112,101, - 114,119,110,103, 58, 10, 48, 58, 55, 57, 50, 48, 58, 99, 56, 58, 48, 48, - 58, 49, 57, 10, 10,103, 97,108, 97, 99,116,105, 99, 58, 10,115,112, 97, - 99,109,105,115,115, 58, 10, 48, 58, 50, 48, 97, 56, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 10, 98,117, 98,108,112,111,110,103, 58, 32, 10, 48, 58, - 101, 54, 52, 99, 58, 51, 50, 58, 48, 48, 58, 49, 51, 10, 48, 58,101, 54, - 52,100, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58,101, 53,100,102, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 48, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,101, 52, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,101, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 101, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 51, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 55, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,101, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 101, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 54, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 55, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,102, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 101, 99, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101,100, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 51, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,102, 52, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,100, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,100, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, - 53, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, 53, 56, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 49, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 102,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 99, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 98, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,102, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 102,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 52, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 53, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 54, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 54, 48, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 54, 48, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, - 48, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 49, 49, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 98, 58, 50, 58, 48, - 48, 58, 48, 48, 10, 10,115, 98,111,109, 98,101,114, 58, 10, 48, 58, 54, - 48, 48, 99, 57, 48, 52, 58, 54, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54, 48, 48, 99, 57, 53,100, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,115, - 98,111,109, 98,101,114, 97, 58, 10, 48, 58, 54, 48, 48, 99, 57, 48, 48, - 58, 54, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 48, 99, 57, 53, - 57, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,101,115,112,103, 97,108, 58, - 10,101,115,112,103, 97,108, 98,108, 58, 10, 48, 58, 56, 48, 49, 48, 55, - 101, 58, 56, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 49, 48,102, - 53, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10,100,100,112,100,111,106, 58, - 10,100,100,112,100,111,106, 97, 58, 10,100,100,112,100,111,106, 98, 58, - 10, 48, 58, 56, 48, 51, 56, 49, 97, 58, 56, 99, 58, 48, 48, 58, 48, 50, - 10, 10,100,100,112,100,111,106, 98,108,107, 98,108, 58, 10, 48, 58, 56, - 48, 51, 56, 50, 52, 58, 56, 99, 58, 48, 49, 58, 48, 54, 10, 10, 59,100, + 116, 32,119,111,114,107,105,110,103, 32, 42, 42, 13, 10, 59, 48, 58, 97, + 48, 50, 55, 50, 51, 58, 52,101, 58, 48, 48, 58, 53, 97, 13, 10, 59, 48, + 58,102,101,102,101, 48,102, 58, 49, 58, 54, 53, 58, 54, 53, 13, 10, 13, + 10,103,104,111,115,116,109,117,110, 58, 13, 10, 48, 58, 52, 50, 56, 56, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 49, 56, 48, 58, 49, + 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 49, 97, 48, 58, 49, 58, 52, + 48, 58, 52, 48, 13, 10, 48, 58, 53, 49, 99, 48, 58, 49, 58, 52, 48, 58, + 52, 48, 13, 10, 48, 58, 53, 49,101, 48, 58, 49, 58, 52, 48, 58, 52, 48, + 13, 10, 48, 58, 53, 50, 48, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, + 48, 58, 53, 50, 50, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, + 52, 48, 56, 55, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,115,114, + 97,110,103,101,114, 58, 13, 10,115,114, 97,110,103,101,114,111, 58, 13, + 10,115,114, 97,110,103,101,114,110, 58, 13, 10,115,114, 97,110,103,101, + 114,119, 58, 13, 10,114,114, 97,110,103,101,114, 58, 13, 10, 48, 58,100, + 50, 50, 48, 58, 52, 99, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, 56, + 53, 49, 58, 50, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10,115,114, 97,110, + 103,101,114, 98, 58, 13, 10, 48, 58,100, 50, 50, 48, 58, 52, 99, 58, 48, + 48, 58, 50,101, 13, 10, 48, 58, 99, 56, 53, 49, 58, 50, 58, 48, 48, 58, + 48, 51, 13, 10, 13, 10,112,112,114,111, 98,101, 58, 13, 10, 48, 58,102, + 51, 56, 48, 58, 52, 53, 58, 48, 48, 58, 49, 53, 13, 10, 48, 58, 99,100, + 57,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99,100, 98,101, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99,100,100,101, 58, 49, + 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 99,100,102,101, 58, 49, 58, 48, + 49, 58, 48, 49, 13, 10, 48, 58, 99,101, 49,101, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 48, 58, 99,101, 51,101, 58, 49, 58, 48, 49, 58, 48, 49, + 13, 10, 48, 58, 99,101, 53,101, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, + 13, 10,115,112, 97,114,107,109, 97,110, 58, 13, 10,115,112, 97,114,107, + 109, 97,110, 97, 58, 13, 10, 48, 58, 99, 57, 51, 48, 58, 54, 97, 58, 48, + 48, 58, 48, 49, 13, 10, 48, 58, 99, 56, 56, 48, 58, 50, 58, 48, 48, 58, + 48, 51, 13, 10, 13, 10, 99, 97,100, 97,110,103,108,114, 58, 13, 10, 48, + 58, 52, 99, 48, 58, 49, 57, 58, 49, 56, 58, 48, 48, 13, 10, 48, 58, 52, + 100, 55, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 48, 58, 54, 49, 58, 50, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,116, 97,114,102,105,103,104, + 58, 13, 10, 48, 58,100, 98, 51, 48, 58, 50, 54, 58, 48, 48, 58, 52, 99, + 13, 10, 48, 58, 99, 56,100, 48, 58, 50, 58, 48, 48, 58, 48, 51, 13, 10, + 13, 10,108,105,116,116,108,101,114, 98, 58, 13, 10, 48, 58, 50, 48, 50, + 48, 50,101, 58, 57,102, 58, 49, 49, 58, 51, 48, 13, 10, 48, 58, 50, 48, + 50, 48, 51,100, 58, 49, 58,101, 56, 58,101, 56, 13, 10, 13, 10,103,110, + 103, 58, 13, 10,103,110,103, 97, 58, 13, 10,103,110,103,116, 58, 13, 10, + 109, 97,107, 97,105,109,117,114, 58, 13, 10,109, 97,107, 97,105,109,117, + 114, 99, 58, 13, 10,109, 97,107, 97,105,109,117,114,103, 58, 13, 10,103, + 110,103, 98,108, 58, 13, 10,103,110,103, 98,108,105,116, 97, 58, 13, 10, + 103,110,103, 99, 58, 13, 10, 48, 58, 49, 53, 49, 56, 58, 53, 97, 58, 49, + 53, 58, 55, 50, 13, 10, 48, 58, 48, 48,100, 48, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,103,110,103,112,114,111,116, 58, 13, 10, 48, 58, + 49, 53, 48, 56, 58, 53, 97, 58, 49, 53, 58, 55, 50, 13, 10, 48, 58, 48, + 48,100, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,112, 97,110, + 105, 99,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112, 97,110,105, 99, + 32,114,111, 97,100, 13, 10,112, 97,110,105, 99,114,103, 58, 13, 10, 48, + 58, 49, 56,102, 99, 58, 57, 53, 58, 52, 48, 58, 50, 48, 13, 10, 13, 10, + 115,107,121,100,101,115,116, 58, 13, 10, 48, 58, 98, 56, 48, 49, 58, 54, + 99, 58, 52, 98, 58, 48, 48, 13, 10, 48, 58, 98, 56, 54, 98, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 74, + 117,109,112,105,110,103, 32, 80,111,112, 13, 10,106,117,109,112,112,111, + 112, 58, 13, 10,106,117,109,112,112,111,112,101, 58, 13, 10, 48, 58, 49, + 50, 51, 99, 49, 48, 58, 97, 48, 58, 52, 53, 58, 53, 48, 13, 10, 48, 58, + 49, 50, 51, 99, 48, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 100, 98,122, 97, 58, 13, 10, 48, 58, 52, 56, 54, 54, 53, 99, 58, 53, 52, + 58, 48, 48, 58, 49,101, 13, 10, 48, 58, 52, 56, 54, 51,102, 50, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100, 98,122, 58, 13, 10, 48, 58, + 52, 56, 54, 54, 54, 48, 58, 53, 52, 58, 48, 48, 58, 49,101, 13, 10, 48, + 58, 52, 56, 54, 51,102, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 99,102,105,115,104,105,110,103, 58, 13, 10, 48, 58, 52, 99, 48, 58, + 49, 56, 58, 49, 56, 58, 53, 48, 13, 10, 13, 10,102,108,105,112,106, 97, + 99,107, 58, 13, 10, 48, 58, 54, 53, 48, 48, 58,102, 48, 58, 48, 48, 58, + 52,102, 13, 10, 48, 58, 54, 48, 54, 49, 58, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, + 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101,116,116,101, 58, 32, 98, + 117,114,103,101,114, 32,116,105,109,101, 41, 13, 10, 99, 98,116,105,109, + 101, 58, 13, 10, 48, 58, 51, 51, 58, 50, 52, 58, 48, 48, 58, 49, 50, 13, + 10, 13, 10, 99,104, 97,109, 98,117,114,103,101,114, 58, 13, 10, 48, 58, + 51, 50, 58, 50, 52, 58, 48, 48, 58, 49, 50, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,115,112, 97, 99,101,102, 98, 46, 99, 32, 40,115, + 112, 97, 99,101, 32,102,105,114,101, 98,105,114,100, 32, 40,110,105,110, + 116,101,110,100,111, 32, 38, 32,103,114,101,109,108,105,110, 32, 38, 32, + 98,111,111,116,108,101,103, 41, 41, 13, 10, 59, 42, 42, 32,116,111,112, + 32,115, 99,111,114,101, 32,100,111,110, 96,116, 32,117,112,100, 97,116, + 101, 32,117,110,116,105,108, 32,121,111,117, 32,108,111,115,101, 32,121, + 111,117,114, 32,102,105,114,115,116, 32,108,105,102,101, 44, 32,112,114, + 101,116,116,121, 32, 42, 42, 13, 10, 59, 42, 42, 32,108, 97,109,101, 32, + 119, 97,121, 32,102,111,114, 32,100,111,105,110,103, 32, 97, 32,104,105, + 115, 99,111,114,101, 32, 45, 32, 98,117,116, 32,119,104,111, 32, 97,109, + 32,105, 32,116,111, 32, 99,111,109,112,108, 97,105,110, 33, 33, 32, 59, + 48, 41, 32, 42, 42, 13, 10,115,112, 97, 99,101,102, 98, 58, 13, 10,115, + 112, 97, 99,101,102, 98, 98, 58, 13, 10,115,112, 97, 99,101,102, 98,101, + 58, 13, 10,115,112, 97, 99,101,102, 98,117, 58, 13, 10,115,112, 97, 99, + 101,102, 98,101, 50, 58, 13, 10,115,116, 97,114,119, 97,114,114, 58, 13, + 10, 48, 58, 99, 48, 97, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 99, 48,101, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 99, 55, 55, 51, 58, 54, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 57, 97, + 53, 49, 58, 54, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10,115,112, 97, 99, + 101,102, 98,103, 58, 13, 10, 48, 58, 99, 48, 97, 48, 58, 50, 98, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 99, 51, 99, 48, 58, 49,101, 58, 49, 49, + 58, 49, 48, 13, 10, 48, 58, 99, 48,101, 48, 58, 51, 58, 48, 48, 58, 51, + 48, 13, 10, 13, 10,115,112, 97, 99,101,102, 98, 97, 58, 13, 10, 48, 58, + 99, 55, 55, 51, 58, 54, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 57, 97, + 53, 49, 58, 54, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 99, 48,101, 48, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,114, 97,115,116, 97,110, 46, 99, 13, 10,114, 97,115,116, 97, + 110, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107, + 115, 32,116,111, 32, 87,111, 98, 32,102,111,114, 32,101,110,104, 97,110, + 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, + 114, 97,115,116, 97,110,117, 58, 13, 10,114, 97,115,116, 97,110,117, 50, + 58, 13, 10,114, 97,115,116,115, 97,103, 97, 58, 13, 10,114, 97,115,116, + 115, 97,103, 97, 49, 58, 13, 10,114, 97,115,116, 97,110, 50, 58, 13, 10, + 114, 97,115,116, 97,110,117, 97, 58, 13, 10,114, 97,115,116, 97,110,117, + 98, 58, 13, 10,114, 97,115,116,115, 97,103, 97, 97, 58, 13, 10, 48, 58, + 49, 48, 99, 49, 52, 48, 58, 50, 54, 58, 51, 49, 58, 52,101, 13, 10, 48, + 58,100, 48, 48, 48, 98, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,100, 48, 48, 48, 98, 53, 58, 49, 58, 50, 98, 58, 50, 98, 13, 10, 48, + 58,100, 48, 48, 48, 98, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,100, 48, 48, 48, 98,100, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, + 58,100, 48, 48, 48, 99, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,100, 48, 48, 48, 99, 53, 58, 49, 58, 51, 49, 58, 51, 49, 13, 10, 48, + 58,100, 48, 48, 48, 99, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,100, 48, 48, 48, 99,100, 58, 49, 58, 50, 99, 58, 50, 99, 13, 10, 48, + 58,100, 48, 48, 48,100, 50, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, + 58,100, 48, 48, 48,100, 53, 58, 49, 58, 50, 97, 58, 50, 97, 13, 10, 48, + 58,100, 48, 48, 48,100, 97, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, + 58,100, 48, 48, 48,100,100, 58, 49, 58, 50, 97, 58, 50, 97, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 75,110,105,103,104,116,115, 32,111, + 102, 32,116,104,101, 32, 82,111,117,110,100, 32, 40,119,111,114,108,100, + 32, 57, 49, 49, 49, 50, 55, 32, 38, 32, 99,108,111,110,101,115, 41, 41, + 13, 10,107,110,105,103,104,116,115, 58, 13, 10,107,110,105,103,104,116, + 115,106, 58, 13, 10,107,110,105,103,104,116,115,117, 58, 13, 10,107,110, + 105,103,104,116,115, 98, 58, 13, 10,107,110,105,103,104,116,115,106, 97, + 58, 13, 10, 48, 58,102,102,101, 53, 51, 97, 58, 50, 53, 55, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102,102,101, 55, 56,102, 58, 49, 58, 48, 53, + 58, 48, 53, 13, 10, 48, 58,102,102,101, 55, 99, 97, 58, 49, 58, 48, 50, + 58, 48, 50, 13, 10, 48, 58,102,102, 97, 52, 98, 54, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10,107,111,110,103, 58, 13, 10, 48, 58, 56, 50, + 55,102, 58, 49, 57, 58, 49, 48, 58, 48, 48, 13, 10, 48, 58, 56, 50, 57, + 54, 58, 49, 58, 52, 54, 58, 52, 54, 13, 10, 13, 10,102, 97,110,116, 97, + 115,116, 99, 58, 13, 10, 48, 58, 56, 50, 97,102, 58, 49, 98, 58,100, 48, + 58, 48, 55, 13, 10, 13, 10,102,111,114,103,111,116,116,110, 58, 13, 10, + 108,111,115,116,119,114,108,100, 58, 13, 10,102,111,114,103,111,116,116, + 110,117, 58, 13, 10,108,111,115,116,119,114,108,100,111, 58, 13, 10,102, + 111,114,103,111,116,116,110,117, 97, 58, 13, 10,102,111,114,103,111,116, + 116,110,117, 49, 58, 13, 10,102,111,114,103,111,116,116,110,117, 97, 97, + 58, 13, 10,102,111,114,103,111,116,116,110, 97, 58, 13, 10, 48, 58,102, + 102,101, 49, 52, 50, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, + 102,102, 98, 50, 97, 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,110,111, 97,104,115, 97,114,107, 58, 13, 10, 48, 58, 50, 56, 48, 49, + 58, 49,101, 58, 56, 49, 58, 52, 52, 13, 10, 13, 10,105,116, 97,116,101, + 110, 58, 13, 10, 48, 58, 97, 50, 54, 54, 58, 49,101, 58, 53, 54, 58, 52, + 98, 13, 10, 48, 58, 97, 48, 50, 99, 58, 49, 58, 53, 52, 58, 53, 52, 13, + 10, 13, 10, 98,114, 97,112, 98,111,121,115, 58, 32, 32, 59,104,105,115, + 99,111,114,101, 32, 98,114,111,107,101,110, 32,105,110, 32,103, 97,109, + 101, 32, 32, 98,114, 97,112, 98,111,121,115, 32,103, 97,109,101,115, 32, + 63, 63, 13, 10, 98,114, 97,112, 98,111,121,115,106, 58, 13, 10, 98,114, + 97,112, 98,111,121,115,117, 58, 13, 10, 48, 58, 49, 48, 51, 48, 99, 53, + 58, 51, 49, 58, 48, 48, 58, 52, 97, 13, 10, 13, 10, 98,105,114,100,105, + 121, 58, 13, 10, 48, 58, 52, 99, 50, 57, 58, 49,101, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 99, 51,101,100, 58, 54, 58, 51, 48, 58, 50, 48, 13, + 10, 48, 58, 52,100, 48, 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,102,115,112,105,100,101,114, 98, 58, 13, 10, 48, 58, 56, 48, 54, 54, + 58, 52, 53, 58, 48, 48, 58, 49, 57, 13, 10, 13, 10, 99, 97,110,100,121, + 58, 32, 32, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97, + 105,116, 32,117,110,116,105,108,108, 32,104,105,115, 99,111,114,101, 32, + 116, 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112,108, 97,121,101, + 100, 32, 98,101,102,111,114,101, 32,115,116, 97,114,116,105,110,103, 32, + 97, 32,103, 97,109,101, 32, 32, 42, 42, 13, 10, 48, 58, 52, 48, 48, 50, + 53, 54, 54, 48, 58,102, 48, 58, 52, 49, 58, 48, 50, 13, 10, 13, 10, 59, + 112,101,110,107,121, 58, 32, 32, 32, 59, 32, 32, 42, 42, 32, 32,110,101, + 101,100,115, 32,119,111,114,107, 32, 33, 33, 32, 42, 42, 13, 10, 59, 48, + 58,101, 54, 56, 55, 58, 50, 51, 58, 52,102, 58, 48, 52, 13, 10, 59, 48, + 58,101, 49, 56, 55, 58, 48, 51, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, + 108, 97,110,100,103,101, 97,114, 58, 13, 10, 48, 58, 56, 48, 51, 54,102, + 56, 99, 58,101, 97, 58, 48, 49, 58, 52, 97, 13, 10, 13, 10,114, 97,105, + 100,101,114,115,114, 51, 58, 13, 10,114, 97,105,100,101,114,115, 58, 13, + 10, 48, 58, 49, 99, 48, 56, 58, 52, 48, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 49, 99, 50, 49, 58, 49, 58, 51, 49, 58, 51, 49, 13, 10, 48, 58, + 49, 99, 48,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,120,101, + 118,105, 51,100,103, 58, 13, 10, 48, 58, 49, 53, 49, 50, 98, 56, 58, 51, + 98, 58, 52, 56, 58, 52, 98, 13, 10, 13, 10,115,117,112,101,114,119,110, + 103, 58, 13, 10, 48, 58, 55, 57, 50, 48, 58, 99, 56, 58, 48, 48, 58, 49, + 57, 13, 10, 13, 10,103, 97,108, 97, 99,116,105, 99, 58, 13, 10,115,112, + 97, 99,109,105,115,115, 58, 13, 10, 48, 58, 50, 48, 97, 56, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 98,117, 98,108,112,111,110,103, 58, + 13, 10, 48, 58,101, 54, 52, 99, 58, 51, 50, 58, 48, 48, 58, 49, 51, 13, + 10, 48, 58,101, 54, 52,100, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, + 58,101, 53,100,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, + 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 54, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 50, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,101, 51, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,101, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,101, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, + 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 54, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 55, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,102, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,101, 99, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,101,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,102, 51, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, + 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100, 57, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100, 97, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 52, 53, 55, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102, 52, 53, 56, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 54, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, + 100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 99, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 98, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,102, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 54, 48, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 54, 48, 53, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, + 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 55, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 57, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 97, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 54, 49, 49, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 54, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,115, 98,111,109, 98,101,114, 58, 13, 10, 48, 58, 54, 48, 48, + 99, 57, 48, 52, 58, 54, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, + 48, 48, 99, 57, 53,100, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, + 115, 98,111,109, 98,101,114, 97, 58, 13, 10, 48, 58, 54, 48, 48, 99, 57, + 48, 48, 58, 54, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 48, + 99, 57, 53, 57, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,101,115, + 112,103, 97,108, 58, 13, 10,101,115,112,103, 97,108, 98,108, 58, 13, 10, + 48, 58, 56, 48, 49, 48, 55,101, 58, 56, 48, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 56, 48, 49, 48,102, 53, 58, 49, 58, 51, 48, 58, 51, 48, 13, + 10, 13, 10,100,100,112,100,111,106, 58, 13, 10,100,100,112,100,111,106, + 97, 58, 13, 10,100,100,112,100,111,106, 98, 58, 13, 10, 48, 58, 56, 48, + 51, 56, 49, 97, 58, 56, 99, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10,100, + 100,112,100,111,106, 98,108,107, 98,108, 58, 13, 10, 48, 58, 56, 48, 51, + 56, 50, 52, 58, 56, 99, 58, 48, 49, 58, 48, 54, 13, 10, 13, 10, 59,100, 111,100,111,110,112, 97, 99,104,105, 32,100, 97,105, 45,111,117, 45,106, 111,117, 32, 40, 98,108, 97, 99,107, 32,108, 97, 98,101,108, 41, 32, 32, 45, 45, 32,110,101,119, 32,118,101,114,115,105,111,110, 32,103, 97,109, 101, 32,105,115, 32,116,104,101, 32,100,101,102, 97,117,108,116, 32,104, 105,115, 99,111,114,101, 46,100, 97,116, 32,118,101,114,115,105,111,110, - 32, 33, 33, 32, 10,100,100,112,100,111,106, 98,108,107, 58, 32, 32, 59, + 32, 33, 33, 13, 10,100,100,112,100,111,106, 98,108,107, 58, 32, 32, 59, 42, 42, 42, 42, 32,121,111,117, 32, 99,104,111,111,115,101, 32, 98,101, 116,119,101,101,110, 32,111,108,100, 47,110,101,119, 32,103, 97,109,101, 32,111,110, 32,115,116, 97,114,116,117,112, 32,115,119, 97,112, 32,116, 104,101, 32, 59, 32,111,110, 32,116,104,101, 32,118,101,114,115,105,111, - 110, 32,121,111,117, 32,119, 97,110,116, 46, 32, 42, 42, 42, 42, 10,100, - 100,112,100,111,106, 98,108,107, 97, 58, 10, 48, 58, 56, 48, 51, 56, 50, - 52, 58, 56, 99, 58, 48, 49, 58, 48, 54, 32, 32, 32, 59, 42, 42, 42, 32, - 110,101,119, 32,118,101,114,115,105,111,110, 32, 40,100,101,102, 97,117, - 108,116, 41, 32, 45, 32,105,102, 32,121,111,117, 32,117,115,101, 32,111, - 116,104,101,114, 32,118,101,114,115,105,111,110, 32,121,111,117, 32,109, - 117,115,116, 32,100,101,108,101,116,101, 32, 46,104,105, 32,102,105,108, - 101, 10, 59, 48, 58, 56, 48, 51, 56, 50, 52, 58, 56, 99, 58, 48, 48, 58, - 48, 50, 32, 32, 32, 59, 42, 42, 42, 32,111,108,100, 32,118,101,114,115, - 105,111,110, 32, 45, 32,105,102, 32,121,111,117, 32,117,115,101, 32,111, - 116,104,101,114, 32,118,101,114,115,105,111,110, 32,121,111,117, 32,109, - 117,115,116, 32,100,101,108,101,116,101, 32, 46,104,105, 32,102,105,108, - 101, 10, 10,107,101,116, 58, 10,107,101,116, 97, 58, 10,107,101,116, 98, - 58, 10,107,101,116, 98,108, 58, 10, 48, 58, 56, 48, 49, 48, 49, 99, 58, - 56, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 49, 48, 57, 51, 58, - 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 107, 97,114,110,111,118, 46, 99, 10,107, 97,114,110,111,118, 58, 10,107, - 97,114,110,111,118,106, 58, 10,107, 97,114,110,111,118, 97, 58, 10, 48, - 58, 48, 54, 48, 48, 48, 65, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 48, 54, 51, 67, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 48, 54, 51, 68, 48, 48, 58, 50, 56, 58, 48, 48, 58, 52, 65, 10, 10, - 104,118,121,117,110,105,116, 58, 10,104,118,121,117,110,105,116,111, 58, - 10,104,118,121,117,110,105,116,117, 58, 10,104,118,121,117,110,105,116, - 106, 58, 10, 48, 58,101, 49, 57, 48, 58, 50, 56, 58, 48, 48, 58, 53, 48, - 10, 10,114,117,109, 98, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32, - 110,111,116, 32,119,111,114,107,105,110,103, 32, 45, 32,109, 97,109,101, - 32, 48, 52, 48,117, 51, 32,100,101, 98,117,103, 32,112,114,111, 98, 32, - 63, 63, 63, 10, 48, 58,101, 49, 56, 97, 58, 51, 58, 52, 48, 58, 48, 49, - 10, 48, 58, 99, 51, 55, 99, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, - 99, 51, 98, 99, 58, 49, 58, 51, 49, 58, 51, 49, 10, 48, 58, 99, 51,102, - 99, 58, 49, 58, 51, 50, 58, 51, 50, 10, 48, 58, 99, 52, 51, 99, 58, 49, - 58, 51, 51, 58, 51, 51, 10, 48, 58, 99, 52, 55, 99, 58, 49, 58, 51, 52, - 58, 51, 52, 10, 48, 58, 99, 52, 98, 99, 58, 49, 58, 51, 48, 58, 51, 48, - 10, 48, 58,101, 48, 48, 53, 58, 49, 58, 53,100, 58, 53,100, 10, 10,115, - 107,121,107,105,100,100,120, 58, 10,115,107,121,107,105,100,100,120,111, - 58, 10, 48, 58, 53, 48, 48, 48, 58, 52, 53, 58, 48, 48, 58, 50,102, 10, - 48, 58, 53, 48, 48, 49, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 98,121, - 103,111,110,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 32, 71, 65, 77, 69, - 32, 78, 79, 84, 32, 49, 48, 48, 37, 32,119,111,114,107,105,110,103, 32, - 121,101,116, 32, 33, 33, 32, 42, 42, 42, 42, 42, 10, 48, 58,101, 48, 99, - 48, 58, 51, 99, 58, 48, 48, 58, 52, 55, 10, 48, 58,101, 48, 55, 54, 58, - 54, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 48, 50, 58, 49, 58, 48, - 97, 58, 48, 97, 10, 48, 58,102, 52, 50,100, 58, 54, 58, 51, 99, 58, 51, - 99, 10, 10,112,122,108, 98,114,101, 97,107, 58, 32, 32, 10, 48, 58, 49, - 48, 50,100, 57, 99, 58, 51, 50, 58, 53, 48, 58, 51, 50, 10, 48, 58, 49, - 48, 50,101, 48, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 98,101,114, - 101,110,115,116,110, 58, 10, 48, 58, 50, 56, 58, 49,101, 58, 56, 49, 58, - 52,102, 10, 10,111,114,117,110,110,101,114,115, 58, 10,111,114,117,110, - 110,101,114,115,117, 58, 10,111,114,117,110,110,101,114,115,106, 58, 10, - 48, 58, 50, 48,101, 51, 48, 49, 58, 51, 98, 58, 53, 51, 58, 55, 53, 10, - 48, 58, 50, 48,101, 50, 49, 50, 58, 49, 58, 55, 56, 58, 55, 56, 10, 10, - 104,111,116,115,104,111, 99,107, 58, 10,104,111,116,115,104,111, 99,107, - 98, 58, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 53, 10, - 48, 58, 52, 50, 48, 48, 58, 49,101, 58, 48, 97, 58, 48, 50, 10, 10,109, - 114,100,105,103, 58, 10, 48, 58, 49, 51,100, 50, 57,101, 58, 49, 52, 53, - 101, 58, 52, 49, 58, 53, 48, 10, 48, 58, 49, 51,101, 54,101, 56, 58, 49, - 58, 53, 55, 58, 53, 55, 10, 10,109,115,103,111,103,111, 58, 10, 48, 58, - 102, 48, 51, 50,100, 54, 58, 52, 55, 58, 48, 48, 58, 48,101, 10, 10,117, - 110, 99,108,101,112,111,111, 58, 10, 48, 58, 57, 52, 52, 55, 58, 53, 97, - 58, 48, 48, 58, 52, 51, 10, 10,102, 97,110,116,106,111,117,114, 58, 10, - 102, 97,110,116,106,111,117,114, 97, 58, 10, 48, 58, 99, 48,100, 51, 51, - 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 48,100, 51, 52, 50, - 58, 55, 56, 58, 48, 48, 58, 48, 57, 10, 48, 58, 99, 48,100, 51, 51, 56, - 58, 49, 58, 55, 51, 58, 55, 51, 10, 10,112,111,108,101,112,111,115, 50, - 58, 10, 48, 58, 51, 48, 48, 48, 58, 55,102, 50, 58,100, 48, 58, 97, 50, - 10, 48, 58, 52, 48,100, 54, 58, 49, 58, 99, 57, 58, 99, 57, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,112,111,108,101,112,111,115, 46, 99, 32, - 40,112,111,108,101, 32,112,111,115,105,116,105,111,110, 32, 50, 41, 10, - 112,111,108,101,112,111,115, 50, 98, 58, 10,112,111,108,101,112,111,115, - 50, 97, 58, 10,112,111,108,101,112,115, 50, 99, 58, 10,112,111,108,101, - 112,115, 50, 97, 58, 10, 48, 58, 51, 48, 48, 48, 58, 55,102, 50, 58,100, - 48, 58, 97, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,108, + 110, 32,121,111,117, 32,119, 97,110,116, 46, 32, 42, 42, 42, 42, 13, 10, + 100,100,112,100,111,106, 98,108,107, 97, 58, 13, 10, 48, 58, 56, 48, 51, + 56, 50, 52, 58, 56, 99, 58, 48, 49, 58, 48, 54, 32, 32, 32, 59, 42, 42, + 42, 32,110,101,119, 32,118,101,114,115,105,111,110, 32, 40,100,101,102, + 97,117,108,116, 41, 32, 45, 32,105,102, 32,121,111,117, 32,117,115,101, + 32,111,116,104,101,114, 32,118,101,114,115,105,111,110, 32,121,111,117, + 32,109,117,115,116, 32,100,101,108,101,116,101, 32, 46,104,105, 32,102, + 105,108,101, 13, 10, 59, 48, 58, 56, 48, 51, 56, 50, 52, 58, 56, 99, 58, + 48, 48, 58, 48, 50, 32, 32, 32, 59, 42, 42, 42, 32,111,108,100, 32,118, + 101,114,115,105,111,110, 32, 45, 32,105,102, 32,121,111,117, 32,117,115, + 101, 32,111,116,104,101,114, 32,118,101,114,115,105,111,110, 32,121,111, + 117, 32,109,117,115,116, 32,100,101,108,101,116,101, 32, 46,104,105, 32, + 102,105,108,101, 13, 10, 13, 10,107,101,116, 58, 13, 10,107,101,116, 97, + 58, 13, 10,107,101,116, 98, 58, 13, 10,107,101,116, 98,108, 58, 13, 10, + 48, 58, 56, 48, 49, 48, 49, 99, 58, 56, 48, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 56, 48, 49, 48, 57, 51, 58, 49, 58, 51, 48, 58, 51, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,107, 97,114,110,111,118, + 46, 99, 13, 10,107, 97,114,110,111,118, 58, 13, 10,107, 97,114,110,111, + 118,106, 58, 13, 10,107, 97,114,110,111,118, 97, 58, 13, 10, 48, 58, 48, + 54, 48, 48, 48, 65, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 48, 54, 51, 67, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 48, 54, 51, 68, 48, 48, 58, 50, 56, 58, 48, 48, 58, 52, 65, 13, 10, + 13, 10,104,118,121,117,110,105,116, 58, 13, 10,104,118,121,117,110,105, + 116,111, 58, 13, 10,104,118,121,117,110,105,116,117, 58, 13, 10,104,118, + 121,117,110,105,116,106, 58, 13, 10, 48, 58,101, 49, 57, 48, 58, 50, 56, + 58, 48, 48, 58, 53, 48, 13, 10, 13, 10,114,117,109, 98, 97, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 32,110,111,116, 32,119,111,114,107,105,110, + 103, 32, 45, 32,109, 97,109,101, 32, 48, 52, 48,117, 51, 32,100,101, 98, + 117,103, 32,112,114,111, 98, 32, 63, 63, 63, 13, 10, 48, 58,101, 49, 56, + 97, 58, 51, 58, 52, 48, 58, 48, 49, 13, 10, 48, 58, 99, 51, 55, 99, 58, + 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 99, 51, 98, 99, 58, 49, 58, + 51, 49, 58, 51, 49, 13, 10, 48, 58, 99, 51,102, 99, 58, 49, 58, 51, 50, + 58, 51, 50, 13, 10, 48, 58, 99, 52, 51, 99, 58, 49, 58, 51, 51, 58, 51, + 51, 13, 10, 48, 58, 99, 52, 55, 99, 58, 49, 58, 51, 52, 58, 51, 52, 13, + 10, 48, 58, 99, 52, 98, 99, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, + 58,101, 48, 48, 53, 58, 49, 58, 53,100, 58, 53,100, 13, 10, 13, 10,115, + 107,121,107,105,100,100,120, 58, 13, 10,115,107,121,107,105,100,100,120, + 111, 58, 13, 10, 48, 58, 53, 48, 48, 48, 58, 52, 53, 58, 48, 48, 58, 50, + 102, 13, 10, 48, 58, 53, 48, 48, 49, 58, 49, 58, 48, 51, 58, 48, 51, 13, + 10, 13, 10, 98,121,103,111,110,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 32, 71, 65, 77, 69, 32, 78, 79, 84, 32, 49, 48, 48, 37, 32,119,111,114, + 107,105,110,103, 32,121,101,116, 32, 33, 33, 32, 42, 42, 42, 42, 42, 13, + 10, 48, 58,101, 48, 99, 48, 58, 51, 99, 58, 48, 48, 58, 52, 55, 13, 10, + 48, 58,101, 48, 55, 54, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 48, 48, 50, 58, 49, 58, 48, 97, 58, 48, 97, 13, 10, 48, 58,102, 52, + 50,100, 58, 54, 58, 51, 99, 58, 51, 99, 13, 10, 13, 10,112,122,108, 98, + 114,101, 97,107, 58, 13, 10, 48, 58, 49, 48, 50,100, 57, 99, 58, 51, 50, + 58, 53, 48, 58, 51, 50, 13, 10, 48, 58, 49, 48, 50,101, 48, 98, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 98,101,114,101,110,115,116,110, + 58, 13, 10, 48, 58, 50, 56, 58, 49,101, 58, 56, 49, 58, 52,102, 13, 10, + 13, 10,111,114,117,110,110,101,114,115, 58, 13, 10,111,114,117,110,110, + 101,114,115,117, 58, 13, 10,111,114,117,110,110,101,114,115,106, 58, 13, + 10, 48, 58, 50, 48,101, 51, 48, 49, 58, 51, 98, 58, 53, 51, 58, 55, 53, + 13, 10, 48, 58, 50, 48,101, 50, 49, 50, 58, 49, 58, 55, 56, 58, 55, 56, + 13, 10, 13, 10,104,111,116,115,104,111, 99,107, 58, 13, 10,104,111,116, + 115,104,111, 99,107, 98, 58, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, + 48, 48, 58, 48, 53, 13, 10, 48, 58, 52, 50, 48, 48, 58, 49,101, 58, 48, + 97, 58, 48, 50, 13, 10, 13, 10,109,114,100,105,103, 58, 13, 10, 48, 58, + 49, 51,100, 50, 57,101, 58, 49, 52, 53,101, 58, 52, 49, 58, 53, 48, 13, + 10, 48, 58, 49, 51,101, 54,101, 56, 58, 49, 58, 53, 55, 58, 53, 55, 13, + 10, 13, 10,109,115,103,111,103,111, 58, 13, 10, 48, 58,102, 48, 51, 50, + 100, 54, 58, 52, 55, 58, 48, 48, 58, 48,101, 13, 10, 13, 10,117,110, 99, + 108,101,112,111,111, 58, 13, 10, 48, 58, 57, 52, 52, 55, 58, 53, 97, 58, + 48, 48, 58, 52, 51, 13, 10, 13, 10,102, 97,110,116,106,111,117,114, 58, + 13, 10,102, 97,110,116,106,111,117,114, 97, 58, 13, 10, 48, 58, 99, 48, + 100, 51, 51, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 48, + 100, 51, 52, 50, 58, 55, 56, 58, 48, 48, 58, 48, 57, 13, 10, 48, 58, 99, + 48,100, 51, 51, 56, 58, 49, 58, 55, 51, 58, 55, 51, 13, 10, 13, 10,112, + 111,108,101,112,111,115, 50, 58, 13, 10, 48, 58, 51, 48, 48, 48, 58, 55, + 102, 50, 58,100, 48, 58, 97, 50, 13, 10, 48, 58, 52, 48,100, 54, 58, 49, + 58, 99, 57, 58, 99, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,112,111,108,101,112,111,115, 46, 99, 32, 40,112,111,108,101, 32,112, + 111,115,105,116,105,111,110, 32, 50, 41, 13, 10,112,111,108,101,112,111, + 115, 50, 98, 58, 13, 10,112,111,108,101,112,111,115, 50, 97, 58, 13, 10, + 112,111,108,101,112,115, 50, 99, 58, 13, 10,112,111,108,101,112,115, 50, + 97, 58, 13, 10, 48, 58, 51, 48, 48, 48, 58, 55,102, 50, 58,100, 48, 58, + 97, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,108, 101,112,111,115, 46, 99, 32, 40,112,111,108,101, 32,112,111,115,105,116, - 105,111,110, 41, 10,112,111,108,101,112,111,115, 49, 58, 10,112,111,108, - 101,112,111,115, 97, 58, 10,112,111,108,101,112,111,115, 97, 49, 58, 10, - 112,111,108,101,112,111,115, 97, 50, 58, 10, 48, 58, 51, 48, 48, 48, 58, - 55,102, 50, 58, 98, 48, 58, 57, 53, 10, 48, 58, 52, 48, 56, 48, 58, 49, - 58, 53, 54, 58, 53, 54, 10, 10,115,117, 98, 58, 10, 48, 58, 98, 55, 50, - 55, 58, 53, 97, 58, 50, 52, 58, 50, 52, 10, 10,109,105,108,108,105,112, - 101,100, 58, 10,109,105,108,108,105,112,100,100, 58, 10, 48, 58, 56, 53, - 58,102, 58, 48, 53, 58, 49, 55, 10, 48, 58, 54,100, 58,102, 58, 50, 48, - 58, 48, 52, 10, 48, 58, 50, 52, 58, 49, 58, 97, 48, 58, 97, 48, 10, 10, - 119,111,111,100,112,101, 99,107, 58, 10,119,111,111,100,112,101, 99, 97, - 58, 10, 48, 58, 52,101, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 52, 51,101,100, 58, 54, 58, 52, 48, 58, 52, 48, 10, 48, 58, 52,100, - 100, 97, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 32, - 116,104,105,115, 32,115, 97,118,101,115, 32,118,105, 99,116,111,114,121, - 115, 32,116,111,112, 32, 49, 48, 32,116,111,100, 97,121,115, 32,115, 99, - 111,114,101,115, 32, 40,110,118,114, 97,109, 32,116, 97,107,101,115, 32, - 99, 97,114,101, 32,111,102, 32,116,104,101, 32,114,101,115,116, 41, 10, - 118,105, 99,116,111,114,121, 58, 10,118,105, 99,116,111,114, 98, 97, 58, - 10, 48, 58,102, 48, 49, 97, 58, 52, 54, 58, 53, 54, 58, 48, 48, 10, 48, - 58,102, 48, 53, 98, 58, 49, 58, 53, 52, 58, 53, 52, 10, 10,118,109,101, - 116, 97,108, 58, 10,118,109,101,116, 97,108,110, 58, 10, 48, 58,102,102, - 48, 48, 48,101, 58, 53, 51, 58, 48, 48, 58, 52, 57, 10, 10,118,104,117, - 110,116, 50, 58, 10,118,104,117,110,116, 50,114, 49, 58, 10,118,104,117, - 110,116, 50,100, 58, 10, 48, 58,102,102,102, 52, 50, 54, 58, 97,100, 58, - 48, 48, 58, 48, 50, 10, 10,116,110,101,120,116,115,112, 99, 58, 10,116, - 110,101,120,116,115,112, 99, 50, 58, 10, 48, 58, 55, 50, 98, 52, 48, 58, - 52,102, 58, 48, 48, 58, 52, 98, 10, 48, 58, 55, 48, 48, 49, 54, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10,116,110,101,120,116,115,112, 99,106, 58, - 10, 48, 58, 55, 50, 98, 52, 48, 58, 52,102, 58, 48, 48, 58, 52, 51, 10, - 48, 58, 55, 48, 48, 49, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,107, - 111,100,114, 49, 58, 10,107,111,100, 58, 10, 48, 58,102,102, 57,100, 57, - 52, 58, 50, 56, 58, 48, 49, 58, 48, 52, 10, 10,107,111,100,117, 58, 10, - 107,111,100,106, 58, 10,107,111,100,106, 97, 58, 10,107,111,100, 98, 58, - 10, 48, 58,102,102, 57,100, 57, 52, 58, 50, 56, 58, 48, 48, 58, 48, 52, - 10, 10,116,104, 97,114,114,105,101,114, 58, 10,116,104, 97,114,114,105, - 101,114,106, 58, 10, 48, 58,102, 57, 49, 48, 48, 58, 56, 48, 58, 48, 48, - 58, 52,101, 10, 10,115,115,102, 50,109,100, 98, 58, 10, 48, 58,102,102, - 102, 99, 98, 51, 58, 50, 57, 58, 48, 48, 58, 50, 48, 10, 10,115,112,105, - 100,109, 97,110, 58, 10,115,112,105,100,109, 97,110,117, 58, 10,115,112, - 105,100,109, 97,110,106, 58, 10, 48, 58, 50, 48, 56, 99, 48, 48, 58, 55, - 102, 58, 97, 48, 58, 53, 55, 10, 10, 59, 42, 42, 32,104,105,115, 99,111, - 114,101, 32, 38, 32,116,111,112, 32,115, 99,111,114,101, 32,100,111,110, - 96,116, 32,117,112,100, 97,116,101, 32,117,110,116,105,108, 32,121,111, - 117, 32,108,111,115,101, 32,121,111,117,114, 32,102,105,114,115,116, 32, - 108,105,102,101, 44, 32,112,114,101,116,116,121, 32, 42, 42, 10, 59, 42, - 42, 32,108, 97,109,101, 32,119, 97,121, 32,102,111,114, 32,100,111,105, - 110,103, 32, 97, 32,104,105,115, 99,111,114,101, 32, 45, 32, 98,117,116, - 32,119,104,111, 32, 97,109, 32,105, 32,116,111, 32, 99,111,109,112,108, - 97,105,110, 33, 33, 32, 59, 48, 41, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 42, 42, 10,115,112, 97, 99,101, 98,114,100, 58, 10, 48, 58, - 99, 48,101, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 48,101, - 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48,101, 48, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 48,102, 48, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 98,101, 53, 49, 58, 54, 58, 48, 53, 58, 48, 53, - 10, 48, 58, 98,100, 53, 49, 58, 54, 58, 56, 56, 58, 54, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 40,115,111,108,100,105,101,114, 32,103, - 105,114,108, 32, 97,109, 97,122,111,110, 41, 10, 97,109, 97,122,111,110, - 58, 10, 97,109, 97,116,101,108, 97,115, 58, 10, 48, 58, 52, 48,100, 98, - 52, 58, 52, 54, 58, 48, 48, 58, 48,101, 10, 48, 58, 52, 48,100, 54, 54, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48,100, 54, 56, 58, 49, - 58, 53, 48, 58, 53, 48, 10, 10,115,104,111,103,119, 97,114,114, 58, 10, - 102,106, 98,117,115,116,101,114, 58, 10,115,104,111,103,119, 97,114,114, - 117, 58, 10,115,104,111,103,119, 97,114,114,107, 58, 10, 48, 58, 49, 48, - 54, 54, 54, 52, 58, 50, 55, 58, 48, 48, 58, 52, 98, 10, 10,110,109,111, - 117,115,101, 58, 10,110,109,111,117,115,101, 98, 58, 10, 48, 58, 52,101, - 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 51,101,100, 58, - 55, 58, 52, 48, 58, 52, 48, 10, 48, 58, 52,100, 99,101, 58, 49, 58, 48, - 55, 58, 48, 55, 10, 10,109,114,106,111,110,103, 58, 10, 48, 58, 56, 52, - 48, 49, 58, 57, 56, 58, 48, 48, 58, 48, 57, 10, 48, 58, 97, 48, 49, 51, - 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, 98,108,107, 98,117,115,116,114, - 58, 10, 99,114, 97,122,121, 98,108,107, 58, 10, 48, 58, 56, 52, 48, 49, - 58, 97, 57, 58, 48, 48, 58, 48, 97, 10, 48, 58, 97, 48, 49, 51, 58, 54, - 58, 48, 48, 58, 48, 48, 10, 10,103,101,116,115,116, 97,114, 58, 10,103, - 101,116,115,116, 97,114,106, 58, 10,103,116,115,116, 97,114, 98, 49, 58, - 10,103,116,115,116, 97,114, 98, 50, 58, 10, 48, 58, 99, 48,100, 50, 58, - 52, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49, 49, 48, 58, 49, 58, - 48, 97, 58, 48, 97, 10, 48, 58, 99, 48, 99, 97, 58, 49, 58, 49, 55, 58, - 49, 55, 10, 10,103, 97,108,115,110,101,119, 58, 10,103, 97,108,115,110, - 101,119, 97, 58, 10,103, 97,108,115,110,101,119,106, 58, 10,103, 97,108, - 115,110,101,119,107, 58, 10, 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 52, - 58, 51, 48, 58, 51, 49, 10, 10,100,101,115,116,114,121,101,114, 58, 10, - 48, 58, 50, 48,101, 53, 58, 50, 58,102,102, 58,102,102, 10, 10, 98,108, - 111, 99,107,103, 97,108, 58, 10, 98,108,111, 99,107,103, 97,108, 98, 58, - 10, 48, 58, 99, 48, 54, 50, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, 98, - 103, 97,114,101,103,103, 97, 58, 10, 98,103, 97,114,101,103,103, 97,104, - 107, 58, 10, 98,103, 97,114,101,103,103, 97,116,119, 58, 10, 48, 58, 49, - 48, 99, 97, 52,100, 58,101, 97, 58, 48,102, 58, 50, 97, 10, 48, 58, 49, - 48, 48, 48, 51, 48, 58, 49, 58, 55, 50, 58, 55, 50, 10, 10, 98,103, 97, - 114,101,103,103, 97,110,118, 58, 10, 98,103, 97,114,101,103,103, 97, 99, - 110, 58, 10, 98,103, 97,114,101,103,103, 97,116, 50, 58, 10, 48, 58, 49, - 48, 99, 97, 52,102, 58,101, 97, 58, 48,102, 58, 50, 97, 10, 48, 58, 49, - 48, 48, 48, 51, 48, 58, 49, 58, 55, 50, 58, 55, 50, 10, 10, 98,103, 97, - 114,101,103,103, 97, 98,108, 58, 10, 98,103, 97,114,101,103,103, 97, 98, - 108, 97, 58, 10, 48, 58, 49, 48, 99, 97, 52,100, 58, 52, 52, 54, 58, 48, - 102, 58, 51,102, 10, 10, 98,119,105,110,103,115, 58, 10, 48, 58, 48,100, - 58, 51, 58, 48, 48, 58, 48, 52, 10, 48, 58,100, 48, 48, 58, 56, 99, 58, - 51, 52, 58, 50, 48, 10, 10, 98,119,105,110,103,115, 97, 58, 10, 98,119, - 105,110,103,115,111, 58, 10, 48, 58, 48,100, 58, 51, 58, 48, 48, 58, 48, - 52, 10, 48, 58,100, 48, 48, 58,102, 48, 58, 51, 52, 58, 50, 48, 10, 10, - 97,122,117,114,105, 97,110, 58, 10, 48, 58, 52, 48, 98, 51, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 98, 52, 58, 49, 58, 53, 48, 58, - 53, 48, 10, 10, 97,116,116, 99,107,117,102,111, 58, 10, 48, 58, 99, 97, - 58, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,101, 51, 58, 49, 58, 97, - 48, 58, 97, 48, 10, 48, 58, 50,102, 97, 58, 49, 58, 97, 48, 58, 97, 48, - 10, 48, 58, 51, 49, 49, 58, 49, 58, 97, 48, 58, 97, 48, 10, 48, 58, 51, - 50, 56, 58, 49, 58, 97, 48, 58, 97, 48, 10, 10, 97,108,116, 97,105,114, - 58, 10, 48, 58, 51, 48,101, 53, 58, 50, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 48, 48, 56, 58, 49, 58, 53, 56, 58, 53, 56, 10, 10,115,117,110, - 100, 97,110, 99,101, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116, - 104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102, - 111,114, 32, 99,114,101, 97,116,105,110,103, 32,116,104,105,115, 32,101, - 110,116,114,121, 93, 10, 48, 58, 48, 49, 53, 49, 58, 48, 49, 58, 49, 50, - 58, 49, 50, 10, 48, 58, 48, 49, 52,101, 58, 48, 50, 58, 48, 48, 58, 48, - 48, 10, 10,113, 98, 51, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32, - 116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32, - 102,111,114, 32, 99,114,101, 97,116,105,110,103, 32,116,104,105,115, 32, - 101,110,116,114,121, 93, 10, 48, 58, 48, 49, 97, 49, 58, 48, 49, 58, 49, - 49, 58, 49, 49, 10, 48, 58, 48, 49, 97, 48, 58, 51, 50, 58, 48, 48, 58, - 48, 48, 10, 10,115,107,121,108,111,118,101, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 83,107,121, 32, 76,111,118,101, 10, 48, 58, 52, 49, 52, 98, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 57, 55,100, 58, 50, 58, - 48,102, 58,102, 99, 10, 48, 58, 50, 57, 57,100, 58, 50, 58, 48,102, 58, - 102, 99, 10, 48, 58, 50, 57, 98,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, - 48, 58, 50, 57,100,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, - 57,102,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, 97, 49,100, - 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50, 97, 51,100, 58, 50, 58, - 48,102, 58,102, 99, 10, 48, 58, 50, 97, 57,100, 58, 50, 58, 48,102, 58, - 102, 99, 10, 48, 58, 50, 97, 98,100, 58, 50, 58, 48,102, 58,102, 99, 10, - 48, 58, 50, 97,100,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, - 97,102,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, 98, 49,100, - 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, 98, 51,100, 58, 50, 58, - 48,102, 58,102, 99, 10, 48, 58, 50, 98, 53,100, 58, 50, 58, 48,102, 58, - 102, 99, 10, 48, 58, 50, 98, 98,100, 58, 50, 58, 48,102, 58,102, 99, 10, - 48, 58, 50, 98,100,100, 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50, - 98,102,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, 99, 49,100, - 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50, 99, 51,100, 58, 50, 58, - 48, 99, 58, 48, 99, 10, 48, 58, 50, 99, 53,100, 58, 50, 58, 48,102, 58, - 102, 99, 10, 48, 58, 50, 99, 55,100, 58, 50, 58, 48,102, 58,102, 99, 10, - 48, 58, 50, 99,100,100, 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50, - 99,102,100, 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50,100, 49,100, - 58, 50, 58, 48, 99, 58, 48, 99, 10, 48, 58, 50,100, 51,100, 58, 50, 58, - 48, 99, 58, 48, 99, 10, 48, 58, 50,100, 53,100, 58, 50, 58, 48, 99, 58, - 48, 99, 10, 48, 58, 50,100, 55,100, 58, 50, 58, 48,102, 58,102, 99, 10, - 48, 58, 50,100, 57,100, 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50, - 100,102,100, 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50,101, 49,100, - 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50,101, 51,100, 58, 50, 58, - 48, 99, 58, 48, 99, 10, 48, 58, 50,101, 53,100, 58, 50, 58, 48, 99, 58, - 48, 99, 10, 48, 58, 50,101, 55,100, 58, 50, 58, 48, 99, 58, 48, 99, 10, - 48, 58, 50,101, 57,100, 58, 50, 58, 48,102, 58,102, 99, 10, 48, 58, 50, - 101, 98,100, 58, 50, 58, 48,102, 58,102, 99, 10, 10,112,104,112,121,116, - 104,111,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,121,116,104,111, - 110, 32, 40, 80,104,111,116,111,110, 32, 83,121,115,116,101,109, 41, 10, - 48, 58, 52,101, 49, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, - 101, 49,100, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10,100,108, 97,110,100, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,114,101, 97,109, 32,108, 97, - 110,100, 47,115,117,112,101,114, 32,100,114,101, 97,109, 32,108, 97,110, - 100, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, 58, 52,102, 10, - 48, 58,101, 54, 55, 98, 58, 51, 58, 49,102, 58, 49, 51, 10, 48, 58,101, - 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,100,102, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 48, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 52, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 53,101, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 53,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 53,101, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 51, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 55, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 53,101, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 53,101, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 54, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 55, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 53,102, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 53,101, 99, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101,100, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 51, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 52, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 53,100, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 53,100, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, - 52, 53, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, 53, 56, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 49, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 53,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 53,102,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 99, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 98, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 53,102, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 53,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 52, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 53, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 54, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58,101, 54, 48, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 54, 48, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 54, 48, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 49, 49, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 98, 58, 50, 58, - 48, 48, 58, 48, 48, 10, 10,104,111,108,101,108, 97,110,100, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 72,111,108,101, 32, 76, 97,110,100, 32, 40, - 98,121, 32, 74,111,115,101, 32, 74,117, 97,110, 32, 73,103,108,101,115, - 105, 97,115, 41, 10, 48, 58, 56, 54, 99, 55, 58, 49, 56, 58, 48, 48, 58, - 49, 49, 10, 48, 58, 56, 54,100, 48, 58, 51, 58, 48, 48, 58, 48, 51, 10, - 10,104,111,108,101,108, 97,110,100, 50, 58, 10, 48, 58, 56, 54, 99, 98, - 58, 49, 56, 58, 48, 48, 58, 49, 49, 10, 48, 58, 56, 54,100, 52, 58, 51, - 58, 48, 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,116, - 101,101,108,119,107,114, 10,115,116,101,101,108,119,107,114, 58, 10, 48, - 58, 50, 48, 48, 97, 58, 48, 54, 58, 48, 48, 58, 48, 48, 10, 10,109,105, - 114, 97,120, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,105,114, 97,120, - 10, 48, 58,100, 48, 49, 99, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 100, 48, 50, 56, 58, 50,100, 58, 48, 48, 58, 50, 57, 10, 10,109,105,114, - 97,120, 97, 58, 10, 48, 58,100, 48, 50,100, 58, 50,100, 58, 48, 48, 58, - 50, 57, 10, 48, 58,100, 48, 50, 49, 58, 54, 58, 48, 48, 58, 48, 48, 10, - 10, 98, 97,108,111,110,102,103,116, 58, 32, 59, 91, 83,112,101, 99,105, - 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, - 97,115, 32,102,111,114, 32, 99,114,101, 97,116,105,110,103, 32,116,104, - 105,115, 32,101,110,116,114,121, 93, 10, 48, 58, 54, 49, 48, 48, 58, 49, - 101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 49, 50, 52, 58, 48,102, 58, - 48, 97, 58, 49, 48, 10, 10, 98, 97,121,114,111,117,116,101, 58, 10, 98, - 97,121,114,111,117,116,101, 98, 50, 58, 10, 98, 97,121,114,111,117,116, - 101, 98, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66, 97,121, 32, 82, - 111,117,116,101, 32, 40,101,110, 99,114,121,112,116,101,100, 44, 32,112, - 114,111,116,101, 99,116,101,100, 32, 98,111,111,116,108,101,103, 41, 10, - 98, 97,121,114,111,117,116,101, 49, 58, 10, 98, 97,121,114,111,117,116, - 101,106, 58, 10, 98, 97,121,114,111,117,116,101,100, 58, 10, 98, 97,121, - 114,111,117,116,101,106,100, 58, 10, 48, 58, 53, 48, 48, 49, 49, 48, 58, - 53, 48, 58, 48, 48, 58, 48,102, 10, 10,116,115, 97,109,117,114, 97,105, - 58, 10,116,115, 97,109,117,114, 97,105, 50, 58, 10,110,117,110, 99,104, - 97,107,117, 58, 10,121, 97,109, 97,103, 99,104,105, 58, 10,116,115, 97, - 109,117,114, 97,105,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, 97, - 109,117,114, 97,105, 32, 78,105,104,111,110, 45,105, 99,104,105, 32, 40, - 115,101,116, 32, 51, 44, 32,104, 97,114,100,101,114, 41, 10,108, 97,100, - 121,109,115,116,114, 58, 10, 48, 58, 99, 48, 54, 48, 58, 49,101, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 99, 48, 56, 48, 58, 49,101, 58, 49, 49, 58, - 49, 49, 10, 48, 58, 99, 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 10,104, 97,116,114,105,115, 58, 10,104, 97,116,114,105,115,106, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,104, 97,116,114,105,115, 32, 40,106, 97, - 112, 97,110, 41, 10, 48, 58, 56,100, 48, 49, 58, 55, 55, 58, 52, 50, 58, - 48, 48, 10, 48, 58, 56,100, 55, 54, 58, 48, 49, 58, 49, 48, 58, 49, 48, - 10, 10,120,101,118,105,111,117,115, 58, 10,115,120,101,118,105,111,117, - 115, 58, 10,115,120,101,118,105,111,117,115,106, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 83,117,112,101,114, 32, 88,101,118,105,111,117,115, 32, - 40, 74, 97,112, 97,110, 41, 32, 10,120,101,118,105,111,115, 58, 32, 10, - 120,101,118,105,111,117,115, 97, 58, 10, 98, 97,116,116,108,101,115, 58, - 32, 10, 48, 58, 56, 53, 49, 48, 58, 52,100, 58, 48, 48, 58, 50, 52, 10, - 48, 58, 56, 48, 50, 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, - 48, 50, 53, 58, 49, 58, 52, 48, 58, 52, 48, 10, 10,120,101,118,105,111, - 117,115, 98, 58, 10,120,101,118,105,111,117,115, 99, 58, 10, 48, 58, 56, - 53, 49, 48, 58, 52, 54, 58, 48, 48, 58, 49, 52, 10, 48, 58, 56, 48, 50, - 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 50, 53, 58, 49, - 58, 52, 48, 58, 52, 48, 10, 10,115, 99,105, 58, 10,115, 99,105, 97, 58, - 32, 32, 10,115, 99,105,106, 58, 32, 32, 10,115, 99,105,117, 58, 32, 32, - 10, 48, 58, 49, 48, 49, 53, 48, 48, 58, 50, 56, 58, 48, 50, 58, 53, 49, - 10, 48, 58, 49, 48, 49, 54, 52,101, 58, 52, 58, 48, 50, 58, 56, 48, 10, - 10,115, 99,105,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,112,101, - 99,105, 97,108, 32, 67,114,105,109,105,110, 97,108, 32, 73,110,118,101, - 115,116,105,103, 97,116,105,111,110, 32, 40, 78,101,103,114,111, 32, 84, - 111,114,105,110,111, 32,104, 97, 99,107, 41, 10, 48, 58, 49, 48, 49, 53, - 48, 48, 58, 50, 56, 58, 48, 48, 58, 52,101, 10, 48, 58, 49, 48, 49, 54, - 52,101, 58, 52, 58, 48, 48, 58, 54, 48, 10, 10,108,107, 97,103,101, 58, - 10,108,107, 97,103,101,111,111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 84,104,101, 32, 76,101,103,101,110,100, 32,111,102, 32, 75, 97,103,101, - 32, 40,111,108,100,101,115,116, 41, 10,108,107, 97,103,101, 98, 58, 10, - 108,107, 97,103,101, 98, 50, 58, 10,108,107, 97,103,101, 98, 51, 58, 10, - 108,107, 97,103,101,111, 58, 10, 48, 58,101, 50, 53,102, 58, 56, 53, 58, - 48, 48, 58, 53, 50, 10, 48, 58,101, 49, 56, 56, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 10,102,115,116, 97,114,102,114, 99, 58, 10,102,115,116, 97, + 105,111,110, 41, 13, 10,112,111,108,101,112,111,115, 49, 58, 13, 10,112, + 111,108,101,112,111,115, 97, 58, 13, 10,112,111,108,101,112,111,115, 97, + 49, 58, 13, 10,112,111,108,101,112,111,115, 97, 50, 58, 13, 10, 48, 58, + 51, 48, 48, 48, 58, 55,102, 50, 58, 98, 48, 58, 57, 53, 13, 10, 48, 58, + 52, 48, 56, 48, 58, 49, 58, 53, 54, 58, 53, 54, 13, 10, 13, 10,115,117, + 98, 58, 13, 10, 48, 58, 98, 55, 50, 55, 58, 53, 97, 58, 50, 52, 58, 50, + 52, 13, 10, 13, 10,109,105,108,108,105,112,101,100, 58, 13, 10,109,105, + 108,108,105,112,100,100, 58, 13, 10, 48, 58, 56, 53, 58,102, 58, 48, 53, + 58, 49, 55, 13, 10, 48, 58, 54,100, 58,102, 58, 50, 48, 58, 48, 52, 13, + 10, 48, 58, 50, 52, 58, 49, 58, 97, 48, 58, 97, 48, 13, 10, 13, 10,119, + 111,111,100,112,101, 99,107, 58, 13, 10,119,111,111,100,112,101, 99, 97, + 58, 13, 10, 48, 58, 52,101, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 52, 51,101,100, 58, 54, 58, 52, 48, 58, 52, 48, 13, 10, 48, + 58, 52,100,100, 97, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 32,116,104,105,115, 32,115, 97,118,101,115, 32,118,105, + 99,116,111,114,121,115, 32,116,111,112, 32, 49, 48, 32,116,111,100, 97, + 121,115, 32,115, 99,111,114,101,115, 32, 40,110,118,114, 97,109, 32,116, + 97,107,101,115, 32, 99, 97,114,101, 32,111,102, 32,116,104,101, 32,114, + 101,115,116, 41, 13, 10,118,105, 99,116,111,114,121, 58, 13, 10,118,105, + 99,116,111,114, 98, 97, 58, 13, 10, 48, 58,102, 48, 49, 97, 58, 52, 54, + 58, 53, 54, 58, 48, 48, 13, 10, 48, 58,102, 48, 53, 98, 58, 49, 58, 53, + 52, 58, 53, 52, 13, 10, 13, 10,118,109,101,116, 97,108, 58, 13, 10,118, + 109,101,116, 97,108,110, 58, 13, 10, 48, 58,102,102, 48, 48, 48,101, 58, + 53, 51, 58, 48, 48, 58, 52, 57, 13, 10, 13, 10,118,104,117,110,116, 50, + 58, 13, 10,118,104,117,110,116, 50,114, 49, 58, 13, 10,118,104,117,110, + 116, 50,100, 58, 13, 10, 48, 58,102,102,102, 52, 50, 54, 58, 97,100, 58, + 48, 48, 58, 48, 50, 13, 10, 13, 10,116,110,101,120,116,115,112, 99, 58, + 13, 10,116,110,101,120,116,115,112, 99, 50, 58, 13, 10, 48, 58, 55, 50, + 98, 52, 48, 58, 52,102, 58, 48, 48, 58, 52, 98, 13, 10, 48, 58, 55, 48, + 48, 49, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,110,101, + 120,116,115,112, 99,106, 58, 13, 10, 48, 58, 55, 50, 98, 52, 48, 58, 52, + 102, 58, 48, 48, 58, 52, 51, 13, 10, 48, 58, 55, 48, 48, 49, 54, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,107,111,100,114, 49, 58, 13, 10, + 107,111,100, 58, 13, 10, 48, 58,102,102, 57,100, 57, 52, 58, 50, 56, 58, + 48, 49, 58, 48, 52, 13, 10, 13, 10,107,111,100,117, 58, 13, 10,107,111, + 100,106, 58, 13, 10,107,111,100,106, 97, 58, 13, 10,107,111,100, 98, 58, + 13, 10, 48, 58,102,102, 57,100, 57, 52, 58, 50, 56, 58, 48, 48, 58, 48, + 52, 13, 10, 13, 10,116,104, 97,114,114,105,101,114, 58, 13, 10,116,104, + 97,114,114,105,101,114,106, 58, 13, 10, 48, 58,102, 57, 49, 48, 48, 58, + 56, 48, 58, 48, 48, 58, 52,101, 13, 10, 13, 10,115,115,102, 50,109,100, + 98, 58, 13, 10, 48, 58,102,102,102, 99, 98, 51, 58, 50, 57, 58, 48, 48, + 58, 50, 48, 13, 10, 13, 10,115,112,105,100,109, 97,110, 58, 13, 10,115, + 112,105,100,109, 97,110,117, 58, 13, 10,115,112,105,100,109, 97,110,106, + 58, 13, 10, 48, 58, 50, 48, 56, 99, 48, 48, 58, 55,102, 58, 97, 48, 58, + 53, 55, 13, 10, 13, 10, 59, 42, 42, 32,104,105,115, 99,111,114,101, 32, + 38, 32,116,111,112, 32,115, 99,111,114,101, 32,100,111,110, 96,116, 32, + 117,112,100, 97,116,101, 32,117,110,116,105,108, 32,121,111,117, 32,108, + 111,115,101, 32,121,111,117,114, 32,102,105,114,115,116, 32,108,105,102, + 101, 44, 32,112,114,101,116,116,121, 32, 42, 42, 13, 10, 59, 42, 42, 32, + 108, 97,109,101, 32,119, 97,121, 32,102,111,114, 32,100,111,105,110,103, + 32, 97, 32,104,105,115, 99,111,114,101, 32, 45, 32, 98,117,116, 32,119, + 104,111, 32, 97,109, 32,105, 32,116,111, 32, 99,111,109,112,108, 97,105, + 110, 33, 33, 32, 59, 48, 41, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 42, 42, 13, 10,115,112, 97, 99,101, 98,114,100, 58, 13, 10, 48, 58, 99, + 48,101, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 48,101, + 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 48,101, 48, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 48,102, 48, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 98,101, 53, 49, 58, 54, 58, 48, 53, + 58, 48, 53, 13, 10, 48, 58, 98,100, 53, 49, 58, 54, 58, 56, 56, 58, 54, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,111,108, + 100,105,101,114, 32,103,105,114,108, 32, 97,109, 97,122,111,110, 41, 13, + 10, 97,109, 97,122,111,110, 58, 13, 10, 97,109, 97,116,101,108, 97,115, + 58, 13, 10, 48, 58, 52, 48,100, 98, 52, 58, 52, 54, 58, 48, 48, 58, 48, + 101, 13, 10, 48, 58, 52, 48,100, 54, 54, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 48,100, 54, 56, 58, 49, 58, 53, 48, 58, 53, 48, 13, + 10, 13, 10,115,104,111,103,119, 97,114,114, 58, 13, 10,102,106, 98,117, + 115,116,101,114, 58, 13, 10,115,104,111,103,119, 97,114,114,117, 58, 13, + 10,115,104,111,103,119, 97,114,114,107, 58, 13, 10, 48, 58, 49, 48, 54, + 54, 54, 52, 58, 50, 55, 58, 48, 48, 58, 52, 98, 13, 10, 13, 10,110,109, + 111,117,115,101, 58, 13, 10,110,109,111,117,115,101, 98, 58, 13, 10, 48, + 58, 52,101, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, + 51,101,100, 58, 55, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 52,100, 99, + 101, 58, 49, 58, 48, 55, 58, 48, 55, 13, 10, 13, 10,109,114,106,111,110, + 103, 58, 13, 10, 48, 58, 56, 52, 48, 49, 58, 57, 56, 58, 48, 48, 58, 48, + 57, 13, 10, 48, 58, 97, 48, 49, 51, 58, 54, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 98,108,107, 98,117,115,116,114, 58, 13, 10, 99,114, 97,122, + 121, 98,108,107, 58, 13, 10, 48, 58, 56, 52, 48, 49, 58, 97, 57, 58, 48, + 48, 58, 48, 97, 13, 10, 48, 58, 97, 48, 49, 51, 58, 54, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,103,101,116,115,116, 97,114, 58, 13, 10,103,101, + 116,115,116, 97,114,106, 58, 13, 10,103,116,115,116, 97,114, 98, 49, 58, + 13, 10,103,116,115,116, 97,114, 98, 50, 58, 13, 10, 48, 58, 99, 48,100, + 50, 58, 52, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 49, 49, 48, + 58, 49, 58, 48, 97, 58, 48, 97, 13, 10, 48, 58, 99, 48, 99, 97, 58, 49, + 58, 49, 55, 58, 49, 55, 13, 10, 13, 10,103, 97,108,115,110,101,119, 58, + 13, 10,103, 97,108,115,110,101,119, 97, 58, 13, 10,103, 97,108,115,110, + 101,119,106, 58, 13, 10,103, 97,108,115,110,101,119,107, 58, 13, 10, 48, + 58, 99, 56, 50, 53, 98, 54, 58, 54, 52, 58, 51, 48, 58, 51, 49, 13, 10, + 13, 10,100,101,115,116,114,121,101,114, 58, 13, 10, 48, 58, 50, 48,101, + 53, 58, 50, 58,102,102, 58,102,102, 13, 10, 13, 10, 98,108,111, 99,107, + 103, 97,108, 58, 13, 10, 98,108,111, 99,107,103, 97,108, 98, 58, 13, 10, + 48, 58, 99, 48, 54, 50, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, + 98,103, 97,114,101,103,103, 97, 58, 13, 10, 98,103, 97,114,101,103,103, + 97,104,107, 58, 13, 10, 98,103, 97,114,101,103,103, 97,116,119, 58, 13, + 10, 48, 58, 49, 48, 99, 97, 52,100, 58,101, 97, 58, 48,102, 58, 50, 97, + 13, 10, 48, 58, 49, 48, 48, 48, 51, 48, 58, 49, 58, 55, 50, 58, 55, 50, + 13, 10, 13, 10, 98,103, 97,114,101,103,103, 97,110,118, 58, 13, 10, 98, + 103, 97,114,101,103,103, 97, 99,110, 58, 13, 10, 98,103, 97,114,101,103, + 103, 97,116, 50, 58, 13, 10, 48, 58, 49, 48, 99, 97, 52,102, 58,101, 97, + 58, 48,102, 58, 50, 97, 13, 10, 48, 58, 49, 48, 48, 48, 51, 48, 58, 49, + 58, 55, 50, 58, 55, 50, 13, 10, 13, 10, 98,103, 97,114,101,103,103, 97, + 98,108, 58, 13, 10, 98,103, 97,114,101,103,103, 97, 98,108, 97, 58, 13, + 10, 48, 58, 49, 48, 99, 97, 52,100, 58, 52, 52, 54, 58, 48,102, 58, 51, + 102, 13, 10, 13, 10, 98,119,105,110,103,115, 58, 13, 10, 48, 58, 48,100, + 58, 51, 58, 48, 48, 58, 48, 52, 13, 10, 48, 58,100, 48, 48, 58, 56, 99, + 58, 51, 52, 58, 50, 48, 13, 10, 13, 10, 98,119,105,110,103,115, 97, 58, + 13, 10, 98,119,105,110,103,115,111, 58, 13, 10, 48, 58, 48,100, 58, 51, + 58, 48, 48, 58, 48, 52, 13, 10, 48, 58,100, 48, 48, 58,102, 48, 58, 51, + 52, 58, 50, 48, 13, 10, 13, 10, 97,122,117,114,105, 97,110, 58, 13, 10, + 48, 58, 52, 48, 98, 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 52, 48, 98, 52, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, 97,116, + 116, 99,107,117,102,111, 58, 13, 10, 48, 58, 99, 97, 58, 50, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 50,101, 51, 58, 49, 58, 97, 48, 58, 97, 48, + 13, 10, 48, 58, 50,102, 97, 58, 49, 58, 97, 48, 58, 97, 48, 13, 10, 48, + 58, 51, 49, 49, 58, 49, 58, 97, 48, 58, 97, 48, 13, 10, 48, 58, 51, 50, + 56, 58, 49, 58, 97, 48, 58, 97, 48, 13, 10, 13, 10, 97,108,116, 97,105, + 114, 58, 13, 10, 48, 58, 51, 48,101, 53, 58, 50, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 51, 48, 48, 56, 58, 49, 58, 53, 56, 58, 53, 56, 13, 10, + 13, 10,115,117,110,100, 97,110, 99,101, 58, 32, 59, 91, 83,112,101, 99, + 105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97, + 110, 97,115, 32,102,111,114, 32, 99,114,101, 97,116,105,110,103, 32,116, + 104,105,115, 32,101,110,116,114,121, 93, 13, 10, 48, 58, 48, 49, 53, 49, + 58, 48, 49, 58, 49, 50, 58, 49, 50, 13, 10, 48, 58, 48, 49, 52,101, 58, + 48, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,113, 98, 51, 58, 32, 59, + 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, + 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32, 99,114,101, 97,116, + 105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, 48, + 58, 48, 49, 97, 49, 58, 48, 49, 58, 49, 49, 58, 49, 49, 13, 10, 48, 58, + 48, 49, 97, 48, 58, 51, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115, + 107,121,108,111,118,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,107, + 121, 32, 76,111,118,101, 13, 10, 48, 58, 52, 49, 52, 98, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 50, 57, 55,100, 58, 50, 58, 48,102, 58, + 102, 99, 13, 10, 48, 58, 50, 57, 57,100, 58, 50, 58, 48,102, 58,102, 99, + 13, 10, 48, 58, 50, 57, 98,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, + 48, 58, 50, 57,100,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, + 50, 57,102,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50, 97, + 49,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50, 97, 51,100, + 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50, 97, 57,100, 58, 50, + 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50, 97, 98,100, 58, 50, 58, 48, + 102, 58,102, 99, 13, 10, 48, 58, 50, 97,100,100, 58, 50, 58, 48, 99, 58, + 48, 99, 13, 10, 48, 58, 50, 97,102,100, 58, 50, 58, 48, 99, 58, 48, 99, + 13, 10, 48, 58, 50, 98, 49,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, + 48, 58, 50, 98, 51,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, + 50, 98, 53,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50, 98, + 98,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50, 98,100,100, + 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50, 98,102,100, 58, 50, + 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50, 99, 49,100, 58, 50, 58, 48, + 99, 58, 48, 99, 13, 10, 48, 58, 50, 99, 51,100, 58, 50, 58, 48, 99, 58, + 48, 99, 13, 10, 48, 58, 50, 99, 53,100, 58, 50, 58, 48,102, 58,102, 99, + 13, 10, 48, 58, 50, 99, 55,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, + 48, 58, 50, 99,100,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, + 50, 99,102,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50,100, + 49,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50,100, 51,100, + 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50,100, 53,100, 58, 50, + 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50,100, 55,100, 58, 50, 58, 48, + 102, 58,102, 99, 13, 10, 48, 58, 50,100, 57,100, 58, 50, 58, 48,102, 58, + 102, 99, 13, 10, 48, 58, 50,100,102,100, 58, 50, 58, 48,102, 58,102, 99, + 13, 10, 48, 58, 50,101, 49,100, 58, 50, 58, 48,102, 58,102, 99, 13, 10, + 48, 58, 50,101, 51,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, + 50,101, 53,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50,101, + 55,100, 58, 50, 58, 48, 99, 58, 48, 99, 13, 10, 48, 58, 50,101, 57,100, + 58, 50, 58, 48,102, 58,102, 99, 13, 10, 48, 58, 50,101, 98,100, 58, 50, + 58, 48,102, 58,102, 99, 13, 10, 13, 10,112,104,112,121,116,104,111,110, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,121,116,104,111,110, 32, 40, + 80,104,111,116,111,110, 32, 83,121,115,116,101,109, 41, 13, 10, 48, 58, + 52,101, 49, 99, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52,101, + 49,100, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10,100,108, 97,110, + 100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,114,101, 97,109, 32,108, + 97,110,100, 47,115,117,112,101,114, 32,100,114,101, 97,109, 32,108, 97, + 110,100, 13, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, 58, 52, + 102, 13, 10, 48, 58,101, 54, 55, 98, 58, 51, 58, 49,102, 58, 49, 51, 13, + 10, 48, 58,101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,100,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, + 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 54, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 50, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,101, 51, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,101, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,101, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, + 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 54, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 55, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,102, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,101, 99, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,101,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,102, 51, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, + 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100, 57, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100, 97, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 52, 53, 55, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102, 52, 53, 56, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 54, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, + 100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 99, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 98, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,102, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 54, 48, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 54, 48, 53, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, + 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 55, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 57, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 97, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 54, 49, 49, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 54, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,104,111,108,101,108, 97,110,100, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 72,111,108,101, 32, 76, 97,110,100, 32, 40, 98,121, 32, 74, + 111,115,101, 32, 74,117, 97,110, 32, 73,103,108,101,115,105, 97,115, 41, + 13, 10, 48, 58, 56, 54, 99, 55, 58, 49, 56, 58, 48, 48, 58, 49, 49, 13, + 10, 48, 58, 56, 54,100, 48, 58, 51, 58, 48, 48, 58, 48, 51, 13, 10, 13, + 10,104,111,108,101,108, 97,110,100, 50, 58, 13, 10, 48, 58, 56, 54, 99, + 98, 58, 49, 56, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, 56, 54,100, 52, + 58, 51, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,115,116,101,101,108,119,107,114, 13, 10,115,116,101,101,108,119, + 107,114, 58, 13, 10, 48, 58, 50, 48, 48, 97, 58, 48, 54, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,109,105,114, 97,120, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,109,105,114, 97,120, 13, 10, 48, 58,100, 48, 49, 99, 58, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 48, 50, 56, 58, 50,100, 58, + 48, 48, 58, 50, 57, 13, 10, 13, 10,109,105,114, 97,120, 97, 58, 13, 10, + 48, 58,100, 48, 50,100, 58, 50,100, 58, 48, 48, 58, 50, 57, 13, 10, 48, + 58,100, 48, 50, 49, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 98, + 97,108,111,110,102,103,116, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, + 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, + 32,102,111,114, 32, 99,114,101, 97,116,105,110,103, 32,116,104,105,115, + 32,101,110,116,114,121, 93, 13, 10, 48, 58, 54, 49, 48, 48, 58, 49,101, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 49, 50, 52, 58, 48,102, 58, + 48, 97, 58, 49, 48, 13, 10, 13, 10, 98, 97,121,114,111,117,116,101, 58, + 13, 10, 98, 97,121,114,111,117,116,101, 98, 50, 58, 13, 10, 98, 97,121, + 114,111,117,116,101, 98, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66, + 97,121, 32, 82,111,117,116,101, 32, 40,101,110, 99,114,121,112,116,101, + 100, 44, 32,112,114,111,116,101, 99,116,101,100, 32, 98,111,111,116,108, + 101,103, 41, 13, 10, 98, 97,121,114,111,117,116,101, 49, 58, 13, 10, 98, + 97,121,114,111,117,116,101,106, 58, 13, 10, 98, 97,121,114,111,117,116, + 101,100, 58, 13, 10, 98, 97,121,114,111,117,116,101,106,100, 58, 13, 10, + 48, 58, 53, 48, 48, 49, 49, 48, 58, 53, 48, 58, 48, 48, 58, 48,102, 13, + 10, 13, 10,116,115, 97,109,117,114, 97,105, 58, 13, 10,116,115, 97,109, + 117,114, 97,105, 50, 58, 13, 10,110,117,110, 99,104, 97,107,117, 58, 13, + 10,121, 97,109, 97,103, 99,104,105, 58, 13, 10,116,115, 97,109,117,114, + 97,105,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, 97,109,117,114, + 97,105, 32, 78,105,104,111,110, 45,105, 99,104,105, 32, 40,115,101,116, + 32, 51, 44, 32,104, 97,114,100,101,114, 41, 13, 10,108, 97,100,121,109, + 115,116,114, 58, 13, 10, 48, 58, 99, 48, 54, 48, 58, 49,101, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 99, 48, 56, 48, 58, 49,101, 58, 49, 49, 58, + 49, 49, 13, 10, 48, 58, 99, 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,104, 97,116,114,105,115, 58, 13, 10,104, 97,116,114,105, + 115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,104, 97,116,114,105,115, + 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58, 56,100, 48, 49, 58, 55, + 55, 58, 52, 50, 58, 48, 48, 13, 10, 48, 58, 56,100, 55, 54, 58, 48, 49, + 58, 49, 48, 58, 49, 48, 13, 10, 13, 10,120,101,118,105,111,117,115, 58, + 13, 10,115,120,101,118,105,111,117,115, 58, 13, 10,115,120,101,118,105, + 111,117,115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101, + 114, 32, 88,101,118,105,111,117,115, 32, 40, 74, 97,112, 97,110, 41, 13, + 10,120,101,118,105,111,115, 58, 13, 10,120,101,118,105,111,117,115, 97, + 58, 13, 10, 98, 97,116,116,108,101,115, 58, 13, 10, 48, 58, 56, 53, 49, + 48, 58, 52,100, 58, 48, 48, 58, 50, 52, 13, 10, 48, 58, 56, 48, 50, 52, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 50, 53, 58, 49, + 58, 52, 48, 58, 52, 48, 13, 10, 13, 10,120,101,118,105,111,117,115, 98, + 58, 13, 10,120,101,118,105,111,117,115, 99, 58, 13, 10, 48, 58, 56, 53, + 49, 48, 58, 52, 54, 58, 48, 48, 58, 49, 52, 13, 10, 48, 58, 56, 48, 50, + 52, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 50, 53, 58, + 49, 58, 52, 48, 58, 52, 48, 13, 10, 13, 10,115, 99,105, 58, 13, 10,115, + 99,105, 97, 58, 13, 10,115, 99,105,106, 58, 13, 10,115, 99,105,117, 58, + 13, 10, 48, 58, 49, 48, 49, 53, 48, 48, 58, 50, 56, 58, 48, 50, 58, 53, + 49, 13, 10, 48, 58, 49, 48, 49, 54, 52,101, 58, 52, 58, 48, 50, 58, 56, + 48, 13, 10, 13, 10,115, 99,105,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 83,112,101, 99,105, 97,108, 32, 67,114,105,109,105,110, 97,108, 32, + 73,110,118,101,115,116,105,103, 97,116,105,111,110, 32, 40, 78,101,103, + 114,111, 32, 84,111,114,105,110,111, 32,104, 97, 99,107, 41, 13, 10, 48, + 58, 49, 48, 49, 53, 48, 48, 58, 50, 56, 58, 48, 48, 58, 52,101, 13, 10, + 48, 58, 49, 48, 49, 54, 52,101, 58, 52, 58, 48, 48, 58, 54, 48, 13, 10, + 13, 10,108,107, 97,103,101, 58, 13, 10,108,107, 97,103,101,111,111, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 76,101,103,101,110, + 100, 32,111,102, 32, 75, 97,103,101, 32, 40,111,108,100,101,115,116, 41, + 13, 10,108,107, 97,103,101, 98, 58, 13, 10,108,107, 97,103,101, 98, 50, + 58, 13, 10,108,107, 97,103,101, 98, 51, 58, 13, 10,108,107, 97,103,101, + 111, 58, 13, 10, 48, 58,101, 50, 53,102, 58, 56, 53, 58, 48, 48, 58, 53, + 50, 13, 10, 48, 58,101, 49, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,102,115,116, 97,114,102,114, 99, 58, 13, 10,102,115,116, 97, 114,102,114, 99,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70,105,110, 97,108, 32, 83,116, 97,114, 32, 70,111,114, 99,101, 32, 40, 74, 97,112, - 97,110, 41, 10, 48, 58, 49, 48, 49, 50, 55, 50, 58, 56, 48, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 49, 48, 48, 48, 97, 57, 58, 51, 58, 48, 48, 58, - 97, 48, 10, 10, 99,107,111,110,103,112,116, 50, 58, 10, 99,107,111,110, - 103,112,116, 50, 97, 58, 10, 99,107,111,110,103,112,116, 50,106,101,117, - 58, 10, 99,107,111,110,103,111, 58, 10,109,111,110,107,101,121,100, 58, - 10, 99,107,111,110,103,112,116, 50, 98, 58, 10, 99,107,111,110,103, 97, - 108, 99, 58, 10, 99,107,111,110,103,115, 58, 10, 99,107,111,110,103,103, - 58, 10,107,107,103, 97,108, 97,120, 58, 32, 32, 10, 99,107,111,110,103, - 112,116, 50,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,114, 97,122, - 121, 32, 75,111,110,103, 32, 80, 97,114,116, 32, 73, 73, 32, 40, 74, 97, - 112, 97,110, 41, 10, 99,107,111,110,103, 58, 10, 99,107,111,110,103,109, - 99, 58, 10,100,107,105,110,103, 58, 10, 99,107,111,110,103,103,120, 58, - 10, 99,107,111,110,103,100,107,115, 58, 10, 48, 58, 54, 49, 48, 48, 58, - 65, 65, 58, 57, 52, 58, 57, 50, 10, 48, 58, 54, 48, 98, 56, 58, 51, 58, - 53, 48, 58, 48, 48, 10, 10, 99, 97, 98, 97,108, 98,108, 58, 10, 99, 97, - 98, 97,108, 98,108, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97, - 98, 97,108, 32, 40, 98,111,111,116,108,101,103, 32,111,102, 32, 74,111, - 121,115,116,105, 99,107, 32,118,101,114,115,105,111,110, 44, 32,115,101, - 116, 32, 50, 41, 10, 99, 97, 98, 97,108, 58, 10, 99, 97, 98, 97,108,117, - 115, 50, 58, 10, 99, 97, 98, 97,108,117,115, 58, 10, 99, 97, 98, 97,108, - 97, 58, 10, 99, 97, 98, 97,108,117,107, 58, 10, 48, 58, 52, 50, 49, 54, - 55, 58, 54, 51, 58, 52, 52, 58, 48, 48, 10, 10, 97,108,105,101,110,115, - 58, 10, 97,108,105,101,110,115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 65,108,105,101,110,115, 32, 40, 65,115,105, 97, 41, 10, 97,108,105, - 101,110,115,106, 58, 10, 97,108,105,101,110,115,117, 58, 10, 97,108,105, - 101,110,115, 50, 58, 10, 97,108,105,101,110,115, 51, 58, 32, 32, 10, 97, - 108,105,101,110,115,106, 50, 58, 32, 32, 10, 48, 58, 49,101, 51, 48, 58, - 51, 56, 58, 48, 48, 58, 52, 56, 10, 10, 97,115,116,101,114,105,120, 58, - 10, 97,115,116,101,114,105,120,106, 58, 10, 97,115,116,101,114,105,120, - 101, 97, 99, 58, 10, 97,115,116,101,114,105,120,101, 97, 97, 58, 10, 97, - 115,116,101,114,105,120, 97, 97,100, 58, 10, 48, 58, 49, 48, 55, 56, 48, - 48, 58, 53, 48, 58, 48, 48, 58, 48, 49, 10, 10,115,112, 99,116, 98,105, - 114,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32, - 116,104,117,110,100,101,114, 98,105,114,100, 10, 48, 58, 56, 48, 52, 50, - 58, 53, 52, 58, 48, 48, 58, 50, 52, 10, 48, 58, 56, 48, 52,102, 58, 49, - 58, 53, 48, 58, 53, 48, 10, 10,112, 98,111, 98, 98,108,101, 50, 58, 10, - 48, 58, 52, 48, 97, 56, 53, 56, 58, 49, 49, 50, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 52, 48, 48, 49, 53, 50, 58, 50, 58, 48, 49, 58, 97, 50, 10, - 10,112, 98,111, 98, 98,108,101, 50,106, 58, 10,112, 98,111, 98, 98,108, - 101, 50,111, 58, 10,112, 98,111, 98, 98,108,101, 50,117, 58, 10, 48, 58, - 52, 48, 97, 56, 53, 52, 58, 49, 49, 50, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 52, 48, 48, 49, 53, 50, 58, 50, 58, 48, 49, 58, 97, 50, 10, 10,106, - 109,112, 98,114,101, 97,107, 58, 10, 48, 58, 57, 53, 48, 57, 56, 58, 53, - 102, 58, 48, 48, 58, 54, 55, 10, 10,115,112,117,122, 98,111, 98,108, 58, - 10, 48, 58, 50, 56, 98,102, 48, 56, 58, 49, 48,100, 58, 50, 48, 58, 48, - 49, 10, 10,112,122,108,101,116,105,109,101, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 80,117,122,122,108,101, 32, 84,105,109,101, 32, 40, 80,114, - 111,116,111,116,121,112,101, 41, 10, 48, 58,102, 48, 51, 56, 48, 52, 58, - 51, 98, 58, 48, 48, 58, 52,101, 10, 10,112,114,109,114,115,111, 99,114, - 58, 10,112,114,109,114,115,111, 99,114,106, 58, 10, 48, 58, 49, 48, 48, - 51, 54, 52, 58, 52, 99, 58, 53, 57, 58, 52, 48, 10, 10,115,117,112,114, - 104,101,108,105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101, - 114, 32, 72,101,108,105, 32, 40, 83,117,112,101,114, 32, 67,111, 98,114, - 97, 32, 98,111,111,116,108,101,103, 41, 10, 48, 58, 56, 48, 97, 56, 58, - 51, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56, 50, 48, 48, 58, 49,101, 58, - 48, 48, 58, 48, 49, 10, 10,109, 97,115,116,101,114,119, 58, 10,109, 97, - 115,116,101,114,119,117, 58, 32, 32, 10,109, 97,115,116,101,114,119,106, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,115,116,101,114, 32,111, - 102, 32, 87,101, 97,112,111,110, 32, 40, 74, 97,112, 97,110, 41, 10,121, - 117,107,105,119,111, 58, 10, 48, 58, 50, 48, 51, 48, 99, 48, 58, 50, 56, - 58, 48, 48, 58, 52,102, 10, 10, 97,111,104, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 65,103,101, 32, 79,102, 32, 72,101,114,111,101,115, 32, 45, - 32, 83,105,108,107,114,111, 97,100, 32, 50, 32, 40,118, 48, 46, 54, 51, - 32, 45, 32, 50, 48, 48, 49, 47, 48, 50, 47, 48, 55, 41, 10, 48, 58, 50, - 56,101, 55, 56, 52, 58,102, 56, 58, 52, 98, 58, 48, 49, 10, 10, 98, 97, - 116,114,105,100,101,114, 58, 10, 98, 97,116,114,105,100,101,114, 99, 58, - 10, 98, 97,116,114,105,100,101,114,106, 97, 58, 10, 98, 97,116,114,105, - 100,101,114,107, 58, 10, 98, 97,116,114,105,100,101,114,117, 58, 10, 98, - 97,116,114,105,100,101,114,106, 58, 10, 98, 97,116,114,105,100,101,114, - 116, 58, 10, 98, 97,116,114,105,100,101,114,104,107, 58, 10, 48, 58, 50, - 48,102, 97, 50, 48, 58, 51, 49, 48, 58, 48, 48, 58, 51, 48, 10, 10,109, + 97,110, 41, 13, 10, 48, 58, 49, 48, 49, 50, 55, 50, 58, 56, 48, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 48, 97, 57, 58, 51, 58, 48, + 48, 58, 97, 48, 13, 10, 13, 10, 99,107,111,110,103,112,116, 50, 58, 13, + 10, 99,107,111,110,103,112,116, 50, 97, 58, 13, 10, 99,107,111,110,103, + 112,116, 50,106,101,117, 58, 13, 10, 99,107,111,110,103,111, 58, 13, 10, + 109,111,110,107,101,121,100, 58, 13, 10, 99,107,111,110,103,112,116, 50, + 98, 58, 13, 10, 99,107,111,110,103, 97,108, 99, 58, 13, 10, 99,107,111, + 110,103,115, 58, 13, 10, 99,107,111,110,103,103, 58, 13, 10,107,107,103, + 97,108, 97,120, 58, 13, 10, 99,107,111,110,103,112,116, 50,106, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 67,114, 97,122,121, 32, 75,111,110,103, + 32, 80, 97,114,116, 32, 73, 73, 32, 40, 74, 97,112, 97,110, 41, 13, 10, + 99,107,111,110,103, 58, 13, 10, 99,107,111,110,103,109, 99, 58, 13, 10, + 100,107,105,110,103, 58, 13, 10, 99,107,111,110,103,103,120, 58, 13, 10, + 99,107,111,110,103,100,107,115, 58, 13, 10, 48, 58, 54, 49, 48, 48, 58, + 65, 65, 58, 57, 52, 58, 57, 50, 13, 10, 48, 58, 54, 48, 98, 56, 58, 51, + 58, 53, 48, 58, 48, 48, 13, 10, 13, 10, 99, 97, 98, 97,108, 98,108, 58, + 13, 10, 99, 97, 98, 97,108, 98,108, 50, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 67, 97, 98, 97,108, 32, 40, 98,111,111,116,108,101,103, 32,111, + 102, 32, 74,111,121,115,116,105, 99,107, 32,118,101,114,115,105,111,110, + 44, 32,115,101,116, 32, 50, 41, 13, 10, 99, 97, 98, 97,108, 58, 13, 10, + 99, 97, 98, 97,108,117,115, 50, 58, 13, 10, 99, 97, 98, 97,108,117,115, + 58, 13, 10, 99, 97, 98, 97,108, 97, 58, 13, 10, 99, 97, 98, 97,108,117, + 107, 58, 13, 10, 48, 58, 52, 50, 49, 54, 55, 58, 54, 51, 58, 52, 52, 58, + 48, 48, 13, 10, 13, 10, 97,108,105,101,110,115, 58, 13, 10, 97,108,105, + 101,110,115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,108,105,101, + 110,115, 32, 40, 65,115,105, 97, 41, 13, 10, 97,108,105,101,110,115,106, + 58, 13, 10, 97,108,105,101,110,115,117, 58, 13, 10, 97,108,105,101,110, + 115, 50, 58, 13, 10, 97,108,105,101,110,115, 51, 58, 13, 10, 97,108,105, + 101,110,115,106, 50, 58, 13, 10, 48, 58, 49,101, 51, 48, 58, 51, 56, 58, + 48, 48, 58, 52, 56, 13, 10, 13, 10, 97,115,116,101,114,105,120, 58, 13, + 10, 97,115,116,101,114,105,120,106, 58, 13, 10, 97,115,116,101,114,105, + 120,101, 97, 99, 58, 13, 10, 97,115,116,101,114,105,120,101, 97, 97, 58, + 13, 10, 97,115,116,101,114,105,120, 97, 97,100, 58, 13, 10, 48, 58, 49, + 48, 55, 56, 48, 48, 58, 53, 48, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, + 115,112, 99,116, 98,105,114,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 115,112, 97, 99,101, 32,116,104,117,110,100,101,114, 98,105,114,100, 13, + 10, 48, 58, 56, 48, 52, 50, 58, 53, 52, 58, 48, 48, 58, 50, 52, 13, 10, + 48, 58, 56, 48, 52,102, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, + 112, 98,111, 98, 98,108,101, 50, 58, 13, 10, 48, 58, 52, 48, 97, 56, 53, + 56, 58, 49, 49, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 48, + 49, 53, 50, 58, 50, 58, 48, 49, 58, 97, 50, 13, 10, 13, 10,112, 98,111, + 98, 98,108,101, 50,106, 58, 13, 10,112, 98,111, 98, 98,108,101, 50,111, + 58, 13, 10,112, 98,111, 98, 98,108,101, 50,117, 58, 13, 10, 48, 58, 52, + 48, 97, 56, 53, 52, 58, 49, 49, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 52, 48, 48, 49, 53, 50, 58, 50, 58, 48, 49, 58, 97, 50, 13, 10, 13, + 10,106,109,112, 98,114,101, 97,107, 58, 13, 10, 48, 58, 57, 53, 48, 57, + 56, 58, 53,102, 58, 48, 48, 58, 54, 55, 13, 10, 13, 10,115,112,117,122, + 98,111, 98,108, 58, 13, 10, 48, 58, 50, 56, 98,102, 48, 56, 58, 49, 48, + 100, 58, 50, 48, 58, 48, 49, 13, 10, 13, 10,112,122,108,101,116,105,109, + 101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,117,122,122,108,101, 32, + 84,105,109,101, 32, 40, 80,114,111,116,111,116,121,112,101, 41, 13, 10, + 48, 58,102, 48, 51, 56, 48, 52, 58, 51, 98, 58, 48, 48, 58, 52,101, 13, + 10, 13, 10,112,114,109,114,115,111, 99,114, 58, 13, 10,112,114,109,114, + 115,111, 99,114,106, 58, 13, 10, 48, 58, 49, 48, 48, 51, 54, 52, 58, 52, + 99, 58, 53, 57, 58, 52, 48, 13, 10, 13, 10,115,117,112,114,104,101,108, + 105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101,114, 32, 72, + 101,108,105, 32, 40, 83,117,112,101,114, 32, 67,111, 98,114, 97, 32, 98, + 111,111,116,108,101,103, 41, 13, 10, 48, 58, 56, 48, 97, 56, 58, 51, 58, + 48, 48, 58, 48, 49, 13, 10, 48, 58, 56, 50, 48, 48, 58, 49,101, 58, 48, + 48, 58, 48, 49, 13, 10, 13, 10,109, 97,115,116,101,114,119, 58, 13, 10, + 109, 97,115,116,101,114,119,117, 58, 13, 10,109, 97,115,116,101,114,119, + 106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,115,116,101,114, 32, + 111,102, 32, 87,101, 97,112,111,110, 32, 40, 74, 97,112, 97,110, 41, 13, + 10,121,117,107,105,119,111, 58, 13, 10, 48, 58, 50, 48, 51, 48, 99, 48, + 58, 50, 56, 58, 48, 48, 58, 52,102, 13, 10, 13, 10, 97,111,104, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 65,103,101, 32, 79,102, 32, 72,101,114, + 111,101,115, 32, 45, 32, 83,105,108,107,114,111, 97,100, 32, 50, 32, 40, + 118, 48, 46, 54, 51, 32, 45, 32, 50, 48, 48, 49, 47, 48, 50, 47, 48, 55, + 41, 13, 10, 48, 58, 50, 56,101, 55, 56, 52, 58,102, 56, 58, 52, 98, 58, + 48, 49, 13, 10, 13, 10, 98, 97,116,114,105,100,101,114, 58, 13, 10, 98, + 97,116,114,105,100,101,114, 99, 58, 13, 10, 98, 97,116,114,105,100,101, + 114,106, 97, 58, 13, 10, 98, 97,116,114,105,100,101,114,107, 58, 13, 10, + 98, 97,116,114,105,100,101,114,117, 58, 13, 10, 98, 97,116,114,105,100, + 101,114,106, 58, 13, 10, 98, 97,116,114,105,100,101,114,116, 58, 13, 10, + 98, 97,116,114,105,100,101,114,104,107, 58, 13, 10, 48, 58, 50, 48,102, + 97, 50, 48, 58, 51, 49, 48, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10,109, 114,100,114,105,108,108,114,106, 58, 32, 59, 42, 42, 42, 42, 42, 42, 77, 114, 32, 68,114,105,108,108,101,114, 32, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,102,105,110,100,105,110,103, 32,116,104,101, 32,116, - 97, 98,108,101, 93, 10,109,114,100,114,105,108,108,114, 58, 10, 48, 58, - 50, 48, 49, 48, 51, 56, 58, 50, 56, 56, 58, 55, 54, 58, 55, 54, 10, 10, - 115,102,105,105,105, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116, - 114,101,101,116, 32,102,105,103,104,116,101,114, 32, 73, 73, 73, 32, 51, - 114,100, 32,115,116,114,105,107,101, 58, 32,102,105,103,104,116, 32,102, - 111,114, 32,116,104,101, 32,102,117,116,117,114,101, 32, 40,117,115, 97, - 44, 32, 57, 57, 48, 54, 48, 56, 41, 10,115,102,105,105,105, 51,117, 58, - 10,115,102,105,105,105, 51,110,114, 49, 58, 32, 32, 59, 42, 42, 42, 42, + 97, 98,108,101, 93, 13, 10,109,114,100,114,105,108,108,114, 58, 13, 10, + 48, 58, 50, 48, 49, 48, 51, 56, 58, 50, 56, 56, 58, 55, 54, 58, 55, 54, + 13, 10, 13, 10,115,102,105,105,105, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116,101,114, 32, 73, 73, 73, 32, 51,114,100, 32,115,116,114,105,107,101, 58, 32,102,105,103, 104,116, 32,102,111,114, 32,116,104,101, 32,102,117,116,117,114,101, 32, - 40,106, 97,112, 97,110, 44, 32, 57, 57, 48, 53, 49, 50, 32,110,111, 32, - 99,100, 41, 10,115,102,105,105,105, 51,110, 58, 32, 32, 59, 42, 42, 42, + 40,117,115, 97, 44, 32, 57, 57, 48, 54, 48, 56, 41, 13, 10,115,102,105, + 105,105, 51,117, 58, 13, 10,115,102,105,105,105, 51,110,114, 49, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103, + 104,116,101,114, 32, 73, 73, 73, 32, 51,114,100, 32,115,116,114,105,107, + 101, 58, 32,102,105,103,104,116, 32,102,111,114, 32,116,104,101, 32,102, + 117,116,117,114,101, 32, 40,106, 97,112, 97,110, 44, 32, 57, 57, 48, 53, + 49, 50, 32,110,111, 32, 99,100, 41, 13, 10,115,102,105,105,105, 51,110, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102, + 105,103,104,116,101,114, 32, 73, 73, 73, 32, 51,114,100, 32,115,116,114, + 105,107,101, 58, 32,102,105,103,104,116, 32,102,111,114, 32,116,104,101, + 32,102,117,116,117,114,101, 32, 40,106, 97,112, 97,110, 44, 32, 57, 57, + 48, 54, 48, 56, 32,110,111, 32, 99,100, 41, 13, 10,115,102,105,105,105, + 51,114, 49, 58, 13, 10,115,102,105,105,105, 51,117,114, 49, 58, 13, 10, + 48, 58, 50, 48, 49, 54,101, 52, 99, 58, 49, 56,100, 58, 49, 99, 58, 48, + 52, 13, 10, 13, 10,115,102,105,105,105, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116,101,114, 32, - 73, 73, 73, 32, 51,114,100, 32,115,116,114,105,107,101, 58, 32,102,105, - 103,104,116, 32,102,111,114, 32,116,104,101, 32,102,117,116,117,114,101, - 32, 40,106, 97,112, 97,110, 44, 32, 57, 57, 48, 54, 48, 56, 32,110,111, - 32, 99,100, 41, 10,115,102,105,105,105, 51,114, 49, 58, 10,115,102,105, - 105,105, 51,117,114, 49, 58, 10, 48, 58, 50, 48, 49, 54,101, 52, 99, 58, - 49, 56,100, 58, 49, 99, 58, 48, 52, 10, 10,115,102,105,105,105, 50, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105, - 103,104,116,101,114, 32, 73, 73, 73, 32, 50,110,100, 32,105,109,112, 97, - 99,116, 58, 32,103,105, 97,110,116, 32, 97,116,116, 97, 99,107, 32, 40, - 97,115,105, 97, 44, 32, 57, 55, 48, 57, 51, 48, 44, 32,110,111, 32, 99, - 100, 41, 10,115,102,105,105,105, 50,110, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116,101,114, 32, 73, - 73, 73, 32, 50,110,100, 32,105,109,112, 97, 99,116, 58, 32,103,105, 97, - 110,116, 32, 97,116,116, 97, 99,107, 32, 40,117,115, 97, 44, 32, 57, 55, - 48, 57, 51, 48, 41, 10, 48, 58, 50, 48, 49, 53, 57, 50, 52, 58, 57, 48, - 58, 49, 99, 58, 48, 50, 10, 10,115,102,105,105,105,110, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103,104, - 116,101,114, 32, 73, 73, 73, 58, 32, 78,101,119, 32, 71,101,110,101,114, - 97,116,105,111,110, 32, 40, 97,115,105, 97, 44, 32, 57, 55, 48, 50, 48, - 52, 32,110,111, 32, 99,100, 41, 10,115,102,105,105,105, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116, - 101,114, 32, 73, 73, 73, 58, 32, 78,101,119, 32, 71,101,110,101,114, 97, - 116,105,111,110, 32, 40,117,115, 97, 44, 32, 57, 55, 48, 50, 48, 52, 41, - 10,115,102,105,105,105,106, 58, 10,115,102,105,105,105,117, 58, 10,115, - 102,105,105,105, 97, 58, 10,115,102,105,105,105,110, 58, 10, 48, 58, 50, - 48, 49, 51, 56, 49, 99, 58, 57, 48, 58, 49, 99, 58, 48, 50, 10, 10,118, - 97,109,112,104, 97,108,102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, - 97,109,102, 32,120, 49, 47, 50, 32, 40, 69,117,114,111,112,101, 41, 10, - 48, 58, 53, 97,102,100, 99, 58, 51, 97, 58, 48, 48, 58, 48, 51, 10, 10, - 118, 97,109,112,104, 97,108,102,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 86, 97,109,102, 32,120, 49, 47, 50, 32, 40,107,111,114,101, 97, 41, - 10, 48, 58, 53, 97,101, 54, 99, 58, 51, 97, 58, 48, 48, 58, 48, 51, 10, - 10,116,117,114, 98,111,115, 98, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 84,117,114, 98,111, 32, 83,117, 98, 32, 40,112,114,111,116,111,116, - 121,112,101, 32,114,101,118, 46, 32, 84, 83, 67, 54, 41, 10, 48, 58, 51, - 99, 55, 97, 58, 52, 54, 58, 48, 48, 58, 53, 54, 10, 10,115,116,114, 97, - 116,118,111,120, 58, 10,115,116,114, 97,116,118,120, 98, 58, 10,115,112, - 101, 97,107,114,101,115, 58, 10,115,112, 97, 99,101, 99,104,111, 50, 58, + 73, 73, 73, 32, 50,110,100, 32,105,109,112, 97, 99,116, 58, 32,103,105, + 97,110,116, 32, 97,116,116, 97, 99,107, 32, 40, 97,115,105, 97, 44, 32, + 57, 55, 48, 57, 51, 48, 44, 32,110,111, 32, 99,100, 41, 13, 10,115,102, + 105,105,105, 50,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116,114, + 101,101,116, 32,102,105,103,104,116,101,114, 32, 73, 73, 73, 32, 50,110, + 100, 32,105,109,112, 97, 99,116, 58, 32,103,105, 97,110,116, 32, 97,116, + 116, 97, 99,107, 32, 40,117,115, 97, 44, 32, 57, 55, 48, 57, 51, 48, 41, + 13, 10, 48, 58, 50, 48, 49, 53, 57, 50, 52, 58, 57, 48, 58, 49, 99, 58, + 48, 50, 13, 10, 13, 10,115,102,105,105,105,110, 97, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116,101, + 114, 32, 73, 73, 73, 58, 32, 78,101,119, 32, 71,101,110,101,114, 97,116, + 105,111,110, 32, 40, 97,115,105, 97, 44, 32, 57, 55, 48, 50, 48, 52, 32, + 110,111, 32, 99,100, 41, 13, 10,115,102,105,105,105, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116,101, + 114, 32, 73, 73, 73, 58, 32, 78,101,119, 32, 71,101,110,101,114, 97,116, + 105,111,110, 32, 40,117,115, 97, 44, 32, 57, 55, 48, 50, 48, 52, 41, 13, + 10,115,102,105,105,105,106, 58, 13, 10,115,102,105,105,105,117, 58, 13, + 10,115,102,105,105,105, 97, 58, 13, 10,115,102,105,105,105,110, 58, 13, + 10, 48, 58, 50, 48, 49, 51, 56, 49, 99, 58, 57, 48, 58, 49, 99, 58, 48, + 50, 13, 10, 13, 10,118, 97,109,112,104, 97,108,102, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 86, 97,109,102, 32,120, 49, 47, 50, 32, 40, 69,117, + 114,111,112,101, 41, 13, 10, 48, 58, 53, 97,102,100, 99, 58, 51, 97, 58, + 48, 48, 58, 48, 51, 13, 10, 13, 10,118, 97,109,112,104, 97,108,102,107, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,109,102, 32,120, 49, 47, + 50, 32, 40,107,111,114,101, 97, 41, 13, 10, 48, 58, 53, 97,101, 54, 99, + 58, 51, 97, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10,116,117,114, 98,111, + 115, 98, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,117,114, 98,111, + 32, 83,117, 98, 32, 40,112,114,111,116,111,116,121,112,101, 32,114,101, + 118, 46, 32, 84, 83, 67, 54, 41, 13, 10, 48, 58, 51, 99, 55, 97, 58, 52, + 54, 58, 48, 48, 58, 53, 54, 13, 10, 13, 10,115,116,114, 97,116,118,111, + 120, 58, 13, 10,115,116,114, 97,116,118,120, 98, 58, 13, 10,115,112,101, + 97,107,114,101,115, 58, 13, 10,115,112, 97, 99,101, 99,104,111, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,101, 99,104, - 111, 32, 40,115,101,116, 32, 49, 41, 10,115,112, 97, 99,101, 99,104,111, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,101, 99, - 104,111, 32, 40,115,101,116, 32, 50, 41, 10,115,112,101, 97,107,114,101, - 115, 98, 58, 10, 48, 58, 52, 48, 48, 49, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 52, 48, 49, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,114, - 116,121,112,101, 58, 10,114,116,121,112,101,117, 58, 10,114,116,121,112, - 101, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82, 45, 84,121,112,101, - 32, 40, 87,111,114,108,100, 32, 98,111,111,116,108,101,103, 41, 10,114, - 116,121,112,101,106, 58, 10, 48, 58, 52, 50,102, 52,101, 58, 55, 49, 58, - 52, 53, 58, 50, 48, 10, 10,114,116,121,112,101,106,112, 58, 10, 48, 58, - 52, 50,102, 52, 97, 58, 55, 49, 58, 52, 53, 58, 50, 48, 10, 10,114,116, - 121,112,101,109, 56, 50, 98, 58, 10, 48, 58,100, 50,102, 53, 49, 58, 54, - 101, 58, 48, 48, 58, 50, 48, 10, 10,100,107,111,110,103, 58, 10,100,107, - 111,110,103,106,111, 58, 10,100,107,111,110,103,106, 58, 10,100,107,111, - 110,103,106,112,111, 58, 10,100,107,111,110,103,111, 58, 10,100,107,111, - 110,103,106,111, 49, 58, 10,100,107,111,110,103,102, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 68,111,110,107,101,121, 32, 75,111,110,103, 32, 70, - 111,117,110,100,114,121, 32, 40,104, 97, 99,107, 41, 10,100,107,111,110, - 103,104,114,100, 58, 10,100,107,111,110,103,112,101, 58, 10, 48, 58, 54, - 49, 48, 48, 58, 65, 65, 58, 57, 52, 58, 55, 54, 10, 48, 58, 54, 48, 66, - 56, 58, 48, 51, 58, 53, 48, 58, 48, 48, 10, 48, 58, 55, 54, 52, 49, 58, - 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 54, 50, 49, 58, 48, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 54, 48, 49, 58, 48, 49, 58, 48, - 55, 58, 48, 55, 10, 48, 58, 55, 53,101, 49, 58, 48, 49, 58, 48, 54, 58, - 48, 54, 10, 48, 58, 55, 53, 99, 49, 58, 48, 49, 58, 48, 53, 58, 48, 53, - 10, 48, 58, 55, 53, 97, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 10, - 100,111,103,121,117,117,110, 58, 10,100,111,103,121,117,117,110, 97, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111,103,121,117,117,110, 32, 40, - 76,105, 99,101,110,115,101,100, 32,116,111, 32, 85,110,105,116,101, 32, - 84,114, 97,100,105,110,103, 32, 70,111,114, 32, 75,111,114,101, 97, 41, - 10, 48, 58, 49, 48, 48, 51, 52, 97, 58, 55, 99, 58, 48, 48, 58, 49, 98, - 10, 10,100,111,103,121,117,117,110,116, 58, 10, 48, 58, 49, 48, 48, 51, - 52, 97, 58, 55, 99, 58, 48, 49, 58, 49, 98, 10, 10, 99,101,110,116,105, - 112,100, 98, 58, 10, 99,101,110,116,105,112,101,100, 50, 58, 10, 99,101, - 110,116,105,112,101,100, 51, 58, 10, 99,101,110,116,105,112,101,100, 58, - 10, 99,101,110,116,116,105,109,101, 58, 10, 99,101,110,116,105,112,100, - 100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,101,110,116,105,112,101, - 100,101, 32, 68,117,120, 32, 40,104, 97, 99,107, 41, 10, 48, 58, 48, 48, - 48, 98, 58, 48,102, 58, 49, 48, 58, 48, 49, 10, 48, 58, 48, 48, 50, 51, - 58, 48,102, 58, 48, 52, 58, 49, 50, 10, 10,109, 97,103,119,111,114,109, - 58, 10, 48, 58, 48, 48, 48, 50, 58, 51, 48, 58, 53, 50, 58, 49, 97, 10, - 10,109,105,108,108,112, 97, 99, 58, 10, 48, 58, 48, 48, 48, 50, 58, 50, - 97, 58, 57, 48, 58, 49, 55, 10, 10,106,106,115,113,117, 97,119,107, 58, - 10,106,106,115,113,117, 97,119,107, 98, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 74, 46, 32, 74, 46, 32, 83,113,117, 97,119,107,101,114,115, 32, - 40, 98,111,111,116,108,101,103, 41, 10,106,106,115,113,117, 97,119,107, - 98, 50, 58, 10,106,106,115,113,117, 97,119,107,111, 58, 10, 48, 58, 50, - 48, 53, 54, 49,101, 58, 52,102, 58, 48, 48, 58, 54, 49, 10, 10, 98,108, - 107,116,105,103,101,114, 58, 10, 98,108,107,116,105,103,101,114, 98, 49, - 58, 10, 98,108,107,116,105,103,101,114, 98, 50, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 66,108, 97, 99,107, 32, 84,105,103,101,114, 32, 40, 98, - 111,111,116,108,101,103, 32,115,101,116, 32, 50, 41, 10, 98,108,107,116, - 105,103,101,114, 97, 58, 10, 98,108,107,116,105,103,101,114, 98, 51, 58, - 10, 48, 58,101, 50, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, 48, - 58,101, 49,101, 48, 58, 56, 58, 48, 48, 58, 48, 48, 10, 10,115,115,102, - 50,116, 58, 10,115,115,102, 50,116,117, 58, 10,115,115,102, 50,116, 97, - 58, 10,115,115,102, 50,120,106, 58, 10,115,115,102, 50,116,117,114, 49, - 58, 10,115,115,102, 50,120,106,100, 58, 10,115,115,102, 50,120,106,114, - 58, 10,115,115,102, 50,116, 97,100, 58, 10,115,115,102, 50,116,104, 58, - 10, 48, 58,102,102,100, 54, 97, 50, 58, 51, 48, 58, 48, 48, 58, 50, 48, - 10, 48, 58,102,102,100, 55, 49, 97, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10,115,115,102, 50,106, 58, 10,115,115,102, 50,106,114, 49, 58, 10,115, - 115,102, 50,106,114, 50, 58, 10,115,115,102, 50, 58, 10,115,115,102, 50, - 114, 49, 58, 10,115,115,102, 50,117, 58, 10,115,115,102, 50, 97, 58, 10, - 115,115,102, 50, 97,114, 49, 58, 10,115,115,102, 50,117,100, 58, 10,115, - 115,102, 50,116, 98,106, 58, 10,115,115,102, 50,116, 98,114, 49, 58, 10, - 115,115,102, 50,116, 98,100, 58, 10,115,115,102, 50,116, 98, 58, 10, 48, - 58,102,102,100, 53, 97, 50, 58, 51, 48, 58, 48, 48, 58, 50, 48, 10, 48, - 58,102,102,100, 54, 49, 97, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,115, - 112,102, 50,116, 58, 10,115,112,102, 50,116,117, 58, 10,115,112,102, 50, - 120,106, 58, 10,115,112,102, 50,120,106,100, 58, 10,115,112,102, 50,116, - 97, 58, 10,115,112,102, 50,116,104, 58, 10,115,112,102, 50,116,100, 58, - 10, 48, 58,102,102,100, 55, 97, 97, 58, 52,101, 58, 48, 48, 58, 48, 50, - 10, 48, 58,102,102, 56, 48, 56, 49, 58, 49, 58, 48, 49, 58, 48, 49, 10, - 10,115,103,101,109,102, 58, 10,112,102,103,104,116,106, 58, 10,115,103, - 101,109,102, 97, 58, 10,115,103,101,109,102,100, 58, 10,115,103,101,109, - 102,104, 58, 10, 48, 58,102,102,102, 50, 51, 97, 58, 50, 58, 48, 48, 58, - 48, 50, 10, 48, 58,102,102,102, 50, 51, 99, 58, 97,101, 58, 48, 48, 58, - 48, 48, 10, 10,115,102, 97, 50, 58, 10,115,102, 97, 50,117, 58, 10,115, - 102, 97, 50,117,114, 49, 58, 10,115,102,122, 50, 97,100, 58, 10,115,102, - 122, 50, 97, 58, 10,115,102,122, 50, 98,114, 49, 58, 10,115,102,122, 50, - 98, 58, 10,115,102,122, 50, 97,108,100, 58, 10,115,102,122, 50,104, 58, - 10,115,102,122, 50,106, 58, 10,115,102,122, 50,106,114, 49, 58, 10,115, - 102,122, 50,110, 58, 10,115,102,122, 50, 97, 97,100, 58, 10,115,102,122, - 50, 97,108, 58, 10,115,102,122, 50, 97,108, 98, 58, 10,115,102,122, 50, - 97,108,104, 58, 10,115,102,122, 50, 97,108,106, 58, 10,115,102,122, 50, - 106,100, 58, 10, 48, 58,102,102,100,102, 54, 97, 58, 97,100, 58, 48, 48, - 58, 48, 49, 10, 10,115,102, 97, 58, 10,115,102,122,106,114, 49, 58, 10, - 115,102,122,106, 58, 10,115,102, 97,117, 58, 32, 32, 10,115,102, 97,114, - 51, 58, 10,115,102, 97,114, 50, 58, 10,115,102, 97,114, 49, 58, 10,115, - 102, 97,100, 58, 10,115,102,122, 97, 58, 10,115,102,122, 97,114, 49, 58, - 10,115,102,122, 98,114, 49, 58, 10,115,102,122, 98, 58, 10,115,102,122, - 106,114, 50, 58, 10,115,102,122,104,114, 49, 58, 10,115,102,122,104, 58, - 10, 48, 58,102,102, 97,101, 97, 48, 58, 57,102, 58, 48, 49, 58, 49, 54, - 10, 10,115,102, 97, 51, 58, 10,115,102, 97, 51,114, 49, 58, 10,115,102, - 122, 51,106, 58, 10,115,102,122, 51,106,114, 49, 58, 10,115,102,122, 51, - 97, 58, 10,115,102,122, 51,106,114, 50, 58, 32, 32, 10,115,102, 97, 51, - 98, 58, 10,115,102, 97, 51,117,114, 49, 58, 10,115,102, 97, 51,117,100, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,116,114,101,101,116, 32, 70, - 105,103,104,116,101,114, 32, 65,108,112,104, 97, 32, 51, 32, 40, 85, 83, - 65, 32, 57, 56, 48, 57, 48, 52, 32, 80,104,111,101,110,105,120, 32, 69, - 100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 10, - 115,102, 97, 51,117, 58, 10,115,102,122, 51, 97,114, 49, 58, 10,115,102, - 97, 51,104,114, 49, 58, 10,115,102, 97, 51,104, 58, 10,115,102,122, 51, - 106,114, 50,100, 58, 10, 48, 58,102,102, 50, 51, 98,101, 58, 97,101, 48, - 58, 48, 48, 58, 48, 53, 10, 10,115,102, 97, 51,117,115, 58, 10, 48, 58, - 102,102, 50, 51, 98, 54, 58, 97,101, 48, 58, 48, 48, 58, 48, 53, 10, 10, - 115,102, 50, 99,101,117, 99, 58, 10,115,102, 50, 99,101,117, 97, 58, 10, - 115,102, 50,114, 98, 50, 58, 10,115,102, 50, 99,101,101, 97, 58, 10,115, - 102, 50, 99,101,117, 98, 58, 32, 32, 10,115,102, 50, 99,101,106, 98, 58, - 32, 32, 10,115,102, 50,114, 98, 58, 32, 32, 32, 10,115,102, 50,104,102, - 117, 58, 10,115,102, 50,104,102,106, 58, 10,115,102, 50,109, 50, 58, 10, - 115,102, 50,109, 49, 58, 32, 10,115,102, 50,109, 52, 58, 32, 10,115,102, - 50,109, 53, 58, 10,115,102, 50,109, 54, 58, 10,115,102, 50,109, 55, 58, - 10,115,102, 50,109,100,116, 58, 10,115,102, 50,114, 98, 51, 58, 10,115, - 102, 50,107,111,114,121,117, 58, 10,115,102, 50,121,121, 99, 58, 10,115, - 102, 50, 97, 99, 99, 58, 10,115,102, 50, 97, 99, 99, 97, 58, 10,115,102, - 50,100,107,111,116, 50, 58, 10,115,102, 50, 99,101, 58, 10,115,102, 50, - 99,101,106, 97, 58, 10,115,102, 50, 99,101,106, 99, 58, 10,115,102, 50, - 97,109,102, 58, 10,115,102, 50,109, 56, 58, 10,115,102, 50,109,100,116, - 97, 58, 10,115,102, 50,100,111,110,103, 98, 58, 10,115,102, 50, 98,104, - 104, 58, 10,115,102, 50, 97,109,102, 50, 58, 10,115,102, 50, 99,101, 98, - 108,112, 58, 10,115,102, 50,109,100,116, 98, 58, 10,115,102, 50,109, 57, - 58, 10,115,102, 50,109,100,116, 99, 58, 10,115,102, 50, 99,101, 98,108, - 116,119, 58, 10,115,102, 50,109, 49, 48, 58, 10, 48, 58,102,102,100, 50, - 55, 54, 58, 50, 56, 58, 48, 48, 58, 50, 48, 10, 48, 58,102,102,100, 50, - 99, 54, 58, 49, 52, 58,102,102, 58, 57, 54, 10, 48, 58,102,102,100, 50, - 101,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,120,109,118,115,102, - 58, 10,120,109,118,115,102,117,114, 49, 58, 10,120,109,118,115,102,117, - 58, 32, 32, 10,120,109,118,115,102, 97,114, 49, 58, 10,120,109,118,115, - 102, 97, 58, 10,120,109,118,115,102, 98, 58, 10,120,109,118,115,102,114, - 49, 58, 10,120,109,118,115,102,104, 58, 10,120,109,118,115,102,106,114, - 50, 58, 10,120,109,118,115,102,106,114, 49, 58, 10,120,109,118,115,102, - 106,114, 51, 58, 10,120,109,118,115,102,106, 58, 10,120,109,118,115,102, - 117, 49,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 88, 45, 77,101,110, - 32, 86,115, 46, 32, 83,116,114,101,101,116, 32, 70,105,103,104,116,101, - 114, 32, 40, 85, 83, 65, 32, 57, 54, 49, 48, 48, 52, 32, 80,104,111,101, - 110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116, - 108,101,103, 41, 10,120,109,118,115,102, 97,114, 50, 58, 10,120,109,118, - 115,102, 97,114, 51, 58, 10,120,109,118,115,102,117,114, 50, 58, 10, 48, - 58,102,102, 50, 53, 54,101, 58, 54, 51, 58, 48, 48, 58, 48, 53, 10, 10, - 120,109, 99,111,116, 97,114, 49, 58, 32, 10,120,109, 99,111,116, 97,106, - 50, 58, 10,120,109, 99,111,116, 97, 97,114, 49, 58, 10,120,109, 99,111, - 116, 97,114, 49,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 88, 45, 77, - 101,110, 58, 32, 67,104,105,108,100,114,101,110, 32,111,102, 32,116,104, - 101, 32, 65,116,111,109, 32, 40, 69,117,114,111, 32, 57, 53, 48, 49, 48, - 53, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, 41, - 10,120,109, 99,111,116, 97,104, 58, 10,120,109, 99,111,116, 97,106,114, - 58, 10,120,109, 99,111,116, 97,106, 51, 58, 10,120,109, 99,111,116, 97, - 106, 49, 58, 10,120,109, 99,111,116, 97,117, 58, 10,120,109, 99,111,116, - 97,106, 58, 10,120,109, 99,111,116, 97,104,114, 49, 58, 10,120,109, 99, - 111,116, 97, 58, 10,120,109, 99,111,116, 97, 97, 58, 10, 48, 58,102,102, - 101, 99, 56,101, 58, 51, 99, 58, 48, 48, 58, 48, 49, 10, 10,118,115, 97, - 118, 58, 10,118,115, 97,118, 97, 58, 10,118,115, 97,118,117, 58, 10,118, - 115, 97,118,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,109,112, - 105,114,101, 32, 83, 97,118,105,111,114, 58, 32, 84,104,101, 32, 76,111, - 114,100, 32,111,102, 32, 86, 97,109,112,105,114,101, 32, 40, 69,117,114, - 111, 32, 57, 55, 48, 53, 49, 57, 32, 80,104,111,101,110,105,120, 32, 69, - 100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 10, - 118,115, 97,118,104, 58, 10,118,115, 97,118,106, 58, 10, 48, 58,102,102, - 102, 52, 50, 54, 58, 97,100, 58, 48, 48, 58, 48, 50, 10, 10,118,105,111, - 115,116,111,114,109, 58, 10,118,105,111,115,116,111,114,109,117, 58, 10, - 118,105,111,115,116,111,114,109, 97, 58, 10,118,105,111,115,116,111,114, - 109,106, 58, 10,118,105,111,115,116,111,114,109,117, 98, 58, 10,118,105, - 111,115,116,111,114,109, 97, 98, 58, 10,118,105,111,115,116,111,114,109, - 101, 98, 58, 10, 48, 58, 50, 48,100, 99, 48, 48, 58, 49, 51, 57, 58, 48, - 48, 58, 48, 55, 10, 48, 58, 50, 48, 48, 49, 51, 56, 58, 56, 58, 48, 48, - 58, 52, 53, 10, 10,112,114,111,103,101, 97,114, 58, 10,112,114,111,103, - 101, 97,114,106, 58, 10,112,114,111,103,101, 97,114, 97, 58, 10,112,114, - 111,103,101, 97,114,106,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80, - 114,111,103,101, 97,114, 32,110,111, 32, 65,114, 97,115,104,105, 32, 40, - 74, 97,112, 97,110, 32, 48, 49, 48, 49, 49, 55, 32, 80,104,111,101,110, - 105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108, - 101,103, 41, 32, 10,112,114,111,103,101, 97,114,117,100, 58, 10,112,114, - 111,103,101, 97,114,106, 98,108, 58, 32, 32, 10, 48, 58,102,102, 51,100, - 99,102, 58,101, 53, 58, 50, 48, 58, 48, 52, 10, 10,110,119, 97,114,114, - 58, 10,110,119, 97,114,114, 98, 58, 10,110,119, 97,114,114,104, 58, 10, - 110,119, 97,114,114,117, 58, 10,110,119, 97,114,114,117,100, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 78,105,103,104,116, 32, 87, 97,114,114,105, - 111,114,115, 58, 32, 68, 97,114,107,115,116, 97,108,107,101,114,115, 39, - 32, 82,101,118,101,110,103,101, 32, 40, 85, 83, 65, 32, 57, 53, 48, 52, - 48, 54, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, - 41, 32, 40, 98,111,111,116,108,101,103, 41, 10,118,104,117,110,116,106, - 58, 10,118,104,117,110,116,106,114, 49, 58, 10,110,119, 97,114,114, 97, - 58, 10,118,104,117,110,116,106,114, 50, 58, 10,118,104,117,110,116,106, - 114, 49,115, 58, 10, 48, 58,102,102,102, 52,101, 56, 58, 52, 58, 48, 48, - 58, 48, 49, 10, 48, 58,102,102,102, 52,101, 99, 58, 52, 52, 58, 48, 48, - 58, 48, 48, 10, 10,109,118,115, 99, 58, 10,109,118,115, 99, 98, 58, 10, - 109,118,115, 99,106, 58, 10,109,118,115, 99,106,114, 49, 58, 10,109,118, - 115, 99, 97, 58, 10,109,118,115, 99,114, 49, 58, 32, 32, 10,109,118,115, - 99,104, 58, 32, 32, 10,109,118,115, 99,117, 58, 10,109,118,115, 99, 97, - 114, 49, 58, 10,109,118,115, 99,117,100, 58, 32, 32, 59, 42, 42, 42, 42, + 111, 32, 40,115,101,116, 32, 49, 41, 13, 10,115,112, 97, 99,101, 99,104, + 111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,101, + 99,104,111, 32, 40,115,101,116, 32, 50, 41, 13, 10,115,112,101, 97,107, + 114,101,115, 98, 58, 13, 10, 48, 58, 52, 48, 48, 49, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 52, 48, 49, 48, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,114,116,121,112,101, 58, 13, 10,114,116,121,112,101, + 117, 58, 13, 10,114,116,121,112,101, 98, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 82, 45, 84,121,112,101, 32, 40, 87,111,114,108,100, 32, 98,111, + 111,116,108,101,103, 41, 13, 10,114,116,121,112,101,106, 58, 13, 10, 48, + 58, 52, 50,102, 52,101, 58, 55, 49, 58, 52, 53, 58, 50, 48, 13, 10, 13, + 10,114,116,121,112,101,106,112, 58, 13, 10, 48, 58, 52, 50,102, 52, 97, + 58, 55, 49, 58, 52, 53, 58, 50, 48, 13, 10, 13, 10,114,116,121,112,101, + 109, 56, 50, 98, 58, 13, 10, 48, 58,100, 50,102, 53, 49, 58, 54,101, 58, + 48, 48, 58, 50, 48, 13, 10, 13, 10,100,107,111,110,103, 58, 13, 10,100, + 107,111,110,103,106,111, 58, 13, 10,100,107,111,110,103,106, 58, 13, 10, + 100,107,111,110,103,106,112,111, 58, 13, 10,100,107,111,110,103,111, 58, + 13, 10,100,107,111,110,103,106,111, 49, 58, 13, 10,100,107,111,110,103, + 102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111,110,107,101,121, 32, + 75,111,110,103, 32, 70,111,117,110,100,114,121, 32, 40,104, 97, 99,107, + 41, 13, 10,100,107,111,110,103,104,114,100, 58, 13, 10,100,107,111,110, + 103,112,101, 58, 13, 10, 48, 58, 54, 49, 48, 48, 58, 65, 65, 58, 57, 52, + 58, 55, 54, 13, 10, 48, 58, 54, 48, 66, 56, 58, 48, 51, 58, 53, 48, 58, + 48, 48, 13, 10, 48, 58, 55, 54, 52, 49, 58, 48, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 55, 54, 50, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 55, 54, 48, 49, 58, 48, 49, 58, 48, 55, 58, 48, 55, 13, + 10, 48, 58, 55, 53,101, 49, 58, 48, 49, 58, 48, 54, 58, 48, 54, 13, 10, + 48, 58, 55, 53, 99, 49, 58, 48, 49, 58, 48, 53, 58, 48, 53, 13, 10, 48, + 58, 55, 53, 97, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 100,111,103,121,117,117,110, 58, 13, 10,100,111,103,121,117,117,110, 97, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111,103,121,117,117,110, 32, + 40, 76,105, 99,101,110,115,101,100, 32,116,111, 32, 85,110,105,116,101, + 32, 84,114, 97,100,105,110,103, 32, 70,111,114, 32, 75,111,114,101, 97, + 41, 13, 10, 48, 58, 49, 48, 48, 51, 52, 97, 58, 55, 99, 58, 48, 48, 58, + 49, 98, 13, 10, 13, 10,100,111,103,121,117,117,110,116, 58, 13, 10, 48, + 58, 49, 48, 48, 51, 52, 97, 58, 55, 99, 58, 48, 49, 58, 49, 98, 13, 10, + 13, 10, 99,101,110,116,105,112,100, 98, 58, 13, 10, 99,101,110,116,105, + 112,101,100, 50, 58, 13, 10, 99,101,110,116,105,112,101,100, 51, 58, 13, + 10, 99,101,110,116,105,112,101,100, 58, 13, 10, 99,101,110,116,116,105, + 109,101, 58, 13, 10, 99,101,110,116,105,112,100,100, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 67,101,110,116,105,112,101,100,101, 32, 68,117,120, + 32, 40,104, 97, 99,107, 41, 13, 10, 48, 58, 48, 48, 48, 98, 58, 48,102, + 58, 49, 48, 58, 48, 49, 13, 10, 48, 58, 48, 48, 50, 51, 58, 48,102, 58, + 48, 52, 58, 49, 50, 13, 10, 13, 10,109, 97,103,119,111,114,109, 58, 13, + 10, 48, 58, 48, 48, 48, 50, 58, 51, 48, 58, 53, 50, 58, 49, 97, 13, 10, + 13, 10,109,105,108,108,112, 97, 99, 58, 13, 10, 48, 58, 48, 48, 48, 50, + 58, 50, 97, 58, 57, 48, 58, 49, 55, 13, 10, 13, 10,106,106,115,113,117, + 97,119,107, 58, 13, 10,106,106,115,113,117, 97,119,107, 98, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 74, 46, 32, 74, 46, 32, 83,113,117, 97,119, + 107,101,114,115, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,106,106, + 115,113,117, 97,119,107, 98, 50, 58, 13, 10,106,106,115,113,117, 97,119, + 107,111, 58, 13, 10, 48, 58, 50, 48, 53, 54, 49,101, 58, 52,102, 58, 48, + 48, 58, 54, 49, 13, 10, 13, 10, 98,108,107,116,105,103,101,114, 58, 13, + 10, 98,108,107,116,105,103,101,114, 98, 49, 58, 13, 10, 98,108,107,116, + 105,103,101,114, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,108, + 97, 99,107, 32, 84,105,103,101,114, 32, 40, 98,111,111,116,108,101,103, + 32,115,101,116, 32, 50, 41, 13, 10, 98,108,107,116,105,103,101,114, 97, + 58, 13, 10, 98,108,107,116,105,103,101,114, 98, 51, 58, 13, 10, 48, 58, + 101, 50, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,101, + 49,101, 48, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,115,102, + 50,116, 58, 13, 10,115,115,102, 50,116,117, 58, 13, 10,115,115,102, 50, + 116, 97, 58, 13, 10,115,115,102, 50,120,106, 58, 13, 10,115,115,102, 50, + 116,117,114, 49, 58, 13, 10,115,115,102, 50,120,106,100, 58, 13, 10,115, + 115,102, 50,120,106,114, 58, 13, 10,115,115,102, 50,116, 97,100, 58, 13, + 10,115,115,102, 50,116,104, 58, 13, 10, 48, 58,102,102,100, 54, 97, 50, + 58, 51, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,102,102,100, 55, 49, + 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,115,102, 50,106, + 58, 13, 10,115,115,102, 50,106,114, 49, 58, 13, 10,115,115,102, 50,106, + 114, 50, 58, 13, 10,115,115,102, 50, 58, 13, 10,115,115,102, 50,114, 49, + 58, 13, 10,115,115,102, 50,117, 58, 13, 10,115,115,102, 50, 97, 58, 13, + 10,115,115,102, 50, 97,114, 49, 58, 13, 10,115,115,102, 50,117,100, 58, + 13, 10,115,115,102, 50,116, 98,106, 58, 13, 10,115,115,102, 50,116, 98, + 114, 49, 58, 13, 10,115,115,102, 50,116, 98,100, 58, 13, 10,115,115,102, + 50,116, 98, 58, 13, 10, 48, 58,102,102,100, 53, 97, 50, 58, 51, 48, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58,102,102,100, 54, 49, 97, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,115,112,102, 50,116, 58, 13, 10,115, + 112,102, 50,116,117, 58, 13, 10,115,112,102, 50,120,106, 58, 13, 10,115, + 112,102, 50,120,106,100, 58, 13, 10,115,112,102, 50,116, 97, 58, 13, 10, + 115,112,102, 50,116,104, 58, 13, 10,115,112,102, 50,116,100, 58, 13, 10, + 48, 58,102,102,100, 55, 97, 97, 58, 52,101, 58, 48, 48, 58, 48, 50, 13, + 10, 48, 58,102,102, 56, 48, 56, 49, 58, 49, 58, 48, 49, 58, 48, 49, 13, + 10, 13, 10,115,103,101,109,102, 58, 13, 10,112,102,103,104,116,106, 58, + 13, 10,115,103,101,109,102, 97, 58, 13, 10,115,103,101,109,102,100, 58, + 13, 10,115,103,101,109,102,104, 58, 13, 10, 48, 58,102,102,102, 50, 51, + 97, 58, 50, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58,102,102,102, 50, 51, + 99, 58, 97,101, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,102, 97, 50, + 58, 13, 10,115,102, 97, 50,117, 58, 13, 10,115,102, 97, 50,117,114, 49, + 58, 13, 10,115,102,122, 50, 97,100, 58, 13, 10,115,102,122, 50, 97, 58, + 13, 10,115,102,122, 50, 98,114, 49, 58, 13, 10,115,102,122, 50, 98, 58, + 13, 10,115,102,122, 50, 97,108,100, 58, 13, 10,115,102,122, 50,104, 58, + 13, 10,115,102,122, 50,106, 58, 13, 10,115,102,122, 50,106,114, 49, 58, + 13, 10,115,102,122, 50,110, 58, 13, 10,115,102,122, 50, 97, 97,100, 58, + 13, 10,115,102,122, 50, 97,108, 58, 13, 10,115,102,122, 50, 97,108, 98, + 58, 13, 10,115,102,122, 50, 97,108,104, 58, 13, 10,115,102,122, 50, 97, + 108,106, 58, 13, 10,115,102,122, 50,106,100, 58, 13, 10, 48, 58,102,102, + 100,102, 54, 97, 58, 97,100, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,115, + 102, 97, 58, 13, 10,115,102,122,106,114, 49, 58, 13, 10,115,102,122,106, + 58, 13, 10,115,102, 97,117, 58, 13, 10,115,102, 97,114, 51, 58, 13, 10, + 115,102, 97,114, 50, 58, 13, 10,115,102, 97,114, 49, 58, 13, 10,115,102, + 97,100, 58, 13, 10,115,102,122, 97, 58, 13, 10,115,102,122, 97,114, 49, + 58, 13, 10,115,102,122, 98,114, 49, 58, 13, 10,115,102,122, 98, 58, 13, + 10,115,102,122,106,114, 50, 58, 13, 10,115,102,122,104,114, 49, 58, 13, + 10,115,102,122,104, 58, 13, 10, 48, 58,102,102, 97,101, 97, 48, 58, 57, + 102, 58, 48, 49, 58, 49, 54, 13, 10, 13, 10,115,102, 97, 51, 58, 13, 10, + 115,102, 97, 51,114, 49, 58, 13, 10,115,102,122, 51,106, 58, 13, 10,115, + 102,122, 51,106,114, 49, 58, 13, 10,115,102,122, 51, 97, 58, 13, 10,115, + 102,122, 51,106,114, 50, 58, 13, 10,115,102, 97, 51, 98, 58, 13, 10,115, + 102, 97, 51,117,114, 49, 58, 13, 10,115,102, 97, 51,117,100, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 83,116,114,101,101,116, 32, 70,105,103,104, + 116,101,114, 32, 65,108,112,104, 97, 32, 51, 32, 40, 85, 83, 65, 32, 57, + 56, 48, 57, 48, 52, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116, + 105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,115,102, + 97, 51,117, 58, 13, 10,115,102,122, 51, 97,114, 49, 58, 13, 10,115,102, + 97, 51,104,114, 49, 58, 13, 10,115,102, 97, 51,104, 58, 13, 10,115,102, + 122, 51,106,114, 50,100, 58, 13, 10, 48, 58,102,102, 50, 51, 98,101, 58, + 97,101, 48, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10,115,102, 97, 51,117, + 115, 58, 13, 10, 48, 58,102,102, 50, 51, 98, 54, 58, 97,101, 48, 58, 48, + 48, 58, 48, 53, 13, 10, 13, 10,115,102, 50, 99,101,117, 99, 58, 13, 10, + 115,102, 50, 99,101,117, 97, 58, 13, 10,115,102, 50,114, 98, 50, 58, 13, + 10,115,102, 50, 99,101,101, 97, 58, 13, 10,115,102, 50, 99,101,117, 98, + 58, 13, 10,115,102, 50, 99,101,106, 98, 58, 13, 10,115,102, 50,114, 98, + 58, 13, 10,115,102, 50,104,102,117, 58, 13, 10,115,102, 50,104,102,106, + 58, 13, 10,115,102, 50,109, 50, 58, 13, 10,115,102, 50,109, 49, 58, 13, + 10,115,102, 50,109, 52, 58, 13, 10,115,102, 50,109, 53, 58, 13, 10,115, + 102, 50,109, 54, 58, 13, 10,115,102, 50,109, 55, 58, 13, 10,115,102, 50, + 109,100,116, 58, 13, 10,115,102, 50,114, 98, 51, 58, 13, 10,115,102, 50, + 107,111,114,121,117, 58, 13, 10,115,102, 50,121,121, 99, 58, 13, 10,115, + 102, 50, 97, 99, 99, 58, 13, 10,115,102, 50, 97, 99, 99, 97, 58, 13, 10, + 115,102, 50,100,107,111,116, 50, 58, 13, 10,115,102, 50, 99,101, 58, 13, + 10,115,102, 50, 99,101,106, 97, 58, 13, 10,115,102, 50, 99,101,106, 99, + 58, 13, 10,115,102, 50, 97,109,102, 58, 13, 10,115,102, 50,109, 56, 58, + 13, 10,115,102, 50,109,100,116, 97, 58, 13, 10,115,102, 50,100,111,110, + 103, 98, 58, 13, 10,115,102, 50, 98,104,104, 58, 13, 10,115,102, 50, 97, + 109,102, 50, 58, 13, 10,115,102, 50, 99,101, 98,108,112, 58, 13, 10,115, + 102, 50,109,100,116, 98, 58, 13, 10,115,102, 50,109, 57, 58, 13, 10,115, + 102, 50,109,100,116, 99, 58, 13, 10,115,102, 50, 99,101, 98,108,116,119, + 58, 13, 10,115,102, 50,109, 49, 48, 58, 13, 10, 48, 58,102,102,100, 50, + 55, 54, 58, 50, 56, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,102,102,100, + 50, 99, 54, 58, 49, 52, 58,102,102, 58, 57, 54, 13, 10, 48, 58,102,102, + 100, 50,101,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,120, + 109,118,115,102, 58, 13, 10,120,109,118,115,102,117,114, 49, 58, 13, 10, + 120,109,118,115,102,117, 58, 13, 10,120,109,118,115,102, 97,114, 49, 58, + 13, 10,120,109,118,115,102, 97, 58, 13, 10,120,109,118,115,102, 98, 58, + 13, 10,120,109,118,115,102,114, 49, 58, 13, 10,120,109,118,115,102,104, + 58, 13, 10,120,109,118,115,102,106,114, 50, 58, 13, 10,120,109,118,115, + 102,106,114, 49, 58, 13, 10,120,109,118,115,102,106,114, 51, 58, 13, 10, + 120,109,118,115,102,106, 58, 13, 10,120,109,118,115,102,117, 49,100, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 88, 45, 77,101,110, 32, 86,115, 46, + 32, 83,116,114,101,101,116, 32, 70,105,103,104,116,101,114, 32, 40, 85, + 83, 65, 32, 57, 54, 49, 48, 48, 52, 32, 80,104,111,101,110,105,120, 32, + 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, + 13, 10,120,109,118,115,102, 97,114, 50, 58, 13, 10,120,109,118,115,102, + 97,114, 51, 58, 13, 10,120,109,118,115,102,117,114, 50, 58, 13, 10, 48, + 58,102,102, 50, 53, 54,101, 58, 54, 51, 58, 48, 48, 58, 48, 53, 13, 10, + 13, 10,120,109, 99,111,116, 97,114, 49, 58, 13, 10,120,109, 99,111,116, + 97,106, 50, 58, 13, 10,120,109, 99,111,116, 97, 97,114, 49, 58, 13, 10, + 120,109, 99,111,116, 97,114, 49,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 88, 45, 77,101,110, 58, 32, 67,104,105,108,100,114,101,110, 32,111, + 102, 32,116,104,101, 32, 65,116,111,109, 32, 40, 69,117,114,111, 32, 57, + 53, 48, 49, 48, 53, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116, + 105,111,110, 41, 13, 10,120,109, 99,111,116, 97,104, 58, 13, 10,120,109, + 99,111,116, 97,106,114, 58, 13, 10,120,109, 99,111,116, 97,106, 51, 58, + 13, 10,120,109, 99,111,116, 97,106, 49, 58, 13, 10,120,109, 99,111,116, + 97,117, 58, 13, 10,120,109, 99,111,116, 97,106, 58, 13, 10,120,109, 99, + 111,116, 97,104,114, 49, 58, 13, 10,120,109, 99,111,116, 97, 58, 13, 10, + 120,109, 99,111,116, 97, 97, 58, 13, 10, 48, 58,102,102,101, 99, 56,101, + 58, 51, 99, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,118,115, 97,118, 58, + 13, 10,118,115, 97,118, 97, 58, 13, 10,118,115, 97,118,117, 58, 13, 10, + 118,115, 97,118,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,109, + 112,105,114,101, 32, 83, 97,118,105,111,114, 58, 32, 84,104,101, 32, 76, + 111,114,100, 32,111,102, 32, 86, 97,109,112,105,114,101, 32, 40, 69,117, + 114,111, 32, 57, 55, 48, 53, 49, 57, 32, 80,104,111,101,110,105,120, 32, + 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, + 13, 10,118,115, 97,118,104, 58, 13, 10,118,115, 97,118,106, 58, 13, 10, + 48, 58,102,102,102, 52, 50, 54, 58, 97,100, 58, 48, 48, 58, 48, 50, 13, + 10, 13, 10,118,105,111,115,116,111,114,109, 58, 13, 10,118,105,111,115, + 116,114,109,117, 58, 13, 10,118,105,111,115,116,114,109, 97, 58, 13, 10, + 118,105,111,115,116,114,109,106, 58, 13, 10,118,105,111,115,116,111,114, + 109,117, 98, 58, 13, 10,118,105,111,115,116,111,114,109, 97, 98, 58, 13, + 10,118,105,111,115,116,111,114,109,101, 98, 58, 13, 10, 48, 58, 50, 48, + 100, 99, 48, 48, 58, 49, 51, 57, 58, 48, 48, 58, 48, 55, 13, 10, 48, 58, + 50, 48, 48, 49, 51, 56, 58, 56, 58, 48, 48, 58, 52, 53, 13, 10, 13, 10, + 112,114,111,103,101, 97,114, 58, 13, 10,112,114,111,103,101, 97,114,106, + 58, 13, 10,112,114,111,103,101, 97,114, 97, 58, 13, 10,112,114,111,103, + 101, 97,114,106,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,114,111, + 103,101, 97,114, 32,110,111, 32, 65,114, 97,115,104,105, 32, 40, 74, 97, + 112, 97,110, 32, 48, 49, 48, 49, 49, 55, 32, 80,104,111,101,110,105,120, + 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, + 41, 13, 10,112,114,111,103,101, 97,114,117,100, 58, 13, 10,112,114,111, + 103,101, 97,114,106, 98,108, 58, 13, 10, 48, 58,102,102, 51,100, 99,102, + 58,101, 53, 58, 50, 48, 58, 48, 52, 13, 10, 13, 10,110,119, 97,114,114, + 58, 13, 10,110,119, 97,114,114, 98, 58, 13, 10,110,119, 97,114,114,104, + 58, 13, 10,110,119, 97,114,114,117, 58, 13, 10,110,119, 97,114,114,117, + 100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,105,103,104,116, 32, 87, + 97,114,114,105,111,114,115, 58, 32, 68, 97,114,107,115,116, 97,108,107, + 101,114,115, 39, 32, 82,101,118,101,110,103,101, 32, 40, 85, 83, 65, 32, + 57, 53, 48, 52, 48, 54, 32, 80,104,111,101,110,105,120, 32, 69,100,105, + 116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,118, + 104,117,110,116,106, 58, 13, 10,118,104,117,110,116,106,114, 49, 58, 13, + 10,110,119, 97,114,114, 97, 58, 13, 10,118,104,117,110,116,106,114, 50, + 58, 13, 10,118,104,117,110,116,106,114, 49,115, 58, 13, 10, 48, 58,102, + 102,102, 52,101, 56, 58, 52, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,102, + 102,102, 52,101, 99, 58, 52, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 109,118,115, 99, 58, 13, 10,109,118,115, 99, 98, 58, 13, 10,109,118,115, + 99,106, 58, 13, 10,109,118,115, 99,106,114, 49, 58, 13, 10,109,118,115, + 99, 97, 58, 13, 10,109,118,115, 99,114, 49, 58, 13, 10,109,118,115, 99, + 104, 58, 13, 10,109,118,115, 99,117, 58, 13, 10,109,118,115, 99, 97,114, + 49, 58, 13, 10,109,118,115, 99,117,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,114,118,101,108, 32, 86,115, 46, 32, 67, 97,112, 99,111, 109, 58, 32, 67,108, 97,115,104, 32,111,102, 32, 83,117,112,101,114, 32, 72,101,114,111,101,115, 32, 40, 85, 83, 65, 32, 57, 56, 48, 49, 50, 51, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, - 40, 98,111,111,116,108,101,103, 41, 32, 32, 10,109,118,115, 99,117,114, - 49, 58, 10,109,118,115, 99,106,115,105,110,103, 58, 10, 48, 58,102,102, - 50, 54,102,100, 58, 54, 54, 58,102,102, 58, 48, 48, 10, 10,115,107, 97, - 116,101,107,100,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86,115, 46, - 32, 83,107, 97,116,101, 32, 75,105,100,115, 46, 32, 40, 71,114, 97,112, - 104,105, 99, 32,104, 97, 99,107, 32,111,102, 32, 83,117,112,101,114, 32, - 77, 97,114,105,111, 32, 66,114,111,115, 46, 41, 10, 48, 58, 55,100, 55, - 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55,100, 56, 58, 49, 58, 48, - 50, 58, 48, 50, 10, 48, 58, 54, 54, 55, 53, 58, 56, 97, 58, 48, 53, 58, - 48, 53, 10, 10,109,115,104, 58, 10,109,115,104,117, 58, 10,109,115,104, - 97, 58, 10,109,115,104, 98, 58, 10,109,115,104,104, 58, 10,109,115,104, - 106,114, 49, 58, 10,109,115,104,106, 58, 10,109,115,104,117,100, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,114,118,101,108, 32, 83,117,112, - 101,114, 32, 72,101,114,111,101,115, 32, 40, 85, 83, 32, 57, 53, 49, 48, - 50, 52, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, - 41, 32, 40, 98,111,111,116,108,101,103, 41, 10, 48, 58,102,102, 50, 55, - 50, 48, 58, 57,102, 58, 48, 48, 58, 48, 98, 10, 10,109,101,103, 97,109, - 97,110, 50, 58, 10,109,101,103, 97,109, 97,110, 50, 97, 58, 10,109,101, - 103, 97,109,110, 50,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,101, - 103, 97, 32, 77, 97,110, 32, 50, 58, 32, 84,104,101, 32, 80,111,119,101, - 114, 32, 70,105,103,104,116,101,114,115, 32, 40, 85, 83, 65, 32, 57, 54, - 48, 55, 48, 56, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105, - 111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 10, 48, 58,102,102, - 101,102, 99, 48, 58, 49, 49, 56, 58, 48, 48, 58, 48, 50, 10, 48, 58,102, - 102,102, 48, 52, 55, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,104,115,102, - 50, 58, 10,104,115,102, 50,106, 58, 10,104,115,102, 50,106, 49, 58, 10, - 104,115,102, 50,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,121,112, - 101,114, 32, 83,116,114,101,101,116, 32, 70,105,103,104,116,101,114, 32, - 73, 73, 58, 32, 84,104,101, 32, 65,110,110,105,118,101,114,115, 97,114, - 121, 32, 69,100,105,116,105,111,110, 32, 40, 65,115,105, 97, 32, 48, 52, - 48, 50, 48, 50, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105, - 111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 10,104,115,102, 50, - 97, 58, 10, 48, 58,102,102,100, 52, 53, 52, 58, 50,102, 58, 48, 48, 58, - 53, 56, 10, 48, 58,102,102,100, 52, 99, 99, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10,103,105,103, 97,119,105,110,103, 58, 10,103,105,103, 97,119, - 105,110,103,106, 58, 10,103,105,103, 97,119,105,110,103, 97, 58, 10,103, - 105,103, 97,119,105,110,103, 98, 58, 10,103,105,103, 97,119,105,110,103, + 40, 98,111,111,116,108,101,103, 41, 13, 10,109,118,115, 99,117,114, 49, + 58, 13, 10,109,118,115, 99,106,115,105,110,103, 58, 13, 10, 48, 58,102, + 102, 50, 54,102,100, 58, 54, 54, 58,102,102, 58, 48, 48, 13, 10, 13, 10, + 115,107, 97,116,101,107,100,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 86,115, 46, 32, 83,107, 97,116,101, 32, 75,105,100,115, 46, 32, 40, 71, + 114, 97,112,104,105, 99, 32,104, 97, 99,107, 32,111,102, 32, 83,117,112, + 101,114, 32, 77, 97,114,105,111, 32, 66,114,111,115, 46, 41, 13, 10, 48, + 58, 55,100, 55, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55,100, + 56, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, 58, 54, 54, 55, 53, 58, + 56, 97, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10,109,115,104, 58, 13, 10, + 109,115,104,117, 58, 13, 10,109,115,104, 97, 58, 13, 10,109,115,104, 98, + 58, 13, 10,109,115,104,104, 58, 13, 10,109,115,104,106,114, 49, 58, 13, + 10,109,115,104,106, 58, 13, 10,109,115,104,117,100, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 77, 97,114,118,101,108, 32, 83,117,112,101,114, 32, + 72,101,114,111,101,115, 32, 40, 85, 83, 32, 57, 53, 49, 48, 50, 52, 32, + 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, + 98,111,111,116,108,101,103, 41, 13, 10, 48, 58,102,102, 50, 55, 50, 48, + 58, 57,102, 58, 48, 48, 58, 48, 98, 13, 10, 13, 10,109,101,103, 97,109, + 97,110, 50, 58, 13, 10,109,101,103, 97,109, 97,110, 50, 97, 58, 13, 10, + 109,101,103, 97,109,110, 50,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 77,101,103, 97, 32, 77, 97,110, 32, 50, 58, 32, 84,104,101, 32, 80,111, + 119,101,114, 32, 70,105,103,104,116,101,114,115, 32, 40, 85, 83, 65, 32, + 57, 54, 48, 55, 48, 56, 32, 80,104,111,101,110,105,120, 32, 69,100,105, + 116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10, 48, + 58,102,102,101,102, 99, 48, 58, 49, 49, 56, 58, 48, 48, 58, 48, 50, 13, + 10, 48, 58,102,102,102, 48, 52, 55, 58, 49, 58, 48, 49, 58, 48, 49, 13, + 10, 13, 10,104,115,102, 50, 58, 13, 10,104,115,102, 50,106, 58, 13, 10, + 104,115,102, 50,106, 49, 58, 13, 10,104,115,102, 50,100, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 72,121,112,101,114, 32, 83,116,114,101,101,116, + 32, 70,105,103,104,116,101,114, 32, 73, 73, 58, 32, 84,104,101, 32, 65, + 110,110,105,118,101,114,115, 97,114,121, 32, 69,100,105,116,105,111,110, + 32, 40, 65,115,105, 97, 32, 48, 52, 48, 50, 48, 50, 32, 80,104,111,101, + 110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116, + 108,101,103, 41, 13, 10,104,115,102, 50, 97, 58, 13, 10, 48, 58,102,102, + 100, 52, 53, 52, 58, 50,102, 58, 48, 48, 58, 53, 56, 13, 10, 48, 58,102, + 102,100, 52, 99, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103, + 105,103, 97,119,105,110,103, 58, 13, 10,103,105,103, 97,119,105,110,103, + 106, 58, 13, 10,103,105,103, 97,119,105,110,103, 97, 58, 13, 10,103,105, + 103, 97,119,105,110,103, 98, 58, 13, 10,103,105,103, 97,119,105,110,103, 106,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71,105,103, 97, 32, 87, 105,110,103, 32, 40, 74, 97,112, 97,110, 32, 57, 57, 48, 50, 50, 51, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, - 98,111,111,116,108,101,103, 41, 10,103,105,103, 97,119,105,110,103,104, - 58, 10,103,105,103, 97,119,105,110,103,100, 58, 10, 48, 58,102,102, 55, - 48,100, 99, 58, 49, 55, 48, 58, 48, 48, 58, 48, 49, 10, 10,100,115,116, - 108,107, 58, 10,100,115,116,108,107,117, 58, 10,100,115,116,108,107,117, - 114, 49, 58, 10,100,115,116,108,107, 97, 58, 32, 10,118, 97,109,112,106, - 58, 32, 10,118, 97,109,112,106, 97, 58, 32, 10,118, 97,109,112,106,114, - 49, 58, 10,100,115,116,108,107,117, 49,100, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 68, 97,114,107,115,116, 97,108,107,101,114,115, 58, 32, 84, - 104,101, 32, 78,105,103,104,116, 32, 87, 97,114,114,105,111,114,115, 32, - 40, 85, 83, 65, 32, 57, 52, 48, 55, 48, 53, 32, 80,104,111,101,110,105, - 120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101, - 103, 41, 10,100,115,116,108,107,104, 58, 10, 48, 58,102,102,102, 52, 97, - 97, 58, 53, 58, 48, 48, 58, 52, 51, 10, 48, 58,102,102,102, 52, 97,102, - 58, 51, 55, 58, 52, 49, 58, 48, 48, 32, 10, 48, 58,102,102,101, 57, 55, - 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,100,100,115,111,109, 58, 10, - 100,100,115,111,109, 97, 58, 32, 10,100,100,115,111,109, 97,114, 49, 58, - 32, 10,100,100,115,111,109,114, 49, 58, 32, 32, 10,100,100,115,111,109, - 106,114, 49, 58, 32, 32, 10,100,100,115,111,109,106, 58, 32, 32, 10,100, - 100,115,111,109,117,114, 49, 58, 32, 32, 10,100,100,115,111,109,117, 58, - 10,100,100,115,111,109, 98, 58, 10,100,100,115,111,109,114, 51, 58, 10, - 100,100,115,111,109,114, 50, 58, 10,100,100,115,111,109,117,100, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 68,117,110,103,101,111,110,115, 32, 38, - 32, 68,114, 97,103,111,110,115, 58, 32, 83,104, 97,100,111,119, 32,111, - 118,101,114, 32, 77,121,115,116, 97,114, 97, 32, 40, 85, 83, 65, 32, 57, - 54, 48, 54, 49, 57, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116, - 105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 10,100,100,115, - 111,109,104, 58, 32, 32, 10, 48, 58,102,102, 48,102,100, 48, 58, 56, 98, - 58, 49, 50, 58, 48, 57, 10, 10,100,100,116,111,100, 58, 10,100,100,116, - 111,100,117, 58, 10,100,100,116,111,100,104,114, 49, 58, 32, 32, 10,100, - 100,116,111,100,106,114, 49, 58, 32, 32, 10,100,100,116,111,100,106, 58, - 32, 32, 10,100,100,116,111,100,117,114, 49, 58, 32, 10,100,100,116,111, - 100,106,114, 50, 58, 10,100,100,116,111,100,100, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 68,117,110,103,101,111,110,115, 32, 38, 32, 68,114, 97, - 103,111,110,115, 58, 32, 84,111,119,101,114, 32,111,102, 32, 68,111,111, - 109, 32, 40, 69,117,114,111, 32, 57, 52, 48, 52, 49, 50, 32, 80,104,111, - 101,110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111, - 116,108,101,103, 41, 10,100,100,116,111,100, 97, 58, 10,100,100,116,111, - 100, 97,114, 49, 58, 32, 10,100,100,116,111,100,114, 49, 58, 10,100,100, - 116,111,100,104,114, 50, 58, 10,100,100,116,111,100,104, 58, 10, 48, 58, - 102,102, 49, 48, 53, 48, 58, 49,100,100, 58, 48, 97, 58, 49, 48, 10, 10, - 98, 97,116, 99,105,114,106, 58, 10, 98, 97,116, 99,105,114, 97, 58, 10, - 98, 97,116, 99,105,114,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66, - 97,116,116,108,101, 32, 67,105,114, 99,117,105,116, 32, 40, 69,117,114, - 111, 32, 57, 55, 48, 51, 49, 57, 32, 80,104,111,101,110,105,120, 32, 69, - 100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 10, - 98, 97,116, 99,105,114, 58, 10, 48, 58,102,102, 48, 52, 56, 50, 58, 51, - 53, 58, 48, 48, 58, 48, 51, 10, 48, 58,102,102, 48, 52, 98, 55, 58,101, - 51, 58, 48, 51, 58, 48, 48, 10, 10, 97,118,115,112,117, 58, 10, 97,118, - 115,112, 97, 58, 10, 97,118,115,112,106, 58, 10, 97,118,115,112, 58, 10, - 97,118,115,112,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,108,105, - 101,110, 32,118,115, 46, 32, 80,114,101,100, 97,116,111,114, 32, 40, 69, - 117,114,111, 32, 57, 52, 48, 53, 50, 48, 32, 80,104,111,101,110,105,120, - 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, - 41, 10, 97,118,115,112,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65, + 98,111,111,116,108,101,103, 41, 13, 10,103,105,103, 97,119,105,110,103, + 104, 58, 13, 10,103,105,103, 97,119,105,110,103,100, 58, 13, 10, 48, 58, + 102,102, 55, 48,100, 99, 58, 49, 55, 48, 58, 48, 48, 58, 48, 49, 13, 10, + 13, 10,100,115,116,108,107, 58, 13, 10,100,115,116,108,107,117, 58, 13, + 10,100,115,116,108,107,117,114, 49, 58, 13, 10,100,115,116,108,107, 97, + 58, 13, 10,118, 97,109,112,106, 58, 13, 10,118, 97,109,112,106, 97, 58, + 13, 10,118, 97,109,112,106,114, 49, 58, 13, 10,100,115,116,108,107,117, + 49,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68, 97,114,107,115,116, + 97,108,107,101,114,115, 58, 32, 84,104,101, 32, 78,105,103,104,116, 32, + 87, 97,114,114,105,111,114,115, 32, 40, 85, 83, 65, 32, 57, 52, 48, 55, + 48, 53, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, + 41, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,100,115,116,108,107, + 104, 58, 13, 10, 48, 58,102,102,102, 52, 97, 97, 58, 53, 58, 48, 48, 58, + 52, 51, 13, 10, 48, 58,102,102,102, 52, 97,102, 58, 51, 55, 58, 52, 49, + 58, 48, 48, 13, 10, 48, 58,102,102,101, 57, 55, 54, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10,100,100,115,111,109, 58, 13, 10,100,100,115, + 111,109, 97, 58, 13, 10,100,100,115,111,109, 97,114, 49, 58, 13, 10,100, + 100,115,111,109,114, 49, 58, 13, 10,100,100,115,111,109,106,114, 49, 58, + 13, 10,100,100,115,111,109,106, 58, 13, 10,100,100,115,111,109,117,114, + 49, 58, 13, 10,100,100,115,111,109,117, 58, 13, 10,100,100,115,111,109, + 98, 58, 13, 10,100,100,115,111,109,114, 51, 58, 13, 10,100,100,115,111, + 109,114, 50, 58, 13, 10,100,100,115,111,109,117,100, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 68,117,110,103,101,111,110,115, 32, 38, 32, 68,114, + 97,103,111,110,115, 58, 32, 83,104, 97,100,111,119, 32,111,118,101,114, + 32, 77,121,115,116, 97,114, 97, 32, 40, 85, 83, 65, 32, 57, 54, 48, 54, + 49, 57, 32, 80,104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, + 41, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,100,100,115,111,109, + 104, 58, 13, 10, 48, 58,102,102, 48,102,100, 48, 58, 56, 98, 58, 49, 50, + 58, 48, 57, 13, 10, 13, 10,100,100,116,111,100, 58, 13, 10,100,100,116, + 111,100,117, 58, 13, 10,100,100,116,111,100,104,114, 49, 58, 13, 10,100, + 100,116,111,100,106,114, 49, 58, 13, 10,100,100,116,111,100,106, 58, 13, + 10,100,100,116,111,100,117,114, 49, 58, 13, 10,100,100,116,111,100,106, + 114, 50, 58, 13, 10,100,100,116,111,100,100, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 68,117,110,103,101,111,110,115, 32, 38, 32, 68,114, 97,103, + 111,110,115, 58, 32, 84,111,119,101,114, 32,111,102, 32, 68,111,111,109, + 32, 40, 69,117,114,111, 32, 57, 52, 48, 52, 49, 50, 32, 80,104,111,101, + 110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116, + 108,101,103, 41, 13, 10,100,100,116,111,100, 97, 58, 13, 10,100,100,116, + 111,100, 97,114, 49, 58, 13, 10,100,100,116,111,100,114, 49, 58, 13, 10, + 100,100,116,111,100,104,114, 50, 58, 13, 10,100,100,116,111,100,104, 58, + 13, 10, 48, 58,102,102, 49, 48, 53, 48, 58, 49,100,100, 58, 48, 97, 58, + 49, 48, 13, 10, 13, 10, 98, 97,116, 99,105,114,106, 58, 13, 10, 98, 97, + 116, 99,105,114, 97, 58, 13, 10, 98, 97,116, 99,105,114,100, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 66, 97,116,116,108,101, 32, 67,105,114, 99, + 117,105,116, 32, 40, 69,117,114,111, 32, 57, 55, 48, 51, 49, 57, 32, 80, + 104,111,101,110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98, + 111,111,116,108,101,103, 41, 13, 10, 98, 97,116, 99,105,114, 58, 13, 10, + 48, 58,102,102, 48, 52, 56, 50, 58, 51, 53, 58, 48, 48, 58, 48, 51, 13, + 10, 48, 58,102,102, 48, 52, 98, 55, 58,101, 51, 58, 48, 51, 58, 48, 48, + 13, 10, 13, 10, 97,118,115,112,117, 58, 13, 10, 97,118,115,112, 97, 58, + 13, 10, 97,118,115,112,106, 58, 13, 10, 97,118,115,112, 58, 13, 10, 97, + 118,115,112,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,108,105,101, + 110, 32,118,115, 46, 32, 80,114,101,100, 97,116,111,114, 32, 40, 69,117, + 114,111, 32, 57, 52, 48, 53, 50, 48, 32, 80,104,111,101,110,105,120, 32, + 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, + 13, 10, 97,118,115,112,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65, 108,105,101,110, 32,118,115, 46, 32, 80,114,101,100, 97,116,111,114, 32, - 40, 72,105,115,112, 97,110,105, 99, 32, 57, 52, 48, 53, 50, 48, 41, 10, - 48, 58,102,102,101, 97, 99, 48, 58, 51, 49,100, 58, 48, 49, 58, 48, 49, - 10, 48, 58,102,102,101,100,100, 97, 58, 49, 58, 52, 52, 58, 52, 52, 10, - 10, 49, 57,120,120, 58, 10, 49, 57,120,120, 97,114, 49, 58, 10, 49, 57, - 120,120,106, 58, 10, 49, 57,120,120, 97, 58, 10, 49, 57,120,120,104, 58, - 10, 49, 57,120,120,106,114, 50, 58, 10, 49, 57,120,120,106,114, 49, 58, - 32, 32, 10, 49, 57,120,120, 98, 58, 32, 32, 10, 49, 57,120,120,100, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 49, 57, 88, 88, 58, 32, 84,104,101, - 32, 87, 97,114, 32, 65,103, 97,105,110,115,116, 32, 68,101,115,116,105, - 110,121, 32, 40, 85, 83, 65, 32, 57, 53, 49, 50, 48, 55, 32, 80,104,111, - 101,110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111, - 116,108,101,103, 41, 10, 48, 58,102,102, 52,100, 99, 97, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58,102,102, 48, 52, 52, 51, 58, 57,102, 58, 49, - 52, 58, 55, 48, 10, 10, 49, 57, 52, 52, 58, 10, 49, 57, 52, 52,106, 58, + 40, 72,105,115,112, 97,110,105, 99, 32, 57, 52, 48, 53, 50, 48, 41, 13, + 10, 48, 58,102,102,101, 97, 99, 48, 58, 51, 49,100, 58, 48, 49, 58, 48, + 49, 13, 10, 48, 58,102,102,101,100,100, 97, 58, 49, 58, 52, 52, 58, 52, + 52, 13, 10, 13, 10, 49, 57,120,120, 58, 13, 10, 49, 57,120,120, 97,114, + 49, 58, 13, 10, 49, 57,120,120,106, 58, 13, 10, 49, 57,120,120, 97, 58, + 13, 10, 49, 57,120,120,104, 58, 13, 10, 49, 57,120,120,106,114, 50, 58, + 13, 10, 49, 57,120,120,106,114, 49, 58, 32, 32, 13, 10, 49, 57,120,120, + 98, 58, 32, 32, 13, 10, 49, 57,120,120,100, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 49, 57, 88, 88, 58, 32, 84,104,101, 32, 87, 97,114, 32, 65, + 103, 97,105,110,115,116, 32, 68,101,115,116,105,110,121, 32, 40, 85, 83, + 65, 32, 57, 53, 49, 50, 48, 55, 32, 80,104,111,101,110,105,120, 32, 69, + 100,105,116,105,111,110, 41, 32, 40, 98,111,111,116,108,101,103, 41, 13, + 10, 48, 58,102,102, 52,100, 99, 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,102,102, 48, 52, 52, 51, 58, 57,102, 58, 49, 52, 58, 55, 48, + 13, 10, 13, 10, 49, 57, 52, 52, 58, 13, 10, 49, 57, 52, 52,106, 58, 13, 10, 49, 57, 52, 52,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 49, 57, 52, 52, 58, 32, 84,104,101, 32, 76,111,111,112, 32, 77, 97,115,116,101, 114, 32, 40, 85, 83, 65, 32, 48, 48, 48, 54, 50, 48, 32, 80,104,111,101, 110,105,120, 32, 69,100,105,116,105,111,110, 41, 32, 40, 98,111,111,116, - 108,101,103, 41, 10, 48, 58, 57, 50, 49,100, 57, 48, 58, 98, 56, 58, 48, - 49, 58, 49, 56, 10, 10,102,105,114,101,115,104,114,107, 58, 10,102,105, - 114,101,115,104,114,107,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70, - 105,114,101, 32, 83,104, 97,114,107, 32, 40, 75,111,114,101, 97, 44, 32, - 115,101,116, 32, 49, 44, 32,101, 97,115,105,101,114, 41, 10,102,105,114, - 101,115,104,114,107,100,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70, - 105,114,101, 32, 83,104, 97,114,107, 32, 40, 75,111,114,101, 97, 44, 32, - 115,101,116, 32, 50, 44, 32,104, 97,114,100,101,114, 41, 10,102,105,114, - 101,115,104,114,107, 97, 58, 10, 48, 58, 99, 49, 97,101, 56, 58, 49, 57, - 52, 58, 48, 48, 58, 48, 49, 10, 48, 58, 99, 49, 99, 50, 57, 58, 49, 58, - 50,100, 58, 50,100, 10, 48, 58, 99, 49,100, 99, 53, 58, 49,100, 58, 50, - 100, 58, 48, 48, 10, 10, 51,119,111,110,100,101,114,115, 58, 10,119,111, - 110,100,101,114, 51, 58, 10, 51,119,111,110,100,101,114,115,117, 58, 10, - 51,119,111,110,100,101,114,115,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 84,104,114,101,101, 32, 87,111,110,100,101,114,115, 32, 40,104, 97, - 99,107, 63, 41, 10, 51,119,111,110,100,101,114,115,114, 49, 58, 10, 51, - 119,111,110,100,101,114,115, 98, 58, 10, 48, 58,102,102,100, 48, 99,101, - 58, 49, 52, 58,102,102, 58, 51, 54, 10, 48, 58,102,102,100, 48,102, 54, - 58, 53, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,100, 49, 57, 54, - 58, 50, 56, 58,102,102, 58, 48, 54, 10, 48, 58,102,102,100, 49, 98,101, - 58, 53, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,100, 50, 53,101, - 58, 50, 56, 58,102,102, 58, 99,101, 10, 48, 58,102,102,100, 50, 56, 54, - 58, 53, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 48,100, 97,101, - 58, 48, 99, 58, 48, 48, 58, 48, 48, 10, 10,116,110,122,115, 58, 10,116, - 110,122,115, 98, 58, 10,116,110,122,115,106, 58, 10,116,110,122,115,106, - 110, 58, 10,116,110,122,115,106,111, 58, 10, 48, 58,101, 54, 56,100, 58, - 50, 51, 58, 48, 48, 58, 53, 53, 10,116,110,122,115,111, 58, 10,116,110, - 122,115,111,112, 58, 10, 48, 58,101, 99, 48, 97, 58, 50, 51, 58, 48, 48, - 58, 53, 53, 10, 10, 98,111,111,103,119,105,110,103, 58, 10, 98,111,111, - 103,119,105,110,103, 97, 58, 32, 32, 10,114, 97,103,116,105,109,101, 58, - 32, 10,114, 97,103,116,105,109,101, 97, 58, 10, 98,111,111,103,119,105, - 110,103,117, 58, 10, 48, 58, 50, 48, 48,102, 52, 97, 58, 50, 55, 58, 48, - 48, 58, 48, 98, 10, 10,109, 97,114, 98,108,101, 58, 10,109, 97,114, 98, - 108,101, 50, 58, 10,109, 97,114, 98,108,101, 51, 58, 10,109, 97,114, 98, - 108,101, 52, 58, 10,109, 97,114, 98,108,101, 53, 58, 10, 48, 58, 52, 48, - 49,101, 57, 50, 58, 51, 50, 58, 48, 48, 58, 51, 97, 10, 10,105,109, 97, - 103,111, 97, 58, 10,105,109, 97,103,111, 58, 10, 48, 58, 99, 53, 50, 49, - 58, 52, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 53, 54, 53, 58, 49, - 58, 48, 49, 58, 48, 49, 10, 10,100,100,114, 97,103,111,110, 58, 32, 10, - 100,100,114, 97,103,111,110, 98, 58, 10,100,100,114, 97,103,111,110,117, - 58, 10,100,100,114, 97,103,111,110,119, 58, 32, 32, 10,100,100,114, 97, - 103,111,110,119, 49, 58, 32, 32, 10,100,100,114, 97,103,111,110,117, 97, - 58, 10,100,100,114, 97,103,111,110, 98, 97, 58, 32, 32, 10,100,100,114, - 97,103,111,110, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111, - 117, 98,108,101, 32, 68,114, 97,103,111,110, 32, 40, 98,111,111,116,108, - 101,103, 41, 10,100,100,114, 97,103,111,110,117, 98, 58, 10, 48, 58, 48, - 101, 55, 51, 58, 49,101, 58, 48, 50, 58, 50, 99, 10, 48, 58, 48, 48, 50, - 51, 58, 51, 58, 48, 50, 58, 48, 48, 10, 10,115,116, 97,114,102,111,114, - 99, 58, 10,115,116, 97,114,102,111,114, 99,101, 58, 10,109,101,103, 97, - 102,111,114, 99, 58, 10,115,116, 97,114,102,111,114, 99, 98, 58, 10,115, - 116, 97,114,102,111,114, 99, 97, 58, 10, 48, 58, 56, 48, 51, 56, 58, 55, - 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 51, 52, 56, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 57, 50, 54, 49, 58, 49, 58, 50, 51, 58, 50, - 51, 10, 48, 58, 57, 50, 52, 49, 58, 49, 58, 50, 51, 58, 50, 51, 10, 48, - 58, 57, 50, 50, 49, 58, 49, 58, 50, 51, 58, 50, 51, 10, 48, 58, 57, 50, - 48, 49, 58, 49, 58, 49,100, 58, 49,100, 10, 48, 58, 57, 49,101, 49, 58, - 49, 58, 49, 56, 58, 49, 56, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 50, - 49, 58, 50, 49, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 49, 56, 58, 49, - 56, 10, 48, 58, 57, 49, 56, 49, 58, 49, 58, 49, 56, 58, 49, 56, 10, 10, - 99, 99, 97,115,116,108,101,115, 58, 10, 99, 99, 97,115,116,108,101,115, - 51, 58, 10, 99, 99, 97,115,116,108,101,115,106, 58, 10, 99, 99, 97,115, - 116,108,101,115, 49, 58, 10, 99, 99, 97,115,116,108,101,115, 50, 58, 10, - 99, 99, 97,115,116,108,101,115,102, 58, 10, 99, 99, 97,115,116,108,101, - 115,103, 58, 10, 99, 99, 97,115,116,108,101,115,112, 58, 10, 48, 58, 52, - 55, 52, 58, 53,100,100, 58, 48, 48, 58, 53, 53, 10, 48, 58,100, 50, 58, - 49, 58, 48, 51, 58, 48, 51, 10, 10, 97, 98, 97,116,116,108,101, 58, 32, - 32, 10, 97, 98, 97,116,116,108,101, 50, 58, 10, 97,115,116,114,111,102, - 58, 10, 97, 99,111,109, 98, 97,116, 51, 58, 10, 97,115,116,114,111,102, - 50, 58, 10, 97,115,116,114,111,102, 51, 58, 10, 97,102,105,114,101, 58, - 32, 32, 10, 97, 99,111,109, 98, 97,116, 58, 10, 97, 99,111,109, 98, 97, - 116,111, 58, 32, 32, 10,115,115,116, 97,114, 98,116,108, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 83,117,112,101,114, 32, 83,116, 97,114, 32, 66, - 97,116,116,108,101, 10, 48, 58, 48, 48, 56, 52, 58, 50, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 50, 54, 56, 58, 53, 58, 99, 49, 58, 99, 49, 10, - 48, 58, 52, 50, 55, 48, 58, 53, 58, 99, 49, 58, 99, 49, 10, 48, 58, 52, - 50, 55, 56, 58, 53, 58, 99, 49, 58, 99, 49, 10, 48, 58, 52, 50, 56, 48, - 58, 53, 58, 99, 49, 58, 99, 49, 10, 48, 58, 52, 50, 56, 56, 58, 53, 58, - 99, 49, 58, 99, 49, 10, 10,116,105,103,101,114,104, 98, 49, 58, 10,116, - 105,103,101,114,104, 98, 50, 58, 10,116,105,103,101,114,104, 58, 10,116, - 105,103,101,114,104,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,105, - 103,101,114, 32,104,101,108,105, 32, 40,106, 97,112, 97,110, 41, 10,116, - 105,103,101,114,104, 98, 51, 58, 10, 48, 58, 99, 48,100, 98, 58, 52, 57, - 58, 48, 48, 58, 48, 50, 10, 48, 58, 99, 49, 53, 97, 58, 54, 58, 50,100, - 58, 48, 48, 10, 10,119,111,102, 58, 10,119,111,102,117, 58, 10,119,111, - 102, 97, 58, 10,119,111,102,106, 58, 10,119,111,102,104,102,104, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 83, 97,110,103,111,107,117,115,104,105, - 32, 73, 73, 58, 32, 72,117,111, 32, 70,101,110,103,104,117, 97,110,103, - 32, 40, 67,104,105,110,101,115,101, 32, 98,111,111,116,108,101,103, 41, - 10,119,111,102,114, 49, 58, 10,119,111,102,104,102, 98, 58, 10, 48, 58, - 102,102, 54, 51, 54, 56, 58, 48, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 102,102, 55, 55,100, 56, 58, 55, 56, 58,102,102, 58, 49, 48, 10, 48, 58, - 102,102, 54, 51,100, 52, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,110, - 105,103,104,116,115,116,114, 58, 10,110,105,103,104,116,115,116,114,106, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,105,103,104,116, 32, 83,116, - 114,105,107,101,114, 32, 40, 74, 97,112, 97,110, 41, 10,110,105,103,104, - 116,115,116,114,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,105,103, - 104,116, 32, 83,116,114,105,107,101,114, 32, 40, 85,115, 41, 10, 48, 58, - 49, 48, 57, 98, 57, 97, 58, 52, 58, 48, 48, 58, 52, 48, 10, 48, 58, 49, - 48,100,101, 52, 56, 58, 49,102, 51, 58, 48, 48, 58, 52, 49, 10, 10,109, - 108, 97,110,100,101,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,111, - 111,110, 32, 76, 97,110,100,101,114, 32, 40, 98,111,111,116,108,101,103, - 32,111,102, 32, 76,117,110, 97,114, 32, 82,101,115, 99,117,101, 41, 10, - 48, 58, 50, 48, 99, 48, 58, 49, 58, 48, 97, 58, 48, 97, 10, 48, 58, 50, - 48, 99,102, 58, 97, 58, 49, 98, 58, 49, 98, 10, 48, 58, 50, 48,102, 52, - 58, 50, 58, 48, 48, 58, 48, 53, 10, 10,103, 97,108, 97,115,116,114,109, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71, 97,108, 97, 99,116,105, 99, - 32, 83,116,111,114,109, 32, 40, 74, 97,112, 97,110, 41, 10, 48, 58, 50, - 48, 50, 49, 48, 48, 58, 49, 57, 48, 58, 48, 49, 58, 54, 49, 10, 10, 99, - 97,112,116, 99,111,109,109, 58, 10, 99, 97,112,116, 99,111,109,109,117, - 58, 32, 10, 99, 97,112,116, 99,111,109,109,106, 58, 10, 99, 97,112,116, - 99,111,109,109, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97,112, - 116, 97,105,110, 32, 67,111,109,109, 97,110,100,111, 32, 40, 98,111,111, - 116,108,101,103, 41, 10, 99, 97,112,116, 99,111,109,109,114, 49, 58, 10, - 99, 97,112,116, 99,111,109,109,106,114, 49, 58, 32, 10, 48, 58,102,102, - 48, 48, 48, 48, 58, 49, 57, 48, 58, 48, 56, 58, 48, 48, 10, 48, 58,102, - 102, 48, 49, 56,100, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58,102,102, - 97, 56, 99, 50, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,109,112, 97, - 110,103,106, 58, 10,109,112, 97,110,103, 58, 10,109,112, 97,110,103,117, - 58, 10,109,112, 97,110,103,114, 49, 58, 10, 48, 58,102,102, 56, 49, 55, - 99, 58, 49,101, 48, 58, 48, 48, 58, 48, 49, 10, 10,115,109,103,112, 58, - 10,115,109,103,112,106, 97, 58, 10,115,109,103,112,106, 58, 10,115,109, - 103,112,117, 51, 58, 10,115,109,103,112,117, 50, 58, 10,115,109,103,112, - 117, 49, 58, 10,115,109,103,112,117, 58, 10,115,109,103,112, 53, 58, 10, - 115,109,103,112, 54, 58, 10,115,109,103,112, 53,100, 58, 10,115,109,103, - 112, 54,100, 58, 10,115,109,103,112,100, 58, 10,115,109,103,112,106,100, - 58, 10,115,109,103,112,117, 49,100, 58, 10,115,109,103,112,117, 50,100, - 58, 10,115,109,103,112,117,100, 58, 10, 48, 58,102,102,102, 53, 48, 48, - 58, 55,101, 58, 50, 49, 58, 48, 50, 10, 48, 58,102,102,102,101, 56, 53, - 58, 49, 58, 48, 56, 58, 48, 56, 10, 10,119,114, 97,108,108,121, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,119,111,114,108,100, 32,114, 97,108,108, - 121, 32, 40,115,101,116, 49, 41, 10,119,114, 97,108,108,121, 97, 58, 32, + 108,101,103, 41, 13, 10, 48, 58, 57, 50, 49,100, 57, 48, 58, 98, 56, 58, + 48, 49, 58, 49, 56, 13, 10, 13, 10,102,105,114,101,115,104,114,107, 58, + 13, 10,102,105,114,101,115,104,114,107,100, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 70,105,114,101, 32, 83,104, 97,114,107, 32, 40, 75,111,114, + 101, 97, 44, 32,115,101,116, 32, 49, 44, 32,101, 97,115,105,101,114, 41, + 13, 10,102,105,114,101,115,104,114,107,100,104, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 70,105,114,101, 32, 83,104, 97,114,107, 32, 40, 75,111, + 114,101, 97, 44, 32,115,101,116, 32, 50, 44, 32,104, 97,114,100,101,114, + 41, 13, 10,102,105,114,101,115,104,114,107, 97, 58, 13, 10, 48, 58, 99, + 49, 97,101, 56, 58, 49, 57, 52, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, + 99, 49, 99, 50, 57, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, 99, + 49,100, 99, 53, 58, 49,100, 58, 50,100, 58, 48, 48, 13, 10, 13, 10, 51, + 119,111,110,100,101,114,115, 58, 13, 10,119,111,110,100,101,114, 51, 58, + 13, 10, 51,119,111,110,100,101,114,115,117, 58, 13, 10, 51,119,111,110, + 100,101,114,115,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,114, + 101,101, 32, 87,111,110,100,101,114,115, 32, 40,104, 97, 99,107, 63, 41, + 13, 10, 51,119,111,110,100,101,114,115,114, 49, 58, 13, 10, 51,119,111, + 110,100,101,114,115, 98, 58, 13, 10, 48, 58,102,102,100, 48, 99,101, 58, + 49, 52, 58,102,102, 58, 51, 54, 13, 10, 48, 58,102,102,100, 48,102, 54, + 58, 53, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,100, 49, 57, + 54, 58, 50, 56, 58,102,102, 58, 48, 54, 13, 10, 48, 58,102,102,100, 49, + 98,101, 58, 53, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,100, + 50, 53,101, 58, 50, 56, 58,102,102, 58, 99,101, 13, 10, 48, 58,102,102, + 100, 50, 56, 54, 58, 53, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, + 102, 48,100, 97,101, 58, 48, 99, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 116,110,122,115, 58, 13, 10,116,110,122,115, 98, 58, 13, 10,116,110,122, + 115,106, 58, 13, 10,116,110,122,115,106,110, 58, 13, 10,116,110,122,115, + 106,111, 58, 13, 10, 48, 58,101, 54, 56,100, 58, 50, 51, 58, 48, 48, 58, + 53, 53, 13, 10,116,110,122,115,111, 58, 13, 10,116,110,122,115,111,112, + 58, 13, 10, 48, 58,101, 99, 48, 97, 58, 50, 51, 58, 48, 48, 58, 53, 53, + 13, 10, 13, 10, 98,111,111,103,119,105,110,103, 58, 13, 10, 98,111,111, + 103,119,105,110,103, 97, 58, 13, 10,114, 97,103,116,105,109,101, 58, 13, + 10,114, 97,103,116,105,109,101, 97, 58, 13, 10, 98,111,111,103,119,105, + 110,103,117, 58, 13, 10, 48, 58, 50, 48, 48,102, 52, 97, 58, 50, 55, 58, + 48, 48, 58, 48, 98, 13, 10, 13, 10,109, 97,114, 98,108,101, 58, 13, 10, + 109, 97,114, 98,108,101, 50, 58, 13, 10,109, 97,114, 98,108,101, 51, 58, + 13, 10,109, 97,114, 98,108,101, 52, 58, 13, 10,109, 97,114, 98,108,101, + 53, 58, 13, 10, 48, 58, 52, 48, 49,101, 57, 50, 58, 51, 50, 58, 48, 48, + 58, 51, 97, 13, 10, 13, 10, 59, 42, 42, 32, 67,111,109,109,101,110,116, + 101,100, 32,111,117,116, 32, 98,101, 99, 97,117,115,101, 32,101,118,101, + 110,116,117, 97,108,108,121, 32,105,116, 32,115, 97,118,101,115, 32, 98, + 97,100, 32,118, 97,108,117,101,115, 32, 97,110,100, 32,108,111, 99,107, + 115, 32,111,117,116, 32,116,104,101, 32,104,105,103,104, 32,115, 99,111, + 114,101, 32,115, 99,114,101,101,110, 32, 42, 42, 13, 10, 59, 42, 42,105, + 109, 97,103,111, 97, 58, 13, 10, 59, 42, 42,105,109, 97,103,111, 58, 13, + 10, 59, 42, 42, 48, 58, 99, 53, 50, 49, 58, 52, 97, 58, 48, 48, 58, 48, + 48, 13, 10, 59, 42, 42, 48, 58, 99, 53, 54, 53, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 13, 10,100,100,114, 97,103,111,110, 58, 13, 10,100,100, + 114, 97,103,111,110, 98, 58, 13, 10,100,100,114, 97,103,111,110,117, 58, + 13, 10,100,100,114, 97,103,111,110,119, 58, 13, 10,100,100,114, 97,103, + 111,110,119, 49, 58, 13, 10,100,100,114, 97,103,111,110,117, 97, 58, 13, + 10,100,100,114, 97,103,111,110, 98, 97, 58, 13, 10,100,100,114, 97,103, + 111,110, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111,117, 98, + 108,101, 32, 68,114, 97,103,111,110, 32, 40, 98,111,111,116,108,101,103, + 41, 13, 10,100,100,114, 97,103,111,110,117, 98, 58, 13, 10, 48, 58, 48, + 101, 55, 51, 58, 49,101, 58, 48, 50, 58, 50, 99, 13, 10, 48, 58, 48, 48, + 50, 51, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10,115,116, 97,114, + 102,111,114, 99, 58, 13, 10,115,116, 97,114,102,111,114, 99,101, 58, 13, + 10,109,101,103, 97,102,111,114, 99, 58, 13, 10,115,116, 97,114,102,111, + 114, 99, 98, 58, 13, 10,115,116, 97,114,102,111,114, 99, 97, 58, 13, 10, + 48, 58, 56, 48, 51, 56, 58, 55, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 56, 51, 52, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, + 50, 54, 49, 58, 49, 58, 50, 51, 58, 50, 51, 13, 10, 48, 58, 57, 50, 52, + 49, 58, 49, 58, 50, 51, 58, 50, 51, 13, 10, 48, 58, 57, 50, 50, 49, 58, + 49, 58, 50, 51, 58, 50, 51, 13, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, + 49,100, 58, 49,100, 13, 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 49, 56, + 58, 49, 56, 13, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 50, 49, 58, 50, + 49, 13, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 49, 56, 58, 49, 56, 13, + 10, 48, 58, 57, 49, 56, 49, 58, 49, 58, 49, 56, 58, 49, 56, 13, 10, 13, + 10, 99, 99, 97,115,116,108,101,115, 58, 13, 10, 99, 99, 97,115,116,108, + 101,115, 51, 58, 13, 10, 99, 99, 97,115,116,108,101,115,106, 58, 13, 10, + 99, 99, 97,115,116,108,101,115, 49, 58, 13, 10, 99, 99, 97,115,116,108, + 101,115, 50, 58, 13, 10, 99, 99, 97,115,116,108,101,115,102, 58, 13, 10, + 99, 99, 97,115,116,108,101,115,103, 58, 13, 10, 99, 99, 97,115,116,108, + 101,115,112, 58, 13, 10, 48, 58, 52, 55, 52, 58, 53,100,100, 58, 48, 48, + 58, 53, 53, 13, 10, 48, 58,100, 50, 58, 49, 58, 48, 51, 58, 48, 51, 13, + 10, 13, 10, 97, 98, 97,116,116,108,101, 58, 13, 10, 97, 98, 97,116,116, + 108,101, 50, 58, 13, 10, 97,115,116,114,111,102, 58, 13, 10, 97, 99,111, + 109, 98, 97,116, 51, 58, 13, 10, 97,115,116,114,111,102, 50, 58, 13, 10, + 97,115,116,114,111,102, 51, 58, 13, 10, 97,102,105,114,101, 58, 13, 10, + 97, 99,111,109, 98, 97,116, 58, 13, 10, 97, 99,111,109, 98, 97,116,111, + 58, 13, 10,115,115,116, 97,114, 98,116,108, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 83,117,112,101,114, 32, 83,116, 97,114, 32, 66, 97,116,116, + 108,101, 13, 10, 48, 58, 48, 48, 56, 52, 58, 50, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 50, 54, 56, 58, 53, 58, 99, 49, 58, 99, 49, 13, 10, + 48, 58, 52, 50, 55, 48, 58, 53, 58, 99, 49, 58, 99, 49, 13, 10, 48, 58, + 52, 50, 55, 56, 58, 53, 58, 99, 49, 58, 99, 49, 13, 10, 48, 58, 52, 50, + 56, 48, 58, 53, 58, 99, 49, 58, 99, 49, 13, 10, 48, 58, 52, 50, 56, 56, + 58, 53, 58, 99, 49, 58, 99, 49, 13, 10, 13, 10,116,105,103,101,114,104, + 98, 49, 58, 13, 10,116,105,103,101,114,104, 98, 50, 58, 13, 10,116,105, + 103,101,114,104, 58, 13, 10,116,105,103,101,114,104,106, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,116,105,103,101,114, 32,104,101,108,105, 32, 40, + 106, 97,112, 97,110, 41, 13, 10,116,105,103,101,114,104, 98, 51, 58, 13, + 10, 48, 58, 99, 48,100, 98, 58, 52, 57, 58, 48, 48, 58, 48, 50, 13, 10, + 48, 58, 99, 49, 53, 97, 58, 54, 58, 50,100, 58, 48, 48, 13, 10, 13, 10, + 119,111,102, 58, 13, 10,119,111,102,117, 58, 13, 10,119,111,102, 97, 58, + 13, 10,119,111,102,106, 58, 13, 10,119,111,102,104,102,104, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 83, 97,110,103,111,107,117,115,104,105, 32, + 73, 73, 58, 32, 72,117,111, 32, 70,101,110,103,104,117, 97,110,103, 32, + 40, 67,104,105,110,101,115,101, 32, 98,111,111,116,108,101,103, 41, 13, + 10,119,111,102,114, 49, 58, 13, 10,119,111,102,104,102, 98, 58, 13, 10, + 48, 58,102,102, 54, 51, 54, 56, 58, 48, 97, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,102,102, 55, 55,100, 56, 58, 55, 56, 58,102,102, 58, 49, 48, + 13, 10, 48, 58,102,102, 54, 51,100, 52, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,110,105,103,104,116,115,116,114, 58, 13, 10,110,105, + 103,104,116,115,116,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78, + 105,103,104,116, 32, 83,116,114,105,107,101,114, 32, 40, 74, 97,112, 97, + 110, 41, 13, 10,110,105,103,104,116,115,116,114,117, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 78,105,103,104,116, 32, 83,116,114,105,107,101,114, + 32, 40, 85,115, 41, 13, 10, 48, 58, 49, 48, 57, 98, 57, 97, 58, 52, 58, + 48, 48, 58, 52, 48, 13, 10, 48, 58, 49, 48,100,101, 52, 56, 58, 49,102, + 51, 58, 48, 48, 58, 52, 49, 13, 10, 13, 10,109,108, 97,110,100,101,114, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,111,111,110, 32, 76, 97,110, + 100,101,114, 32, 40, 98,111,111,116,108,101,103, 32,111,102, 32, 76,117, + 110, 97,114, 32, 82,101,115, 99,117,101, 41, 13, 10, 48, 58, 50, 48, 99, + 48, 58, 49, 58, 48, 97, 58, 48, 97, 13, 10, 48, 58, 50, 48, 99,102, 58, + 97, 58, 49, 98, 58, 49, 98, 13, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, + 48, 48, 58, 48, 53, 13, 10, 13, 10,103, 97,108, 97,115,116,114,109, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 71, 97,108, 97, 99,116,105, 99, 32, + 83,116,111,114,109, 32, 40, 74, 97,112, 97,110, 41, 13, 10, 48, 58, 50, + 48, 50, 49, 48, 48, 58, 49, 57, 48, 58, 48, 49, 58, 54, 49, 13, 10, 13, + 10, 99, 97,112,116, 99,111,109,109, 58, 13, 10, 99, 97,112,116, 99,111, + 109,117, 58, 13, 10, 99, 97,112,116, 99,111,109,106, 58, 13, 10, 99, 97, + 112,116, 99,111,109,109, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, + 97,112,116, 97,105,110, 32, 67,111,109,109, 97,110,100,111, 32, 40, 98, + 111,111,116,108,101,103, 41, 13, 10, 99, 97,112,116, 99,111,109,109,114, + 49, 58, 13, 10, 99, 97,112,116, 99,111,109,109,106,114, 49, 58, 13, 10, + 48, 58,102,102, 48, 48, 48, 48, 58, 49, 57, 48, 58, 48, 56, 58, 48, 48, + 13, 10, 48, 58,102,102, 48, 49, 56,100, 58, 49, 58, 48, 49, 58, 48, 49, + 13, 10, 48, 58,102,102, 97, 56, 99, 50, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,109,112, 97,110,103,106, 58, 13, 10,109,112, 97,110, + 103, 58, 13, 10,109,112, 97,110,103,117, 58, 13, 10,109,112, 97,110,103, + 114, 49, 58, 13, 10, 48, 58,102,102, 56, 49, 55, 99, 58, 49,101, 48, 58, + 48, 48, 58, 48, 49, 13, 10, 13, 10,115,109,103,112, 58, 13, 10,115,109, + 103,112,106, 97, 58, 13, 10,115,109,103,112,106, 58, 13, 10,115,109,103, + 112,117, 51, 58, 13, 10,115,109,103,112,117, 50, 58, 13, 10,115,109,103, + 112,117, 49, 58, 13, 10,115,109,103,112,117, 58, 13, 10,115,109,103,112, + 53, 58, 13, 10,115,109,103,112, 54, 58, 13, 10,115,109,103,112, 53,100, + 58, 13, 10,115,109,103,112, 54,100, 58, 13, 10,115,109,103,112,100, 58, + 13, 10,115,109,103,112,106,100, 58, 13, 10,115,109,103,112,117, 49,100, + 58, 13, 10,115,109,103,112,117, 50,100, 58, 13, 10,115,109,103,112,117, + 100, 58, 13, 10, 48, 58,102,102,102, 53, 48, 48, 58, 55,101, 58, 50, 49, + 58, 48, 50, 13, 10, 48, 58,102,102,102,101, 56, 53, 58, 49, 58, 48, 56, + 58, 48, 56, 13, 10, 13, 10,119,114, 97,108,108,121, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,119,111,114,108,100, 32,114, 97,108,108,121, 32, 40, + 115,101,116, 49, 41, 13, 10,119,114, 97,108,108,121, 97, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,119,111,114,108,100, 32,114, 97,108,108,121, 32, + 40,115,101,116, 32, 50, 41, 13, 10,119,114, 97,108,108,121, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,119,111,114,108,100, 32,114, 97,108,108, - 121, 32, 40,115,101,116, 32, 50, 41, 10,119,114, 97,108,108,121, 98, 58, - 32, 32,108, 42, 42, 42, 42, 42, 42,119,111,114,108,100, 32,114, 97,108, - 108,121, 32, 40,117,115, 44, 32, 57, 51, 48, 50, 49, 55, 41, 10,119,114, - 97,108,108,121, 97,116, 58, 10, 48, 58,102,101,102, 53, 53, 56, 58, 50, - 56, 56, 58, 53, 97, 58,102,102, 10, 10,103,104,111,120, 58, 10,103,104, - 111,120, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71,104,111,120, 32, - 40,115,101,116, 32, 50, 41, 10, 48, 58, 56, 48, 53, 97, 50, 58, 54, 52, - 58, 48, 48, 58, 56,101, 10, 48, 58, 56, 48, 48, 48, 54, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10,100,101,109,111,110,119,108,100, 58, 10,100,101, - 109,111,110,119,108,100, 49, 58, 32, 32, 10,100,101,109,111,110,119,108, - 100, 52, 58, 32, 32, 10,100,101,109,111,110,119,108,100, 51, 58, 32, 32, - 10,100,101,109,111,110,119,108,100, 50, 58, 10, 48, 58, 99, 48, 48, 49, - 99, 50, 58, 99, 56, 58, 48, 48, 58, 50,100, 10, 48, 58, 99, 48, 48, 49, - 98,101, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,112, 97,112,114, 97,122, - 122,105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80, 97,112, 97,114, 97, - 122,122,105, 10, 48, 58,102,102, 48,100, 57, 57, 58, 50, 55, 58, 52, 49, - 58, 51, 99, 10, 10,104,101, 97,116, 98,114,108, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 72,101, 97,116,101,100, 32, 66, 97,114,114,101,108, 32, - 40, 87,111,114,108,100, 32,118,101,114,115,105,111,110, 32, 51, 41, 10, - 104,101, 97,116, 98,114,108,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 72,101, 97,116,101,100, 32, 66, 97,114,114,101,108, 32, 40,117,115, 41, - 10,104,101, 97,116, 98,114,108,111, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 72,101, 97,116,101,100, 32, 66, 97,114,114,101,108, 32, 40,119,111, - 114,108,100, 32,111,108,100, 32,118,101,114,115,105,111,110, 41, 10,104, - 101, 97,116, 98,114,108, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, - 101, 97,116,101,100, 32, 66, 97,114,114,101,108, 32, 40,119,111,114,108, - 100, 32,118,101,114,115,105,111,110, 32, 50, 41, 10,104,101, 97,116, 98, - 114,108,101, 58, 10, 48, 58, 49, 48, 56, 50, 57, 54, 58, 54, 51, 58, 52, - 98, 58, 48, 49, 10, 48, 58, 49, 48, 56, 48, 51, 54, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 10,102,102,105,103,104,116, 58, 10,102,102,105,103,104, - 116,106, 58, 10,102,102,105,103,104,116,106,104, 58, 10,102,102,105,103, - 104,116, 98,108, 58, 10,102,102,105,103,104,116, 98,108, 97, 58, 10, 48, - 58,102,102, 56, 53, 48, 99, 58, 51, 99, 58,102,102, 58, 48, 48, 10, 48, - 58,102,102, 56, 48, 97, 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, - 102,102,105,103,104,116,106, 51, 58, 10, 48, 58,102,102, 56, 53, 48, 99, - 58, 51, 99, 58,102,102, 58, 48, 48, 10, 48, 58,102,102, 56, 48, 97, 48, - 58, 48, 52, 58, 48, 48, 58, 48, 51, 10, 10,102,102,105,103,104,116,106, - 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70,105,110, 97,108, 32, 70, - 105,103,104,116, 32, 40, 74, 97,112, 97,110, 32, 57, 48, 48, 49, 49, 50, - 41, 10,102,102,105,103,104,116,106, 49, 58, 10,102,102,105,103,104,116, - 117, 97, 58, 10,102,102,105,103,104,116,117, 58, 10, 48, 58,102,102, 56, - 53, 50, 48, 58, 50, 55, 58, 48, 48, 58, 53, 48, 10, 48, 58,102,102, 56, - 48, 97, 48, 58, 52, 58, 48, 48, 58, 48, 49, 10,102,102,105,103,104,116, - 117, 98, 58, 10,102,102,105,103,104,116,117, 99, 58, 10, 48, 58,102,102, - 56, 53, 50, 48, 58, 50, 55, 58, 48, 48, 58, 53, 48, 10, 48, 58,102,102, - 56, 48, 97, 48, 58, 52, 58, 48, 48, 58, 48, 51, 10,102,102,105,103,104, - 116,117, 49, 58, 10,102,102,105,103,104,116, 97, 58, 10, 48, 58,102,102, - 56, 53, 48, 99, 58, 51, 98, 58,102,102, 58, 53, 48, 10, 48, 58,102,102, - 56, 48, 97, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,100,121,110,119, - 97,114, 58, 10,100,121,110,119, 97,114,106, 58, 10,100,121,110,119, 97, - 114, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,121,110, 97,115,116, - 121, 32, 87, 97,114,115, 32, 40, 85, 83, 32,115,101,116, 32, 50, 41, 10, - 100,121,110,119, 97,114,106,114, 58, 10, 48, 58,102,102,101, 50,100, 54, - 58, 51, 99, 58,101, 50, 58, 48, 48, 10, 48, 58,102,102, 56, 49, 53, 56, - 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,106,112,111,112,110,105, 99, - 115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,117,109,112,105,110,103, - 32, 80,111,112, 32, 40, 78,105, 99,115, 44, 32, 75,111,114,101, 97,110, - 32, 98,111,111,116,108,101,103, 32,111,102, 32, 80,108,117,109,112, 32, - 80,111,112, 41, 10, 48, 58, 99, 54, 50, 53, 58, 50, 55, 58, 48, 48, 58, - 52, 98, 10, 48, 58,101, 52, 55, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 10, 49, 57, 52, 50, 58, 10, 49, 57, 52, 50, 97, 58, 10, 49, 57, 52, 50, - 98, 58, 10, 49, 57, 52, 50,119, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 49, 57, 52, 50, 32, 40, 87,105,108,108,105, 97,109,115, 32, 69,108,101, - 99,116,114,111,110,105, 99,115, 32,108,105, 99,101,110,115,101, 41, 10, - 49, 57, 52, 50, 97, 98,108, 58, 10, 49, 57, 52, 50,112, 58, 10, 48, 58, - 101, 56, 48, 48, 58, 49, 57, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 57, 99, 48, 58, 49, 58, 49,101, 58, 49,101, 10, 48, 58,101, 48, 52, 48, - 58, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 50, 56, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 10,100,111,103,102,103,116, 58, 32, 32, 59, 42, + 121, 32, 40,117,115, 44, 32, 57, 51, 48, 50, 49, 55, 41, 13, 10,119,114, + 97,108,108,121, 97,116, 58, 13, 10, 48, 58,102,101,102, 53, 53, 56, 58, + 50, 56, 56, 58, 53, 97, 58,102,102, 13, 10, 13, 10,103,104,111,120, 58, + 13, 10,103,104,111,120, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71, + 104,111,120, 32, 40,115,101,116, 32, 50, 41, 13, 10, 48, 58, 56, 48, 53, + 97, 50, 58, 54, 52, 58, 48, 48, 58, 56,101, 13, 10, 48, 58, 56, 48, 48, + 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100,101,109,111, + 110,119,108,100, 58, 13, 10,100,101,109,111,110,119,108,100, 49, 58, 13, + 10,100,101,109,111,110,119,108,100, 52, 58, 13, 10,100,101,109,111,110, + 119,108,100, 51, 58, 13, 10,100,101,109,111,110,119,108,100, 50, 58, 13, + 10, 48, 58, 99, 48, 48, 49, 99, 50, 58, 99, 56, 58, 48, 48, 58, 50,100, + 13, 10, 48, 58, 99, 48, 48, 49, 98,101, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,112, 97,112,114, 97,122,122,105, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 80, 97,112, 97,114, 97,122,122,105, 13, 10, 48, 58,102, + 102, 48,100, 57, 57, 58, 50, 55, 58, 52, 49, 58, 51, 99, 13, 10, 13, 10, + 104,101, 97,116, 98,114,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, + 101, 97,116,101,100, 32, 66, 97,114,114,101,108, 32, 40, 87,111,114,108, + 100, 32,118,101,114,115,105,111,110, 32, 51, 41, 13, 10,104,101, 97,116, + 98,114,108,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,101, 97,116, + 101,100, 32, 66, 97,114,114,101,108, 32, 40,117,115, 41, 13, 10,104,101, + 97,116, 98,114,108,111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,101, + 97,116,101,100, 32, 66, 97,114,114,101,108, 32, 40,119,111,114,108,100, + 32,111,108,100, 32,118,101,114,115,105,111,110, 41, 13, 10,104,101, 97, + 116, 98,114,108, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,101, 97, + 116,101,100, 32, 66, 97,114,114,101,108, 32, 40,119,111,114,108,100, 32, + 118,101,114,115,105,111,110, 32, 50, 41, 13, 10,104,101, 97,116, 98,114, + 108,101, 58, 13, 10, 48, 58, 49, 48, 56, 50, 57, 54, 58, 54, 51, 58, 52, + 98, 58, 48, 49, 13, 10, 48, 58, 49, 48, 56, 48, 51, 54, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,102,102,105,103,104,116, 58, 13, 10,102, + 102,105,103,104,116,106, 58, 13, 10,102,102,105,103,104,116,106,104, 58, + 13, 10,102,102,105,103,104,116, 98,108, 58, 13, 10,102,102,105,103,104, + 116, 98,108, 97, 58, 13, 10, 48, 58,102,102, 56, 53, 48, 99, 58, 51, 99, + 58,102,102, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 48, 97, 48, 58, 48, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,102,102,105,103,104,116,106, + 51, 58, 13, 10, 48, 58,102,102, 56, 53, 48, 99, 58, 51, 99, 58,102,102, + 58, 48, 48, 13, 10, 48, 58,102,102, 56, 48, 97, 48, 58, 48, 52, 58, 48, + 48, 58, 48, 51, 13, 10, 13, 10,102,102,105,103,104,116,106, 50, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 70,105,110, 97,108, 32, 70,105,103,104, + 116, 32, 40, 74, 97,112, 97,110, 32, 57, 48, 48, 49, 49, 50, 41, 13, 10, + 102,102,105,103,104,116,106, 49, 58, 13, 10,102,102,105,103,104,116,117, + 97, 58, 13, 10,102,102,105,103,104,116,117, 58, 13, 10, 48, 58,102,102, + 56, 53, 50, 48, 58, 50, 55, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58,102, + 102, 56, 48, 97, 48, 58, 52, 58, 48, 48, 58, 48, 49, 13, 10,102,102,105, + 103,104,116,117, 98, 58, 13, 10,102,102,105,103,104,116,117, 99, 58, 13, + 10, 48, 58,102,102, 56, 53, 50, 48, 58, 50, 55, 58, 48, 48, 58, 53, 48, + 13, 10, 48, 58,102,102, 56, 48, 97, 48, 58, 52, 58, 48, 48, 58, 48, 51, + 13, 10,102,102,105,103,104,116,117, 49, 58, 13, 10,102,102,105,103,104, + 116, 97, 58, 13, 10, 48, 58,102,102, 56, 53, 48, 99, 58, 51, 98, 58,102, + 102, 58, 53, 48, 13, 10, 48, 58,102,102, 56, 48, 97, 48, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,100,121,110,119, 97,114, 58, 13, 10,100, + 121,110,119, 97,114,106, 58, 13, 10,100,121,110,119, 97,114, 97, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 68,121,110, 97,115,116,121, 32, 87, 97, + 114,115, 32, 40, 85, 83, 32,115,101,116, 32, 50, 41, 13, 10,100,121,110, + 119, 97,114,106,114, 58, 13, 10, 48, 58,102,102,101, 50,100, 54, 58, 51, + 99, 58,101, 50, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 49, 53, 56, 58, + 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,106,112,111,112,110,105, + 99,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,117,109,112,105,110, + 103, 32, 80,111,112, 32, 40, 78,105, 99,115, 44, 32, 75,111,114,101, 97, + 110, 32, 98,111,111,116,108,101,103, 32,111,102, 32, 80,108,117,109,112, + 32, 80,111,112, 41, 13, 10, 48, 58, 99, 54, 50, 53, 58, 50, 55, 58, 48, + 48, 58, 52, 98, 13, 10, 48, 58,101, 52, 55, 49, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 49, 57, 52, 50, 58, 13, 10, 49, 57, 52, 50, 97, + 58, 13, 10, 49, 57, 52, 50, 98, 58, 13, 10, 49, 57, 52, 50,119, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 49, 57, 52, 50, 32, 40, 87,105,108,108, + 105, 97,109,115, 32, 69,108,101, 99,116,114,111,110,105, 99,115, 32,108, + 105, 99,101,110,115,101, 41, 13, 10, 49, 57, 52, 50, 97, 98,108, 58, 13, + 10, 49, 57, 52, 50,112, 58, 13, 10, 48, 58,101, 56, 48, 48, 58, 49, 57, + 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 57, 99, 48, 58, 49, 58, + 49,101, 58, 49,101, 13, 10, 48, 58,101, 48, 52, 48, 58, 56, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 48, 50, 56, 58, 49, 58, 48, 49, 58, 48, + 49, 13, 10, 13, 10,100,111,103,102,103,116, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 97, 99,114,111, 98, 97,116,105, 99, 32,100,111,103, 45,102, + 105,103,104,116, 13, 10,100,111,103,102,103,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97, 99,114,111, 98, 97,116,105, 99, 32,100,111,103, - 45,102,105,103,104,116, 10,100,111,103,102,103,116,106, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 97, 99,114,111, 98, 97,116,105, 99, 32,100,111, - 103, 45,102,105,103,104,116, 32, 40,106, 97,112, 97,110, 41, 10,100,111, - 103,102,103,116,117, 58, 10, 48, 58, 54, 48, 55, 58, 52,102, 58, 48, 48, - 58, 48, 98, 10, 48, 58, 54, 48, 57, 58, 49, 58, 48, 49, 58, 48, 49, 10, - 10,114,102,106,101,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,114, 97, - 105,100,101,110, 32,102,105,103,104,116,101,114,115, 32,106,101,116, 32, - 40, 97,108,108, 32,118,101,114,115,105,111,110,115, 32,102,105,120,101, - 100, 41, 10,114,102,106,101,116, 97, 58, 32, 32, 10,114,102,106,101,116, - 117, 58, 32, 32, 10,114,102,106,101,116,115, 58, 32, 10,114,102,106,101, - 116,106, 58, 32, 32, 10,114,102,106,101,116, 50,107, 99, 58, 10,114,102, - 106,101,116,115, 97, 58, 10,114,102,106,101,116,116, 58, 10, 48, 58, 50, - 56,100,100, 52, 58, 57, 56, 58, 50,101, 58, 48, 49, 10, 10,112,122,108, - 111,111,112, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,117,122,122, - 32,108,111,111,112, 32, 50, 32, 40,101,117,114,111, 32, 48, 49, 48, 51, - 48, 50, 41, 10,112,122,108,111,111,112, 50,106, 58, 10, 59, 42, 42, 32, - 115,116, 97,103,101, 32,115, 99,111,114,101,115, 32,110,111,116, 32,114, - 105,103,104,116, 32, 42, 42, 32, 42, 42, 32,121,111,117, 32,109,117,115, - 116, 32,119, 97,105,116, 32,117,110,116,105,108,108, 32,116,104,101, 32, - 104,105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,104, 97,115, 32, - 100,105,115,112,108, 97,121,101,100, 32, 42, 42, 10, 59, 42, 42, 32, 97, - 116, 32,108,101, 97,115,116, 32,111,110, 99,101, 32, 98,101,102,111,114, - 101, 32,121,111,117, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, - 32,102,111,114, 32,116,104,105,115, 32,115, 97,118,101, 32,116,111, 32, - 119,111,114,107, 32, 32, 42, 42, 42, 42, 10, 48, 58,102,102, 50, 99, 98, - 99, 58, 51, 97,101, 58, 52,100, 58, 50, 48, 10, 48, 58,102,102, 50, 99, - 99, 56, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 98,106,116,119,105,110, - 58, 10, 98,106,116,119,105,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 66,111,109, 98,106, 97, 99,107, 32, 84,119,105,110, 32, 40,115,101, - 116, 32, 50, 41, 10, 98,106,116,119,105,110,112, 58, 10, 97,116,111,109, - 98,106,116, 58, 10, 48, 58,102, 57, 49, 48, 48, 58, 97, 48, 58, 48, 48, - 58, 52, 99, 10, 10,116,100,114, 97,103,111,110, 98, 58, 10,116,100,114, - 97,103,111,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,117,110, - 100,101,114, 32, 68,114, 97,103,111,110, 32, 40, 57,116,104, 32, 74, 97, - 110, 46, 32, 49, 57, 57, 50, 41, 10,116,100,114, 97,103,111,110, 49, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,117,110,100,101,114, 32, 68, - 114, 97,103,111,110, 32, 40, 52,116,104, 32, 74,117,110, 46, 32, 49, 57, - 57, 49, 41, 10, 48, 58, 98, 57, 49, 48, 48, 58, 99, 48, 58, 48, 48, 58, - 50, 48, 10, 10,112,105,116,102, 97,108,108, 50, 58, 10,112,105,116,102, - 97,108,108, 50,117, 58, 10,112,105,116,102, 97,108,108, 50, 97, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 80,105,116,102, 97,108,108, 32, 73, 73, - 32, 40, 51, 49, 53, 45, 53, 48, 57, 51, 44, 32, 70,108,105, 99,107,121, - 32, 67,111,110,118,101,114,115,105,111,110, 41, 10, 48, 58, 68, 51, 48, - 48, 58, 51, 56, 58, 48, 48, 58, 52, 49, 10, 48, 58, 67, 48, 48, 48, 58, - 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,114,105,115,107, 99,104, 97,108, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,114,105,115,107,121, 32, 99,104, - 97,108,108,101,110,103,101, 10,103,117,115,115,117,110, 58, 10, 48, 58, - 97, 51, 99, 54, 98, 58, 49, 98, 97, 58, 48, 48, 58, 49, 56, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 40,100,114, 46,109,105, 99,114,111, 41, 10, - 100,114,109,105, 99,114,111, 58, 10, 48, 58, 99, 48, 48, 48, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 48, 58, 99, 56, 48, 48, 58, 49, 48,101, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 99, 48, 49, 55, 58, 54, 58, 48, 48, 58, 48, - 48, 10, 10,111,114, 98,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 79, - 114, 98,115, 32, 40, 49, 48, 47, 55, 47, 57, 52, 32,112,114,111,116,111, - 116,121,112,101, 63, 41, 10, 48, 58,102, 48, 49,100, 51, 53, 58, 49, 53, - 49, 58, 48, 54, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 115,117,112, 98,116,105,109,101, 46, 99, 10,115,117,112, 98,116,105,109, - 101, 58, 10,115,117,112, 98,116,105,109,101,106, 58, 10,115,117,112, 98, - 116,105,109,101, 97, 58, 10, 48, 58, 49, 48, 48, 48, 50, 99, 58, 53, 48, - 58, 48, 48, 58, 52,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 107,121,107,105,100, 46, 99, 10,115,107,121,107,105,100, 58, 10,115,107, - 121,107,105,100,111, 58, 10,115,107,121,107,105,100,100, 58, 10,115,107, - 121,107,105,100,115, 58, 10, 48, 58, 53, 48, 48, 48, 58, 52, 53, 58, 48, - 48, 58, 48, 97, 10, 48, 58, 53, 48, 48, 49, 58, 49, 58, 48, 51, 58, 48, - 51, 10, 10,104, 97,110,103,111,110, 58, 10,104, 97,110,103,111,110, 49, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, 97,110,103, 45, 79,110, 10, - 104, 97,110,103,111,110, 50, 58, 10, 48, 58, 50, 48, 99, 52, 56, 56, 58, - 52, 58, 48, 49, 58, 48, 48, 10, 48, 58, 50, 48,100, 56, 48, 48, 58, 52, - 97, 48, 58, 48, 49, 58, 50, 48, 32, 59, 32,110,111,116,101, 32, 98,101, - 115,116, 32,108, 97,112, 32,116,105,109,101, 32, 97,114,101, 32,110,111, - 116, 32,115, 97,118,101,100, 10, 10,103,117,116,115, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 71,117,116,115, 32,110, 39, 32, 71,108,111,114,121, - 32, 40,112,114,111,116,111,116,121,112,101, 41, 10, 48, 58,102,102,102, - 100,100, 52, 58, 99, 56, 58, 48, 48, 58, 97, 52, 10, 10,101,120,116,114, - 109, 97,116,110, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, - 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111, - 114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101, - 110,116,114,121, 93, 10,101,120,116,114,109, 97,116,110,106, 58, 32, 59, - 42, 42, 42, 42, 42, 42, 69,120,116,101,114,109,105,110, 97,116,105,111, - 110, 32, 40, 74, 97,112, 97,110, 41, 10,101,120,116,114,109, 97,116,110, - 117, 58, 10,101,120,116,114,109, 97,116,110,117,114, 58, 10, 48, 58,101, - 56, 97, 53, 58, 50, 56, 58, 48, 48, 58, 53, 53, 10, 48, 58,101, 56, 56, - 56, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 56, 56, 55, 58, - 48, 49, 58, 52, 57, 58, 52, 57, 10, 48, 58,101, 56, 56, 54, 58, 48, 49, - 58, 48, 48, 58, 48, 48, 10, 10,116,111,114,105,100,101, 50,103, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,116,111,114,105,100,101, 32,105,105, 32, - 97,100,111,117, 99,104,105, 32,103, 97,105,100,101,110, 10,116,111,114, - 105,100,101, 50,103,107, 58, 32, 10, 48, 58, 52, 48, 99, 53,102, 52, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 99, 53,102, 54, 58, 49, - 58, 53, 48, 58, 53, 48, 10, 48, 58, 52, 48, 99, 54, 48, 97, 58, 52, 99, - 58, 48, 48, 58, 52, 48, 10, 10,116,111,114,105,100,101, 50,103,103, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42,116,111,114,105,100,101, 32,105,105, - 32, 97,100,111,117, 99,104,105, 32,103, 97,105,100,101,110, 32, 40,103, - 101,114,109, 97,110, 41, 10, 48, 58, 52, 48,101, 99,101, 50, 58, 52, 99, - 58, 48, 48, 58, 52, 48, 10, 48, 58, 52, 48,101, 99, 99, 54, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 52, 48,101, 99, 99, 56, 58, 49, 58, 53, - 48, 58, 53, 48, 10, 10,116,111,114,105,100,101, 50,106, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 84,111,114,105,100,101, 32, 73, 73, 32, 65,100, - 97,117, 99,104,105, 32, 71, 97,105,100,101,110, 32, 40, 74, 97,112, 97, - 110, 41, 10, 48, 58, 52, 48,101, 99, 99, 48, 58, 53, 99, 58, 48, 48, 58, - 52, 48, 10, 48, 58, 52, 48,101, 99, 97, 52, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 48,101, 99, 97, 54, 58, 49, 58, 53, 48, 58, 53, 48, - 10, 10,112, 97,110,103, 58, 10,112, 97,110,103, 98, 58, 10,112,111,109, - 112,105,110,103,119, 58, 10, 98, 98,114,111,115, 58, 10,112, 97,110,103, - 98,111,108,100, 58, 10,112, 97,110,103, 98, 97, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 80, 97,110,103, 32, 40, 98,111,111,116,108,101,103, 44, - 32,115,101,116, 32, 51, 41, 10,112, 97,110,103, 98, 50, 58, 10, 48, 58, - 102, 57,101, 51, 58, 57, 65, 58, 48, 49, 58, 48, 48, 10, 48, 58,101, 48, - 48,100, 58, 51, 58, 48, 49, 58, 48, 48, 10, 10, 97,108,105,101,110,115, - 121,110, 58, 10, 97,108,105,101,110,115,121,110,106,111, 58, 32, 59, 42, - 42, 42, 42, 42, 42, 65,108,105,101,110, 32, 83,121,110,100,114,111,109, - 101, 32, 40,115,101,116, 32, 49, 44, 32, 83,121,115,116,101,109, 32, 49, - 54, 65, 44, 32, 70, 68, 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, 48, - 51, 51, 41, 10, 97,108,105,101,110,115,121,110, 50, 58, 32, 59, 42, 42, - 42, 42, 42, 42, 65,108,105,101,110, 32, 83,121,110,100,114,111,109,101, - 32, 40,115,101,116, 32, 50, 44, 32, 83,121,115,116,101,109, 32, 49, 54, - 65, 44, 32, 70, 68, 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, 48, 51, - 51, 41, 10, 97,108,105,101,110,115,121,110, 51, 58, 32, 59, 42, 42, 42, - 42, 42, 42, 65,108,105,101,110, 32, 83,121,110,100,114,111,109,101, 32, - 40,115,101,116, 32, 51, 44, 32, 83,121,115,116,101,109, 32, 49, 54, 98, - 44, 32, 70, 68, 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, 48, 51, 51, - 41, 10, 97,108,105,101,110,115,121,110, 53, 58, 10, 97,108,105,101,110, - 115,121,110,106, 58, 10, 97,108,105,101,110,115,121,110, 55, 58, 10, 48, - 58,102,102,102, 51, 48, 48, 58, 52, 54, 58, 48, 48, 58, 48, 49, 10, 48, - 58,102,102, 99, 48, 54, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 97, - 105,114,119,111,108,102, 58, 10,115,107,121,119,111,108,102, 58, 10,115, - 107,121,119,111,108,102, 50, 58, 10, 97,105,114,119,111,108,102, 97, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,105,114,119,111,108,102, 32, 40, - 85, 83, 41, 10,115,107,121,119,111,108,102, 51, 58, 10, 48, 58,101, 55, - 49, 97, 58, 53,102, 58, 48, 48, 58,102,102, 10, 10,116,101,104,107, 97, - 110,119, 99, 58, 10,116,101,104,107, 97,110,119, 99, 98, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 84,101,104,107, 97,110, 32, 87,111,114,108,100, - 32, 67,117,112, 32, 40,115,101,116, 32, 50, 44, 32, 98,111,111,116,108, - 101,103, 63, 41, 10,116,101,104,107,101,110,119, 99, 99, 58, 10, 48, 58, - 99, 54, 48, 48, 58, 54, 48, 58, 48, 51, 58, 49, 55, 10, 10, 59,116, 97, - 110,116,114, 32, 40, 38, 32, 99,108,111,110,101,115, 41, 32,104,105,115, - 99,111,114,101,115, 32,117,112,100, 97,116,101, 32, 97,102,116,101,114, - 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,105,115, 32, - 100,105,115,112,108, 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, - 99,116, 32,109,111,100,101, 10,116, 97,110,116,114, 58, 10,116, 97,110, - 116,114, 98,108, 58, 10,116, 97,110,116,114, 98,108, 50, 58, 10,116, 97, - 110,116,114,107,111,114, 58, 32, 32, 10,116, 97,110,116,114, 98,108, 51, + 45,102,105,103,104,116, 32, 40,106, 97,112, 97,110, 41, 13, 10,100,111, + 103,102,103,116,117, 58, 13, 10, 48, 58, 54, 48, 55, 58, 52,102, 58, 48, + 48, 58, 48, 98, 13, 10, 48, 58, 54, 48, 57, 58, 49, 58, 48, 49, 58, 48, + 49, 13, 10, 13, 10,114,102,106,101,116, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42,114, 97,105,100,101,110, 32,102,105,103,104,116,101,114,115, 32, + 106,101,116, 32, 40, 97,108,108, 32,118,101,114,115,105,111,110,115, 32, + 102,105,120,101,100, 41, 13, 10,114,102,106,101,116, 97, 58, 13, 10,114, + 102,106,101,116,117, 58, 13, 10,114,102,106,101,116,115, 58, 13, 10,114, + 102,106,101,116,106, 58, 13, 10,114,102,106,101,116, 50,107, 99, 58, 13, + 10,114,102,106,101,116,115, 97, 58, 13, 10,114,102,106,101,116,116, 58, + 13, 10, 48, 58, 50, 56,100,100, 52, 58, 57, 56, 58, 50,101, 58, 48, 49, + 13, 10, 13, 10,112,122,108,111,111,112, 50, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,112,117,122,122, 32,108,111,111,112, 32, 50, 32, 40,101,117, + 114,111, 32, 48, 49, 48, 51, 48, 50, 41, 13, 10,112,122,108,111,111,112, + 50,106, 58, 13, 10, 59, 42, 42, 32,115,116, 97,103,101, 32,115, 99,111, + 114,101,115, 32,110,111,116, 32,114,105,103,104,116, 32, 42, 42, 32, 42, + 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97,105,116, 32,117,110, + 116,105,108,108, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116, + 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112,108, 97,121,101,100, + 32, 42, 42, 13, 10, 59, 42, 42, 32, 97,116, 32,108,101, 97,115,116, 32, + 111,110, 99,101, 32, 98,101,102,111,114,101, 32,121,111,117, 32,115,116, + 97,114,116, 32, 97, 32,103, 97,109,101, 32,102,111,114, 32,116,104,105, + 115, 32,115, 97,118,101, 32,116,111, 32,119,111,114,107, 32, 32, 42, 42, + 42, 42, 13, 10, 48, 58,102,102, 50, 99, 98, 99, 58, 51, 97,101, 58, 52, + 100, 58, 50, 48, 13, 10, 48, 58,102,102, 50, 99, 99, 56, 58, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 13, 10, 98,106,116,119,105,110, 58, 13, 10, 98, + 106,116,119,105,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,111, + 109, 98,106, 97, 99,107, 32, 84,119,105,110, 32, 40,115,101,116, 32, 50, + 41, 13, 10, 98,106,116,119,105,110,112, 58, 13, 10, 97,116,111,109, 98, + 106,116, 58, 13, 10, 48, 58,102, 57, 49, 48, 48, 58, 97, 48, 58, 48, 48, + 58, 52, 99, 13, 10, 13, 10,116,100,114, 97,103,111,110, 98, 58, 13, 10, + 116,100,114, 97,103,111,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84, + 104,117,110,100,101,114, 32, 68,114, 97,103,111,110, 32, 40, 57,116,104, + 32, 74, 97,110, 46, 32, 49, 57, 57, 50, 41, 13, 10,116,100,114, 97,103, + 111,110, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,117,110,100, + 101,114, 32, 68,114, 97,103,111,110, 32, 40, 52,116,104, 32, 74,117,110, + 46, 32, 49, 57, 57, 49, 41, 13, 10, 48, 58, 98, 57, 49, 48, 48, 58, 99, + 48, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10,112,105,116,102, 97,108,108, + 50, 58, 13, 10,112,105,116,102, 97,108,108, 50,117, 58, 13, 10,112,105, + 116,102, 97,108,108, 50, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80, + 105,116,102, 97,108,108, 32, 73, 73, 32, 40, 51, 49, 53, 45, 53, 48, 57, + 51, 44, 32, 70,108,105, 99,107,121, 32, 67,111,110,118,101,114,115,105, + 111,110, 41, 13, 10, 48, 58, 68, 51, 48, 48, 58, 51, 56, 58, 48, 48, 58, + 52, 49, 13, 10, 48, 58, 67, 48, 48, 48, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,114,105,115,107, 99,104, 97,108, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,114,105,115,107,121, 32, 99,104, 97,108,108,101,110, + 103,101, 13, 10,103,117,115,115,117,110, 58, 13, 10, 48, 58, 97, 51, 99, + 54, 98, 58, 49, 98, 97, 58, 48, 48, 58, 49, 56, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 40,100,114, 46,109,105, 99,114,111, 41, 13, 10, + 100,114,109,105, 99,114,111, 58, 13, 10, 48, 58, 99, 48, 48, 48, 58, 49, + 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 99, 56, 48, 48, 58, 49, 48,101, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 48, 49, 55, 58, 54, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,111,114, 98,115, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 79,114, 98,115, 32, 40, 49, 48, 47, 55, 47, 57, 52, 32, + 112,114,111,116,111,116,121,112,101, 63, 41, 13, 10, 48, 58,102, 48, 49, + 100, 51, 53, 58, 49, 53, 49, 58, 48, 54, 58, 48, 56, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,115,117,112, 98,116,105,109,101, 46, 99, + 13, 10,115,117,112, 98,116,105,109,101, 58, 13, 10,115,117,112, 98,116, + 105,109,101,106, 58, 13, 10,115,117,112, 98,116,105,109,101, 97, 58, 13, + 10, 48, 58, 49, 48, 48, 48, 50, 99, 58, 53, 48, 58, 48, 48, 58, 52,102, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,107,121,107,105, + 100, 46, 99, 13, 10,115,107,121,107,105,100, 58, 13, 10,115,107,121,107, + 105,100,111, 58, 13, 10,115,107,121,107,105,100,100, 58, 13, 10,115,107, + 121,107,105,100,115, 58, 13, 10, 48, 58, 53, 48, 48, 48, 58, 52, 53, 58, + 48, 48, 58, 48, 97, 13, 10, 48, 58, 53, 48, 48, 49, 58, 49, 58, 48, 51, + 58, 48, 51, 13, 10, 13, 10,104, 97,110,103,111,110, 58, 13, 10,104, 97, + 110,103,111,110, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, 97,110, + 103, 45, 79,110, 13, 10,104, 97,110,103,111,110, 50, 58, 13, 10, 48, 58, + 50, 48, 99, 52, 56, 56, 58, 52, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, + 50, 48,100, 56, 48, 48, 58, 52, 97, 48, 58, 48, 49, 58, 50, 48, 32, 59, + 32,110,111,116,101, 32, 98,101,115,116, 32,108, 97,112, 32,116,105,109, + 101, 32, 97,114,101, 32,110,111,116, 32,115, 97,118,101,100, 13, 10, 13, + 10,103,117,116,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71,117,116, + 115, 32,110, 39, 32, 71,108,111,114,121, 32, 40,112,114,111,116,111,116, + 121,112,101, 41, 13, 10, 48, 58,102,102,102,100,100, 52, 58, 99, 56, 58, + 48, 48, 58, 97, 52, 13, 10, 13, 10,101,120,116,114,109, 97,116,110, 58, + 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32, + 116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, + 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, + 13, 10,101,120,116,114,109, 97,116,110,106, 58, 32, 59, 42, 42, 42, 42, + 42, 42, 69,120,116,101,114,109,105,110, 97,116,105,111,110, 32, 40, 74, + 97,112, 97,110, 41, 13, 10,101,120,116,114,109, 97,116,110,117, 58, 13, + 10,101,120,116,114,109, 97,116,110,117,114, 58, 13, 10, 48, 58,101, 56, + 97, 53, 58, 50, 56, 58, 48, 48, 58, 53, 53, 13, 10, 48, 58,101, 56, 56, + 56, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 56, 56, 55, + 58, 48, 49, 58, 52, 57, 58, 52, 57, 13, 10, 48, 58,101, 56, 56, 54, 58, + 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,111,114,105,100,101, + 50,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,111,114,105,100,101, + 32,105,105, 32, 97,100,111,117, 99,104,105, 32,103, 97,105,100,101,110, + 13, 10,116,111,114,105,100,101, 50,103,107, 58, 13, 10, 48, 58, 52, 48, + 99, 53,102, 52, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, + 99, 53,102, 54, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 48, 58, 52, 48, + 99, 54, 48, 97, 58, 52, 99, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10,116, + 111,114,105,100,101, 50,103,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 116,111,114,105,100,101, 32,105,105, 32, 97,100,111,117, 99,104,105, 32, + 103, 97,105,100,101,110, 32, 40,103,101,114,109, 97,110, 41, 13, 10, 48, + 58, 52, 48,101, 99,101, 50, 58, 52, 99, 58, 48, 48, 58, 52, 48, 13, 10, + 48, 58, 52, 48,101, 99, 99, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 52, 48,101, 99, 99, 56, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, + 13, 10,116,111,114,105,100,101, 50,106, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 84,111,114,105,100,101, 32, 73, 73, 32, 65,100, 97,117, 99,104, + 105, 32, 71, 97,105,100,101,110, 32, 40, 74, 97,112, 97,110, 41, 13, 10, + 48, 58, 52, 48,101, 99, 99, 48, 58, 53, 99, 58, 48, 48, 58, 52, 48, 13, + 10, 48, 58, 52, 48,101, 99, 97, 52, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 52, 48,101, 99, 97, 54, 58, 49, 58, 53, 48, 58, 53, 48, 13, + 10, 13, 10,112, 97,110,103, 58, 13, 10,112, 97,110,103, 98, 58, 13, 10, + 112,111,109,112,105,110,103,119, 58, 13, 10, 98, 98,114,111,115, 58, 13, + 10,112, 97,110,103, 98,111,108,100, 58, 13, 10,112, 97,110,103, 98, 97, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80, 97,110,103, 32, 40, 98,111, + 111,116,108,101,103, 44, 32,115,101,116, 32, 51, 41, 13, 10,112, 97,110, + 103, 98, 50, 58, 13, 10, 48, 58,102, 57,101, 51, 58, 57, 65, 58, 48, 49, + 58, 48, 48, 13, 10, 48, 58,101, 48, 48,100, 58, 51, 58, 48, 49, 58, 48, + 48, 13, 10, 13, 10, 97,108,105,101,110,115,121,110, 58, 13, 10, 97,108, + 105,101,110,115,121,110,106,111, 58, 32, 59, 42, 42, 42, 42, 42, 42, 65, + 108,105,101,110, 32, 83,121,110,100,114,111,109,101, 32, 40,115,101,116, + 32, 49, 44, 32, 83,121,115,116,101,109, 32, 49, 54, 65, 44, 32, 70, 68, + 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, 48, 51, 51, 41, 13, 10, 97, + 108,105,101,110,115,121,110, 50, 58, 32, 59, 42, 42, 42, 42, 42, 42, 65, + 108,105,101,110, 32, 83,121,110,100,114,111,109,101, 32, 40,115,101,116, + 32, 50, 44, 32, 83,121,115,116,101,109, 32, 49, 54, 65, 44, 32, 70, 68, + 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, 48, 51, 51, 41, 13, 10, 97, + 108,105,101,110,115,121,110, 51, 58, 32, 59, 42, 42, 42, 42, 42, 42, 65, + 108,105,101,110, 32, 83,121,110,100,114,111,109,101, 32, 40,115,101,116, + 32, 51, 44, 32, 83,121,115,116,101,109, 32, 49, 54, 98, 44, 32, 70, 68, + 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, 48, 51, 51, 41, 13, 10, 97, + 108,105,101,110,115,121,110, 53, 58, 13, 10, 97,108,105,101,110,115,121, + 110,106, 58, 13, 10, 97,108,105,101,110,115,121,110, 55, 58, 13, 10, 48, + 58,102,102,102, 51, 48, 48, 58, 52, 54, 58, 48, 48, 58, 48, 49, 13, 10, + 48, 58,102,102, 99, 48, 54, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 97,105,114,119,111,108,102, 58, 13, 10,115,107,121,119,111,108, + 102, 58, 13, 10,115,107,121,119,111,108,102, 50, 58, 13, 10, 97,105,114, + 119,111,108,102, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,105,114, + 119,111,108,102, 32, 40, 85, 83, 41, 13, 10,115,107,121,119,111,108,102, + 51, 58, 13, 10, 48, 58,101, 55, 49, 97, 58, 53,102, 58, 48, 48, 58,102, + 102, 13, 10, 13, 10,116,101,104,107, 97,110,119, 99, 58, 13, 10,116,101, + 104,107, 97,110,119, 99, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84, + 101,104,107, 97,110, 32, 87,111,114,108,100, 32, 67,117,112, 32, 40,115, + 101,116, 32, 50, 44, 32, 98,111,111,116,108,101,103, 63, 41, 13, 10,116, + 101,104,107,101,110,119, 99, 99, 58, 13, 10, 48, 58, 99, 54, 48, 48, 58, + 54, 48, 58, 48, 51, 58, 49, 55, 13, 10, 13, 10, 59,116, 97,110,116,114, + 32, 40, 38, 32, 99,108,111,110,101,115, 41, 32,104,105,115, 99,111,114, + 101,115, 32,117,112,100, 97,116,101, 32, 97,102,116,101,114, 32,104,105, + 115, 99,111,114,101, 32,116, 97, 98,108,101, 32,105,115, 32,100,105,115, + 112,108, 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32, + 109,111,100,101, 13, 10,116, 97,110,116,114, 58, 13, 10,116, 97,110,116, + 114, 98,108, 58, 13, 10,116, 97,110,116,114, 98,108, 50, 58, 13, 10,116, + 97,110,116,114,107,111,114, 58, 13, 10,116, 97,110,116,114, 98,108, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,117,122,122,108,101, 32, 38, 32, 65, 99,116,105,111,110, 58, 32, 84, 97,110,116, 45, 82, 32, 40, 74, 97,112, 97,110, 41, 32, 40, 98,111,111,116,108,101,103, 32,115,101,116, - 32, 51, 41, 10, 48, 58,102,102,102, 99, 52, 53, 58, 50, 56, 58, 52, 56, - 58, 48, 48, 10, 10, 59, 42, 42, 32,116,104,105,115, 32,111,110,108,121, - 32,115, 97,118,101,115, 32,116,104,101, 32,104,105,115, 99,111,114,101, - 32,116, 97, 98,108,101, 44, 32,116,104,101, 32,116,111,112, 32,115, 99, - 111,114,101, 32,119,105,108,108, 32,115,116, 97,121, 32, 97,116, 32,100, - 101,102, 97,117,108,116, 32, 42, 42, 10,115,113,105,120, 58, 32, 32, 10, - 115,113,105,120,114, 49, 58, 32, 32, 10,115,113,105,120,117, 58, 32, 32, - 10,115,113,105,120, 98, 49, 58, 32, 32, 10,115,113,105,120, 98, 50, 58, - 10, 48, 58,102, 52, 99, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 10, 10, - 114,111,110,103,114,111,110,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 112,117,122,122,108,101, 32,103, 97,109,101, 32,114,111,110,103, 32,114, - 111,110,103, 32, 40,101,117,114,111,112,101, 41, 10, 48, 58, 54, 49, 52, - 102, 58,101, 97, 58,102, 52, 58, 48, 49, 10, 48, 58, 54, 49, 57, 99, 58, - 49, 58, 48, 49, 58, 48, 49, 10, 10,114,111,110,103,114,111,110,103,103, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,117,122,122,108,101, 32,103, - 97,109,101, 32,114,111,110,103, 32,114,111,110,103, 32, 40,103,101,114, - 109, 97,110,121, 41, 10,114,111,110,103,114,111,110,103,106, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,112,117,122,122,108,101, 32,103, 97,109,101, - 32,114,111,110,103, 32,114,111,110,103, 32, 40,106, 97,112, 97,110, 41, - 10, 48, 58, 54, 49, 52,101, 58,101, 97, 58,102, 52, 58, 48, 49, 10, 48, - 58, 54, 49, 57, 98, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,108,111,104, - 116, 58, 32, 32, 10,108,111,104,116,106, 58, 10,108,111,104,116, 98, 50, - 58, 10, 48, 58, 97, 51, 97,102, 52, 58, 51, 50, 58, 51, 54, 58, 50, 48, - 10, 48, 58, 97, 51, 97,100, 99, 58, 48, 50, 58, 51, 54, 58, 49, 49, 10, - 10,100,106, 98,111,121, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,106, - 32, 98,111,121, 32, 40,115,101,116, 32, 49, 41, 10,100,106, 98,111,121, - 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,106, 32, 98,111,121, 32, - 40,115,101,116, 32, 50, 41, 10,100,106, 98,111,121,106, 58, 32, 32, 59, + 32, 51, 41, 13, 10, 48, 58,102,102,102, 99, 52, 53, 58, 50, 56, 58, 52, + 56, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 32,116,104,105,115, 32,111, + 110,108,121, 32,115, 97,118,101,115, 32,116,104,101, 32,104,105,115, 99, + 111,114,101, 32,116, 97, 98,108,101, 44, 32,116,104,101, 32,116,111,112, + 32,115, 99,111,114,101, 32,119,105,108,108, 32,115,116, 97,121, 32, 97, + 116, 32,100,101,102, 97,117,108,116, 32, 42, 42, 13, 10,115,113,105,120, + 58, 13, 10,115,113,105,120,114, 49, 58, 13, 10,115,113,105,120,117, 58, + 13, 10,115,113,105,120, 98, 49, 58, 13, 10,115,113,105,120, 98, 50, 58, + 13, 10, 48, 58,102, 52, 99, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 13, + 10, 13, 10,114,111,110,103,114,111,110,103, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,112,117,122,122,108,101, 32,103, 97,109,101, 32,114,111,110, + 103, 32,114,111,110,103, 32, 40,101,117,114,111,112,101, 41, 13, 10, 48, + 58, 54, 49, 52,102, 58,101, 97, 58,102, 52, 58, 48, 49, 13, 10, 48, 58, + 54, 49, 57, 99, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,114,111, + 110,103,114,111,110,103,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112, + 117,122,122,108,101, 32,103, 97,109,101, 32,114,111,110,103, 32,114,111, + 110,103, 32, 40,103,101,114,109, 97,110,121, 41, 13, 10,114,111,110,103, + 114,111,110,103,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,117,122, + 122,108,101, 32,103, 97,109,101, 32,114,111,110,103, 32,114,111,110,103, + 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58, 54, 49, 52,101, 58,101, + 97, 58,102, 52, 58, 48, 49, 13, 10, 48, 58, 54, 49, 57, 98, 58, 49, 58, + 48, 49, 58, 48, 49, 13, 10, 13, 10,108,111,104,116, 58, 13, 10,108,111, + 104,116,106, 58, 13, 10,108,111,104,116, 98, 50, 58, 13, 10, 48, 58, 97, + 51, 97,102, 52, 58, 51, 50, 58, 51, 54, 58, 50, 48, 13, 10, 48, 58, 97, + 51, 97,100, 99, 58, 48, 50, 58, 51, 54, 58, 49, 49, 13, 10, 13, 10,100, + 106, 98,111,121, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,106, 32, 98, + 111,121, 32, 40,115,101,116, 32, 49, 41, 13, 10,100,106, 98,111,121, 97, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,106, 32, 98,111,121, 32, 40, + 115,101,116, 32, 50, 41, 13, 10,100,106, 98,111,121,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,106, 32, 98,111,121, 32, 40,106, 97,112, 97, - 110, 41, 10, 48, 58, 98, 49, 54, 97, 58, 50,100, 58, 48, 49, 58, 49, 50, - 10, 10,104,117,110, 99,104, 98, 97,107, 58, 10,104,117,110, 99,104, 98, - 97,107, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,117,110, 99,104, - 98, 97, 99,107, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58, 49, 99, 48, - 55, 58, 54, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 99, 51, 52, 58, - 49, 58, 50, 48, 58, 50, 48, 10, 10,104,117,110, 99,104, 98,107,115, 58, - 10,104,117,110, 99,104, 98,107,115, 50, 58, 10, 48, 58, 51, 99, 48, 97, - 58, 52,102, 58, 49, 98, 58, 48, 48, 10, 48, 58, 51, 99, 50, 53, 58, 49, - 58, 50, 48, 58, 50, 48, 10, 10,104,117,110, 99,104, 98,107,100, 58, 10, - 48, 58, 49, 99, 50, 51, 58, 52,102, 58, 49, 98, 58, 48, 48, 10, 48, 58, - 49, 99, 55, 51, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,104,117,110, 99, - 104, 98,107,103, 58, 10, 48, 58, 49, 99, 48, 97, 58, 52,102, 58, 49, 98, - 58, 48, 48, 10, 48, 58, 49, 99, 48,102, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 49, 99, 48,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10,115, - 104,105,110,111, 98,105, 58, 10,115,104,105,110,111, 98,108, 58, 10,115, - 104,105,110,111, 98,105, 49, 58, 10,115,104,105,110,111, 98,105, 50, 58, - 10,115,104,105,110,111, 98,105, 51, 58, 10,115,104,105,110,111, 98,105, - 52, 58, 10,115,104,105,110,111, 98,105, 53, 58, 32, 32, 10,115,104,105, - 110,111, 98,108,100, 58, 10,115,104,105,110,111, 98,108,115, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 83,104,105,110,111, 98,105, 32, 40, 83,116, - 97,114, 32, 98,111,111,116,108,101,103, 44, 32, 83,121,115,116,101,109, - 32, 49, 54, 65, 41, 10,115,104,105,110,111, 98,108,100, 97, 58, 10,115, - 104,105,110,111, 98,105, 49,100, 58, 10,115,104,105,110,111, 98,105, 50, - 100, 58, 10, 48, 58,102,102,102, 99, 48, 48, 58, 49, 52, 50, 58, 48, 48, - 58, 53, 52, 10, 48, 58,102,102,102, 48, 49, 48, 58, 52, 58, 48, 48, 58, - 48, 48, 10, 10,108,111,118,101,114, 98,111,121, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,108,111,118,101,114, 98,111,121, 10,116,114,105,107,105, - 116,114,105, 58, 10, 48, 58, 56, 48, 50, 54, 58, 51, 99, 58, 48, 52, 58, - 49, 51, 10, 10,102,103,104,116,104,105,115,116, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,102,105,103,104,116,101,114,115, 32,104,105,115,116,111, - 114,121, 32, 40,119,111,114,108,100, 32,118,101,114, 32, 52, 51, 45, 48, - 55, 41, 10,102,103,104,116,104,105,115,116, 97, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,102,105,103,104,116,101,114,115, 32,104,105,115,116,111, - 114,121, 32, 40,117,115, 32,118,101,114, 52, 50, 45, 48, 53, 44, 32, 97, - 108,116,101,114,110, 97,116,105,118,101, 32,104, 97,114,100,119, 97,114, - 101, 41, 10,102,103,104,116,104,105,115,116,117, 97, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,102,105,103,104,116,101,114,115, 32,104,105,115,116, - 111,114,121, 32, 40,117,115, 32,118,101,114, 52, 50, 45, 48, 51, 41, 10, - 102,103,104,116,104,105,115,116,106, 97, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,102,105,103,104,116,101,114,115, 32,104,105,115,116,111,114,121, - 32, 40,106, 97,112, 97,110, 32,118,101,114, 32, 52, 50, 45, 48, 51, 41, - 10,102,103,104,116,104,105,115,116,106, 58, 10,102,103,104,116,104,105, - 115,116,117, 98, 58, 10,102,103,104,116,104,105,115,116,106, 98, 58, 10, - 102,103,104,116,104,105,115,116,117, 99, 58, 10,102,103,104,116,104,105, - 115,116,117, 58, 10,102,103,104,116,104,105,115,116, 98, 58, 10, 48, 58, - 49, 48, 49, 57,100, 56, 58, 50, 56, 58, 53, 48, 58, 48, 48, 10, 10,100, - 111,109,105,110,111, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111, - 109,105,110,111, 32, 66,108,111, 99,107, 10, 48, 58,101,102, 55, 57, 58, - 50, 51, 58, 48, 51, 58, 52, 98, 10, 48, 58, 99, 52,100,102, 58, 51, 58, - 48, 51, 58, 48, 48, 10, 10,112,117,122,122,110,105, 99, 58, 10,112,117, - 122,122,110,105, 99,106, 58, 10,112,117,122,122,110,105, 99,105, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 32, 80,117,122,122,110,105, 99, 32, 40, - 73,116, 97,108,121, 41, 10,112,117,122,122,110,105, 99, 98, 58, 10,112, - 117,122,122,110,105, 99, 98, 97, 58, 10, 48, 58, 56,102, 50, 51, 58, 51, - 50, 58, 48, 48, 58, 52, 57, 10, 48, 58, 56,100, 51, 55, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 10,118,101,110,117,115, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,118,101,110,117,115, 10, 48, 58, 57, 52, 56, 57, 58, 50, 54, - 58, 48, 48, 58,100, 51, 10, 48, 58, 57, 52, 48, 98, 58, 51, 58, 48, 48, - 58, 48, 49, 10, 10,100,111, 99,107,109, 97,110, 58, 10,112,111,114,116, - 109, 97,110, 58, 10,112,111,114,116,101,114, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 80,111,114,116, 32, 77, 97,110, 32, 40, 98,111,111,116,108, - 101,103, 32,111,110, 32, 77,111,111,110, 32, 67,114,101,115,116, 97, 32, - 104, 97,114,100,119, 97,114,101, 41, 10, 48, 58, 56, 48,102,100, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 99, 49, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 57, 50,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, - 10, 48, 58, 57, 51, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, - 57, 51, 50, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 51, 52, - 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 49, 56, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 50, 52, 58, 50, 52, - 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, - 57, 50, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 10,104,114,100,116, - 105,109,101,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, 97,114,100, - 32, 84,105,109,101,115, 32, 40,115,101,116, 32, 49, 41, 10,104,114,100, - 116,105,109,101,115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, 97, - 114,100, 32, 84,105,109,101,115, 32, 40,115,101,116, 32, 50, 41, 10, 48, - 58, 56, 53, 98, 52, 52, 58, 97, 48, 58, 48, 48, 58, 49, 49, 10, 48, 58, - 56, 53, 99, 49, 52, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,109,111,111, - 110, 99,114,115,116, 58, 10,115,109,111,111,110, 99,114,115, 58, 10,109, - 111,111,110, 99,114,115, 98, 58, 10,109,111,111,110, 99,114,115, 50, 58, - 10,102, 97,110,116, 97,122,105, 97, 58, 10,101, 97,103,108,101, 58, 10, - 101, 97,103,108,101, 50, 58, 10,101, 97,103,108,101, 51, 58, 10,109,111, - 111,110, 99,114,115, 51, 58, 32, 32, 10,115,112, 99,100,114, 97,103, 58, - 32, 32, 32, 10,115,112, 99,100,114, 97,103, 97, 58, 32, 32, 10,109,111, - 111,110, 99,109,119, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,111,111, - 110, 32, 87, 97,114, 32, 40, 77,111,111,110, 32, 67,114,101,115,116, 97, - 32, 98,111,111,116,108,101,103, 41, 10,109,111,111,110, 99,114,115,116, - 117, 58, 10,115,116,101,114, 97, 58, 32, 10,109,111,111,110, 99,114,115, - 116,117,107, 58, 10,115,115,116, 97,114, 99,114,115, 58, 10,109,111,111, - 110, 99,114,115,116,117,107,117, 58, 10,109,111,111,110, 99,114,115, 52, - 58, 10,115,116, 97,114,102,103,109, 99, 58, 10,109,111,111,110, 99,112, - 116, 99, 58, 10,109,111,111,110, 99,114,101,103, 58, 10,109,111,111,110, - 99,114,115,108, 58, 10,109,111,111,110, 99,114,115,116,115,111, 58, 10, - 48, 58, 56, 48, 52, 50, 58, 53, 52, 58, 48, 48, 58, 50, 52, 10, 10,109, - 111,111,110, 99,114,103,120, 58, 10, 48, 58, 52, 48, 52, 50, 58, 53, 52, - 58, 48, 48, 58, 50, 52, 10, 10,109,111,111,110, 99,114,115,116,103, 58, - 10, 48, 58, 56, 48, 52, 53, 58, 53, 52, 58, 48, 48, 58, 50, 52, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 40,109,111,111,110, 32, 99,114,101,115,116, - 97, 32, 40,110,105, 99,104,105, 98,117,116,115,117, 44, 32,111,108,100, - 32,114,101,118, 41, 41, 10,109,111,111,110, 99,114,115,116,111, 58, 10, - 48, 58, 56, 48, 52, 50, 58, 53, 52, 58, 48, 48, 58, 50, 52, 10, 48, 58, - 56, 48, 52,102, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10,103, 97,108, 97, - 120,105, 97,110, 58, 10,103, 97,108, 97,120,105, 97,110,109, 58, 10,115, - 117,112,101,114,103, 58, 10,103, 97,108, 97,120, 98, 58, 10,103, 97,108, - 97,112,120, 58, 10,103, 97,108, 97,112, 49, 58, 10,103, 97,108, 97,112, - 52, 58, 10,103, 97,108,116,117,114, 98,111, 58, 10,115,119, 97,114,109, - 58, 10,117,110,105,119, 97,114,115, 58, 10,103,116,101,105,107,111,107, - 117, 58, 10,115,112, 97, 99, 98, 97,116,116, 58, 10,115,112, 97, 99, 98, - 97,116, 50, 58, 10,114,101,100,117,102,111, 98, 58, 10,103, 97,108, 97, - 120,105, 97,110, 97, 58, 10,103, 97,108, 97,120,105, 97,110,109,111, 58, - 32, 32, 10,103, 97,108, 97,120, 98,115,102, 58, 32, 32, 10,103, 97,108, - 97,120,105, 97,110,116, 58, 10,115,107,121,114, 97,105,100,114, 58, 10, - 115,112, 97, 99,101,109,112,114, 58, 10,114,101,100,117,102,111, 58, 10, - 103, 97,108,101,109,112, 58, 10, 97,115,116,114,105, 97,110,115, 58, 10, - 97,115,105,100,101,114, 97,108, 58, 10,103, 97,108, 97,120,114,102, 58, - 10,103, 97,108, 97,120,105, 97,110, 98,108, 58, 10,112, 97,106, 97,114, - 111,101,115, 58, 10,103, 97,108, 97,120, 98,115,102, 50, 58, 10,103, 97, - 108, 97,120,105, 97,110,105, 58, 10,103, 97,108, 97,120,114,102,103,103, - 58, 10,122,101,114,111,116,105,109,101,100, 58, 10,115,117,112,101,114, - 103,115, 58, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 10,103,116,101,105,107,111,107, 98, 58, 10,103,116,101,105,107,111, - 98, 50, 58, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 53, 49, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 53, 49, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 49,101, - 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 50, 48, 49, 58, 49, - 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 50, 50, 49, 58, 49, 58, 49, 48, - 58, 49, 48, 10, 48, 58, 53, 50, 52, 49, 58, 49, 58, 49, 48, 58, 49, 48, - 10, 10, 10, 10,107, 97,109, 97,107, 97,122,105, 51, 58, 10,109,111,111, - 110, 97,108,110, 58, 10,107, 97,109,105,107, 97,122,112, 58, 10, 48, 58, - 52, 52, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 53, 97, - 49, 58, 49, 58, 57, 48, 58, 57, 48, 10, 48, 58, 53, 53, 99, 49, 58, 49, - 58, 57, 48, 58, 57, 48, 10, 48, 58, 53, 53,101, 49, 58, 49, 58, 49, 48, - 58, 49, 48, 10, 48, 58, 53, 54, 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, - 10, 48, 58, 53, 54, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, - 53, 54, 52, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 10,101,120,111, - 100,117,115, 58, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 48, 97, 99, 58, 49, 58, 55, 48, 58, 55, 48, 10, 48, - 58, 53, 53, 99, 49, 58, 49, 58, 57, 48, 58, 57, 48, 10, 48, 58, 53, 53, - 97, 49, 58, 49, 58, 57, 48, 58, 57, 48, 10, 48, 58, 53, 54, 50, 49, 58, - 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 54, 52, 49, 58, 49, 58, 49, - 48, 58, 49, 48, 10, 48, 58, 53, 54, 48, 49, 58, 49, 58, 49, 48, 58, 49, - 48, 10, 48, 58, 53, 53,101, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, - 10, 10,115,116,114, 97,104,108, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42,107,111,117,116,101,116,115,117, 32,121,111,117,115, 97,105, 32,115, - 116,114, 97,104,108, 32, 40,106, 97,112, 97,110, 32,115,101,116, 32, 50, - 41, 10, 48, 58,102, 51, 48,100, 49, 58,100, 57, 58, 53, 53, 58, 50,101, - 10, 48, 58,102, 51, 50, 51, 57, 58, 50, 55, 58, 48, 48, 58, 56, 56, 10, - 48, 58,102, 48,100, 53, 98, 58, 51, 58, 48, 48, 58, 53, 48, 32, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,106,117,109,112, 32, 99,111, 97,115,116, - 101,114, 10,106,117,109,112, 99,111, 97,115, 58, 10,106,117,109,112, 99, - 111, 97,115,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,117,109,112, - 32, 67,111, 97,115,116,101,114, 32, 40, 84, 97,105,116,111, 41, 10, 48, - 58, 99, 52, 48, 48, 58, 51,102, 58, 48, 48, 58, 49, 49, 10, 48, 58, 99, - 48, 52, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 52, 49, 99, - 58, 49, 58, 48, 53, 58, 48, 53, 10, 10,100,105,103,100,117,103, 58, 10, - 100,105,103,100,117,103, 49, 58, 10,100,105,103,100,117,103, 97,116, 58, - 10,100,122,105,103,122, 97,103, 58, 10,100,105,103,100,117,103, 97,116, - 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,105,103, 32,100,117,103, - 32, 40, 97,116, 97,114,105, 44, 32,114,101,118, 49, 41, 10, 48, 58, 56, - 57, 65, 48, 58, 50, 53, 58, 48, 49, 58, 48, 49, 10, 10,102,108,105, 99, - 107,121, 58, 10,102,108,105, 99,107,121,111, 58, 10,102,108,105, 99,107, - 121,115, 50, 58, 32, 32, 59, 70,108,105, 99,107,121, 32, 40, 49, 50, 56, - 107, 32, 86,101,114,115,105,111,110, 44, 32, 83,121,115,116,101,109, 32, - 50, 44, 32,110,111,116, 32,101,110, 99,114,121,112,116,101,100, 41, 10, - 102,108,105, 99,107,121,115, 49, 58, 32, 32, 59, 70,108,105, 99,107,121, - 32, 40, 54, 52,107, 32, 86,101,114,115,105,111,110, 44, 32, 83,121,115, - 116,101,109, 32, 49, 44, 32, 51, 49, 53, 45, 53, 48, 53, 49, 44, 32,115, - 101,116, 32, 50, 41, 10, 48, 58,101, 55, 48, 48, 58, 51, 49, 58, 48, 48, - 58, 52, 49, 10, 48, 58, 99, 48,100, 53, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 10,109,115,116,119,111,114,108,100, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,109,111,110,115,116,101,114,115, 32,119,111,114,108,100, 10, 48, - 58,102, 99, 48, 49, 58, 57,101, 58, 48, 48, 58, 48, 55, 10, 48, 58,101, - 49, 53, 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 97,105,114, 97,116, - 116, 99,107, 58, 32, 10, 97,105,114, 97,116,116, 99,107, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 65,105,114, 32, 65,116,116, 97, 99,107, 32, - 40,115,101,116, 32, 50, 41, 10, 48, 58, 98, 57, 49, 48, 48, 58, 56, 48, - 58, 48, 58, 54, 98, 10, 10,115,100,102,105,103,104,116, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 83, 68, 32, 70,105,103,104,116,101,114, 32, 40, - 75,111,114,101, 97, 41, 10, 48, 58, 49, 50, 49,101,102, 97, 58, 52,102, - 58, 48, 48, 58, 52,100, 10, 10,102,117,110,121, 98,117, 98,108, 58, 10, - 102,117,110,121, 98,117, 98,108, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 70,117,110,110,121, 32, 66,117, 98, 98,108,101, 32, 40, 67,111,109, - 97,100, 32,118,101,114,115,105,111,110, 41, 10, 48, 58,101, 48, 48, 53, - 58, 57, 57, 58, 52, 99, 58, 48, 48, 10, 48, 58,101, 48, 57, 97, 58, 49, - 58, 48, 53, 58, 48, 53, 10, 10,104,101,120,112,111,111,108, 97, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 72,101,120, 32, 80,111,111,108, 32, 40, - 83,101,110,107,111, 41, 10,104,101,120,112,111,111,108, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42,104,101,120, 32,112,111,111,108, 32, 40,115,104, - 105,110,107, 97,105, 41, 10, 48, 58, 49,100, 98, 56, 58, 52, 53, 58, 49, - 100, 58, 49, 51, 10, 10, 99, 97,112,116, 97,118,101,110, 58, 10, 99, 97, - 112,116, 97,118,101,110,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, - 97,112,116, 97,105,110, 32, 97,109,101,114,105, 99, 97, 32, 97,110,100, - 32,116,104,101, 32, 97,118,101,110,103,101,114,115, 32, 40,106, 97,112, - 32,114,101,118, 32, 48, 46, 50, 41, 10, 99, 97,112,116, 97,118,101,110, - 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97,105,110, - 32, 97,109,101,114,105, 99, 97, 32, 97,110,100, 32,116,104,101, 32, 97, - 118,101,110,103,101,114,115, 32, 40, 97,115,105, 97, 32,114,101,118, 32, - 49, 46, 48, 41, 10, 99, 97,112,116, 97,118,101,110,101, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97,105,110, 32, 97,109,101,114, - 105, 99, 97, 32, 97,110,100, 32,116,104,101, 32, 97,118,101,110,103,101, - 114,115, 32, 40,117,107, 32,114,101,118, 32, 49, 46, 52, 41, 10, 99, 97, - 112,116, 97,118,101,110,117, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 110, 41, 13, 10, 48, 58, 98, 49, 54, 97, 58, 50,100, 58, 48, 49, 58, 49, + 50, 13, 10, 13, 10,104,117,110, 99,104, 98, 97,107, 58, 13, 10,104,117, + 110, 99,104, 98, 97,107, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, + 117,110, 99,104, 98, 97, 99,107, 32, 40,115,101,116, 32, 50, 41, 13, 10, + 48, 58, 49, 99, 48, 55, 58, 54, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 49, 99, 51, 52, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10,104, + 117,110, 99,104, 98,107,115, 58, 13, 10,104,117,110, 99,104, 98,107,115, + 50, 58, 13, 10, 48, 58, 51, 99, 48, 97, 58, 52,102, 58, 49, 98, 58, 48, + 48, 13, 10, 48, 58, 51, 99, 50, 53, 58, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 13, 10,104,117,110, 99,104, 98,107,100, 58, 13, 10, 48, 58, 49, 99, + 50, 51, 58, 52,102, 58, 49, 98, 58, 48, 48, 13, 10, 48, 58, 49, 99, 55, + 51, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,104,117,110, 99,104, + 98,107,103, 58, 13, 10, 48, 58, 49, 99, 48, 97, 58, 52,102, 58, 49, 98, + 58, 48, 48, 13, 10, 48, 58, 49, 99, 48,102, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 49, 99, 48,100, 58, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 13, 10,115,104,105,110,111, 98,105, 58, 13, 10,115,104,105,110,111, + 98,108, 58, 13, 10,115,104,105,110,111, 98,105, 49, 58, 13, 10,115,104, + 105,110,111, 98,105, 50, 58, 13, 10,115,104,105,110,111, 98,105, 51, 58, + 13, 10,115,104,105,110,111, 98,105, 52, 58, 13, 10,115,104,105,110,111, + 98,105, 53, 58, 13, 10,115,104,105,110,111, 98,108,100, 58, 13, 10,115, + 104,105,110,111, 98,108,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, + 104,105,110,111, 98,105, 32, 40, 83,116, 97,114, 32, 98,111,111,116,108, + 101,103, 44, 32, 83,121,115,116,101,109, 32, 49, 54, 65, 41, 13, 10,115, + 104,105,110,111, 98,108,100, 97, 58, 13, 10,115,104,105,110,111, 98,105, + 49,100, 58, 13, 10,115,104,105,110,111, 98,105, 50,100, 58, 13, 10, 48, + 58,102,102,102, 99, 48, 48, 58, 49, 52, 50, 58, 48, 48, 58, 53, 52, 13, + 10, 48, 58,102,102,102, 48, 49, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,108,111,118,101,114, 98,111,121, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,108,111,118,101,114, 98,111,121, 13, 10,116,114,105,107,105, + 116,114,105, 58, 13, 10, 48, 58, 56, 48, 50, 54, 58, 51, 99, 58, 48, 52, + 58, 49, 51, 13, 10, 13, 10,102,103,104,116,104,105,115,116, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42,102,105,103,104,116,101,114,115, 32,104,105, + 115,116,111,114,121, 32, 40,119,111,114,108,100, 32,118,101,114, 32, 52, + 51, 45, 48, 55, 41, 13, 10,102,103,104,116,104,105,115,116, 97, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42,102,105,103,104,116,101,114,115, 32,104, + 105,115,116,111,114,121, 32, 40,117,115, 32,118,101,114, 52, 50, 45, 48, + 53, 44, 32, 97,108,116,101,114,110, 97,116,105,118,101, 32,104, 97,114, + 100,119, 97,114,101, 41, 13, 10,102,103,104,116,104,105,115,116,117, 97, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,102,105,103,104,116,101,114,115, + 32,104,105,115,116,111,114,121, 32, 40,117,115, 32,118,101,114, 52, 50, + 45, 48, 51, 41, 13, 10,102,103,104,116,104,105,115,116,106, 97, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42,102,105,103,104,116,101,114,115, 32,104, + 105,115,116,111,114,121, 32, 40,106, 97,112, 97,110, 32,118,101,114, 32, + 52, 50, 45, 48, 51, 41, 13, 10,102,103,104,116,104,105,115,116,106, 58, + 13, 10,102,103,104,116,104,105,115,116,117, 98, 58, 13, 10,102,103,104, + 116,104,105,115,116,106, 98, 58, 13, 10,102,103,104,116,104,105,115,116, + 117, 99, 58, 13, 10,102,103,104,116,104,105,115,116,117, 58, 13, 10,102, + 103,104,116,104,105,115,116, 98, 58, 13, 10, 48, 58, 49, 48, 49, 57,100, + 56, 58, 50, 56, 58, 53, 48, 58, 48, 48, 13, 10, 13, 10,100,111,109,105, + 110,111, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,111,109,105,110, + 111, 32, 66,108,111, 99,107, 13, 10, 48, 58,101,102, 55, 57, 58, 50, 51, + 58, 48, 51, 58, 52, 98, 13, 10, 48, 58, 99, 52,100,102, 58, 51, 58, 48, + 51, 58, 48, 48, 13, 10, 13, 10,112,117,122,122,110,105, 99, 58, 13, 10, + 112,117,122,122,110,105, 99,106, 58, 13, 10,112,117,122,122,110,105, 99, + 105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32, 80,117,122,122,110,105, + 99, 32, 40, 73,116, 97,108,121, 41, 13, 10,112,117,122,122,110,105, 99, + 98, 58, 13, 10,112,117,122,122,110,105, 99, 98, 97, 58, 13, 10, 48, 58, + 56,102, 50, 51, 58, 51, 50, 58, 48, 48, 58, 52, 57, 13, 10, 48, 58, 56, + 100, 51, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,118,101,110, + 117,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,101,110,117,115, 13, + 10, 48, 58, 57, 52, 56, 57, 58, 50, 54, 58, 48, 48, 58,100, 51, 13, 10, + 48, 58, 57, 52, 48, 98, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, + 100,111, 99,107,109, 97,110, 58, 13, 10,112,111,114,116,109, 97,110, 58, + 13, 10,112,111,114,116,101,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 80,111,114,116, 32, 77, 97,110, 32, 40, 98,111,111,116,108,101,103, 32, + 111,110, 32, 77,111,111,110, 32, 67,114,101,115,116, 97, 32,104, 97,114, + 100,119, 97,114,101, 41, 13, 10, 48, 58, 56, 48,102,100, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 57, 50, 99, 49, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 57, 50,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, + 13, 10, 48, 58, 57, 51, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, + 48, 58, 57, 51, 50, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, + 57, 51, 52, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, + 56, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 49, 97, 49, + 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 99, 49, 58, 49, + 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 50, + 52, 58, 50, 52, 13, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, 50, 52, 58, + 50, 52, 13, 10, 13, 10,104,114,100,116,105,109,101,115, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 72, 97,114,100, 32, 84,105,109,101,115, 32, 40, + 115,101,116, 32, 49, 41, 13, 10,104,114,100,116,105,109,101,115, 97, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 72, 97,114,100, 32, 84,105,109,101, + 115, 32, 40,115,101,116, 32, 50, 41, 13, 10, 48, 58, 56, 53, 98, 52, 52, + 58, 97, 48, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, 56, 53, 99, 49, 52, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109,111,111,110, 99,114, + 115,116, 58, 13, 10,115,109,111,111,110, 99,114,115, 58, 13, 10,109,111, + 111,110, 99,114,115, 98, 58, 13, 10,109,111,111,110, 99,114,115, 50, 58, + 13, 10,102, 97,110,116, 97,122,105, 97, 58, 13, 10,101, 97,103,108,101, + 58, 13, 10,101, 97,103,108,101, 50, 58, 13, 10,101, 97,103,108,101, 51, + 58, 13, 10,109,111,111,110, 99,114,115, 51, 58, 13, 10,115,112, 99,100, + 114, 97,103, 58, 13, 10,115,112, 99,100,114, 97,103, 97, 58, 13, 10,109, + 111,111,110, 99,109,119, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,111, + 111,110, 32, 87, 97,114, 32, 40, 77,111,111,110, 32, 67,114,101,115,116, + 97, 32, 98,111,111,116,108,101,103, 41, 13, 10,109,111,111,110, 99,114, + 115,116,117, 58, 13, 10,115,116,101,114, 97, 58, 13, 10,109,111,111,110, + 99,114,115,116,117,107, 58, 13, 10,115,115,116, 97,114, 99,114,115, 58, + 13, 10,109,111,111,110, 99,114,115,116,117,107,117, 58, 13, 10,109,111, + 111,110, 99,114,115, 52, 58, 13, 10,115,116, 97,114,102,103,109, 99, 58, + 13, 10,109,111,111,110, 99,112,116, 99, 58, 13, 10,109,111,111,110, 99, + 114,101,103, 58, 13, 10,109,111,111,110, 99,114,115,108, 58, 13, 10,109, + 111,111,110, 99,114,115,116,115,111, 58, 13, 10, 48, 58, 56, 48, 52, 50, + 58, 53, 52, 58, 48, 48, 58, 50, 52, 13, 10, 13, 10,109,111,111,110, 99, + 114,103,120, 58, 13, 10, 48, 58, 52, 48, 52, 50, 58, 53, 52, 58, 48, 48, + 58, 50, 52, 13, 10, 13, 10,109,111,111,110, 99,114,115,116,103, 58, 13, + 10, 48, 58, 56, 48, 52, 53, 58, 53, 52, 58, 48, 48, 58, 50, 52, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,109,111,111,110, 32, 99,114,101, + 115,116, 97, 32, 40,110,105, 99,104,105, 98,117,116,115,117, 44, 32,111, + 108,100, 32,114,101,118, 41, 41, 13, 10,109,111,111,110, 99,114,115,116, + 111, 58, 13, 10, 48, 58, 56, 48, 52, 50, 58, 53, 52, 58, 48, 48, 58, 50, + 52, 13, 10, 48, 58, 56, 48, 52,102, 58, 49, 58, 53, 48, 58, 53, 48, 13, + 10, 13, 10,103, 97,108, 97,120,105, 97,110, 58, 13, 10,103, 97,108, 97, + 120,105, 97,110,109, 58, 13, 10,115,117,112,101,114,103, 58, 13, 10,103, + 97,108, 97,120, 98, 58, 13, 10,103, 97,108, 97,112,120, 58, 13, 10,103, + 97,108, 97,112, 49, 58, 13, 10,103, 97,108, 97,112, 52, 58, 13, 10,103, + 97,108,116,117,114, 98,111, 58, 13, 10,115,119, 97,114,109, 58, 13, 10, + 117,110,105,119, 97,114,115, 58, 13, 10,103,116,101,105,107,111,107,117, + 58, 13, 10,115,112, 97, 99, 98, 97,116,116, 58, 13, 10,115,112, 97, 99, + 98, 97,116, 50, 58, 13, 10,114,101,100,117,102,111, 98, 58, 13, 10,103, + 97,108, 97,120,105, 97,110, 97, 58, 13, 10,103, 97,108, 97,120,105, 97, + 110,109,111, 58, 13, 10,103, 97,108, 97,120, 98,115,102, 58, 13, 10,103, + 97,108, 97,120,105, 97,110,116, 58, 13, 10,115,107,121,114, 97,105,100, + 114, 58, 13, 10,115,112, 97, 99,101,109,112,114, 58, 13, 10,114,101,100, + 117,102,111, 58, 13, 10,103, 97,108,101,109,112, 58, 13, 10, 97,115,116, + 114,105, 97,110,115, 58, 13, 10, 97,115,105,100,101,114, 97,108, 58, 13, + 10,103, 97,108, 97,120,114,102, 58, 13, 10,103, 97,108, 97,120,105, 97, + 110, 98,108, 58, 13, 10,112, 97,106, 97,114,111,101,115, 58, 13, 10,103, + 97,108, 97,120, 98,115,102, 50, 58, 13, 10,103, 97,108, 97,120,105, 97, + 110,105, 58, 13, 10,103, 97,108, 97,120,114,102,103,103, 58, 13, 10,122, + 101,114,111,116,105,109,101,100, 58, 13, 10,115,117,112,101,114,103,115, + 58, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,103,116,101,105,107,111,107, 98, 58, 13, 10,103,116,101,105, + 107,111, 98, 50, 58, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 53, 49, 97, 49, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 53, 49, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 53, 49,101, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, + 58, 53, 50, 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 53, + 50, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 53, 50, 52, + 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, 13, 10, 13, 10,107, + 97,109, 97,107, 97,122,105, 51, 58, 13, 10,109,111,111,110, 97,108,110, + 58, 13, 10,107, 97,109,105,107, 97,122,112, 58, 13, 10, 48, 58, 52, 52, + 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 53, 97, 49, + 58, 49, 58, 57, 48, 58, 57, 48, 13, 10, 48, 58, 53, 53, 99, 49, 58, 49, + 58, 57, 48, 58, 57, 48, 13, 10, 48, 58, 53, 53,101, 49, 58, 49, 58, 49, + 48, 58, 49, 48, 13, 10, 48, 58, 53, 54, 48, 49, 58, 49, 58, 49, 48, 58, + 49, 48, 13, 10, 48, 58, 53, 54, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, + 13, 10, 48, 58, 53, 54, 52, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, + 13, 10, 13, 10,101,120,111,100,117,115, 58, 13, 10, 48, 58, 52, 48, 97, + 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 97, 99, 58, + 49, 58, 55, 48, 58, 55, 48, 13, 10, 48, 58, 53, 53, 99, 49, 58, 49, 58, + 57, 48, 58, 57, 48, 13, 10, 48, 58, 53, 53, 97, 49, 58, 49, 58, 57, 48, + 58, 57, 48, 13, 10, 48, 58, 53, 54, 50, 49, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 48, 58, 53, 54, 52, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, + 10, 48, 58, 53, 54, 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, + 58, 53, 53,101, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, 13, + 10, 13, 10,115,116,114, 97,104,108, 97, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42,107,111,117,116,101,116,115,117, 32,121,111,117,115, 97,105, 32, + 115,116,114, 97,104,108, 32, 40,106, 97,112, 97,110, 32,115,101,116, 32, + 50, 41, 13, 10, 48, 58,102, 51, 48,100, 49, 58,100, 57, 58, 53, 53, 58, + 50,101, 13, 10, 48, 58,102, 51, 50, 51, 57, 58, 50, 55, 58, 48, 48, 58, + 56, 56, 13, 10, 48, 58,102, 48,100, 53, 98, 58, 51, 58, 48, 48, 58, 53, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,106,117,109,112, 32, + 99,111, 97,115,116,101,114, 13, 10,106,117,109,112, 99,111, 97,115, 58, + 13, 10,106,117,109,112, 99,111, 97,115,116, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 74,117,109,112, 32, 67,111, 97,115,116,101,114, 32, 40, 84, + 97,105,116,111, 41, 13, 10, 48, 58, 99, 52, 48, 48, 58, 51,102, 58, 48, + 48, 58, 49, 49, 13, 10, 48, 58, 99, 48, 52, 98, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 99, 52, 49, 99, 58, 49, 58, 48, 53, 58, 48, 53, + 13, 10, 13, 10,100,105,103,100,117,103, 58, 13, 10,100,105,103,100,117, + 103, 49, 58, 13, 10,100,105,103,100,117,103, 97,116, 58, 13, 10,100,122, + 105,103,122, 97,103, 58, 13, 10,100,105,103,100,117,103, 97,116, 49, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42,100,105,103, 32,100,117,103, 32, 40, + 97,116, 97,114,105, 44, 32,114,101,118, 49, 41, 13, 10, 48, 58, 56, 57, + 65, 48, 58, 50, 53, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,102,108,105, + 99,107,121, 58, 13, 10,102,108,105, 99,107,121,111, 58, 13, 10,102,108, + 105, 99,107,121,115, 50, 58, 32, 32, 59, 70,108,105, 99,107,121, 32, 40, + 49, 50, 56,107, 32, 86,101,114,115,105,111,110, 44, 32, 83,121,115,116, + 101,109, 32, 50, 44, 32,110,111,116, 32,101,110, 99,114,121,112,116,101, + 100, 41, 13, 10,102,108,105, 99,107,121,115, 49, 58, 32, 32, 59, 70,108, + 105, 99,107,121, 32, 40, 54, 52,107, 32, 86,101,114,115,105,111,110, 44, + 32, 83,121,115,116,101,109, 32, 49, 44, 32, 51, 49, 53, 45, 53, 48, 53, + 49, 44, 32,115,101,116, 32, 50, 41, 13, 10, 48, 58,101, 55, 48, 48, 58, + 51, 49, 58, 48, 48, 58, 52, 49, 13, 10, 48, 58, 99, 48,100, 53, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109,115,116,119,111,114,108,100, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,111,110,115,116,101,114,115, + 32,119,111,114,108,100, 13, 10, 48, 58,102, 99, 48, 49, 58, 57,101, 58, + 48, 48, 58, 48, 55, 13, 10, 48, 58,101, 49, 53, 52, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 97,105,114, 97,116,116, 99,107, 58, 13, 10, + 97,105,114, 97,116,116, 99,107, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 65,105,114, 32, 65,116,116, 97, 99,107, 32, 40,115,101,116, 32, 50, + 41, 13, 10, 48, 58, 98, 57, 49, 48, 48, 58, 56, 48, 58, 48, 58, 54, 98, + 13, 10, 13, 10,115,100,102,105,103,104,116, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 83, 68, 32, 70,105,103,104,116,101,114, 32, 40, 75,111,114, + 101, 97, 41, 13, 10, 48, 58, 49, 50, 49,101,102, 97, 58, 52,102, 58, 48, + 48, 58, 52,100, 13, 10, 13, 10,102,117,110,121, 98,117, 98,108, 58, 13, + 10,102,117,110,121, 98,117, 98,108, 99, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 70,117,110,110,121, 32, 66,117, 98, 98,108,101, 32, 40, 67,111, + 109, 97,100, 32,118,101,114,115,105,111,110, 41, 13, 10, 48, 58,101, 48, + 48, 53, 58, 57, 57, 58, 52, 99, 58, 48, 48, 13, 10, 48, 58,101, 48, 57, + 97, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10,104,101,120,112,111, + 111,108, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,101,120, 32, 80, + 111,111,108, 32, 40, 83,101,110,107,111, 41, 13, 10,104,101,120,112,111, + 111,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,104,101,120, 32,112,111, + 111,108, 32, 40,115,104,105,110,107, 97,105, 41, 13, 10, 48, 58, 49,100, + 98, 56, 58, 52, 53, 58, 49,100, 58, 49, 51, 13, 10, 13, 10, 99, 97,112, + 116, 97,118,101,110, 58, 13, 10, 99, 97,112,116, 97,118,101,110,106, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97,105,110, 32, 97, + 109,101,114,105, 99, 97, 32, 97,110,100, 32,116,104,101, 32, 97,118,101, + 110,103,101,114,115, 32, 40,106, 97,112, 32,114,101,118, 32, 48, 46, 50, + 41, 13, 10, 99, 97,112,116, 97,118,101,110, 97, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 99, 97,112,116, 97,105,110, 32, 97,109,101,114,105, 99, + 97, 32, 97,110,100, 32,116,104,101, 32, 97,118,101,110,103,101,114,115, + 32, 40, 97,115,105, 97, 32,114,101,118, 32, 49, 46, 48, 41, 13, 10, 99, + 97,112,116, 97,118,101,110,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97,105,110, 32, 97,109,101,114,105, 99, 97, 32, 97,110, - 100, 32,116,104,101, 32, 97,118,101,110,103,101,114,115, 32, 40,117,115, - 32,114,101,118, 32, 49, 46, 52, 41, 10, 99, 97,112,116, 97,118,101,110, - 117,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97,105, - 110, 32, 97,109,101,114,105, 99, 97, 32, 97,110,100, 32,116,104,101, 32, - 97,118,101,110,103,101,114,115, 32, 40,117,115, 32,114,101,118, 32, 49, - 46, 54, 41, 10, 99, 97,112,116, 97,118,101,110,117, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 99, 97,112,116, 97,105,110, 32, 97,109,101,114,105, - 99, 97, 32, 97,110,100, 32,116,104,101, 32, 97,118,101,110,103,101,114, - 115, 32, 40,117,115, 32,114,101,118, 32, 49, 46, 57, 41, 10, 48, 58, 49, - 50, 55, 48, 52, 48, 58, 65, 48, 58, 50, 48, 58, 48, 10, 10,118,114, 58, + 100, 32,116,104,101, 32, 97,118,101,110,103,101,114,115, 32, 40,117,107, + 32,114,101,118, 32, 49, 46, 52, 41, 13, 10, 99, 97,112,116, 97,118,101, + 110,117, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97, + 105,110, 32, 97,109,101,114,105, 99, 97, 32, 97,110,100, 32,116,104,101, + 32, 97,118,101,110,103,101,114,115, 32, 40,117,115, 32,114,101,118, 32, + 49, 46, 52, 41, 13, 10, 99, 97,112,116, 97,118,101,110,117,117, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,112,116, 97,105,110, 32, 97,109, + 101,114,105, 99, 97, 32, 97,110,100, 32,116,104,101, 32, 97,118,101,110, + 103,101,114,115, 32, 40,117,115, 32,114,101,118, 32, 49, 46, 54, 41, 13, + 10, 99, 97,112,116, 97,118,101,110,117, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 99, 97,112,116, 97,105,110, 32, 97,109,101,114,105, 99, 97, 32, + 97,110,100, 32,116,104,101, 32, 97,118,101,110,103,101,114,115, 32, 40, + 117,115, 32,114,101,118, 32, 49, 46, 57, 41, 13, 10, 48, 58, 49, 50, 55, + 48, 52, 48, 58, 65, 48, 58, 50, 48, 58, 48, 13, 10, 13, 10,118,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,105,114,116,117, 97, 32,114, 97, - 99,105,110,103, 10,118,102,111,114,109,117,108, 97, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,118,105,114,116,117, 97, 32,102,111,114,109,117,108, - 97, 10, 48, 58, 52, 48,101, 48, 48, 48, 58, 54, 98,102, 58, 48, 49, 58, - 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,105, 98, 98,105, - 116, 33, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,114, - 105, 98, 98,105,116, 58, 10, 48, 58,102,102,102, 97,100, 97, 58, 49, 50, - 54, 58,102,102, 58,102,102, 10, 48, 58,102,102, 99, 52, 53,102, 58, 49, - 58, 48, 51, 58, 48, 51, 10, 10,116, 97,110,103,116, 97,110,103, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,116, 97,110,103, 32,116, 97,110,103, 32, - 40,118,101,114, 46, 48, 53, 50, 54, 44, 50, 54, 47, 48, 53, 47, 50, 48, - 48, 48, 41, 10, 48, 58, 55, 48, 97, 56, 52, 48, 58, 52, 48, 58, 48, 48, - 58, 52, 48, 10, 10,109,101,105,107,121,117,104, 97, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 77,101,105,107,121,117,117, 32, 72,117,110,116,101, - 114, 32, 71, 32, 40, 74, 97,112, 97,110, 44, 32,115,101,116, 32, 50, 41, - 10,109,101,105,107,121,117,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 77,101,105,107,121,117,117, 32, 72,117,110,116,101,114, 32, 71, 32, 40, - 74, 97,112, 97,110, 44, 32,115,101,116, 32, 49, 41, 10, 48, 58, 49, 57, - 48, 58, 53, 48, 58, 48, 49, 58, 50, 48, 10, 10, 99,104,105,110,104,101, - 114,111, 58, 10, 99,104,105,110,104,101,114,111, 50, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 99,104,105,110,101,115,101, 32,104,101,114,111, 32, - 40,111,108,100,101,114, 41, 10, 99,104,105,110,104,101,114,111,116, 58, - 10, 99,104,105,110,104,101,114,111, 51, 58, 10, 48, 58,101, 49, 51, 50, - 58, 52, 54, 58, 48, 48, 58, 49, 55, 10, 48, 58,101, 49, 50, 56, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 49, 50, 97, 58, 49, 58, 48, 51, - 58, 48, 51, 10, 10, 97,115,117,114, 97, 98,117,115, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 65,115,117,114, 97, 32, 66,117,115,116,101,114, 32, - 45, 32, 69,116,101,114,110, 97,108, 32, 87, 97,114,114,105,111,114,115, - 32, 40, 74, 97,112, 97,110, 41, 10, 97,115,117,114, 97, 98,117,115, 97, - 58, 10, 48, 58, 52, 48, 51, 50, 54,100, 58, 49, 51, 50, 58, 48, 53, 58, - 49, 52, 10, 10,100,121,110, 97, 98,111,109, 98, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 68,121,110, 97,109,105,116,101, 32, 66,111,109, 98,101, - 114, 32, 40, 75,111,114,101, 97, 41, 32, 40, 82,101,118, 32, 49, 46, 53, - 41, 10, 48, 58, 99, 55, 57, 48, 56, 58, 54, 48, 58, 48, 48, 58, 48, 49, - 10, 48, 58, 99, 55,101, 52, 51, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, - 97,105,114, 98,117,115,116,114, 58, 10, 97,105,114, 98,117,115,116,114, - 106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,105,114, 32, 66,117,115, - 116,101,114, 58, 32, 84,114,111,117, 98,108,101, 32, 83,112,101, 99,105, - 97,108,116,121, 32, 82, 97,105,100, 32, 85,110,105,116, 32, 40,106, 97, - 112, 97,110, 41, 10, 97,105,114, 98,117,115,116,114, 98, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 65,105,114, 32, 66,117,115,116,101,114, 58, 32, - 84,114,111,117, 98,108,101, 32, 83,112,101, 99,105, 97,108,116,121, 32, - 82, 97,105,100, 32, 85,110,105,116, 32, 40, 98,111,111,116,108,101,103, - 41, 10, 48, 58,101, 49, 54, 48, 58, 52, 48, 58, 48, 49, 58, 48, 49, 10, - 48, 58,101, 49, 57,101, 58, 48, 49, 58, 52,102, 58, 52,102, 10, 10,116, - 114,111, 97,110,103,101,108, 58, 10,110,101,119,116, 97,110,103,108, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,101,119, 32, 84,114,111,112,105, - 99, 97,108, 32, 65,110,103,101,108, 10, 48, 58,101, 55, 56, 48, 58, 49, - 101, 58, 48, 50, 58, 52,101, 10, 48, 58,101, 48,100, 51, 58, 51, 58, 48, - 50, 58, 48, 48, 10, 10,116,111,107,105, 98, 58, 10,116,111,107,105,117, - 58, 10,116,111,107,105, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84, - 111,107,105, 32, 40, 87,111,114,108,100, 32, 83,101,116, 32, 50, 41, 10, - 106,117,106,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,117, 74,117, - 32, 68,101,110,115,101,116,115,117, 32, 40, 74, 97,112, 97,110, 41, 10, - 106,117,106,117, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,117, 74, - 117, 32, 68,101,110,115,101,116,115,117, 32, 40, 74, 97,112, 97,110, 44, - 32, 98,111,111,116,108,101,103, 41, 10,116,111,107,105,117, 97, 58, 10, - 106,117,106,117, 98, 97, 58, 10,116,111,107,105,112, 58, 10, 48, 58, 54, - 54, 98, 54, 54, 58, 98, 52, 58, 48, 48, 58, 48, 51, 10, 48, 58, 54, 48, - 48, 48, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, + 99,105,110,103, 13, 10,118,102,111,114,109,117,108, 97, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,118,105,114,116,117, 97, 32,102,111,114,109,117, + 108, 97, 13, 10, 48, 58, 52, 48,101, 48, 48, 48, 58, 54, 98,102, 58, 48, + 49, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114, + 105, 98, 98,105,116, 33, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110, + 100, 41, 13, 10,114,105, 98, 98,105,116, 58, 13, 10, 48, 58,102,102,102, + 97,100, 97, 58, 49, 50, 54, 58,102,102, 58,102,102, 13, 10, 48, 58,102, + 102, 99, 52, 53,102, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10,116, + 97,110,103,116, 97,110,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116, + 97,110,103, 32,116, 97,110,103, 32, 40,118,101,114, 46, 48, 53, 50, 54, + 44, 50, 54, 47, 48, 53, 47, 50, 48, 48, 48, 41, 13, 10, 48, 58, 55, 48, + 97, 56, 52, 48, 58, 52, 48, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10,109, + 101,105,107,121,117,104, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77, + 101,105,107,121,117,117, 32, 72,117,110,116,101,114, 32, 71, 32, 40, 74, + 97,112, 97,110, 44, 32,115,101,116, 32, 50, 41, 13, 10,109,101,105,107, + 121,117,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,101,105,107,121, + 117,117, 32, 72,117,110,116,101,114, 32, 71, 32, 40, 74, 97,112, 97,110, + 44, 32,115,101,116, 32, 49, 41, 13, 10, 48, 58, 49, 57, 48, 58, 53, 48, + 58, 48, 49, 58, 50, 48, 13, 10, 13, 10, 99,104,105,110,104,101,114,111, + 58, 13, 10, 99,104,105,110,104,101,114,111, 50, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 99,104,105,110,101,115,101, 32,104,101,114,111, 32, 40, + 111,108,100,101,114, 41, 13, 10, 99,104,105,110,104,101,114,111,116, 58, + 13, 10, 99,104,105,110,104,101,114,111, 51, 58, 13, 10, 48, 58,101, 49, + 51, 50, 58, 52, 54, 58, 48, 48, 58, 49, 55, 13, 10, 48, 58,101, 49, 50, + 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 49, 50, 97, 58, + 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 97,115,117,114, 97, 98,117, + 115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,115,117,114, 97, 32, 66, + 117,115,116,101,114, 32, 45, 32, 69,116,101,114,110, 97,108, 32, 87, 97, + 114,114,105,111,114,115, 32, 40, 74, 97,112, 97,110, 41, 13, 10, 97,115, + 117,114, 97, 98,117,115, 97, 58, 13, 10, 48, 58, 52, 48, 51, 50, 54,100, + 58, 49, 51, 50, 58, 48, 53, 58, 49, 52, 13, 10, 13, 10,100,121,110, 97, + 98,111,109, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 68,121,110, 97, + 109,105,116,101, 32, 66,111,109, 98,101,114, 32, 40, 75,111,114,101, 97, + 41, 32, 40, 82,101,118, 32, 49, 46, 53, 41, 13, 10, 48, 58, 99, 55, 57, + 48, 56, 58, 54, 48, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 99, 55,101, + 52, 51, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 97,105,114, 98, + 117,115,116,114, 58, 13, 10, 97,105,114, 98,117,115,116,114,106, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 65,105,114, 32, 66,117,115,116,101,114, + 58, 32, 84,114,111,117, 98,108,101, 32, 83,112,101, 99,105, 97,108,116, + 121, 32, 82, 97,105,100, 32, 85,110,105,116, 32, 40,106, 97,112, 97,110, + 41, 13, 10, 97,105,114, 98,117,115,116,114, 98, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 65,105,114, 32, 66,117,115,116,101,114, 58, 32, 84,114, + 111,117, 98,108,101, 32, 83,112,101, 99,105, 97,108,116,121, 32, 82, 97, + 105,100, 32, 85,110,105,116, 32, 40, 98,111,111,116,108,101,103, 41, 13, + 10, 48, 58,101, 49, 54, 48, 58, 52, 48, 58, 48, 49, 58, 48, 49, 13, 10, + 48, 58,101, 49, 57,101, 58, 48, 49, 58, 52,102, 58, 52,102, 13, 10, 13, + 10,116,114,111, 97,110,103,101,108, 58, 13, 10,110,101,119,116, 97,110, + 103,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,101,119, 32, 84,114, + 111,112,105, 99, 97,108, 32, 65,110,103,101,108, 13, 10, 48, 58,101, 55, + 56, 48, 58, 49,101, 58, 48, 50, 58, 52,101, 13, 10, 48, 58,101, 48,100, + 51, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10,116,111,107,105, 98, + 58, 13, 10,116,111,107,105,117, 58, 13, 10,116,111,107,105, 97, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 84,111,107,105, 32, 40, 87,111,114,108, + 100, 32, 83,101,116, 32, 50, 41, 13, 10,106,117,106,117, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 74,117, 74,117, 32, 68,101,110,115,101,116,115, + 117, 32, 40, 74, 97,112, 97,110, 41, 13, 10,106,117,106,117, 98, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 74,117, 74,117, 32, 68,101,110,115,101, + 116,115,117, 32, 40, 74, 97,112, 97,110, 44, 32, 98,111,111,116,108,101, + 103, 41, 13, 10,116,111,107,105,117, 97, 58, 13, 10,106,117,106,117, 98, + 97, 58, 13, 10,116,111,107,105,112, 58, 13, 10, 48, 58, 54, 54, 98, 54, + 54, 58, 98, 52, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58, 54, 48, 48, 48, + 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,112,115,116, 97,100,105,117,109, 46, 99, 32, 40,116, 111,107,105, 32, 40,119,111,114,108,100, 32,115,101,116, 32, 49, 41, 41, - 10,116,111,107,105, 58, 10, 48, 58, 54, 54, 98, 53,101, 58, 98, 52, 58, - 48, 48, 58, 48, 51, 10, 48, 58, 54, 48, 48, 48, 56, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 54, 48, 48, 48, 97, 58, 49, 58, 50, 48, 58, 50, - 48, 10, 10, 99,105,114, 99,117,115, 58, 10, 99,105,114, 99,117,115,115, - 101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,105,114, 99,117,115, 32, - 40, 83,117, 98, 45, 69,108,101, 99,116,114,111, 32, 98,111,111,116,108, - 101,103, 41, 10,115,112,114,105,110,103, 98,100, 58, 10, 48, 58, 48, 48, - 51, 54, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10,103,103,114,111,117,110, - 100, 58, 10,103,103,114,111,117,110,100,106, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 71, 97,105,110, 32, 71,114,111,117,110,100, 32, 40, 74, 97, - 112, 97,110, 44, 32, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 48, - 53, 56, 45, 48, 51, 98, 41, 10, 48, 58,102, 48, 55, 56, 48, 48, 58, 51, - 49, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 48, 55, 98, 49, 51, 58, - 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 32,116,111,110,103, 32, - 98,111,121, 32,115,117, 98, 45,103, 97,109,101, 32,100,111,101,115, 32, - 110,111,116, 32,115, 97,118,101, 32, 44, 32,100,114,105,118,101,114, 32, - 105,115,115,117,101,115, 32, 63, 63, 63, 63, 32, 42, 42, 10,110,109,103, - 53, 58, 10,110,109,103, 53,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 13, 10,116,111,107,105, 58, 13, 10, 48, 58, 54, 54, 98, 53,101, 58, 98, + 52, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58, 54, 48, 48, 48, 56, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 48, 48, 97, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 13, 10, 99,105,114, 99,117,115, 58, 13, 10, + 99,105,114, 99,117,115,115,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 67,105,114, 99,117,115, 32, 40, 83,117, 98, 45, 69,108,101, 99,116,114, + 111, 32, 98,111,111,116,108,101,103, 41, 13, 10,115,112,114,105,110,103, + 98,100, 58, 13, 10, 48, 58, 48, 48, 51, 54, 58, 50, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,103,103,114,111,117,110,100, 58, 13, 10,103,103,114, + 111,117,110,100,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71, 97,105, + 110, 32, 71,114,111,117,110,100, 32, 40, 74, 97,112, 97,110, 44, 32, 70, + 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 48, 53, 56, 45, 48, 51, 98, + 41, 13, 10, 48, 58,102, 48, 55, 56, 48, 48, 58, 51, 49, 56, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102, 48, 55, 98, 49, 51, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 32,116,111,110,103, 32, 98,111, + 121, 32,115,117, 98, 45,103, 97,109,101, 32,100,111,101,115, 32,110,111, + 116, 32,115, 97,118,101, 32, 44, 32,100,114,105,118,101,114, 32,105,115, + 115,117,101,115, 32, 63, 63, 63, 63, 32, 42, 42, 13, 10,110,109,103, 53, + 58, 13, 10,110,109,103, 53,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,117,108,116,105, 32, 53, 32, 47, 32, 78,101,119, 32, 77,117,108,116, 105, 32, 71, 97,109,101, 32, 53, 32, 40,101, 97,114,108,105,101,114, 41, - 10,110,109,103, 53, 97, 58, 10, 48, 58, 49, 50, 57, 49, 48, 49, 58,102, - 102, 58, 49, 48, 58, 52, 48, 10, 10,112,104,111,116,111,121, 50,107, 49, - 48, 52, 58, 10,112,104,111,116,111,121, 50,107, 49, 48, 50, 58, 10, 48, - 58, 56, 48, 97, 51, 48, 54, 58, 49, 58, 49, 50, 58, 49, 50, 10, 48, 58, - 56, 49, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56, 51, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56, 53, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56, 55, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56, 57, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56, 98, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56,100, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 48, 58, - 56,102, 51, 52, 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 10, 10, 59, + 13, 10,110,109,103, 53, 97, 58, 13, 10, 48, 58, 49, 50, 57, 49, 48, 49, + 58,102,102, 58, 49, 48, 58, 52, 48, 13, 10, 13, 10,112,104,111,116,111, + 121, 50,107, 49, 48, 52, 58, 13, 10,112,104,111,116,111,121, 50,107, 49, + 48, 50, 58, 13, 10, 48, 58, 56, 48, 97, 51, 48, 54, 58, 49, 58, 49, 50, + 58, 49, 50, 13, 10, 48, 58, 56, 49, 51, 52, 53, 50, 58, 55, 56, 58, 52, + 57, 58, 52, 48, 13, 10, 48, 58, 56, 51, 51, 52, 53, 50, 58, 55, 56, 58, + 52, 57, 58, 52, 48, 13, 10, 48, 58, 56, 53, 51, 52, 53, 50, 58, 55, 56, + 58, 52, 57, 58, 52, 48, 13, 10, 48, 58, 56, 55, 51, 52, 53, 50, 58, 55, + 56, 58, 52, 57, 58, 52, 48, 13, 10, 48, 58, 56, 57, 51, 52, 53, 50, 58, + 55, 56, 58, 52, 57, 58, 52, 48, 13, 10, 48, 58, 56, 98, 51, 52, 53, 50, + 58, 55, 56, 58, 52, 57, 58, 52, 48, 13, 10, 48, 58, 56,100, 51, 52, 53, + 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 13, 10, 48, 58, 56,102, 51, 52, + 53, 50, 58, 55, 56, 58, 52, 57, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, - 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102, - 105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, - 46, 49, 48, 55, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, - 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, + 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, + 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, + 49, 48, 55, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111, + 119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 10, 10,104,121,112,114,100,117,101,108, 50, 58, 10,104,121,112,114, - 100,117,101,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,104,121,112,101, - 114, 32,100,117,101,108, 32, 40,106, 97,112, 97,110, 32,115,101,116, 32, - 49, 41, 10, 48, 58,102,102,102, 50, 97, 50, 58, 51, 99, 58, 48, 48, 58, - 48, 49, 10, 48, 58,102,102,102, 50,101, 50, 58, 49, 58,102,102, 58,102, - 102, 10, 10, 98,114,100,114,108,105,110,101, 58, 32, 32, 10,115,116, 97, - 114,114,107,114, 58, 32, 10, 98,114,100,114,108,105,110, 98, 58, 32, 32, - 10, 98,114,100,114,108,105,110,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 66,111,114,100,101,114,108,105,110,101, 32, 40, 83,105,100, 97,109, - 32, 98,111,111,116,108,101,103, 41, 10, 48, 58, 57, 51, 56,100, 58, 50, - 58, 48, 48, 58, 48, 48, 10, 10,112,111,112,110,112,111,112, 58, 10,112, - 111,112,110,112,111,112,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112, - 111,112, 32,110, 32,112,111,112, 32, 40,118,101,114, 32, 50, 46, 48, 55, - 97, 32, 49, 57, 57, 56, 47, 48, 50, 47, 48, 57, 41, 10,112,111,112,110, - 112,111,112,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,111,112, 32, - 110, 32,112,111,112, 32, 40,118,101,114, 32, 50, 46, 48, 55,106, 32, 49, - 57, 57, 56, 47, 48, 50, 47, 48, 57, 41, 10, 48, 58, 52, 48, 97, 54, 54, - 56, 58,100, 50, 58, 48, 48, 58, 98, 97, 10, 10, 59, 42, 42, 32,116,104, - 105,115, 32,115, 97,118,101,115, 32,115, 99,111,114,101,115, 32, 52, 32, - 45, 32, 57, 56, 32, 44, 32,116,104,101, 32,110,118,114, 97,109, 32,102, - 105,108,101, 32,115, 97,118,101,115, 32,115, 99,111,114,101,115, 32, 49, - 32, 45, 32, 51, 32, 42, 42, 10,116,101,109,112,101,115,116, 58, 32, 59, - 42, 42, 42, 42, 42, 42,116,101,109,112,101,115,116, 32, 40,114,101,118, - 32, 51, 41, 32, 42, 10,116,101,109,112,101,115,116, 49, 58, 32, 59, 42, - 42, 42, 42, 42, 42,116,101,109,112,101,115,116, 32, 40,114,101,118, 32, - 49, 41, 32, 42, 10,116,101,109,112,101,115,116, 50, 58, 32, 59, 42, 42, - 42, 42, 42, 42,116,101,109,112,101,115,116, 32, 40,114,101,118, 32, 50, - 41, 32, 42, 10,116,101,109,112,116,117, 98,101, 58, 32, 59, 42, 42, 42, - 42, 42, 42,116,101,109,112,101,115,116, 32,116,117, 98,101,115, 32, 42, + 42, 13, 10, 13, 10,104,121,112,114,100,117,101,108, 50, 58, 13, 10,104, + 121,112,114,100,117,101,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,104, + 121,112,101,114, 32,100,117,101,108, 32, 40,106, 97,112, 97,110, 32,115, + 101,116, 32, 49, 41, 13, 10, 48, 58,102,102,102, 50, 97, 50, 58, 51, 99, + 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,102,102,102, 50,101, 50, 58, 49, + 58,102,102, 58,102,102, 13, 10, 13, 10, 98,114,100,114,108,105,110,101, + 58, 13, 10,115,116, 97,114,114,107,114, 58, 13, 10, 98,114,100,114,108, + 105,110, 98, 58, 13, 10, 98,114,100,114,108,105,110,115, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 66,111,114,100,101,114,108,105,110,101, 32, 40, + 83,105,100, 97,109, 32, 98,111,111,116,108,101,103, 41, 13, 10, 48, 58, + 57, 51, 56,100, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,112,111, + 112,110,112,111,112, 58, 13, 10,112,111,112,110,112,111,112,117, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42,112,111,112, 32,110, 32,112,111,112, 32, + 40,118,101,114, 32, 50, 46, 48, 55, 97, 32, 49, 57, 57, 56, 47, 48, 50, + 47, 48, 57, 41, 13, 10,112,111,112,110,112,111,112,106, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,112,111,112, 32,110, 32,112,111,112, 32, 40,118, + 101,114, 32, 50, 46, 48, 55,106, 32, 49, 57, 57, 56, 47, 48, 50, 47, 48, + 57, 41, 13, 10, 48, 58, 52, 48, 97, 54, 54, 56, 58,100, 50, 58, 48, 48, + 58, 98, 97, 13, 10, 13, 10, 59, 42, 42, 32,116,104,105,115, 32,115, 97, + 118,101,115, 32,115, 99,111,114,101,115, 32, 52, 32, 45, 32, 57, 56, 32, + 44, 32,116,104,101, 32,110,118,114, 97,109, 32,102,105,108,101, 32,115, + 97,118,101,115, 32,115, 99,111,114,101,115, 32, 49, 32, 45, 32, 51, 32, + 42, 42, 13, 10,116,101,109,112,101,115,116, 58, 32, 59, 42, 42, 42, 42, + 42, 42,116,101,109,112,101,115,116, 32, 40,114,101,118, 32, 51, 41, 32, + 42, 13, 10,116,101,109,112,101,115,116, 49, 58, 32, 59, 42, 42, 42, 42, + 42, 42,116,101,109,112,101,115,116, 32, 40,114,101,118, 32, 49, 41, 32, + 42, 13, 10,116,101,109,112,101,115,116, 50, 58, 32, 59, 42, 42, 42, 42, + 42, 42,116,101,109,112,101,115,116, 32, 40,114,101,118, 32, 50, 41, 32, + 42, 13, 10,116,101,109,112,116,117, 98,101, 58, 32, 59, 42, 42, 42, 42, + 42, 42,116,101,109,112,101,115,116, 32,116,117, 98,101,115, 32, 42, 13, 10,116,101,109,112,101,115,116, 51, 58, 32, 59, 42, 42, 42, 42, 42, 42, - 116,101,109,112,101,115,116, 32, 40,114,101,118, 32, 63, 41, 32, 42, 10, - 48, 58, 49,100, 58, 49, 58, 48, 51, 58, 48, 51, 10, 48, 58, 54, 48, 53, - 58, 49, 49, 97, 58, 49, 52, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42,102,114,101,101, 32,107,105, 99,107, 32, 40, 98,111,111,116,108,101, - 103, 41, 10,102,114,101,101,107,105, 99,107, 98, 58, 10,102,114,101,101, - 107,105, 99,107, 98, 50, 58, 10,102,114,101,101,107,105, 99,107, 58, 10, - 102,114,101,101,107,105, 99,107, 98, 49, 58, 10,102,114,101,101,107,105, - 99,107, 97, 58, 10, 48, 58,100, 49, 48, 48, 58, 52,100, 58, 48, 48, 58, - 50, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 98,114, 97,105,110, 10, 98, - 114, 97,105,110, 58, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, 48, 48, - 58, 52, 57, 10, 48, 58, 99, 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 53, - 10, 10,116,117,114,116,115,104,105,112, 58, 10,116,117,114,116,115,104, - 105,112,107, 58, 32, 32, 10,116,117,114,116,115,104,105,112,106, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,116,117,114,116,108,101, 32,115,104,105, - 112, 32, 40,106, 97,112, 97,110, 41, 10,116,117,114,116,115,104,105,112, - 107,110, 58, 10,116,117,114,116,115,104,105,112,107,111, 58, 10, 48, 58, - 99, 53, 48, 52, 58, 57, 54, 58, 48, 48, 58, 48, 97, 10, 48, 58, 99, 50, - 48, 50, 58, 50, 58, 48, 48, 58, 49,101, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 68, 97,105,107, 97,105,106,117, 32,110,111, 32, 71,121, 97,107,117, - 115,104,117, 10,100, 97,105,107, 97,105,106,117, 58, 10, 48, 58, 98,102, - 48, 48, 58, 97, 48, 58, 48, 48, 58, 51, 51, 10, 48, 58, 97, 48, 48, 55, - 58, 51, 58, 48, 48, 58, 48, 53, 10, 48, 58, 97, 48, 50, 55, 58, 49, 58, - 50, 51, 58, 50, 51, 10, 48, 58,100, 55, 57, 56, 58, 98, 58, 51, 48, 58, - 51, 48, 10, 10, 59, 42, 42, 32,111,110,108,121, 32,116,111,112, 32,115, - 99,111,114,101, 32,115, 97,118,101,100, 32,112,114,111,112,101,114,108, - 121, 44, 32, 97,108,116,104,111,117,103,104, 32, 97,108,108, 32,111,116, - 104,101,114, 32,115, 99,111,114,101,115, 32,100,111, 32,115, 97,118,101, - 32, 42, 42, 10, 59, 42, 42, 32,116,104,101,121, 32,103,111, 32,105,110, - 32,116,104,101, 32,119,114,111,110,103, 32,111,114,100,101,114, 32, 63, - 63, 63, 63, 32, 42, 42, 10,109, 97,100, 97,108,105,101,110, 58, 10,109, - 97,100, 97,108,105,101,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 77, 97,100, 32, 65,108,105,101,110, 32, 40, 72,105,103,104,119, 97,121, - 32, 67,104, 97,115,101, 41, 10,109, 97,100, 97,108,105,101,110, 98, 58, - 10, 48, 58, 48, 48, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54,101,102, 48, 58,100, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, - 48, 58, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 52,100, 58, 53, - 58, 48, 49, 58, 48, 49, 10, 48, 58, 54, 48, 53, 48, 58, 49, 58, 48, 49, - 58, 48, 49, 10, 10,115,112, 97, 99,101,111,100, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,115,112, 97, 99,101, 32,111,100,101,115,115,121, 32, 40, - 102,105,120,101,100, 41, 32, 42, 10,115,112, 97, 99,101,111,100, 50, 58, - 10, 48, 58, 99, 57, 48, 55, 58, 50, 58, 48, 58, 48, 10, 48, 58, 99, 57, - 50, 49, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10,109,111,110,115,116,101, - 114, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,111,110,115,116,101, - 114, 32, 98, 97,115,104, 32, 40,102,105,120,101,100, 41, 32, 32, 42, 10, - 109,111,110,115,116,101,114, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42,109,111,110,115,116,101,114, 32, 98, 97,115,104, 32, 40, 50, 32, 98, - 111, 97,114,100, 32,118,101,114,115,105,111,110, 41, 32, 40,102,105,120, - 101,100, 41, 32, 32, 42, 10, 48, 58, 99, 57, 49, 51, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 99, 56,102, 54, 58, 49, 58, 48,100, 58, 48,100, - 10, 10, 48, 48, 53, 58, 32, 59, 42, 42, 42, 42, 42, 42, 48, 48, 53, 32, - 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116, - 111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97, - 110, 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10, - 48, 58, 99, 57, 49, 48, 58, 48, 98, 58, 57, 57, 58, 48, 48, 10, 10,100, + 116,101,109,112,101,115,116, 32, 40,114,101,118, 32, 63, 41, 32, 42, 13, + 10, 48, 58, 49,100, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 54, + 48, 53, 58, 49, 49, 97, 58, 49, 52, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42,102,114,101,101, 32,107,105, 99,107, 32, 40, 98,111, + 111,116,108,101,103, 41, 13, 10,102,114,101,101,107,105, 99,107, 98, 58, + 13, 10,102,114,101,101,107,105, 99,107, 98, 50, 58, 13, 10,102,114,101, + 101,107,105, 99,107, 58, 13, 10,102,114,101,101,107,105, 99,107, 98, 49, + 58, 13, 10,102,114,101,101,107,105, 99,107, 97, 58, 13, 10, 48, 58,100, + 49, 48, 48, 58, 52,100, 58, 48, 48, 58, 50, 49, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 98,114, 97,105,110, 13, 10, 98,114, 97,105,110, 58, + 13, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 52, 57, 13, + 10, 48, 58, 99, 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, 13, + 10,116,117,114,116,115,104,105,112, 58, 13, 10,116,117,114,116,115,104, + 105,112,107, 58, 13, 10,116,117,114,116,115,104,105,112,106, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42,116,117,114,116,108,101, 32,115,104,105,112, + 32, 40,106, 97,112, 97,110, 41, 13, 10,116,117,114,116,115,104,105,112, + 107,110, 58, 13, 10,116,117,114,116,115,104,105,112,107,111, 58, 13, 10, + 48, 58, 99, 53, 48, 52, 58, 57, 54, 58, 48, 48, 58, 48, 97, 13, 10, 48, + 58, 99, 50, 48, 50, 58, 50, 58, 48, 48, 58, 49,101, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 68, 97,105,107, 97,105,106,117, 32,110,111, 32, + 71,121, 97,107,117,115,104,117, 13, 10,100, 97,105,107, 97,105,106,117, + 58, 13, 10, 48, 58, 98,102, 48, 48, 58, 97, 48, 58, 48, 48, 58, 51, 51, + 13, 10, 48, 58, 97, 48, 48, 55, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, + 48, 58, 97, 48, 50, 55, 58, 49, 58, 50, 51, 58, 50, 51, 13, 10, 48, 58, + 100, 55, 57, 56, 58, 98, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, + 42, 32,111,110,108,121, 32,116,111,112, 32,115, 99,111,114,101, 32,115, + 97,118,101,100, 32,112,114,111,112,101,114,108,121, 44, 32, 97,108,116, + 104,111,117,103,104, 32, 97,108,108, 32,111,116,104,101,114, 32,115, 99, + 111,114,101,115, 32,100,111, 32,115, 97,118,101, 32, 42, 42, 13, 10, 59, + 42, 42, 32,116,104,101,121, 32,103,111, 32,105,110, 32,116,104,101, 32, + 119,114,111,110,103, 32,111,114,100,101,114, 32, 63, 63, 63, 63, 32, 42, + 42, 13, 10,109, 97,100, 97,108,105,101,110, 58, 13, 10,109, 97,100, 97, + 108,105,101,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,100, + 32, 65,108,105,101,110, 32, 40, 72,105,103,104,119, 97,121, 32, 67,104, + 97,115,101, 41, 13, 10,109, 97,100, 97,108,105,101,110, 98, 58, 13, 10, + 48, 58, 48, 48, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 54,101,102, 48, 58,100, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, + 48, 48, 58, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 52,100, + 58, 53, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 54, 48, 53, 48, 58, 49, + 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,115,112, 97, 99,101,111,100, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,111,100,101, + 115,115,121, 32, 40,102,105,120,101,100, 41, 32, 42, 13, 10,115,112, 97, + 99,101,111,100, 50, 58, 13, 10, 48, 58, 99, 57, 48, 55, 58, 50, 58, 48, + 58, 48, 13, 10, 48, 58, 99, 57, 50, 49, 58, 49, 58, 48, 53, 58, 48, 53, + 13, 10, 13, 10,109,111,110,115,116,101,114, 98, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,109,111,110,115,116,101,114, 32, 98, 97,115,104, 32, 40, + 102,105,120,101,100, 41, 32, 32, 42, 13, 10,109,111,110,115,116,101,114, + 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,111,110,115,116,101, + 114, 32, 98, 97,115,104, 32, 40, 50, 32, 98,111, 97,114,100, 32,118,101, + 114,115,105,111,110, 41, 32, 40,102,105,120,101,100, 41, 32, 32, 42, 13, + 10, 48, 58, 99, 57, 49, 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 99, 56,102, 54, 58, 49, 58, 48,100, 58, 48,100, 13, 10, 13, 10, 48, + 48, 53, 58, 32, 59, 42, 42, 42, 42, 42, 42, 48, 48, 53, 32, 59, 91, 83, + 112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, + 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105, + 110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, 48, 58, + 99, 57, 49, 48, 58, 48, 98, 58, 57, 57, 58, 48, 48, 13, 10, 13, 10,100, 100,101,110,108,111,118,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100, 111,110, 32,100,101,110, 32,108,111,118,101,114, 32,118,111,108, 46, 49, - 32, 40,104,111,110,103, 32, 75,111,110,103, 41, 10, 48, 58,102,102, 56, - 53, 51, 97, 58, 55, 52, 58, 56, 50, 58, 51, 99, 32, 10, 10,116,114,121, - 111,117,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,114,111, 32, 98, - 97,115,101, 98, 97,108,108, 32,115,107,105,108,108, 32,116,114,121,111, - 117,116, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 51, 49, 57, 58, 50, - 57, 58, 57, 48, 58, 48, 48, 10, 48, 58, 51, 51,100, 58, 49, 58, 48, 49, - 58, 48, 49, 10, 48, 58, 49, 51, 58, 51, 58, 48, 55, 58, 57, 48, 10, 10, - 110,115,108, 97,115,104,101,114, 58, 32, 32, 10,110,115,108, 97,115,104, - 101,114,106, 58, 32, 32, 10,110,115,108, 97,115,104,101,114,117, 58, 10, - 110,115,108, 97,115,104,101,114,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 78,105,103,104,116, 32, 83,108, 97,115,104,101,114,115, 32, 40, 79, - 118,101,114, 32, 83,101, 97, 32, 82,101,118, 32, 49, 46, 50, 41, 10, 48, - 58, 49, 48, 48, 48, 52, 52, 58, 53, 48, 58, 49, 51, 58, 48, 48, 10, 48, - 58, 49, 48, 48, 48, 57, 50, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10,107, - 98, 97,115,104, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75,110,117, - 99,107,108,101, 32, 66, 97,115,104, 32, 50, 32, 40, 98,111,111,116,108, - 101,103, 41, 10, 48, 58, 49, 48, 48, 48, 56, 48, 58, 51, 99, 58, 48, 48, - 58, 51, 48, 10, 10,117,112,115, 99,111,112,101, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 85,112, 32, 83, 99,111,112,101, 10, 48, 58, 51,101, 52, - 102, 54, 58, 49,101, 58, 52, 51, 58, 52, 53, 10, 48, 58, 51,101, 53,102, - 99, 58, 50, 56, 58, 48, 48, 58, 57, 56, 10, 10,116,104,101,112,105,116, - 106, 58, 10,116,104,101,112,105,116,117, 49, 58, 10,116,104,101,112,105, - 116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 80,105,116, - 32, 40, 66,111,111,116,108,101,103, 41, 10, 48, 58, 56, 50, 56, 51, 58, - 49, 55, 58, 49, 48, 58, 48, 10, 48, 58, 56, 48, 51, 57, 58,102, 58, 49, - 48, 58, 48, 10, 10,116,104,101,112,105,116,109, 58, 10, 48, 58, 56, 50, - 56, 51, 58, 49, 55, 58, 49, 52, 58, 48, 10, 48, 58, 56, 48, 51, 57, 58, - 102, 58, 49, 52, 58, 48, 10, 10,116,104,101,112,105,116,117, 50, 58, 10, - 48, 58, 56, 50, 56, 51, 58, 49, 55, 58, 49, 48, 58, 48, 48, 10, 48, 58, - 56, 48, 51, 55, 58,102, 58, 49, 48, 58, 48, 48, 10, 10, 97,109,105,100, - 97,114, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110, - 107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32, - 101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110,116, - 114,121, 93, 10, 97,109,105,100, 97,114, 98, 58, 10, 97,109,105,100, 97, - 114,111, 58, 10, 97,109,105,100, 97,114,117, 58, 32, 10, 97,109,105,103, - 111, 58, 10, 97,109,105,100, 97,114, 49, 58, 10, 48, 58, 56, 50, 48, 48, - 58, 49,101, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56, 48, 97, 56, 58, 48, - 51, 58, 48, 48, 58, 48, 49, 10, 10, 97,109,105,100, 97,114,115, 58, 10, - 48, 58, 52, 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 10, 48, 58, - 52, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 10, 10,114,101, 97, - 108, 98,114,107, 58, 10,114,101, 97,108, 98,114,107,106, 58, 32, 32, 10, - 114,101, 97,108, 98,114,107,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 66,105,108,108,105, 97,114,100, 32, 65, 99, 97,100,101,109,121, 32, 82, - 101, 97,108, 32, 66,114,101, 97,107, 32, 40, 75,111,114,101, 97, 41, 10, - 114,101, 97,108, 98,114,107,111, 58, 10, 48, 58,102,102, 56, 52,100, 97, - 58, 52, 52, 58, 53, 50, 58,102, 56, 10, 10,109, 97,110,103, 99,104,105, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,110,103, 45, 67,104,105, - 10, 48, 58, 49, 99, 49, 98, 48, 50, 58, 52, 99, 58, 50, 55, 58, 50, 48, - 10, 10, 99, 97,119,105,110,103, 58, 10, 99, 97,119,105,110,103,106, 58, - 32, 10, 99, 97,119,105,110,103,117, 58, 10, 99, 97,119,105,110,103,114, - 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97,114,114,105,101,114, - 32, 65,105,114, 32, 87,105,110,103, 32, 40, 87,111,114,108,100, 32, 57, - 48, 49, 48, 48, 57, 41, 10, 99, 97,119,105,110,103, 98,108, 58, 10, 99, - 97,119,105,110,103, 98, 50, 58, 10, 48, 58,102,102,100, 57, 98, 52, 58, - 50, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,100, 97, 48, 52, 58, - 49, 52, 58,102,102, 58,100, 52, 10, 48, 58,102,102,100, 97, 50, 99, 58, - 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 32,112,117, 99, - 107,109, 97,110, 47,112, 97, 99,109, 97,110, 32, 40, 97,110,100, 32, 99, - 108,111,110,101,115, 41, 32,102,111,114, 32,112, 97, 99,109, 97,109,101, - 32, 38, 32,114,101,103,117,108, 97,114, 32,109, 97,109,101, 32, 98,117, - 105,108,100,115, 32, 42, 42, 10,104, 97,110,103,108,121, 51, 58, 10,122, - 111,108, 97,109, 97,122,101, 58, 10,109,115,112, 97,116,107,120, 58, 10, - 109,115,112, 97, 99,120, 58, 10,109,115,109,105,110,105, 58, 10,109,115, - 112, 97, 99, 97,116, 50, 58, 10,109,115, 97,116,107, 50, 97,100, 58, 10, - 109,115, 97,116,107, 97,100, 58, 10,109,115,112, 97, 99, 97,116,107, 58, - 10, 99,104,116,109,115, 97,116,107, 58, 10,102, 97,115,116,112,108,117, - 115, 58, 10,109,115,112, 97, 99, 97,116, 98, 58, 10,109,115,104,101, 97, - 114,116,115, 58, 10,109,115,115,105,108, 97,100, 58, 10,102,115,116,109, - 115, 97,116,107, 58, 10,109,115,112, 97, 99, 54,109, 58, 10,109,115,109, - 105,110,105, 97, 58, 10, 99,104,116,109,115,112, 97, 58, 10,102, 97,115, - 116,109,115,112, 97, 58, 10,109,115,114,117,109, 98,108,101, 58, 10,109, - 115,105,110,100,121, 58, 10,102, 97,115,116,104,101, 97,114, 58, 10,104, - 101, 97,114,116, 98,114,110, 58, 10,109,115,104, 97,110,103,108,121, 58, - 10,109,115,102, 49,112, 97, 99, 58, 10,109,115,101,108,116,111,110, 58, - 10,102, 97,115,116,115,116,114,109, 58, 10,109,115,100,115,116,111,114, - 109, 58, 10,109,115, 98, 97, 98,121, 49, 58, 10,109,115, 98, 97, 98,121, - 58, 10,109,114,112, 97, 99,109, 97,110, 58, 10,112, 97, 99,109, 97,110, - 102, 58, 10,112,117, 99,107,109, 97,110,102, 58, 10,112, 97, 99,109,105, - 110,105, 50, 58, 10,112, 97, 99,109,105,110,105, 58, 10,109, 97,122,101, - 109, 97,110, 58, 10,104, 97,110,103,108,121, 50,120, 58, 10,104, 97,110, - 103,108,121,120, 58, 10,104, 97,110,103,108,121, 97,100, 58, 10,102, 97, - 115,116,104, 97,110,103, 58, 10, 99,104,116,104, 97,110,103, 58, 10,101, - 108,116,111,110,112, 97, 99, 58, 10,100,105,122,122,121, 58, 10,112, 97, - 99,115,116,114,109, 58, 10, 99,114, 97,122,121,112, 97, 99, 58, 10, 99, - 97,116,101,114,112,105,108, 58, 10, 98, 97, 98,121, 50, 58, 10, 98, 97, - 98,121, 51, 58, 10,112, 97, 99,109, 97,110, 58, 10,112, 97, 99,109, 97, - 110,109, 58, 10,112, 97, 99,109, 97,110,106,112, 58, 10,110,112, 97, 99, - 109,111,100, 58, 10,112, 97, 99,109,111,100, 58, 10,104, 97,110,103,108, - 121, 58, 10,104, 97,110,103,108,121, 50, 58, 10,112,117, 99,107,109, 97, - 110, 58, 10,112,117, 99,107,109, 97,110, 98, 58, 10,112,105,114, 97,110, - 104, 97, 58, 10,112,105,114, 97,110,104, 97,104, 58, 10,112, 97, 99,112, - 108,117,115, 58, 10,109,115,112, 97, 99,109, 97,110, 58, 10,109,115,112, - 97, 99,109,110,102, 58, 10,109,115, 99,104, 97,109,112,115, 58, 10,110, - 101,119,112,117, 99, 50, 58, 10,110,101,119,112,117, 99, 50, 98, 58, 32, - 10,106,111,121,109, 97,110, 58, 32, 10,109,115,112, 97, 99,112,108,115, - 58, 10,112, 97, 99,103, 97,108, 58, 10,110,101,119,112,117, 99,107,120, - 58, 10, 97,108,105, 98, 97, 98, 97, 58, 10,109,115,112, 97, 99,109, 97, - 116, 58, 32, 10,112,117, 99,107,109,111,100, 58, 10,112,117, 99,107,109, - 97,110, 97, 58, 10, 99,116,114,112,108,108,114,112, 58, 32, 32, 10,112, - 117, 99,107,109, 97,110,104, 58, 32, 10,112,105,114, 97,110,104, 97,111, - 58, 10, 97, 98,115, 99, 97,109, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 65, 98,115, 99, 97,109, 32, 10,109,115,112, 97, 99,109, 98,101, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 77,115, 46, 32, 80, 97, 99, 45, 77, 97, - 110, 32, 40, 98,111,111,116,108,101,103, 44, 32, 40,101,110, 99,114,121, - 112,116,101,100, 41, 41, 10,112,111,112,101,121,101,109, 97,110, 58, 10, - 98,117, 99, 97,110,101,114, 58, 10, 97,108,105, 98, 97, 98, 97, 98, 58, - 10, 99,114,111, 99,107,109, 97,110, 58, 10,109,115,112, 97, 99,105,105, - 58, 10,109,115,112, 97, 99,105,105, 50, 58, 10,109,115,104,101, 97,114, - 116, 98, 58, 10,109,115,112, 97, 99,109, 97,110, 98,103, 58, 10,109,115, - 112, 97, 99,109, 97,110, 99,114, 58, 10,109,115,112, 97, 99,109, 97,110, - 98, 99, 99, 58, 10,109,115,112, 97, 99,109, 97,110, 98,103,100, 58, 10, - 112, 97, 99,109, 97,110,106,112,109, 58, 10,112, 97, 99,103, 97,108, 50, - 58, 10, 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, - 10, 48, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, 10, - 48, 48, 58, 52, 51, 68, 49, 58, 48, 49, 58, 52, 56, 58, 52, 56, 10, 10, - 109,115,112, 97, 99,109, 97,110, 98,104,101, 58, 10,112, 97, 99,109, 97, - 110,112,101, 58, 10,112, 97, 99,109, 97,110,115,111, 58, 10, 48, 48, 58, - 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, 48, 58, 52, - 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, 10, 48, 48, 58, 52, 51, - 99, 54, 58, 48, 49, 58, 53, 53, 58, 53, 53, 10, 10, 99,108,117, 98,112, - 97, 99,109, 58, 10, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, - 10, 48, 58, 52, 51, 68, 49, 58, 48, 49, 58, 53, 57, 58, 53, 57, 10, 48, - 58, 52, 51, 99, 98, 58, 48, 97, 58, 52,102, 58, 52,100, 10, 10,109,115, - 112, 97, 99,109, 97,110, 98,108,116, 58, 10, 48, 48, 58, 52, 69, 56, 56, - 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, 48, 58, 52, 51, 69, 68, 58, - 48, 54, 58, 52, 48, 58, 52, 48, 10, 48, 48, 58, 52, 51, 68, 49, 58, 48, - 49, 58, 53, 52, 58, 53, 52, 10, 10,112, 97, 99,117,109, 97,110, 58, 10, - 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, - 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, 10, 48, 48, - 58, 52, 51, 68, 49, 58, 48, 49, 58, 52, 53, 58, 52, 53, 10, 10,112, 97, - 99, 57, 48, 58, 10, 48, 58, 56,101, 56, 56, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 56, 49, 56, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, - 58, 56, 49, 97, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 56, 49, - 99, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 56, 49,101, 48, 58, - 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 56, 50, 48, 48, 58, 49, 58, 52, - 48, 58, 52, 48, 10, 48, 58, 56, 50, 50, 48, 58, 49, 58, 52, 48, 58, 52, - 48, 10, 48, 58, 56,100, 99,101, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, - 59, 42, 42, 32,119, 97,114,100,110,101,114, 44,119, 97,114,100,110,101, - 114, 32, 40,106, 97,112, 97,110, 41, 44,112,121,114,111,115, 32, 97,108, - 108, 32,102,105,120,101,100, 32, 32, 42, 32, 10,119, 97,114,100,110,101, - 114, 58, 10,119, 97,114,100,110,101,114,106, 58, 10,112,121,114,111,115, - 58, 10, 48, 58, 55, 49, 49, 54, 58, 53,100, 58, 48, 48, 58, 48, 49, 10, - 48, 58, 55, 49, 49, 97, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10,112, 97, - 110,103,112, 97,110,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80, 97, - 110,103, 32, 80, 97,110,103, 10, 48, 58, 49, 50, 51, 99, 49, 48, 58, 97, - 48, 58, 52, 52, 58, 53, 48, 10, 10,102, 97,110,116,115,105, 97, 50, 58, - 10,102, 97,110,116,115,105, 97, 50, 97, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 70, 97,110,116, 97,115,105, 97, 32, 73, 73, 32, 40,115,101,116, - 32, 50, 44, 32,108,101,115,115, 32,101,120,112,108,105, 99,105,116, 41, - 10,102, 97,110,116,115,105, 97, 50,110, 58, 10, 48, 58,102, 56, 50, 53, - 98, 54, 58, 54, 52, 58, 51, 48, 58, 48, 48, 10, 10, 98,111,110,122,101, - 97,100,118, 58, 10, 98,111,110,122,101, 97,100,118,111, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 66,111,110,122,101, 32, 65,100,118,101,110,116, - 117,114,101, 32, 40, 87,111,114,108,100, 44, 32, 79,108,100,101,114, 41, - 10, 98,111,110,122,101, 97,100,118,117, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 66,111,110,122,101, 32, 65,100,118,101,110,116,117,114,101, 32, - 40,117,115, 41, 10,106,105,103,107,109,103,114,105, 58, 10, 48, 58, 49, - 48,100, 53, 53, 52, 58, 51, 50, 58, 48, 48, 58, 50, 97, 10, 48, 58, 49, - 48,100, 53, 50, 97, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, - 100, 53, 50, 98, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, 98,111,110,122, - 101, 97,100,118,112, 58, 10, 48, 58, 49, 48,100, 53, 53, 50, 58, 51, 50, - 58, 48, 48, 58, 50, 97, 10, 48, 58, 49, 48,100, 53, 50, 56, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 49, 48,100, 53, 50, 57, 58, 49, 58, 48, - 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 32, 40,104,111,110,103, 32, 75,111,110,103, 41, 13, 10, 48, 58,102,102, + 56, 53, 51, 97, 58, 55, 52, 58, 56, 50, 58, 51, 99, 13, 10, 13, 10,116, + 114,121,111,117,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,114,111, + 32, 98, 97,115,101, 98, 97,108,108, 32,115,107,105,108,108, 32,116,114, + 121,111,117,116, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58, 51, 49, + 57, 58, 50, 57, 58, 57, 48, 58, 48, 48, 13, 10, 48, 58, 51, 51,100, 58, + 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 49, 51, 58, 51, 58, 48, 55, + 58, 57, 48, 13, 10, 13, 10,110,115,108, 97,115,104,101,114, 58, 13, 10, + 110,115,108, 97,115,104,101,114,106, 58, 13, 10,110,115,108, 97,115,104, + 101,114,117, 58, 13, 10,110,115,108, 97,115,104,101,114,115, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 78,105,103,104,116, 32, 83,108, 97,115,104, + 101,114,115, 32, 40, 79,118,101,114, 32, 83,101, 97, 32, 82,101,118, 32, + 49, 46, 50, 41, 13, 10, 48, 58, 49, 48, 48, 48, 52, 52, 58, 53, 48, 58, + 49, 51, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 48, 57, 50, 58, 49, 58, + 48, 53, 58, 48, 53, 13, 10, 13, 10,107, 98, 97,115,104, 50, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 75,110,117, 99,107,108,101, 32, 66, 97,115, + 104, 32, 50, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10, 48, 58, 49, + 48, 48, 48, 56, 48, 58, 51, 99, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, + 117,112,115, 99,111,112,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 85, + 112, 32, 83, 99,111,112,101, 13, 10, 48, 58, 51,101, 52,102, 54, 58, 49, + 101, 58, 52, 51, 58, 52, 53, 13, 10, 48, 58, 51,101, 53,102, 99, 58, 50, + 56, 58, 48, 48, 58, 57, 56, 13, 10, 13, 10,116,104,101,112,105,116,106, + 58, 13, 10,116,104,101,112,105,116,117, 49, 58, 13, 10,116,104,101,112, + 105,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 80,105, + 116, 32, 40, 66,111,111,116,108,101,103, 41, 13, 10, 48, 58, 56, 50, 56, + 51, 58, 49, 55, 58, 49, 48, 58, 48, 13, 10, 48, 58, 56, 48, 51, 57, 58, + 102, 58, 49, 48, 58, 48, 13, 10, 13, 10,116,104,101,112,105,116,109, 58, + 13, 10, 48, 58, 56, 50, 56, 51, 58, 49, 55, 58, 49, 52, 58, 48, 13, 10, + 48, 58, 56, 48, 51, 57, 58,102, 58, 49, 52, 58, 48, 13, 10, 13, 10,116, + 104,101,112,105,116,117, 50, 58, 13, 10, 48, 58, 56, 50, 56, 51, 58, 49, + 55, 58, 49, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 51, 55, 58,102, 58, + 49, 48, 58, 48, 48, 13, 10, 13, 10, 97,109,105,100, 97,114, 58, 32, 59, + 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, + 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, + 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, + 97,109,105,100, 97,114, 98, 58, 13, 10, 97,109,105,100, 97,114,111, 58, + 13, 10, 97,109,105,100, 97,114,117, 58, 13, 10, 97,109,105,103,111, 58, + 13, 10, 97,109,105,100, 97,114, 49, 58, 13, 10, 48, 58, 56, 50, 48, 48, + 58, 49,101, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 56, 48, 97, 56, 58, + 48, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 97,109,105,100, 97,114, + 115, 58, 13, 10, 48, 58, 52, 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, + 49, 13, 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, + 13, 10, 13, 10,114,101, 97,108, 98,114,107, 58, 13, 10,114,101, 97,108, + 98,114,107,106, 58, 13, 10,114,101, 97,108, 98,114,107,107, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 66,105,108,108,105, 97,114,100, 32, 65, 99, + 97,100,101,109,121, 32, 82,101, 97,108, 32, 66,114,101, 97,107, 32, 40, + 75,111,114,101, 97, 41, 13, 10,114,101, 97,108, 98,114,107,111, 58, 13, + 10, 48, 58,102,102, 56, 52,100, 97, 58, 52, 52, 58, 53, 50, 58,102, 56, + 13, 10, 13, 10,109, 97,110,103, 99,104,105, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 77, 97,110,103, 45, 67,104,105, 13, 10, 48, 58, 49, 99, 49, + 98, 48, 50, 58, 52, 99, 58, 50, 55, 58, 50, 48, 13, 10, 13, 10, 99, 97, + 119,105,110,103, 58, 13, 10, 99, 97,119,105,110,103,106, 58, 13, 10, 99, + 97,119,105,110,103,117, 58, 13, 10, 99, 97,119,105,110,103,114, 49, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97,114,114,105,101,114, 32, 65, + 105,114, 32, 87,105,110,103, 32, 40, 87,111,114,108,100, 32, 57, 48, 49, + 48, 48, 57, 41, 13, 10, 99, 97,119,105,110,103, 98,108, 58, 13, 10, 99, + 97,119,105,110,103, 98, 50, 58, 13, 10, 48, 58,102,102,100, 57, 98, 52, + 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,100, 97, 48, + 52, 58, 49, 52, 58,102,102, 58,100, 52, 13, 10, 48, 58,102,102,100, 97, + 50, 99, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 32,112,117, 99,107,109, 97,110, 47,112, 97, 99,109, 97,110, 32, 40, + 97,110,100, 32, 99,108,111,110,101,115, 41, 32,102,111,114, 32,112, 97, + 99,109, 97,109,101, 32, 38, 32,114,101,103,117,108, 97,114, 32,109, 97, + 109,101, 32, 98,117,105,108,100,115, 32, 42, 42, 13, 10,104, 97,110,103, + 108,121, 51, 58, 13, 10,122,111,108, 97,109, 97,122,101, 58, 13, 10,109, + 115,112, 97,116,107,120, 58, 13, 10,109,115,112, 97, 99,120, 58, 13, 10, + 109,115,109,105,110,105, 58, 13, 10,109,115,112, 97, 99, 97,116, 50, 58, + 13, 10,109,115, 97,116,107, 50, 97,100, 58, 13, 10,109,115, 97,116,107, + 97,100, 58, 13, 10,109,115,112, 97, 99, 97,116,107, 58, 13, 10, 99,104, + 116,109,115, 97,116,107, 58, 13, 10,102, 97,115,116,112,108,117,115, 58, + 13, 10,109,115,112, 97, 99, 97,116, 98, 58, 13, 10,109,115,104,101, 97, + 114,116,115, 58, 13, 10,109,115,115,105,108, 97,100, 58, 13, 10,102,115, + 116,109,115, 97,116,107, 58, 13, 10,109,115,112, 97, 99, 54,109, 58, 13, + 10,109,115,109,105,110,105, 97, 58, 13, 10, 99,104,116,109,115,112, 97, + 58, 13, 10,102, 97,115,116,109,115,112, 97, 58, 13, 10,109,115,114,117, + 109, 98,108,101, 58, 13, 10,109,115,105,110,100,121, 58, 13, 10,102, 97, + 115,116,104,101, 97,114, 58, 13, 10,104,101, 97,114,116, 98,114,110, 58, + 13, 10,109,115,104, 97,110,103,108,121, 58, 13, 10,109,115,102, 49,112, + 97, 99, 58, 13, 10,109,115,101,108,116,111,110, 58, 13, 10,102, 97,115, + 116,115,116,114,109, 58, 13, 10,109,115,100,115,116,111,114,109, 58, 13, + 10,109,115, 98, 97, 98,121, 49, 58, 13, 10,109,115, 98, 97, 98,121, 58, + 13, 10,109,114,112, 97, 99,109, 97,110, 58, 13, 10,112, 97, 99,109, 97, + 110,102, 58, 13, 10,112,117, 99,107,109, 97,110,102, 58, 13, 10,112, 97, + 99,109,105,110,105, 50, 58, 13, 10,112, 97, 99,109,105,110,105, 58, 13, + 10,109, 97,122,101,109, 97,110, 58, 13, 10,104, 97,110,103,108,121, 50, + 120, 58, 13, 10,104, 97,110,103,108,121,120, 58, 13, 10,104, 97,110,103, + 108,121, 97,100, 58, 13, 10,102, 97,115,116,104, 97,110,103, 58, 13, 10, + 99,104,116,104, 97,110,103, 58, 13, 10,101,108,116,111,110,112, 97, 99, + 58, 13, 10,100,105,122,122,121, 58, 13, 10,112, 97, 99,115,116,114,109, + 58, 13, 10, 99,114, 97,122,121,112, 97, 99, 58, 13, 10, 99, 97,116,101, + 114,112,105,108, 58, 13, 10, 98, 97, 98,121, 50, 58, 13, 10, 98, 97, 98, + 121, 51, 58, 13, 10,112, 97, 99,109, 97,110, 58, 13, 10,112, 97, 99,109, + 97,110,109, 58, 13, 10,112, 97, 99,109, 97,110,106,112, 58, 13, 10,110, + 112, 97, 99,109,111,100, 58, 13, 10,112, 97, 99,109,111,100, 58, 13, 10, + 104, 97,110,103,108,121, 58, 13, 10,104, 97,110,103,108,121, 50, 58, 13, + 10,112,117, 99,107,109, 97,110, 58, 13, 10,112,117, 99,107,109, 97,110, + 98, 58, 13, 10,112,105,114, 97,110,104, 97, 58, 13, 10,112,105,114, 97, + 110,104, 97,104, 58, 13, 10,112, 97, 99,112,108,117,115, 58, 13, 10,109, + 115,112, 97, 99,109, 97,110, 58, 13, 10,109,115,112, 97, 99,109,110,102, + 58, 13, 10,109,115, 99,104, 97,109,112,115, 58, 13, 10,110,101,119,112, + 117, 99, 50, 58, 13, 10,110,101,119,112,117, 99, 50, 98, 58, 13, 10,106, + 111,121,109, 97,110, 58, 13, 10,109,115,112, 97, 99,112,108,115, 58, 13, + 10,112, 97, 99,103, 97,108, 58, 13, 10,110,101,119,112,117, 99,107,120, + 58, 13, 10, 97,108,105, 98, 97, 98, 97, 58, 13, 10,109,115,112, 97, 99, + 109, 97,116, 58, 13, 10,112,117, 99,107,109,111,100, 58, 13, 10,112,117, + 99,107,109, 97,110, 97, 58, 13, 10, 99,116,114,112,108,108,114,112, 58, + 13, 10,112,117, 99,107,109, 97,110,104, 58, 13, 10,112,105,114, 97,110, + 104, 97,111, 58, 13, 10, 97, 98,115, 99, 97,109, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 65, 98,115, 99, 97,109, 13, 10,109,115,112, 97, 99,109, + 98,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,115, 46, 32, 80, 97, + 99, 45, 77, 97,110, 32, 40, 98,111,111,116,108,101,103, 44, 32, 40,101, + 110, 99,114,121,112,116,101,100, 41, 41, 13, 10,112,111,112,101,121,101, + 109, 97,110, 58, 13, 10, 98,117, 99, 97,110,101,114, 58, 13, 10, 97,108, + 105, 98, 97, 98, 97, 98, 58, 13, 10, 99,114,111, 99,107,109, 97,110, 58, + 13, 10,109,115,112, 97, 99,105,105, 58, 13, 10,109,115,112, 97, 99,105, + 105, 50, 58, 13, 10,109,115,104,101, 97,114,116, 98, 58, 13, 10,109,115, + 112, 97, 99,109, 97,110, 98,103, 58, 13, 10,109,115,112, 97, 99,109, 97, + 110, 99,114, 58, 13, 10,109,115,112, 97, 99,109, 97,110, 98, 99, 99, 58, + 13, 10,109,115,112, 97, 99,109, 97,110, 98,103,100, 58, 13, 10,112, 97, + 99,109, 97,110,106,112,109, 58, 13, 10,112, 97, 99,103, 97,108, 50, 58, + 13, 10, 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, + 13, 10, 48, 48, 58, 52, 51, 68, 49, 58, 48, 49, 58, 52, 56, 58, 52, 56, + 13, 10, 13, 10,109,115,112, 97, 99,109, 97,110, 98,104,101, 58, 13, 10, + 112, 97, 99,109, 97,110,112,101, 58, 13, 10,112, 97, 99,109, 97,110,115, + 111, 58, 13, 10, 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, + 52, 48, 13, 10, 48, 48, 58, 52, 51, 99, 54, 58, 48, 49, 58, 53, 53, 58, + 53, 53, 13, 10, 13, 10, 99,108,117, 98,112, 97, 99,109, 58, 13, 10, 48, + 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 52, + 51, 68, 49, 58, 48, 49, 58, 53, 57, 58, 53, 57, 13, 10, 48, 58, 52, 51, + 99, 98, 58, 48, 97, 58, 52,102, 58, 52,100, 13, 10, 13, 10,109,115,112, + 97, 99,109, 97,110, 98,108,116, 58, 13, 10, 48, 48, 58, 52, 69, 56, 56, + 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 48, 58, 52, 51, 69, 68, + 58, 48, 54, 58, 52, 48, 58, 52, 48, 13, 10, 48, 48, 58, 52, 51, 68, 49, + 58, 48, 49, 58, 53, 52, 58, 53, 52, 13, 10, 13, 10,112, 97, 99,117,109, + 97,110, 58, 13, 10, 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, + 58, 52, 48, 13, 10, 48, 48, 58, 52, 51, 68, 49, 58, 48, 49, 58, 52, 53, + 58, 52, 53, 13, 10, 13, 10,112, 97, 99, 57, 48, 58, 13, 10, 48, 58, 56, + 101, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 49, 56, + 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 56, 49, 97, 48, 58, + 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 56, 49, 99, 48, 58, 49, 58, + 52, 48, 58, 52, 48, 13, 10, 48, 58, 56, 49,101, 48, 58, 49, 58, 52, 48, + 58, 52, 48, 13, 10, 48, 58, 56, 50, 48, 48, 58, 49, 58, 52, 48, 58, 52, + 48, 13, 10, 48, 58, 56, 50, 50, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, + 10, 48, 58, 56,100, 99,101, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, + 10, 59, 42, 42, 32,119, 97,114,100,110,101,114, 44,119, 97,114,100,110, + 101,114, 32, 40,106, 97,112, 97,110, 41, 44,112,121,114,111,115, 32, 97, + 108,108, 32,102,105,120,101,100, 32, 32, 42, 13, 10,119, 97,114,100,110, + 101,114, 58, 13, 10,119, 97,114,100,110,101,114,106, 58, 13, 10,112,121, + 114,111,115, 58, 13, 10, 48, 58, 55, 49, 49, 54, 58, 53,100, 58, 48, 48, + 58, 48, 49, 13, 10, 48, 58, 55, 49, 49, 97, 58, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 13, 10,112, 97,110,103,112, 97,110,103, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 80, 97,110,103, 32, 80, 97,110,103, 13, 10, 48, 58, + 49, 50, 51, 99, 49, 48, 58, 97, 48, 58, 52, 52, 58, 53, 48, 13, 10, 13, + 10,102, 97,110,116,115,105, 97, 50, 58, 13, 10,102, 97,110,116,115,105, + 97, 50, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70, 97,110,116, 97, + 115,105, 97, 32, 73, 73, 32, 40,115,101,116, 32, 50, 44, 32,108,101,115, + 115, 32,101,120,112,108,105, 99,105,116, 41, 13, 10,102, 97,110,116,115, + 105, 97, 50,110, 58, 13, 10, 48, 58,102, 56, 50, 53, 98, 54, 58, 54, 52, + 58, 51, 48, 58, 48, 48, 13, 10, 13, 10, 98,111,110,122,101, 97,100,118, + 58, 13, 10, 98,111,110,122,101, 97,100,118,111, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 66,111,110,122,101, 32, 65,100,118,101,110,116,117,114, + 101, 32, 40, 87,111,114,108,100, 44, 32, 79,108,100,101,114, 41, 13, 10, + 98,111,110,122,101, 97,100,118,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 66,111,110,122,101, 32, 65,100,118,101,110,116,117,114,101, 32, 40, + 117,115, 41, 13, 10,106,105,103,107,109,103,114,105, 58, 13, 10, 48, 58, + 49, 48,100, 53, 53, 52, 58, 51, 50, 58, 48, 48, 58, 50, 97, 13, 10, 48, + 58, 49, 48,100, 53, 50, 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 49, 48,100, 53, 50, 98, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, + 10, 98,111,110,122,101, 97,100,118,112, 58, 13, 10, 48, 58, 49, 48,100, + 53, 53, 50, 58, 51, 50, 58, 48, 48, 58, 50, 97, 13, 10, 48, 58, 49, 48, + 100, 53, 50, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, + 100, 53, 50, 57, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115, - 116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, - 99,111,114,101, 95,118, 48, 46, 49, 48, 53, 32, 97,100,100,105,116,105, - 111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101, - 122,101,114, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102, + 105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, + 46, 49, 48, 53, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, + 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 98, 97,116,108, 98,117, 98,108, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66, 97,116,116,108,101, 32, 66, - 117, 98, 98,108,101, 32, 40,118, 50, 46, 48, 48, 41, 10, 48, 58,102, 48, - 52, 98, 50, 52, 58, 57, 97, 58, 53, 52, 58, 48, 51, 10, 10,101,121,101, - 115, 58, 10,101,121,101,115, 50, 58, 10,101,121,101,115,122, 97, 99, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,121,101,115, 32, 40, 90, 97, 99, - 99, 97,114,105, 97, 41, 10,101,121,101,115,122, 97, 99, 98, 58, 10,101, - 121,101,115, 98, 58, 10, 48, 58, 52, 99,102, 55, 58, 51, 99, 58, 52, 99, - 58, 48, 48, 10, 48, 58, 52, 51,101,100, 58, 54, 58, 48, 48, 58, 52, 48, - 10, 10,107, 97,122, 97,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78, - 105,110,106, 97, 32, 75, 97,122, 97,110, 32, 40, 87,111,114,108,100, 41, - 10, 48, 58,102, 52, 48, 48, 49, 58, 57, 55, 58, 50, 48, 58, 97, 99, 10, - 48, 58,102, 48, 48, 48, 52, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 102, 48, 48, 49, 48, 58, 48, 56, 58, 51, 48, 58, 51, 48, 10, 10,116,111, - 112,112,121,114, 97,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,111, - 112,112,121, 32, 38, 32,114, 97,112,112,121, 10, 48, 58, 49, 48, 51, 55, - 50,102, 58, 52, 50, 58, 48, 48, 58, 52, 53, 10, 10,114,112, 97,116,114, - 111,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,105,118,101,114, 32, - 80, 97,116,114,111,108, 32, 40, 79,114, 99, 97, 41, 10, 48, 58, 57, 49, - 57, 98, 58, 52, 58, 49, 56, 58, 48, 97, 10, 48, 58, 57, 49, 98, 97, 58, - 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 49, 98, 58, 52, 58, 49, - 56, 58, 48, 97, 10, 48, 58, 57, 50, 51, 97, 58, 54, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 57, 50, 57, 98, 58, 52, 58, 49, 56, 58, 48, 97, 10, 48, - 58, 57, 50, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 99, 99,108,105,109, 98,101,114, 46, 99, 32, 40, - 114,105,118,101,114, 32,112, 97,116,114,111,108, 32, 40, 98,111,111,116, - 108,101,103, 41, 41, 10,114,112, 97,116,114,111,108, 98, 58, 10, 48, 58, - 57, 49, 57, 98, 58, 52, 58, 49, 49, 58, 49, 56, 10, 48, 58, 57, 49, 98, - 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 49, 98, 58, 52, - 58, 49, 49, 58, 49, 56, 10, 48, 58, 57, 50, 51, 97, 58, 54, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 57, 50, 57, 98, 58, 52, 58, 49, 49, 58, 49, 56, - 10, 48, 58, 57, 50, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10,115, - 105,108,118,108, 97,110,100, 58, 10, 48, 58, 57, 49, 57, 98, 58, 52, 58, - 48,102, 58, 50, 54, 10, 48, 58, 57, 49, 98, 97, 58, 54, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 57, 50, 49, 98, 58, 52, 58, 48, 99, 58, 50, 54, 10, - 48, 58, 57, 50, 51, 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, - 50, 57, 98, 58, 52, 58, 49, 53, 58, 50, 54, 10, 48, 58, 57, 50, 98, 97, - 58, 54, 58, 48, 48, 58, 48, 48, 10, 10,115,116, 97,114,102,103,104,116, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,116, 97,114, 32, 70,105,103, - 104,116,101,114, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 53, 50, 52, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, - 58, 53, 50, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 50, - 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 49,101, 49, 58, - 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 49, 99, 49, 58, 49, 58, 57, - 48, 58, 57, 48, 10, 48, 58, 53, 49, 97, 49, 58, 49, 58, 57, 48, 58, 57, - 48, 10, 10,115,108, 97,112,102,105,103,104, 98, 50, 58, 10,115,108, 97, - 112,102,105,103,104, 98, 49, 58, 10,115,108, 97,112,102,105,103,104, 98, - 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,108, 97,112, 32, 70,105, - 103,104,116, 32, 40, 98,111,111,116,108,101,103, 41, 10,115,108, 97,112, - 102,105,103,104, 58, 10, 97,108, 99,111,110, 58, 10, 48, 58, 99, 48, 53, - 100, 58, 52, 57, 58, 53, 48, 58, 48, 52, 10, 48, 58, 99, 49, 49, 56, 58, - 55, 58, 50,100, 58, 48, 48, 10, 10,110,101,119,115, 58, 10,110,101,119, - 115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,101,119,115, 32, 40, - 115,101,116, 32, 50, 41, 10, 48, 58,101, 52, 98, 98, 58, 56, 58, 51, 48, - 58, 51, 48, 10, 10,109,111,111,109,101,115, 97, 58, 10,109,111,111,109, - 101,115, 97, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,105,108,100, - 32, 87,101,115,116, 32, 67, 46, 79, 46, 87, 46, 45, 66,111,121,115, 32, - 111,102, 32, 77,111,111, 32, 77,101,115, 97, 32, 40,118,101,114, 32, 65, - 65, 41, 10,109,111,111,109,101,115, 97,117, 97, 58, 32, 32, 59, 42, 42, + 42, 42, 13, 10, 13, 10, 98, 97,116,108, 98,117, 98,108, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 66, 97,116,116,108,101, 32, 66,117, 98, 98,108, + 101, 32, 40,118, 50, 46, 48, 48, 41, 13, 10, 48, 58,102, 48, 52, 98, 50, + 52, 58, 57, 97, 58, 53, 52, 58, 48, 51, 13, 10, 13, 10,101,121,101,115, + 58, 13, 10,101,121,101,115, 50, 58, 13, 10,101,121,101,115,122, 97, 99, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,121,101,115, 32, 40, 90, 97, + 99, 99, 97,114,105, 97, 41, 13, 10,101,121,101,115,122, 97, 99, 98, 58, + 13, 10,101,121,101,115, 98, 58, 13, 10, 48, 58, 52, 99,102, 55, 58, 51, + 99, 58, 52, 99, 58, 48, 48, 13, 10, 48, 58, 52, 51,101,100, 58, 54, 58, + 48, 48, 58, 52, 48, 13, 10, 13, 10,107, 97,122, 97,110, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 78,105,110,106, 97, 32, 75, 97,122, 97,110, 32, + 40, 87,111,114,108,100, 41, 13, 10, 48, 58,102, 52, 48, 48, 49, 58, 57, + 55, 58, 50, 48, 58, 97, 99, 13, 10, 48, 58,102, 48, 48, 48, 52, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 48, 48, 49, 48, 58, 48, 56, + 58, 51, 48, 58, 51, 48, 13, 10, 13, 10,116,111,112,112,121,114, 97,112, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,111,112,112,121, 32, 38, 32, + 114, 97,112,112,121, 13, 10, 48, 58, 49, 48, 51, 55, 50,102, 58, 52, 50, + 58, 48, 48, 58, 52, 53, 13, 10, 13, 10,114,112, 97,116,114,111,108, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,105,118,101,114, 32, 80, 97,116, + 114,111,108, 32, 40, 79,114, 99, 97, 41, 13, 10, 48, 58, 57, 49, 57, 98, + 58, 52, 58, 49, 56, 58, 48, 97, 13, 10, 48, 58, 57, 49, 98, 97, 58, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 50, 49, 98, 58, 52, 58, 49, + 56, 58, 48, 97, 13, 10, 48, 58, 57, 50, 51, 97, 58, 54, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 57, 50, 57, 98, 58, 52, 58, 49, 56, 58, 48, 97, + 13, 10, 48, 58, 57, 50, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 99,108,105,109, 98,101, + 114, 46, 99, 32, 40,114,105,118,101,114, 32,112, 97,116,114,111,108, 32, + 40, 98,111,111,116,108,101,103, 41, 41, 13, 10,114,112, 97,116,114,111, + 108, 98, 58, 13, 10, 48, 58, 57, 49, 57, 98, 58, 52, 58, 49, 49, 58, 49, + 56, 13, 10, 48, 58, 57, 49, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 57, 50, 49, 98, 58, 52, 58, 49, 49, 58, 49, 56, 13, 10, 48, + 58, 57, 50, 51, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, + 50, 57, 98, 58, 52, 58, 49, 49, 58, 49, 56, 13, 10, 48, 58, 57, 50, 98, + 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,105,108,118,108, + 97,110,100, 58, 13, 10, 48, 58, 57, 49, 57, 98, 58, 52, 58, 48,102, 58, + 50, 54, 13, 10, 48, 58, 57, 49, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 57, 50, 49, 98, 58, 52, 58, 48, 99, 58, 50, 54, 13, 10, + 48, 58, 57, 50, 51, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 57, 50, 57, 98, 58, 52, 58, 49, 53, 58, 50, 54, 13, 10, 48, 58, 57, 50, + 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,116, 97,114, + 102,103,104,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,116, 97,114, + 32, 70,105,103,104,116,101,114, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 50, 52, 49, 58, 49, 58, 49, + 48, 58, 49, 48, 13, 10, 48, 58, 53, 50, 50, 49, 58, 49, 58, 49, 48, 58, + 49, 48, 13, 10, 48, 58, 53, 50, 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, + 13, 10, 48, 58, 53, 49,101, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, + 48, 58, 53, 49, 99, 49, 58, 49, 58, 57, 48, 58, 57, 48, 13, 10, 48, 58, + 53, 49, 97, 49, 58, 49, 58, 57, 48, 58, 57, 48, 13, 10, 13, 10,115,108, + 97,112,102,105,103,104, 98, 50, 58, 13, 10,115,108, 97,112,102,105,103, + 104, 98, 49, 58, 13, 10,115,108, 97,112,102,105,103,104, 98, 51, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 83,108, 97,112, 32, 70,105,103,104,116, + 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,115,108, 97,112,102,105, + 103,104, 58, 13, 10, 97,108, 99,111,110, 58, 13, 10, 48, 58, 99, 48, 53, + 100, 58, 52, 57, 58, 53, 48, 58, 48, 52, 13, 10, 48, 58, 99, 49, 49, 56, + 58, 55, 58, 50,100, 58, 48, 48, 13, 10, 13, 10,110,101,119,115, 58, 13, + 10,110,101,119,115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 78,101, + 119,115, 32, 40,115,101,116, 32, 50, 41, 13, 10, 48, 58,101, 52, 98, 98, + 58, 56, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10,109,111,111,109,101,115, + 97, 58, 13, 10,109,111,111,109,101,115, 97, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,105,108,100, 32, 87,101,115,116, 32, 67, 46, 79, 46, 87, 46, 45, 66,111,121,115, 32,111,102, 32, 77,111,111, 32, 77,101,115, - 97, 32, 40,118,101,114, 32,117, 97, 41, 10,109,111,111,109,101,115, 97, - 98,108, 58, 10, 48, 58, 49, 56, 48, 49,101, 48, 58, 57, 55, 58, 48, 48, - 58, 49, 97, 10, 10, 99,105,114, 99,117,115, 99, 58, 10, 99,105,114, 99, - 117,115, 99, 50, 58, 10, 99,105,114, 99,117,115, 99, 99, 58, 10, 99,105, - 114, 99,117,115, 99,101, 58, 10, 99,105,114, 99,117,115, 99, 51, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 99,105,114, 99,117,115, 32, 99,104, 97, - 114,108,105,101, 32, 40,110,111, 32,108,101,118,101,108, 32,115,101,108, - 101, 99,116, 41, 42, 10, 99,105,114, 99,117,115, 99, 52, 58, 10, 48, 58, - 50, 49, 54, 48, 58, 51, 50, 58, 48, 49, 58, 70, 69, 10, 48, 58, 50, 48, - 65, 54, 58, 51, 58, 48, 49, 58, 51, 48, 10, 48, 58, 51, 53, 65, 55, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 53, 67, 55, 58, 49, 58, 48, - 51, 58, 48, 51, 10, 48, 58, 51, 53, 69, 55, 58, 49, 58, 48, 56, 58, 48, - 56, 10, 48, 58, 51, 54, 48, 55, 58, 49, 58, 48, 57, 58, 48, 57, 10, 48, - 58, 51, 54, 50, 55, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 51, 54, - 52, 55, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10,109,117,108,116, 99,104, - 109,112, 58, 10,109,117,108,116, 99,104,109,112,107, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,109,117,108,116,105, 32, 99,104, 97,109,112, 32, 40, - 107,111,114,101, 97, 41, 10, 48, 58, 49, 48, 97, 56, 52, 49, 58, 51,102, - 58, 49, 48, 58, 52, 48, 10, 10,104,116, 99,104, 99,116, 99,104, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,104, 97,116, 99,104, 32, 99, 97,116, 99, - 104, 10, 48, 58, 49, 50, 48,102, 97, 97, 58, 50, 55, 58, 48, 48, 58, 52, - 53, 10, 10,112,111,108,108,117,120, 58, 10,112,111,108,108,117,120, 97, + 97, 32, 40,118,101,114, 32, 65, 65, 41, 13, 10,109,111,111,109,101,115, + 97,117, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,105,108,100, 32, + 87,101,115,116, 32, 67, 46, 79, 46, 87, 46, 45, 66,111,121,115, 32,111, + 102, 32, 77,111,111, 32, 77,101,115, 97, 32, 40,118,101,114, 32,117, 97, + 41, 13, 10,109,111,111,109,101,115, 97, 98,108, 58, 13, 10, 48, 58, 49, + 56, 48, 49,101, 48, 58, 57, 55, 58, 48, 48, 58, 49, 97, 13, 10, 13, 10, + 99,105,114, 99,117,115, 99, 58, 13, 10, 99,105,114, 99,117,115, 99, 50, + 58, 13, 10, 99,105,114, 99,117,115, 99, 99, 58, 13, 10, 99,105,114, 99, + 117,115, 99,101, 58, 13, 10, 99,105,114, 99,117,115, 99, 51, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 99,105,114, 99,117,115, 32, 99,104, 97,114, + 108,105,101, 32, 40,110,111, 32,108,101,118,101,108, 32,115,101,108,101, + 99,116, 41, 42, 13, 10, 99,105,114, 99,117,115, 99, 52, 58, 13, 10, 48, + 58, 50, 49, 54, 48, 58, 51, 50, 58, 48, 49, 58, 70, 69, 13, 10, 48, 58, + 50, 48, 65, 54, 58, 51, 58, 48, 49, 58, 51, 48, 13, 10, 48, 58, 51, 53, + 65, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 53, 67, 55, + 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 51, 53, 69, 55, 58, 49, + 58, 48, 56, 58, 48, 56, 13, 10, 48, 58, 51, 54, 48, 55, 58, 49, 58, 48, + 57, 58, 48, 57, 13, 10, 48, 58, 51, 54, 50, 55, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 48, 58, 51, 54, 52, 55, 58, 49, 58, 49, 48, 58, 49, 48, + 13, 10, 13, 10,109,117,108,116, 99,104,109,112, 58, 13, 10,109,117,108, + 116, 99,104,109,112,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,117, + 108,116,105, 32, 99,104, 97,109,112, 32, 40,107,111,114,101, 97, 41, 13, + 10, 48, 58, 49, 48, 97, 56, 52, 49, 58, 51,102, 58, 49, 48, 58, 52, 48, + 13, 10, 13, 10,104,116, 99,104, 99,116, 99,104, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,104, 97,116, 99,104, 32, 99, 97,116, 99,104, 13, 10, 48, + 58, 49, 50, 48,102, 97, 97, 58, 50, 55, 58, 48, 48, 58, 52, 53, 13, 10, + 13, 10,112,111,108,108,117,120, 58, 13, 10,112,111,108,108,117,120, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,111,108,108,117,120, 32, 40, - 115,101,116, 32, 50, 41, 10,112,111,108,108,117,120, 97, 50, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 80,111,108,108,117,120, 32, 40,115,101,116, - 32, 51, 41, 10,112,111,108,108,117,120,110, 58, 10, 48, 58, 99, 48, 56, - 50, 58, 57,102, 58, 56, 56, 58, 50,101, 10, 10,111,117,116,122,111,110, - 101, 58, 10,111,117,116,122,111,110,101, 97, 58, 10,111,117,116,122,111, - 110,101, 98, 58, 32, 10,111,117,116,122,111,110,101, 99, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42,111,117,116,122,111,110,101, 32, 40,115,101,116, - 32, 52, 41, 10,111,117,116,122,111,110,101,100, 58, 10,111,117,116,122, - 111,110,101,104, 58, 10, 48, 58, 50, 52, 48, 49,100,101, 58, 49, 56, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 50, 52, 48, 53, 48, 51, 58, 52,102, 58, - 51,102, 58, 51,102, 10, 48, 58, 50, 52, 48, 51, 55, 50, 58, 97, 58, 48, - 48, 58, 48, 48, 10, 10,100, 98,114,101,101,100, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 68,114, 97,103,111,110, 32, 66,114,101,101,100, 32, 40, - 77, 56, 49, 32,112, 99, 98, 32,118,101,114,115,105,111,110, 41, 10, 48, - 58, 56, 56, 57, 57, 48, 58, 56, 50, 58, 53, 56, 58, 50,101, 10, 48, 58, - 56, 56, 57, 54, 97, 58, 51, 58, 53, 56, 58, 48, 48, 10, 48, 58, 56, 56, - 57, 53, 57, 58, 49, 58, 50, 98, 58, 50, 98, 10, 10,100, 98,114,101,101, - 100,109, 55, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,114, 97,103, - 111,110, 32, 98,114,101,101,100, 32, 40,109, 55, 50, 32,112, 99, 98, 32, - 118,101,114,115,105,111,110, 41, 10, 48, 58, 57, 48, 57, 54, 97, 58, 48, - 51, 58, 53, 56, 58, 48, 48, 10, 48, 58, 57, 48, 57, 57, 48, 58, 56, 50, - 58, 53, 56, 58, 50,101, 10, 48, 58, 57, 48, 57, 53, 48, 58, 48, 49, 58, - 48, 54, 58, 48, 54, 10, 10,116,111,107,105,111, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 84,111,107,105,111, 32, 47, 32, 83, 99,114, 97,109, 98, - 108,101, 32, 70,111,114,109, 97,116,105,111,110, 10,116,111,107,105,111, - 117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,111,107,105,111, 32, 47, - 32, 83, 99,114, 97,109, 98,108,101, 32, 70,111,114,109, 97,116,105,111, - 110, 32, 40,117,115, 41, 10,116,111,107,105,111,111, 58, 10, 48, 58, 99, - 56, 53, 56, 58,102, 58, 48, 48, 58, 50, 97, 10, 48, 58, 99, 56, 53, 99, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58,102, 52, 99, 48, 58, 51, 58, - 54, 49, 58, 48, 48, 10, 10, 59, 40,116,111,107,105,111, 47,115, 99,114, - 97,109, 98,108,101, 32,102,111,114,109, 97,116,105,111,110, 40, 98,111, - 111,116,108,101,103, 41, 41, 32, 99,108,111,110,101, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,116,111,107,105,111, 98, 58, 10, 48, 58, - 102, 52, 98,102, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 56, 53, - 56, 58,102, 58, 48, 48, 58, 50, 97, 10, 10, 98,111,109, 98,107,105, 99, + 115,101,116, 32, 50, 41, 13, 10,112,111,108,108,117,120, 97, 50, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 80,111,108,108,117,120, 32, 40,115,101, + 116, 32, 51, 41, 13, 10,112,111,108,108,117,120,110, 58, 13, 10, 48, 58, + 99, 48, 56, 50, 58, 57,102, 58, 56, 56, 58, 50,101, 13, 10, 13, 10,111, + 117,116,122,111,110,101, 58, 13, 10,111,117,116,122,111,110,101, 97, 58, + 13, 10,111,117,116,122,111,110,101, 98, 58, 13, 10,111,117,116,122,111, + 110,101, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,111,117,116,122,111, + 110,101, 32, 40,115,101,116, 32, 52, 41, 13, 10,111,117,116,122,111,110, + 101,100, 58, 13, 10,111,117,116,122,111,110,101,104, 58, 13, 10, 48, 58, + 50, 52, 48, 49,100,101, 58, 49, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 50, 52, 48, 53, 48, 51, 58, 52,102, 58, 51,102, 58, 51,102, 13, 10, + 48, 58, 50, 52, 48, 51, 55, 50, 58, 97, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,100, 98,114,101,101,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 68,114, 97,103,111,110, 32, 66,114,101,101,100, 32, 40, 77, 56, 49, 32, + 112, 99, 98, 32,118,101,114,115,105,111,110, 41, 13, 10, 48, 58, 56, 56, + 57, 57, 48, 58, 56, 50, 58, 53, 56, 58, 50,101, 13, 10, 48, 58, 56, 56, + 57, 54, 97, 58, 51, 58, 53, 56, 58, 48, 48, 13, 10, 48, 58, 56, 56, 57, + 53, 57, 58, 49, 58, 50, 98, 58, 50, 98, 13, 10, 13, 10,100, 98,114,101, + 101,100,109, 55, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,114, 97, + 103,111,110, 32, 98,114,101,101,100, 32, 40,109, 55, 50, 32,112, 99, 98, + 32,118,101,114,115,105,111,110, 41, 13, 10, 48, 58, 57, 48, 57, 54, 97, + 58, 48, 51, 58, 53, 56, 58, 48, 48, 13, 10, 48, 58, 57, 48, 57, 57, 48, + 58, 56, 50, 58, 53, 56, 58, 50,101, 13, 10, 48, 58, 57, 48, 57, 53, 48, + 58, 48, 49, 58, 48, 54, 58, 48, 54, 13, 10, 13, 10,116,111,107,105,111, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,111,107,105,111, 32, 47, 32, + 83, 99,114, 97,109, 98,108,101, 32, 70,111,114,109, 97,116,105,111,110, + 13, 10,116,111,107,105,111,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 84,111,107,105,111, 32, 47, 32, 83, 99,114, 97,109, 98,108,101, 32, 70, + 111,114,109, 97,116,105,111,110, 32, 40,117,115, 41, 13, 10,116,111,107, + 105,111,111, 58, 13, 10, 48, 58, 99, 56, 53, 56, 58,102, 58, 48, 48, 58, + 50, 97, 13, 10, 48, 58, 99, 56, 53, 99, 58, 49, 58, 48, 49, 58, 48, 49, + 13, 10, 48, 58,102, 52, 99, 48, 58, 51, 58, 54, 49, 58, 48, 48, 13, 10, + 13, 10, 59, 40,116,111,107,105,111, 47,115, 99,114, 97,109, 98,108,101, + 32,102,111,114,109, 97,116,105,111,110, 40, 98,111,111,116,108,101,103, + 41, 41, 32, 99,108,111,110,101, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,116,111,107,105,111, 98, 58, 13, 10, 48, 58,102, 52, 98, + 102, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 56, 53, 56, 58, + 102, 58, 48, 48, 58, 50, 97, 13, 10, 13, 10, 98,111,109, 98,107,105, 99, 107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,111,109, 98, 32, 75,105, - 99,107, 10, 98,111,109, 98,107,105, 99,107, 97, 58, 10, 48, 58,102,102, - 56, 48, 52, 52, 58, 52, 54, 58, 48, 48, 58, 50, 48, 10, 10, 97,103,114, - 101,115,115, 58, 32, 32, 32, 59, 42, 10, 97,103,114,101,115,115, 98, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,103,114,101,115,115, 32, 40, 69, - 110,103,108,105,115,104, 32, 98,111,111,116,108,101,103, 41, 10, 48, 58, - 49,100, 53, 99, 48, 97, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, - 100, 53, 99, 56, 49, 58, 49, 58, 49,100, 58, 49,100, 10, 10,116,104,101, - 103,108,111, 98, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,104,101, - 32,103,108,111, 98, 32, 40,115,101,116, 32, 51, 41, 10, 48, 58, 55, 97, - 53,102, 58, 51, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 97, 98, 49, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 55, 97, 98, 55, 58, 49, 58, - 56, 48, 58, 56, 48, 10, 10,116,104,101,103,108,111, 98,112, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,116,104,101, 32,103,108,111, 98, 32, 40,112, - 97, 99, 45,109, 97,110, 32,104, 97,114,100,119, 97,114,101, 41, 10, 48, - 58, 52, 99, 52, 56, 58, 51, 99, 58, 52,100, 58, 48, 48, 10, 48, 58, 52, - 99, 57, 51, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 52, 99, 98, 57, - 58, 49, 58, 49, 53, 58, 49, 53, 10, 10,116,104,101,103,108,111, 98, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42,116,104,101, 32,103,108,111, 98, 32, - 42, 10,116,104,101,103,108,111, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,116,104,101, 32,103,108,111, 98, 32, 40,101, 97,114,108,105,101, - 114, 41, 42, 10, 48, 58, 55, 98,102, 57, 58, 51, 99, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 55, 99, 52, 98, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, - 58, 55, 99, 53, 49, 58, 49, 58, 56, 48, 58, 56, 48, 10, 10, 98,101, 97, - 115,116,102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 98,101, 97,115,116, - 105,101, 32,102,101, 97,115,116,105,101, 10, 48, 58, 52, 99, 52, 54, 58, - 51, 99, 58, 52,100, 58, 48, 48, 10, 48, 58, 52, 99, 56, 97, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 48, 58, 52, 99, 98, 48, 58, 49, 58, 49, 53, 58, - 49, 53, 10, 10,115,117,112,114,103,108,111, 98, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,115,117,112,101,114, 32,103,108,111, 98, 32, 42, 10, 48, - 58, 55, 99, 50, 48, 58, 51, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, - 99, 97, 52, 58, 49, 58,100, 56, 58,100, 56, 10, 48, 58, 55, 99, 55, 50, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,115,112,114,103,108, 98,112,103, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101,114, 32, 71,108, - 111, 98, 32, 40, 80, 97, 99, 45, 77, 97,110, 32,104, 97,114,100,119, 97, - 114,101, 41,103,101,114,109, 97,110, 10,115,112,114,103,108,111, 98,112, + 99,107, 13, 10, 98,111,109, 98,107,105, 99,107, 97, 58, 13, 10, 48, 58, + 102,102, 56, 48, 52, 52, 58, 52, 54, 58, 48, 48, 58, 50, 48, 13, 10, 13, + 10, 97,103,114,101,115,115, 58, 32, 32, 32, 59, 42, 13, 10, 97,103,114, + 101,115,115, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 65,103,114,101, + 115,115, 32, 40, 69,110,103,108,105,115,104, 32, 98,111,111,116,108,101, + 103, 41, 13, 10, 48, 58, 49,100, 53, 99, 48, 97, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 49,100, 53, 99, 56, 49, 58, 49, 58, 49,100, 58, + 49,100, 13, 10, 13, 10,116,104,101,103,108,111, 98, 51, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,116,104,101, 32,103,108,111, 98, 32, 40,115,101, + 116, 32, 51, 41, 13, 10, 48, 58, 55, 97, 53,102, 58, 51, 99, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 55, 97, 98, 49, 58, 49, 58, 48, 49, 58, 48, + 49, 13, 10, 48, 58, 55, 97, 98, 55, 58, 49, 58, 56, 48, 58, 56, 48, 13, + 10, 13, 10,116,104,101,103,108,111, 98,112, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,116,104,101, 32,103,108,111, 98, 32, 40,112, 97, 99, 45,109, + 97,110, 32,104, 97,114,100,119, 97,114,101, 41, 13, 10, 48, 58, 52, 99, + 52, 56, 58, 51, 99, 58, 52,100, 58, 48, 48, 13, 10, 48, 58, 52, 99, 57, + 51, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 52, 99, 98, 57, 58, + 49, 58, 49, 53, 58, 49, 53, 13, 10, 13, 10,116,104,101,103,108,111, 98, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,104,101, 32,103,108,111, 98, + 32, 42, 13, 10,116,104,101,103,108,111, 98, 50, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,116,104,101, 32,103,108,111, 98, 32, 40,101, 97,114,108, + 105,101,114, 41, 42, 13, 10, 48, 58, 55, 98,102, 57, 58, 51, 99, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 55, 99, 52, 98, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 48, 58, 55, 99, 53, 49, 58, 49, 58, 56, 48, 58, 56, 48, + 13, 10, 13, 10, 98,101, 97,115,116,102, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 98,101, 97,115,116,105,101, 32,102,101, 97,115,116,105,101, 13, + 10, 48, 58, 52, 99, 52, 54, 58, 51, 99, 58, 52,100, 58, 48, 48, 13, 10, + 48, 58, 52, 99, 56, 97, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, + 52, 99, 98, 48, 58, 49, 58, 49, 53, 58, 49, 53, 13, 10, 13, 10,115,117, + 112,114,103,108,111, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,117, + 112,101,114, 32,103,108,111, 98, 32, 42, 13, 10, 48, 58, 55, 99, 50, 48, + 58, 51, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55, 99, 97, 52, 58, + 49, 58,100, 56, 58,100, 56, 13, 10, 48, 58, 55, 99, 55, 50, 58, 49, 58, + 48, 49, 58, 48, 49, 13, 10, 13, 10,115,112,114,103,108, 98,112,103, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101,114, 32, 71,108,111, + 98, 32, 40, 80, 97, 99, 45, 77, 97,110, 32,104, 97,114,100,119, 97,114, + 101, 41,103,101,114,109, 97,110, 13, 10,115,112,114,103,108,111, 98,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101,114, 32, 71,108, 111, 98, 32, 40, 80, 97, 99, 45, 77, 97,110, 32,104, 97,114,100,119, 97, - 114,101, 41, 10, 48, 58, 52, 99, 52, 56, 58, 51, 99, 58, 52,100, 58, 48, - 48, 10, 48, 58, 52, 99, 98, 57, 58, 49, 58, 49, 53, 58, 49, 53, 10, 48, - 58, 52, 99, 57, 51, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 98,117,114, - 110,102,111,114, 99, 58, 10, 98,117,114,110,102,111,114, 99,111, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 66,117,114,110,105,110,103, 32, 70,111, - 114, 99,101, 32, 40, 74, 97,112, 97,110, 32,111,108,100, 32,118,101,114, - 115,105,111,110, 41, 32, 10, 48, 58, 49, 48, 48, 49, 55, 49, 58, 98, 98, - 58, 48, 48, 58, 52, 56, 10, 48, 58, 49, 48, 48, 49, 55, 53, 58, 49, 58, - 48, 56, 58, 48, 56, 32, 10, 10,100, 97,114,107,109,105,115,116, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 76,111,115,116, 32, 67, - 97,115,116,108,101, 32, 73,110, 32, 68, 97,114,107,109,105,115,116, 10, - 48, 58,101, 48, 49,100, 58, 56, 99, 58, 48, 48, 58, 50, 48, 10, 10,116, - 104,117,110,100,101,114,120, 58, 10,116,104,117,110,100,101,114,120,106, - 58, 10,116,104,117,110,100,101,114,120, 97, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,116,104,117,110,100,101,114, 32, 99,114,111,115,115, 32, 40, - 115,101,116, 32, 50, 41, 10,116,104,117,110,100,101,114,120, 98, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101,114, 32, 99,114, - 111,115,115, 32, 40,115,101,116, 32, 51, 41, 10, 48, 58, 52, 48, 53, 48, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 49, 48, 48, 58, 53, 48, - 58, 49, 49, 58, 48, 48, 10, 48, 58, 52, 49, 52,101, 58, 49, 58, 49, 48, - 58, 49, 48, 10, 10,115,104, 97,114,114,105,101,114, 58, 10,115,104, 97, - 114,114,105,114, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,112, 97, - 99,101, 32, 72, 97,114,114,105,101,114, 32, 40, 56, 55, 53, 49, 32, 51, - 49, 55, 45, 48, 48, 54, 51, 63, 41, 10, 48, 58, 52, 48, 52, 56, 56, 58, - 52, 58, 48, 49, 58, 48, 48, 10, 48, 58, 52, 51, 52, 48, 48, 58, 51,100, - 99, 58, 48, 49, 58, 50, 48, 10, 48, 58, 52, 51, 55,100, 99, 58, 50, 58, - 48, 48, 58, 48, 48, 10, 10,109,118,112, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,109,118,112, 32, 40,115,101,116, 32, 50, 44, 32,106, 97,112, 97, - 110, 44,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 52, 50, 41, - 10,109,118,112,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,118,112, - 32, 40,115,101,116, 32, 49, 44, 32,117,115, 44,102,100, 49, 48, 57, 52, - 32, 51, 49, 55, 45, 48, 49, 52, 51, 41, 10,109,118,112,100, 58, 10,109, - 118,112,106,100, 58, 10, 48, 58,102,102, 51, 56, 48, 48, 58, 56, 98, 58, - 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 114,101, 41, 13, 10, 48, 58, 52, 99, 52, 56, 58, 51, 99, 58, 52,100, 58, + 48, 48, 13, 10, 48, 58, 52, 99, 98, 57, 58, 49, 58, 49, 53, 58, 49, 53, + 13, 10, 48, 58, 52, 99, 57, 51, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, + 13, 10, 98,117,114,110,102,111,114, 99, 58, 13, 10, 98,117,114,110,102, + 111,114, 99,111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,117,114,110, + 105,110,103, 32, 70,111,114, 99,101, 32, 40, 74, 97,112, 97,110, 32,111, + 108,100, 32,118,101,114,115,105,111,110, 41, 32, 13, 10, 48, 58, 49, 48, + 48, 49, 55, 49, 58, 98, 98, 58, 48, 48, 58, 52, 56, 13, 10, 48, 58, 49, + 48, 48, 49, 55, 53, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, 13, 10,100, + 97,114,107,109,105,115,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84, + 104,101, 32, 76,111,115,116, 32, 67, 97,115,116,108,101, 32, 73,110, 32, + 68, 97,114,107,109,105,115,116, 13, 10, 48, 58,101, 48, 49,100, 58, 56, + 99, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10,116,104,117,110,100,101,114, + 120, 58, 13, 10,116,104,117,110,100,101,114,120,106, 58, 13, 10,116,104, + 117,110,100,101,114,120, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116, + 104,117,110,100,101,114, 32, 99,114,111,115,115, 32, 40,115,101,116, 32, + 50, 41, 13, 10,116,104,117,110,100,101,114,120, 98, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,116,104,117,110,100,101,114, 32, 99,114,111,115,115, + 32, 40,115,101,116, 32, 51, 41, 13, 10, 48, 58, 52, 48, 53, 48, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 49, 48, 48, 58, 53, 48, 58, + 49, 49, 58, 48, 48, 13, 10, 48, 58, 52, 49, 52,101, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 13, 10,115,104, 97,114,114,105,101,114, 58, 13, 10, + 115,104, 97,114,114,105,114, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 83,112, 97, 99,101, 32, 72, 97,114,114,105,101,114, 32, 40, 56, 55, 53, + 49, 32, 51, 49, 55, 45, 48, 48, 54, 51, 63, 41, 13, 10, 48, 58, 52, 48, + 52, 56, 56, 58, 52, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 52, 51, 52, + 48, 48, 58, 51,100, 99, 58, 48, 49, 58, 50, 48, 13, 10, 48, 58, 52, 51, + 55,100, 99, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109,118,112, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,118,112, 32, 40,115,101,116, + 32, 50, 44, 32,106, 97,112, 97,110, 44,102,100, 49, 48, 57, 52, 32, 51, + 49, 55, 45, 48, 49, 52, 50, 41, 13, 10,109,118,112,106, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,109,118,112, 32, 40,115,101,116, 32, 49, 44, 32, + 117,115, 44,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 52, 51, + 41, 13, 10,109,118,112,100, 58, 13, 10,109,118,112,106,100, 58, 13, 10, + 48, 58,102,102, 51, 56, 48, 48, 58, 56, 98, 58, 48, 49, 58, 48, 49, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101, - 115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104, - 115, 99,111,114,101, 95,118, 48, 46, 49, 48, 52, 32, 97,100,100,105,116, - 105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101, - 101,122,101,114, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 13, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32, + 117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111, + 114,101, 95,118, 48, 46, 49, 48, 52, 32, 97,100,100,105,116,105,111,110, + 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, + 114, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10,109,105,115,115,119, 57, 54, - 58, 10,109,105,115,115,109,119, 57, 54, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 77,105,115,115, 32, 77,105,115,116,101,114, 32, 87,111,114,108, - 100, 32, 39, 57, 54, 32, 78,117,100,101, 10,109,105,115,115,119, 57, 54, - 97, 58, 10,109,105,115,115,119, 57, 54, 98, 58, 10,109,105,115,115,119, - 57, 54, 99, 58, 10, 48, 58, 99, 48, 50, 53, 98, 54, 58, 49,100, 58, 51, - 48, 58, 53, 51, 10, 10, 59, 42, 42, 32,116,104,105,115, 32,115, 97,118, - 101,115, 32,116,104,101, 32,100, 97,105,108,121, 32,104,105,115, 99,111, - 114,101,115, 40,100, 97,105,108,121, 32,104,101,114,111,115, 41, 44, 32, - 116,104,101, 32,108,101,103,101,110,100, 97,114,121, 32,104,101,114,111, - 115, 32, 97,114,101, 32,115, 97,118,101,100, 32,105,110, 32,110,118, 32, - 114, 97,109, 32, 42, 42, 10,106,111,117,115,116, 50, 58, 32, 32, 32, 32, - 32, 32, 59, 42, 42, 42, 42, 42, 42,106,111,117,115,116, 32, 50, 32, 45, - 32,115,117,114,118,105,118, 97,108, 32,111,102, 32,116,104,101, 32,102, - 105,116,116,101,115,116, 32, 40,115,101,116, 32, 49, 41, 10,106,111,117, - 115,116, 50,114, 49, 58, 10, 48, 58, 99,102, 97, 97, 58, 53, 52, 58,102, - 49, 58,102, 57, 10, 10, 59, 42, 42, 32,116,104,105,115, 32,115, 97,118, - 101,115, 32,116,104,101, 32,100, 97,105,108,121, 32,104,105,115, 99,111, - 114,101,115, 40,100, 97,105,108,121, 32, 98,117,122,122, 97,114,100,115, - 41, 44, 32,116,104,101, 32,106,111,117,115,116, 32, 99,104, 97,109,112, - 105,111,110,115, 32, 97,114,101, 32,115, 97,118,101,100, 32,105,110, 32, - 110,118, 32,114, 97,109, 32, 42, 42, 10,106,111,117,115,116, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,106,111,117,115,116, 32, 40,119,104,105,116, - 101, 47,103,114,101,101,110, 32,108, 97, 98,101,108, 41, 10,106,111,117, - 115,116,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,106,111,117,115,116, - 32, 40,115,111,108,105,100, 32,114,101,100, 32,108, 97, 98,101,108, 41, - 10,106,111,117,115,116,119,114, 58, 10, 48, 58, 99,102, 97, 52, 58, 53, - 52, 58,102, 49, 58,102, 53, 10, 10,108, 97,115,101,114, 98, 97,116, 58, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10,109,105,115,115,119, 57, 54, + 58, 13, 10,109,105,115,115,109,119, 57, 54, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 77,105,115,115, 32, 77,105,115,116,101,114, 32, 87,111,114, + 108,100, 32, 39, 57, 54, 32, 78,117,100,101, 13, 10,109,105,115,115,119, + 57, 54, 97, 58, 13, 10,109,105,115,115,119, 57, 54, 98, 58, 13, 10,109, + 105,115,115,119, 57, 54, 99, 58, 13, 10, 48, 58, 99, 48, 50, 53, 98, 54, + 58, 49,100, 58, 51, 48, 58, 53, 51, 13, 10, 13, 10, 59, 42, 42, 32,116, + 104,105,115, 32,115, 97,118,101,115, 32,116,104,101, 32,100, 97,105,108, + 121, 32,104,105,115, 99,111,114,101,115, 40,100, 97,105,108,121, 32,104, + 101,114,111,115, 41, 44, 32,116,104,101, 32,108,101,103,101,110,100, 97, + 114,121, 32,104,101,114,111,115, 32, 97,114,101, 32,115, 97,118,101,100, + 32,105,110, 32,110,118, 32,114, 97,109, 32, 42, 42, 13, 10,106,111,117, + 115,116, 50, 58, 32, 32, 32, 32, 32, 32, 59, 42, 42, 42, 42, 42, 42,106, + 111,117,115,116, 32, 50, 32, 45, 32,115,117,114,118,105,118, 97,108, 32, + 111,102, 32,116,104,101, 32,102,105,116,116,101,115,116, 32, 40,115,101, + 116, 32, 49, 41, 13, 10,106,111,117,115,116, 50,114, 49, 58, 13, 10, 48, + 58, 99,102, 97, 97, 58, 53, 52, 58,102, 49, 58,102, 57, 13, 10, 13, 10, + 59, 42, 42, 32,116,104,105,115, 32,115, 97,118,101,115, 32,116,104,101, + 32,100, 97,105,108,121, 32,104,105,115, 99,111,114,101,115, 40,100, 97, + 105,108,121, 32, 98,117,122,122, 97,114,100,115, 41, 44, 32,116,104,101, + 32,106,111,117,115,116, 32, 99,104, 97,109,112,105,111,110,115, 32, 97, + 114,101, 32,115, 97,118,101,100, 32,105,110, 32,110,118, 32,114, 97,109, + 32, 42, 42, 13, 10,106,111,117,115,116, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42,106,111,117,115,116, 32, 40,119,104,105,116,101, 47,103,114,101, + 101,110, 32,108, 97, 98,101,108, 41, 13, 10,106,111,117,115,116,114, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42,106,111,117,115,116, 32, 40,115,111, + 108,105,100, 32,114,101,100, 32,108, 97, 98,101,108, 41, 13, 10,106,111, + 117,115,116,119,114, 58, 13, 10, 48, 58, 99,102, 97, 52, 58, 53, 52, 58, + 102, 49, 58,102, 53, 13, 10, 13, 10,108, 97,115,101,114, 98, 97,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,108, 97,115,101,114, 32, 98, 97,116, - 116,108,101, 10, 48, 58, 49, 99,102, 49, 58, 49,101, 58, 99, 98, 58, 48, - 48, 10, 48, 58, 49,100, 48,100, 58, 49, 58, 54, 48, 58, 54, 48, 10, 10, - 108, 97,122, 97,114,105, 97,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 108, 97,122, 97,114,105, 97,110, 10, 48, 58, 49,102, 48, 55, 58, 49,101, - 58, 48, 48, 58,100, 52, 10, 10,115,112, 97, 99,101,105,110,116, 58, 10, - 115,112, 97, 99,101,105,110,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 83,112, 97, 99,101, 32, 73,110,116,114,117,100,101,114, 32, 40, 74, - 97,112, 97,110, 41, 10, 48, 58, 50, 48, 48, 48, 58, 51, 58, 48, 58, 48, - 10, 10, 99, 97,116,110,109,111,117,115, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 67, 97,116, 32, 97,110,100, 32, 77,111,117,115,101, 32, 40,115, - 101,116, 32, 49, 41, 10, 48, 58, 49,102, 48, 97, 58, 49,101, 58, 99, 98, - 58, 48, 48, 10, 48, 58, 49,102, 50, 52, 58, 49, 58,100, 52, 58,100, 52, - 10, 10,116,104,111,111,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116, - 104,117,110,100,101,114, 32,104,111,111,112, 32, 40,118,101,114, 46, 49, - 41, 10, 48, 58,102,102,101, 53,100, 52, 58, 97, 48, 58, 48, 48, 58, 48, - 97, 10, 48, 58,102,102,100, 50,101, 97, 58, 52, 58, 48, 48, 58, 52, 48, - 10, 10,115,107,117,108,108,102,110,103, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,115,107,117,108,108, 32,102, 97,110,103, 32, 40,106, 97,112, 97, - 110, 41, 10,115,107,117,108,108,102,110,103,106, 58, 10, 48, 58, 49, 48, - 48, 97, 56, 48, 58,102, 48, 58, 48, 48, 58, 49, 50, 10, 48, 58, 49, 48, - 48, 48, 52, 48, 58, 49, 58, 48, 56, 58, 48, 56, 10, 10, 98, 97, 99,107, - 102,105,114,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 98, 97, 99,107, - 102,105,114,101, 33, 10, 98, 97, 99,107,102,105,114,101, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 98, 97, 99,107,102,105,114,101, 33, 32, 40, - 115,101,116, 32, 50, 41, 10, 48, 58, 49, 55, 48, 51, 48, 48, 58, 49, 98, - 48, 58, 49, 51, 58, 49, 49, 10, 10,114,111, 99,107,110,109,115, 98, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,111, 99,107, 39,110, 32, 77,101, - 103, 97, 83,101,115,115,105,111,110, 32, 40, 74, 97,112, 97,110, 44, 32, - 98,111,111,116,108,101,103, 41, 10, 48, 58, 49, 48, 52, 51, 98,100, 58, - 49, 52,100, 58, 51,100, 58, 48, 48, 10, 48, 58, 49, 48, 52, 53, 48, 55, - 58, 49, 58, 49, 56, 58, 49, 56, 10, 10,116,119,105,110, 97, 99,116,110, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,119,105,110, 32, 65, 99,116, - 105,111,110, 10, 48, 58,102, 57, 48, 57, 49, 58, 51, 58, 48, 48, 58, 49, - 48, 10, 10,114,111, 99,107,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 82,111, 99,107, 39,110, 32, 84,114,101, 97,100, 32, 40, 74, 97,112, 97, - 110, 41, 10, 48, 58, 49, 48, 52, 51, 53, 49, 58, 51, 98, 58, 51,100, 58, - 48, 54, 10, 48, 58, 49, 48, 52, 51, 99, 57, 58, 51, 98, 58, 51,100, 58, - 48, 54, 10, 10,114,111, 99,107,110, 98, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 82,111, 99,107, 39,110, 32, 84,114,101, 97,100, 32, 49, 32, 40, - 74, 97,112, 97,110, 44, 32, 98,111,111,116,108,101,103, 41, 10, 48, 58, - 49, 48, 52, 51, 53, 49, 58, 51, 98, 58, 51,100, 58, 48, 54, 10, 48, 58, - 49, 48, 52, 51, 99, 57, 58, 51, 98, 58, 51,100, 58, 48, 54, 10, 10,114, - 111, 99,107,110, 52, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,111, - 99,107, 39,110, 32, 52, 32, 40, 74, 97,112, 97,110, 44, 32,112,114,111, - 116,111,116,121,112,101, 44, 32, 98,111,111,116,108,101,103, 41, 10, 48, - 58, 49, 48, 52, 51, 98,102, 58, 49, 51, 98, 58, 51,100, 58, 48, 54, 10, - 10,114,111, 99,107,110, 51, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 82,111, 99,107, 39,110, 32, 51, 32, 40, 74, 97,112, 97,110, 44, 32, 98, - 111,111,116,108,101,103, 41, 10, 48, 58, 49, 48, 52, 51, 98, 49, 58, 49, - 51, 98, 58, 51,100, 58, 48, 54, 10, 10,114,111, 99,107,110, 50, 98, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,111, 99,107, 39,110, 32, 84,114, - 101, 97,100, 32, 50, 32, 40, 74, 97,112, 97,110, 44, 32, 98,111,111,116, - 108,101,103, 41, 10, 48, 58, 49, 48, 52, 51, 56, 51, 58, 49, 51, 98, 58, - 51,100, 58, 48, 54, 10, 10,109,103, 99,114,121,115,116,108,111, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,103,105, 99, 97,108, 32, 67,114, - 121,115,116, 97,108,115, 32, 40, 87,111,114,108,100, 44, 32, 57, 49, 47, - 49, 50, 47, 49, 48, 41, 10, 48, 58, 51, 48, 48, 52, 55, 97, 58, 55, 97, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 48, 52,102, 49, 58, 49, 58, - 52, 54, 58, 52, 54, 10, 48, 58, 51, 48, 48, 52, 55, 98, 58, 49, 58, 48, - 57, 58, 48, 57, 10,109,103, 99,114,121,115,116,108, 58, 10, 48, 58, 51, - 48, 48, 52, 55, 56, 58, 52, 58, 48, 48, 58, 48, 57, 10, 48, 58, 51, 48, - 48, 52, 55, 99, 58, 55, 99, 58, 48, 48, 58, 48, 48, 10,109,103, 99,114, - 121,115,116,108,106, 58, 10, 48, 58, 51, 48, 48, 52, 56, 56, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 48, 52, 56, 99, 58, 55, 99, 58, - 52, 49, 58, 48, 48, 10, 10, 97,108,105,101,110, 51, 58, 10, 97,108,105, - 101,110, 51,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 42, 97,108,105, - 101,110, 32, 51, 58, 32,116,104,101, 32,103,117,110, 32, 40,117,115, 41, - 32, 32, 10, 48, 58, 50, 48,102, 50, 98, 99, 58, 55, 56, 58, 56, 48, 58, - 48, 48, 10, 10,115,104,117,116,116,108,101,105, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,115,104,117,116,116,108,101, 32,105,110,118, 97,100,101, - 114, 10, 48, 58, 52, 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, - 97,118,101,110,103,114,103,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 97,118,101,110,103,101,114,115, 32,105,110, 32,103, 97,108, 97, 99,116, - 105, 99, 32,115,116,111,114,109, 32, 40,117,115, 41, 10, 97,118,101,110, - 103,114,103,115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,118,101, - 110,103,101,114,115, 32,105,110, 32,103, 97,108, 97, 99,116,105, 99, 32, - 115,116,111,114,109, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 49, 48, - 56, 57, 48, 57, 58, 52,101, 58, 48, 49, 58, 53, 50, 10, 10,104,118,121, + 116,108,101, 13, 10, 48, 58, 49, 99,102, 49, 58, 49,101, 58, 99, 98, 58, + 48, 48, 13, 10, 48, 58, 49,100, 48,100, 58, 49, 58, 54, 48, 58, 54, 48, + 13, 10, 13, 10,108, 97,122, 97,114,105, 97,110, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,108, 97,122, 97,114,105, 97,110, 13, 10, 48, 58, 49,102, + 48, 55, 58, 49,101, 58, 48, 48, 58,100, 52, 13, 10, 13, 10,115,112, 97, + 99,101,105,110,116, 58, 13, 10,115,112, 97, 99,101,105,110,116,106, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,112, 97, 99,101, 32, 73,110,116, + 114,117,100,101,114, 32, 40, 74, 97,112, 97,110, 41, 13, 10, 48, 58, 50, + 48, 48, 48, 58, 51, 58, 48, 58, 48, 13, 10, 13, 10, 99, 97,116,110,109, + 111,117,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97,116, 32, 97, + 110,100, 32, 77,111,117,115,101, 32, 40,115,101,116, 32, 49, 41, 13, 10, + 48, 58, 49,102, 48, 97, 58, 49,101, 58, 99, 98, 58, 48, 48, 13, 10, 48, + 58, 49,102, 50, 52, 58, 49, 58,100, 52, 58,100, 52, 13, 10, 13, 10,116, + 104,111,111,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,104,117,110, + 100,101,114, 32,104,111,111,112, 32, 40,118,101,114, 46, 49, 41, 13, 10, + 48, 58,102,102,101, 53,100, 52, 58, 97, 48, 58, 48, 48, 58, 48, 97, 13, + 10, 48, 58,102,102,100, 50,101, 97, 58, 52, 58, 48, 48, 58, 52, 48, 13, + 10, 13, 10,115,107,117,108,108,102,110,103, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,115,107,117,108,108, 32,102, 97,110,103, 32, 40,106, 97,112, + 97,110, 41, 13, 10,115,107,117,108,108,102,110,103,106, 58, 13, 10, 48, + 58, 49, 48, 48, 97, 56, 48, 58,102, 48, 58, 48, 48, 58, 49, 50, 13, 10, + 48, 58, 49, 48, 48, 48, 52, 48, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, + 13, 10, 98, 97, 99,107,102,105,114,101, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 98, 97, 99,107,102,105,114,101, 33, 13, 10, 98, 97, 99,107,102, + 105,114,101, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 98, 97, 99,107, + 102,105,114,101, 33, 32, 40,115,101,116, 32, 50, 41, 13, 10, 48, 58, 49, + 55, 48, 51, 48, 48, 58, 49, 98, 48, 58, 49, 51, 58, 49, 49, 13, 10, 13, + 10,114,111, 99,107,110,109,115, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 82,111, 99,107, 39,110, 32, 77,101,103, 97, 83,101,115,115,105,111, + 110, 32, 40, 74, 97,112, 97,110, 44, 32, 98,111,111,116,108,101,103, 41, + 13, 10, 48, 58, 49, 48, 52, 51, 98,100, 58, 49, 52,100, 58, 51,100, 58, + 48, 48, 13, 10, 48, 58, 49, 48, 52, 53, 48, 55, 58, 49, 58, 49, 56, 58, + 49, 56, 13, 10, 13, 10,116,119,105,110, 97, 99,116,110, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 84,119,105,110, 32, 65, 99,116,105,111,110, 13, + 10, 48, 58,102, 57, 48, 57, 49, 58, 51, 58, 48, 48, 58, 49, 48, 13, 10, + 13, 10,114,111, 99,107,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82, + 111, 99,107, 39,110, 32, 84,114,101, 97,100, 32, 40, 74, 97,112, 97,110, + 41, 13, 10, 48, 58, 49, 48, 52, 51, 53, 49, 58, 51, 98, 58, 51,100, 58, + 48, 54, 13, 10, 48, 58, 49, 48, 52, 51, 99, 57, 58, 51, 98, 58, 51,100, + 58, 48, 54, 13, 10, 13, 10,114,111, 99,107,110, 98, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 82,111, 99,107, 39,110, 32, 84,114,101, 97,100, 32, + 49, 32, 40, 74, 97,112, 97,110, 44, 32, 98,111,111,116,108,101,103, 41, + 13, 10, 48, 58, 49, 48, 52, 51, 53, 49, 58, 51, 98, 58, 51,100, 58, 48, + 54, 13, 10, 48, 58, 49, 48, 52, 51, 99, 57, 58, 51, 98, 58, 51,100, 58, + 48, 54, 13, 10, 13, 10,114,111, 99,107,110, 52, 98, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 82,111, 99,107, 39,110, 32, 52, 32, 40, 74, 97,112, + 97,110, 44, 32,112,114,111,116,111,116,121,112,101, 44, 32, 98,111,111, + 116,108,101,103, 41, 13, 10, 48, 58, 49, 48, 52, 51, 98,102, 58, 49, 51, + 98, 58, 51,100, 58, 48, 54, 13, 10, 13, 10,114,111, 99,107,110, 51, 98, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,111, 99,107, 39,110, 32, 51, + 32, 40, 74, 97,112, 97,110, 44, 32, 98,111,111,116,108,101,103, 41, 13, + 10, 48, 58, 49, 48, 52, 51, 98, 49, 58, 49, 51, 98, 58, 51,100, 58, 48, + 54, 13, 10, 13, 10,114,111, 99,107,110, 50, 98, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 82,111, 99,107, 39,110, 32, 84,114,101, 97,100, 32, 50, + 32, 40, 74, 97,112, 97,110, 44, 32, 98,111,111,116,108,101,103, 41, 13, + 10, 48, 58, 49, 48, 52, 51, 56, 51, 58, 49, 51, 98, 58, 51,100, 58, 48, + 54, 13, 10, 13, 10,109,103, 99,114,121,115,116,108,111, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 77, 97,103,105, 99, 97,108, 32, 67,114,121,115, + 116, 97,108,115, 32, 40, 87,111,114,108,100, 44, 32, 57, 49, 47, 49, 50, + 47, 49, 48, 41, 13, 10, 48, 58, 51, 48, 48, 52, 55, 97, 58, 55, 97, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 48, 52,102, 49, 58, 49, 58, + 52, 54, 58, 52, 54, 13, 10, 48, 58, 51, 48, 48, 52, 55, 98, 58, 49, 58, + 48, 57, 58, 48, 57, 13, 10,109,103, 99,114,121,115,116,108, 58, 13, 10, + 48, 58, 51, 48, 48, 52, 55, 56, 58, 52, 58, 48, 48, 58, 48, 57, 13, 10, + 48, 58, 51, 48, 48, 52, 55, 99, 58, 55, 99, 58, 48, 48, 58, 48, 48, 13, + 10,109,103, 99,114,121,115,116,108,106, 58, 13, 10, 48, 58, 51, 48, 48, + 52, 56, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 48, + 52, 56, 99, 58, 55, 99, 58, 52, 49, 58, 48, 48, 13, 10, 13, 10, 97,108, + 105,101,110, 51, 58, 13, 10, 97,108,105,101,110, 51,117, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 42, 97,108,105,101,110, 32, 51, 58, 32,116,104, + 101, 32,103,117,110, 32, 40,117,115, 41, 13, 10, 48, 58, 50, 48,102, 50, + 98, 99, 58, 55, 56, 58, 56, 48, 58, 48, 48, 13, 10, 13, 10,115,104,117, + 116,116,108,101,105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,104,117, + 116,116,108,101, 32,105,110,118, 97,100,101,114, 13, 10, 48, 58, 52, 48, + 48, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,118,101,110, + 103,114,103,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,118,101,110, + 103,101,114,115, 32,105,110, 32,103, 97,108, 97, 99,116,105, 99, 32,115, + 116,111,114,109, 32, 40,117,115, 41, 13, 10, 97,118,101,110,103,114,103, + 115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,118,101,110,103,101, + 114,115, 32,105,110, 32,103, 97,108, 97, 99,116,105, 99, 32,115,116,111, + 114,109, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58, 49, 48, 56, 57, + 48, 57, 58, 52,101, 58, 48, 49, 58, 53, 50, 13, 10, 13, 10,104,118,121, 115,109,115,104, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111, 114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101, - 110,116,114,121, 93, 10,104,118,121,115,109,115,104,106, 58, 32, 10,104, - 118,121,115,109,115,104, 97, 58, 10, 48, 58, 49, 48, 48, 52, 48, 48, 58, - 53, 48, 58, 48, 49, 58, 48, 48, 10, 48, 58, 49, 48, 48, 48, 48, 99, 58, - 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,112,111,119,101,114,110,106, 98, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,103,111,117,107,101,116,115,117, - 106,105, 32,105, 99,104,105,122,111,107,117, 40,106, 97,112, 97,110, 44, - 32, 98,111,111,116,108,101,103, 41, 10, 48, 58, 49, 56,101, 56, 48, 48, - 58, 50, 56, 58, 48, 48, 58, 48, 53, 10, 10,112,108,101,103,101,110,100, - 115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,111,119,101,114, 32, 73, - 110,115,116,105,110, 99,116, 32, 76,101,103,101,110,100,115, 32, 40, 85, - 83, 65, 41, 10,112,108,101,103,101,110,100,115,106, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 71,111,117,107,101,116,115,117,106,105, 32, 73, 99, - 104,105,122,111,107,117, 32, 83, 97,105,107,121,111,117, 32, 68,101,110, - 115,101,116,115,117, 32, 40, 74, 97,112, 97,110, 41, 10, 48, 58, 52, 48, - 101, 56, 48, 48, 58, 51, 98, 58, 48, 48, 58, 48, 99, 10, 10,116,115,116, - 114,105,107,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,117,110, - 100,101,114, 32, 83,116,114,105,107,101, 32, 40, 78,101,119,101,114, 41, - 10,116,115,116,114,105,107,101, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 84,104,117,110,100,101,114, 32, 83,116,114,105,107,101, 32, 40,111, - 108,100,101,114, 41, 10, 48, 58, 99,102, 53, 58, 53, 53, 58, 52, 50, 58, - 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 110,116,114,121, 93, 13, 10,104,118,121,115,109,115,104,106, 58, 13, 10, + 104,118,121,115,109,115,104, 97, 58, 13, 10, 48, 58, 49, 48, 48, 52, 48, + 48, 58, 53, 48, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 48, + 48, 99, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,112,111,119, + 101,114,110,106, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,103,111,117, + 107,101,116,115,117,106,105, 32,105, 99,104,105,122,111,107,117, 40,106, + 97,112, 97,110, 44, 32, 98,111,111,116,108,101,103, 41, 13, 10, 48, 58, + 49, 56,101, 56, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 53, 13, 10, 13, + 10,112,108,101,103,101,110,100,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 80,111,119,101,114, 32, 73,110,115,116,105,110, 99,116, 32, 76,101, + 103,101,110,100,115, 32, 40, 85, 83, 65, 41, 13, 10,112,108,101,103,101, + 110,100,115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71,111,117,107, + 101,116,115,117,106,105, 32, 73, 99,104,105,122,111,107,117, 32, 83, 97, + 105,107,121,111,117, 32, 68,101,110,115,101,116,115,117, 32, 40, 74, 97, + 112, 97,110, 41, 13, 10, 48, 58, 52, 48,101, 56, 48, 48, 58, 51, 98, 58, + 48, 48, 58, 48, 99, 13, 10, 13, 10,116,115,116,114,105,107,101, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 84,104,117,110,100,101,114, 32, 83,116, + 114,105,107,101, 32, 40, 78,101,119,101,114, 41, 13, 10,116,115,116,114, + 105,107,101, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,117,110, + 100,101,114, 32, 83,116,114,105,107,101, 32, 40,111,108,100,101,114, 41, + 13, 10, 48, 58, 99,102, 53, 58, 53, 53, 58, 52, 50, 58, 51, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32, - 117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111, - 114,101, 95,118, 48, 46, 49, 48, 51, 32, 97,100,100,105,116,105,111,110, - 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, - 114, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117, + 110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114, + 101, 95,118, 48, 46, 49, 48, 51, 32, 97,100,100,105,116,105,111,110,115, + 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, + 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 10, 10,115,117,112,109,111,100,101,108, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 32,109,111,100,101, - 108, 10, 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 51, 58, 51, 48, 58, 50, - 48, 10, 10,112,111,119,101,114,105,110,115, 58, 10,112,111,119,101,114, - 105,110,115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,111,119,101, - 114, 32,105,110,115,116,105,110, 99,116, 32, 40,117,115, 97, 44, 32, 98, - 111,111,116,108,101,103, 32,115,101,116, 32, 49, 41, 10,112,111,119,101, - 114,105,110,115, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,111,119, - 101,114, 32,105,110,115,116,105,110, 99,116, 32, 40,117,115, 97, 44, 32, - 98,111,111,116,108,101,103, 32,115,101,116, 32, 50, 41, 10,112,111,119, - 101,114,105,110,115,106, 58, 10, 48, 58, 49, 56,101, 56, 48, 48, 58, 50, - 56, 58, 48, 48, 58, 48, 53, 10, 10,109, 97,100, 98, 97,108,108, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,100, 32, 66, 97,108,108, 32, 86, - 50, 46, 48, 10,109, 97,100, 98, 97,108,108,110, 58, 10, 48, 58,101, 98, - 51, 98, 58, 49,101, 58, 52, 49, 58, 48, 48, 10, 48, 58,101, 98, 53, 55, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,116,112, 56, 52, 58, 10,116,112, - 56, 52, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,105,109,101, 32, - 112,105,108,111,116, 32, 39, 56, 52, 32, 40,115,101,116, 32, 50, 41, 10, - 48, 58, 53, 55, 97, 48, 58, 49,101, 58, 48, 48, 58, 53, 52, 10, 48, 58, - 53, 55, 51, 54, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10,116,112, 56, - 52, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,105,109,101, 32,112, - 105,108,111,116, 32, 39, 56, 52, 32, 40,115,101,116, 32, 51, 41, 10, 48, - 58, 49, 55, 97, 48, 58, 49,101, 58, 48, 48, 58, 53, 52, 10, 48, 58, 49, - 55, 51, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 77,117,108,116,105, 32, 67,104, 97,109,112, 32, 68,101,108,117, - 120,101, 10,109, 99,104, 97,109,112,100,120, 58, 10,109, 99,104, 97,109, - 112,100,120, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,117,108,116, - 105, 32, 67,104, 97,109,112, 32, 68,101,108,117,120,101, 32, 40,118,101, - 114, 46, 32, 49, 49, 50, 54, 44, 32, 50, 54, 47, 49, 49, 47, 49, 57, 57, - 57, 41, 10, 48, 58, 50, 48, 97, 57, 48, 48, 58, 50, 48, 48, 58, 48, 48, - 58, 52, 48, 10, 10, 97,114, 97, 98,102,103,116, 58, 10, 97,114, 97, 98, - 102,103,116,106, 58, 32, 10, 97,114, 97, 98,102,103,116,117, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 65,114, 97, 98,105, 97,110, 32, 70,105,103, - 104,116, 32, 40,117,115, 41, 10, 48, 58, 50, 48, 56, 51, 48, 48, 58, 52, - 57, 58, 53, 51, 58, 48, 48, 10, 48, 58, 50, 48, 56, 51, 52, 53, 58, 49, - 58, 49, 55, 58, 49, 55, 10, 10,112,111,119,101,114, 98, 97,108, 58, 32, - 32, 10,112,111,119,101,114, 98, 97,108,115, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,112,111,119,101,114, 32, 98, 97,108,108,115, 32, 40,115,117, - 112,101,114, 32,115,108, 97,109, 32, 99,111,110,118,101,114,115,105,111, - 110, 41, 10, 48, 58,102, 56, 50, 55, 54, 58, 55, 99, 58, 53, 54, 58, 48, - 48, 10, 48, 58,102, 56, 50,102, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, - 10,107,105,100,110,105,107,105, 58, 10,107,105,100,110,105,107,105,117, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75,105,100, 32, 78,105,107,105, - 32, 45, 32, 82, 97,100,105, 99, 97,108, 32, 78,105,110,106, 97, 32, 40, - 117,115, 41, 10, 48, 58,101, 48, 54, 50, 58, 54, 57, 58, 48, 48, 58, 50, - 101, 10, 48, 58,101, 48, 50, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 76,105,116,116,108,101, 32, 72,101,114,111, - 10,108,105,116,104,101,114,111, 58, 10, 48, 58,101, 48, 54, 50, 58, 54, - 101, 58, 48, 48, 58, 52, 52, 10, 48, 58,101, 48, 50, 98, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 10,121, 97,110, 99,104, 97,109,114, 58, 10, 48, 58, - 101, 48, 54, 50, 58, 54,101, 58, 48, 48, 58, 50, 48, 10, 48, 58,101, 48, - 50, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,107, 97,103,101,107,105, - 58, 10,107, 97,103,101,107,105,106, 58, 10,107, 97,103,101,107,105,104, + 42, 42, 42, 42, 42, 42, 13, 10, 13, 10,115,117,112,109,111,100,101,108, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 32,109,111, + 100,101,108, 13, 10, 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 51, 58, 51, + 48, 58, 50, 48, 13, 10, 13, 10,112,111,119,101,114,105,110,115, 58, 13, + 10,112,111,119,101,114,105,110,115, 97, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42,112,111,119,101,114, 32,105,110,115,116,105,110, 99,116, 32, 40, + 117,115, 97, 44, 32, 98,111,111,116,108,101,103, 32,115,101,116, 32, 49, + 41, 13, 10,112,111,119,101,114,105,110,115, 98, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,112,111,119,101,114, 32,105,110,115,116,105,110, 99,116, + 32, 40,117,115, 97, 44, 32, 98,111,111,116,108,101,103, 32,115,101,116, + 32, 50, 41, 13, 10,112,111,119,101,114,105,110,115,106, 58, 13, 10, 48, + 58, 49, 56,101, 56, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 53, 13, 10, + 13, 10,109, 97,100, 98, 97,108,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 77, 97,100, 32, 66, 97,108,108, 32, 86, 50, 46, 48, 13, 10,109, 97, + 100, 98, 97,108,108,110, 58, 13, 10, 48, 58,101, 98, 51, 98, 58, 49,101, + 58, 52, 49, 58, 48, 48, 13, 10, 48, 58,101, 98, 53, 55, 58, 49, 58, 48, + 49, 58, 48, 49, 13, 10, 13, 10,116,112, 56, 52, 58, 13, 10,116,112, 56, + 52, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,105,109,101, 32,112, + 105,108,111,116, 32, 39, 56, 52, 32, 40,115,101,116, 32, 50, 41, 13, 10, + 48, 58, 53, 55, 97, 48, 58, 49,101, 58, 48, 48, 58, 53, 52, 13, 10, 48, + 58, 53, 55, 51, 54, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 116,112, 56, 52, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,105,109, + 101, 32,112,105,108,111,116, 32, 39, 56, 52, 32, 40,115,101,116, 32, 51, + 41, 13, 10, 48, 58, 49, 55, 97, 48, 58, 49,101, 58, 48, 48, 58, 53, 52, + 13, 10, 48, 58, 49, 55, 51, 54, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 77,117,108,116,105, 32, 67,104, 97, + 109,112, 32, 68,101,108,117,120,101, 13, 10,109, 99,104, 97,109,112,100, + 120, 58, 13, 10,109, 99,104, 97,109,112,100,120, 97, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 77,117,108,116,105, 32, 67,104, 97,109,112, 32, 68, + 101,108,117,120,101, 32, 40,118,101,114, 46, 32, 49, 49, 50, 54, 44, 32, + 50, 54, 47, 49, 49, 47, 49, 57, 57, 57, 41, 13, 10, 48, 58, 50, 48, 97, + 57, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, 97, + 114, 97, 98,102,103,116, 58, 13, 10, 97,114, 97, 98,102,103,116,106, 58, + 13, 10, 97,114, 97, 98,102,103,116,117, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 65,114, 97, 98,105, 97,110, 32, 70,105,103,104,116, 32, 40,117, + 115, 41, 13, 10, 48, 58, 50, 48, 56, 51, 48, 48, 58, 52, 57, 58, 53, 51, + 58, 48, 48, 13, 10, 48, 58, 50, 48, 56, 51, 52, 53, 58, 49, 58, 49, 55, + 58, 49, 55, 13, 10, 13, 10,112,111,119,101,114, 98, 97,108, 58, 13, 10, + 112,111,119,101,114, 98, 97,108,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42,112,111,119,101,114, 32, 98, 97,108,108,115, 32, 40,115,117,112,101, + 114, 32,115,108, 97,109, 32, 99,111,110,118,101,114,115,105,111,110, 41, + 13, 10, 48, 58,102, 56, 50, 55, 54, 58, 55, 99, 58, 53, 54, 58, 48, 48, + 13, 10, 48, 58,102, 56, 50,102, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 13, 10,107,105,100,110,105,107,105, 58, 13, 10,107,105,100,110,105, + 107,105,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75,105,100, 32, 78, + 105,107,105, 32, 45, 32, 82, 97,100,105, 99, 97,108, 32, 78,105,110,106, + 97, 32, 40,117,115, 41, 13, 10, 48, 58,101, 48, 54, 50, 58, 54, 57, 58, + 48, 48, 58, 50,101, 13, 10, 48, 58,101, 48, 50, 98, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 76,105,116,116, + 108,101, 32, 72,101,114,111, 13, 10,108,105,116,104,101,114,111, 58, 13, + 10, 48, 58,101, 48, 54, 50, 58, 54,101, 58, 48, 48, 58, 52, 52, 13, 10, + 48, 58,101, 48, 50, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 121, 97,110, 99,104, 97,109,114, 58, 13, 10, 48, 58,101, 48, 54, 50, 58, + 54,101, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,101, 48, 50, 98, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,107, 97,103,101,107,105, 58, 13, + 10,107, 97,103,101,107,105,106, 58, 13, 10,107, 97,103,101,107,105,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75, 97,103,101,107,105, 32, 40, - 87,111,114,108,100, 63, 44, 32,104, 97, 99,107, 41, 10, 48, 58,101, 48, - 53, 55, 58, 97, 58, 48, 53, 58, 53, 48, 10, 48, 58,101, 48, 54, 49, 58, - 102, 58, 56, 55, 58, 56, 99, 10, 10,115,112,108, 97,116,116,101,114, 58, - 10,115,112,108, 97,116,116,101,114,106, 58, 32, 32, 59, 42, 42, 42, 42, - 42,115,112,108, 97,116,116,101,114, 32,104,111,117,115,101, 32, 40,106, - 97,112, 97,110, 41, 10,115,112,108, 97,116,116,101,114, 50, 58, 10, 49, - 58, 49, 52, 51, 48, 58, 51,102, 58, 48, 48, 58, 50,101, 10, 10,118, 98, - 111,119,108,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86,105,114,116, - 117, 97, 32, 66,111,119,108,105,110,103, 32, 40, 74, 97,112, 97,110, 44, - 32, 86, 49, 48, 48, 74, 67, 77, 41, 32, 10,118, 98,111,119,108, 58, 10, - 48, 58, 49, 48, 49, 99, 51, 50, 58, 52, 52, 58, 48, 48, 58, 50,101, 10, - 10,115,116,107, 99,108,109,110,115, 58, 10,115,116,107, 99,108,109,110, - 115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,116, 97, 99,107, 32, - 67,111,108,117,109,110,115, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, - 102,102,102, 99, 50, 52, 58, 51, 56, 58, 52, 98, 58, 56, 56, 10, 10,114, - 101,100, 99,108, 97,115,104, 58, 32, 10,114,101,100, 99,108, 97,115,104, - 97, 58, 10, 48, 58, 54, 48, 50, 51, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 54, 51, 50, 48, 58, 54, 58, 50, 51, 58, 49,100, 10,114,101,100, - 99,108, 97,115,104,107, 58, 10, 48, 58, 54, 48, 50, 51, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 54, 51, 50, 48, 58, 54, 58, 49, 97, 58, 49, - 101, 10, 10,107,105,107,105,107, 97,105, 58, 10,107,110,105,103,104,116, - 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75,110,105,103,104,116, 32, - 66,111,121, 10, 48, 58,101, 50,102, 99, 58, 50, 51, 58, 48, 48, 58, 53, - 53, 10, 10,122,105,103,122, 97,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42,122,105,103, 32,122, 97,103, 32, 40,103, 97,108, 97,120,105, 97,110, - 32,104, 97,114,100,119, 97,114,101, 44, 32,115,101,116, 32, 49, 41, 10, - 122,105,103,122, 97,103, 98, 58, 10,122,105,103,122, 97,103, 98, 50, 58, - 10,122,105,103,122, 97,103, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 122,105,103, 32,122, 97,103, 32, 40,103, 97,108, 97,120,105, 97,110, 32, - 104, 97,114,100,119, 97,114,101, 44, 32,115,101,116, 32, 50, 41, 10, 48, - 58, 52, 50, 56, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 50, - 52, 50, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 50, 50, 50, 58, - 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 53, 50, 48, 50, 58, 49, 58, 49, - 48, 58, 49, 48, 32, 10, 48, 58, 53, 49,101, 50, 58, 49, 58, 49, 48, 58, - 49, 48, 10, 48, 58, 53, 49, 99, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 53, 49, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, + 87,111,114,108,100, 63, 44, 32,104, 97, 99,107, 41, 13, 10, 48, 58,101, + 48, 53, 55, 58, 97, 58, 48, 53, 58, 53, 48, 13, 10, 48, 58,101, 48, 54, + 49, 58,102, 58, 56, 55, 58, 56, 99, 13, 10, 13, 10,115,112,108, 97,116, + 116,101,114, 58, 13, 10,115,112,108, 97,116,116,101,114,106, 58, 32, 32, + 59, 42, 42, 42, 42, 42,115,112,108, 97,116,116,101,114, 32,104,111,117, + 115,101, 32, 40,106, 97,112, 97,110, 41, 13, 10,115,112,108, 97,116,116, + 101,114, 50, 58, 13, 10, 49, 58, 49, 52, 51, 48, 58, 51,102, 58, 48, 48, + 58, 50,101, 13, 10, 13, 10,118, 98,111,119,108,106, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 86,105,114,116,117, 97, 32, 66,111,119,108,105,110, + 103, 32, 40, 74, 97,112, 97,110, 44, 32, 86, 49, 48, 48, 74, 67, 77, 41, + 13, 10,118, 98,111,119,108, 58, 13, 10, 48, 58, 49, 48, 49, 99, 51, 50, + 58, 52, 52, 58, 48, 48, 58, 50,101, 13, 10, 13, 10,115,116,107, 99,108, + 109,110,115, 58, 13, 10,115,116,107, 99,108,109,110,115,106, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 83,116, 97, 99,107, 32, 67,111,108,117,109, + 110,115, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58,102,102,102, 99, + 50, 52, 58, 51, 56, 58, 52, 98, 58, 56, 56, 13, 10, 13, 10,114,101,100, + 99,108, 97,115,104, 58, 13, 10,114,101,100, 99,108, 97,115,104, 97, 58, + 13, 10, 48, 58, 54, 48, 50, 51, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 54, 51, 50, 48, 58, 54, 58, 50, 51, 58, 49,100, 13, 10,114,101, + 100, 99,108, 97,115,104,107, 58, 13, 10, 48, 58, 54, 48, 50, 51, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 51, 50, 48, 58, 54, 58, 49, + 97, 58, 49,101, 13, 10, 13, 10,107,105,107,105,107, 97,105, 58, 13, 10, + 107,110,105,103,104,116, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75, + 110,105,103,104,116, 32, 66,111,121, 13, 10, 48, 58,101, 50,102, 99, 58, + 50, 51, 58, 48, 48, 58, 53, 53, 13, 10, 13, 10,122,105,103,122, 97,103, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,122,105,103, 32,122, 97,103, 32, + 40,103, 97,108, 97,120,105, 97,110, 32,104, 97,114,100,119, 97,114,101, + 44, 32,115,101,116, 32, 49, 41, 13, 10,122,105,103,122, 97,103, 98, 58, + 13, 10,122,105,103,122, 97,103, 98, 50, 58, 13, 10,122,105,103,122, 97, + 103, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,122,105,103, 32,122, 97, + 103, 32, 40,103, 97,108, 97,120,105, 97,110, 32,104, 97,114,100,119, 97, + 114,101, 44, 32,115,101,116, 32, 50, 41, 13, 10, 48, 58, 52, 50, 56, 48, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 50, 52, 50, 58, 49, + 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 53, 50, 50, 50, 58, 49, 58, 49, + 48, 58, 49, 48, 13, 10, 48, 58, 53, 50, 48, 50, 58, 49, 58, 49, 48, 58, + 49, 48, 13, 10, 48, 58, 53, 49,101, 50, 58, 49, 58, 49, 48, 58, 49, 48, + 13, 10, 48, 58, 53, 49, 99, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 53, 49, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, - 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, - 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, - 49, 48, 50, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111, - 119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 13, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111, + 102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95, + 118, 48, 46, 49, 48, 50, 32, 97,100,100,105,116,105,111,110,115, 32, 98, + 101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, + 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 10, 10,118, 97,114,116,104, 58, 10,118, 97,114,116,104,106, 58, 10,118, - 97,114,116,104,117, 58, 10,118, 97,114,116,104,114, 49, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42,118, 97,114,116,104, 32, 45, 32,111,112,101,114, - 97,116,105,111,110, 32,116,104,117,110,100,101,114,115,116,111,114,109, - 32, 40,119,111,114,108,100, 32, 57, 50, 48, 54, 49, 50, 41, 10,118, 97, - 114,116,104,106,114, 58, 10, 48, 58,102,102,102, 57,101, 97, 58, 53, 48, - 58, 48, 48, 58, 48, 49, 10, 48, 58,102,102,102, 97, 52, 50, 58, 48, 52, - 58, 48, 48, 58, 48, 48, 10, 10,118, 97,110,100,121,107,101, 58, 10,118, - 97,110,100,121,107,101, 98, 58, 10,118, 97,110,100,121,107,101,106, 97, - 108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,110,100,121,107,101, - 32, 40, 74, 97,108,101, 99,111, 44, 32, 83,101,116, 32, 49, 41, 10,118, - 97,110,100,121,107,101,106, 97,108, 50, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 86, 97,110,100,121,107,101, 32, 40, 74, 97,108,101, 99,111, 44, - 32, 83,101,116, 32, 50, 41, 10, 48, 58,102, 48, 49, 48, 49, 58,102,102, - 58, 48, 48, 58, 50,101, 10, 48, 58,102, 48, 48,100, 49, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 10,116,114, 99,107,121,100,111, 99, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 84,114,105, 99,107,121, 32, 68,111, 99, 32, - 40, 83,101,116, 32, 50, 41, 10, 48, 58,101, 48, 51, 99, 58, 55, 56, 58, - 49, 48, 58, 52, 54, 10, 10,114,111,104,103, 97, 58, 10,114,111,104,103, - 97,104, 58, 32, 32, 10,114,111,104,103, 97,117, 58, 32, 32, 10,114,111, - 104,103, 97, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,114,111,104,103, - 97, 32, 97,114,109,111,117,114, 32,102,111,114, 99,101, 32, 40, 97,115, - 105, 97, 47,101,117,114,111,112,101, 32,118, 51, 46, 48, 32,115,101,116, - 32, 49, 41, 10,114,111,104,103, 97, 50, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,114,111,104,103, 97, 32, 97,114,109,111,117,114, 32,102,111,114, - 99,101, 32, 40, 97,115,105, 97, 47,101,117,114,111,112,101, 32,118, 51, - 46, 48, 32,115,101,116, 32, 50, 41, 10,119,111,108,102,102, 97,110,103, - 58, 10, 48, 58, 51,102, 48, 50, 48, 48, 58, 53, 48, 58, 48, 48, 58, 48, - 57, 32, 10, 10, 59, 42, 42, 32,116,104,101,115,101, 32, 97,114,101, 32, - 117,110,116,101,115,116,101,100, 32, 97,115, 32,116,104,101, 32,100,111, - 110,116, 32,119,111,114,107, 32,105,110, 32,116,104,105,115, 32,118,101, - 114,115,105,111,110, 32,111,102, 32,109, 97,109,101, 32, 40,109, 97,109, - 101, 32,118, 48, 46, 57, 54,117, 49, 41, 32, 42, 42, 10,109,116,108, 99, - 104, 97,109,112,106, 58, 32, 32, 10,109,116,108, 99,104, 97,109,112, 58, - 32, 32, 10,109,116,108, 99,104, 97,109,112, 97, 58, 32, 32, 10,109,116, - 108, 99,104, 97,109,112,117, 58, 32, 32, 10,109,116,108, 99,104, 97,109, - 112, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109, 97,114,116,105, 97, - 108, 32, 99,104, 97,109,112,105,111,110, 32, 40,118,101,114, 32,101, 97, - 97, 41, 10,109,116,108, 99,104, 97,109,112,117, 49, 58, 10, 48, 58, 49, - 48, 48, 51, 48, 48, 58, 54, 49, 58, 48, 48, 58, 52, 52, 10, 10,109,101, - 116, 97,109,114,112,104, 58, 10,109,101,116, 97,109,114,112,104,106, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,101,116, 97,109,111,114,112,104, - 105, 99, 32, 70,111,114, 99,101, 32, 40,118,101,114, 32,106, 97, 97, 41, - 10,109,101,116, 97,109,114,112,104,117, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 13, 10, 13, 10,118, 97,114,116,104, 58, 13, 10,118, 97, + 114,116,104,106, 58, 13, 10,118, 97,114,116,104,117, 58, 13, 10,118, 97, + 114,116,104,114, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118, 97,114, + 116,104, 32, 45, 32,111,112,101,114, 97,116,105,111,110, 32,116,104,117, + 110,100,101,114,115,116,111,114,109, 32, 40,119,111,114,108,100, 32, 57, + 50, 48, 54, 49, 50, 41, 13, 10,118, 97,114,116,104,106,114, 58, 13, 10, + 48, 58,102,102,102, 57,101, 97, 58, 53, 48, 58, 48, 48, 58, 48, 49, 13, + 10, 48, 58,102,102,102, 97, 52, 50, 58, 48, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,118, 97,110,100,121,107,101, 58, 13, 10,118, 97,110,100, + 121,107,101, 98, 58, 13, 10,118, 97,110,100,121,107,101,106, 97,108, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,110,100,121,107,101, 32, 40, + 74, 97,108,101, 99,111, 44, 32, 83,101,116, 32, 49, 41, 13, 10,118, 97, + 110,100,121,107,101,106, 97,108, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 86, 97,110,100,121,107,101, 32, 40, 74, 97,108,101, 99,111, 44, 32, + 83,101,116, 32, 50, 41, 13, 10, 48, 58,102, 48, 49, 48, 49, 58,102,102, + 58, 48, 48, 58, 50,101, 13, 10, 48, 58,102, 48, 48,100, 49, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,116,114, 99,107,121,100,111, 99, 97, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,114,105, 99,107,121, 32, 68, + 111, 99, 32, 40, 83,101,116, 32, 50, 41, 13, 10, 48, 58,101, 48, 51, 99, + 58, 55, 56, 58, 49, 48, 58, 52, 54, 13, 10, 13, 10,114,111,104,103, 97, + 58, 13, 10,114,111,104,103, 97,104, 58, 13, 10,114,111,104,103, 97,117, + 58, 13, 10,114,111,104,103, 97, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42,114,111,104,103, 97, 32, 97,114,109,111,117,114, 32,102,111,114, 99, + 101, 32, 40, 97,115,105, 97, 47,101,117,114,111,112,101, 32,118, 51, 46, + 48, 32,115,101,116, 32, 49, 41, 13, 10,114,111,104,103, 97, 50, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42,114,111,104,103, 97, 32, 97,114,109,111, + 117,114, 32,102,111,114, 99,101, 32, 40, 97,115,105, 97, 47,101,117,114, + 111,112,101, 32,118, 51, 46, 48, 32,115,101,116, 32, 50, 41, 13, 10,119, + 111,108,102,102, 97,110,103, 58, 13, 10, 48, 58, 51,102, 48, 50, 48, 48, + 58, 53, 48, 58, 48, 48, 58, 48, 57, 13, 10, 13, 10, 59, 42, 42, 32,116, + 104,101,115,101, 32, 97,114,101, 32,117,110,116,101,115,116,101,100, 32, + 97,115, 32,116,104,101, 32,100,111,110,116, 32,119,111,114,107, 32,105, + 110, 32,116,104,105,115, 32,118,101,114,115,105,111,110, 32,111,102, 32, + 109, 97,109,101, 32, 40,109, 97,109,101, 32,118, 48, 46, 57, 54,117, 49, + 41, 32, 42, 42, 13, 10,109,116,108, 99,104, 97,109,112,106, 58, 13, 10, + 109,116,108, 99,104, 97,109,112, 58, 13, 10,109,116,108, 99,104, 97,109, + 112, 97, 58, 13, 10,109,116,108, 99,104, 97,109,112,117, 58, 13, 10,109, + 116,108, 99,104, 97,109,112, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 109, 97,114,116,105, 97,108, 32, 99,104, 97,109,112,105,111,110, 32, 40, + 118,101,114, 32,101, 97, 97, 41, 13, 10,109,116,108, 99,104, 97,109,112, + 117, 49, 58, 13, 10, 48, 58, 49, 48, 48, 51, 48, 48, 58, 54, 49, 58, 48, + 48, 58, 52, 52, 13, 10, 13, 10,109,101,116, 97,109,114,112,104, 58, 13, + 10,109,101,116, 97,109,114,112,104,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,101,116, 97,109,111,114,112,104,105, 99, 32, 70,111,114, 99, - 101, 32, 40,118,101,114, 32,117, 97, 97, 41, 10, 48, 58, 50, 48, 51, 50, - 52, 48, 58, 51, 53, 58, 48, 48, 58, 53, 97, 10, 10,114, 97,105,109, 97, - 105,115, 58, 10,114, 97,105,109, 97,105,115,106, 58, 32, 32, 10,114, 97, - 105,109, 97,105,115,106,111, 58, 10, 48, 58, 97, 50, 51, 55, 58, 51, 48, - 58, 53, 48, 58, 52, 98, 10, 10,119,111,110,100,115,116, 99,107, 58, 32, + 101, 32, 40,118,101,114, 32,106, 97, 97, 41, 13, 10,109,101,116, 97,109, + 114,112,104,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,101,116, 97, + 109,111,114,112,104,105, 99, 32, 70,111,114, 99,101, 32, 40,118,101,114, + 32,117, 97, 97, 41, 13, 10, 48, 58, 50, 48, 51, 50, 52, 48, 58, 51, 53, + 58, 48, 48, 58, 53, 97, 13, 10, 13, 10,114, 97,105,109, 97,105,115, 58, + 13, 10,114, 97,105,109, 97,105,115,106, 58, 13, 10,114, 97,105,109, 97, + 105,115,106,111, 58, 13, 10, 48, 58, 97, 50, 51, 55, 58, 51, 48, 58, 53, + 48, 58, 52, 98, 13, 10, 13, 10,119,111,110,100,115,116, 99,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,111,110,100,101,114, 32, 83,116,105, - 99,107, 32, 10,119,111,110,100,115,116, 99,107, 97, 58, 10, 48, 58, 49, - 50, 99, 51, 53, 52, 58, 51, 98, 58, 53, 55, 58, 51, 48, 10, 10,115,112, - 108, 97,115,104, 58, 10,115,112,108, 97,115,104, 49, 48, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 83,112,108, 97,115,104, 33, 32, 40, 86,101,114, - 46, 32, 49, 46, 48, 32, 87,111,114,108,100, 41, 10, 48, 58,102,102, 99, - 97, 49, 48, 58, 53, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 99, - 97, 53,101, 58, 49, 58, 50, 55, 58, 50, 55, 10, 10,115,105, 99,104,117, - 97,110, 50, 58, 10,115,105, 99,104,117, 97,110, 50, 97, 58, 10,115,104, - 105,115,101,110, 58, 10,109, 97,116, 99,104,105,116, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,109, 97,116, 99,104, 32,105,116, 10, 48, 58,102, 99, - 97,101, 58, 53, 50, 58, 53, 48, 58, 48, 49, 10, 10, 98, 97,116,115,117, - 103,117,110, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97, - 110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, - 32,109, 97,107,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, - 32,119,111,114,107, 93, 10, 98, 97,116,115,117,103,117,110, 97, 58, 10, - 98, 97,116,115,117,103,117,110,115,112, 58, 10, 98, 97,116,115,117,103, - 117,110, 98, 58, 10, 48, 58, 49, 48, 49, 48, 57,101, 58, 48, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 49, 48, 49, 49, 54, 54, 58, 55, 48, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 49, 48, 49, 49, 98, 53, 58, 48, 49, 58, 49, - 53, 58, 49, 53, 10, 10,112,117,122,108,111,111,112,106, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 80,117,122,122, 32, 76,111,111,112, 32, 40, 74, - 97,112, 97,110, 41, 10, 48, 58, 54, 48, 57,100, 48, 56, 48, 58, 52, 49, - 58, 48, 48, 58, 51, 49, 10, 48, 58, 54, 48, 57,100, 49, 97, 56, 58, 52, - 49, 58, 48, 48, 58, 51, 48, 10, 10,112,117,122,108,111,111,112,117, 58, - 10,112,117,122,108,111,111,112,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 80,117,122,122, 32, 76,111,111,112, 32, 40, 75,111,114,101, 97, 41, - 10, 48, 58, 54, 48, 57, 99, 53,100, 56, 58, 52, 49, 58, 48, 48, 58, 51, - 49, 10, 48, 58, 54, 48, 57, 99, 55, 48, 48, 58, 52, 49, 58, 48, 48, 58, - 51, 48, 10, 10,109,101,116,108,115, 97,118,114, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 77,101,116, 97,108, 32, 83, 97,118,101,114, 10, 48, 58, - 51, 52, 49, 54, 48, 48, 58, 54, 51, 58, 48, 51, 58, 52, 52, 10, 10,110, - 105,110,106, 97,107, 58, 10,110,105,110,106, 97,107,117, 58, 32, 32, 59, + 99,107, 32, 13, 10,119,111,110,100,115,116, 99,107, 97, 58, 13, 10, 48, + 58, 49, 50, 99, 51, 53, 52, 58, 51, 98, 58, 53, 55, 58, 51, 48, 13, 10, + 13, 10,115,112,108, 97,115,104, 58, 13, 10,115,112,108, 97,115,104, 49, + 48, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,112,108, 97,115,104, 33, + 32, 40, 86,101,114, 46, 32, 49, 46, 48, 32, 87,111,114,108,100, 41, 13, + 10, 48, 58,102,102, 99, 97, 49, 48, 58, 53, 48, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,102,102, 99, 97, 53,101, 58, 49, 58, 50, 55, 58, 50, 55, + 13, 10, 13, 10,115,105, 99,104,117, 97,110, 50, 58, 13, 10,115,105, 99, + 104,117, 97,110, 50, 97, 58, 13, 10,115,104,105,115,101,110, 58, 13, 10, + 109, 97,116, 99,104,105,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109, + 97,116, 99,104, 32,105,116, 13, 10, 48, 58,102, 99, 97,101, 58, 53, 50, + 58, 53, 48, 58, 48, 49, 13, 10, 13, 10, 98, 97,116,115,117,103,117,110, + 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, + 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,109, 97, + 107,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 32,119,111, + 114,107, 93, 13, 10, 98, 97,116,115,117,103,117,110, 97, 58, 13, 10, 98, + 97,116,115,117,103,117,110,115,112, 58, 13, 10, 98, 97,116,115,117,103, + 117,110, 98, 58, 13, 10, 48, 58, 49, 48, 49, 48, 57,101, 58, 48, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 49, 49, 54, 54, 58, 55, 48, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 49, 49, 98, 53, 58, 48, + 49, 58, 49, 53, 58, 49, 53, 13, 10, 13, 10,112,117,122,108,111,111,112, + 106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,117,122,122, 32, 76,111, + 111,112, 32, 40, 74, 97,112, 97,110, 41, 13, 10, 48, 58, 54, 48, 57,100, + 48, 56, 48, 58, 52, 49, 58, 48, 48, 58, 51, 49, 13, 10, 48, 58, 54, 48, + 57,100, 49, 97, 56, 58, 52, 49, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, + 112,117,122,108,111,111,112,117, 58, 13, 10,112,117,122,108,111,111,112, + 107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,117,122,122, 32, 76,111, + 111,112, 32, 40, 75,111,114,101, 97, 41, 13, 10, 48, 58, 54, 48, 57, 99, + 53,100, 56, 58, 52, 49, 58, 48, 48, 58, 51, 49, 13, 10, 48, 58, 54, 48, + 57, 99, 55, 48, 48, 58, 52, 49, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, + 109,101,116,108,115, 97,118,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 77,101,116, 97,108, 32, 83, 97,118,101,114, 13, 10, 48, 58, 51, 52, 49, + 54, 48, 48, 58, 54, 51, 58, 48, 51, 58, 52, 52, 13, 10, 13, 10,110,105, + 110,106, 97,107, 58, 13, 10,110,105,110,106, 97,107,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 78,105,110,106, 97, 32, 75,105, - 100,115, 32, 40, 85, 83, 41, 10,110,105,110,106, 97,107,106, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 78,105,110,106, 97, 32, 75, - 105,100,115, 32, 40, 74, 97,112, 97,110, 41, 10, 48, 58, 49, 48, 50, 98, - 56, 48, 58, 52, 56, 58, 48, 48, 58, 50, 48, 10, 10, 98,110,122, 97, 98, - 114,111,115, 58, 10, 98,110,122, 97, 98,114,111,115,106, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 66,111,110, 97,110,122, 97, 32, 66,114,111,115, - 32, 40, 74, 97,112, 97,110, 44, 32, 70,108,111,112,112,121, 32, 68, 83, - 51, 45, 53, 48, 48, 48, 45, 48, 55, 98, 41, 10, 48, 58,102, 48, 48, 55, - 48, 48, 58, 57, 56, 58, 48, 48, 58, 52,100, 10, 48, 58,102, 48, 48, 55, - 48, 49, 58, 49, 58, 51, 49, 58, 51, 49, 10, 10,122,105,112,122, 97,112, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 90,105,112, 32, 38, 32, 90, 97, - 112, 10, 48, 58, 99, 56, 48, 53, 48, 50, 58, 52,101, 58, 52,101, 58, 52, - 49, 10, 10,119, 97,116,114, 98, 97,108,108, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 87, 97,116,101,114, 32, 66, 97,108,108,115, 10, 48, 58,102, - 101,100, 53, 51, 99, 58, 52, 97, 58, 52,101, 58, 48, 48, 10, 10,101,103, - 103,104,117,110,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,103,103, - 32, 72,117,110,116, 10, 48, 58,102, 48, 48, 48, 58, 55, 48, 58, 52, 53, - 58, 48, 48, 10, 48, 58,102, 48, 54, 98, 58, 49, 58, 48, 51, 58, 48, 51, - 10, 10,102, 99,114, 97,115,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 70,105,110, 97,108, 32, 67,114, 97,115,104, 32, 40, 87,111,114,108,100, - 44, 32, 98,111,111,116,108,101,103, 41, 10, 48, 58,102,102, 56, 53, 48, - 99, 58, 51, 99, 58,102,102, 58, 48, 48, 10, 48, 58,102,102, 56, 48, 97, - 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, + 100,115, 32, 40, 85, 83, 41, 13, 10,110,105,110,106, 97,107,106, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 78,105,110,106, 97, 32, + 75,105,100,115, 32, 40, 74, 97,112, 97,110, 41, 13, 10, 48, 58, 49, 48, + 50, 98, 56, 48, 58, 52, 56, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 98, + 110,122, 97, 98,114,111,115, 58, 13, 10, 98,110,122, 97, 98,114,111,115, + 106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,111,110, 97,110,122, 97, + 32, 66,114,111,115, 32, 40, 74, 97,112, 97,110, 44, 32, 70,108,111,112, + 112,121, 32, 68, 83, 51, 45, 53, 48, 48, 48, 45, 48, 55, 98, 41, 13, 10, + 48, 58,102, 48, 48, 55, 48, 48, 58, 57, 56, 58, 48, 48, 58, 52,100, 13, + 10, 48, 58,102, 48, 48, 55, 48, 49, 58, 49, 58, 51, 49, 58, 51, 49, 13, + 10, 13, 10,122,105,112,122, 97,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 90,105,112, 32, 38, 32, 90, 97,112, 13, 10, 48, 58, 99, 56, 48, 53, + 48, 50, 58, 52,101, 58, 52,101, 58, 52, 49, 13, 10, 13, 10,119, 97,116, + 114, 98, 97,108,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87, 97,116, + 101,114, 32, 66, 97,108,108,115, 13, 10, 48, 58,102,101,100, 53, 51, 99, + 58, 52, 97, 58, 52,101, 58, 48, 48, 13, 10, 13, 10,101,103,103,104,117, + 110,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,103,103, 32, 72,117, + 110,116, 13, 10, 48, 58,102, 48, 48, 48, 58, 55, 48, 58, 52, 53, 58, 48, + 48, 13, 10, 48, 58,102, 48, 54, 98, 58, 49, 58, 48, 51, 58, 48, 51, 13, + 10, 13, 10,102, 99,114, 97,115,104, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 70,105,110, 97,108, 32, 67,114, 97,115,104, 32, 40, 87,111,114,108, + 100, 44, 32, 98,111,111,116,108,101,103, 41, 13, 10, 48, 58,102,102, 56, + 53, 48, 99, 58, 51, 99, 58,102,102, 58, 48, 48, 13, 10, 48, 58,102,102, + 56, 48, 97, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32, - 108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32, - 104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 49, 48, 48, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102, + 105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, + 46, 49, 48, 48, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, + 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 42, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, - 32, 98,111,116,104, 32,115,116, 97,114, 32,119, 97,114,115, 32,114,101, - 118,105,115,105,111,110,115, 44, 32,102,105,120,101,100, 32, 45, 32,121, - 111,117, 32,109,117,115,116, 32,100,101,108,101,116,101, 32,116,104,101, - 32,115,116, 97,114,119, 97,114,115, 47,115,116, 97,114,119, 97,114,115, - 49, 32,110,118,114, 97,109, 32,102,105,108,101,115, 47,115, 10, 59, 42, - 42, 32, 98,101,102,111,114,101, 32,117,115,105,110,103, 32,116,104,105, - 115, 32,115, 97,118,101, 44, 32, 97,108,115,111, 32,100,101,108,101,116, - 101, 32, 98,111,116,104, 32,115,116, 97,114,119, 97,114,115, 47,115,116, - 97,114,119, 97,114,115, 49, 32, 46,104,105, 32,102,105,108,101,115, 32, - 97,108,115,111, 44, 32, 97,110,100, 32,116,104,101,114,101,115, 32,109, - 111,114,101, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,104, - 97,118,101, 32,110,118,114, 97,109, 32,115, 97,118,105,110,103, 32,101, - 110, 97, 98,108,101,100, 32,105,110, 32,116,104,101, 32,103, 97,109,101, - 115, 32,115,101,114,118,105, 99,101, 32,109,101,110,117, 32, 40,102, 50, - 41, 32,105, 32,116,104,105,110,107, 32,110,118,114, 97,109, 32,115, 97, - 118,105,110,103, 32,105,115, 32,111,110, 32, 98,121, 10, 59, 42, 42, 32, - 100,101,102, 97,117,108,116, 32, 97,110,121,119, 97,121, 46, 10, 59, 42, - 42, 85, 80, 68, 65, 84, 69, 42, 42, 32,116,104,105,115, 32,119, 97,115, - 32,119,111,114,107,105,110,103, 32,117,110,116,105,108,108, 32,109, 97, - 109,101, 32, 48, 46, 49, 48, 52, 32,100,105,115, 97, 98,108,101,100, 32, - 102,111,114, 32,110,111,119, 32, 33, 33, 32, 32, 42, 42, 42, 42, 10,115, - 116, 97,114,119, 97,114,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115, - 116, 97,114, 32,119, 97,114,115, 32, 40,114,101,118, 32, 49, 41, 10,115, - 116, 97,114,119, 97,114,115, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 115,116, 97,114, 32,119, 97,114,115, 32, 40,114,101,118, 32, 50, 41, 10, - 48, 58, 52, 97, 57, 97, 58, 49, 99, 58, 48, 48, 58, 53, 53, 10, 48, 58, - 52, 97, 98,102, 58, 49, 53, 58, 48, 55, 58, 48,100, 10, 10, 59, 42, 42, - 32,116,111,112, 32, 51, 32,115, 99,111,114,101,115, 32,115, 97,118,101, - 100, 32, 98,121, 32,110,118,114, 97,109, 44, 32,116,104,105,115, 32,115, - 97,118,101,115, 32,111,116,104,101,114, 32,115, 99,111,114,101,116, 97, - 98,108,101, 32,100, 97,116, 97, 32, 42, 42, 10, 59, 42, 42, 32,100,101, - 108,101,116,101, 32, 99,114,107,100,111,119,110, 46,110,118, 32,102,105, - 108,101, 32, 98,101,102,111,114,101, 32, 49,115,116, 32,116,105,109,101, - 32,121,111,117, 32,112,108, 97,121, 32,103, 97,109,101, 44, 32,111,107, - 32, 97,102,116,101,114, 32,116,104, 97,116, 32, 42, 42, 10, 99,114,107, - 100,111,119,110, 58, 10, 99,114,107,100,111,119,110,106, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 67,114, 97, 99,107, 32, 68,111,119,110, 32, 40, - 74, 97,112, 97,110, 44, 32, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, - 48, 48, 53, 56, 45, 48, 52, 98, 41, 10, 99,114,107,100,111,119,110,117, - 58, 10, 48, 58,102, 98, 50, 52, 54, 58, 50, 53, 58, 48, 48, 58, 49, 56, - 10, 10,112,119,114,105,110,115,116, 50, 58, 10,112,119,114,105,110,115, - 116, 50,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,103,111,117,107,101, - 116,115,117,106,105, 32,105, 99,104,105,122,111,107,117, 32, 50, 32, 40, - 106, 97,112, 97,110, 41, 10, 48, 58, 52, 48,101, 56, 48, 48, 58, 51, 50, - 58, 48, 48, 58, 48, 49, 10, 10,103,116,109,114, 58, 10,103,116,109,114, - 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 49, 48, 48, 48, 32, 77,105, - 103,108,105, 97, 58, 32, 71,114,101, 97,116, 32, 49, 48, 48, 48, 32, 77, - 105,108,101,115, 32, 82, 97,108,108,121, 32, 40, 57, 52, 47, 48, 54, 47, - 49, 51, 41, 10, 48, 58, 49, 48, 50,100,102, 50, 58, 49, 57,101, 58, 53, - 57, 58, 56, 48, 10, 10,103,116,109,114,111, 58, 10,103,116,109,114, 98, - 58, 10, 48, 58, 49, 48, 50,100,102, 50, 58, 49, 57, 97, 58, 53, 57, 58, - 56, 48, 10, 10,103,116,109,114,101, 58, 10,103,116,109,114,117,115, 97, - 58, 10, 48, 58, 49, 48, 51, 53,102, 97, 58, 49, 57,101, 58, 53, 57, 58, - 56, 48, 10, 10,119, 98,101, 97, 99,104,118,108, 50, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 87,111,114,108,100, 32, 66,101, 97, 99,104, 32, 86, - 111,108,108,101,121, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58,102,102, - 98,101, 57, 97, 58, 56, 55, 58, 53, 54, 58, 48, 48, 10, 48, 58,102,102, - 98,102, 49,102, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,112,108, 97,121,109, 97,114,107, 46, 99, 10,119, 98, - 101, 97, 99,104,118,108, 58, 10,119, 98,101, 97, 99,104,118,108, 51, 58, - 10, 48, 58,102,102, 98,102, 98, 56, 58, 56, 97, 58, 51, 49, 58, 48, 48, - 10, 10,106,111,108,108,121,106,103,114, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 74,111,108,108,121, 32, 74,111,103,103,101,114, 10, 59, 42, 42, - 32,104,105,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32,119, - 104,101,110, 32,121,111,117, 32,115,116, 97,114,116, 32,121,111,117,114, - 32,102,105,114,115,116, 32,103, 97,109,101, 32, 42, 42, 32, 10, 48, 58, - 56, 53, 99, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 53, 99, - 57, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10,101,108,105,109, 50, 99, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,108,105,109,105,110, 97,116,111, - 114, 32, 40, 50, 32, 80,108, 97,121,101,114,115, 44, 32, 99,111, 99,107, - 116, 97,105,108, 41, 10, 48, 58, 99, 57, 97, 48, 58, 49,101, 58, 48, 99, - 58, 48, 51, 10, 48, 58, 99, 57, 50, 53, 58, 49, 52, 58, 48, 48, 58, 48, - 48, 10, 10,101,108,105,109, 52,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 69,108,105,109,105,110, 97,116,111,114, 32, 40, 52, 32, 80,108, 97, - 121,101,114,115, 44, 32,112,114,111,116,111,116,121,112,101, 41, 10, 48, - 58, 99, 99, 52,100, 58, 49,101, 58, 48, 99, 58, 48, 51, 10, 48, 58, 99, - 57, 50, 56, 58, 49, 52, 58, 48, 48, 58, 48, 48, 10, 10, 98,110,103,108, - 110,103, 98,121, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32, - 114, 97,105,100, 32,111,110, 32, 98,117,110,103,101,108,105,110,103, 32, - 98, 97,121, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 54, 52, 48, 48, - 58, 53, 97, 58, 48, 48, 58, 48, 49, 10, 10,100,107,110,103,106,110,114, - 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,111,110,107,101,121, 32, - 107,111,110,103, 32,106,114, 46, 32, 40, 98,111,111,116,108,101,103, 63, - 41, 10,100,107,111,110,103,106,110,114,106, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,100,111,110,107,101,121, 32,107,111,110,103, 32,106,114, 46, - 32, 40,106, 97,112, 97,110, 63, 41, 10,100,107,111,110,103,106,114, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42,100,111,110,107,101,121, 32,107,111, - 110,103, 32,106,114, 46, 32, 40,117,115, 41, 10,100,107,111,110,103,106, - 114,101, 58, 10,100,107,111,110,103,106,114,112, 98, 58, 10, 48, 58, 54, - 49, 48, 53, 58, 57,101, 58, 49, 48, 58, 49, 48, 10, 48, 58, 54, 48, 98, - 56, 58, 51, 58, 53, 48, 58, 48, 48, 10, 48, 58, 55, 54, 54, 49, 58, 49, - 58, 49, 48, 58, 49, 48, 10, 48, 58, 55, 54, 52, 49, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 55, 54, 50, 49, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 55, 54, 48, 49, 58, 49, 58, 48, 55, 58, 48, 55, 10, 48, 58, - 55, 53,101, 49, 58, 49, 58, 48, 54, 58, 48, 54, 10, 48, 58, 55, 53, 99, - 49, 58, 49, 58, 48, 53, 58, 48, 53, 10, 48, 58, 55, 53, 97, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 10,100,107,111,110,103,106,114, 98, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,100,111,110,107,101,121, 32,107,111,110, - 103, 32,106,114, 46, 32, 40, 98,111,111,116,108,101,103, 41, 10,100,107, - 111,110,103,106,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,111, - 110,107,101,121, 32,107,111,110,103, 32,106,114, 46, 32, 40,106, 97,112, - 97,110, 41, 10,106,114,107,105,110,103, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 74,117,110,105,111,114, 32, 75,105,110,103, 32, 40, 98,111,111, - 116,108,101,103, 32,111,102, 32, 68,111,110,107,101,121, 32, 75,111,110, - 103, 32, 74,114, 46, 41, 10,100,107,105,110,103,106,114, 58, 10, 48, 58, - 54, 49, 48, 53, 58, 57,101, 58, 49, 48, 58, 49, 48, 10, 48, 58, 54, 48, - 98, 56, 58, 51, 58, 48, 48, 58, 48, 49, 10, 48, 58, 55, 54, 54, 49, 58, - 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 55, 54, 52, 49, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 55, 54, 50, 49, 58, 49, 58, 48, 49, 58, 48, - 49, 10, 48, 58, 55, 54, 48, 49, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, - 58, 55, 53,101, 49, 58, 49, 58, 48, 56, 58, 48, 56, 10, 48, 58, 55, 53, - 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 53, 97, 49, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 10,100,107,111,110,103,106,114,109, 58, + 42, 42, 13, 10, 13, 10, 59, 42, 42, 32, 98,111,116,104, 32,115,116, 97, + 114, 32,119, 97,114,115, 32,114,101,118,105,115,105,111,110,115, 44, 32, + 102,105,120,101,100, 32, 45, 32,121,111,117, 32,109,117,115,116, 32,100, + 101,108,101,116,101, 32,116,104,101, 32,115,116, 97,114,119, 97,114,115, + 47,115,116, 97,114,119, 97,114,115, 49, 32,110,118,114, 97,109, 32,102, + 105,108,101,115, 47,115, 13, 10, 59, 42, 42, 32, 98,101,102,111,114,101, + 32,117,115,105,110,103, 32,116,104,105,115, 32,115, 97,118,101, 44, 32, + 97,108,115,111, 32,100,101,108,101,116,101, 32, 98,111,116,104, 32,115, + 116, 97,114,119, 97,114,115, 47,115,116, 97,114,119, 97,114,115, 49, 32, + 46,104,105, 32,102,105,108,101,115, 32, 97,108,115,111, 44, 32, 97,110, + 100, 32,116,104,101,114,101,115, 32,109,111,114,101, 13, 10, 59, 42, 42, + 32,121,111,117, 32,109,117,115,116, 32,104, 97,118,101, 32,110,118,114, + 97,109, 32,115, 97,118,105,110,103, 32,101,110, 97, 98,108,101,100, 32, + 105,110, 32,116,104,101, 32,103, 97,109,101,115, 32,115,101,114,118,105, + 99,101, 32,109,101,110,117, 32, 40,102, 50, 41, 32,105, 32,116,104,105, + 110,107, 32,110,118,114, 97,109, 32,115, 97,118,105,110,103, 32,105,115, + 32,111,110, 32, 98,121, 13, 10, 59, 42, 42, 32,100,101,102, 97,117,108, + 116, 32, 97,110,121,119, 97,121, 46, 13, 10, 59, 42, 42, 85, 80, 68, 65, + 84, 69, 42, 42, 32,116,104,105,115, 32,119, 97,115, 32,119,111,114,107, + 105,110,103, 32,117,110,116,105,108,108, 32,109, 97,109,101, 32, 48, 46, + 49, 48, 52, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110, + 111,119, 32, 33, 33, 32, 32, 42, 42, 42, 42, 13, 10,115,116, 97,114,119, + 97,114,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116, 97,114, 32, + 119, 97,114,115, 32, 40,114,101,118, 32, 49, 41, 13, 10,115,116, 97,114, + 119, 97,114,115, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116, 97, + 114, 32,119, 97,114,115, 32, 40,114,101,118, 32, 50, 41, 13, 10, 48, 58, + 52, 97, 57, 97, 58, 49, 99, 58, 48, 48, 58, 53, 53, 13, 10, 48, 58, 52, + 97, 98,102, 58, 49, 53, 58, 48, 55, 58, 48,100, 13, 10, 13, 10, 59, 42, + 42, 32,116,111,112, 32, 51, 32,115, 99,111,114,101,115, 32,115, 97,118, + 101,100, 32, 98,121, 32,110,118,114, 97,109, 44, 32,116,104,105,115, 32, + 115, 97,118,101,115, 32,111,116,104,101,114, 32,115, 99,111,114,101,116, + 97, 98,108,101, 32,100, 97,116, 97, 32, 42, 42, 13, 10, 59, 42, 42, 32, + 100,101,108,101,116,101, 32, 99,114,107,100,111,119,110, 46,110,118, 32, + 102,105,108,101, 32, 98,101,102,111,114,101, 32, 49,115,116, 32,116,105, + 109,101, 32,121,111,117, 32,112,108, 97,121, 32,103, 97,109,101, 44, 32, + 111,107, 32, 97,102,116,101,114, 32,116,104, 97,116, 32, 42, 42, 13, 10, + 99,114,107,100,111,119,110, 58, 13, 10, 99,114,107,100,111,119,110,106, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,114, 97, 99,107, 32, 68,111, + 119,110, 32, 40, 74, 97,112, 97,110, 44, 32, 70, 68, 49, 48, 57, 52, 32, + 51, 49, 55, 45, 48, 48, 53, 56, 45, 48, 52, 98, 41, 13, 10, 99,114,107, + 100,111,119,110,117, 58, 13, 10, 48, 58,102, 98, 50, 52, 54, 58, 50, 53, + 58, 48, 48, 58, 49, 56, 13, 10, 13, 10,112,119,114,105,110,115,116, 50, + 58, 13, 10,112,119,114,105,110,115,116, 50,106, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,103,111,117,107,101,116,115,117,106,105, 32,105, 99,104, + 105,122,111,107,117, 32, 50, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, + 58, 52, 48,101, 56, 48, 48, 58, 51, 50, 58, 48, 48, 58, 48, 49, 13, 10, + 13, 10,103,116,109,114, 58, 13, 10,103,116,109,114, 97, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 49, 48, 48, 48, 32, 77,105,103,108,105, 97, 58, + 32, 71,114,101, 97,116, 32, 49, 48, 48, 48, 32, 77,105,108,101,115, 32, + 82, 97,108,108,121, 32, 40, 57, 52, 47, 48, 54, 47, 49, 51, 41, 13, 10, + 48, 58, 49, 48, 50,100,102, 50, 58, 49, 57,101, 58, 53, 57, 58, 56, 48, + 13, 10, 13, 10,103,116,109,114,111, 58, 13, 10,103,116,109,114, 98, 58, + 13, 10, 48, 58, 49, 48, 50,100,102, 50, 58, 49, 57, 97, 58, 53, 57, 58, + 56, 48, 13, 10, 13, 10,103,116,109,114,101, 58, 13, 10,103,116,109,114, + 117,115, 97, 58, 13, 10, 48, 58, 49, 48, 51, 53,102, 97, 58, 49, 57,101, + 58, 53, 57, 58, 56, 48, 13, 10, 13, 10,119, 98,101, 97, 99,104,118,108, + 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,111,114,108,100, 32, 66, + 101, 97, 99,104, 32, 86,111,108,108,101,121, 32, 40,115,101,116, 32, 50, + 41, 13, 10, 48, 58,102,102, 98,101, 57, 97, 58, 56, 55, 58, 53, 54, 58, + 48, 48, 13, 10, 48, 58,102,102, 98,102, 49,102, 58, 49, 58, 48, 53, 58, + 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,108, 97, + 121,109, 97,114,107, 46, 99, 13, 10,119, 98,101, 97, 99,104,118,108, 58, + 13, 10,119, 98,101, 97, 99,104,118,108, 51, 58, 13, 10, 48, 58,102,102, + 98,102, 98, 56, 58, 56, 97, 58, 51, 49, 58, 48, 48, 13, 10, 13, 10,106, + 111,108,108,121,106,103,114, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74, + 111,108,108,121, 32, 74,111,103,103,101,114, 13, 10, 59, 42, 42, 32,104, + 105,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32,119,104,101, + 110, 32,121,111,117, 32,115,116, 97,114,116, 32,121,111,117,114, 32,102, + 105,114,115,116, 32,103, 97,109,101, 32, 42, 42, 32, 13, 10, 48, 58, 56, + 53, 99, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 53, 99, + 57, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10,101,108,105,109, 50, + 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,108,105,109,105,110, 97, + 116,111,114, 32, 40, 50, 32, 80,108, 97,121,101,114,115, 44, 32, 99,111, + 99,107,116, 97,105,108, 41, 13, 10, 48, 58, 99, 57, 97, 48, 58, 49,101, + 58, 48, 99, 58, 48, 51, 13, 10, 48, 58, 99, 57, 50, 53, 58, 49, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,101,108,105,109, 52,112, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 69,108,105,109,105,110, 97,116,111,114, 32, + 40, 52, 32, 80,108, 97,121,101,114,115, 44, 32,112,114,111,116,111,116, + 121,112,101, 41, 13, 10, 48, 58, 99, 99, 52,100, 58, 49,101, 58, 48, 99, + 58, 48, 51, 13, 10, 48, 58, 99, 57, 50, 56, 58, 49, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 98,110,103,108,110,103, 98,121, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,118,115, 46, 32,114, 97,105,100, 32,111,110, 32, + 98,117,110,103,101,108,105,110,103, 32, 98, 97,121, 32, 40,106, 97,112, + 97,110, 41, 13, 10, 48, 58, 54, 52, 48, 48, 58, 53, 97, 58, 48, 48, 58, + 48, 49, 13, 10, 13, 10,100,107,110,103,106,110,114, 98, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,100,111,110,107,101,121, 32,107,111,110,103, 32, + 106,114, 46, 32, 40, 98,111,111,116,108,101,103, 63, 41, 13, 10,100,107, + 111,110,103,106,110,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100, + 111,110,107,101,121, 32,107,111,110,103, 32,106,114, 46, 32, 40,106, 97, + 112, 97,110, 63, 41, 13, 10,100,107,111,110,103,106,114, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,100,111,110,107,101,121, 32,107,111,110,103, 32, + 106,114, 46, 32, 40,117,115, 41, 13, 10,100,107,111,110,103,106,114,101, + 58, 13, 10,100,107,111,110,103,106,114,112, 98, 58, 13, 10, 48, 58, 54, + 49, 48, 53, 58, 57,101, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 54, 48, + 98, 56, 58, 51, 58, 53, 48, 58, 48, 48, 13, 10, 48, 58, 55, 54, 54, 49, + 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 55, 54, 52, 49, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55, 54, 50, 49, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 55, 54, 48, 49, 58, 49, 58, 48, 55, 58, + 48, 55, 13, 10, 48, 58, 55, 53,101, 49, 58, 49, 58, 48, 54, 58, 48, 54, + 13, 10, 48, 58, 55, 53, 99, 49, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, + 48, 58, 55, 53, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 100,107,111,110,103,106,114, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 100,111,110,107,101,121, 32,107,111,110,103, 32,106,114, 46, 32, 40, 98, + 111,111,116,108,101,103, 41, 13, 10,100,107,111,110,103,106,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,111,110,107,101,121, 32,107,111, - 110,103, 32,106,114, 46, 32, 40,109,111,111,110, 32, 99,114,101,115,116, - 97, 32,104, 97,114,100,119, 97,114,101, 41, 10, 48, 58, 54, 49, 48, 53, - 58, 57,101, 58, 49, 48, 58, 49, 48, 10, 48, 58, 54, 48, 98, 56, 58, 51, - 58, 48, 48, 58, 48, 49, 10, 48, 58, 57, 50, 54, 49, 58, 49, 58, 49, 48, - 58, 49, 48, 10, 48, 58, 57, 50, 52, 49, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, - 57, 50, 48, 49, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 57, 49,101, - 49, 58, 49, 58, 48, 56, 58, 48, 56, 10, 48, 58, 57, 49, 99, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 10,118,115,112,105,110, 98, 97,108, 58, 10,118,115,112, + 110,103, 32,106,114, 46, 32, 40,106, 97,112, 97,110, 41, 13, 10,106,114, + 107,105,110,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,117,110,105, + 111,114, 32, 75,105,110,103, 32, 40, 98,111,111,116,108,101,103, 32,111, + 102, 32, 68,111,110,107,101,121, 32, 75,111,110,103, 32, 74,114, 46, 41, + 13, 10,100,107,105,110,103,106,114, 58, 13, 10, 48, 58, 54, 49, 48, 53, + 58, 57,101, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 54, 48, 98, 56, 58, + 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 55, 54, 54, 49, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 48, 58, 55, 54, 52, 49, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 55, 54, 50, 49, 58, 49, 58, 48, 49, 58, 48, + 49, 13, 10, 48, 58, 55, 54, 48, 49, 58, 49, 58, 48, 49, 58, 48, 49, 13, + 10, 48, 58, 55, 53,101, 49, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, 48, + 58, 55, 53, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55, + 53, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100,107,111, + 110,103,106,114,109, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,111,110, + 107,101,121, 32,107,111,110,103, 32,106,114, 46, 32, 40,109,111,111,110, + 32, 99,114,101,115,116, 97, 32,104, 97,114,100,119, 97,114,101, 41, 13, + 10, 48, 58, 54, 49, 48, 53, 58, 57,101, 58, 49, 48, 58, 49, 48, 13, 10, + 48, 58, 54, 48, 98, 56, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, + 57, 50, 54, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 57, 50, + 52, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 50, 50, 49, + 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 57, 50, 48, 49, 58, 49, + 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 48, + 56, 58, 48, 56, 13, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,118,115,112,105,110, 98, 97,108, 58, 13, 10,118,115,112, 105,110, 98, 97,108,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, - 46, 32,112,105,110, 98, 97,108,108, 32, 40,106, 97,112, 97,110, 41, 10, - 48, 58, 98, 97, 48, 58, 49, 48, 58, 49, 99, 58, 48, 48, 10, 48, 58, 49, - 49, 56, 58, 53, 58, 48, 48, 58, 48, 48, 10, 10,115,101, 97,114, 99,104, - 97,114, 58, 10,115,101, 97,114, 99,104, 97,114,117, 58, 10,115,101, 97, - 114, 99,104, 97,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 59,115, - 97,114, 32, 45, 32,115,101, 97,114, 99,104, 32, 97,110,100, 32,114,101, - 115, 99,117,101, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 52, 51, 55, - 98, 54, 58, 53, 48, 58, 48, 48, 58, 49,102, 32, 10, 48, 58, 52, 48, 49, - 49, 56, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10,106, 97,106, 97,109, 97, - 114,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32,110,105, - 110,106, 97, 32,106, 97,106, 97,109, 97,114,117, 32,107,117,110, 32, 40, - 106, 97,112, 97,110, 41, 10, 48, 58, 57, 48, 48, 58, 53, 98, 58, 50, 50, - 58, 48, 48, 10, 48, 58, 54, 54, 58, 51, 58,100, 48, 58, 48, 48, 10, 10, - 109,105,103,104,116,121, 98,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 118,115, 46, 32,109,105,103,104,116,121, 32, 98,111,109, 98, 32,106, 97, - 99,107, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 51, 97, 56, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 97, 97, 58, 49, 58, 49, 48, 58, - 49, 48, 10, 10,109, 97, 99,104,114,105,100,114,106, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,118,115, 46, 32,109, 97, 99,104, 32,114,105,100,101, - 114, 40,106, 97,112, 97,110, 44,102,105,103,104,116,105,110,103, 32, 99, - 111,117,114, 99,101, 32,118,101,114,115,105,111,110, 41, 10,109, 97, 99, - 104,114,105,100,114, 97, 58, 10, 48, 58, 55, 48, 48, 58, 53, 48, 58, 48, - 48, 58, 52, 98, 10, 48, 58, 55, 48, 49, 58, 49, 58, 48, 53, 58, 48, 53, - 10, 10,105, 99,101, 99,108,109,114,106, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,118,115, 46, 32,105, 99,101, 32, 99,108,105,109, 98,101,114, 32, - 100,117, 97,108, 32, 40,106, 97,112, 97,110, 41, 10,105, 99,101, 99,108, - 109,114,100, 58, 10, 48, 58, 55, 53, 48, 58, 51, 99, 58, 48, 48, 58, 50, - 51, 10, 48, 58, 55, 53, 49, 58, 49, 58, 55, 55, 58, 55, 55, 10, 49, 58, - 55, 53, 48, 58, 51, 99, 58, 48, 48, 58, 50, 51, 10, 49, 58, 55, 53, 49, - 58, 49, 58, 55, 55, 58, 55, 55, 10, 10,105, 99,101, 99,108,105,109, 98, - 58, 10,105, 99,101, 99,108,105,109, 98,106, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,118,115, 46, 32,105, 99,101, 32, 99,108,105,109, 98,101,114, - 32, 40,106, 97,112, 97,110, 41, 10,105, 99,101, 99,108,105,109, 98, 97, - 58, 10, 48, 58, 55, 53, 48, 58, 51, 99, 58, 48, 48, 58, 50, 51, 10, 10, - 118,115,103,114, 97,100,117,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 118,115, 46, 32,103,114, 97,100,105,117,115, 10, 48, 58, 55,101, 48, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55,101, 49, 58, 49, 58, 53, 48, - 58, 53, 48, 10, 10,118,115,102,100,102, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,118,115, 46, 32,102,114,101,101,100,111,109, 32,102,111,114, 99, - 101, 10, 48, 58, 55, 49, 50, 58, 57, 99, 58, 49, 48, 58, 50, 56, 10, 10, - 101,120, 99,105,116,101, 98,107, 58, 10,101,120, 99,105,116,101, 98,107, - 97, 58, 10,101,120, 99,105,116,101, 98,107,106, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,118,115, 46, 32,101,120, 99,105,116,101, 98,105,107,101, - 32, 40,106, 97,112, 97,110, 41, 10,101,120, 99,105,116,101, 98,107,111, - 58, 10, 48, 58, 54, 51, 48, 58, 49, 52,102, 58, 48, 48, 58, 48,101, 10, - 10,118,115,103,111,110,103,102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 118,115, 46, 32,103,111,110,103, 32,102,105,103,104,116, 10,114,105,110, - 103,102,103,116, 58, 10,114,105,110,103,102,103,116, 50, 58, 10, 48, 58, - 99, 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 48, 54, - 48, 58, 51,101, 58, 48, 48, 58, 49, 49, 10, 48, 58, 99, 48, 50, 55, 58, - 49, 58, 50, 48, 58, 50, 48, 10, 10,118, 98,108,111,107, 98,114,107, 58, + 46, 32,112,105,110, 98, 97,108,108, 32, 40,106, 97,112, 97,110, 41, 13, + 10, 48, 58, 98, 97, 48, 58, 49, 48, 58, 49, 99, 58, 48, 48, 13, 10, 48, + 58, 49, 49, 56, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,101, + 97,114, 99,104, 97,114, 58, 13, 10,115,101, 97,114, 99,104, 97,114,117, + 58, 13, 10,115,101, 97,114, 99,104, 97,114,106, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 59,115, 97,114, 32, 45, 32,115,101, 97,114, 99,104, 32, + 97,110,100, 32,114,101,115, 99,117,101, 32, 40,106, 97,112, 97,110, 41, + 13, 10, 48, 58, 52, 51, 55, 98, 54, 58, 53, 48, 58, 48, 48, 58, 49,102, + 13, 10, 48, 58, 52, 48, 49, 49, 56, 58, 51, 58, 48, 48, 58, 48, 49, 13, + 10, 13, 10,106, 97,106, 97,109, 97,114,117, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,118,115, 46, 32,110,105,110,106, 97, 32,106, 97,106, 97,109, + 97,114,117, 32,107,117,110, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, + 58, 57, 48, 48, 58, 53, 98, 58, 50, 50, 58, 48, 48, 13, 10, 48, 58, 54, + 54, 58, 51, 58,100, 48, 58, 48, 48, 13, 10, 13, 10,109,105,103,104,116, + 121, 98,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32,109, + 105,103,104,116,121, 32, 98,111,109, 98, 32,106, 97, 99,107, 32, 40,106, + 97,112, 97,110, 41, 13, 10, 48, 58, 51, 97, 56, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 97, 97, 58, 49, 58, 49, 48, 58, 49, 48, 13, + 10, 13, 10,109, 97, 99,104,114,105,100,114,106, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,118,115, 46, 32,109, 97, 99,104, 32,114,105,100,101,114, + 40,106, 97,112, 97,110, 44,102,105,103,104,116,105,110,103, 32, 99,111, + 117,114, 99,101, 32,118,101,114,115,105,111,110, 41, 13, 10,109, 97, 99, + 104,114,105,100,114, 97, 58, 13, 10, 48, 58, 55, 48, 48, 58, 53, 48, 58, + 48, 48, 58, 52, 98, 13, 10, 48, 58, 55, 48, 49, 58, 49, 58, 48, 53, 58, + 48, 53, 13, 10, 13, 10,105, 99,101, 99,108,109,114,106, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,118,115, 46, 32,105, 99,101, 32, 99,108,105,109, + 98,101,114, 32,100,117, 97,108, 32, 40,106, 97,112, 97,110, 41, 13, 10, + 105, 99,101, 99,108,109,114,100, 58, 13, 10, 48, 58, 55, 53, 48, 58, 51, + 99, 58, 48, 48, 58, 50, 51, 13, 10, 48, 58, 55, 53, 49, 58, 49, 58, 55, + 55, 58, 55, 55, 13, 10, 49, 58, 55, 53, 48, 58, 51, 99, 58, 48, 48, 58, + 50, 51, 13, 10, 49, 58, 55, 53, 49, 58, 49, 58, 55, 55, 58, 55, 55, 13, + 10, 13, 10,105, 99,101, 99,108,105,109, 98, 58, 13, 10,105, 99,101, 99, + 108,105,109, 98,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, + 32,105, 99,101, 32, 99,108,105,109, 98,101,114, 32, 40,106, 97,112, 97, + 110, 41, 13, 10,105, 99,101, 99,108,105,109, 98, 97, 58, 13, 10, 48, 58, + 55, 53, 48, 58, 51, 99, 58, 48, 48, 58, 50, 51, 13, 10, 13, 10,118,115, + 103,114, 97,100,117,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, + 46, 32,103,114, 97,100,105,117,115, 13, 10, 48, 58, 55,101, 48, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55,101, 49, 58, 49, 58, 53, 48, + 58, 53, 48, 13, 10, 13, 10,118,115,102,100,102, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,118,115, 46, 32,102,114,101,101,100,111,109, 32,102,111, + 114, 99,101, 13, 10, 48, 58, 55, 49, 50, 58, 57, 99, 58, 49, 48, 58, 50, + 56, 13, 10, 13, 10,101,120, 99,105,116,101, 98,107, 58, 13, 10,101,120, + 99,105,116,101, 98,107, 97, 58, 13, 10,101,120, 99,105,116,101, 98,107, + 106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32,101,120, 99, + 105,116,101, 98,105,107,101, 32, 40,106, 97,112, 97,110, 41, 13, 10,101, + 120, 99,105,116,101, 98,107,111, 58, 13, 10, 48, 58, 54, 51, 48, 58, 49, + 52,102, 58, 48, 48, 58, 48,101, 13, 10, 13, 10,118,115,103,111,110,103, + 102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32,103,111,110, + 103, 32,102,105,103,104,116, 13, 10,114,105,110,103,102,103,116, 58, 13, + 10,114,105,110,103,102,103,116, 50, 58, 13, 10, 48, 58, 99, 48, 50, 54, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 48, 54, 48, 58, 51, + 101, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, 99, 48, 50, 55, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 13, 10,118, 98,108,111,107, 98,114,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 32, 98,108,111, 99,107, 32, - 98,114,101, 97,107,101,114, 32, 40, 97,115,105, 97, 41, 10,115, 97,114, - 117,107, 97,110,105, 58, 10, 48, 58, 54, 48, 50, 55, 99, 98, 56, 58, 56, - 48, 58, 48, 48, 58, 50,101, 10, 10,118,115,103,115,104,111,101, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32,103,117,109,115,104,111, - 101, 10, 48, 58, 53, 54, 48, 58, 49,100, 58, 49, 50, 58, 97, 48, 10, 10, - 116,101,116,114,105,115,115,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 84,101,116,114,105,115, 32, 40, 74, 97,112, 97,110, 44, 32, 83,121,115, - 116,101,109, 32, 69, 41, 10, 48, 58, 99, 99, 99, 49, 58, 57,102, 58, 52, - 97, 58, 48, 52, 10, 10,115,115,114,105,100,101,114,115, 58, 10,115,115, - 114,105,100,101,114,115,101, 98,100, 58, 10,115,115,114,105,100,101,114, - 115,101, 98, 99, 58, 10,115,115,114,105,100,101,114,115,117, 97, 98, 58, - 10,115,115,114,105,100,101,114,115,117,100, 97, 58, 10,115,115,114,105, - 100,101,114,115,117, 97, 99, 58, 10,115,115,114,105,100,101,114,115,117, - 98, 99, 58, 10,115,115,114,105,100,101,114,115,106, 98,100, 58, 10,115, - 115,114,105,100,101,114,115, 97, 98,100, 58, 10,115,115,114,105,100,101, - 114,115,101, 97, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,110, - 115,101,116, 32, 82,105,100,101,114,115, 32, 40, 52, 32, 80,108, 97,121, - 101,114,115, 32,118,101,114, 32, 69, 65, 65, 41, 10,115,115,114,105,100, - 101,114,115,106, 97, 99, 58, 10,115,115,114,105,100,101,114,115,106, 97, - 100, 58, 10, 48, 58, 49, 48, 52, 52, 48, 48, 58, 53, 48, 58, 52, 98, 58, - 48, 48, 10, 48, 58, 49, 48, 52, 49, 50, 48, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10,112,108,111,116,116,105,110,103, 58, 10,112,108,111,116,116, - 105,110,103,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,108,111,116, - 116,105,110,103, 32, 40, 85, 83, 41, 10,112,108,111,116,116,105,110,103, - 97, 58, 10,112,108,111,116,116,105,110,103, 98, 58, 10,102,108,105,112, - 117,108,108, 58, 10, 48, 58, 56, 50, 98, 48, 58, 51, 48, 58, 48, 48, 58, - 49, 51, 10, 10,109,115,108,117,103,120, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,109,101,116, 97,108, 32,115,108,117,103, 32,120, 10, 48, 58, 49, - 48,102, 48, 49, 48, 58, 52, 55, 58, 48, 48, 58, 53, 48, 10, 48, 58, 49, - 48,101, 56,102, 50, 58, 50, 58,102,102, 58,102,102, 10, 10,109,115,108, + 98,114,101, 97,107,101,114, 32, 40, 97,115,105, 97, 41, 13, 10,115, 97, + 114,117,107, 97,110,105, 58, 13, 10, 48, 58, 54, 48, 50, 55, 99, 98, 56, + 58, 56, 48, 58, 48, 48, 58, 50,101, 13, 10, 13, 10,118,115,103,115,104, + 111,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118,115, 46, 32,103,117, + 109,115,104,111,101, 13, 10, 48, 58, 53, 54, 48, 58, 49,100, 58, 49, 50, + 58, 97, 48, 13, 10, 13, 10,116,101,116,114,105,115,115,101, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 84,101,116,114,105,115, 32, 40, 74, 97,112, + 97,110, 44, 32, 83,121,115,116,101,109, 32, 69, 41, 13, 10, 48, 58, 99, + 99, 99, 49, 58, 57,102, 58, 52, 97, 58, 48, 52, 13, 10, 13, 10,115,115, + 114,105,100,101,114,115, 58, 13, 10,115,115,114,105,100,101,114,115,101, + 98,100, 58, 13, 10,115,115,114,105,100,101,114,115,101, 98, 99, 58, 13, + 10,115,115,114,105,100,101,114,115,117, 97, 98, 58, 13, 10,115,115,114, + 105,100,101,114,115,117,100, 97, 58, 13, 10,115,115,114,105,100,101,114, + 115,117, 97, 99, 58, 13, 10,115,115,114,105,100,101,114,115,117, 98, 99, + 58, 13, 10,115,115,114,105,100,101,114,115,106, 98,100, 58, 13, 10,115, + 115,114,105,100,101,114,115, 97, 98,100, 58, 13, 10,115,115,114,105,100, + 101,114,115,101, 97, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117, + 110,115,101,116, 32, 82,105,100,101,114,115, 32, 40, 52, 32, 80,108, 97, + 121,101,114,115, 32,118,101,114, 32, 69, 65, 65, 41, 13, 10,115,115,114, + 105,100,101,114,115,106, 97, 99, 58, 13, 10,115,115,114,105,100,101,114, + 115,106, 97,100, 58, 13, 10, 48, 58, 49, 48, 52, 52, 48, 48, 58, 53, 48, + 58, 52, 98, 58, 48, 48, 13, 10, 48, 58, 49, 48, 52, 49, 50, 48, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,112,108,111,116,116,105,110,103, + 58, 13, 10,112,108,111,116,116,105,110,103,117, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 80,108,111,116,116,105,110,103, 32, 40, 85, 83, 41, 13, + 10,112,108,111,116,116,105,110,103, 97, 58, 13, 10,112,108,111,116,116, + 105,110,103, 98, 58, 13, 10,102,108,105,112,117,108,108, 58, 13, 10, 48, + 58, 56, 50, 98, 48, 58, 51, 48, 58, 48, 48, 58, 49, 51, 13, 10, 13, 10, + 109,115,108,117,103,120, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,101, + 116, 97,108, 32,115,108,117,103, 32,120, 13, 10, 48, 58, 49, 48,102, 48, + 49, 48, 58, 52, 55, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, 49, 48,101, + 56,102, 50, 58, 50, 58,102,102, 58,102,102, 13, 10, 13, 10,109,115,108, 117,103, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,101,116, 97,108, - 32,115,108,117,103, 32, 50, 10, 48, 58, 49, 48,102, 48, 48, 97, 58, 54, - 49, 58, 48, 48, 58, 53, 57, 10, 48, 58, 49, 48,101, 54,102, 52, 58, 50, - 58,102,102, 58,102,102, 10, 10,106,105,110, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,106,105,110, 10, 48, 58, 97, 50, 48, 48, 58, 51,102, 58, 51, - 48, 58, 52,101, 10, 10,115,112, 97,116,116,101,114, 58, 10,115,115, 97, - 110, 99,104, 97,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115, 97,110, - 114,105,110, 32,115, 97,110, 32, 99,104, 97,110, 32, 40,106, 97,112, 97, - 110, 41, 10, 48, 58,101,102, 48, 48, 58, 51, 49, 58, 48, 48, 58, 53, 50, - 10, 48, 58, 99, 48, 48, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 99, 48, 48, 99, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10,118, 97,117,116, - 111,117,114, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,117,116, - 111,117,114, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58, 52, 49,101, 48, - 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 99, 48, 58, 49, 58, - 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 97, 48, 58, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58, 52, 49, 56, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, - 48, 58, 52, 49, 54, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, - 49, 52, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 51, 56, 57, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 32,115,108,117,103, 32, 50, 13, 10, 48, 58, 49, 48,102, 48, 48, 97, 58, + 54, 49, 58, 48, 48, 58, 53, 57, 13, 10, 48, 58, 49, 48,101, 54,102, 52, + 58, 50, 58,102,102, 58,102,102, 13, 10, 13, 10,106,105,110, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42,106,105,110, 13, 10, 48, 58, 97, 50, 48, 48, + 58, 51,102, 58, 51, 48, 58, 52,101, 13, 10, 13, 10,115,112, 97,116,116, + 101,114, 58, 13, 10,115,115, 97,110, 99,104, 97,110, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,115, 97,110,114,105,110, 32,115, 97,110, 32, 99,104, + 97,110, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58,101,102, 48, 48, + 58, 51, 49, 58, 48, 48, 58, 53, 50, 13, 10, 48, 58, 99, 48, 48, 98, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 48, 48, 99, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 13, 10,118, 97,117,116,111,117,114, 50, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, 97,117,116,111,117,114, 32, 40, + 115,101,116, 32, 50, 41, 13, 10, 48, 58, 52, 49,101, 48, 58, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 99, 48, 58, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 52, 49, 97, 48, 58, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 52, 49, 56, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 52, 49, 54, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 52, 49, 52, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 51, + 56, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, - 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104, - 105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 57, 32, 97,100,100, - 105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32, - 108,101,101,122,101,114, 32, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, + 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99, + 105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, + 57, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, + 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10,111,115,109, 97, - 110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,111,115,109, 97,110, 32, 40, - 119,111,114,108,100, 41, 10, 99, 97,110,100, 97,110, 99,101, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 99, 97,110,110,111,110, 32,100, 97,110, 99, - 101,114, 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 49, 56, 54,102, 56, - 48, 58,101,101, 58, 57, 51, 58, 48, 48, 10, 48, 58, 49, 56, 55, 48, 54, - 56, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10,109, 97,103,100,114,111,112, - 112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109, 97,103,105, 99, 97,108, - 32,100,114,111,112, 32,112,108,117,115, 32, 49, 32, 40,106, 97,112, 97, - 110, 44, 32,118,101,114,115,105,111,110, 32, 50, 46, 49, 32, 49, 57, 57, - 53, 46, 48, 57, 46, 49, 50, 41, 10, 48, 58, 54, 56, 48, 48, 99, 52, 58, - 52, 53, 58, 48, 48, 58, 52, 49, 10, 48, 58, 54, 56, 48, 57, 50, 48, 58, - 97, 58, 53, 52, 58, 48, 48, 10, 10,109, 97,103,100,114,111,112, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 77, 97,103,105, 99, 97,108, 32, 68,114, - 111,112, 32, 40,106, 97,112, 97,110, 44, 32,118,101,114,115,105,111,110, - 32, 49, 46, 49, 32, 49, 57, 57, 53, 46, 48, 54, 46, 50, 49, 41, 10, 48, - 58, 51, 56, 48, 48, 99, 52, 58, 52, 53, 58, 48, 48, 58, 52, 49, 10, 48, - 58, 51, 56, 48, 57, 50, 48, 58, 97, 58, 53, 52, 58, 48, 48, 10, 10, 99, - 104, 97,105,110,114,101, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, - 104, 97,105,110, 32, 82,101, 97, 99,116,105,111,110, 32, 40,119,111,114, - 108,100, 44, 32,118,101,114,115,105,111,110, 32, 50, 46, 50, 32, 49, 57, - 57, 53, 46, 48, 57, 46, 50, 53, 41, 10, 48, 58, 52, 48, 48, 48, 99, 48, - 58, 52,100, 58, 48, 48, 58, 52, 49, 10, 48, 58, 52, 48, 48, 57, 50, 48, - 58, 97, 58, 53, 52, 58, 48, 48, 10, 10, 99, 97,110,110,111,110, 98, 58, - 10, 99, 97,110,110,111,110, 98, 50, 58, 32, 10, 99, 97,110,110,111,110, - 98, 51, 58, 32, 10, 48, 58, 54, 49, 56, 48, 58,100, 52, 58, 48, 48, 58, - 48, 49, 10, 48, 58, 54, 54, 53, 99, 58, 51, 58, 48, 48, 58, 48, 49, 10, - 10, 99, 97,110,110,111,110, 98,112, 58, 10, 48, 58, 52,100, 56, 48, 58, - 100,102, 58, 48, 48, 58, 48, 49, 10, 10,112,114,116,121,116,105,109,101, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80, 97,114,116,121, 32, 84,105, - 109,101, 58, 32, 71,111,110,116, 97, 32,116,104,101, 32, 68,105,118,101, - 114, 32, 73, 73, 10,103, 97,110,103,111,110,116, 97, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 71, 97,110, 98, 97,114,101, 33, 32, 71,111,110,116, - 97, 33, 33, 32, 50, 10, 48, 58, 49, 56, 53, 99, 50, 52, 58, 52,100, 58, - 48, 48, 58, 49, 56, 10, 48, 58, 50, 48, 49, 98,100, 48, 58, 50, 55, 58, - 51, 50, 58, 48, 48, 10, 48, 58, 50, 48, 49, 98,102, 52, 58, 49, 58, 48, - 53, 58, 48, 53, 10, 10,106,111,101,109, 97, 99,114, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 74,111,101, 32, 38, 32, 77, 97, 99, 32, 82,101,116, - 117,114,110,115, 32, 10,106,111,101,109, 97, 99,114, 97, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 74,111,101, 32, 38, 32, 77, 97, 99, 32, 82,101, - 116,117,114,110,115, 32, 40,115,101,116, 32, 50, 41, 10,106,111,101,109, - 97, 99,114,106, 58, 10, 48, 58, 49, 48, 48, 48, 99, 48, 58, 57,100, 58, - 48, 49, 58, 48, 57, 10, 48, 58, 50, 48, 49, 48, 53, 99, 58, 51, 58, 97, - 48, 58, 48, 49, 10, 10,101,110,100,117,114,111,114, 58, 10,101,110,100, - 117,114,111,114, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,110,100, - 117,114,111, 32, 82, 97, 99,101,114, 32, 40, 89, 77, 50, 50, 48, 51, 44, - 32, 70, 68, 49, 48, 56, 57, 66, 32, 51, 49, 55, 45, 48, 48, 49, 51, 65, - 41, 10,101,110,100,117,114,111,114, 49,100, 58, 10,101,110,100,117,114, - 111,114,100, 58, 10, 48, 58, 52, 51, 52, 48, 48, 58, 52, 97, 48, 58, 48, - 49, 58, 50, 48, 10, 48, 58, 52, 51, 98, 57, 48, 58, 49, 48, 58, 57, 57, - 58, 57, 57, 10, 10,107, 97,105,116,101,105, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,107, 97,105,116,101,105, 32,116, 97,107, 97,114, 97, 32,115, - 97,103, 97,115,104,105, 32, 40,107, 96,107, 45,116,111,107,107,105, 41, - 32, 10, 48, 58, 50, 48, 48,101, 58, 53, 58, 48, 48, 58, 48, 48, 10, 10, - 107, 97,105,116,101,105,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,107, - 97,105,116,101,105, 32,116, 97,107, 97,114, 97, 32,115, 97,103, 97,115, - 104,105, 32, 32, 10, 48, 58, 52, 48, 51,101, 58, 50, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 50, 49, 99, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 50, 49,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 50, - 48, 48, 58, 49, 58,101, 99, 58,101, 99, 10, 48, 58, 50, 50, 52, 48, 58, - 49, 58,101, 99, 58,101, 99, 10, 48, 58, 50, 50, 50, 48, 58, 49, 58,101, - 99, 58,101, 99, 10, 48, 58, 50, 50, 54, 48, 58, 49, 58,101, 99, 58,101, - 99, 10, 10,108,111,102,102,105,114,101, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,108,105,110,101, 32,111,102, 32,102,105,114,101, 32, 47, 32, 98, - 97,107,117,100, 97,110, 32,121, 97,114,111,117, 32, 40,119,111,114,108, - 100, 44, 32,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 51, 54, - 41, 10,108,111,102,102,105,114,101,117, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 76,105,110,101, 32,111,102, 32, 70,105,114,101, 32, 47, 32, 66, - 97,107,117,100, 97,110, 32, 89, 97,114,111,117, 32, 40, 85, 83, 44, 32, - 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 51, 53, 41, 10,108, - 111,102,102,105,114,101,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 76, - 105,110,101, 32,111,102, 32, 70,105,114,101, 32, 47, 32, 66, 97,107,117, - 100, 97,110, 32, 89, 97,114,111,117, 32, 40,106, 97,112, 97,110, 44, 32, - 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 51, 52, 41, 10,108, - 111,102,102,105,114,101,100, 58, 10,108,111,102,102,105,114,101,106,100, - 58, 10,108,111,102,102,105,114,101,117,100, 58, 10, 48, 58, 97, 51, 56, - 48, 48, 58, 49, 56,102, 58, 48, 49, 58, 52, 57, 10, 10, 59, 42, 42, 42, - 42, 42, 42,108,101,116,104, 97,108, 32,101,110,102,111,114, 99,101,114, - 115, 32, 73, 73, 58,103,117,110, 32,102,105,103,104,116,101,114,115, 32, - 40,118,101,114, 32,117, 97, 97, 41, 10,108,101, 50,117, 58, 10, 48, 58, - 99, 48, 51,101, 57, 52, 58, 52, 48, 58, 48, 53, 58, 52, 56, 10, 10, 59, + 13, 10, 13, 10,111,115,109, 97,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42,111,115,109, 97,110, 32, 40,119,111,114,108,100, 41, 13, 10, 99, 97, + 110,100, 97,110, 99,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97, + 110,110,111,110, 32,100, 97,110, 99,101,114, 32, 40,106, 97,112, 97,110, + 41, 13, 10, 48, 58, 49, 56, 54,102, 56, 48, 58,101,101, 58, 57, 51, 58, + 48, 48, 13, 10, 48, 58, 49, 56, 55, 48, 54, 56, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 13, 10,109, 97,103,100,114,111,112,112, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,109, 97,103,105, 99, 97,108, 32,100,114,111,112, + 32,112,108,117,115, 32, 49, 32, 40,106, 97,112, 97,110, 44, 32,118,101, + 114,115,105,111,110, 32, 50, 46, 49, 32, 49, 57, 57, 53, 46, 48, 57, 46, + 49, 50, 41, 13, 10, 48, 58, 54, 56, 48, 48, 99, 52, 58, 52, 53, 58, 48, + 48, 58, 52, 49, 13, 10, 48, 58, 54, 56, 48, 57, 50, 48, 58, 97, 58, 53, + 52, 58, 48, 48, 13, 10, 13, 10,109, 97,103,100,114,111,112, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 77, 97,103,105, 99, 97,108, 32, 68,114,111, + 112, 32, 40,106, 97,112, 97,110, 44, 32,118,101,114,115,105,111,110, 32, + 49, 46, 49, 32, 49, 57, 57, 53, 46, 48, 54, 46, 50, 49, 41, 13, 10, 48, + 58, 51, 56, 48, 48, 99, 52, 58, 52, 53, 58, 48, 48, 58, 52, 49, 13, 10, + 48, 58, 51, 56, 48, 57, 50, 48, 58, 97, 58, 53, 52, 58, 48, 48, 13, 10, + 13, 10, 99,104, 97,105,110,114,101, 99, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 67,104, 97,105,110, 32, 82,101, 97, 99,116,105,111,110, 32, 40, + 119,111,114,108,100, 44, 32,118,101,114,115,105,111,110, 32, 50, 46, 50, + 32, 49, 57, 57, 53, 46, 48, 57, 46, 50, 53, 41, 13, 10, 48, 58, 52, 48, + 48, 48, 99, 48, 58, 52,100, 58, 48, 48, 58, 52, 49, 13, 10, 48, 58, 52, + 48, 48, 57, 50, 48, 58, 97, 58, 53, 52, 58, 48, 48, 13, 10, 13, 10, 99, + 97,110,110,111,110, 98, 58, 13, 10, 99, 97,110,110,111,110, 98, 50, 58, + 13, 10, 99, 97,110,110,111,110, 98, 51, 58, 13, 10, 48, 58, 54, 49, 56, + 48, 58,100, 52, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 54, 54, 53, 99, + 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 99, 97,110,110,111,110, + 98,112, 58, 13, 10, 48, 58, 52,100, 56, 48, 58,100,102, 58, 48, 48, 58, + 48, 49, 13, 10, 13, 10,112,114,116,121,116,105,109,101, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 80, 97,114,116,121, 32, 84,105,109,101, 58, 32, + 71,111,110,116, 97, 32,116,104,101, 32, 68,105,118,101,114, 32, 73, 73, + 13, 10,103, 97,110,103,111,110,116, 97, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 71, 97,110, 98, 97,114,101, 33, 32, 71,111,110,116, 97, 33, 33, + 32, 50, 13, 10, 48, 58, 49, 56, 53, 99, 50, 52, 58, 52,100, 58, 48, 48, + 58, 49, 56, 13, 10, 48, 58, 50, 48, 49, 98,100, 48, 58, 50, 55, 58, 51, + 50, 58, 48, 48, 13, 10, 48, 58, 50, 48, 49, 98,102, 52, 58, 49, 58, 48, + 53, 58, 48, 53, 13, 10, 13, 10,106,111,101,109, 97, 99,114, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 74,111,101, 32, 38, 32, 77, 97, 99, 32, 82, + 101,116,117,114,110,115, 32, 13, 10,106,111,101,109, 97, 99,114, 97, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 74,111,101, 32, 38, 32, 77, 97, 99, + 32, 82,101,116,117,114,110,115, 32, 40,115,101,116, 32, 50, 41, 13, 10, + 106,111,101,109, 97, 99,114,106, 58, 13, 10, 48, 58, 49, 48, 48, 48, 99, + 48, 58, 57,100, 58, 48, 49, 58, 48, 57, 13, 10, 48, 58, 50, 48, 49, 48, + 53, 99, 58, 51, 58, 97, 48, 58, 48, 49, 13, 10, 13, 10,101,110,100,117, + 114,111,114, 58, 13, 10,101,110,100,117,114,111,114, 49, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 69,110,100,117,114,111, 32, 82, 97, 99,101,114, + 32, 40, 89, 77, 50, 50, 48, 51, 44, 32, 70, 68, 49, 48, 56, 57, 66, 32, + 51, 49, 55, 45, 48, 48, 49, 51, 65, 41, 13, 10,101,110,100,117,114,111, + 114, 49,100, 58, 13, 10,101,110,100,117,114,111,114,100, 58, 13, 10, 48, + 58, 52, 51, 52, 48, 48, 58, 52, 97, 48, 58, 48, 49, 58, 50, 48, 13, 10, + 48, 58, 52, 51, 98, 57, 48, 58, 49, 48, 58, 57, 57, 58, 57, 57, 13, 10, + 13, 10,107, 97,105,116,101,105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 107, 97,105,116,101,105, 32,116, 97,107, 97,114, 97, 32,115, 97,103, 97, + 115,104,105, 32, 40,107, 96,107, 45,116,111,107,107,105, 41, 13, 10, 48, + 58, 50, 48, 48,101, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,107, + 97,105,116,101,105,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,107, 97, + 105,116,101,105, 32,116, 97,107, 97,114, 97, 32,115, 97,103, 97,115,104, + 105, 13, 10, 48, 58, 52, 48, 51,101, 58, 50, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 50, 49, 99, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 50, 49,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, + 50, 48, 48, 58, 49, 58,101, 99, 58,101, 99, 13, 10, 48, 58, 50, 50, 52, + 48, 58, 49, 58,101, 99, 58,101, 99, 13, 10, 48, 58, 50, 50, 50, 48, 58, + 49, 58,101, 99, 58,101, 99, 13, 10, 48, 58, 50, 50, 54, 48, 58, 49, 58, + 101, 99, 58,101, 99, 13, 10, 13, 10,108,111,102,102,105,114,101, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42,108,105,110,101, 32,111,102, 32,102,105, + 114,101, 32, 47, 32, 98, 97,107,117,100, 97,110, 32,121, 97,114,111,117, + 32, 40,119,111,114,108,100, 44, 32,102,100, 49, 48, 57, 52, 32, 51, 49, + 55, 45, 48, 49, 51, 54, 41, 13, 10,108,111,102,102,105,114,101,117, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 76,105,110,101, 32,111,102, 32, 70, + 105,114,101, 32, 47, 32, 66, 97,107,117,100, 97,110, 32, 89, 97,114,111, + 117, 32, 40, 85, 83, 44, 32, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, + 48, 49, 51, 53, 41, 13, 10,108,111,102,102,105,114,101,106, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 76,105,110,101, 32,111,102, 32, 70,105,114, + 101, 32, 47, 32, 66, 97,107,117,100, 97,110, 32, 89, 97,114,111,117, 32, + 40,106, 97,112, 97,110, 44, 32, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, + 45, 48, 49, 51, 52, 41, 13, 10,108,111,102,102,105,114,101,100, 58, 13, + 10,108,111,102,102,105,114,101,106,100, 58, 13, 10,108,111,102,102,105, + 114,101,117,100, 58, 13, 10, 48, 58, 97, 51, 56, 48, 48, 58, 49, 56,102, + 58, 48, 49, 58, 52, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,108, + 101,116,104, 97,108, 32,101,110,102,111,114, 99,101,114,115, 32, 73, 73, + 58,103,117,110, 32,102,105,103,104,116,101,114,115, 32, 40,118,101,114, + 32,117, 97, 97, 41, 13, 10,108,101, 50,117, 58, 13, 10, 48, 58, 99, 48, + 51,101, 57, 52, 58, 52, 48, 58, 48, 53, 58, 52, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,108,101,116,104, 97,108, 32,101,110,102,111,114, - 99,101,114,115, 32, 40,117,115, 32,118,101,114, 32,117, 97,101, 41, 10, - 108,101,116,104, 97,108,101,110, 58, 10,108,101,116,104, 97,108,101,110, - 117, 98, 58, 10, 48, 58, 51, 51, 57, 48, 58, 53, 48, 58, 52, 49, 58, 48, - 48, 10, 48, 58, 51, 51,100,101, 58, 49, 58, 55, 48, 58, 55, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 98,111,114,110, 32,116,111, 32,102,105,103, - 104,116, 10, 98,111,114,110,116,111,102,105, 58, 10, 48, 58, 49, 54, 54, - 58, 56, 98, 58, 53, 48, 58, 48, 98, 10, 10,115, 97,110,100,115, 99,114, - 112, 58, 10,115, 97,110,100,115, 99,114,112, 97, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 83, 97,110,100, 32, 83, 99,111,114,112,105,111,110, 32, - 40,115,101,116, 32, 50, 41, 10,115, 97,110,100,115, 99,114,112, 98, 58, - 10, 48, 58, 55, 48, 50, 48, 49, 52, 58, 53, 48, 58, 48, 48, 58, 49, 98, - 10, 48, 58, 55, 48, 48, 48, 52, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,114, 97, 98,105, 97,110, 32, - 40,102,105,120,101,100, 41, 10, 97,114, 97, 98,105, 97,110, 58, 10, 97, - 114, 97, 98,105, 97,110, 97, 58, 10, 48, 58,100, 51, 56, 52, 58, 51, 99, - 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 51, 98,100, 58, 49, 58, 48, 49, - 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 99,101,114,115, 32, 40,117,115, 32,118,101,114, 32,117, 97,101, 41, 13, + 10,108,101,116,104, 97,108,101,110, 58, 13, 10,108,101,116,104, 97,108, + 101,110,117, 98, 58, 13, 10, 48, 58, 51, 51, 57, 48, 58, 53, 48, 58, 52, + 49, 58, 48, 48, 13, 10, 48, 58, 51, 51,100,101, 58, 49, 58, 55, 48, 58, + 55, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 98,111,114,110, 32, + 116,111, 32,102,105,103,104,116, 13, 10, 98,111,114,110,116,111,102,105, + 58, 13, 10, 48, 58, 49, 54, 54, 58, 56, 98, 58, 53, 48, 58, 48, 98, 13, + 10, 13, 10,115, 97,110,100,115, 99,114,112, 58, 13, 10,115, 97,110,100, + 115, 99,114,112, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, 97,110, + 100, 32, 83, 99,111,114,112,105,111,110, 32, 40,115,101,116, 32, 50, 41, + 13, 10,115, 97,110,100,115, 99,114,112, 98, 58, 13, 10, 48, 58, 55, 48, + 50, 48, 49, 52, 58, 53, 48, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 55, + 48, 48, 48, 52, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 97,114, 97, 98,105, 97,110, 32, 40,102, + 105,120,101,100, 41, 13, 10, 97,114, 97, 98,105, 97,110, 58, 13, 10, 97, + 114, 97, 98,105, 97,110, 97, 58, 13, 10, 48, 58,100, 51, 56, 52, 58, 51, + 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 51, 98,100, 58, 49, 58, + 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, - 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99, - 111,114,101, 95,118, 48, 46, 57, 56, 32, 97,100,100,105,116,105,111,110, - 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, - 114, 32, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, 32, 32, 32,108, + 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104, + 105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 56, 32, 97,100,100, + 105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32, + 108,101,101,122,101,114, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 71,117, - 110, 32, 77, 97,115,116,101,114, 10,103,117,110,109, 97,115,116, 58, 10, - 48, 58, 56, 48,101, 51, 48, 56, 58, 52, 98, 58, 48, 48, 58, 97,101, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 84,101,110,107,111,109,111,114,105, 32, - 83,104,111,111,116,105,110,103, 32, 40, 84, 75, 77, 50, 47, 86, 69, 82, - 46, 65, 49, 41, 10,116,101,110,107,111,109,111,114, 58, 10,116,101,110, - 107,111,109,111,114,106, 58, 10, 48, 58, 51,102,100, 54, 48, 58, 99, 55, - 58, 50, 48, 58, 50,100, 10, 10, 59, 42, 42, 42, 42, 42, 42,115,108,105, - 112,115,116,114,101, 97,109, 10,115,108,105,112,115,116,114,109, 58, 10, - 115,108,105,112,115,116,114,109,104, 58, 10, 48, 58, 50, 48, 57, 53,101, - 49, 58, 52,101, 51, 58, 54, 48, 58, 52,100, 10, 48, 58, 50, 48, 51, 55, - 99,102, 58, 53, 99, 58, 48, 49, 58, 52,100, 10, 10,109,101, 99,104, 97, - 116,116, 58, 10,109,101, 99,104, 97,116,116,117, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 77,101, 99,104, 97,110,105,122,101,100, 32, 65,116,116, - 97, 99,107, 32, 40, 85, 83, 41, 10,109,101, 99,104, 97,116,116,106, 58, - 10, 48, 58, 55,102, 57, 52, 51, 58, 51, 58, 48, 50, 58, 53, 52, 10, 48, - 58, 55,102, 57, 98, 98, 58, 57, 57, 58, 48, 50, 58, 49, 52, 10, 10,109, - 101, 99,104, 97,116,116,117, 49, 58, 10, 48, 58, 55,102, 57, 52, 51, 58, - 51, 58, 48, 48, 58, 49, 53, 10, 48, 58, 55,102, 57, 98, 98, 58, 57, 57, - 58, 48, 48, 58, 50,101, 10, 10,109,101,116,114,111, 99,114,115, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 45, 99,114,111,115, - 115, 32, 40,115,101,116, 32, 49, 41, 10,109,101,116,114,111, 99,114,115, - 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 45, 99, - 114,111,115,115, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58, 49, 52, 55, - 49, 58, 55, 98, 58, 50, 98, 58, 48,101, 10, 48, 58, 49, 52, 50, 51, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 56, 54, 99, 58, 55, 58, 50, - 100, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 97, 99,116,105,111, - 110, 32,104,111,108,108,121,119,111,111,100, 10, 97, 99,116,105,111,110, - 104,119, 58, 10, 48, 58,102,102, 53, 97, 50, 97, 58, 50, 56, 58, 52, 97, - 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 65,110,105,109, 97,108, - 97,110,100,105, 97, 32, 74,114, 46, 10, 97,110,105,109, 97,108,106,114, - 58, 10, 48, 58, 54, 55, 97, 51, 58, 97, 58, 48, 48, 58, 50, 50, 10, 48, - 58, 54, 98, 54, 51, 58, 49, 58, 48, 56, 58, 48, 56, 10, 10,102,105,110, - 97,108, 97,112, 50, 58, 10,102,105,110, 97,108,112, 50,106, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,102,105,110, 97,108, 32,108, 97,112, 32, 50, - 32, 40,106, 97,112, 97,110, 41, 10, 48, 58, 49, 48, 54, 48, 48, 48, 58, - 100, 48, 58, 53, 48, 58, 48, 49, 10, 10,102,105,110, 97,108, 97,112, 51, - 58, 10,102,105,110, 97,108,112, 51,106, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 70,105,110, 97,108, 32, 76, 97,112, 32, 51, 32, 40, 74, 97,112, - 97,110, 41, 10, 48, 58, 49, 48, 54, 48, 48, 48, 58,100, 48, 58, 52,100, - 58, 49, 57, 10, 10,101, 97,103,108,115,104,111,116, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42,101, 97,103,108,101, 32,115,104,111,116, 32,103,111, - 108,102, 10,101, 97,103,108,115,104,116, 97, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,101, 97,103,108,101, 32,115,104,111,116, 32,103,111,108,102, - 32, 40, 97,108,116, 41, 10, 48, 58, 50, 48, 58, 54, 50, 58, 52, 56, 58, - 49, 56, 10, 10,114,100,102,116, 58, 10,114,100,102,116, 97,117, 58, 10, - 114,100,102,116,106, 58, 32, 32, 10,114,100,102,116, 97,100,105, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 82, 97,105,100,101,110, 32, 70,105,103, - 104,116,101,114,115, 32, 40, 68,114,101, 97,109, 32, 73,115,108, 97,110, - 100, 32, 67,111, 46, 32,108,105, 99,101,110,115,101, 41, 10,114,100,102, - 116,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82, 97,105,100,101,110, - 32, 70,105,103,104,116,101,114,115, 32, 40, 85, 83, 41, 10,114,100,102, - 116, 97, 58, 10,114,100,102,116,100,105, 58, 10,114,100,102,116,105,116, - 58, 10,114,100,102,116,115, 58, 10,114,100,102,116, 97,117,103,101, 58, - 10,114,100,102,116,106, 97, 58, 10,114,100,102,116,106, 98, 58, 10, 48, - 58, 50, 57, 98, 99, 49, 58, 97, 97, 58, 52, 48, 58, 52,102, 10, 10,109, - 114,107,111,117,103, 97,114, 58, 10,109,114,107,111,117,103, 98, 58, 10, - 109,114,107,111,117,103, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 77,114, 46, 32, 75,111,117,103, 97,114, 32, 40, 98,111,111,116,108,101, - 103, 32, 83,101,116, 32, 50, 41, 10,109,114,107,111,117,103, 97,114, 50, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,114, 46,107,111,117,103, 97, - 114, 32, 40,101, 97,114,108,105,101,114, 41, 10, 48, 58, 52, 48, 97, 54, - 58, 49, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 97, 54, 49, 58, 49, - 58, 49, 48, 58, 49, 48, 10, 48, 58, 52, 97, 52, 49, 58, 49, 58, 49, 48, - 58, 49, 48, 10, 48, 58, 52, 97, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, - 10, 48, 58, 52, 97, 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, - 52, 57,101, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 52, 57, 99, - 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10,108, 97,100,121, 98,117,103, - 58, 10,108, 97,100,121, 98,117,103, 98, 58, 10,108, 97,100,121, 98,103, - 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 76, 97,100,121, 32, 66, - 117,103, 32, 40, 98,111,111,116,108,101,103, 32, 83,101,116, 32, 50, 41, - 10, 48, 58, 54, 48, 55, 51, 58, 49, 98, 58, 48, 49, 58, 48, 48, 10, 48, - 58,100, 51, 56, 48, 58, 55, 53, 58,102,102, 58,102,102, 10, 10,108, 97, - 100,121, 98,117,103,103, 58, 10, 48, 58, 53, 56, 56, 52, 58, 54, 52, 58, - 48, 49, 58, 52, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42,110, 45,115,117, - 98, 32, 40,117,112,114,105,103,104,116, 41, 10,110,115,117, 98, 58, 10, - 48, 58, 56, 51, 57, 55, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 70, 97,108, 99,111,110, 32, 40, 98,111,111,116,108, - 101,103, 32,115,101,116, 32, 50, 41, 10,102, 97,108, 99,111,110, 97, 58, - 10, 48, 58, 52, 51, 56, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 52, 49, 52, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 54, - 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 56, 48, 58, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 52, 49, 97, 48, 58, 49, 58, 50, 48, - 58, 50, 48, 10, 48, 58, 52, 49, 99, 48, 58, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 52, 49,101, 48, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 97, 46,100, 46, 32, 50, 48, 56, 51, 10, 97,100, - 50, 48, 56, 51, 58, 10, 48, 58, 52, 54, 48, 48, 58, 54, 52, 58, 48, 97, - 58, 48, 52, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 54, - 10, 10,119,101,108,108,116,114,105,115, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,119,101,108,108,116,114,105,115, 32, 40,119,111,114,108,100, 63, - 44, 50, 32,112,108, 97,121,101,114,115, 41, 10,119,101,108,108,116,114, - 105,115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,119,101,108,108,116, - 114,105,115, 32, 40,106, 97,112, 97,110, 44, 50, 32,112,108, 97,121,101, - 114,115, 41, 10, 48, 58,102,102, 98, 54, 49, 99, 58, 53, 48, 58, 48, 99, - 58, 48, 48, 32, 10, 10,109,115,104,117,116,116,108,101, 58, 10,109,115, - 104,117,116,116,108,101,106, 58, 10,109,115,104,117,116,116,108,101,106, - 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 32, 77,111,111,110, 32, 83, - 104,117,116,116,108,101, 32, 40, 74, 97,112, 97,110, 32,115,101,116, 32, - 50, 41, 10,109,115,104,117,116,116,108,101, 50, 58, 10, 48, 58, 56, 48, - 56, 97, 58, 53, 56, 58, 48, 48, 58, 50, 52, 10, 10,119,101,120,112,114, - 101,115,115, 58, 10,119,101,120,112,114,101,115,115, 98, 58, 10,119,101, - 120,112,114,101,115,115, 98, 50, 58, 10,119,101,120,112,114,101,115,115, - 98, 51, 58, 10,119,101,120,112,114,101,115,115, 98, 49, 58, 10, 48, 58, - 48, 50, 52, 53, 58, 51, 58, 49, 53, 58, 48, 48, 10, 48, 58, 48, 50, 52, - 48, 58, 53, 48, 58, 50, 48, 58, 48, 48, 10, 10,101,120,112,114,114, 97, - 105,100, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,120,112,114,101, - 115,115, 32, 82, 97,105,100,101,114, 32, 40, 85, 83, 32,115,101,116, 32, - 50, 41, 10,101,120,112,114,114, 97,105,100,105, 58, 10, 48, 58, 48, 50, - 52, 48, 58, 53, 48, 58, 50, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,101,120,112,114,114, 97,105,100, 46, 99, 10,101,120,112, - 114,114, 97,105,100, 58, 10,101,120,112,114,114, 97,105,100,117, 58, 10, - 48, 58, 48, 53,102,100, 58, 51, 58, 49, 53, 58, 48, 48, 10, 48, 58, 48, - 50, 52, 48, 58, 53, 48, 58, 50, 48, 58, 48, 48, 10, 10,121,111,115, 97, - 107,100,111,110, 58, 10,121,111,115, 97,107,100,111,110, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,121,111,107, 97,115,117, 32,116,111, 32,100, - 111,110, 98,101,105, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58, 50, 51, - 97, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 89,101,108,108,111,119, 32, 67, 97, 98, 32, 40, 98,111,111,116, - 108,101,103, 41, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 71,117,110, 32, 77, 97,115,116,101,114, 13, 10, + 103,117,110,109, 97,115,116, 58, 13, 10, 48, 58, 56, 48,101, 51, 48, 56, + 58, 52, 98, 58, 48, 48, 58, 97,101, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 84,101,110,107,111,109,111,114,105, 32, 83,104,111,111,116,105, + 110,103, 32, 40, 84, 75, 77, 50, 47, 86, 69, 82, 46, 65, 49, 41, 13, 10, + 116,101,110,107,111,109,111,114, 58, 13, 10,116,101,110,107,111,109,111, + 114,106, 58, 13, 10, 48, 58, 51,102,100, 54, 48, 58, 99, 55, 58, 50, 48, + 58, 50,100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,115,108,105,112, + 115,116,114,101, 97,109, 13, 10,115,108,105,112,115,116,114,109, 58, 13, + 10,115,108,105,112,115,116,114,109,104, 58, 13, 10, 48, 58, 50, 48, 57, + 53,101, 49, 58, 52,101, 51, 58, 54, 48, 58, 52,100, 13, 10, 48, 58, 50, + 48, 51, 55, 99,102, 58, 53, 99, 58, 48, 49, 58, 52,100, 13, 10, 13, 10, + 109,101, 99,104, 97,116,116, 58, 13, 10,109,101, 99,104, 97,116,116,117, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 77,101, 99,104, 97,110,105,122, + 101,100, 32, 65,116,116, 97, 99,107, 32, 40, 85, 83, 41, 13, 10,109,101, + 99,104, 97,116,116,106, 58, 13, 10, 48, 58, 55,102, 57, 52, 51, 58, 51, + 58, 48, 50, 58, 53, 52, 13, 10, 48, 58, 55,102, 57, 98, 98, 58, 57, 57, + 58, 48, 50, 58, 49, 52, 13, 10, 13, 10,109,101, 99,104, 97,116,116,117, + 49, 58, 13, 10, 48, 58, 55,102, 57, 52, 51, 58, 51, 58, 48, 48, 58, 49, + 53, 13, 10, 48, 58, 55,102, 57, 98, 98, 58, 57, 57, 58, 48, 48, 58, 50, + 101, 13, 10, 13, 10,109,101,116,114,111, 99,114,115, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42,109,101,116,114,111, 45, 99,114,111,115,115, 32, 40, + 115,101,116, 32, 49, 41, 13, 10,109,101,116,114,111, 99,114,115, 97, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 45, 99,114,111, + 115,115, 32, 40,115,101,116, 32, 50, 41, 13, 10, 48, 58, 49, 52, 55, 49, + 58, 55, 98, 58, 50, 98, 58, 48,101, 13, 10, 48, 58, 49, 52, 50, 51, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 56, 54, 99, 58, 55, 58, + 50,100, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 97, 99, + 116,105,111,110, 32,104,111,108,108,121,119,111,111,100, 13, 10, 97, 99, + 116,105,111,110,104,119, 58, 13, 10, 48, 58,102,102, 53, 97, 50, 97, 58, + 50, 56, 58, 52, 97, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 65,110,105,109, 97,108, 97,110,100,105, 97, 32, 74,114, 46, 13, 10, + 97,110,105,109, 97,108,106,114, 58, 13, 10, 48, 58, 54, 55, 97, 51, 58, + 97, 58, 48, 48, 58, 50, 50, 13, 10, 48, 58, 54, 98, 54, 51, 58, 49, 58, + 48, 56, 58, 48, 56, 13, 10, 13, 10,102,105,110, 97,108, 97,112, 50, 58, + 13, 10,102,105,110, 97,108,112, 50,106, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42,102,105,110, 97,108, 32,108, 97,112, 32, 50, 32, 40,106, 97,112, + 97,110, 41, 13, 10, 48, 58, 49, 48, 54, 48, 48, 48, 58,100, 48, 58, 53, + 48, 58, 48, 49, 13, 10, 13, 10,102,105,110, 97,108, 97,112, 51, 58, 13, + 10,102,105,110, 97,108,112, 51,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 70,105,110, 97,108, 32, 76, 97,112, 32, 51, 32, 40, 74, 97,112, 97, + 110, 41, 13, 10, 48, 58, 49, 48, 54, 48, 48, 48, 58,100, 48, 58, 52,100, + 58, 49, 57, 13, 10, 13, 10,101, 97,103,108,115,104,111,116, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42,101, 97,103,108,101, 32,115,104,111,116, 32, + 103,111,108,102, 13, 10,101, 97,103,108,115,104,116, 97, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,101, 97,103,108,101, 32,115,104,111,116, 32,103, + 111,108,102, 32, 40, 97,108,116, 41, 13, 10, 48, 58, 50, 48, 58, 54, 50, + 58, 52, 56, 58, 49, 56, 13, 10, 13, 10,114,100,102,116, 58, 13, 10,114, + 100,102,116, 97,117, 58, 13, 10,114,100,102,116,106, 58, 13, 10,114,100, + 102,116, 97,100,105, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82, 97,105, + 100,101,110, 32, 70,105,103,104,116,101,114,115, 32, 40, 68,114,101, 97, + 109, 32, 73,115,108, 97,110,100, 32, 67,111, 46, 32,108,105, 99,101,110, + 115,101, 41, 13, 10,114,100,102,116,117, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 82, 97,105,100,101,110, 32, 70,105,103,104,116,101,114,115, 32, + 40, 85, 83, 41, 13, 10,114,100,102,116, 97, 58, 13, 10,114,100,102,116, + 100,105, 58, 13, 10,114,100,102,116,105,116, 58, 13, 10,114,100,102,116, + 115, 58, 13, 10,114,100,102,116, 97,117,103,101, 58, 13, 10,114,100,102, + 116,106, 97, 58, 13, 10,114,100,102,116,106, 98, 58, 13, 10, 48, 58, 50, + 57, 98, 99, 49, 58, 97, 97, 58, 52, 48, 58, 52,102, 13, 10, 13, 10,109, + 114,107,111,117,103, 97,114, 58, 13, 10,109,114,107,111,117,103, 98, 58, + 13, 10,109,114,107,111,117,103, 98, 50, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 77,114, 46, 32, 75,111,117,103, 97,114, 32, 40, 98,111,111,116, + 108,101,103, 32, 83,101,116, 32, 50, 41, 13, 10,109,114,107,111,117,103, + 97,114, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,114, 46,107,111, + 117,103, 97,114, 32, 40,101, 97,114,108,105,101,114, 41, 13, 10, 48, 58, + 52, 48, 97, 54, 58, 49, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, + 97, 54, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 97, 52, + 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 97, 50, 49, 58, + 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 97, 48, 49, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 57,101, 49, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 48, 58, 52, 57, 99, 49, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 13, 10,108, 97,100,121, 98,117,103, 58, 13, 10,108, 97,100, + 121, 98,117,103, 98, 58, 13, 10,108, 97,100,121, 98,103, 98, 50, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 76, 97,100,121, 32, 66,117,103, 32, 40, + 98,111,111,116,108,101,103, 32, 83,101,116, 32, 50, 41, 13, 10, 48, 58, + 54, 48, 55, 51, 58, 49, 98, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58,100, + 51, 56, 48, 58, 55, 53, 58,102,102, 58,102,102, 13, 10, 13, 10,108, 97, + 100,121, 98,117,103,103, 58, 13, 10, 48, 58, 53, 56, 56, 52, 58, 54, 52, + 58, 48, 49, 58, 52, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,110, + 45,115,117, 98, 32, 40,117,112,114,105,103,104,116, 41, 13, 10,110,115, + 117, 98, 58, 13, 10, 48, 58, 56, 51, 57, 55, 58, 50, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 70, 97,108, 99,111,110, + 32, 40, 98,111,111,116,108,101,103, 32,115,101,116, 32, 50, 41, 13, 10, + 102, 97,108, 99,111,110, 97, 58, 13, 10, 48, 58, 52, 51, 56, 57, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 49, 52, 48, 58, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 48, 58, 52, 49, 54, 48, 58, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 52, 49, 56, 48, 58, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 52, 49, 97, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 52, 49, 99, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 52, 49,101, 48, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 97, 46,100, 46, 32, 50, 48, 56, 51, 13, 10, 97,100, + 50, 48, 56, 51, 58, 13, 10, 48, 58, 52, 54, 48, 48, 58, 54, 52, 58, 48, + 97, 58, 48, 52, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, + 48, 54, 13, 10, 13, 10,119,101,108,108,116,114,105,115, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,119,101,108,108,116,114,105,115, 32, 40,119,111, + 114,108,100, 63, 44, 50, 32,112,108, 97,121,101,114,115, 41, 13, 10,119, + 101,108,108,116,114,105,115,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 119,101,108,108,116,114,105,115, 32, 40,106, 97,112, 97,110, 44, 50, 32, + 112,108, 97,121,101,114,115, 41, 13, 10, 48, 58,102,102, 98, 54, 49, 99, + 58, 53, 48, 58, 48, 99, 58, 48, 48, 13, 10, 13, 10,109,115,104,117,116, + 116,108,101, 58, 13, 10,109,115,104,117,116,116,108,101,106, 58, 13, 10, + 109,115,104,117,116,116,108,101,106, 50, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42, 32, 77,111,111,110, 32, 83,104,117,116,116,108,101, 32, 40, 74, + 97,112, 97,110, 32,115,101,116, 32, 50, 41, 13, 10,109,115,104,117,116, + 116,108,101, 50, 58, 13, 10, 48, 58, 56, 48, 56, 97, 58, 53, 56, 58, 48, + 48, 58, 50, 52, 13, 10, 13, 10,119,101,120,112,114,101,115,115, 58, 13, + 10,119,101,120,112,114,101,115,115, 98, 58, 13, 10,119,101,120,112,114, + 101,115,115, 98, 50, 58, 13, 10,119,101,120,112,114,101,115,115, 98, 51, + 58, 13, 10,119,101,120,112,114,101,115,115, 98, 49, 58, 13, 10, 48, 58, + 48, 50, 52, 53, 58, 51, 58, 49, 53, 58, 48, 48, 13, 10, 48, 58, 48, 50, + 52, 48, 58, 53, 48, 58, 50, 48, 58, 48, 48, 13, 10, 13, 10,101,120,112, + 114,114, 97,105,100, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 69,120, + 112,114,101,115,115, 32, 82, 97,105,100,101,114, 32, 40, 85, 83, 32,115, + 101,116, 32, 50, 41, 13, 10,101,120,112,114,114, 97,105,100,105, 58, 13, + 10, 48, 58, 48, 50, 52, 48, 58, 53, 48, 58, 50, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,101,120,112,114,114, 97,105, + 100, 46, 99, 13, 10,101,120,112,114,114, 97,105,100, 58, 13, 10,101,120, + 112,114,114, 97,105,100,117, 58, 13, 10, 48, 58, 48, 53,102,100, 58, 51, + 58, 49, 53, 58, 48, 48, 13, 10, 48, 58, 48, 50, 52, 48, 58, 53, 48, 58, + 50, 48, 58, 48, 48, 13, 10, 13, 10,121,111,115, 97,107,100,111,110, 58, + 13, 10,121,111,115, 97,107,100,111,110, 97, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,121,111,107, 97,115,117, 32,116,111, 32,100,111,110, 98,101, + 105, 32, 40,115,101,116, 32, 50, 41, 13, 10, 48, 58, 50, 51, 97, 98, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 89,101,108,108,111,119, 32, 67, 97, 98, 32, 40, 98,111,111,116,108, + 101,103, 41, 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32, 101,120,105,116, 32,116,104,105,115, 32,103, 97,109,101, 32,119,104,101, 110, 32,101,105,116,104,101,114, 32,116,104,101, 32,109, 97,105,110, 32, 116,105,116,108,101, 32,112, 97,103,101, 32,105,115, 32,115,104,111,119, - 105,110,103, 32, 42, 42, 10, 59, 42, 42, 32, 40,116,104,101, 32,115, 99, - 114,101,101,110, 32,119,105,116,104, 32,116,104,101, 32,103, 97,109,101, - 32,110, 97,109,101, 32, 97,110,100, 32, 99,111,112,121,114,105,103,104, - 116, 32,100,105,115,112,108, 97,121,105,110,103, 41, 32,111,114, 32,119, - 104,101,110, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32, 42, 42, - 10, 59, 42, 42, 32,105,115, 32, 98,101,105,110,103, 32,100,105,115,112, - 108, 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109, - 111,100,101, 44, 32,111,114, 32,116,104,101, 32,115, 97,118,101, 32,119, - 105,108,108, 32,110,111,116, 32,119,111,114,107, 32, 42, 42, 10,107, 97, - 109,105,107, 99, 97, 98, 58, 10,121,101,108,108,111,119, 99, 98, 58, 10, - 121,101,108,108,111,119, 99,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 89,101,108,108,111,119, 32, 67, 97, 98, 32, 40, 74, 97,112, 97,110, 41, - 10, 48, 58, 54, 51, 54, 98, 58, 55, 99, 58, 48, 48, 58, 50, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42,104,121,112,101,114, 32, 99,114, 97,115,104, - 32, 40,118,101,114,115,105,111,110, 32,100, 41, 10,104, 99,114, 97,115, - 104, 58, 10,104, 99,114, 97,115,104, 99, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 72,121,112,101,114, 32, 67,114, 97,115,104, 32, 40,118,101,114, - 115,105,111,110, 32, 67, 41, 10, 48, 58, 56, 49, 57, 48, 48, 58, 97, 99, - 53, 58, 48, 48, 58, 49, 48, 10, 48, 58, 56, 48,101, 56, 56, 58, 52, 58, - 48, 48, 58, 55, 48, 10, 48, 58, 56, 48,101, 57, 52, 58, 52, 58, 48, 48, - 58, 55, 48, 10, 48, 58, 56, 48, 99, 54, 52, 58, 49, 58, 50, 48, 58, 50, - 48, 10, 10,103, 97,105, 97,112,111,108,115, 58, 10,103, 97,105, 97,112, - 111,108,115,106, 58, 32, 32, 10,103, 97,105, 97,112,111,108,115,117, 58, - 10, 48, 58, 54, 48,102, 56, 48, 49, 58, 57, 57, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 54, 48,102, 56, 57, 54, 58, 49, 58, 50, 57, 58, 50, 57, 10, - 10, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,112,111,115,105, - 116,105,111,110, 32, 40,106, 97,112, 97,110, 41, 10,115,112, 99,112,111, - 115,116,110, 58, 10, 48, 58, 99, 48, 48, 48, 58, 49, 55, 50, 58, 48, 48, - 58, 48, 50, 10, 48, 58, 99,102,101, 57, 58, 54, 52, 58,102,102, 58,102, - 102, 10, 10, 59, 42, 42, 42, 42, 42, 42,103, 97,114,100,105, 97, 10,103, - 97,114,100,105, 97, 58, 10,103, 97,114,100,105, 97, 98, 58, 10,103, 97, - 114,100,105, 97,106, 58, 10, 48, 58,100, 51, 48, 48, 58, 53, 48, 58, 48, - 48, 58, 52, 97, 10, 48, 58, 99, 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, - 50, 10, 10,114,100,102,116, 50, 50,107, 99, 58, 10,114,100,102,116, 50, - 97, 58, 32, 32, 10,114,100,102,116, 50, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 82, 97,105,100,101,110, 32, 70,105,103,104,116,101,114,115, 32, - 50, 32, 10,114,100,102,116, 50,106, 58, 32, 10,114,100,102,116, 50, 97, - 50, 58, 10,114,100,102,116, 50,117,115, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,114, 97,105,100,101,110, 32,102,105,103,104,116,101,114,115, 32, - 50, 46, 49, 32, 40,117,115, 44, 32,115,105,110,103,108,101, 32, 98,111, - 97,114,100, 41, 10,114,100,102,116, 50,106, 50, 58, 10,114,100,102,116, - 50,116, 58, 10,114,100,102,116, 50,117, 58, 10,114,100,102,116, 50, 97, - 97, 58, 10,114,100,102,116, 50,106, 97, 58, 10, 48, 58, 50, 56, 53,100, - 99, 58, 49, 97, 98, 58, 48, 49, 58, 50,101, 10, 10, 98,114,105,118, 97, - 108, 58, 10, 98,114,105,118, 97,108,106, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 42, 40, 98,117,114,110,105,110,103, 32,114,105,118, 97,108, 32, - 40,106, 97,112, 97,110, 41, 10, 48, 58, 50, 48, 56, 51, 48, 48, 58, 52, - 97, 58, 52, 50, 58, 48, 52, 10, 10,107,105,107, 99,117, 98,105, 99, 58, - 10,107,105,107, 99,117, 98,105, 99, 98, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 75,105, 99,107,108,101, 32, 67,117, 98,101,108,101, 10, 48, 58, - 102,101, 51, 48, 58, 99, 56, 58, 48, 55, 58, 48, 52, 10, 48, 58,102,101, - 102, 56, 58, 51, 58, 48, 55, 58, 51, 53, 10, 10, 59, 42, 42, 42, 42, 42, + 105,110,103, 32, 42, 42, 13, 10, 59, 42, 42, 32, 40,116,104,101, 32,115, + 99,114,101,101,110, 32,119,105,116,104, 32,116,104,101, 32,103, 97,109, + 101, 32,110, 97,109,101, 32, 97,110,100, 32, 99,111,112,121,114,105,103, + 104,116, 32,100,105,115,112,108, 97,121,105,110,103, 41, 32,111,114, 32, + 119,104,101,110, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32, 42, + 42, 13, 10, 59, 42, 42, 32,105,115, 32, 98,101,105,110,103, 32,100,105, + 115,112,108, 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, + 32,109,111,100,101, 44, 32,111,114, 32,116,104,101, 32,115, 97,118,101, + 32,119,105,108,108, 32,110,111,116, 32,119,111,114,107, 32, 42, 42, 13, + 10,107, 97,109,105,107, 99, 97, 98, 58, 13, 10,121,101,108,108,111,119, + 99, 98, 58, 13, 10,121,101,108,108,111,119, 99,106, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 89,101,108,108,111,119, 32, 67, 97, 98, 32, 40, 74, + 97,112, 97,110, 41, 13, 10, 48, 58, 54, 51, 54, 98, 58, 55, 99, 58, 48, + 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,104,121,112, + 101,114, 32, 99,114, 97,115,104, 32, 40,118,101,114,115,105,111,110, 32, + 100, 41, 13, 10,104, 99,114, 97,115,104, 58, 13, 10,104, 99,114, 97,115, + 104, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,121,112,101,114, 32, + 67,114, 97,115,104, 32, 40,118,101,114,115,105,111,110, 32, 67, 41, 13, + 10, 48, 58, 56, 49, 57, 48, 48, 58, 97, 99, 53, 58, 48, 48, 58, 49, 48, + 13, 10, 48, 58, 56, 48,101, 56, 56, 58, 52, 58, 48, 48, 58, 55, 48, 13, + 10, 48, 58, 56, 48,101, 57, 52, 58, 52, 58, 48, 48, 58, 55, 48, 13, 10, + 48, 58, 56, 48, 99, 54, 52, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, + 10,103, 97,105, 97,112,111,108,115, 58, 13, 10,103, 97,105, 97,112,111, + 108,115,106, 58, 13, 10,103, 97,105, 97,112,111,108,115,117, 58, 13, 10, + 48, 58, 54, 48,102, 56, 48, 49, 58, 57, 57, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 54, 48,102, 56, 57, 54, 58, 49, 58, 50, 57, 58, 50, 57, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,112,111, + 115,105,116,105,111,110, 32, 40,106, 97,112, 97,110, 41, 13, 10,115,112, + 99,112,111,115,116,110, 58, 13, 10, 48, 58, 99, 48, 48, 48, 58, 49, 55, + 50, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58, 99,102,101, 57, 58, 54, 52, + 58,102,102, 58,102,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,103, + 97,114,100,105, 97, 13, 10,103, 97,114,100,105, 97, 58, 13, 10,103, 97, + 114,100,105, 97, 98, 58, 13, 10,103, 97,114,100,105, 97,106, 58, 13, 10, + 48, 58,100, 51, 48, 48, 58, 53, 48, 58, 48, 48, 58, 52, 97, 13, 10, 48, + 58, 99, 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10,114, + 100,102,116, 50, 50,107, 99, 58, 13, 10,114,100,102,116, 50, 97, 58, 13, + 10,114,100,102,116, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82, 97, + 105,100,101,110, 32, 70,105,103,104,116,101,114,115, 32, 50, 32, 13, 10, + 114,100,102,116, 50,106, 58, 13, 10,114,100,102,116, 50, 97, 50, 58, 13, + 10,114,100,102,116, 50,117,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 114, 97,105,100,101,110, 32,102,105,103,104,116,101,114,115, 32, 50, 46, + 49, 32, 40,117,115, 44, 32,115,105,110,103,108,101, 32, 98,111, 97,114, + 100, 41, 13, 10,114,100,102,116, 50,106, 50, 58, 13, 10,114,100,102,116, + 50,116, 58, 13, 10,114,100,102,116, 50,117, 58, 13, 10,114,100,102,116, + 50, 97, 97, 58, 13, 10,114,100,102,116, 50,106, 97, 58, 13, 10, 48, 58, + 50, 56, 53,100, 99, 58, 49, 97, 98, 58, 48, 49, 58, 50,101, 13, 10, 13, + 10, 98,114,105,118, 97,108, 58, 13, 10, 98,114,105,118, 97,108,106, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 42, 40, 98,117,114,110,105,110,103, + 32,114,105,118, 97,108, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58, + 50, 48, 56, 51, 48, 48, 58, 52, 97, 58, 52, 50, 58, 48, 52, 13, 10, 13, + 10,107,105,107, 99,117, 98,105, 99, 58, 13, 10,107,105,107, 99,117, 98, + 105, 99, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75,105, 99,107,108, + 101, 32, 67,117, 98,101,108,101, 13, 10, 48, 58,102,101, 51, 48, 58, 99, + 56, 58, 48, 55, 58, 48, 52, 13, 10, 48, 58,102,101,102, 56, 58, 51, 58, + 48, 55, 58, 51, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, - 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, - 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 54, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, 32, 32, 32,108, + 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104, + 105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 54, 32, 97,100,100, + 105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32, + 108,101,101,122,101,114, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 83, 99,104,109,101,105,115,101,114, 32, 82,111, 98, - 111, 32, 40,106, 97,112, 97,110, 41, 10,115, 99,104,109,101,105,115,114, - 58, 10, 48, 58,102,102, 53, 97, 50, 48, 58, 55, 57, 58, 48, 48, 58, 52, - 99, 10, 10, 59, 42, 42, 42, 42, 42, 42,106,111,105,110,101,109, 10,106, - 111,105,110,101,109, 58, 10, 48, 58, 56, 98, 97,100, 58, 53, 97, 58, 48, - 48, 58, 52, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 99, 97,108,111,114, - 105,101, 32,107,117,110, 32,118,115, 32,109,111,103,117,114, 97,110,105, - 97,110, 10, 99, 97,108,111,114,105,101, 58, 10, 99, 97,108,111,114,105, - 101, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 99, 97,108,111,114,105, - 101, 32,107,117,110, 32,118,115, 32,109,111,103,117,114, 97,110,105, 97, - 110, 32, 40, 98,111,111,116,108,101,103, 41, 10, 48, 58, 99,100, 49, 49, - 58, 55, 56, 58, 48, 48, 58, 52, 57, 10, 48, 58, 99, 52, 49, 56, 58, 51, - 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 80, 97, 99, - 104,105,110,107,111, 32, 83,101,120,121, 32, 82,101, 97, 99,116,105,111, - 110, 32, 50, 32, 40, 74, 97,112, 97,110, 41, 10,115,120,121,114,101, 97, - 99, 50, 58, 10, 48, 58, 55, 53, 53, 48, 58, 97, 51, 58, 52, 99, 58, 52, - 99, 10, 10,115,117,114,118, 97,114,116,115, 58, 32, 32, 10,115,117,114, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 83, 99,104,109,101,105,115,101,114, 32, 82,111, + 98,111, 32, 40,106, 97,112, 97,110, 41, 13, 10,115, 99,104,109,101,105, + 115,114, 58, 13, 10, 48, 58,102,102, 53, 97, 50, 48, 58, 55, 57, 58, 48, + 48, 58, 52, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,106,111,105, + 110,101,109, 13, 10,106,111,105,110,101,109, 58, 13, 10, 48, 58, 56, 98, + 97,100, 58, 53, 97, 58, 48, 48, 58, 52, 51, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 99, 97,108,111,114,105,101, 32,107,117,110, 32,118,115, + 32,109,111,103,117,114, 97,110,105, 97,110, 13, 10, 99, 97,108,111,114, + 105,101, 58, 13, 10, 99, 97,108,111,114,105,101, 98, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 99, 97,108,111,114,105,101, 32,107,117,110, 32,118, + 115, 32,109,111,103,117,114, 97,110,105, 97,110, 32, 40, 98,111,111,116, + 108,101,103, 41, 13, 10, 48, 58, 99,100, 49, 49, 58, 55, 56, 58, 48, 48, + 58, 52, 57, 13, 10, 48, 58, 99, 52, 49, 56, 58, 51, 58, 48, 48, 58, 48, + 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 80, 97, 99,104,105,110, + 107,111, 32, 83,101,120,121, 32, 82,101, 97, 99,116,105,111,110, 32, 50, + 32, 40, 74, 97,112, 97,110, 41, 13, 10,115,120,121,114,101, 97, 99, 50, + 58, 13, 10, 48, 58, 55, 53, 53, 48, 58, 97, 51, 58, 52, 99, 58, 52, 99, + 13, 10, 13, 10,115,117,114,118, 97,114,116,115, 58, 13, 10,115,117,114, 118, 97,114,116,115,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,117, - 114,118,105,118, 97,108, 32, 97,114,116,115, 32, 40,117,115, 97, 41, 10, - 48, 58, 49, 49, 97, 53, 58, 50, 54, 58, 48, 48, 58, 52, 53, 32, 10, 48, - 58, 49, 49, 99, 98, 58, 50, 58, 52, 53, 58, 48, 48, 10, 10,105,110,118, - 97,100,101,114,115, 58, 10,101, 97,114,116,104,105,110,118, 58, 10,115, - 112, 97, 99,101, 97,116,116, 58, 10,115,112, 97, 99,101, 97,116, 50, 58, - 10,115,105,110,118,101,109, 97,103, 58, 10,115,105,116,118, 58, 10,115, - 105, 99,118, 58, 10,115,105,115,118, 58, 10,115,105,115,118, 49, 58, 10, - 115,105,115,118, 51, 58, 10,115,105,115,118, 50, 58, 10, 97,108,105,101, - 110,105,110,118,112, 50, 58, 10,115,112, 99,101,107,105,110,103, 58, 10, - 115,112, 99,101,119, 97,114,115, 58, 10,115,112, 97, 99,101,119,114, 51, - 58, 10,105,110,118, 97,100,101,114, 52, 58, 32, 32, 10,105,110,118, 97, - 100,114,109,114, 58, 32, 32, 10,105,110,118, 97,115,105,111,110, 58, 10, - 115,101, 97,114,116,104,105,110, 58, 10,115,101, 97,114,116,104,105,110, - 97, 58, 10,115,117,112,101,114,105,110,118, 58, 10,115,105,110,118,122, - 101,110, 58, 10,105,110,118, 97,115,105,111,110, 97, 58, 10,105,110,118, - 97,115,105,111,110, 98, 58, 10,105,110,118, 97,115,105,111,110,114,122, - 58, 10,105,110,118, 97,115,105,111,110,114,122, 97, 58, 10,115,112, 97, - 99,101,114,110,103, 58, 10,117,108,116,114, 97,105,110,118, 58, 10,115, - 112, 97, 99,101, 99,111,109, 58, 10,115,105,116,118,111, 58, 10,115,105, - 116,118, 49, 58, 10,105,110,118, 97,100,101,114,115,101,109, 58, 10,103, - 97,108,109,111,110,115,116, 58, 10,115,112, 97, 99,101, 97,116,116, 50, - 107, 58, 10,115,112, 97, 99,101, 97,116,116, 98,112, 58, 10, 48, 58, 50, - 48,102, 52, 58, 48, 50, 58, 48, 48, 58, 48, 48, 10, 10,115,101, 97,114, - 116,104,105,101, 58, 10, 48, 58, 50, 48,102, 52, 58, 48, 50, 58, 48, 48, - 58, 53, 48, 10, 10, 97,108,105,101,110,105,110,118, 58, 10, 48, 58, 50, - 48,102, 52, 58, 50, 58, 48, 48, 58, 53, 48, 10, 10,105,110,118, 97,100, - 101,114,108, 58, 10, 48, 58, 50, 48, 69, 48, 58, 48, 51, 58, 48, 48, 58, - 48, 48, 10, 10,115,115,112, 97, 99,101, 97,116, 99, 58, 10,115,115,112, - 97, 99,101, 97,116, 58, 10,115,115,112, 97, 99,101, 97,116, 50, 58, 10, - 115,115,112, 97, 99,101, 97,116, 51, 58, 10, 48, 58, 99, 52, 99, 55, 58, - 49, 48, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 67, - 111,115,109,105, 99, 32, 77,111,110,115,116,101,114,115, 32, 50, 10, 99, - 111,115,109,105, 99,109, 50, 58, 10, 99,111,115,109,105, 99,109,111, 58, - 32, 59, 42, 42, 42, 42, 42, 42, 99,111,115,109,105, 99, 32,109,111,110, - 115,116,101,114,115, 32, 40, 42, 41, 32, 10, 48, 58, 50, 48,102, 52, 58, - 48, 51, 58, 48, 48, 58, 48, 48, 10, 10,100, 97,114,116,104,118,100,114, - 58, 10, 48, 58, 49, 99, 48, 56, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, - 106,115,112,101, 99,116,101,114, 58, 10,106,115,112,101, 99,116,101,114, - 50, 58, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 50, 51, 48, 48, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42,100,105,101,116, 32,103,111, 32,103,111, 32, 40,101, - 117,114,111, 32,118, 49, 46, 49, 32, 49, 57, 57, 50, 46, 48, 57, 46, 50, - 54, 41, 10,100,105,101,116,103,111, 58, 10,100,105,101,116,103,111,101, - 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 40,101,117,114,111, 32,118, 49, - 46, 49, 32, 49, 57, 57, 50, 46, 48, 56, 46, 48, 52, 41, 10,100,105,101, - 116,103,111,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 40,106, 97,112, - 97,110, 32,118, 49, 46, 49, 32, 49, 57, 57, 50, 46, 48, 57, 46, 50, 54, - 41, 10,100,105,101,116,103,111,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 40,117,115, 97, 32,118, 49, 46, 49, 32, 49, 57, 57, 50, 46, 48, 57, - 46, 50, 54, 41, 10, 48, 58, 51, 56, 48, 49,102, 56, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 51, 56, 48, 49, 48, 48, 58,101,102, 58, 52, 56, - 58, 53, 48, 10, 48, 58, 51, 56, 48, 49,102, 57, 58, 49, 58, 51, 53, 58, - 51, 53, 10, 10, 97,109, 98,117,115,104,106, 58, 10, 97,109, 98,117,115, - 104, 58, 32, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,109, 98,117,115,104, - 32, 40,116,101, 99,102,114,121, 41, 10, 97,109, 98,117,115,104,118, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,109, 98,117,115,104, 32, 40, 86, - 111,108,116, 32, 69,108,101, 99, 32, 99,111, 45,108,116,100, 41, 10, 97, - 109, 98,117,115,104,104, 58, 10, 48, 58, 56, 48, 53, 48, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 56, 48, 48,102, 58, 50, 52, 58, 48, 48, 58, - 51, 97, 10, 10, 59, 42, 42, 42, 42, 42, 42,103, 45,108,111, 99, 32, 97, - 105,114, 32, 98, 97,116,116,108,101, 32, 40,117,115, 41, 10, 59, 42, 42, - 32,121,111,117, 32,110,101,101,100, 32,116,111, 32,112,114,101,115,115, - 32,102, 51, 32, 97,115, 32,115,111,111,110, 32, 97,115, 32,116,104,105, - 115, 32,103, 97,109,101, 32,115,116, 97,114,116,115, 32, 98,101,102,111, - 114,101, 32,105,116, 32,119,105,108,108, 32,115, 97,118,101, 32, 42, 42, - 10, 59, 42, 42, 32,102,111,114, 32,115,111,109,101, 32,114,101, 97,115, - 111,110, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,100, 97,116, - 97, 32,119,105,108,108, 32,110,111,116, 32,100,105,115,112,108, 97,121, - 32,117,110,116,105,108,108, 32,103, 97,109,101, 32,105,115, 32,114,101, - 115,101,116, 32,119,105,116,104, 32,102, 51, 32, 42, 42, 10, 59, 42, 42, - 32,100,114,105,118,101,114, 32,112,114,111, 98,108,101,109, 32, 63, 63, - 63, 63, 63, 63, 32, 32, 42, 42, 10,103,108,111, 99,117, 58, 10,103,108, - 111, 99, 58, 10, 50, 58, 49,102,102, 97, 48, 48, 58,101,101, 58, 48, 50, - 58, 48, 52, 10, 50, 58, 49,102,102, 97, 52, 97, 58, 49, 58, 53, 48, 58, - 53, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 66,101, 97, 99,104, 32, 70, - 101,115,116,105,118, 97,108, 32, 87,111,114,108,100, 32, 67,104, 97,109, - 112,105,111,110,115,104,105,112, 32, 49, 57, 57, 55, 10,119, 98, 98, 99, - 57, 55, 58, 10, 48, 58, 53, 48, 50, 51,102, 49, 58, 54,100, 58, 48, 48, - 58, 48, 50, 10, 10,111,112,119,111,108,102, 58, 32, 32, 10,111,112,119, - 111,108,102, 98, 58, 10,111,112,119,111,108,102,117, 58, 10,111,112,119, - 111,108,102, 97, 58, 10,111,112,119,111,108,102,106, 58, 32, 32, 10, 48, - 58, 49, 48, 48, 97, 52, 50, 58, 55, 53, 58, 48, 48, 58, 53, 52, 10, 48, - 58, 49, 48, 48,101, 50, 56, 58, 51, 98, 58, 48, 48, 58, 48, 49, 10, 10, - 111,112,119,111,108,102,112, 58, 10, 48, 58, 49, 48, 48, 97, 54, 97, 58, - 55, 53, 58, 48, 48, 58, 53, 52, 10, 48, 58, 49, 48, 48,101, 54, 56, 58, - 51, 55, 58, 48, 56, 58, 48, 49, 10, 10,103,115,119,111,114,100, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 71,114,101, 97,116, 32, 83,119,111,114, - 100,115,109, 97,110, 32, 40, 74, 97,112, 97,110, 63, 41, 10,103,115,119, - 111,114,100, 50, 58, 32, 59, 42, 42, 42, 42, 42, 42, 71,114,101, 97,116, - 32, 83,119,111,114,100,115,109, 97,110, 32, 40,119,111,114,108,100, 63, - 41, 32, 10, 48, 58, 57, 99, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 57, 99, 55, 56, 58, 51, 99, 58, 51, 52, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 70,108,121,105,110,103, 32, 84,105,103,101, - 114, 10,102,108,121,116,105,103,101,114, 58, 10,102,108,121,116,105,103, - 101,114, 97, 58, 10, 48, 58,100, 50, 52, 52, 58, 51, 52, 58, 56, 56, 58, - 52, 56, 10, 48, 58,100, 50, 51, 53, 58, 49, 58, 48, 51, 58, 48, 51, 10, - 10,109, 99, 97,116, 97,100,118, 58, 10, 99, 97,116,116, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 67, 97,116,116, 32, 40, 74, 97,112, 97,110, 41, - 10,109, 99, 97,116, 97,100,118,106, 58, 10, 48, 58, 49, 48, 49, 98,100, - 51, 58, 51, 49, 58, 48, 53, 58, 50, 98, 10, 10, 97,118, 97,108,110, 99, - 104,101, 58, 10, 99, 97,115, 99, 97,100,101, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 67, 97,115, 99, 97,100,101, 32, 10, 48, 58, 48, 48, 57, 98, - 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 65, - 101,114,111, 32, 70,105,103,104,116,101,114,115, 32, 40, 98,111,111,116, - 108,101,103, 41, 10, 97,101,114,102, 98,111,111,116, 58, 10, 97,101,114, - 111,102,103,116, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,101,114, - 111, 32,102,105,103,104,116,101,114,115, 32, 40,116,117,114, 98,111, 32, - 102,111,114, 99,101, 32,104, 97,114,100,119, 97,114,101, 32,115,101,116, - 32, 49, 41, 10, 97,101,114,111,102,103,116, 99, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 97,101,114,111, 32,102,105,103,104,116,101,114,115, 32, - 40,116,117,114, 98,111, 32,102,111,114, 99,101, 32,104, 97,114,100,119, - 97,114,101, 32,115,101,116, 32, 50, 41, 10, 97,101,114,102, 98,111,111, - 50, 58, 10, 48, 58, 99, 99, 49, 97,102, 58, 57, 55, 58, 48, 98, 58, 54, - 52, 10, 10,116,114,105,111,116,104,101,112,106, 58, 10,116,114,105,111, + 114,118,105,118, 97,108, 32, 97,114,116,115, 32, 40,117,115, 97, 41, 13, + 10, 48, 58, 49, 49, 97, 53, 58, 50, 54, 58, 48, 48, 58, 52, 53, 13, 10, + 48, 58, 49, 49, 99, 98, 58, 50, 58, 52, 53, 58, 48, 48, 13, 10, 13, 10, + 105,110,118, 97,100,101,114,115, 58, 13, 10,101, 97,114,116,104,105,110, + 118, 58, 13, 10,115,112, 97, 99,101, 97,116,116, 58, 13, 10,115,112, 97, + 99,101, 97,116, 50, 58, 13, 10,115,105,110,118,101,109, 97,103, 58, 13, + 10,115,105,116,118, 58, 13, 10,115,105, 99,118, 58, 13, 10,115,105,115, + 118, 58, 13, 10,115,105,115,118, 49, 58, 13, 10,115,105,115,118, 51, 58, + 13, 10,115,105,115,118, 50, 58, 13, 10, 97,108,105,101,110,105,110,118, + 112, 50, 58, 13, 10,115,112, 99,101,107,105,110,103, 58, 13, 10,115,112, + 99,101,119, 97,114,115, 58, 13, 10,115,112, 97, 99,101,119,114, 51, 58, + 13, 10,105,110,118, 97,100,101,114, 52, 58, 13, 10,105,110,118, 97,100, + 114,109,114, 58, 13, 10,105,110,118, 97,115,105,111,110, 58, 13, 10,115, + 101, 97,114,116,104,105,110, 58, 13, 10,115,101, 97,114,116,104,105,110, + 97, 58, 13, 10,115,117,112,101,114,105,110,118, 58, 13, 10,115,105,110, + 118,122,101,110, 58, 13, 10,105,110,118, 97,115,105,111,110, 97, 58, 13, + 10,105,110,118, 97,115,105,111,110, 98, 58, 13, 10,105,110,118, 97,115, + 105,111,110,114,122, 58, 13, 10,105,110,118, 97,115,105,111,110,114,122, + 97, 58, 13, 10,115,112, 97, 99,101,114,110,103, 58, 13, 10,117,108,116, + 114, 97,105,110,118, 58, 13, 10,115,112, 97, 99,101, 99,111,109, 58, 13, + 10,115,105,116,118,111, 58, 13, 10,115,105,116,118, 49, 58, 13, 10,105, + 110,118, 97,100,101,114,115,101,109, 58, 13, 10,103, 97,108,109,111,110, + 115,116, 58, 13, 10,115,112, 97, 99,101, 97,116,116, 50,107, 58, 13, 10, + 115,112, 97, 99,101, 97,116,116, 98,112, 58, 13, 10, 48, 58, 50, 48,102, + 52, 58, 48, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,101, 97,114, + 116,104,105,101, 58, 13, 10, 48, 58, 50, 48,102, 52, 58, 48, 50, 58, 48, + 48, 58, 53, 48, 13, 10, 13, 10, 97,108,105,101,110,105,110,118, 58, 13, + 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, 58, 53, 48, 13, 10, 13, + 10,105,110,118, 97,100,101,114,108, 58, 13, 10, 48, 58, 50, 48, 69, 48, + 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,115,112, 97, 99, + 101, 97,116, 99, 58, 13, 10,115,115,112, 97, 99,101, 97,116, 58, 13, 10, + 115,115,112, 97, 99,101, 97,116, 50, 58, 13, 10,115,115,112, 97, 99,101, + 97,116, 51, 58, 13, 10, 48, 58, 99, 52, 99, 55, 58, 49, 48, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 67,111,115,109, + 105, 99, 32, 77,111,110,115,116,101,114,115, 32, 50, 13, 10, 99,111,115, + 109,105, 99,109, 50, 58, 13, 10, 99,111,115,109,105, 99,109,111, 58, 32, + 59, 42, 42, 42, 42, 42, 42, 99,111,115,109,105, 99, 32,109,111,110,115, + 116,101,114,115, 32, 40, 42, 41, 13, 10, 48, 58, 50, 48,102, 52, 58, 48, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100, 97,114,116,104,118,100, + 114, 58, 13, 10, 48, 58, 49, 99, 48, 56, 58, 50, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,106,115,112,101, 99,116,101,114, 58, 13, 10,106,115,112, + 101, 99,116,101,114, 50, 58, 13, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 51, 48, 48, 58, 50, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,100,105,101,116, + 32,103,111, 32,103,111, 32, 40,101,117,114,111, 32,118, 49, 46, 49, 32, + 49, 57, 57, 50, 46, 48, 57, 46, 50, 54, 41, 13, 10,100,105,101,116,103, + 111, 58, 13, 10,100,105,101,116,103,111,101, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 40,101,117,114,111, 32,118, 49, 46, 49, 32, 49, 57, 57, 50, + 46, 48, 56, 46, 48, 52, 41, 13, 10,100,105,101,116,103,111,106, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 40,106, 97,112, 97,110, 32,118, 49, 46, + 49, 32, 49, 57, 57, 50, 46, 48, 57, 46, 50, 54, 41, 13, 10,100,105,101, + 116,103,111,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 40,117,115, 97, + 32,118, 49, 46, 49, 32, 49, 57, 57, 50, 46, 48, 57, 46, 50, 54, 41, 13, + 10, 48, 58, 51, 56, 48, 49,102, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 51, 56, 48, 49, 48, 48, 58,101,102, 58, 52, 56, 58, 53, 48, + 13, 10, 48, 58, 51, 56, 48, 49,102, 57, 58, 49, 58, 51, 53, 58, 51, 53, + 13, 10, 13, 10, 97,109, 98,117,115,104,106, 58, 13, 10, 97,109, 98,117, + 115,104, 58, 32, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,109, 98,117,115, + 104, 32, 40,116,101, 99,102,114,121, 41, 13, 10, 97,109, 98,117,115,104, + 118, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,109, 98,117,115,104, 32, + 40, 86,111,108,116, 32, 69,108,101, 99, 32, 99,111, 45,108,116,100, 41, + 13, 10, 97,109, 98,117,115,104,104, 58, 13, 10, 48, 58, 56, 48, 53, 48, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 48,102, 58, 50, + 52, 58, 48, 48, 58, 51, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 103, 45,108,111, 99, 32, 97,105,114, 32, 98, 97,116,116,108,101, 32, 40, + 117,115, 41, 13, 10, 59, 42, 42, 32,121,111,117, 32,110,101,101,100, 32, + 116,111, 32,112,114,101,115,115, 32,102, 51, 32, 97,115, 32,115,111,111, + 110, 32, 97,115, 32,116,104,105,115, 32,103, 97,109,101, 32,115,116, 97, + 114,116,115, 32, 98,101,102,111,114,101, 32,105,116, 32,119,105,108,108, + 32,115, 97,118,101, 32, 42, 42, 13, 10, 59, 42, 42, 32,102,111,114, 32, + 115,111,109,101, 32,114,101, 97,115,111,110, 32,116,104,101, 32,104,105, + 115, 99,111,114,101, 32,100, 97,116, 97, 32,119,105,108,108, 32,110,111, + 116, 32,100,105,115,112,108, 97,121, 32,117,110,116,105,108,108, 32,103, + 97,109,101, 32,105,115, 32,114,101,115,101,116, 32,119,105,116,104, 32, + 102, 51, 32, 42, 42, 13, 10, 59, 42, 42, 32,100,114,105,118,101,114, 32, + 112,114,111, 98,108,101,109, 32, 63, 63, 63, 63, 63, 63, 32, 32, 42, 42, + 13, 10,103,108,111, 99,117, 58, 13, 10,103,108,111, 99, 58, 13, 10, 50, + 58, 49,102,102, 97, 48, 48, 58,101,101, 58, 48, 50, 58, 48, 52, 13, 10, + 50, 58, 49,102,102, 97, 52, 97, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 66,101, 97, 99,104, 32, 70,101,115, + 116,105,118, 97,108, 32, 87,111,114,108,100, 32, 67,104, 97,109,112,105, + 111,110,115,104,105,112, 32, 49, 57, 57, 55, 13, 10,119, 98, 98, 99, 57, + 55, 58, 13, 10, 48, 58, 53, 48, 50, 51,102, 49, 58, 54,100, 58, 48, 48, + 58, 48, 50, 13, 10, 13, 10,111,112,119,111,108,102, 58, 13, 10,111,112, + 119,111,108,102, 98, 58, 13, 10,111,112,119,111,108,102,117, 58, 13, 10, + 111,112,119,111,108,102, 97, 58, 13, 10,111,112,119,111,108,102,106, 58, + 13, 10, 48, 58, 49, 48, 48, 97, 52, 50, 58, 55, 53, 58, 48, 48, 58, 53, + 52, 13, 10, 48, 58, 49, 48, 48,101, 50, 56, 58, 51, 98, 58, 48, 48, 58, + 48, 49, 13, 10, 13, 10,111,112,119,111,108,102,112, 58, 13, 10, 48, 58, + 49, 48, 48, 97, 54, 97, 58, 55, 53, 58, 48, 48, 58, 53, 52, 13, 10, 48, + 58, 49, 48, 48,101, 54, 56, 58, 51, 55, 58, 48, 56, 58, 48, 49, 13, 10, + 13, 10,103,115,119,111,114,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 71,114,101, 97,116, 32, 83,119,111,114,100,115,109, 97,110, 32, 40, 74, + 97,112, 97,110, 63, 41, 13, 10,103,115,119,111,114,100, 50, 58, 32, 59, + 42, 42, 42, 42, 42, 42, 71,114,101, 97,116, 32, 83,119,111,114,100,115, + 109, 97,110, 32, 40,119,111,114,108,100, 63, 41, 13, 10, 48, 58, 57, 99, + 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 99, 55, + 56, 58, 51, 99, 58, 51, 52, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 70,108,121,105,110,103, 32, 84,105,103,101,114, 13, 10,102, + 108,121,116,105,103,101,114, 58, 13, 10,102,108,121,116,105,103,101,114, + 97, 58, 13, 10, 48, 58,100, 50, 52, 52, 58, 51, 52, 58, 56, 56, 58, 52, + 56, 13, 10, 48, 58,100, 50, 51, 53, 58, 49, 58, 48, 51, 58, 48, 51, 13, + 10, 13, 10,109, 99, 97,116, 97,100,118, 58, 13, 10, 99, 97,116,116, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97,116,116, 32, 40, 74, 97,112, + 97,110, 41, 13, 10,109, 99, 97,116, 97,100,118,106, 58, 13, 10, 48, 58, + 49, 48, 49, 98,100, 51, 58, 51, 49, 58, 48, 53, 58, 50, 98, 13, 10, 13, + 10, 97,118, 97,108,110, 99,104,101, 58, 13, 10, 99, 97,115, 99, 97,100, + 101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, 97,115, 99, 97,100,101, + 13, 10, 48, 58, 48, 48, 57, 98, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 65,101,114,111, 32, 70,105,103,104, + 116,101,114,115, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10, 97,101, + 114,102, 98,111,111,116, 58, 13, 10, 97,101,114,111,102,103,116, 98, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,101,114,111, 32,102,105,103,104, + 116,101,114,115, 32, 40,116,117,114, 98,111, 32,102,111,114, 99,101, 32, + 104, 97,114,100,119, 97,114,101, 32,115,101,116, 32, 49, 41, 13, 10, 97, + 101,114,111,102,103,116, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97, + 101,114,111, 32,102,105,103,104,116,101,114,115, 32, 40,116,117,114, 98, + 111, 32,102,111,114, 99,101, 32,104, 97,114,100,119, 97,114,101, 32,115, + 101,116, 32, 50, 41, 13, 10, 97,101,114,102, 98,111,111, 50, 58, 13, 10, + 48, 58, 99, 99, 49, 97,102, 58, 57, 55, 58, 48, 98, 58, 54, 52, 13, 10, + 13, 10,116,114,105,111,116,104,101,112,106, 58, 13, 10,116,114,105,111, 116,104,101,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,114,105,111, 32, 84,104,101, 32, 80,117,110, 99,104, 32, 45, 32, 78,101,118,101,114, 32, 70,111,114,103,101,116, 32, 77,101, 46, 46, 46, 32, 40, 87,111,114, - 108,100, 41, 10, 48, 58, 49,102, 49, 97, 53, 56, 58, 52, 49, 58, 52, 49, - 58, 52,100, 10, 10,115,105,109,112,115,111,110,115, 58, 10,115,105,109, - 112,115,111,110,115, 50,112,106, 58, 10,115,105,109,112,115,111,110,115, - 50,112, 58, 10,115,105,109,112,115,111,110,115, 52,112, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 83,105,109,112,115,111,110, - 115, 32, 40, 52, 32, 80,108, 97,121,101,114,115, 32, 97,108,116, 41, 10, - 115,105,109,112,115,111,110,115, 50,112, 50, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,116,104,101, 32,115,105,109,112,115,111,110,115, 32, 40, 50, - 32,112,108, 97,121,101,114, 32, 97,108,116, 41, 10,115,105,109,112,115, - 111,110,115, 50,112, 97, 58, 10,115,105,109,112,115,111,110,115, 50,112, - 51, 58, 10, 48, 58, 52, 57, 56, 48, 58, 53, 48, 58, 52, 50, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 68,114, 46, 32, 84,111,109,121, 10, - 100,114,116,111,109,121, 58, 10, 48, 58,102,102,101,101, 48, 48, 58, 99, - 48, 58, 50, 48, 58, 51, 48, 10, 10,112, 98, 97, 99,116,105,111,110, 58, - 10,112, 98, 97, 99,116,105,111,110, 50, 58, 10,112, 98, 97, 99,116,105, + 108,100, 41, 13, 10, 48, 58, 49,102, 49, 97, 53, 56, 58, 52, 49, 58, 52, + 49, 58, 52,100, 13, 10, 13, 10,115,105,109,112,115,111,110,115, 58, 13, + 10,115,105,109,112,115,111,110,115, 50,112,106, 58, 13, 10,115,105,109, + 112,115,111,110,115, 50,112, 58, 13, 10,115,105,109,112,115,111,110,115, + 52,112, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,104,101, 32, 83, + 105,109,112,115,111,110,115, 32, 40, 52, 32, 80,108, 97,121,101,114,115, + 32, 97,108,116, 41, 13, 10,115,105,109,112,115,111,110,115, 50,112, 50, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,104,101, 32,115,105,109,112, + 115,111,110,115, 32, 40, 50, 32,112,108, 97,121,101,114, 32, 97,108,116, + 41, 13, 10,115,105,109,112,115,111,110,115, 50,112, 97, 58, 13, 10,115, + 105,109,112,115,111,110,115, 50,112, 51, 58, 13, 10, 48, 58, 52, 57, 56, + 48, 58, 53, 48, 58, 52, 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 68,114, 46, 32, 84,111,109,121, 13, 10,100,114,116,111,109, + 121, 58, 13, 10, 48, 58,102,102,101,101, 48, 48, 58, 99, 48, 58, 50, 48, + 58, 51, 48, 13, 10, 13, 10,112, 98, 97, 99,116,105,111,110, 58, 13, 10, + 112, 98, 97, 99,116,105,111,110, 50, 58, 13, 10,112, 98, 97, 99,116,105, 111,110, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,105,110, 98, 97, 108,108, 32, 65, 99,116,105,111,110, 32, 40,115,101,116, 32, 51, 44, 32, - 101,110, 99,114,121,112,116,101,100, 63, 41, 10,112, 98, 97, 99,116,105, - 111,110, 52, 58, 10,112, 98, 97, 99,116,105,111,110, 53, 58, 10, 48, 58, - 99, 48, 57, 51, 58, 53, 49, 58, 48, 55, 58, 48, 48, 10, 48, 58, 99, 49, - 50,102, 58, 50, 55, 58, 52, 56, 58, 52, 98, 10, 10,114, 97,105,110, 98, - 111,119, 58, 10,114, 97,105,110, 98,111,119,111, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,114, 97,105,110, 98,111,119, 32,105,115,108, 97,110,100, - 115, 32, 40,111,108,100, 32,118,101,114,115,105,111,110, 41, 10,114, 98, - 105,115,108, 97,110,100, 58, 10, 48, 58, 49, 48,100, 48, 99, 99, 58, 51, - 50, 58, 48, 48, 58, 51, 50, 32, 10, 48, 58, 49, 48,101, 49,102, 50, 58, - 48, 52, 58, 48, 48, 58, 48, 48, 32, 10, 10,106,117,109,112,105,110,103, - 58, 10,106,117,109,112,105,110,103, 97, 58, 10,106,117,109,112,105,110, - 103,105, 58, 10, 48, 58, 49, 48,100, 48, 99, 99, 58, 51, 50, 58, 48, 48, - 58, 52, 49, 32, 10, 48, 58, 49, 48,101, 49,102, 50, 58, 48, 52, 58, 48, - 48, 58, 48, 48, 32, 10, 10,114, 97,105,110, 98,111,119,101, 58, 10,114, - 98,105,115,108, 97,110,100,101, 58, 10, 48, 58, 49, 48,100, 48,100, 50, - 58, 51, 50, 58, 48, 48, 58, 51, 51, 32, 10, 48, 58, 49, 48,101, 49, 98, - 54, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, + 101,110, 99,114,121,112,116,101,100, 63, 41, 13, 10,112, 98, 97, 99,116, + 105,111,110, 52, 58, 13, 10,112, 98, 97, 99,116,105,111,110, 53, 58, 13, + 10, 48, 58, 99, 48, 57, 51, 58, 53, 49, 58, 48, 55, 58, 48, 48, 13, 10, + 48, 58, 99, 49, 50,102, 58, 50, 55, 58, 52, 56, 58, 52, 98, 13, 10, 13, + 10,114, 97,105,110, 98,111,119, 58, 13, 10,114, 97,105,110, 98,111,119, + 111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,114, 97,105,110, 98,111,119, + 32,105,115,108, 97,110,100,115, 32, 40,111,108,100, 32,118,101,114,115, + 105,111,110, 41, 13, 10,114, 98,105,115,108, 97,110,100, 58, 13, 10, 48, + 58, 49, 48,100, 48, 99, 99, 58, 51, 50, 58, 48, 48, 58, 51, 50, 13, 10, + 48, 58, 49, 48,101, 49,102, 50, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,106,117,109,112,105,110,103, 58, 13, 10,106,117,109,112,105, + 110,103, 97, 58, 13, 10,106,117,109,112,105,110,103,105, 58, 13, 10, 48, + 58, 49, 48,100, 48, 99, 99, 58, 51, 50, 58, 48, 48, 58, 52, 49, 13, 10, + 48, 58, 49, 48,101, 49,102, 50, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,114, 97,105,110, 98,111,119,101, 58, 13, 10,114, 98,105,115, + 108, 97,110,100,101, 58, 13, 10, 48, 58, 49, 48,100, 48,100, 50, 58, 51, + 50, 58, 48, 48, 58, 51, 51, 13, 10, 48, 58, 49, 48,101, 49, 98, 54, 58, + 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, - 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, - 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 53, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, 32, + 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97, + 108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 53, 32, + 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, + 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10,112, 99, - 108,117, 98,121,115, 58, 10,112, 99,108,117, 98,121,115, 97, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 80,117,122,122,108,101, 32, 67,108,117, 98, - 32, 40, 89,117,110, 32, 83,117,110,103, 32, 45, 32,115,101,116, 32, 50, - 41, 10, 48, 58, 50, 48, 98, 52, 54, 49, 58, 49, 52, 53, 58, 51, 97, 58, - 54, 52, 10, 48, 58, 50, 48,101, 56, 51, 53, 58, 98, 57, 58, 51, 56, 58, - 54, 52, 10, 48, 58, 50, 48, 54, 57, 51, 53, 58,101,100, 58, 49, 52, 58, - 54, 52, 10, 48, 58, 50, 48, 98, 53, 49, 53, 58, 57, 49, 58, 51, 56, 58, - 54, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 72,111,111,107, 32, 40, 74, - 97,112, 97,110, 41, 10,104,111,111,107,106, 58, 10, 48, 58,101, 97, 54, - 98, 55, 58,101, 99, 58, 48, 48, 58, 52,102, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 66,105,103, 32, 75,111,110,103, 10, 98,105,103,107,111,110,103, - 58, 10, 48, 58, 54, 49, 48, 57, 58, 97, 49, 58, 48, 48, 58, 57, 50, 10, - 48, 58, 54, 48, 98, 56, 58, 51, 58, 53, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42,109,105,103,104,116,121, 32,109,111,110,107,101,121, - 32, 40, 98,111,111,116,108,101,103, 32,111,110, 32,115, 99,114, 97,109, - 98,108,101, 32,104, 97,114,100,119, 97,114,101, 41, 10, 59, 42, 42, 32, - 118,101,114,121, 32,100,111,100,103,121, 32,104,105,115, 99,111,114,101, - 32,115, 97,118,105,110,103, 44, 32,112,111,115,115,105, 98,108,121, 32, - 98,101, 99, 97,117,115,101, 32,111,102, 32,105,116, 32, 98,101,101,110, - 32, 97, 32, 42, 42, 10, 59, 42, 42, 32,112,111,111,114,108,121, 32,112, - 117,116, 32,116,111,103,101,116,104,101,114, 32, 98,111,111,116,108,101, - 103, 32, 42, 42, 10,109,105,109,111,110,115, 99,114, 58, 10, 48, 58, 52, - 52, 97, 49, 58, 50, 58,100, 48, 58, 48, 55, 10, 48, 58, 52, 57, 56, 49, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 57, 97, 49, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 52, 57, 99, 49, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 57,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 52, 97, 48, 49, 58, 49, 58, 48, 50, 58, 48, 50, 10, 48, 58, 52, - 97, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 52, 97, 52, 49, - 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 52, 57, 50, 48, 58, 49, 58, - 49, 48, 58, 49, 48, 10, 48, 58, 52, 57, 52, 48, 58, 49, 58, 49, 48, 58, - 49, 48, 10, 48, 58, 52, 57, 54, 48, 58, 49, 58, 49, 53, 58, 49, 53, 10, - 48, 58, 52, 57, 56, 48, 58, 49, 58, 50, 50, 58, 50, 50, 10, 48, 58, 52, - 57, 97, 48, 58, 49, 58, 49,102, 58, 49,102, 10, 48, 58, 52, 57, 99, 48, - 58, 49, 58, 49, 51, 58, 49, 51, 10, 48, 58, 52, 57,101, 48, 58, 49, 58, - 50, 51, 58, 50, 51, 10, 48, 58, 52, 97, 48, 48, 58, 49, 58, 49, 48, 58, - 49, 48, 10, 48, 58, 52, 97, 50, 48, 58, 49, 58, 49, 56, 58, 49, 56, 10, - 48, 58, 52, 97, 52, 48, 58, 49, 58, 49, 55, 58, 49, 55, 10, 48, 58, 52, - 97, 54, 48, 58, 49, 58, 49, 57, 58, 49, 57, 10, 48, 58, 52, 97, 56, 48, - 58, 49, 58, 49, 56, 58, 49, 56, 10, 48, 58, 52, 97, 97, 48, 58, 49, 58, - 49, 48, 58, 49, 48, 10, 48, 58, 52, 97, 99, 48, 58, 49, 58, 49, 48, 58, - 49, 48, 10, 48, 58, 52, 97,101, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42,109,105,103,104,116,121, 32,109,111,110, - 107,101,121, 10,109,105,109,111,110,107,101,121, 58, 10,109,105,109,111, - 110,115, 99,111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,105,103,104, - 116,121, 32,109,111,110,107,101,121, 32, 40, 98,111,111,116,108,101,103, - 32,111,110, 32,115,117,112,101,114, 32, 99,111, 98,114, 97, 32,104, 97, - 114,100,119, 97,114,101, 41, 10, 48, 58, 56, 52, 97, 49, 58, 50, 58,100, - 48, 58, 48, 55, 10, 48, 58, 56, 57, 56, 49, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 56, 57, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 56, 57, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 57, - 101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 97, 48, 49, 58, - 49, 58, 48, 50, 58, 48, 50, 10, 48, 58, 56, 97, 50, 49, 58, 49, 58, 49, - 48, 58, 49, 48, 10, 48, 58, 56, 97, 52, 49, 58, 49, 58, 49, 48, 58, 49, - 48, 10, 48, 58, 56, 57, 50, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, - 58, 56, 57, 52, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 56, 57, - 54, 48, 58, 49, 58, 49, 53, 58, 49, 53, 10, 48, 58, 56, 57, 56, 48, 58, - 49, 58, 50, 50, 58, 50, 50, 10, 48, 58, 56, 57, 97, 48, 58, 49, 58, 49, - 102, 58, 49,102, 10, 48, 58, 56, 57, 99, 48, 58, 49, 58, 49, 51, 58, 49, - 51, 10, 48, 58, 56, 57,101, 48, 58, 49, 58, 50, 51, 58, 50, 51, 10, 48, - 58, 56, 97, 48, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 56, 97, - 50, 48, 58, 49, 58, 49, 56, 58, 49, 56, 10, 48, 58, 56, 97, 52, 48, 58, - 49, 58, 49, 55, 58, 49, 55, 10, 48, 58, 56, 97, 54, 48, 58, 49, 58, 49, - 57, 58, 49, 57, 10, 48, 58, 56, 97, 56, 48, 58, 49, 58, 49, 56, 58, 49, - 56, 10, 48, 58, 56, 97, 97, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, - 58, 56, 97, 99, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 56, 97, - 101, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10,100,105,115, 99,111, 58, - 10,100,105,115, 99,111,102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100, - 105,115, 99,111, 32,110,111, 46, 49, 32, 40,114,101,118, 32,102, 41, 10, - 48, 58, 48, 52, 48, 48, 58, 50, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 48, 48, 48, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 67,111,111,107,105,101, 32, 38, 32, 66,105, 98,105, 10, 99, - 111,111,107, 98,105, 98, 58, 10, 99,111,111,107, 98,105, 98, 97, 58, 10, - 48, 58, 49, 50, 49, 99, 99, 97, 58, 97, 97, 58, 50, 48, 58, 54, 52, 10, - 10, 59, 40, 98,117,108,108, 32,102,105,103,104,116,101,114, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98,117,108,108,102,103,116, - 114, 58, 10, 98,117,108,108,102,103,116,114,115, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 66,117,108,108, 32, 70,105,103,104,116,101,114, 32, 40, - 83,101,103, 97, 41, 10, 48, 58, 52, 48, 55, 48, 48, 58, 52, 48, 58, 52, - 49, 58, 48, 48, 10, 48, 58, 52, 48, 48, 49, 50, 58, 54, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 56, 48, 48, 98, 48, 58, 49, 99, 58, 48, 48, 58, 49, - 49, 10, 10, 98,105,103,115,116,114,105,107, 58, 10, 98,101,115,116,108, - 101, 97,103, 58, 32, 32, 10, 98,101,115,116,108,101, 97,119, 58, 10, 98, - 105,103,115,116,114,107, 98, 58, 10, 48, 58,102,102, 56, 57, 48, 98, 58, - 52, 57, 58, 48, 56, 58, 55, 56, 10, 10, 98,105,103,115,116,114,107, 98, - 97, 58, 10, 48, 58,102,102, 56, 57, 48, 98, 58, 52, 57, 58, 48, 48, 58, - 55, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 83,110, 97,112,112,101,114, - 32, 40, 75,111,114,101, 97, 41, 10,115,110, 97,112,112,101,114, 58, 10, - 48, 58,102,102, 51, 53, 50, 49, 58, 50, 54, 58, 48, 49, 58, 48, 53, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,104,111,108,101,108, 97,110,100, 46, - 99, 32, 40, 99,114, 97,122,121, 32,114, 97,108,108,121, 41, 10, 99,114, - 122,114, 97,108,108,121, 58, 10, 99,114,122,114, 97,108,108,121,103, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,114, 97,122,121, 32, 82, 97,108, - 108,121, 32, 40, 71,101, 99, 97,115, 32,108,105, 99,101,110,115,101, 41, - 10, 99,114,122,114, 97,108,108,121, 97, 58, 10, 48, 58, 99, 48, 48, 48, - 58, 51, 54, 58, 48, 48, 58, 52, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 66,117, 99, 99, 97,110,101,101,114,115, 32, 40,115,101,116, 32, 50, 41, - 10, 98,117, 99, 99, 97,110,114,115, 97, 58, 10, 48, 58,101, 51, 54,100, - 58, 52, 54, 58, 50, 48, 58, 52,102, 10, 10, 98,117, 99, 99, 97,110,114, - 115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,117, 99, 99, 97,110,101, - 101,114,115, 32, 40,115,101,116, 32, 49, 41, 10, 48, 58,101, 51, 54,101, - 58, 52, 54, 58, 50, 48, 58, 52,102, 10, 10, 98,117, 99, 99, 97,110,114, - 115, 98, 58, 10, 48, 58,101, 51, 55, 51, 58, 52, 54, 58, 50, 48, 58, 52, - 102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 40,100,101,102,101, - 110,100,101,114, 32, 40,114,101,100, 32,108, 97, 98,101,108, 41, 41, 10, - 59, 42, 42, 42, 32,116,104,105,115, 32,115, 97,118,101,115, 32,106,117, - 115,116, 32,116,104,101, 32,116,111,100, 97,121, 96,115, 32, 98,101,115, - 116, 32,115, 99,111,114,101,115, 44, 32,116,104,101, 32, 97,108,108, 32, - 116,105,109,101, 32,103,114,101, 97,116,101,115,116, 32, 97,114,101, 32, - 42, 42, 42, 10, 59, 42, 42, 42, 32,115, 97,118,101,100, 32,117,115,105, - 110,103, 32,110,118,114, 97,109, 32, 42, 42, 42, 10,100,101,102,101,110, - 100,101,114, 58, 10,115,116, 97,114,116,114,107,100, 58, 32, 32, 10,100, - 101,102,101,110,100,101,114,103, 58, 32, 32, 10,100,101,102,101,110,100, - 101,114,119, 58, 32, 32, 10,100,101,102,101,110,100,101,114, 98, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,100,101,102,101,110,100,101,114, 32, 40, - 98,108,117,101, 32,108, 97, 98,101,108, 41, 10,100,101,102,101,110, 99, - 101, 58, 10,100,101,102, 99,109,110,100, 58, 10, 48, 58, 98, 50, 54, 48, - 58, 54, 48, 58, 48, 48, 58, 52, 56, 10, 10,116,111,114,110, 97,100,111, - 49, 58, 10,122,101,114,111, 58, 10,122,101,114,111, 50, 58, 10, 48, 58, - 98, 50, 54, 48, 58, 54, 48, 58, 48, 48, 58, 53, 56, 10, 10, 59, 40,115, - 107,121, 32,108, 97,110, 99,101,114, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,115,107,121,108, 97,110, 99,114, 58, 10,115,107,121, - 108, 97,110, 99,114,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,107, - 121, 32,108, 97,110, 99,101,114, 32, 40,101,115, 99,111, 32,116,114, 97, - 100,105,110,103, 32, 99,111, 32,108,105, 99,101,110, 99,101, 41, 10, 48, - 58, 56, 50,101, 51, 58, 50, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56, 50, - 101, 53, 58, 50, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,112,105,110, 98,111, 46, 99, 32, 40,112,105,110, 98,111, - 32, 38, 32,112,105,110, 98,111, 32, 40,115,116,114,105,107,101, 41, 41, - 10,112,105,110, 98,111, 58, 10,112,105,110, 98,111,115, 58, 10,112,105, - 110, 98,111, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,105,110, 98, - 111, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58, 49, 50, 48, 58, 54,101, - 58, 50, 52, 58, 48, 48, 10, 48, 58, 52, 51, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 52, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 83,116, 97,114, 32, 70,105,114,101, 32, 50, 10,115, - 116, 97,114,102,105,114, 50, 58, 10, 48, 58, 56, 50, 97, 57, 58, 54, 97, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,115,116, 97, - 114, 32,102,105,114,101, 32, 40,115,101,116, 32, 50, 41, 10,115,116, 97, - 114,102,105,114,101, 97, 58, 10, 48, 58, 56, 50, 98, 97, 58, 97, 97, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 69,120, 99,101, - 108,115,105,111,114, 32, 10,101,120, 99,101,108,115,114, 58, 10, 48, 58, - 102,102, 49, 55, 55, 56, 58, 98, 51, 58, 48, 99, 58, 48, 49, 10, 10,101, - 120, 99,101,108,115,114, 97, 58, 10, 48, 58,102,102, 49, 55, 56, 48, 58, - 98, 51, 58, 48, 99, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 13, 10,112, 99,108,117, 98,121,115, 58, 13, 10,112, 99,108,117, 98,121, + 115, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,117,122,122,108,101, + 32, 67,108,117, 98, 32, 40, 89,117,110, 32, 83,117,110,103, 32, 45, 32, + 115,101,116, 32, 50, 41, 13, 10, 48, 58, 50, 48, 98, 52, 54, 49, 58, 49, + 52, 53, 58, 51, 97, 58, 54, 52, 13, 10, 48, 58, 50, 48,101, 56, 51, 53, + 58, 98, 57, 58, 51, 56, 58, 54, 52, 13, 10, 48, 58, 50, 48, 54, 57, 51, + 53, 58,101,100, 58, 49, 52, 58, 54, 52, 13, 10, 48, 58, 50, 48, 98, 53, + 49, 53, 58, 57, 49, 58, 51, 56, 58, 54, 52, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 72,111,111,107, 32, 40, 74, 97,112, 97,110, 41, 13, 10, + 104,111,111,107,106, 58, 13, 10, 48, 58,101, 97, 54, 98, 55, 58,101, 99, + 58, 48, 48, 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 66, + 105,103, 32, 75,111,110,103, 13, 10, 98,105,103,107,111,110,103, 58, 13, + 10, 48, 58, 54, 49, 48, 57, 58, 97, 49, 58, 48, 48, 58, 57, 50, 13, 10, + 48, 58, 54, 48, 98, 56, 58, 51, 58, 53, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42,109,105,103,104,116,121, 32,109,111,110,107, + 101,121, 32, 40, 98,111,111,116,108,101,103, 32,111,110, 32,115, 99,114, + 97,109, 98,108,101, 32,104, 97,114,100,119, 97,114,101, 41, 13, 10, 59, + 42, 42, 32,118,101,114,121, 32,100,111,100,103,121, 32,104,105,115, 99, + 111,114,101, 32,115, 97,118,105,110,103, 44, 32,112,111,115,115,105, 98, + 108,121, 32, 98,101, 99, 97,117,115,101, 32,111,102, 32,105,116, 32, 98, + 101,101,110, 32, 97, 32, 42, 42, 13, 10, 59, 42, 42, 32,112,111,111,114, + 108,121, 32,112,117,116, 32,116,111,103,101,116,104,101,114, 32, 98,111, + 111,116,108,101,103, 32, 42, 42, 13, 10,109,105,109,111,110,115, 99,114, + 58, 13, 10, 48, 58, 52, 52, 97, 49, 58, 50, 58,100, 48, 58, 48, 55, 13, + 10, 48, 58, 52, 57, 56, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 52, 57, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, + 57, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 57,101, + 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 97, 48, 49, 58, + 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, 58, 52, 97, 50, 49, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 97, 52, 49, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 48, 58, 52, 57, 50, 48, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 48, 58, 52, 57, 52, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, + 10, 48, 58, 52, 57, 54, 48, 58, 49, 58, 49, 53, 58, 49, 53, 13, 10, 48, + 58, 52, 57, 56, 48, 58, 49, 58, 50, 50, 58, 50, 50, 13, 10, 48, 58, 52, + 57, 97, 48, 58, 49, 58, 49,102, 58, 49,102, 13, 10, 48, 58, 52, 57, 99, + 48, 58, 49, 58, 49, 51, 58, 49, 51, 13, 10, 48, 58, 52, 57,101, 48, 58, + 49, 58, 50, 51, 58, 50, 51, 13, 10, 48, 58, 52, 97, 48, 48, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 97, 50, 48, 58, 49, 58, 49, 56, + 58, 49, 56, 13, 10, 48, 58, 52, 97, 52, 48, 58, 49, 58, 49, 55, 58, 49, + 55, 13, 10, 48, 58, 52, 97, 54, 48, 58, 49, 58, 49, 57, 58, 49, 57, 13, + 10, 48, 58, 52, 97, 56, 48, 58, 49, 58, 49, 56, 58, 49, 56, 13, 10, 48, + 58, 52, 97, 97, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, + 97, 99, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 52, 97,101, + 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42,109,105,103,104,116,121, 32,109,111,110,107,101,121, 13, 10,109, + 105,109,111,110,107,101,121, 58, 13, 10,109,105,109,111,110,115, 99,111, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,109,105,103,104,116,121, 32,109, + 111,110,107,101,121, 32, 40, 98,111,111,116,108,101,103, 32,111,110, 32, + 115,117,112,101,114, 32, 99,111, 98,114, 97, 32,104, 97,114,100,119, 97, + 114,101, 41, 13, 10, 48, 58, 56, 52, 97, 49, 58, 50, 58,100, 48, 58, 48, + 55, 13, 10, 48, 58, 56, 57, 56, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 56, 57, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 56, 57, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, + 57,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 48, + 49, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, 58, 56, 97, 50, 49, 58, + 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 56, 97, 52, 49, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 48, 58, 56, 57, 50, 48, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 48, 58, 56, 57, 52, 48, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 48, 58, 56, 57, 54, 48, 58, 49, 58, 49, 53, 58, 49, 53, 13, + 10, 48, 58, 56, 57, 56, 48, 58, 49, 58, 50, 50, 58, 50, 50, 13, 10, 48, + 58, 56, 57, 97, 48, 58, 49, 58, 49,102, 58, 49,102, 13, 10, 48, 58, 56, + 57, 99, 48, 58, 49, 58, 49, 51, 58, 49, 51, 13, 10, 48, 58, 56, 57,101, + 48, 58, 49, 58, 50, 51, 58, 50, 51, 13, 10, 48, 58, 56, 97, 48, 48, 58, + 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 56, 97, 50, 48, 58, 49, 58, + 49, 56, 58, 49, 56, 13, 10, 48, 58, 56, 97, 52, 48, 58, 49, 58, 49, 55, + 58, 49, 55, 13, 10, 48, 58, 56, 97, 54, 48, 58, 49, 58, 49, 57, 58, 49, + 57, 13, 10, 48, 58, 56, 97, 56, 48, 58, 49, 58, 49, 56, 58, 49, 56, 13, + 10, 48, 58, 56, 97, 97, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, + 58, 56, 97, 99, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 56, + 97,101, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10,100,105,115, + 99,111, 58, 13, 10,100,105,115, 99,111,102, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,100,105,115, 99,111, 32,110,111, 46, 49, 32, 40,114,101,118, + 32,102, 41, 13, 10, 48, 58, 48, 52, 48, 48, 58, 50, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 48, 48, 48, 54, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 67,111,111,107,105,101, 32, + 38, 32, 66,105, 98,105, 13, 10, 99,111,111,107, 98,105, 98, 58, 13, 10, + 99,111,111,107, 98,105, 98, 97, 58, 13, 10, 48, 58, 49, 50, 49, 99, 99, + 97, 58, 97, 97, 58, 50, 48, 58, 54, 52, 13, 10, 13, 10, 59, 40, 98,117, + 108,108, 32,102,105,103,104,116,101,114, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10, 98,117,108,108,102,103,116,114, 58, 13, 10, + 98,117,108,108,102,103,116,114,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 66,117,108,108, 32, 70,105,103,104,116,101,114, 32, 40, 83,101,103, + 97, 41, 13, 10, 48, 58, 52, 48, 55, 48, 48, 58, 52, 48, 58, 52, 49, 58, + 48, 48, 13, 10, 48, 58, 52, 48, 48, 49, 50, 58, 54, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 56, 48, 48, 98, 48, 58, 49, 99, 58, 48, 48, 58, 49, + 49, 13, 10, 13, 10, 98,105,103,115,116,114,105,107, 58, 13, 10, 98,101, + 115,116,108,101, 97,103, 58, 13, 10, 98,101,115,116,108,101, 97,119, 58, + 13, 10, 98,105,103,115,116,114,107, 98, 58, 13, 10, 48, 58,102,102, 56, + 57, 48, 98, 58, 52, 57, 58, 48, 56, 58, 55, 56, 13, 10, 13, 10, 98,105, + 103,115,116,114,107, 98, 97, 58, 13, 10, 48, 58,102,102, 56, 57, 48, 98, + 58, 52, 57, 58, 48, 48, 58, 55, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 83,110, 97,112,112,101,114, 32, 40, 75,111,114,101, 97, 41, 13, + 10,115,110, 97,112,112,101,114, 58, 13, 10, 48, 58,102,102, 51, 53, 50, + 49, 58, 50, 54, 58, 48, 49, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,104,111,108,101,108, 97,110,100, 46, 99, 32, 40, 99,114, + 97,122,121, 32,114, 97,108,108,121, 41, 13, 10, 99,114,122,114, 97,108, + 108,121, 58, 13, 10, 99,114,122,114, 97,108,108,121,103, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 67,114, 97,122,121, 32, 82, 97,108,108,121, 32, + 40, 71,101, 99, 97,115, 32,108,105, 99,101,110,115,101, 41, 13, 10, 99, + 114,122,114, 97,108,108,121, 97, 58, 13, 10, 48, 58, 99, 48, 48, 48, 58, + 51, 54, 58, 48, 48, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 66,117, 99, 99, 97,110,101,101,114,115, 32, 40,115,101,116, 32, 50, + 41, 13, 10, 98,117, 99, 99, 97,110,114,115, 97, 58, 13, 10, 48, 58,101, + 51, 54,100, 58, 52, 54, 58, 50, 48, 58, 52,102, 13, 10, 13, 10, 98,117, + 99, 99, 97,110,114,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,117, + 99, 99, 97,110,101,101,114,115, 32, 40,115,101,116, 32, 49, 41, 13, 10, + 48, 58,101, 51, 54,101, 58, 52, 54, 58, 50, 48, 58, 52,102, 13, 10, 13, + 10, 98,117, 99, 99, 97,110,114,115, 98, 58, 13, 10, 48, 58,101, 51, 55, + 51, 58, 52, 54, 58, 50, 48, 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 40,100,101,102,101,110,100,101,114, 32, 40,114, + 101,100, 32,108, 97, 98,101,108, 41, 41, 13, 10, 59, 42, 42, 42, 32,116, + 104,105,115, 32,115, 97,118,101,115, 32,106,117,115,116, 32,116,104,101, + 32,116,111,100, 97,121, 96,115, 32, 98,101,115,116, 32,115, 99,111,114, + 101,115, 44, 32,116,104,101, 32, 97,108,108, 32,116,105,109,101, 32,103, + 114,101, 97,116,101,115,116, 32, 97,114,101, 32, 42, 42, 42, 13, 10, 59, + 42, 42, 42, 32,115, 97,118,101,100, 32,117,115,105,110,103, 32,110,118, + 114, 97,109, 32, 42, 42, 42, 13, 10,100,101,102,101,110,100,101,114, 58, + 13, 10,115,116, 97,114,116,114,107,100, 58, 13, 10,100,101,102,101,110, + 100,101,114,103, 58, 13, 10,100,101,102,101,110,100,101,114,119, 58, 13, + 10,100,101,102,101,110,100,101,114, 98, 58, 32, 32, 59, 42, 42, 42, 42, + 42, 42,100,101,102,101,110,100,101,114, 32, 40, 98,108,117,101, 32,108, + 97, 98,101,108, 41, 13, 10,100,101,102,101,110, 99,101, 58, 13, 10,100, + 101,102, 99,109,110,100, 58, 13, 10, 48, 58, 98, 50, 54, 48, 58, 54, 48, + 58, 48, 48, 58, 52, 56, 13, 10, 13, 10,116,111,114,110, 97,100,111, 49, + 58, 13, 10,122,101,114,111, 58, 13, 10,122,101,114,111, 50, 58, 13, 10, + 48, 58, 98, 50, 54, 48, 58, 54, 48, 58, 48, 48, 58, 53, 56, 13, 10, 13, + 10, 59, 40,115,107,121, 32,108, 97,110, 99,101,114, 41, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,115,107,121,108, 97,110, 99,114, + 58, 13, 10,115,107,121,108, 97,110, 99,114,101, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42,115,107,121, 32,108, 97,110, 99,101,114, 32, 40,101,115, + 99,111, 32,116,114, 97,100,105,110,103, 32, 99,111, 32,108,105, 99,101, + 110, 99,101, 41, 13, 10, 48, 58, 56, 50,101, 51, 58, 50, 58, 48, 48, 58, + 48, 49, 13, 10, 48, 58, 56, 50,101, 53, 58, 50, 50, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,105,110, 98, + 111, 46, 99, 32, 40,112,105,110, 98,111, 32, 38, 32,112,105,110, 98,111, + 32, 40,115,116,114,105,107,101, 41, 41, 13, 10,112,105,110, 98,111, 58, + 13, 10,112,105,110, 98,111,115, 58, 13, 10,112,105,110, 98,111, 97, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,105,110, 98,111, 32, 40,115,101, + 116, 32, 50, 41, 13, 10, 48, 58, 49, 50, 48, 58, 54,101, 58, 50, 52, 58, + 48, 48, 13, 10, 48, 58, 52, 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 52, 52, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 83,116, 97,114, 32, 70,105,114,101, 32, 50, 13, 10, + 115,116, 97,114,102,105,114, 50, 58, 13, 10, 48, 58, 56, 50, 97, 57, 58, + 54, 97, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42,115,116, 97,114, 32,102,105,114,101, 32, 40,115,101,116, 32, 50, 41, + 13, 10,115,116, 97,114,102,105,114,101, 97, 58, 13, 10, 48, 58, 56, 50, + 98, 97, 58, 97, 97, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 69,120, 99,101,108,115,105,111,114, 32, 13, 10,101,120, + 99,101,108,115,114, 58, 13, 10, 48, 58,102,102, 49, 55, 55, 56, 58, 98, + 51, 58, 48, 99, 58, 48, 49, 13, 10, 13, 10,101,120, 99,101,108,115,114, + 97, 58, 13, 10, 48, 58,102,102, 49, 55, 56, 48, 58, 98, 51, 58, 48, 99, + 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, - 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104, - 105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 52, 32, 97,100,100, - 105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32, - 108,101,101,122,101,114, 32, 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, 32, 32, 32,108, 97,116, + 101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103, + 104,115, 99,111,114,101, 95,118, 48, 46, 57, 52, 32, 97,100,100,105,116, + 105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101, + 101,122,101,114, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, - 42, 42, 42,103, 97,108, 97,120,121, 32,102,111,114, 99,101, 32, 50, 10, - 103,102,111,114, 99,101, 50, 58, 10,103,102,111,114, 99,101, 50,106, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42,103, 97,108, 97,120,121, 32,102,111, - 114, 99,101, 32, 50, 32, 40,106, 97,112, 97,110, 41, 10,103,102,111,114, - 99,101, 50,106, 97, 58, 10, 50, 58, 49,102,101, 52, 48, 48, 58, 51, 56, - 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42,112,111,119, - 101,114, 32,100,114,105,102,116, 10,112,100,114,105,102,116, 58, 10,112, - 100,114,105,102,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,112,111, - 119,101,114, 32,100,114,105,102,116, 32, 40,106, 97,112, 97,110, 41, 10, - 112,100,114,105,102,116, 97, 58, 10,112,100,114,105,102,116,101, 58, 10, - 50, 58, 49,102,102, 97, 49, 54, 58, 49, 56,102, 58, 48, 50, 58, 48, 56, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 86,105,112,101,114, 32, 80,104, 97, - 115,101, 32, 49, 32, 40,106, 97,112, 97,110, 44,110,101,119, 32,118,101, - 114,115,105,111,110, 41, 10,118,105,112,114,112, 49, 58, 10,118,105,112, - 114,112, 49,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86,105,112,101, - 114, 32, 80,104, 97,115,101, 32, 49, 32, 40, 83,119,105,116,122,101,114, - 108, 97,110,100, 44, 32, 78,101,119, 32, 86,101,114,115,105,111,110, 41, - 10,118,105,112,114,112, 49,106, 58, 10,118,105,112,114,112, 49,117, 58, - 10,118,105,112,114,112, 49,107, 58, 10,118,105,112,114,112, 49,104, 58, - 10, 48, 58, 49,101, 54, 49, 48, 58, 99, 55, 58, 52, 48, 58, 50,101, 10, - 10,118,105,112,114,112, 49,111,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 86,105,112,101,114, 32, 80,104, 97,115,101, 32, 49, 32, 40,106, 97, - 112, 97,110, 41, 10, 48, 58, 49,100, 55, 98, 57, 58, 99, 55, 58, 50, 48, - 58, 50,101, 10, 10,118,105,112,114,112, 49,111,116, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42,103, 97,108, 97,120,121, 32,102,111,114, 99,101, 32, 50, + 13, 10,103,102,111,114, 99,101, 50, 58, 13, 10,103,102,111,114, 99,101, + 50,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,103, 97,108, 97,120,121, + 32,102,111,114, 99,101, 32, 50, 32, 40,106, 97,112, 97,110, 41, 13, 10, + 103,102,111,114, 99,101, 50,106, 97, 58, 13, 10, 50, 58, 49,102,101, 52, + 48, 48, 58, 51, 56, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42,112,111,119,101,114, 32,100,114,105,102,116, 13, 10,112, + 100,114,105,102,116, 58, 13, 10,112,100,114,105,102,116,106, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42,112,111,119,101,114, 32,100,114,105,102,116, + 32, 40,106, 97,112, 97,110, 41, 13, 10,112,100,114,105,102,116, 97, 58, + 13, 10,112,100,114,105,102,116,101, 58, 13, 10, 50, 58, 49,102,102, 97, + 49, 54, 58, 49, 56,102, 58, 48, 50, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 86,105,112,101,114, 32, 80,104, 97,115,101, 32, 49, - 32, 40, 71,101,114,109, 97,110,121, 41, 10,118,105,112,114,112, 49,104, - 107, 58, 10, 48, 58, 49,101, 54, 48, 48, 58, 99, 55, 58, 52, 48, 58, 50, - 101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 82,105,110,103, 32, 75,105,110, - 103, 32, 40, 85, 83, 44, 32, 87,111,111,100,112,108, 97, 99,101, 32,108, - 105, 99,101,110,115,101, 41, 10,114,105,110,103,107,105,110,103,119, 58, - 10, 49, 58, 56, 48, 52, 56, 58, 56, 67, 58, 48, 48, 58, 49, 50, 10, 48, - 58, 67, 50, 50, 97, 58, 48, 52, 58, 48, 48, 58, 48, 53, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 83,117,114,112,114,105,115,101, 32, 65,116,116, 97, - 99,107, 32, 40, 65,115,105, 97, 32,118,101,114, 46, 32, 76, 41, 10,115, - 117,114, 97,116,107, 58, 10,115,117,114, 97,116,107,106, 58, 10,115,117, - 114, 97,116,107, 97, 58, 10, 48, 58, 98, 48, 48, 58, 53, 97, 58, 49, 49, - 58, 51, 49, 10, 48, 58, 53, 57, 56, 49, 58, 51, 58, 49, 48, 58, 48, 48, - 10, 48, 58, 54, 48, 57,101, 58, 54, 58, 48, 49, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 65,108,112,104, 97, 32, 77,105,115,115,105,111, - 110, 10, 97,108,112,104, 97,109,105,115, 58, 10, 48, 58,100, 56, 51, 98, - 58, 56, 50, 58, 48, 48, 58, 50, 48, 10, 48, 58,101, 55, 55, 98, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 112,114, 99,114,111,115, 50, 46, 99, 32, 10,115,112,114, 99,114,111,115, - 50, 58, 10,115,112,114, 99,114,111,115, 50, 97, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 83,117,112,101,114, 32, 67,114,111,115,115, 32, 50, 32, - 40, 74, 97,112, 97,110, 32,115,101,116, 32, 50, 41, 10, 48, 58,102, 97, - 48, 48, 58, 55, 56, 58, 48, 48, 58, 52, 97, 10, 48, 58,102, 48, 49, 50, - 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 48, 49, 51, 58, 49, 58, - 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42,117,102,111, 32, - 115,101,110,115,104,105, 32,121,111,104,107,111, 32, 99,104, 97,110, 10, - 117,102,111,115,101,110,115,105, 58, 10,117,102,111,115,101,110,115, 98, - 58, 32, 59, 42, 42, 42, 42, 42, 42, 85,102,111, 32, 83,101,110,115,104, - 105, 32, 89,111,104,107,111, 32, 67,104, 97,110, 32, 40,110,111,116, 32, - 101,110, 99,114,121,112,116,101,100, 41, 10, 48, 58, 99, 56, 48, 48, 58, - 54, 50, 58, 49, 49, 58, 52, 49, 10, 10, 97,108,116, 98,101, 97,115,116, - 58, 10, 97,108,116, 98,101, 97,115,116, 50, 58, 10, 97,108,116, 98,101, - 97,115,116,106, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,108,116, - 101,114,101,100, 32, 98,101, 97,115,116, 32, 40,106, 97,112, 97,110, 44, - 32,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 48, 54, 56, 41, 10, - 97,108,116, 98,101, 97,115,116, 52, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 97,108,116,101,114,101,100, 32, 98,101, 97,115,116, 32, 40,115,101, - 116, 32, 52, 44, 32,109, 99, 45, 56, 49, 50, 51, 98, 32, 51, 49, 55, 45, - 48, 48, 54, 54, 41, 10, 97,108,116, 98,101, 97,115,116, 53, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 97,108,116,101,114,101,100, 32, 98,101, 97, - 115,116, 32, 40,115,101,116, 32, 53, 44, 32, 56, 55, 53, 49, 32, 51, 49, - 55, 45, 48, 48, 55, 54, 41, 10, 97,108,116, 98,101, 97,115,116,106, 58, + 32, 40,106, 97,112, 97,110, 44,110,101,119, 32,118,101,114,115,105,111, + 110, 41, 13, 10,118,105,112,114,112, 49, 58, 13, 10,118,105,112,114,112, + 49,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86,105,112,101,114, 32, + 80,104, 97,115,101, 32, 49, 32, 40, 83,119,105,116,122,101,114,108, 97, + 110,100, 44, 32, 78,101,119, 32, 86,101,114,115,105,111,110, 41, 13, 10, + 118,105,112,114,112, 49,106, 58, 13, 10,118,105,112,114,112, 49,117, 58, + 13, 10,118,105,112,114,112, 49,107, 58, 13, 10,118,105,112,114,112, 49, + 104, 58, 13, 10, 48, 58, 49,101, 54, 49, 48, 58, 99, 55, 58, 52, 48, 58, + 50,101, 13, 10, 13, 10,118,105,112,114,112, 49,111,106, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 86,105,112,101,114, 32, 80,104, 97,115,101, 32, + 49, 32, 40,106, 97,112, 97,110, 41, 13, 10, 48, 58, 49,100, 55, 98, 57, + 58, 99, 55, 58, 50, 48, 58, 50,101, 13, 10, 13, 10,118,105,112,114,112, + 49,111,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86,105,112,101,114, + 32, 80,104, 97,115,101, 32, 49, 32, 40, 71,101,114,109, 97,110,121, 41, + 13, 10,118,105,112,114,112, 49,104,107, 58, 13, 10, 48, 58, 49,101, 54, + 48, 48, 58, 99, 55, 58, 52, 48, 58, 50,101, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 82,105,110,103, 32, 75,105,110,103, 32, 40, 85, 83, 44, + 32, 87,111,111,100,112,108, 97, 99,101, 32,108,105, 99,101,110,115,101, + 41, 13, 10,114,105,110,103,107,105,110,103,119, 58, 13, 10, 49, 58, 56, + 48, 52, 56, 58, 56, 67, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58, 67, 50, + 50, 97, 58, 48, 52, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 83,117,114,112,114,105,115,101, 32, 65,116,116, 97, 99, + 107, 32, 40, 65,115,105, 97, 32,118,101,114, 46, 32, 76, 41, 13, 10,115, + 117,114, 97,116,107, 58, 13, 10,115,117,114, 97,116,107,106, 58, 13, 10, + 115,117,114, 97,116,107, 97, 58, 13, 10, 48, 58, 98, 48, 48, 58, 53, 97, + 58, 49, 49, 58, 51, 49, 13, 10, 48, 58, 53, 57, 56, 49, 58, 51, 58, 49, + 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 57,101, 58, 54, 58, 48, 49, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 65,108,112,104, 97, + 32, 77,105,115,115,105,111,110, 13, 10, 97,108,112,104, 97,109,105,115, + 58, 13, 10, 48, 58,100, 56, 51, 98, 58, 56, 50, 58, 48, 48, 58, 50, 48, + 13, 10, 48, 58,101, 55, 55, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,112,114, 99,114,111,115, + 50, 46, 99, 13, 10,115,112,114, 99,114,111,115, 50, 58, 13, 10,115,112, + 114, 99,114,111,115, 50, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, + 117,112,101,114, 32, 67,114,111,115,115, 32, 50, 32, 40, 74, 97,112, 97, + 110, 32,115,101,116, 32, 50, 41, 13, 10, 48, 58,102, 97, 48, 48, 58, 55, + 56, 58, 48, 48, 58, 52, 97, 13, 10, 48, 58,102, 48, 49, 50, 58, 54, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 48, 49, 51, 58, 49, 58, 48, 51, + 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,117,102,111, 32, + 115,101,110,115,104,105, 32,121,111,104,107,111, 32, 99,104, 97,110, 13, + 10,117,102,111,115,101,110,115,105, 58, 13, 10,117,102,111,115,101,110, + 115, 98, 58, 32, 59, 42, 42, 42, 42, 42, 42, 85,102,111, 32, 83,101,110, + 115,104,105, 32, 89,111,104,107,111, 32, 67,104, 97,110, 32, 40,110,111, + 116, 32,101,110, 99,114,121,112,116,101,100, 41, 13, 10, 48, 58, 99, 56, + 48, 48, 58, 54, 50, 58, 49, 49, 58, 52, 49, 13, 10, 13, 10, 97,108,116, + 98,101, 97,115,116, 58, 13, 10, 97,108,116, 98,101, 97,115,116, 50, 58, + 13, 10, 97,108,116, 98,101, 97,115,116,106, 51, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 97,108,116,101,114,101,100, 32, 98,101, 97,115,116, 32, + 40,106, 97,112, 97,110, 44, 32,102,100, 49, 48, 57, 52, 32, 51, 49, 55, + 45, 48, 48, 54, 56, 41, 13, 10, 97,108,116, 98,101, 97,115,116, 52, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,108,116,101,114,101,100, 32, 98, - 101, 97,115,116, 32, 40,115,101,116, 32, 54, 44, 32,106, 97,112, 97,110, - 44, 32, 56, 55, 53, 49, 32, 51, 49, 55, 45, 48, 48, 55, 55, 41, 10, 97, - 108,116, 98,101, 97,115,116,106, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 101, 97,115,116, 32, 40,115,101,116, 32, 52, 44, 32,109, 99, 45, 56, 49, + 50, 51, 98, 32, 51, 49, 55, 45, 48, 48, 54, 54, 41, 13, 10, 97,108,116, + 98,101, 97,115,116, 53, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,108, + 116,101,114,101,100, 32, 98,101, 97,115,116, 32, 40,115,101,116, 32, 53, + 44, 32, 56, 55, 53, 49, 32, 51, 49, 55, 45, 48, 48, 55, 54, 41, 13, 10, + 97,108,116, 98,101, 97,115,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,108,116,101,114,101,100, 32, 98,101, 97,115,116, 32, 40,115,101, - 116, 32, 49, 44, 32,106, 97,112, 97,110, 44, 32,102,100, 49, 48, 57, 52, - 32, 51, 49, 55, 45, 48, 48, 54, 53, 41, 10, 97,108,116, 98,101, 97,115, - 116, 54, 58, 10, 97,108,116, 98,101, 97,115,116, 98,108, 58, 10, 97,108, - 116, 98,101, 97,115,116, 53,100, 58, 10, 97,108,116, 98,101, 97,115,116, - 106, 51,100, 58, 10, 48, 58,102,102,102, 99, 48, 48, 58, 55, 52, 58, 48, - 48, 58, 51, 51, 10, 48, 58,102,102,102, 48, 49, 48, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,108,117,110, 97,114, 32, - 98, 97,116,116,108,101, 32, 40,112,114,111,116,111,116,121,112,101, 44, - 108, 97,116,101,114, 41, 10,108,117,110, 97,114, 98, 97,116, 58, 10, 48, - 58, 52, 50, 98, 58, 50,100, 58, 53, 48, 58, 48, 51, 10, 10, 59, 42, 42, - 42, 42, 42, 42,114, 97, 99,107, 32, 43, 32,114,111,108,108, 10,114, 97, - 99,107,110,114,111,108, 58, 10, 48, 58, 49,100, 98, 56, 58, 52, 53, 58, - 50, 51, 58, 49, 51, 10, 10,103,114, 97,118,105,116, 97,114, 58, 10,103, - 114, 97,118,105,116, 97,114, 50, 58, 10,103,114, 97,118,112, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42,103,114, 97,118,105,116, 97,114, 32, 40,112, - 114,111,116,111,116,121,112,101, 41, 10,103,114, 97,118,105,116, 97,114, - 49, 58, 10, 48, 58, 52, 49,101, 58, 51, 48, 58, 53, 48, 58, 48, 53, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,105,115,115,105,108,101, 46, - 99, 10,109,105,115,115,105,108,101, 50, 58, 10,115,117,112,114,109, 97, - 116,107, 58, 10,109,105,115,115,105,108,101, 58, 10,115,117,112,114,109, - 97,116,107,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,117,112,101, - 114, 32,109,105,115,115,105,108,101, 32, 97,116,116, 97, 99,107, 32, 40, - 110,111,116, 32,101,110, 99,114,121,112,116,101,100, 41, 10, 48, 58, 48, - 48, 50, 99, 58, 51, 48, 58, 52, 55, 58, 48, 48, 10, 10, 59, 40,109,105, - 115,115,105,108,101, 32, 99,111,109,109, 97,110,100, 32, 40,115,101,116, - 32, 50, 41, 41, 32, 99,108,111,110,101, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 32, 45, 32,109,111,100,105,102,105,101,100, 32,104,105, - 115, 99,111,114,101, 32,115, 97,118,101, 10,109,105,115,115,105,108,101, - 49, 58, 10, 48, 58, 48, 48, 50, 99, 58, 51, 48, 58, 52, 68, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,119, 97,108,108, 32, 99,114, 97, - 115,104, 10,119, 97,108,108, 99, 58, 10,119, 97,108,108, 99, 97, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42, 87, 97,108,108, 32, 67,114, 97,115,104, - 32, 40,115,101,116, 32, 50, 41, 10, 98,114,107, 98,108, 97,115,116, 58, - 10, 48, 58, 97, 50, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 49, 10, 48, - 58, 97, 50, 56, 52, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 83,112, 97, 99,101, 32, 71,117,101,114,105,108,108, 97, - 10,115,112, 97, 99,101,103, 58, 10, 48, 58, 55, 48, 48, 55, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10,114,101,122,111,110, 58, 10,114,101,122,111, - 110,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,101,122,111,110, 32, - 40, 84, 97,105,116,111, 41, 10, 48, 58, 50, 48, 49, 99, 54, 54, 58, 54, - 51, 58, 48, 51, 58, 50, 48, 10, 48, 58, 50, 48, 49, 56, 98, 97, 58, 50, - 58, 48, 51, 58,101, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112, - 117,115,104,109, 97,110, 46, 99, 32, 10,112,117,115,104,109, 97,110, 58, - 10,112,117,115,104,109, 97,110,115, 58, 10,112,117,115,104,109, 97,110, - 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 80,117,115,104,109, 97,110, - 32, 40, 75,111,114,101, 97, 44, 32,115,101,116, 32, 50, 41, 10,112,117, - 115,104,109, 97,110,116, 58, 10, 48, 58,102,102, 99, 54, 57, 48, 58, 53, - 48, 58, 48, 48, 58, 52, 49, 10, 48, 58,102,102, 99, 99, 50, 97, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10,108,103,116,110,102,103,104,116, 58, 10, - 116,114,105,103,111,110, 58, 10,108,103,116,110,102,103,104,116,117, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42,108,105,103,104,116,110,105,110,103, - 32,102,105,103,104,116,101,114,115, 32, 40,117,115, 41, 10,108,103,116, - 110,102,103,104,116, 97, 58, 10, 48, 58, 57, 48, 52, 48, 48, 58, 53, 48, - 58, 52, 49, 58, 53, 48, 10, 48, 58, 57, 48, 49, 50, 48, 58, 52, 58, 48, - 48, 58, 54, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 66,114,111,110,120, - 32, 10, 98,114,111,110,120, 58, 10, 48, 58,101, 49,100, 97, 58, 50, 56, - 58, 48, 58, 52, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,101, - 114,111,102,103,116, 46, 99, 32, 40,107, 97,114, 97,116,101, 32, 98,108, - 97,122,101,114,115, 32, 40,119,111,114,108,100, 63, 32, 38, 32,117,115, - 41, 41, 10,107, 97,114, 97,116, 98,108,122, 58, 10,107, 97,114, 97,116, - 98,108,122,117, 58, 10,107, 97,114, 97,116, 98,108,122,106, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 75, 97,114, 97,116,101, 32, 66,108, 97,122, - 101,114,115, 32, 40, 74, 97,112, 97,110, 41, 10,107, 97,114, 97,116, 98, - 108,122, 98,108, 58, 10,107, 97,114, 97,116, 98,108,122, 97, 58, 10, 48, - 58, 99, 53, 98, 97, 55, 58, 51, 49, 58, 48, 48, 58, 50, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, - 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102, - 105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, - 46, 57, 49, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111, - 119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 116, 32, 54, 44, 32,106, 97,112, 97,110, 44, 32, 56, 55, 53, 49, 32, 51, + 49, 55, 45, 48, 48, 55, 55, 41, 13, 10, 97,108,116, 98,101, 97,115,116, + 106, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,108,116,101,114,101, + 100, 32, 98,101, 97,115,116, 32, 40,115,101,116, 32, 49, 44, 32,106, 97, + 112, 97,110, 44, 32,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 48, + 54, 53, 41, 13, 10, 97,108,116, 98,101, 97,115,116, 54, 58, 13, 10, 97, + 108,116, 98,101, 97,115,116, 98,108, 58, 13, 10, 97,108,116, 98,101, 97, + 115,116, 53,100, 58, 13, 10, 97,108,116, 98,101, 97,115,116,106, 51,100, + 58, 13, 10, 48, 58,102,102,102, 99, 48, 48, 58, 55, 52, 58, 48, 48, 58, + 51, 51, 13, 10, 48, 58,102,102,102, 48, 49, 48, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,108,117,110, 97,114, + 32, 98, 97,116,116,108,101, 32, 40,112,114,111,116,111,116,121,112,101, + 44,108, 97,116,101,114, 41, 13, 10,108,117,110, 97,114, 98, 97,116, 58, + 13, 10, 48, 58, 52, 50, 98, 58, 50,100, 58, 53, 48, 58, 48, 51, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,114, 97, 99,107, 32, 43, 32,114,111, + 108,108, 13, 10,114, 97, 99,107,110,114,111,108, 58, 13, 10, 48, 58, 49, + 100, 98, 56, 58, 52, 53, 58, 50, 51, 58, 49, 51, 13, 10, 13, 10,103,114, + 97,118,105,116, 97,114, 58, 13, 10,103,114, 97,118,105,116, 97,114, 50, + 58, 13, 10,103,114, 97,118,112, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 103,114, 97,118,105,116, 97,114, 32, 40,112,114,111,116,111,116,121,112, + 101, 41, 13, 10,103,114, 97,118,105,116, 97,114, 49, 58, 13, 10, 48, 58, + 52, 49,101, 58, 51, 48, 58, 53, 48, 58, 48, 53, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,109,105,115,115,105,108,101, 46, 99, 13, 10, + 109,105,115,115,105,108,101, 50, 58, 13, 10,115,117,112,114,109, 97,116, + 107, 58, 13, 10,109,105,115,115,105,108,101, 58, 13, 10,115,117,112,114, + 109, 97,116,107,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,117,112, + 101,114, 32,109,105,115,115,105,108,101, 32, 97,116,116, 97, 99,107, 32, + 40,110,111,116, 32,101,110, 99,114,121,112,116,101,100, 41, 13, 10, 48, + 58, 48, 48, 50, 99, 58, 51, 48, 58, 52, 55, 58, 48, 48, 13, 10, 13, 10, + 59, 40,109,105,115,115,105,108,101, 32, 99,111,109,109, 97,110,100, 32, + 40,115,101,116, 32, 50, 41, 41, 32, 99,108,111,110,101, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 32, 45, 32,109,111,100,105,102,105,101, + 100, 32,104,105,115, 99,111,114,101, 32,115, 97,118,101, 13, 10,109,105, + 115,115,105,108,101, 49, 58, 13, 10, 48, 58, 48, 48, 50, 99, 58, 51, 48, + 58, 52, 68, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 119, 97,108,108, 32, 99,114, 97,115,104, 13, 10,119, 97,108,108, 99, 58, + 13, 10,119, 97,108,108, 99, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 87, 97,108,108, 32, 67,114, 97,115,104, 32, 40,115,101,116, 32, 50, 41, + 13, 10, 98,114,107, 98,108, 97,115,116, 58, 13, 10, 48, 58, 97, 50, 48, + 48, 58, 50, 56, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 97, 50, 56, 52, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 83,112, 97, 99,101, 32, 71,117,101,114,105,108,108, 97, 13, 10,115, + 112, 97, 99,101,103, 58, 13, 10, 48, 58, 55, 48, 48, 55, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,114,101,122,111,110, 58, 13, 10,114,101, + 122,111,110,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 82,101,122,111, + 110, 32, 40, 84, 97,105,116,111, 41, 13, 10, 48, 58, 50, 48, 49, 99, 54, + 54, 58, 54, 51, 58, 48, 51, 58, 50, 48, 13, 10, 48, 58, 50, 48, 49, 56, + 98, 97, 58, 50, 58, 48, 51, 58,101, 56, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,112,117,115,104,109, 97,110, 46, 99, 13, 10,112,117, + 115,104,109, 97,110, 58, 13, 10,112,117,115,104,109, 97,110,115, 58, 13, + 10,112,117,115,104,109, 97,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 80,117,115,104,109, 97,110, 32, 40, 75,111,114,101, 97, 44, 32,115, + 101,116, 32, 50, 41, 13, 10,112,117,115,104,109, 97,110,116, 58, 13, 10, + 48, 58,102,102, 99, 54, 57, 48, 58, 53, 48, 58, 48, 48, 58, 52, 49, 13, + 10, 48, 58,102,102, 99, 99, 50, 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,108,103,116,110,102,103,104,116, 58, 13, 10,116,114,105,103, + 111,110, 58, 13, 10,108,103,116,110,102,103,104,116,117, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,108,105,103,104,116,110,105,110,103, 32,102,105, + 103,104,116,101,114,115, 32, 40,117,115, 41, 13, 10,108,103,116,110,102, + 103,104,116, 97, 58, 13, 10, 48, 58, 57, 48, 52, 48, 48, 58, 53, 48, 58, + 52, 49, 58, 53, 48, 13, 10, 48, 58, 57, 48, 49, 50, 48, 58, 52, 58, 48, + 48, 58, 54, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 66,114,111, + 110,120, 13, 10, 98,114,111,110,120, 58, 13, 10, 48, 58,101, 49,100, 97, + 58, 50, 56, 58, 48, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 97,101,114,111,102,103,116, 46, 99, 32, 40,107, 97,114, 97, + 116,101, 32, 98,108, 97,122,101,114,115, 32, 40,119,111,114,108,100, 63, + 32, 38, 32,117,115, 41, 41, 13, 10,107, 97,114, 97,116, 98,108,122, 58, + 13, 10,107, 97,114, 97,116, 98,108,122,117, 58, 13, 10,107, 97,114, 97, + 116, 98,108,122,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75, 97,114, + 97,116,101, 32, 66,108, 97,122,101,114,115, 32, 40, 74, 97,112, 97,110, + 41, 13, 10,107, 97,114, 97,116, 98,108,122, 98,108, 58, 13, 10,107, 97, + 114, 97,116, 98,108,122, 97, 58, 13, 10, 48, 58, 99, 53, 98, 97, 55, 58, + 51, 49, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, 32, + 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97, + 108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 57, 49, 32, + 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, + 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 75,105, 99,107, 32, 66,111,121, - 10,107,105, 99,107, 98,111,121, 58, 10, 48, 58, 57, 51, 51, 56, 58, 51, - 58, 56, 56, 58, 48, 50, 10, 48, 58, 57, 51, 52, 48, 58, 50, 51, 58, 56, - 56, 58, 53, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 68, 97, 99,104,111, - 108,101,114, 10,100, 97, 99,104,111,108,101,114, 58, 10, 48, 58, 57, 51, - 51, 99, 58, 50, 51, 58, 56, 56, 58, 53, 52, 10, 48, 58, 57, 51, 51, 52, - 58, 51, 58, 56, 56, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 99,108,115,104,114,111, 97,100, 46, 99, 32, 40, 99,108, 97,115,104, 32, - 114,111, 97,100, 41, 10, 99,108,115,104,114,111, 97,100, 58, 10, 99,108, - 115,104,114,111, 97,100,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67, - 108, 97,115,104, 45, 82,111, 97,100, 32, 40, 83,116, 97,116,117,115, 32, - 108,105, 99,101,110,115,101, 41, 10, 99,108,115,104,114,111, 97,100,100, - 58, 10, 48, 58, 56, 48, 48, 48, 58, 51, 99, 58, 52,100, 58, 48, 48, 10, - 48, 58, 56, 48, 51, 97, 58, 49, 58, 52, 48, 58, 52, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, 32, 40,118, - 97,110, 32,118, 97,110, 32, 99, 97,114, 41, 10,118, 97,110,118, 97,110, - 58, 10,118, 97,110,118, 97,110,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 75,105, 99,107, 32, 66,111,121, 13, + 10,107,105, 99,107, 98,111,121, 58, 13, 10, 48, 58, 57, 51, 51, 56, 58, + 51, 58, 56, 56, 58, 48, 50, 13, 10, 48, 58, 57, 51, 52, 48, 58, 50, 51, + 58, 56, 56, 58, 53, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 68, + 97, 99,104,111,108,101,114, 13, 10,100, 97, 99,104,111,108,101,114, 58, + 13, 10, 48, 58, 57, 51, 51, 99, 58, 50, 51, 58, 56, 56, 58, 53, 52, 13, + 10, 48, 58, 57, 51, 51, 52, 58, 51, 58, 56, 56, 58, 48, 50, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,108,115,104,114,111, 97,100, 46, + 99, 32, 40, 99,108, 97,115,104, 32,114,111, 97,100, 41, 13, 10, 99,108, + 115,104,114,111, 97,100, 58, 13, 10, 99,108,115,104,114,111, 97,100,115, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,108, 97,115,104, 45, 82,111, + 97,100, 32, 40, 83,116, 97,116,117,115, 32,108,105, 99,101,110,115,101, + 41, 13, 10, 99,108,115,104,114,111, 97,100,100, 58, 13, 10, 48, 58, 56, + 48, 48, 48, 58, 51, 99, 58, 52,100, 58, 48, 48, 13, 10, 48, 58, 56, 48, + 51, 97, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, 32, 40,118, 97,110, + 32,118, 97,110, 32, 99, 97,114, 41, 13, 10,118, 97,110,118, 97,110, 58, + 13, 10,118, 97,110,118, 97,110,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,118, 97,110, 45,118, 97,110, 32, 99, 97,114, 32, 40,107, 97,114, 97, - 116,101, 99,111, 41, 10,118, 97,110,118, 97,110, 98, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 86, 97,110, 45, 86, 97,110, 32, 67, 97,114, 32, 40, - 115,101,116, 32, 51, 41, 10, 48, 58, 52, 56, 48, 57, 58, 54, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52, 99, 54, 48, 58,102, 48, 58, 48, 48, 58, 48, - 48, 10, 10, 59,115,104,111,116, 32,114,105,100,101,114, 32, 40, 98,121, - 32,116, 97,109,112,104, 97,120, 41, 10,115,104,116,114,105,100,101,114, - 58, 10,115,104,116,114,105,100,101,114, 97, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42,115,104,111,116, 32,114,105,100,101,114, 32, 40,115,105,103, - 109, 97, 32,108,105, 99,101,110,115,101, 41, 10,115,104,116,114,105,100, - 101,114, 98, 58, 10, 48, 58,101, 48, 49, 51, 58, 50,100, 58, 48, 48, 58, - 52,100, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,111,116,104,117,110, - 100,101,114, 46, 99, 32, 40,111,112,101,114, 97,116,105,111,110, 32,116, - 104,117,110,100,101,114, 98,111,108,116, 41, 10,111,116,104,117,110,100, - 101,114, 58, 10,111,116,104,117,110,100,101,114,117, 58, 10,111,116,104, - 117,110,100,101,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 79,112, - 101,114, 97,116,105,111,110, 32, 84,104,117,110,100,101,114, 98,111,108, - 116, 32, 40, 74, 97,112, 97,110, 41, 10,111,116,104,117,110,100,101,114, - 117,111, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 79,112,101,114, 97,116, - 105,111,110, 32, 84,104,117,110,100,101,114, 98,111,108,116, 32, 40,117, - 115, 44,111,108,100,101,114, 41, 10, 48, 58, 56, 51, 57, 99, 97, 58, 52, - 51, 56, 58, 52,101, 58, 48, 48, 10, 48, 58, 56, 51,100,100, 57, 58, 49, - 58, 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 71,114,101, - 97,116, 32, 49, 48, 48, 48, 32, 77,105,108,101,115, 32, 82, 97,108,108, - 121, 32, 50, 32, 85, 83, 65, 32, 40, 57, 53, 47, 48, 53, 47, 49, 56, 41, - 10,103,116,109,114, 50,117, 58, 10, 48, 58, 49, 48, 51, 98, 51, 52, 58, - 98, 54, 50, 58, 53, 57, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,112,111,112,101,121,101, 46, 99, 32, 40,112,111,112,101,121,101, - 32, 98,111,111,116,108,101,103, 32,102,105,120,101,100, 41, 10,112,111, - 112,101,121,101, 98,108, 58, 10, 48, 58, 56, 50, 48, 48, 58, 50, 52, 58, - 48, 48, 58, 48, 50, 10, 48, 58, 56,102,101,100, 58, 51, 58, 48, 48, 58, - 48, 51, 10, 48, 58, 56,102, 51, 50, 58, 54, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 32,118,111,108,108, - 101,121, 32, 40,106, 97,112, 97,110, 41, 10,115,118,111,108,108,101,121, - 58, 10,115,118,111,108,108,101,121,107, 58, 10,115,118,111,108,108,101, - 121,117, 58, 10, 48, 58, 54, 48, 53, 49, 50, 58, 52, 56, 58, 48, 48, 58, - 48, 53, 10, 10,112,111,112,101,121,101,102, 58, 10, 48, 58, 56, 97, 48, - 48, 58, 50, 52, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56,102,101,100, 58, - 51, 58, 48, 48, 58, 48, 50, 10, 48, 58, 56,102, 51, 50, 58, 54, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,112, - 101,121,101, 46, 99, 32, 40,112,111,112,101,121,101, 32, 40,114,101,118, - 105,115,105,111,110, 32,100, 32, 38, 32,114,101,118,105,115,105,111,110, - 32,100, 32,110,111,116, 32,112,114,111,116,101, 99,116,101,100, 32, 38, - 32,114,101,118,105,115,105,111,110, 32,102, 41, 41,102,105,120,101,100, - 10,112,111,112,101,121,101, 58, 10,112,111,112,101,121,101,117, 58, 10, - 48, 58, 56, 97, 48, 48, 58, 50, 52, 58, 48, 48, 58, 48, 50, 10, 48, 58, - 56,102,101,100, 58, 51, 58, 48, 48, 58, 48, 51, 10, 48, 58, 56,102, 51, - 50, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, 59, 80,117,122,122,108,101, - 32, 66,111, 98, 98,108,101, 32, 40, 74, 97,112, 97,110, 44, 32, 66, 45, - 83,121,115,116,101,109, 41, 32, 45, 32, 40, 66,121, 32, 65,110,100,114, - 101, 97, 32, 84,114, 97,115, 97,116,116,105, 41, 10,112, 98,111, 98, 98, - 108,101, 58, 10, 48, 58, 57, 48, 55, 48, 49, 48, 58, 51, 54, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,116,117,114, 98,111, 32, - 111,117,116, 32,114,117,110, 32, 40,115,101,116, 32, 50, 44, 32,117,112, - 114,105,103,104,116, 44, 32, 51, 49, 55, 45,117,110,107,110,111,119,110, - 41, 40, 98,111,116,104, 32,102,105,120,101,100, 41, 32, 10,116,111,117, - 116,114,117,110, 97, 58, 10,116,111,117,116,114,117,110,117, 58, 32, 32, - 59, 42, 42, 42, 42, 42, 42, 32,116,117,114, 98,111, 32,111,117,116, 32, - 114,117,110, 32, 40,115,101,116, 32, 51, 44,117,112,103,114, 97,100,101, - 32,107,105,116, 44, 32, 51, 49, 55, 45, 48, 49, 49, 56, 41, 10,116,111, - 117,116,114,117,110, 49, 58, 10,116,111,117,116,114,117,110, 50, 58, 10, - 116,111,117,116,114,117,110, 58, 10,116,111,117,116,114,117,110, 51, 58, - 10,116,111,117,116,114,117,110,106, 58, 10,116,111,117,116,114,117,110, - 106, 49, 58, 10,116,111,117,116,114,117,110, 51,100, 58, 10,116,111,117, - 116,114,117,110,100, 58, 10,116,111,117,116,114,117,110,106, 49,100, 58, - 10,116,111,117,116,114,117,110,106,100, 58, 10,116,111,117,116,114,117, - 110, 50,100, 58, 10, 48, 58, 54, 48, 52, 54,101, 58, 49, 49, 56, 58, 48, - 53, 58, 50, 48, 10, 48, 58, 54, 48, 57, 48, 57, 58, 49, 58, 48, 57, 58, - 48, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111,103, - 101,111, 46, 99, 32, 40, 84,119,105,110,107,108,101, 32, 83,116, 97,114, - 32, 83,112,114,105,116,101,115, 41, 10,116,119,105,110,115,112,114,105, - 58, 10, 48, 58, 49, 48, 98, 99,102,102, 58, 55,100, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 49, 48, 98, 98, 55, 52, 58, 48, 50, 58,102,102, 58,102, - 102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 116,101, 99,111, 41, 13, 10,118, 97,110,118, 97,110, 98, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 86, 97,110, 45, 86, 97,110, 32, 67, 97,114, 32, + 40,115,101,116, 32, 51, 41, 13, 10, 48, 58, 52, 56, 48, 57, 58, 54, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 99, 54, 48, 58,102, 48, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59,115,104,111,116, 32,114,105,100,101, + 114, 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,115,104, + 116,114,105,100,101,114, 58, 13, 10,115,104,116,114,105,100,101,114, 97, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,104,111,116, 32,114,105,100, + 101,114, 32, 40,115,105,103,109, 97, 32,108,105, 99,101,110,115,101, 41, + 13, 10,115,104,116,114,105,100,101,114, 98, 58, 13, 10, 48, 58,101, 48, + 49, 51, 58, 50,100, 58, 48, 48, 58, 52,100, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,111,116,104,117,110,100,101,114, 46, 99, 32, 40, + 111,112,101,114, 97,116,105,111,110, 32,116,104,117,110,100,101,114, 98, + 111,108,116, 41, 13, 10,111,116,104,117,110,100,101,114, 58, 13, 10,111, + 116,104,117,110,100,101,114,117, 58, 13, 10,111,116,104,117,110,100,101, + 114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 79,112,101,114, 97,116, + 105,111,110, 32, 84,104,117,110,100,101,114, 98,111,108,116, 32, 40, 74, + 97,112, 97,110, 41, 13, 10,111,116,104,117,110,100,101,114,117,111, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 79,112,101,114, 97,116,105,111,110, + 32, 84,104,117,110,100,101,114, 98,111,108,116, 32, 40,117,115, 44,111, + 108,100,101,114, 41, 13, 10, 48, 58, 56, 51, 57, 99, 97, 58, 52, 51, 56, + 58, 52,101, 58, 48, 48, 13, 10, 48, 58, 56, 51,100,100, 57, 58, 49, 58, + 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 71,114, + 101, 97,116, 32, 49, 48, 48, 48, 32, 77,105,108,101,115, 32, 82, 97,108, + 108,121, 32, 50, 32, 85, 83, 65, 32, 40, 57, 53, 47, 48, 53, 47, 49, 56, + 41, 13, 10,103,116,109,114, 50,117, 58, 13, 10, 48, 58, 49, 48, 51, 98, + 51, 52, 58, 98, 54, 50, 58, 53, 57, 58, 48, 49, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,112,111,112,101,121,101, 46, 99, 32, 40,112, + 111,112,101,121,101, 32, 98,111,111,116,108,101,103, 32,102,105,120,101, + 100, 41, 13, 10,112,111,112,101,121,101, 98,108, 58, 13, 10, 48, 58, 56, + 50, 48, 48, 58, 50, 52, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58, 56,102, + 101,100, 58, 51, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58, 56,102, 51, 50, + 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42,115,117,112,101,114, 32,118,111,108,108,101,121, 32, 40,106, 97,112, + 97,110, 41, 13, 10,115,118,111,108,108,101,121, 58, 13, 10,115,118,111, + 108,108,101,121,107, 58, 13, 10,115,118,111,108,108,101,121,117, 58, 13, + 10, 48, 58, 54, 48, 53, 49, 50, 58, 52, 56, 58, 48, 48, 58, 48, 53, 13, + 10, 13, 10,112,111,112,101,121,101,102, 58, 13, 10, 48, 58, 56, 97, 48, + 48, 58, 50, 52, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 56,102,101,100, + 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58, 56,102, 51, 50, 58, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,112,111,112,101,121,101, 46, 99, 32, 40,112,111,112,101,121,101, 32, + 40,114,101,118,105,115,105,111,110, 32,100, 32, 38, 32,114,101,118,105, + 115,105,111,110, 32,100, 32,110,111,116, 32,112,114,111,116,101, 99,116, + 101,100, 32, 38, 32,114,101,118,105,115,105,111,110, 32,102, 41, 41,102, + 105,120,101,100, 13, 10,112,111,112,101,121,101, 58, 13, 10,112,111,112, + 101,121,101,117, 58, 13, 10, 48, 58, 56, 97, 48, 48, 58, 50, 52, 58, 48, + 48, 58, 48, 50, 13, 10, 48, 58, 56,102,101,100, 58, 51, 58, 48, 48, 58, + 48, 51, 13, 10, 48, 58, 56,102, 51, 50, 58, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 80,117,122,122,108,101, 32, 66,111, 98, 98,108,101, + 32, 40, 74, 97,112, 97,110, 44, 32, 66, 45, 83,121,115,116,101,109, 41, + 32, 45, 32, 40, 66,121, 32, 65,110,100,114,101, 97, 32, 84,114, 97,115, + 97,116,116,105, 41, 13, 10,112, 98,111, 98, 98,108,101, 58, 13, 10, 48, + 58, 57, 48, 55, 48, 49, 48, 58, 51, 54, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,116,117,114, 98,111, 32,111,117,116, + 32,114,117,110, 32, 40,115,101,116, 32, 50, 44, 32,117,112,114,105,103, + 104,116, 44, 32, 51, 49, 55, 45,117,110,107,110,111,119,110, 41, 40, 98, + 111,116,104, 32,102,105,120,101,100, 41, 13, 10,116,111,117,116,114,117, + 110, 97, 58, 13, 10,116,111,117,116,114,117,110,117, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 32,116,117,114, 98,111, 32,111,117,116, 32,114,117, + 110, 32, 40,115,101,116, 32, 51, 44,117,112,103,114, 97,100,101, 32,107, + 105,116, 44, 32, 51, 49, 55, 45, 48, 49, 49, 56, 41, 13, 10,116,111,117, + 116,114,117,110, 49, 58, 13, 10,116,111,117,116,114,117,110, 50, 58, 13, + 10,116,111,117,116,114,117,110, 58, 13, 10,116,111,117,116,114,117,110, + 51, 58, 13, 10,116,111,117,116,114,117,110,106, 58, 13, 10,116,111,117, + 116,114,117,110,106, 49, 58, 13, 10,116,111,117,116,114,117,110, 51,100, + 58, 13, 10,116,111,117,116,114,117,110,100, 58, 13, 10,116,111,117,116, + 114,117,110,106, 49,100, 58, 13, 10,116,111,117,116,114,117,110,106,100, + 58, 13, 10,116,111,117,116,114,117,110, 50,100, 58, 13, 10, 48, 58, 54, + 48, 52, 54,101, 58, 49, 49, 56, 58, 48, 53, 58, 50, 48, 13, 10, 48, 58, + 54, 48, 57, 48, 57, 58, 49, 58, 48, 57, 58, 48, 57, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, + 40, 84,119,105,110,107,108,101, 32, 83,116, 97,114, 32, 83,112,114,105, + 116,101,115, 41, 13, 10,116,119,105,110,115,112,114,105, 58, 13, 10, 48, + 58, 49, 48, 98, 99,102,102, 58, 55,100, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 49, 48, 98, 98, 55, 52, 58, 48, 50, 58,102,102, 58,102,102, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117, - 110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114, - 101, 95,118, 48, 46, 57, 48, 32, 97,100,100,105,116,105,111,110,115, 32, - 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, - 32, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 13, 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32, + 117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111, + 114,101, 95,118, 48, 46, 57, 48, 32, 97,100,100,105,116,105,111,110,115, + 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, + 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 10, 10, 59, 97,108,101,120,107,105,100, 97, 58, 10, - 97,108,101,120,107,105,100,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 97,108,101,120, 32,107,105,100,100, 58, 32,116,104,101, 32,108,111,115, - 116, 32,115,116, 97,114,115, 32, 40,115,101,116, 32, 49, 44,102,100, 49, - 48, 56, 57, 97, 32, 45,117,110,107,110,111,119,110, 41, 10, 97,108,101, - 120,107,105,100,100, 49, 58, 10, 48, 58,102,102,102, 99, 48, 48, 58, 51, - 56, 58, 48, 48, 58, 52, 52, 10, 48, 58,102,102,102, 48, 49, 48, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 97, 99,116, - 105,111,110, 32,102,105,103,104,116,101,114, 32, 40,102,100, 49, 48, 56, - 57, 97, 32, 51, 49, 55, 45, 48, 48, 49, 56, 41, 10, 97,102,105,103,104, - 116,101,114, 58, 10, 48, 58,102,102,102, 51, 48, 48, 58, 53, 48, 58, 48, - 48, 58, 53, 57, 10, 48, 58,102,102, 99, 48, 54, 48, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 48, 58,102,102, 99, 48, 54, 49, 58, 49, 58, 48, 54, 58, - 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42,100,117,110,107, 32,115,104, - 111,116, 32, 40,102,100, 49, 48, 56, 57, 32, 51, 49, 55, 45, 48, 48, 50, - 50, 41, 10,100,117,110,107,115,104,111,116, 58, 10,100,117,110,107,115, - 104,111,116,111, 58, 10,100,117,110,107,115,104,111,116, 97, 58, 10, 48, - 58,102,102, 51, 49, 99, 48, 58, 56, 55, 52, 58, 52, 57, 58, 48, 49, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 40, 81,117,105,122, 32, 83, - 97,110,103,111,107,117,115,104,105, 32, 40, 74, 97,112, 97,110, 41, 41, - 10,113,115, 97,110,103,111,107,117, 58, 10, 48, 58,101, 56, 49, 53, 58, - 52, 98, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 56, 54, 48, 58, 48, 51, - 58, 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 40, 83,104,105,112,112,117, 32, 77, 97,104,111,117, 32, 68, 97,105,115, - 97,107,117,115,101,110, 32, 40, 74, 97,112, 97,110, 41, 41, 10,115,104, - 105,112,112,117,109,100, 58, 10,107,105,110,103,100,109,103,112, 58, 10, - 48, 58, 49, 48, 48, 50,100, 48, 58, 57,101, 58, 48, 48, 58, 52,101, 10, - 48, 58, 49, 48, 48, 51, 99, 52, 58, 53, 51, 58, 50, 97, 58, 51, 57, 32, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,112,115, 50, 46, 99, 32, - 40, 81,117,105,122, 32, 78, 97,110, 97,105,114,111, 32, 68,114,101, 97, - 109,115, 58, 32, 78,105,106,105,105,114,111, 99,104,111,117, 32,110,111, - 32, 75,105,115,101,107,105, 32, 40, 74, 97,112, 97,110, 32, 57, 54, 48, - 56, 50, 54, 41, 41, 10,113,110,100,114,101, 97,109, 58, 10, 48, 58,102, - 102, 52, 48, 98, 51, 58,100, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, - 102, 52, 49, 56, 98, 58, 48, 50, 58, 48, 49, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 40, 83,111,110,105, 99, 32, 87,105,110, - 103,115, 32, 40, 74, 97,112, 97,110, 41, 41, 10,115,111,110,105, 99,119, - 105, 58, 10, 48, 58, 99, 99, 49, 97,102, 58, 97, 48, 58, 48, 98, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,115, 99,111, 98,114, - 97, 46, 99, 32, 40,116, 97,122,122, 45,109, 97,110,105, 97, 41, 10,116, - 97,122,109, 97,110,105, 97, 58, 10,116, 97,122,109, 97,110,105, 50, 58, - 10,116, 97,122,122,109, 97,110,103, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 84, 97,122,122, 45, 77, 97,110,105, 97, 32, 40, 71, 97,108, 97,120, - 105, 97,110, 32, 72, 97,114,100,119, 97,114,101, 41, 10,116, 97,122,122, - 109, 97,110,103, 50, 58, 10, 48, 58, 56, 48,101,102, 58, 51, 99, 58, 48, - 49, 58, 52, 99, 10, 10, 59, 42, 42, 42, 42, 42, 42,114,105,111,116, 10, - 114,105,111,116, 58, 10, 48, 58, 49, 48, 49,100, 51, 99, 58,102, 48, 58, - 54, 52, 58, 49, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42,116,104,117,110, - 100,101,114, 32, 98,108, 97,100,101, 32, 40,102,100, 49, 48, 57, 52, 32, - 51, 49, 55, 45, 48, 48, 53, 54, 41, 10,116,104,110,100,114, 98,108,100, - 58, 10,116,104,110,100,114, 98,108,100, 49, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 97,108,101,120,107,105, + 100, 97, 58, 13, 10, 97,108,101,120,107,105,100,100, 58, 32, 32, 59, 42, + 42, 42, 42, 42, 42, 97,108,101,120, 32,107,105,100,100, 58, 32,116,104, + 101, 32,108,111,115,116, 32,115,116, 97,114,115, 32, 40,115,101,116, 32, + 49, 44,102,100, 49, 48, 56, 57, 97, 32, 45,117,110,107,110,111,119,110, + 41, 13, 10, 97,108,101,120,107,105,100,100, 49, 58, 13, 10, 48, 58,102, + 102,102, 99, 48, 48, 58, 51, 56, 58, 48, 48, 58, 52, 52, 13, 10, 48, 58, + 102,102,102, 48, 49, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 97, 99,116,105,111,110, 32,102,105,103,104, + 116,101,114, 32, 40,102,100, 49, 48, 56, 57, 97, 32, 51, 49, 55, 45, 48, + 48, 49, 56, 41, 13, 10, 97,102,105,103,104,116,101,114, 58, 13, 10, 48, + 58,102,102,102, 51, 48, 48, 58, 53, 48, 58, 48, 48, 58, 53, 57, 13, 10, + 48, 58,102,102, 99, 48, 54, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,102,102, 99, 48, 54, 49, 58, 49, 58, 48, 54, 58, 48, 54, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,100,117,110,107, 32,115,104,111,116, + 32, 40,102,100, 49, 48, 56, 57, 32, 51, 49, 55, 45, 48, 48, 50, 50, 41, + 13, 10,100,117,110,107,115,104,111,116, 58, 13, 10,100,117,110,107,115, + 104,111,116,111, 58, 13, 10,100,117,110,107,115,104,111,116, 97, 58, 13, + 10, 48, 58,102,102, 51, 49, 99, 48, 58, 56, 55, 52, 58, 52, 57, 58, 48, + 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 40, 81,117, + 105,122, 32, 83, 97,110,103,111,107,117,115,104,105, 32, 40, 74, 97,112, + 97,110, 41, 41, 13, 10,113,115, 97,110,103,111,107,117, 58, 13, 10, 48, + 58,101, 56, 49, 53, 58, 52, 98, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 56, 54, 48, 58, 48, 51, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 40, 83,104,105,112,112,117, 32, 77, + 97,104,111,117, 32, 68, 97,105,115, 97,107,117,115,101,110, 32, 40, 74, + 97,112, 97,110, 41, 41, 13, 10,115,104,105,112,112,117,109,100, 58, 13, + 10,107,105,110,103,100,109,103,112, 58, 13, 10, 48, 58, 49, 48, 48, 50, + 100, 48, 58, 57,101, 58, 48, 48, 58, 52,101, 13, 10, 48, 58, 49, 48, 48, + 51, 99, 52, 58, 53, 51, 58, 50, 97, 58, 51, 57, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 99,112,115, 50, 46, 99, 32, 40, 81,117,105, + 122, 32, 78, 97,110, 97,105,114,111, 32, 68,114,101, 97,109,115, 58, 32, + 78,105,106,105,105,114,111, 99,104,111,117, 32,110,111, 32, 75,105,115, + 101,107,105, 32, 40, 74, 97,112, 97,110, 32, 57, 54, 48, 56, 50, 54, 41, + 41, 13, 10,113,110,100,114,101, 97,109, 58, 13, 10, 48, 58,102,102, 52, + 48, 98, 51, 58,100, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, + 52, 49, 56, 98, 58, 48, 50, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 40, 83,111,110,105, 99, 32, 87,105, + 110,103,115, 32, 40, 74, 97,112, 97,110, 41, 41, 13, 10,115,111,110,105, + 99,119,105, 58, 13, 10, 48, 58, 99, 99, 49, 97,102, 58, 97, 48, 58, 48, + 98, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 115, 99,111, 98,114, 97, 46, 99, 32, 40,116, 97,122,122, 45,109, 97,110, + 105, 97, 41, 13, 10,116, 97,122,109, 97,110,105, 97, 58, 13, 10,116, 97, + 122,109, 97,110,105, 50, 58, 13, 10,116, 97,122,122,109, 97,110,103, 58, + 32, 32, 59, 42, 42, 42, 42, 42, 42, 84, 97,122,122, 45, 77, 97,110,105, + 97, 32, 40, 71, 97,108, 97,120,105, 97,110, 32, 72, 97,114,100,119, 97, + 114,101, 41, 13, 10,116, 97,122,122,109, 97,110,103, 50, 58, 13, 10, 48, + 58, 56, 48,101,102, 58, 51, 99, 58, 48, 49, 58, 52, 99, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42,114,105,111,116, 13, 10,114,105,111,116, 58, + 13, 10, 48, 58, 49, 48, 49,100, 51, 99, 58,102, 48, 58, 54, 52, 58, 49, + 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101, + 114, 32, 98,108, 97,100,101, 32, 40,102,100, 49, 48, 57, 52, 32, 51, 49, + 55, 45, 48, 48, 53, 54, 41, 13, 10,116,104,110,100,114, 98,108,100, 58, + 13, 10,116,104,110,100,114, 98,108,100, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101,114, 32, 98,108, 97,100,101, 32, 40, - 106, 97,112, 97,110, 41, 10,116,104,110,100,114, 98,108,100,100, 58, 10, - 48, 58, 97, 51, 98, 48, 48, 58, 54, 52, 58, 48, 49, 58, 48, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, 50, 46, 99, 32, - 40, 98,108,111,120,101,101,100, 32, 40, 99, 32,115,121,115,116,101,109, - 41, 41, 10, 98,108,111,120,101,101,100, 99, 58, 10, 98,108,111,120,101, - 101,100,117, 58, 10, 98,108,111,120,101,101,100, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42, 98,108,111,120,101,101,100, 32, 40,106, 97,112, 97,110, - 44,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 51, 57, 41, 10, - 98,108,111,120,101,101,100,100, 58, 10, 48, 58,102,102,102, 52, 48, 97, - 58, 54, 52, 58, 53, 51, 58, 48, 56, 10, 48, 58,102,102,102, 48, 56, 50, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,115,102, 49, 46, 99, 10, 59,115,102, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42,115,116,114,101,101,116, 32,102,105,103,104,116,101,114, 32, 40, - 119,111,114,108,100, 41, 10,115,102, 97,110, 58, 10, 48, 58,102,102, 57, - 52,102, 50, 58, 57, 67, 58, 48, 48, 58, 49, 50, 10, 48, 58,102,102, 56, - 55, 51, 50, 58, 56, 58, 48, 48, 58, 48, 48, 10, 10,115,102,106, 58, 10, - 115,102,117, 58, 10,115,102, 58, 10,115,102,117, 97, 58, 10, 48, 58,102, - 102, 56,101, 55, 50, 58, 57, 67, 58, 48, 48, 58, 49, 50, 10, 48, 58,102, - 102, 99, 48, 49, 50, 58, 56, 58, 48, 48, 58, 48, 48, 10, 10,115,102,112, - 58, 10, 48, 58,102,102, 57, 52, 57, 56, 58, 57, 67, 58, 48, 48, 58, 49, - 50, 10, 48, 58,102,102, 56,100, 49, 56, 58, 56, 58, 48, 48, 58, 48, 48, - 10, 10,119,114,101,115,116,119, 97,114, 58, 10,119,114,101,115,116,119, - 97,114, 49, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,114,101,115,116, - 108,101, 32, 87, 97,114, 32, 40, 70, 68, 49, 48, 57, 52, 44, 32, 51, 49, - 55, 45, 48, 49, 48, 50, 41, 10,119,114,101,115,116,119, 97,114, 50, 58, - 10,119,114,101,115,116,119, 97,114, 49,100, 58, 10,119,114,101,115,116, - 119, 97,114, 50,100, 58, 10, 48, 58,102,102,102, 56, 48, 48, 58, 97, 48, - 58, 48, 48, 58, 97, 48, 10, 48, 58,102,102,101, 48, 52, 52, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 68,101,115,101, - 114,116, 32, 66,114,101, 97,107,101,114, 32, 40, 70, 68, 49, 48, 57, 52, - 32, 51, 49, 55, 45, 48, 49, 57, 54, 41, 10,100, 98,114,107,114, 58, 10, - 48, 58,102,102, 51, 52, 49, 56, 58, 49, 58, 49, 97, 58, 49, 97, 10, 48, - 58,102,102, 51, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, 56, 10, 48, 58, - 102,102, 98, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, 56, 10, 48, 58,102, - 102,102, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, 56, 10, 48, 58,102,102, - 55, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, 56, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 82, 97, 99,105,110,103, 32, 72,101,114,111, 32, 40, 70, 68, - 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 52, 52, 41, 10,114, 97, 99, - 104,101,114,111, 58, 10,114, 97, 99,104,101,114,111,100, 58, 10, 48, 58, - 102,102, 56, 57, 98,101, 58, 53, 49, 58, 49, 48, 58, 48, 49, 10, 48, 58, - 102,102, 56, 57, 97,101, 58, 52, 58, 49, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 98,108,111,111,100, 98,114,111, 46, 99, 10, - 98,108,111,111,100, 98,114,111, 58, 10,119,101,115,116,115,116,114,121, - 58, 10, 98,108,111,111,100, 98,114,111, 97, 58, 32, 32, 59, 42, 42, 42, + 106, 97,112, 97,110, 41, 13, 10,116,104,110,100,114, 98,108,100,100, 58, + 13, 10, 48, 58, 97, 51, 98, 48, 48, 58, 54, 52, 58, 48, 49, 58, 48, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, + 50, 46, 99, 32, 40, 98,108,111,120,101,101,100, 32, 40, 99, 32,115,121, + 115,116,101,109, 41, 41, 13, 10, 98,108,111,120,101,101,100, 99, 58, 13, + 10, 98,108,111,120,101,101,100,117, 58, 13, 10, 98,108,111,120,101,101, + 100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 98,108,111,120,101,101,100, + 32, 40,106, 97,112, 97,110, 44,102,100, 49, 48, 57, 52, 32, 51, 49, 55, + 45, 48, 49, 51, 57, 41, 13, 10, 98,108,111,120,101,101,100,100, 58, 13, + 10, 48, 58,102,102,102, 52, 48, 97, 58, 54, 52, 58, 53, 51, 58, 48, 56, + 13, 10, 48, 58,102,102,102, 48, 56, 50, 58, 49, 58, 48, 49, 58, 48, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,102, 49, 46, 99, + 13, 10, 59,115,102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115,116,114, + 101,101,116, 32,102,105,103,104,116,101,114, 32, 40,119,111,114,108,100, + 41, 13, 10,115,102, 97,110, 58, 13, 10, 48, 58,102,102, 57, 52,102, 50, + 58, 57, 67, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58,102,102, 56, 55, 51, + 50, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,102,106, 58, 13, + 10,115,102,117, 58, 13, 10,115,102, 58, 13, 10,115,102,117, 97, 58, 13, + 10, 48, 58,102,102, 56,101, 55, 50, 58, 57, 67, 58, 48, 48, 58, 49, 50, + 13, 10, 48, 58,102,102, 99, 48, 49, 50, 58, 56, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,115,102,112, 58, 13, 10, 48, 58,102,102, 57, 52, 57, 56, + 58, 57, 67, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58,102,102, 56,100, 49, + 56, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,119,114,101,115,116, + 119, 97,114, 58, 13, 10,119,114,101,115,116,119, 97,114, 49, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42, 87,114,101,115,116,108,101, 32, 87, 97,114, + 32, 40, 70, 68, 49, 48, 57, 52, 44, 32, 51, 49, 55, 45, 48, 49, 48, 50, + 41, 13, 10,119,114,101,115,116,119, 97,114, 50, 58, 13, 10,119,114,101, + 115,116,119, 97,114, 49,100, 58, 13, 10,119,114,101,115,116,119, 97,114, + 50,100, 58, 13, 10, 48, 58,102,102,102, 56, 48, 48, 58, 97, 48, 58, 48, + 48, 58, 97, 48, 13, 10, 48, 58,102,102,101, 48, 52, 52, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 68,101,115, + 101,114,116, 32, 66,114,101, 97,107,101,114, 32, 40, 70, 68, 49, 48, 57, + 52, 32, 51, 49, 55, 45, 48, 49, 57, 54, 41, 13, 10,100, 98,114,107,114, + 58, 13, 10, 48, 58,102,102, 51, 52, 49, 56, 58, 49, 58, 49, 97, 58, 49, + 97, 13, 10, 48, 58,102,102, 51, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, + 56, 13, 10, 48, 58,102,102, 98, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, + 56, 13, 10, 48, 58,102,102,102, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, + 56, 13, 10, 48, 58,102,102, 55, 98, 48, 50, 58, 52, 58, 48, 48, 58,101, + 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 82, 97, 99,105,110,103, + 32, 72,101,114,111, 32, 40, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, + 48, 49, 52, 52, 41, 13, 10,114, 97, 99,104,101,114,111, 58, 13, 10,114, + 97, 99,104,101,114,111,100, 58, 13, 10, 48, 58,102,102, 56, 57, 98,101, + 58, 53, 49, 58, 49, 48, 58, 48, 49, 13, 10, 48, 58,102,102, 56, 57, 97, + 101, 58, 52, 58, 49, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 98,108,111,111,100, 98,114,111, 46, 99, 13, 10, 98,108, + 111,111,100, 98,114,111, 58, 13, 10,119,101,115,116,115,116,114,121, 58, + 13, 10, 98,108,111,111,100, 98,114,111, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 66,108,111,111,100, 32, 66,114,111,115, 46, 32, 40,115,101, - 116, 32, 50, 41, 10, 98,108,111,111,100, 98,114,111, 98, 58, 10, 48, 58, - 56, 53, 98, 49,102, 58,102, 57, 58, 51, 48, 58, 48, 48, 10, 48, 58, 56, - 53, 99, 49, 53, 58, 49, 58, 48, 50, 58, 48, 50, 10, 10, 59, 42, 42, 42, - 42, 42, 42,115, 99,111,114,112,105,111,110, 32, 40,115,101,116, 32, 49, - 41, 10,115, 99,111,114,112,105,111,110, 58, 10,115, 99,111,114,112,105, - 111,110,109, 99, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,115, 99,111,114, - 112,105,111,110, 32, 40,109,111,111,110, 32, 99,114,101,115,116, 97, 32, - 104, 97,114,100,119, 97,114,101, 41, 10,115, 99,111,114,112,105,111,110, - 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, 99,111,112,114,105,111, - 110, 32, 40,115,101,116, 32, 50, 41, 10,115, 99,111,114,112,105,111,110, - 98, 58, 10, 97,114, 97, 99,110,105,115, 58, 10, 48, 58, 52, 50, 48, 55, - 58,102, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 50, 97,100, 58,102, 58, - 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,116,101, - 101,108, 32,103,117,110,110,101,114, 10,115,103,117,110,110,101,114, 58, - 10,115,103,117,110,110,101,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 83,116,101,101,108, 32, 71,117,110,110,101,114, 32, 40, 74, 97,112, - 97,110, 41, 10, 48, 58, 49, 48, 48, 49, 56,102, 58, 98, 98, 58, 48, 48, - 58, 52,102, 10, 48, 58, 49, 48, 48, 49, 54, 53, 58, 98, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 49, 48, 48, 49, 54, 57, 58, 49, 58, 48, 52, 58, 48, - 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 50, - 46, 99, 32, 40,111,114,100,121,110,101, 32, 40,106, 97,112, 97,110, 41, - 41, 10,111,114,100,121,110,101,106, 58, 10,111,114,100,121,110,101, 58, - 32, 32, 59, 42, 42, 42, 42, 42, 42, 79,114,100,121,110,101, 32, 40, 74, - 97,112, 97,110, 41, 10, 48, 58, 49, 48, 48, 55, 49, 50, 58, 50, 56, 58, - 48, 48, 58, 48, 51, 10, 48, 58, 52, 48, 57, 50, 53, 99, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,108,117, - 99,107,121, 32, 38, 32,119,105,108,100, 41, 10,108,117, 99,107,121,119, - 108,100, 58, 10,108,117, 99,107,121,119,108,100,106, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 76,117, 99,107,121, 32, 38, 32, 87,105,108,100, 32, - 40, 74, 97,112, 97,110, 41, 10, 48, 58, 49, 48, 48, 98, 48, 48, 58, 97, - 48, 58, 48, 48, 58, 48, 50, 10, 10,104,117,110, 99,104,111,108,121, 58, - 10,104,110, 99,104,111,108,109,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 72,117,110, 99,104, 98, 97, 99,107, 32, 79,108,121,109,112,105, 99, - 32, 40, 83, 99,114, 97,109, 98,108,101, 32,104, 97,114,100,119, 97,114, - 101, 41, 10, 48, 58, 51, 99, 48, 56, 58, 49, 50, 58, 48, 48, 58, 51, 48, - 10, 10,104,101,114, 98,105,101,100,107, 58, 10, 48, 58, 51, 99, 50, 50, - 58, 49, 98, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 99, 50, 48, 58, 49, - 58, 49, 56, 58, 49, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 121,115,116,101,109, 49, 54, 46, 99, 32, 40,102,108, 97,115,104, 32,112, - 111,105,110,116, 32, 40, 98,111,111,116,108,101,103, 41, 41, 10,102,112, - 111,105,110,116, 98,108, 58, 10,102,112,111,105,110,116, 98,106, 58, 32, - 32, 59, 42, 42, 42, 42, 42, 42,102,108, 97,115,104, 32,112,111,105,110, - 116, 32, 40,106, 97,112, 97,110, 44, 98,111,111,116,108,101,103, 41, 10, - 48, 58,102,102,101, 99, 54,101, 58, 54, 52, 58, 48, 48, 58, 48, 48, 10, - 48, 58,102,102,102, 48, 48, 48, 58, 57, 49, 48, 58, 48, 48, 58, 48, 48, - 10, 48, 58,102,102,101, 48, 56, 51, 58, 49, 58, 51, 51, 58, 51, 51, 10, - 10,102,112,111,105,110,116, 58, 10,102,112,111,105,110,116, 49,100, 58, - 10,102,112,111,105,110,116,100, 58, 10, 48, 58,102,102,101, 99, 54,100, - 58, 54, 53, 58, 48, 56, 58, 48, 49, 10, 48, 58,102,102,102, 48, 48, 48, - 58, 57, 49, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,101, 48, 56, - 51, 58, 49, 58, 51, 51, 58, 51, 51, 10, 10,102,112,111,105,110,116, 49, - 58, 10, 48, 58,102,102,101, 99, 54,100, 58, 54, 53, 58, 48, 56, 58, 48, - 49, 10, 48, 58,102,102,102, 48, 48, 48, 58, 57, 49, 48, 58, 48, 48, 58, - 48, 48, 10, 48, 58,102,102,101, 48, 56, 51, 58, 49, 58, 51, 51, 58, 51, - 51, 10, 10, 59, 42, 42, 42, 42, 42, 42,109,105, 99,104, 97,101,108, 32, - 106, 97, 99,107,115,111,110,115, 32,109,111,111,110,119, 97,108,107,101, - 114, 32, 40,119,111,114,108,100, 44,102,100, 49, 48, 57, 52, 47, 56, 55, - 53, 49, 32, 51, 49, 55, 45, 48, 49, 53, 57, 41, 10,109,119, 97,108,107, - 58, 10,109,119, 97,108,107,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 109,105, 99,104, 97,101,108, 32,106, 97, 99,107,115,111,110,115, 32,109, - 111,111,110,119, 97,108,107,101,114, 32, 40,117,115, 44,102,100, 49, 48, - 57, 52, 47, 56, 55, 53, 49, 32, 51, 49, 55, 45, 48, 49, 53, 56, 41, 10, - 48, 58,102,102, 51, 99, 48, 48, 58, 53, 48, 58, 48, 48, 58, 52, 97, 10, - 48, 58,102,102,101, 48, 50, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, - 109,119, 97,108,107,106, 58, 10, 48, 58,102,102, 51, 99, 48, 48, 58, 53, - 48, 58, 48, 48, 58, 52, 97, 10, 48, 58,102,102,101, 48, 50, 48, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10,109,119, 97,108,107, 98,108, 58, 10,109, - 119, 97,108,107,100, 58, 10,109,119, 97,108,107,106,100, 58, 10,109,119, - 97,108,107,117,100, 58, 10, 48, 58,102,102,102, 99, 48, 48, 58, 53, 48, - 58, 48, 48, 58, 52, 97, 10, 48, 58,102,102,101, 48, 50, 48, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 97,117,114, 97,105,108, 58, 10, 97,117,114, - 97,105,108, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 97,117,114, 97, - 105,108, 32, 40,115,101,116, 32, 50, 44,102,100, 49, 48, 56, 57, 63, 32, - 51, 49, 55, 45,117,110,107,110,111,119,110, 41, 10, 97,117,114, 97,105, - 108,106, 58, 10, 97,117,114, 97,105,108, 49,100, 58, 10, 97,117,114, 97, - 105,108,106,100, 58, 10, 48, 58,102,102,102,102, 55,101, 58, 50, 55, 58, - 48, 48, 58, 53, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 98,111,100,121, - 32,115,108, 97,109, 32, 40, 56, 55, 53, 49, 32, 51, 49, 55, 45,117,110, - 107,110,111,119,110, 41, 32, 10, 98,111,100,121,115,108, 97,109, 58, 10, - 100,117,109,112,109,116,109,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 100,117,109,112, 32,109, 97,116,115,117,109,111,116,111, 32, 40,106, 97, - 112, 97,110, 32, 56, 55, 53, 49, 32, 51, 49, 55, 45,117,110,107,110,111, - 119,110, 41, 10, 48, 58,102,102,102, 99, 99, 48, 58, 51, 99, 58, 48, 48, - 58, 48, 48, 10, 48, 58,102,102,102, 99,102, 97, 58, 49, 58, 48, 51, 58, - 48, 51, 10, 10, 59, 71,111,108,100,101,110, 32, 65,120,101, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,103,111,108,100,110, 97,120,101, - 58, 10,103,111,108,100,110, 97,120, 97, 58, 32, 32, 10,103,111,108,100, - 110, 97,120,101,106, 58, 32, 32, 10,103,111,108,100,110, 97,120,101,117, - 58, 10,103,111,108,100,110, 97,120,101, 98, 50, 58, 32, 10,103,111,108, - 100,110, 97,120,101, 98, 49, 58, 10,103,111,108,100,110, 97,120,101, 49, - 58, 10,103,111,108,100,110, 97,120,101, 50, 58, 10,103,111,108,100,110, - 97,120,101, 51, 58, 10,103,111,108,100,110, 97,120,101, 49,100, 58, 10, - 103,111,108,100,110, 97,120,101, 51,100, 58, 10,103,111,108,100,110, 97, - 120,101,106,100, 58, 10,103,111,108,100,110, 97,120,101,117,100, 58, 10, - 48, 58,102,102,102, 99, 48, 48, 58, 51, 56, 58, 48, 50, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 54, 46, - 99, 32, 40,100,121,110, 97,109,105,116,101, 32,100,117,120, 32, 40, 98, - 111,111,116,108,101,103, 41, 41, 10,100,100,117,120, 98,108, 58, 10,100, - 100,117,120, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,121,110, 97,109, - 105,116,101, 32,100,117,120, 32, 40,102,100, 49, 48, 57, 52, 32, 51, 49, - 55, 45, 48, 48, 57, 54, 41, 10,100,100,117,120,106, 58, 10,100,100,117, - 120,100, 58, 10,100,100,117,120,106,100, 58, 10, 48, 58,102,102,102, 56, - 56, 48, 58, 57, 56, 58, 48, 48, 58, 50, 48, 10, 48, 58,102,102,102, 51, - 49, 98, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, + 116, 32, 50, 41, 13, 10, 98,108,111,111,100, 98,114,111, 98, 58, 13, 10, + 48, 58, 56, 53, 98, 49,102, 58,102, 57, 58, 51, 48, 58, 48, 48, 13, 10, + 48, 58, 56, 53, 99, 49, 53, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42,115, 99,111,114,112,105,111,110, 32, 40, + 115,101,116, 32, 49, 41, 13, 10,115, 99,111,114,112,105,111,110, 58, 13, + 10,115, 99,111,114,112,105,111,110,109, 99, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,115, 99,111,114,112,105,111,110, 32, 40,109,111,111,110, 32, + 99,114,101,115,116, 97, 32,104, 97,114,100,119, 97,114,101, 41, 13, 10, + 115, 99,111,114,112,105,111,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 83, 99,111,112,114,105,111,110, 32, 40,115,101,116, 32, 50, 41, 13, + 10,115, 99,111,114,112,105,111,110, 98, 58, 13, 10, 97,114, 97, 99,110, + 105,115, 58, 13, 10, 48, 58, 52, 50, 48, 55, 58,102, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 52, 50, 97,100, 58,102, 58, 49, 48, 58, 49, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,116,101,101,108, 32,103, + 117,110,110,101,114, 13, 10,115,103,117,110,110,101,114, 58, 13, 10,115, + 103,117,110,110,101,114,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, + 116,101,101,108, 32, 71,117,110,110,101,114, 32, 40, 74, 97,112, 97,110, + 41, 13, 10, 48, 58, 49, 48, 48, 49, 56,102, 58, 98, 98, 58, 48, 48, 58, + 52,102, 13, 10, 48, 58, 49, 48, 48, 49, 54, 53, 58, 98, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 49, 48, 48, 49, 54, 57, 58, 49, 58, 48, 52, 58, + 48, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99, + 111,115, 50, 46, 99, 32, 40,111,114,100,121,110,101, 32, 40,106, 97,112, + 97,110, 41, 41, 13, 10,111,114,100,121,110,101,106, 58, 13, 10,111,114, + 100,121,110,101, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 79,114,100,121, + 110,101, 32, 40, 74, 97,112, 97,110, 41, 13, 10, 48, 58, 49, 48, 48, 55, + 49, 50, 58, 50, 56, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58, 52, 48, 57, + 50, 53, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 40,108,117, 99,107,121, 32, 38, 32,119,105,108, + 100, 41, 13, 10,108,117, 99,107,121,119,108,100, 58, 13, 10,108,117, 99, + 107,121,119,108,100,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 76,117, + 99,107,121, 32, 38, 32, 87,105,108,100, 32, 40, 74, 97,112, 97,110, 41, + 13, 10, 48, 58, 49, 48, 48, 98, 48, 48, 58, 97, 48, 58, 48, 48, 58, 48, + 50, 13, 10, 13, 10,104,117,110, 99,104,111,108,121, 58, 13, 10,104,110, + 99,104,111,108,109,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 72,117, + 110, 99,104, 98, 97, 99,107, 32, 79,108,121,109,112,105, 99, 32, 40, 83, + 99,114, 97,109, 98,108,101, 32,104, 97,114,100,119, 97,114,101, 41, 13, + 10, 48, 58, 51, 99, 48, 56, 58, 49, 50, 58, 48, 48, 58, 51, 48, 13, 10, + 13, 10,104,101,114, 98,105,101,100,107, 58, 13, 10, 48, 58, 51, 99, 50, + 50, 58, 49, 98, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 99, 50, 48, + 58, 49, 58, 49, 56, 58, 49, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,115,121,115,116,101,109, 49, 54, 46, 99, 32, 40,102,108, 97, + 115,104, 32,112,111,105,110,116, 32, 40, 98,111,111,116,108,101,103, 41, + 41, 13, 10,102,112,111,105,110,116, 98,108, 58, 13, 10,102,112,111,105, + 110,116, 98,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,102,108, 97,115, + 104, 32,112,111,105,110,116, 32, 40,106, 97,112, 97,110, 44, 98,111,111, + 116,108,101,103, 41, 13, 10, 48, 58,102,102,101, 99, 54,101, 58, 54, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,102, 48, 48, 48, 58, 57, + 49, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,101, 48, 56, 51, + 58, 49, 58, 51, 51, 58, 51, 51, 13, 10, 13, 10,102,112,111,105,110,116, + 58, 13, 10,102,112,111,105,110,116, 49,100, 58, 13, 10,102,112,111,105, + 110,116,100, 58, 13, 10, 48, 58,102,102,101, 99, 54,100, 58, 54, 53, 58, + 48, 56, 58, 48, 49, 13, 10, 48, 58,102,102,102, 48, 48, 48, 58, 57, 49, + 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,101, 48, 56, 51, 58, + 49, 58, 51, 51, 58, 51, 51, 13, 10, 13, 10,102,112,111,105,110,116, 49, + 58, 13, 10, 48, 58,102,102,101, 99, 54,100, 58, 54, 53, 58, 48, 56, 58, + 48, 49, 13, 10, 48, 58,102,102,102, 48, 48, 48, 58, 57, 49, 48, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,102,102,101, 48, 56, 51, 58, 49, 58, 51, + 51, 58, 51, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,109,105, 99, + 104, 97,101,108, 32,106, 97, 99,107,115,111,110,115, 32,109,111,111,110, + 119, 97,108,107,101,114, 32, 40,119,111,114,108,100, 44,102,100, 49, 48, + 57, 52, 47, 56, 55, 53, 49, 32, 51, 49, 55, 45, 48, 49, 53, 57, 41, 13, + 10,109,119, 97,108,107, 58, 13, 10,109,119, 97,108,107,117, 58, 32, 32, + 59, 42, 42, 42, 42, 42, 42,109,105, 99,104, 97,101,108, 32,106, 97, 99, + 107,115,111,110,115, 32,109,111,111,110,119, 97,108,107,101,114, 32, 40, + 117,115, 44,102,100, 49, 48, 57, 52, 47, 56, 55, 53, 49, 32, 51, 49, 55, + 45, 48, 49, 53, 56, 41, 13, 10, 48, 58,102,102, 51, 99, 48, 48, 58, 53, + 48, 58, 48, 48, 58, 52, 97, 13, 10, 48, 58,102,102,101, 48, 50, 48, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109,119, 97,108,107,106, 58, + 13, 10, 48, 58,102,102, 51, 99, 48, 48, 58, 53, 48, 58, 48, 48, 58, 52, + 97, 13, 10, 48, 58,102,102,101, 48, 50, 48, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,109,119, 97,108,107, 98,108, 58, 13, 10,109,119, 97, + 108,107,100, 58, 13, 10,109,119, 97,108,107,106,100, 58, 13, 10,109,119, + 97,108,107,117,100, 58, 13, 10, 48, 58,102,102,102, 99, 48, 48, 58, 53, + 48, 58, 48, 48, 58, 52, 97, 13, 10, 48, 58,102,102,101, 48, 50, 48, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,117,114, 97,105,108, 58, + 13, 10, 97,117,114, 97,105,108, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 97,117,114, 97,105,108, 32, 40,115,101,116, 32, 50, 44,102,100, 49, + 48, 56, 57, 63, 32, 51, 49, 55, 45,117,110,107,110,111,119,110, 41, 13, + 10, 97,117,114, 97,105,108,106, 58, 13, 10, 97,117,114, 97,105,108, 49, + 100, 58, 13, 10, 97,117,114, 97,105,108,106,100, 58, 13, 10, 48, 58,102, + 102,102,102, 55,101, 58, 50, 55, 58, 48, 48, 58, 53, 50, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 98,111,100,121, 32,115,108, 97,109, 32, 40, + 56, 55, 53, 49, 32, 51, 49, 55, 45,117,110,107,110,111,119,110, 41, 13, + 10, 98,111,100,121,115,108, 97,109, 58, 13, 10,100,117,109,112,109,116, + 109,116, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,100,117,109,112, 32,109, + 97,116,115,117,109,111,116,111, 32, 40,106, 97,112, 97,110, 32, 56, 55, + 53, 49, 32, 51, 49, 55, 45,117,110,107,110,111,119,110, 41, 13, 10, 48, + 58,102,102,102, 99, 99, 48, 58, 51, 99, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,102,102,102, 99,102, 97, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, + 13, 10, 59, 71,111,108,100,101,110, 32, 65,120,101, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,103,111,108,100,110, 97,120,101, 58, + 13, 10,103,111,108,100,110, 97,120, 97, 58, 13, 10,103,111,108,100,110, + 97,120,101,106, 58, 13, 10,103,111,108,100,110, 97,120,101,117, 58, 13, + 10,103,111,108,100,110, 97,120,101, 98, 50, 58, 13, 10,103,111,108,100, + 110, 97,120,101, 98, 49, 58, 13, 10,103,111,108,100,110, 97,120,101, 49, + 58, 13, 10,103,111,108,100,110, 97,120,101, 50, 58, 13, 10,103,111,108, + 100,110, 97,120,101, 51, 58, 13, 10,103,111,108,100,110, 97,120,101, 49, + 100, 58, 13, 10,103,111,108,100,110, 97,120,101, 51,100, 58, 13, 10,103, + 111,108,100,110, 97,120,101,106,100, 58, 13, 10,103,111,108,100,110, 97, + 120,101,117,100, 58, 13, 10, 48, 58,102,102,102, 99, 48, 48, 58, 51, 56, + 58, 48, 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 115,121,115,116,101,109, 49, 54, 46, 99, 32, 40,100,121,110, 97,109,105, + 116,101, 32,100,117,120, 32, 40, 98,111,111,116,108,101,103, 41, 41, 13, + 10,100,100,117,120, 98,108, 58, 13, 10,100,100,117,120, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42,100,121,110, 97,109,105,116,101, 32,100,117,120, + 32, 40,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 48, 57, 54, 41, + 13, 10,100,100,117,120,106, 58, 13, 10,100,100,117,120,100, 58, 13, 10, + 100,100,117,120,106,100, 58, 13, 10, 48, 58,102,102,102, 56, 56, 48, 58, + 57, 56, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,102,102,102, 51, 49, 98, + 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 99,111,116,116,111,110, 32, 40,102,100, 49, 48, 57, 52, 32, 51, 49, - 55, 45, 48, 49, 56, 49, 97, 41, 10, 59, 42, 42, 32,110,111,116, 32,119, - 111,114,107,105,110,103, 32,121,101,116, 32, 40,100,114,105,118,101,114, - 32,105,115,115,117,101, 32, 63, 63, 63, 63, 41, 32, 42, 42, 10, 99,111, - 116,116,111,110, 58, 10, 99,111,116,116,111,110,106, 58, 10, 99,111,116, - 116,111,110,117, 58, 10, 99,111,116,116,111,110,106, 97, 58, 10, 99,111, - 116,116,111,110,100, 58, 10, 99,111,116,116,111,110,106, 97,100, 58, 10, - 99,111,116,116,111,110,106,100, 58, 10, 99,111,116,116,111,110,117,100, - 58, 10, 48, 58, 50, 48, 48, 48, 55, 54, 58, 51, 49, 58, 48, 48, 58, 53, - 53, 10, 48, 58, 50, 48, 48, 48, 98, 54, 58, 52, 58, 48, 48, 58, 97, 48, - 10, 10,101,115,119, 97,116, 58, 10,101,115,119, 97,116, 98,108, 58, 10, - 101,115,119, 97,116,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,101, 45, - 115,119, 97,116, 32, 45, 32, 99,121, 98,101,114, 32,112,111,108,105, 99, - 101, 32, 40,117,115, 44,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, - 49, 50, 57, 41, 10,101,115,119, 97,116,106, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 69, 45, 83,119, 97,116, 32, 45, 32, 67,121, 98,101,114, 32, - 80,111,108,105, 99,101, 32, 40, 74, 97,112, 97,110, 44, 32, 70, 68, 49, - 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 50, 56, 41, 10,101,115,119, 97, - 116,106, 49, 58, 10,101,115,119, 97,116,100, 58, 10,101,115,119, 97,116, - 106, 49,100, 58, 10,101,115,119, 97,116,106,100, 58, 10,101,115,119, 97, - 116,117,100, 58, 10, 48, 58,102,102, 99, 99, 48, 48, 58, 52, 54, 58, 48, - 48, 58, 48, 48, 10, 48, 58,102,102, 99, 99, 52, 50, 58, 49, 58, 50,101, - 58, 50,101, 10, 10, 59,113,117, 97,114,116,101,116, 32,115,101,116,115, - 32,104,105,103,104,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,117, - 112,100, 97,116,101,100, 32, 97,102,116,101,114, 32,105,116, 32,100,105, - 115,112,108, 97,121,115, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32, - 109,111,100,101, 10,113,117, 97,114,116,101,116, 58, 10,113,117, 97,114, - 116,101,116, 97, 58, 10,113,117, 97,114,116,101,116, 50, 97, 58, 10,113, - 117, 97,114,116,101,116, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,113, - 117, 97,114,116,101,116, 32, 50, 32, 40,106, 97,112, 97,110, 44, 32, 56, - 55, 53, 49, 32, 51, 49, 55, 45,117,110,107,110,111,119,110, 41, 10, 48, - 58,102,102, 99, 52, 48, 48, 58, 51, 49, 55, 58, 48, 48, 58, 52, 52, 10, - 48, 58,102,102, 48, 48, 98, 57, 58, 49, 58, 55, 55, 58, 55, 55, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 55, 45, 48, 49, 56, 49, 97, 41, 13, 10, 59, 42, 42, 32,110,111,116, 32, + 119,111,114,107,105,110,103, 32,121,101,116, 32, 40,100,114,105,118,101, + 114, 32,105,115,115,117,101, 32, 63, 63, 63, 63, 41, 32, 42, 42, 13, 10, + 99,111,116,116,111,110, 58, 13, 10, 99,111,116,116,111,110,106, 58, 13, + 10, 99,111,116,116,111,110,117, 58, 13, 10, 99,111,116,116,111,110,106, + 97, 58, 13, 10, 99,111,116,116,111,110,100, 58, 13, 10, 99,111,116,116, + 111,110,106, 97,100, 58, 13, 10, 99,111,116,116,111,110,106,100, 58, 13, + 10, 99,111,116,116,111,110,117,100, 58, 13, 10, 48, 58, 50, 48, 48, 48, + 55, 54, 58, 51, 49, 58, 48, 48, 58, 53, 53, 13, 10, 48, 58, 50, 48, 48, + 48, 98, 54, 58, 52, 58, 48, 48, 58, 97, 48, 13, 10, 13, 10,101,115,119, + 97,116, 58, 13, 10,101,115,119, 97,116, 98,108, 58, 13, 10,101,115,119, + 97,116,117, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,101, 45,115,119, 97, + 116, 32, 45, 32, 99,121, 98,101,114, 32,112,111,108,105, 99,101, 32, 40, + 117,115, 44,102,100, 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 49, 50, 57, + 41, 13, 10,101,115,119, 97,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 69, 45, 83,119, 97,116, 32, 45, 32, 67,121, 98,101,114, 32, 80,111, + 108,105, 99,101, 32, 40, 74, 97,112, 97,110, 44, 32, 70, 68, 49, 48, 57, + 52, 32, 51, 49, 55, 45, 48, 49, 50, 56, 41, 13, 10,101,115,119, 97,116, + 106, 49, 58, 13, 10,101,115,119, 97,116,100, 58, 13, 10,101,115,119, 97, + 116,106, 49,100, 58, 13, 10,101,115,119, 97,116,106,100, 58, 13, 10,101, + 115,119, 97,116,117,100, 58, 13, 10, 48, 58,102,102, 99, 99, 48, 48, 58, + 52, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 99, 99, 52, 50, + 58, 49, 58, 50,101, 58, 50,101, 13, 10, 13, 10, 59,113,117, 97,114,116, + 101,116, 32,115,101,116,115, 32,104,105,103,104,115, 99,111,114,101, 32, + 116, 97, 98,108,101, 32,117,112,100, 97,116,101,100, 32, 97,102,116,101, + 114, 32,105,116, 32,100,105,115,112,108, 97,121,115, 32,105,110, 32, 97, + 116,116,114, 97, 99,116, 32,109,111,100,101, 13, 10,113,117, 97,114,116, + 101,116, 58, 13, 10,113,117, 97,114,116,101,116, 97, 58, 13, 10,113,117, + 97,114,116,101,116, 50, 97, 58, 13, 10,113,117, 97,114,116,101,116, 50, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,113,117, 97,114,116,101,116, 32, + 50, 32, 40,106, 97,112, 97,110, 44, 32, 56, 55, 53, 49, 32, 51, 49, 55, + 45,117,110,107,110,111,119,110, 41, 13, 10, 48, 58,102,102, 99, 52, 48, + 48, 58, 51, 49, 55, 58, 48, 48, 58, 52, 52, 13, 10, 48, 58,102,102, 48, + 48, 98, 57, 58, 49, 58, 55, 55, 58, 55, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 10, 59, 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102, - 102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, - 48, 46, 56, 57, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, - 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 32, - 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, + 42, 32, 32, 32, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, + 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, + 56, 57, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, + 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 42, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111, 99,107,111, - 108, 97, 46, 99, 32, 40,118, 97,110,103,117, 97,114,100, 41, 10,118, 97, - 110,103,117, 97,114,100, 58, 10,118, 97,110,103,117, 97,114,100, 99, 58, - 10,118, 97,110,103,117, 97,114,100,106, 58, 32, 32, 59, 42, 42, 42, 42, - 42, 42, 86, 97,110,103,117, 97,114,100, 32, 40, 74, 97,112, 97,110, 41, - 10, 48, 58, 50, 50, 48, 58, 55, 48, 58, 49, 49, 58, 51, 48, 32, 10, 48, - 58, 50, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,116,105,103,101,114,111, 97,100, 46, 99, 10,116,105,103, - 101,114,111, 97,100, 58, 10,116,111,114, 97,109,105, 99,104, 58, 10,116, - 105,103,101,114,111, 97,100, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, - 84,105,103,101,114, 32, 82,111, 97,100, 32, 40,117,115, 32, 98,111,111, - 116,108,101,103, 41, 10,116,105,103,101,114,111, 97,100,117, 58, 10, 48, - 58,102,102,101, 99, 55, 48, 58, 54, 52, 58, 53, 57, 58, 98, 99, 10, 48, - 58,102,102, 99, 48, 57, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42,119,119,102,119,102,101,115,116, 46, 99, 32, - 40,119,119,102, 32,119,114,101,115,116,108,101,102,101,115,116, 32, 40, - 117,115, 41, 41, 10,119,119,102,119,102,101,115,116, 58, 10,119,119,102, - 119,102,101,115,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,119,119, - 119, 32,119,114,101,115,116,108,101,102,101,115,116, 32, 40,106, 97,112, - 97,110, 41, 10,119,119,102,119,102,101,115,116, 98, 58, 32, 32, 59, 42, + 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111, 99,107, + 111,108, 97, 46, 99, 32, 40,118, 97,110,103,117, 97,114,100, 41, 13, 10, + 118, 97,110,103,117, 97,114,100, 58, 13, 10,118, 97,110,103,117, 97,114, + 100, 99, 58, 13, 10,118, 97,110,103,117, 97,114,100,106, 58, 32, 32, 59, + 42, 42, 42, 42, 42, 42, 86, 97,110,103,117, 97,114,100, 32, 40, 74, 97, + 112, 97,110, 41, 13, 10, 48, 58, 50, 50, 48, 58, 55, 48, 58, 49, 49, 58, + 51, 48, 13, 10, 48, 58, 50, 53, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,105,103,101,114,111, 97, + 100, 46, 99, 13, 10,116,105,103,101,114,111, 97,100, 58, 13, 10,116,111, + 114, 97,109,105, 99,104, 58, 13, 10,116,105,103,101,114,111, 97,100, 98, + 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 84,105,103,101,114, 32, 82,111, + 97,100, 32, 40,117,115, 32, 98,111,111,116,108,101,103, 41, 13, 10,116, + 105,103,101,114,111, 97,100,117, 58, 13, 10, 48, 58,102,102,101, 99, 55, + 48, 58, 54, 52, 58, 53, 57, 58, 98, 99, 13, 10, 48, 58,102,102, 99, 48, + 57, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,119,119,102,119,102,101,115,116, 46, 99, 32, 40,119,119, + 102, 32,119,114,101,115,116,108,101,102,101,115,116, 32, 40,117,115, 41, + 41, 13, 10,119,119,102,119,102,101,115,116, 58, 13, 10,119,119,102,119, + 102,101,115,116,106, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,119,119,119, + 32,119,114,101,115,116,108,101,102,101,115,116, 32, 40,106, 97,112, 97, + 110, 41, 13, 10,119,119,102,119,102,101,115,116, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,119,119,119, 32,119,114,101,115,116,108,101,102,101, - 115,116, 32, 40,117,115, 32, 98,111,111,116,108,101,103, 41, 10,119,119, - 102,119,102,101,115,116, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,119, - 119,119, 32,119,114,101,115,116,108,101,102,101,115,116, 32, 40,117,115, - 32,116,101, 99,109,111, 41, 10, 48, 58, 49, 99, 48, 48, 99, 50, 58, 56, - 52, 58, 48, 56, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 99,111,109, 98, 97,116,115, 99, 46, 99, 32, 98,121, 32, 40, 71,111, 75, - 117, 41, 10, 98,111,111,116, 99, 97,109,112, 58, 10, 98,111,111,116, 99, - 97,109,112, 97, 58, 10, 48, 58, 49, 51, 50, 48, 58, 52, 54, 58, 48, 50, - 58, 48, 55, 10, 48, 58, 56, 50, 54, 58, 51, 58, 48, 48, 58, 49, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,114,109, 97,105,100, 46, 99, - 32, 40,109,101,114,109, 97,105,100, 41, 10,109,101,114,109, 97,105,100, - 58, 10,121, 97, 99,104,116,109,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 89, 97, 99,104,116,115,109, 97,110, 32, 10, 48, 58, 99, 48, 48, 56, - 58, 54, 58, 48, 48, 58, 48, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 97,115,116,101,114,111,105,100, 46, 99, 10, 97,115,116,101,114, - 111,105,100, 58, 10, 97,115,116,101,114,111,105,100, 98, 58, 10, 97,115, - 116,101,114,111,105,100, 50, 58, 10,104,121,112,101,114,115,112, 99, 58, - 10, 97,101,114,111,108,105,116,111,115, 58, 10,115,112, 99,114,111, 99, - 107,115, 58, 10, 48, 58, 48, 48, 49,100, 58, 51, 53, 58, 48, 48, 58, 48, - 48, 10, 10, 97,115,116,101,114,111,105,100, 49, 58, 10, 48, 58, 48, 48, - 49, 99, 58, 51, 53, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 97, 54, 58, - 49, 58, 48, 49, 58, 48, 49, 10, 10,109,101,116,101,111,114,116,115, 58, - 32, 59, 42, 42, 42, 42, 42, 42, 77,101,116,101,111,114,105,116,101,115, - 32, 10,109,101,116,101,111,114,104,111, 58, 10, 48, 58, 48, 48, 49, 99, - 58, 51, 53, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 98,111,110,107, 96,115, 32, 97,100,118,101,110,116,117,114,101, 10, 98, - 111,110,107, 97,100,118, 58, 10, 48, 58, 49, 48, 51, 50,101, 48, 58, 53, - 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 54, 51, 52, 98, 58, 51, - 55, 58, 54, 48, 58, 53, 48, 10, 48, 58, 49, 48, 51, 50,102, 55, 58, 49, - 58, 56, 48, 58, 56, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 115,116, 32, 40,117,115, 32, 98,111,111,116,108,101,103, 41, 13, 10,119, + 119,102,119,102,101,115,116, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 119,119,119, 32,119,114,101,115,116,108,101,102,101,115,116, 32, 40,117, + 115, 32,116,101, 99,109,111, 41, 13, 10, 48, 58, 49, 99, 48, 48, 99, 50, + 58, 56, 52, 58, 48, 56, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 99,111,109, 98, 97,116,115, 99, 46, 99, 32, 98,121, 32, + 40, 71,111, 75,117, 41, 13, 10, 98,111,111,116, 99, 97,109,112, 58, 13, + 10, 98,111,111,116, 99, 97,109,112, 97, 58, 13, 10, 48, 58, 49, 51, 50, + 48, 58, 52, 54, 58, 48, 50, 58, 48, 55, 13, 10, 48, 58, 56, 50, 54, 58, + 51, 58, 48, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42,109,101,114,109, 97,105,100, 46, 99, 32, 40,109,101,114,109, 97,105, + 100, 41, 13, 10,109,101,114,109, 97,105,100, 58, 13, 10,121, 97, 99,104, + 116,109,110, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 89, 97, 99,104,116, + 115,109, 97,110, 13, 10, 48, 58, 99, 48, 48, 56, 58, 54, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,115,116, + 101,114,111,105,100, 46, 99, 13, 10, 97,115,116,101,114,111,105,100, 58, + 13, 10, 97,115,116,101,114,111,105,100, 98, 58, 13, 10, 97,115,116,101, + 114,111,105,100, 50, 58, 13, 10,104,121,112,101,114,115,112, 99, 58, 13, + 10, 97,101,114,111,108,105,116,111,115, 58, 13, 10,115,112, 99,114,111, + 99,107,115, 58, 13, 10, 48, 58, 48, 48, 49,100, 58, 51, 53, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 97,115,116,101,114,111,105,100, 49, 58, 13, + 10, 48, 58, 48, 48, 49, 99, 58, 51, 53, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 50, 97, 54, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,109, + 101,116,101,111,114,116,115, 58, 32, 59, 42, 42, 42, 42, 42, 42, 77,101, + 116,101,111,114,105,116,101,115, 13, 10,109,101,116,101,111,114,104,111, + 58, 13, 10, 48, 58, 48, 48, 49, 99, 58, 51, 53, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 98,111,110,107, 96,115, 32, + 97,100,118,101,110,116,117,114,101, 13, 10, 98,111,110,107, 97,100,118, + 58, 13, 10, 48, 58, 49, 48, 51, 50,101, 48, 58, 53, 99, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 49, 48, 54, 51, 52, 98, 58, 51, 55, 58, 54, 48, + 58, 53, 48, 13, 10, 48, 58, 49, 48, 51, 50,102, 55, 58, 49, 58, 56, 48, + 58, 56, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115, + 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115, 116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 56, 56, 32, 97,100,100,105,116,105,111, 110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122, 101,114, 47,102,105,114,101, 98,114, 97,110,100, 47,103,101,111,109, 97, - 110, 47,111,116,104,101,114,115, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, + 110, 47,111,116,104,101,114,115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10,115,117,112, - 101,114,109, 97,110, 58, 10,115,117,112,101,114,109, 97,110,117, 58, 10, - 115,117,112,101,114,109, 97,110,106, 58, 32, 59, 42, 42, 42, 42, 42, 42, - 83,117,112,101,114,109, 97,110, 32, 40, 74, 97,112, 97,110, 41, 10, 48, - 58,102, 48, 50, 57, 53, 51, 58, 51, 97, 58, 48, 48, 58, 52, 57, 10, 48, - 58,102, 48, 50, 53, 49,102, 58, 57, 58, 50, 48, 58, 51, 48, 10, 48, 58, - 102, 48, 49, 99,102, 51, 58, 51, 58, 48, 48, 58, 56, 56, 10, 10, 59, 40, - 98,117, 98, 98,108,101, 32, 50, 48, 48, 48, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10, 98,117, 98,108, 50, 48, 48, 48, 58, 10,104, - 111,116, 98,117, 98,108, 58, 32, 59, 42, 42, 42, 42, 42, 42, 72,111,116, - 32, 66,117, 98, 98,108,101, 10,104,111,116, 98,117, 98,108, 97, 58, 10, - 48, 58, 51, 99, 48, 54, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,114,107,116,104,114,117, 46, - 99, 10, 98,114,107,116,104,114,117, 58, 10, 98,114,107,116,104,114,117, - 106, 58, 10,102,111,114, 99,101, 98,114,107, 58, 32, 59, 42, 42, 42, 42, - 42, 42, 70,111,114, 99,101, 32, 66,114,101, 97,107, 32, 40, 74, 97,112, - 97,110, 41, 10, 48, 58, 48, 53, 51, 49, 58, 50, 55, 58, 48, 48, 58, 51, - 50, 10, 48, 58, 48, 52, 48, 50, 58, 51, 58, 48, 48, 58, 53, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42,116,119,105,110, 32, 98,114, 97,116,115, 32, - 40,104,105,115, 99,111,114,101, 46,100, 97,116, 32, 99, 97,117,115,101, - 115, 32, 99,114, 97,115,104, 32, 97,116, 32,116,104,101, 32,109,111, 32, - 40,109, 97,109,101, 32, 48, 46, 49, 51, 52,117, 51, 41, 41, 10, 59,116, - 119,105,110, 98,114, 97,116, 58, 10, 59,116,119,105,110, 98,114, 97,116, - 97, 58, 10, 59, 48, 58, 49, 49, 50, 48, 48,101, 58, 51, 99, 58, 48, 48, - 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,116,119,105,110,115, 10, - 116,119,105,110,115, 58, 10, 48, 58, 52, 99, 99, 48, 58, 54, 48, 58, 48, - 57, 58, 48, 48, 10, 48, 58, 52,100, 49,100, 58, 49, 58, 48, 49, 58, 48, - 49, 10, 10,116,119,105,110,115, 97, 58, 10, 48, 58, 52, 99, 98,101, 58, - 54, 48, 58, 48, 57, 58, 48, 48, 10, 48, 58, 52,100, 49, 98, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42,102,105,101,108, - 100, 32, 99,111,109, 98, 97,116, 10,102, 99,111,109, 98, 97,116, 58, 10, - 48, 58, 99, 54, 48, 48, 58, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, - 55, 48, 48, 58, 50, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42,109,105,103,104,116,121, 32,119, 97,114,114,105,111,114,115, - 10,109,119, 97,114,114, 58, 10, 48, 58, 49, 49, 50, 48, 48, 50, 58, 51, - 100, 58, 48, 48, 58, 52,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 83,111, - 110,105, 99, 32, 66,111,111,109, 10,115,111,110,105, 99, 98,111,109, 58, - 10,115,111,110,105, 99, 98,111,109,100, 58, 10, 48, 58,102,102, 99, 48, - 56, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 99, 49, 48, - 48, 58, 57,101, 58, 50, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 69,120,112,108,111,115,105,118,101, 32, 66,114,101, 97,107,101,114, - 10,101,120,112,108, 98,114,107,114, 58, 10, 48, 58, 49, 48, 99, 48, 49, - 97, 58, 54, 51, 58, 48, 48, 58, 52,101, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 80,111,112, 32, 66,105,110,103,111, 10, 59, 42, 42, 32,121,111,117, - 32, 99, 97,110,116, 32,116,101,110,116,101,114, 32, 97,110,121, 32,110, - 97,109,101,115, 32,105,110,116,111, 32,104,105,115, 99,111,114,101, 32, - 116, 97, 98,108,101, 32,121,101,116, 44, 32,100,114,105,118,101,114, 32, - 112,114,111, 98,108,101,109, 32, 63, 63, 63, 32, 42, 42, 10,112,111,112, - 98,105,110,103,111, 58, 10, 48, 58, 52, 49, 48, 48, 49, 58, 55,102, 58, - 49, 48, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 83,112, 97, 99, - 101, 32, 82, 97,105,100,101,114, 10,115,114, 97,105,100,101,114, 58, 10, - 48, 58, 54, 48, 49, 48, 58, 57,102, 58, 48, 48, 58, 50, 49, 10, 10, 59, - 40,103,105,110,103, 97, 32,110,105,110,107,121,111,117,100,101,110, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,103,105,110,103, 97, - 110,105,110, 58, 10,103,105,110,103, 97,110,105,110, 97, 58, 32, 32, 59, - 42, 42, 42, 42, 42, 42, 71,105,110,103, 97, 32, 78,105,110,107,121,111, - 117, 68,101,110, 32, 40,115,101,116, 32, 50, 41, 10, 48, 58, 50, 48, 50, - 57, 49, 58, 53, 48, 58, 48, 48, 58, 53, 57, 10, 48, 58, 50, 48, 50,101, - 49, 58, 56, 51, 58, 50, 48, 58, 48, 57, 10, 48, 58, 50, 48, 49, 49,100, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,115,111,110,111,102,112,104,120, - 58, 10, 57, 57,108,115,116,119, 97,114, 58, 10, 57, 57,108,115,116,119, - 114, 97, 58, 10,114,101,112,117,108,115,101, 58, 10, 57, 57,108,115,116, - 119, 97,114,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 39, 57, 57, 58, - 32, 84,104,101, 32, 76, 97,115,116, 32, 87, 97,114, 32, 40, 75,121,117, - 103,111, 41, 10, 48, 58,102, 54, 54, 48, 58, 53,102, 58, 48, 48, 58,102, - 102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,101,110,103,111, 46, - 99, 10,112,101,110,103,111, 58, 10,112,101,110,103,111, 98, 58, 32, 59, - 42, 42, 42, 42, 42, 42,112,101,110,103,111, 32, 40, 98,111,111,116,108, - 101,103, 41, 10,112,101,110,116, 97, 58, 10,112,101,110,103,111,106,112, - 109, 58, 10,112,101,110,103,111,112, 97, 99, 58, 10, 48, 58, 56, 56, 52, - 48, 58, 49,101, 58,100, 48, 58, 52, 49, 10, 48, 58, 56, 56, 48, 99, 58, - 50, 58,100, 48, 58, 48, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42,112,101, - 110,103,111, 32, 40,115,101,116, 32, 51, 32,110,111,116, 32,101,110, 99, - 114,121,112,116,101,100, 41, 10,112,101,110,103,111, 51,117, 58, 10, 48, - 58, 56, 56, 52, 48, 58, 49,101, 58,100, 48, 58, 52,100, 10, 48, 58, 56, - 56, 48, 99, 58, 50, 58,100, 48, 58, 48, 55, 10, 10,112,101,110,103,111, - 50, 58, 10,112,101,110,103,111, 50,117, 58, 10,112,101,110,103,111, 52, - 58, 32, 59, 42, 42, 42, 42, 42, 42, 80,101,110,103,111, 32, 40,115,101, - 116, 32, 52, 41, 10, 48, 58, 56, 56, 52, 48, 58, 49,101, 58, 48, 48, 58, - 52,100, 10, 48, 58, 56, 56, 48, 99, 58, 50, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111, 99,107,111,108, 97, 46, - 99, 10,110,105, 98, 98,108,101,114, 58, 10,110,105, 98, 98,108,101,114, - 112, 58, 10,110,105, 98, 98,108,101,114, 56, 58, 10,110,105, 98, 98,108, - 101,114, 54, 58, 10,110,105, 98, 98,108,101,114,111, 58, 32, 59, 42, 42, - 42, 42, 42, 42, 78,105, 98, 98,108,101,114, 32, 40, 79,108,121,109,112, - 105, 97, 41, 10, 48, 58, 48, 50, 57, 48, 58, 50, 56, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 48, 50,100, 48, 58, 49,101, 58, 49, 51, 58, 49, 52, 10, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, + 115,117,112,101,114,109, 97,110, 58, 13, 10,115,117,112,101,114,109, 97, + 110,117, 58, 13, 10,115,117,112,101,114,109, 97,110,106, 58, 32, 59, 42, + 42, 42, 42, 42, 42, 83,117,112,101,114,109, 97,110, 32, 40, 74, 97,112, + 97,110, 41, 13, 10, 48, 58,102, 48, 50, 57, 53, 51, 58, 51, 97, 58, 48, + 48, 58, 52, 57, 13, 10, 48, 58,102, 48, 50, 53, 49,102, 58, 57, 58, 50, + 48, 58, 51, 48, 13, 10, 48, 58,102, 48, 49, 99,102, 51, 58, 51, 58, 48, + 48, 58, 56, 56, 13, 10, 13, 10, 59, 40, 98,117, 98, 98,108,101, 32, 50, + 48, 48, 48, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 98,117, 98,108, 50, 48, 48, 48, 58, 13, 10,104,111,116, 98,117, 98,108, + 58, 32, 59, 42, 42, 42, 42, 42, 42, 72,111,116, 32, 66,117, 98, 98,108, + 101, 13, 10,104,111,116, 98,117, 98,108, 97, 58, 13, 10, 48, 58, 51, 99, + 48, 54, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 98,114,107,116,104,114,117, 46, 99, 13, + 10, 98,114,107,116,104,114,117, 58, 13, 10, 98,114,107,116,104,114,117, + 106, 58, 13, 10,102,111,114, 99,101, 98,114,107, 58, 32, 59, 42, 42, 42, + 42, 42, 42, 70,111,114, 99,101, 32, 66,114,101, 97,107, 32, 40, 74, 97, + 112, 97,110, 41, 13, 10, 48, 58, 48, 53, 51, 49, 58, 50, 55, 58, 48, 48, + 58, 51, 50, 13, 10, 48, 58, 48, 52, 48, 50, 58, 51, 58, 48, 48, 58, 53, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,116,119,105,110, 32, 98, + 114, 97,116,115, 32, 40,104,105,115, 99,111,114,101, 46,100, 97,116, 32, + 99, 97,117,115,101,115, 32, 99,114, 97,115,104, 32, 97,116, 32,116,104, + 101, 32,109,111, 32, 40,109, 97,109,101, 32, 48, 46, 49, 51, 52,117, 51, + 41, 41, 13, 10, 59,116,119,105,110, 98,114, 97,116, 58, 13, 10, 59,116, + 119,105,110, 98,114, 97,116, 97, 58, 13, 10, 59, 48, 58, 49, 49, 50, 48, + 48,101, 58, 51, 99, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42,116,119,105,110,115, 13, 10,116,119,105,110,115, 58, 13, + 10, 48, 58, 52, 99, 99, 48, 58, 54, 48, 58, 48, 57, 58, 48, 48, 13, 10, + 48, 58, 52,100, 49,100, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, + 116,119,105,110,115, 97, 58, 13, 10, 48, 58, 52, 99, 98,101, 58, 54, 48, + 58, 48, 57, 58, 48, 48, 13, 10, 48, 58, 52,100, 49, 98, 58, 49, 58, 48, + 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,102,105,101, + 108,100, 32, 99,111,109, 98, 97,116, 13, 10,102, 99,111,109, 98, 97,116, + 58, 13, 10, 48, 58, 99, 54, 48, 48, 58, 97, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 99, 55, 48, 48, 58, 50, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,109,105,103,104,116,121, 32,119, 97, + 114,114,105,111,114,115, 13, 10,109,119, 97,114,114, 58, 13, 10, 48, 58, + 49, 49, 50, 48, 48, 50, 58, 51,100, 58, 48, 48, 58, 52,101, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 83,111,110,105, 99, 32, 66,111,111,109, + 13, 10,115,111,110,105, 99, 98,111,109, 58, 13, 10,115,111,110,105, 99, + 98,111,109,100, 58, 13, 10, 48, 58,102,102, 99, 48, 56, 56, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 99, 49, 48, 48, 58, 57,101, + 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 69, + 120,112,108,111,115,105,118,101, 32, 66,114,101, 97,107,101,114, 13, 10, + 101,120,112,108, 98,114,107,114, 58, 13, 10, 48, 58, 49, 48, 99, 48, 49, + 97, 58, 54, 51, 58, 48, 48, 58, 52,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 80,111,112, 32, 66,105,110,103,111, 13, 10, 59, 42, 42, 32, + 121,111,117, 32, 99, 97,110,116, 32,116,101,110,116,101,114, 32, 97,110, + 121, 32,110, 97,109,101,115, 32,105,110,116,111, 32,104,105,115, 99,111, + 114,101, 32,116, 97, 98,108,101, 32,121,101,116, 44, 32,100,114,105,118, + 101,114, 32,112,114,111, 98,108,101,109, 32, 63, 63, 63, 32, 42, 42, 13, + 10,112,111,112, 98,105,110,103,111, 58, 13, 10, 48, 58, 52, 49, 48, 48, + 49, 58, 55,102, 58, 49, 48, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 83,112, 97, 99,101, 32, 82, 97,105,100,101,114, 13, 10,115, + 114, 97,105,100,101,114, 58, 13, 10, 48, 58, 54, 48, 49, 48, 58, 57,102, + 58, 48, 48, 58, 50, 49, 13, 10, 13, 10, 59, 40,103,105,110,103, 97, 32, + 110,105,110,107,121,111,117,100,101,110, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,103,105,110,103, 97,110,105,110, 58, 13, 10, + 103,105,110,103, 97,110,105,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 71,105,110,103, 97, 32, 78,105,110,107,121,111,117, 68,101,110, 32, + 40,115,101,116, 32, 50, 41, 13, 10, 48, 58, 50, 48, 50, 57, 49, 58, 53, + 48, 58, 48, 48, 58, 53, 57, 13, 10, 48, 58, 50, 48, 50,101, 49, 58, 56, + 51, 58, 50, 48, 58, 48, 57, 13, 10, 48, 58, 50, 48, 49, 49,100, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,111,110,111,102,112,104,120, + 58, 13, 10, 57, 57,108,115,116,119, 97,114, 58, 13, 10, 57, 57,108,115, + 116,119,114, 97, 58, 13, 10,114,101,112,117,108,115,101, 58, 13, 10, 57, + 57,108,115,116,119, 97,114,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 39, 57, 57, 58, 32, 84,104,101, 32, 76, 97,115,116, 32, 87, 97,114, 32, + 40, 75,121,117,103,111, 41, 13, 10, 48, 58,102, 54, 54, 48, 58, 53,102, + 58, 48, 48, 58,102,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,112,101,110,103,111, 46, 99, 13, 10,112,101,110,103,111, 58, 13, 10, + 112,101,110,103,111, 98, 58, 32, 59, 42, 42, 42, 42, 42, 42,112,101,110, + 103,111, 32, 40, 98,111,111,116,108,101,103, 41, 13, 10,112,101,110,116, + 97, 58, 13, 10,112,101,110,103,111,106,112,109, 58, 13, 10,112,101,110, + 103,111,112, 97, 99, 58, 13, 10, 48, 58, 56, 56, 52, 48, 58, 49,101, 58, + 100, 48, 58, 52, 49, 13, 10, 48, 58, 56, 56, 48, 99, 58, 50, 58,100, 48, + 58, 48, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,112,101,110,103, + 111, 32, 40,115,101,116, 32, 51, 32,110,111,116, 32,101,110, 99,114,121, + 112,116,101,100, 41, 13, 10,112,101,110,103,111, 51,117, 58, 13, 10, 48, + 58, 56, 56, 52, 48, 58, 49,101, 58,100, 48, 58, 52,100, 13, 10, 48, 58, + 56, 56, 48, 99, 58, 50, 58,100, 48, 58, 48, 55, 13, 10, 13, 10,112,101, + 110,103,111, 50, 58, 13, 10,112,101,110,103,111, 50,117, 58, 13, 10,112, + 101,110,103,111, 52, 58, 32, 59, 42, 42, 42, 42, 42, 42, 80,101,110,103, + 111, 32, 40,115,101,116, 32, 52, 41, 13, 10, 48, 58, 56, 56, 52, 48, 58, + 49,101, 58, 48, 48, 58, 52,100, 13, 10, 48, 58, 56, 56, 48, 99, 58, 50, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,114,111, 99,107,111,108, 97, 46, 99, 13, 10,110,105, 98, 98,108,101, + 114, 58, 13, 10,110,105, 98, 98,108,101,114,112, 58, 13, 10,110,105, 98, + 98,108,101,114, 56, 58, 13, 10,110,105, 98, 98,108,101,114, 54, 58, 13, + 10,110,105, 98, 98,108,101,114,111, 58, 32, 59, 42, 42, 42, 42, 42, 42, + 78,105, 98, 98,108,101,114, 32, 40, 79,108,121,109,112,105, 97, 41, 13, + 10, 48, 58, 48, 50, 57, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 48, 50,100, 48, 58, 49,101, 58, 49, 51, 58, 49, 52, 13, 10, 13, 10, 59, 40,105,107,107,105, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10,105,107,107,105, 58, 10,102, - 97,114,109,101,114, 58, 32, 59, 42, 42, 42, 42, 42, 70, 97,114,109,101, - 114,115, 32, 82,101, 98,101,108,108,105,111,110, 10, 48, 58, 99, 48, 49, - 48, 58, 49,101, 58, 50, 50, 58, 48, 48, 10, 48, 58,100, 54, 49, 98, 58, - 49, 58, 50, 97, 58, 50, 97, 10, 48, 58,100, 54, 53, 98, 58, 49, 58, 48, - 52, 58, 48, 52, 32, 10, 48, 58,100, 54, 57, 98, 58, 49, 58, 48, 48, 58, - 48, 48, 32, 10, 48, 58,100, 54,100, 98, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,100, 55, 49, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 100, 55, 53, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 67,114, 97,122,121, 32, 67,108,105,109, 98,101,114, 32, 50, - 32, 40, 74, 97,112, 97,110, 32, 72, 97,114,100,101,114, 41, 10, 99, 99, - 108,105,109, 98,114, 50, 97, 58, 10, 48, 58, 54, 49, 50, 97, 55, 58, 52, - 57, 58, 49, 48, 58, 48, 48, 10, 48, 58, 54, 49, 50,102, 50, 58, 49, 58, - 53, 48, 58, 53, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 80, 97,105,110, - 116,101,100, 32, 76, 97,100,121, 32, 40, 83,112,108, 97,115,104, 41, 32, - 40, 86,101,114, 32, 49, 46, 51, 32, 85, 83, 41, 10,112, 97,105,110,116, - 108, 97,100, 58, 10, 48, 58,102,102, 99, 97, 49, 48, 58, 53, 48, 58, 48, - 48, 58, 48, 48, 10, 48, 58,102,102, 99, 97, 53,101, 58, 49, 58, 50, 55, - 58, 50, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,105,107,107,105, 58, 13, + 10,102, 97,114,109,101,114, 58, 32, 59, 42, 42, 42, 42, 42, 70, 97,114, + 109,101,114,115, 32, 82,101, 98,101,108,108,105,111,110, 13, 10, 48, 58, + 99, 48, 49, 48, 58, 49,101, 58, 50, 50, 58, 48, 48, 13, 10, 48, 58,100, + 54, 49, 98, 58, 49, 58, 50, 97, 58, 50, 97, 13, 10, 48, 58,100, 54, 53, + 98, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, 48, 58,100, 54, 57, 98, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 54,100, 98, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 55, 49, 98, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,100, 55, 53, 98, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 67,114, 97,122,121, 32, + 67,108,105,109, 98,101,114, 32, 50, 32, 40, 74, 97,112, 97,110, 32, 72, + 97,114,100,101,114, 41, 13, 10, 99, 99,108,105,109, 98,114, 50, 97, 58, + 13, 10, 48, 58, 54, 49, 50, 97, 55, 58, 52, 57, 58, 49, 48, 58, 48, 48, + 13, 10, 48, 58, 54, 49, 50,102, 50, 58, 49, 58, 53, 48, 58, 53, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 80, 97,105,110,116,101,100, 32, + 76, 97,100,121, 32, 40, 83,112,108, 97,115,104, 41, 32, 40, 86,101,114, + 32, 49, 46, 51, 32, 85, 83, 41, 13, 10,112, 97,105,110,116,108, 97,100, + 58, 13, 10, 48, 58,102,102, 99, 97, 49, 48, 58, 53, 48, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,102,102, 99, 97, 53,101, 58, 49, 58, 50, 55, 58, + 50, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32,117, - 110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114, - 101, 95,118, 48, 46, 56, 55, 32, 97,100,100,105,116,105,111,110,115, 32, - 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 47, - 102,105,114,101, 98,114, 97,110,100, 47,103,101,111,109, 97,110, 47,111, - 116,104,101,114,115, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, + 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99, + 111,114,101, 95,118, 48, 46, 56, 55, 32, 97,100,100,105,116,105,111,110, + 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, + 114, 47,102,105,114,101, 98,114, 97,110,100, 47,103,101,111,109, 97,110, + 47,111,116,104,101,114,115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 87,105,122,122, 32, 81,117,105,122, 32, 40,118,101,114,115,105,111, - 110, 32, 52, 41, 10,119,105,122,122,113,117,105,122, 58, 10, 48, 58, 50, - 98, 52,102, 58, 50, 50, 49, 58, 52,100, 58, 48, 48, 10, 48, 58, 50,100, - 54,101, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, - 42,109,105,115,115, 32, 98,105,110,103,111, 10,109,115, 98,105,110,103, - 111, 58, 10, 48, 58, 49, 48, 49, 50, 56, 56, 58, 97, 58, 48, 57, 58, 51, - 48, 10, 48, 58, 49, 48, 48, 48, 99, 50, 58, 51, 49, 58, 52,100, 58, 50, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 99,111,111,107,105,101, 32, 38, - 32, 98,105, 98,105, 32, 50, 10, 99,111,111,107, 98,105, 98, 50, 58, 10, - 48, 58, 49, 48, 50, 54, 97, 50, 58, 50, 56, 58, 52, 98, 58, 48, 48, 10, - 48, 58, 49, 48, 50, 54, 99, 52, 58, 49, 58, 52,100, 58, 52,100, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 83,116,114,101,101,116, 32, 70,105,103,104, - 116,101,114, 32, 73, 73, 39, 32, 45, 32, 72,121,112,101,114, 32, 70,105, - 103,104,116,105,110,103, 32, 40, 87,111,114,108,100, 32, 57, 50, 49, 50, - 48, 57, 41, 10,115,102, 50,104,102, 58, 32, 32, 32, 10, 48, 58,102,102, - 100, 50, 55, 54, 58, 50, 56, 58, 48, 48, 58, 50, 48, 10, 48, 58,102,102, - 100, 50, 99, 54, 58, 49, 52, 58,102,102, 58, 57, 54, 10, 48, 58,102,102, - 100, 50,101,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 70,105,103,104,116,105,110,103, 32, 66, 97,115,107, - 101,116, 98, 97,108,108, 10,102,103,104,116, 98,115,107,116, 58, 10, 48, - 58, 99, 48, 99, 48, 58, 50, 56, 58, 48, 51, 58,100,100, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 80, 97,105,114,115, 32, 40, 78,105, 99,104,105, - 98,117,116,115,117, 41, 32, 40, 74, 97,112, 97,110, 32, 56, 57, 48, 56, - 50, 50, 41, 38, 32,112, 97,105,114,115, 32, 40,115,121,115,116,101,109, - 32,116,101,110, 41, 40,106, 97,112, 97,110, 32, 56, 57, 48, 56, 50, 54, - 41, 10,112, 97,105,114,115,116,101,110, 58, 10,112, 97,105,114,115,110, - 98, 58, 10, 48, 58,102, 56, 51, 50, 58, 51, 58, 55, 48, 58, 48, 48, 10, - 48, 58,102, 56, 49, 52, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 87,105,122,122, 32, 81,117,105,122, 32, 40,118, + 101,114,115,105,111,110, 32, 52, 41, 13, 10,119,105,122,122,113,117,105, + 122, 58, 13, 10, 48, 58, 50, 98, 52,102, 58, 50, 50, 49, 58, 52,100, 58, + 48, 48, 13, 10, 48, 58, 50,100, 54,101, 58, 49, 58, 48, 53, 58, 48, 53, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,109,105,115,115, 32, 98,105, + 110,103,111, 13, 10,109,115, 98,105,110,103,111, 58, 13, 10, 48, 58, 49, + 48, 49, 50, 56, 56, 58, 97, 58, 48, 57, 58, 51, 48, 13, 10, 48, 58, 49, + 48, 48, 48, 99, 50, 58, 51, 49, 58, 52,100, 58, 50, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 99,111,111,107,105,101, 32, 38, 32, 98,105, + 98,105, 32, 50, 13, 10, 99,111,111,107, 98,105, 98, 50, 58, 13, 10, 48, + 58, 49, 48, 50, 54, 97, 50, 58, 50, 56, 58, 52, 98, 58, 48, 48, 13, 10, + 48, 58, 49, 48, 50, 54, 99, 52, 58, 49, 58, 52,100, 58, 52,100, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 83,116,114,101,101,116, 32, 70,105, + 103,104,116,101,114, 32, 73, 73, 39, 32, 45, 32, 72,121,112,101,114, 32, + 70,105,103,104,116,105,110,103, 32, 40, 87,111,114,108,100, 32, 57, 50, + 49, 50, 48, 57, 41, 13, 10,115,102, 50,104,102, 58, 13, 10, 48, 58,102, + 102,100, 50, 55, 54, 58, 50, 56, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, + 102,102,100, 50, 99, 54, 58, 49, 52, 58,102,102, 58, 57, 54, 13, 10, 48, + 58,102,102,100, 50,101,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 70,105,103,104,116,105,110,103, + 32, 66, 97,115,107,101,116, 98, 97,108,108, 13, 10,102,103,104,116, 98, + 115,107,116, 58, 13, 10, 48, 58, 99, 48, 99, 48, 58, 50, 56, 58, 48, 51, + 58,100,100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 80, 97,105, + 114,115, 32, 40, 78,105, 99,104,105, 98,117,116,115,117, 41, 32, 40, 74, + 97,112, 97,110, 32, 56, 57, 48, 56, 50, 50, 41, 38, 32,112, 97,105,114, + 115, 32, 40,115,121,115,116,101,109, 32,116,101,110, 41, 40,106, 97,112, + 97,110, 32, 56, 57, 48, 56, 50, 54, 41, 13, 10,112, 97,105,114,115,116, + 101,110, 58, 13, 10,112, 97,105,114,115,110, 98, 58, 13, 10, 48, 58,102, + 56, 51, 50, 58, 51, 58, 55, 48, 58, 48, 48, 13, 10, 48, 58,102, 56, 49, + 52, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, - 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, - 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 56, 54, - 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, - 32, 98,121, 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97, - 110,100, 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, - 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, + 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, + 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 56, 54, 32, 97, + 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, + 121, 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97,110,100, + 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 42, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,114, 97,107,116, - 111,110, 10,100,114, 97,107,116,111,110, 58, 10,100,114,107,116,110,106, - 114, 58, 10, 48, 58, 54, 52, 52, 57, 58, 49, 49, 56, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 54, 53, 53,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 82,111, 98,111, 32, 87,114,101,115, 32, - 50, 48, 48, 49, 32, 38, 32, 98,111,111,116,108,101,103, 10,114,111, 98, - 111,119,114,101,115, 58, 10,114,111, 98,111,119,114,101,115, 98, 58, 10, - 48, 58,101, 48, 49, 97, 58, 55, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, - 51, 55, 48, 58, 55, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 70,105,101,108,100, 32, 71,111, 97,108, 10,102,103,111, - 97,108, 58, 10,102,103,111, 97,108, 97, 58, 10, 48, 58, 56, 57, 58, 57, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 86,105, - 114,116,117, 97, 32, 70,105,103,104,116,101,114, 32, 49, 10,118,102, 49, - 58, 10,118,102, 58, 10, 48, 58, 52, 48,102, 56, 48, 48, 58, 98, 51, 58, - 48, 57, 58, 52,100, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 84,104,101, - 32, 82,101,116,117,114,110, 32,111,102, 32, 76, 97,100,121, 32, 70,114, - 111,103, 32, 38, 32, 84,104,101, 32, 82,101,116,117,114,110, 32,111,102, - 32, 76, 97,100,121, 32, 70,114,111,103, 32, 40,115,101,116, 32, 50, 41, - 10,114,111,108,100,102,114,111,103, 58, 10,114,111,108,100,102,114,111, - 103, 97, 58, 10, 48, 58,102,102, 99, 97, 49, 48, 58, 53, 48, 58, 48, 48, - 58, 48, 48, 10, 48, 58,102,102, 99, 97, 53, 98, 58, 49, 58, 48,102, 58, - 48,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,111,117,110,116,101, - 114, 32, 82,117,110, 32, 40, 98,111,111,116,108,101,103, 32,115,101,116, - 32, 49, 41, 10, 99,111,117,110,116,114,117,110, 98, 58, 10, 48, 58,100, - 48,100, 56, 58, 49, 50, 55, 58, 48, 48, 58, 52, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,114, 97,107, + 116,111,110, 13, 10,100,114, 97,107,116,111,110, 58, 13, 10,100,114,107, + 116,110,106,114, 58, 13, 10, 48, 58, 54, 52, 52, 57, 58, 49, 49, 56, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 53, 53,100, 58, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 82,111, 98, + 111, 32, 87,114,101,115, 32, 50, 48, 48, 49, 32, 38, 32, 98,111,111,116, + 108,101,103, 13, 10,114,111, 98,111,119,114,101,115, 58, 13, 10,114,111, + 98,111,119,114,101,115, 98, 58, 13, 10, 48, 58,101, 48, 49, 97, 58, 55, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 51, 55, 48, 58, 55, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 70, + 105,101,108,100, 32, 71,111, 97,108, 13, 10,102,103,111, 97,108, 58, 13, + 10,102,103,111, 97,108, 97, 58, 13, 10, 48, 58, 56, 57, 58, 57, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 86,105, + 114,116,117, 97, 32, 70,105,103,104,116,101,114, 32, 49, 13, 10,118,102, + 49, 58, 13, 10,118,102, 58, 13, 10, 48, 58, 52, 48,102, 56, 48, 48, 58, + 98, 51, 58, 48, 57, 58, 52,100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 84,104,101, 32, 82,101,116,117,114,110, 32,111,102, 32, 76, 97, + 100,121, 32, 70,114,111,103, 32, 38, 32, 84,104,101, 32, 82,101,116,117, + 114,110, 32,111,102, 32, 76, 97,100,121, 32, 70,114,111,103, 32, 40,115, + 101,116, 32, 50, 41, 13, 10,114,111,108,100,102,114,111,103, 58, 13, 10, + 114,111,108,100,102,114,111,103, 97, 58, 13, 10, 48, 58,102,102, 99, 97, + 49, 48, 58, 53, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 99, + 97, 53, 98, 58, 49, 58, 48,102, 58, 48,102, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 99,111,117,110,116,101,114, 32, 82,117,110, 32, 40, + 98,111,111,116,108,101,103, 32,115,101,116, 32, 49, 41, 13, 10, 99,111, + 117,110,116,114,117,110, 98, 58, 13, 10, 48, 58,100, 48,100, 56, 58, 49, + 50, 55, 58, 48, 48, 58, 52, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, - 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97, - 108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 56, 53, 32, - 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, - 98,121, 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97,110, - 100, 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 42, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, + 108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32, + 104,105,103,104,115, 99,111,114,101, 95,118, 48, 46, 56, 53, 32, 97,100, + 100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, + 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97,110,100, 47, + 103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 42, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,103,111,108,100, 32,109, - 101,100, 97,108,105,115,116, 32, 38, 32, 71,111,108,100, 32, 77,101,100, - 97,108,105,115,116, 32, 40, 97,108,116, 41, 32, 10,103,111,108,100,109, - 101,100,108, 58, 10,103,111,108,100,109,101,100,108, 97, 58, 10, 48, 58, - 52, 48, 97, 50, 48, 58, 97, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, - 48, 98, 50, 50, 58, 52, 54, 58, 49, 98, 58, 48, 48, 32, 10, 48, 58, 52, - 48, 98, 50, 48, 58, 50, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42,102, 97,120, 32, 38, 32,102, 97,120, 32, 40, 97,108,116, - 32,113,117,101,115,116,105,111,110,115, 41, 10,102, 97,120, 58, 10,102, - 97,120, 97, 58, 10, 48, 58, 48, 50, 98, 52, 58, 49, 53,101, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 77,105,108,108,101, 32, 77,105,103,108,105, 97, - 32, 50, 58, 32, 71,114,101, 97,116, 32, 49, 48, 48, 48, 32, 77,105,108, - 101,115, 32, 82, 97,108,108,121, 32, 40, 57, 53, 47, 48, 53, 47, 50, 52, - 41, 32, 38, 32, 40, 57, 53, 47, 48, 52, 47, 48, 52, 41, 10,103,116,109, - 114, 50, 97, 58, 10,103,116,109,114, 50, 58, 10, 48, 58, 49, 48, 51, 98, - 49, 99, 58, 49, 97, 48, 58, 53, 57, 58, 48, 49, 10, 48, 58, 49, 48, 51, - 99,102, 99, 58, 51, 48, 48, 58, 52,100, 58, 50,101, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 71, 97,108,115, 32, 80, 97,110,105, 99, 32, 40,115, - 101,116, 32, 51, 41, 10,103, 97,108,112, 97,110,105, 99, 97, 58, 10, 48, - 58, 99, 56, 50, 53, 98, 54, 58, 54, 52, 58, 51, 48, 58, 51, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,116,101,114,112,105,108,108, 97, - 114, 58, 10, 99, 97,116,101,114,112,108,114, 58, 10, 48, 58, 48, 50, 58, - 49, 56, 58, 53, 55, 58, 48, 49, 10, 48, 58, 49, 97, 58, 49, 56, 58, 48, - 49, 58, 49, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,104,121,112,101, - 114, 32,112, 97, 99,109, 97,110, 10,104,121,112,101,114,112, 97, 99, 58, - 10, 48, 58, 49, 48, 51, 49, 53, 99, 58, 50, 56, 58, 53, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,105,103,103,101,114, 32, 40, - 99,118,115, 41, 10,100,105,103,103,101,114, 99, 58, 10, 48, 58, 49, 99, - 102, 56, 58, 50,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 99, 48, 49, - 58, 49, 58, 97, 50, 58, 97, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 118, 97,115, 97,114, 97, 32, 50, 32, 40,115,101,116, 32, 49, 32, 38, 32, - 50, 41, 10,118, 97,115, 97,114, 97, 50, 58, 10,118, 97,115, 97,114, 97, - 50, 97, 58, 10, 48, 58, 53, 51, 48, 50, 58,101, 98, 58, 48, 49, 58, 48, - 97, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 84,119,105,110, 32, 70, 97, - 108, 99,111,110,115, 10,116,119,105,110,102, 97,108, 99, 58, 10, 48, 58, - 101, 54, 56, 48, 58, 53, 48, 58, 48, 48, 58, 51, 98, 10, 48, 58,101, 54, - 48, 48, 58, 48, 56, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,115,117,110, 56, 46, 99, 32, 40,104, 97,114,100, 32,104, - 101, 97,100, 32, 38, 32,112,111,112,112,101,114, 41, 10,104, 97,114,100, - 104,101, 97,100, 58, 10,112,111,112, 95,104,104, 58, 10,104, 97,114,100, - 104,101, 97,100, 98, 58, 10,104, 97,114,100,104,101, 97,100, 98, 50, 58, - 10, 48, 58, 99,101, 56, 48, 58, 49, 56,101, 58, 48, 51, 58, 51,100, 10, - 48, 58, 99, 48, 53, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,102, 97,110,116, 97,115,121, 32,108, 97,110,100, - 10,102, 97,110,116,108, 97,110,100, 58, 10,102, 97,110,116,108, 97,110, - 100, 97, 58, 10, 48, 58,101,100, 99, 58, 50, 56, 58, 53, 48, 58, 48, 99, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102, - 102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, - 48, 46, 56, 52, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, - 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 47,102,105,114, - 101, 98,114, 97,110,100, 47,103,101,111,109, 97,110, 47,111,116,104,101, - 114,115, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 40,101,109,112,105,114,101, 32, - 99,105,116,121, 58, 32, 49, 57, 51, 49, 32, 40, 98,111,111,116,108,101, - 103, 63, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,101,109,112, 99,105,116,121, 58, - 10,101,109,112, 99,105,116,121,105, 58, 10,101,109,112, 99,105,116,121, - 106, 58, 10,115,116,102,105,103,104,116, 58, 10,101,109,112, 99,105,116, - 121,117, 58, 10,115,116,102,105,103,104,116, 97, 58, 10,115,116,102,105, - 103,104,116,103, 98, 58, 10, 48, 58,101, 48, 49, 50, 58, 53, 53, 58, 48, - 48, 58, 52, 53, 10, 10,115, 97, 98,111,116,101,110, 98, 58, 10,115, 97, - 98,111,116,101,110, 98, 97, 58, 10, 99, 97, 99,116,117,115, 58, 10, 48, - 58,102, 54,101, 48, 48, 58, 54, 99, 58, 48, 48, 58, 49,101, 10, 10,112, - 117, 99,104,105, 99, 97,114, 58, 10,112,117, 99,104,105, 99, 97,114,106, - 58, 10, 48, 58, 52, 48, 49, 99, 55,101, 58, 51, 52, 56, 58, 48, 48, 58, - 48, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,122, - 111,110,101, 46, 99, 10,109,101,103, 97,122,111,110,101, 58, 10,109,101, - 103, 97,122,111,110,101,105, 58, 10,109,101,103, 97,122,111,110,101, 97, - 58, 10,109,101,103, 97,122,111,110,101, 98, 58, 10,109,101,103, 97,122, - 111,110,101, 99, 58, 10, 48, 58, 50, 52, 52, 54, 58, 56, 57, 58, 48, 48, - 58, 53, 53, 10, 48, 58, 51, 98, 48, 56, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 40,102,105,110, 97,108, 32, 98,108,111,119, 32, 40,119,111, - 114,108,100, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 102,105,110, 97,108, 98, 58, 10,102,105,110, 97,108, 98,106, 58, 10,102, - 105,110, 97,108, 98,117, 58, 10, 48, 58, 49, 48, 49,102, 50, 50, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 49, 48, 52, 99, 58, 51, 50, - 58, 48, 48, 58, 52, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, - 118,115, 46, 99, 32, 40,103,111,108,100, 32, 98,117,103, 41, 10,103,111, - 108,100, 98,117,103, 58, 10, 48, 58, 51, 68, 48, 57, 58, 49, 69, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,116,101,116,114,105, - 115, 32,116,104,101, 32,103,114, 97,110,100, 32,109, 97,115,116,101,114, - 32, 40,106, 97,112, 97,110, 32, 57, 56, 48, 55, 49, 48, 41, 10, 59, 42, - 42, 32,116,104,105,115, 32,115, 97,118,101,115, 32, 34,116,111,100, 97, - 121, 96,115, 32,115, 99,111,114,101,115, 34, 44, 32,116,104,101, 32,103, - 97,109,101, 32,115, 97,118,101,115, 32,116,104,101, 32,103,114, 97,110, - 100, 32,109, 97,115,116,101,114, 32,115, 99,111,114,101,115, 32,117,115, - 105,110,103, 32, 42, 42, 10, 59, 42, 42, 32,110,118,114, 97,109, 32, 40, - 105, 32,116,104,105,110,107, 32, 33, 33, 32, 58, 48, 41, 32, 32, 42, 42, - 10,116,103,109,106, 58, 10, 48, 58, 56, 48, 49, 55, 49, 49, 57, 56, 58, - 51, 53, 58, 48, 54, 58, 54, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42,109, - 105,115,115, 32,112,117,122,122,108,101, 10,109,115,112,117,122,122,108, - 101, 58, 10, 48, 58, 49, 48, 48,102,102, 52, 58, 99, 58, 48, 98, 58,102, - 52, 10, 48, 58, 49, 48, 48, 54, 48, 56, 58, 50,102, 58, 52,100, 58, 50, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,109,111,110,115,116,101,114, 32, - 109, 97,117,108,101,114,115, 32, 40, 69,117,114,111,112,101, 32,118,101, - 114, 32, 69, 65, 65, 41, 38, 32,107,121,117,107,121,111,107,117, 32,115, - 101,110,116, 97,105, 32,100, 97,100, 97,110,100, 97,114,110, 32, 40,106, - 97,112, 97,110, 32,118,101,114, 32,106, 97, 97, 41, 10,100, 97,100, 97, - 110,100,114,110, 58, 10,109,109, 97,117,108,101,114,115, 58, 10, 48, 58, - 54, 48, 48, 55, 48, 49, 58, 57, 57, 58, 48, 50, 58,101, 56, 10, 10,104, - 101, 97,100,111,110,105, 58, 10, 59, 42, 42, 32,100,111,101,115, 32,110, - 111,116, 32,115, 97,118,101, 32,105,110, 32,103, 97,109,101, 32,116,111, - 112, 32,115, 99,111,114,101, 44, 32,111,110,108,121, 32,104,105,115, 99, - 111,114,101, 32,116, 97, 98,108,101, 32,115, 97,118,101,115, 32, 42, 42, - 10, 48, 58, 48,101, 58,102, 58, 48, 48, 58, 48, 48, 10, 10,104,101, 97, - 100,111,110, 58, 10,104,101, 97,100,111,110, 49, 58, 10, 59, 42, 42, 32, - 100,111,101,115, 32,110,111,116, 32,115, 97,118,101, 32,105,110, 32,103, - 97,109,101, 32,116,111,112, 32,115, 99,111,114,101, 44, 32,111,110,108, - 121, 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,115, 97, - 118,101,115, 32, 42, 42, 10, 48, 58, 99, 55, 56, 48, 58, 49,101, 58, 51, - 48, 58, 51, 48, 10, 10,104,101, 97,100,111,110, 50, 58, 10, 48, 58, 99, - 51, 57, 48, 58, 49, 50, 58, 51, 48, 58, 51, 48, 10, 10,104,101, 97,100, - 111,110,115, 58, 10,104,101, 97,100,111,110,115, 97, 58, 10,104,101, 97, - 100,111,110,109,122, 58, 10, 48, 58, 99, 55, 56, 97, 58,102, 58, 51, 48, - 58, 51, 48, 10, 10,104,101, 97,100,111,110, 98, 58, 10, 48, 58,102,102, - 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42,109,101,103, 97,116,101, 99,104, 58, 32,101, 45,115,119, 97,116, 10, - 109,116, 95,101,115,119, 97,116, 58, 10, 48, 58,102,102,102,102, 48, 52, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,109, - 101,103, 97,116,101, 99,104, 58, 32, 99,111,108,117,109,110,115, 10,109, - 116, 95, 99,111,108,115, 58, 10, 48, 58,102,101,102, 97, 50, 48, 58, 56, - 101, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,100,121, - 110, 97, 32,103,101, 97,114,115, 10, 59, 42, 42, 32,116,111,112, 32,115, - 99,111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,115, 32,115,111, - 111,110, 32, 97,115, 32, 49,115,116, 32,103, 97,109,101, 32,115,116, 97, - 114,116,115, 32, 42, 42, 10, 59, 42, 42, 32,119, 97,105,116, 32, 97, 98, - 111,117,116, 32, 49, 48, 32,115,101, 99,111,110,100,115, 32, 97,102,116, - 101,114, 32,103, 97,109,101, 32,115,116, 97,114,116,115, 32, 98,101,102, - 111,114,101, 32,101,110,116,101,114,105,110,103, 32, 97, 32, 99,114,101, - 100,105,116, 44, 32,111,114, 32,115, 97,118,101, 32,119,111,110, 96,116, - 32,119,111,114,107, 32, 42, 42, 10,100,121,110, 97,103,101, 97,114, 58, - 10, 48, 58, 97,102, 58, 50, 99, 58, 56, 48, 58, 53, 48, 10, 48, 58,102, - 100, 58, 49, 58, 48, 52, 58, 48, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 99,111,110,116,105,110,101,110,116, 97,108, 32, 99,105,114, 99,117,115, - 32, 40,119,111,114,108,100, 32, 38, 32,117,115, 32,115,101,116, 32, 49, - 41, 10, 99,111,110,116, 99,105,114, 99, 58, 10, 99,111,110,116, 99,105, - 114, 99,117, 58, 10, 48, 58, 56, 51, 48, 54, 52, 58, 50, 53, 55, 58, 48, - 48, 58, 52, 49, 10, 48, 58, 56, 52, 53, 56, 50, 58, 52, 58, 48, 48, 58, - 101, 48, 10, 48, 58, 56, 50, 54,101,102, 58, 49, 58, 53, 50, 58, 53, 50, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 99,111,110,116,105,110,101,110,116, - 97,108, 32, 99,105,114, 99,117,115, 32, 40,117,115, 32,115,101,116, 32, - 50, 41, 10, 99,111,110,116, 99,105,114, 99,117, 97, 58, 10, 48, 58, 56, - 51, 48, 54, 97, 58, 50, 53, 55, 58, 48, 48, 58, 52, 49, 10, 48, 58, 56, - 52, 53, 56, 50, 58, 52, 58, 48, 48, 58,101, 48, 10, 48, 58, 56, 50, 54, - 101,102, 58, 49, 58, 53, 50, 58, 53, 50, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 49, 57, 52, 53,107, 32, 73, 73, 73, 10, 49, 57, 52, 53,107,105, - 105,105, 58, 10, 49, 57, 52, 53,107,105,105,105,111, 58, 10, 48, 58, 49, - 48, 48, 97, 50,100, 58, 54, 51, 58, 48, 51, 58, 56, 56, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,111,110,101, 32, 43, 32,116,119,111, 10,111, - 110,101,116,119,111, 58, 10,111,110,101,116,119,111,101, 58, 10, 48, 58, - 102, 99, 97,101, 58, 53, 50, 58, 48, 48, 58, 48, 49, 10, 10,115,101,103, - 97,110,105,110,106, 58, 10,115,101,103, 97,110,105,110,106,117, 58, 10, - 110,112,114,105,110, 99,101,115, 58, 10,110,112,114,105,110, 99,101,115, - 117, 58, 10,110,112,114,105,110, 99,101,115, 98, 58, 10,110,105,110,106, - 97, 58, 10,110,112,114,105,110, 99,101,115,111, 58, 10, 48, 58, 69, 70, - 48, 48, 58, 51, 49, 58, 48, 48, 58, 52, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 82,101,110,106,117, 32, 75,105,122,111,107,117, 10,114,101, - 110,106,117, 58, 10, 48, 58,102, 50, 97, 97, 58, 50, 56, 58, 98, 56, 58, - 48, 49, 10, 48, 58,102, 50,101, 97, 58, 50, 58, 55, 48, 58, 49, 55, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 78,101,114, 97,116,116,101, 32, 67, - 104,117, 10,110,114, 97,116,101, 99,104,117, 58, 10, 48, 58,101, 53, 54, - 56, 58, 50, 56, 58, 48, 48, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42,112,105,114, 97,116,101, 32,116,114,101, 97,115,117,114,101, 10, - 112,105,114, 97,116,101,116,114, 58, 10, 48, 58, 50,100, 99, 58, 52,102, - 58, 53, 53, 58, 52, 52, 10, 10, 59, 40,108,101,112,114,101, 99,104, 97, - 117,110, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 32, 10, 59, 42, 42, 32,108,101,116, 32, - 103, 97,109,101, 32,100,105,115,112,108, 97,121, 32,104,105,115, 99,111, - 114,101, 32,116, 97, 98,108,101, 32, 97, 32,102,101,119, 32,116,105,109, - 101,115, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, - 32, 98,101,102,111,114,101, 32, 42, 42, 10, 59, 42, 42, 32,115,116, 97, - 114,116,105,110,103, 32, 97, 32,103, 97,109,101, 32, 42, 42, 10,108,101, - 112,114,101, 99,104,110, 58, 10,112,111,116,111,103,111,108,100, 58, 10, - 108,101,112,114,101, 99,104,112, 58, 10, 48, 58, 48, 50, 99, 97, 58, 53, - 48, 58, 53, 53, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,115,117, - 112,101,114, 32,114,105,100,101,114, 10,115,117,112,114,114,105,100,114, - 58, 10, 48, 58, 56, 48, 99, 97, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 56, 97, 50, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 56, 97, - 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 56, 57,101, 49, 58, - 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 56, 57, 99, 49, 58, 49, 58, 50, - 52, 58, 50, 52, 10, 48, 58, 56, 57, 97, 49, 58, 49, 58, 50, 52, 58, 50, - 52, 10, 48, 58, 56, 57, 56, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42,100,114,105,118,105,110,103, 32,102,111,114, - 99,101, 32, 40,112, 97, 99, 45,109, 97,110, 32, 99,111,110,118,101,114, - 115,105,111,110, 32, 38, 32, 99,108,111,110,101,115, 41, 10,100,114,105, - 118,102,114, 99,112, 58, 10,100,114,105,118,102,114, 99,103, 58, 10,100, - 114,105,118,102,114, 99, 98, 58, 10,100,114,105,118,102,114, 99,116, 58, - 10, 48, 58, 51, 99, 48, 53, 58, 52, 57, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 51, 99, 49,102, 58, 49, 58, 51, 49, 58, 51, 49, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, - 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97, - 108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 56, 46, 51, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97,110,100, - 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 32, 42, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,103,111,108,100, 32, + 109,101,100, 97,108,105,115,116, 32, 38, 32, 71,111,108,100, 32, 77,101, + 100, 97,108,105,115,116, 32, 40, 97,108,116, 41, 13, 10,103,111,108,100, + 109,101,100,108, 58, 13, 10,103,111,108,100,109,101,100,108, 97, 58, 13, + 10, 48, 58, 52, 48, 97, 50, 48, 58, 97, 48, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 52, 48, 98, 50, 50, 58, 52, 54, 58, 49, 98, 58, 48, 48, 13, + 10, 48, 58, 52, 48, 98, 50, 48, 58, 50, 58, 48, 48, 58, 48, 49, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,102, 97,120, 32, 38, 32,102, 97, + 120, 32, 40, 97,108,116, 32,113,117,101,115,116,105,111,110,115, 41, 13, + 10,102, 97,120, 58, 13, 10,102, 97,120, 97, 58, 13, 10, 48, 58, 48, 50, + 98, 52, 58, 49, 53,101, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 77, + 105,108,108,101, 32, 77,105,103,108,105, 97, 32, 50, 58, 32, 71,114,101, + 97,116, 32, 49, 48, 48, 48, 32, 77,105,108,101,115, 32, 82, 97,108,108, + 121, 32, 40, 57, 53, 47, 48, 53, 47, 50, 52, 41, 32, 38, 32, 40, 57, 53, + 47, 48, 52, 47, 48, 52, 41, 13, 10,103,116,109,114, 50, 97, 58, 13, 10, + 103,116,109,114, 50, 58, 13, 10, 48, 58, 49, 48, 51, 98, 49, 99, 58, 49, + 97, 48, 58, 53, 57, 58, 48, 49, 13, 10, 48, 58, 49, 48, 51, 99,102, 99, + 58, 51, 48, 48, 58, 52,100, 58, 50,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 71, 97,108,115, 32, 80, 97,110,105, 99, 32, 40,115,101, + 116, 32, 51, 41, 13, 10,103, 97,108,112, 97,110,105, 99, 97, 58, 13, 10, + 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 52, 58, 51, 48, 58, 51, 49, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,116,101,114,112,105, + 108,108, 97,114, 58, 13, 10, 99, 97,116,101,114,112,108,114, 58, 13, 10, + 48, 58, 48, 50, 58, 49, 56, 58, 53, 55, 58, 48, 49, 13, 10, 48, 58, 49, + 97, 58, 49, 56, 58, 48, 49, 58, 49, 52, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,104,121,112,101,114, 32,112, 97, 99,109, 97,110, 13, 10, + 104,121,112,101,114,112, 97, 99, 58, 13, 10, 48, 58, 49, 48, 51, 49, 53, + 99, 58, 50, 56, 58, 53, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,100,105,103,103,101,114, 32, 40, 99,118,115, 41, 13, 10, + 100,105,103,103,101,114, 99, 58, 13, 10, 48, 58, 49, 99,102, 56, 58, 50, + 101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 99, 48, 49, 58, 49, 58, + 97, 50, 58, 97, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,118, + 97,115, 97,114, 97, 32, 50, 32, 40,115,101,116, 32, 49, 32, 38, 32, 50, + 41, 13, 10,118, 97,115, 97,114, 97, 50, 58, 13, 10,118, 97,115, 97,114, + 97, 50, 97, 58, 13, 10, 48, 58, 53, 51, 48, 50, 58,101, 98, 58, 48, 49, + 58, 48, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 84,119,105, + 110, 32, 70, 97,108, 99,111,110,115, 13, 10,116,119,105,110,102, 97,108, + 99, 58, 13, 10, 48, 58,101, 54, 56, 48, 58, 53, 48, 58, 48, 48, 58, 51, + 98, 13, 10, 48, 58,101, 54, 48, 48, 58, 48, 56, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,110, 56, 46, + 99, 32, 40,104, 97,114,100, 32,104,101, 97,100, 32, 38, 32,112,111,112, + 112,101,114, 41, 13, 10,104, 97,114,100,104,101, 97,100, 58, 13, 10,112, + 111,112, 95,104,104, 58, 13, 10,104, 97,114,100,104,101, 97,100, 98, 58, + 13, 10,104, 97,114,100,104,101, 97,100, 98, 50, 58, 13, 10, 48, 58, 99, + 101, 56, 48, 58, 49, 56,101, 58, 48, 51, 58, 51,100, 13, 10, 48, 58, 99, + 48, 53, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42,102, 97,110,116, 97,115,121, 32,108, 97,110,100, 13, + 10,102, 97,110,116,108, 97,110,100, 58, 13, 10,102, 97,110,116,108, 97, + 110,100, 97, 58, 13, 10, 48, 58,101,100, 99, 58, 50, 56, 58, 53, 48, 58, + 48, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,112,105,110,110,101, - 114, 10,115,112,105,110,110,101,114, 58, 10, 48, 58, 49, 99, 49, 49, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49,101, 52, 48, 58,102, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115, - 116,101,109, 49, 56, 46, 99, 32, 40,115,104, 97,100,111,119, 32,100, 97, - 110, 99,101,114, 41, 10,115,104,100, 97,110, 99,101,114, 58, 10,115,104, - 100, 97,110, 99,101,114,106, 58, 10,115,104,100, 97,110, 99, 98,108, 58, - 10,115,104,100, 97,110, 99,101,114, 49, 58, 10, 48, 58,102,102,101, 99, - 50, 52, 58, 49, 51, 97, 52, 58, 56, 48, 58, 53, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42,115, 99,111,111,116,101,114, 32,115,104,111,111,116, - 101,114, 10,115, 99,111,116,114,115,104,116, 58, 10, 48, 58, 49, 99, 97, - 48, 58, 52, 54, 58, 48, 49, 58, 49,100, 10, 48, 58, 49, 57, 57, 99, 58, - 51, 58, 48, 49, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 77, - 84, 86, 32, 82,111, 99,107, 45, 78, 45, 82,111,108,108, 32, 84,114,105, - 118,105, 97, 32, 40, 80, 97,114,116, 32, 50, 41, 10,114,111, 99,107,116, - 114,118, 50, 58, 10, 48, 58, 52, 99, 50, 99, 58, 51, 99, 58, 52, 52, 58, - 48, 10, 48, 58, 52, 99, 54, 54, 58, 49, 58, 50, 53, 58, 50, 53, 10, 48, - 58, 52, 51,101,100, 58, 54, 58, 48, 48, 58, 52, 48, 10, 48, 58, 52, 51, - 102, 48, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10,104,105,103,104,115,112, - 108,116, 58, 10,104,105,103,104,115,112,108,116, 97, 58, 10, 48, 58, 54, - 48, 97, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 97, 51, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 57,100, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 98, 98, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 54, 48, 98, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 54, 48, 97,102, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, - 48,102, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48,101, 99, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48,101, 55, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 99,100, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 54, 48, 99, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 54, 48, 99, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,104,105, - 103,104,115,112,108,116, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83, - 112, 97, 99,101, 32, 70,101,118,101,114, 32, 72,105,103,104, 32, 83,112, - 108,105,116,116,101,114, 32, 40, 97,108,116, 32, 83,111,117,110,100, 41, - 10, 48, 58, 54, 48, 97, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54, 48,102, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48,101, - 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48,101, 55, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 97, 51, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 54, 48, 57,100, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 54, 48, 98, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54, 48, 98, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 97, - 102, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 99,100, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 99, 55, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 54, 48, 99, 49, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 10,103,121,114,111,100,105,110,101,116, 58, 10,103,121,114,111,100, - 105,110,101, 58, 10, 98,117,122,122, 97,114,100, 58, 10, 48, 58,102, 51, - 48, 48, 58, 52, 53, 58, 48, 48, 58, 48, 98, 10, 48, 58, 57, 52,101, 50, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 57, 52, 97, 50, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 48, 58, 57, 52, 54, 50, 58, 49, 58, 48, 51, 58, - 48, 51, 10, 48, 58, 57, 52, 50, 50, 58, 49, 58, 48, 54, 58, 48, 54, 10, - 48, 58, 57, 51,101, 50, 58, 49, 58, 48, 52, 58, 48, 52, 10, 48, 58, 57, - 51, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 51, 54, 50, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 51, 50, 50, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 10,100,107,111,110,103, 51, 58, 10,100,107,111, - 110,103, 51,106, 58, 10,100,107,111,110,103, 51, 98, 58, 10, 48, 58, 54, - 98, 48, 48, 58, 97, 97, 58,102, 51, 58, 55, 54, 10, 48, 58, 54, 99, 50, - 48, 58, 52, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 99, 49, 54, 58, - 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 56,102, 51, 58, 48, 51, - 58, 48, 49, 58, 48, 48, 10, 10, 99,104, 97,110,103,101,115, 58, 10,108, - 111,111,112,101,114, 58, 10, 99,104, 97,110,103,101,115, 97, 58, 10, 48, - 58, 56, 57, 57, 97, 58, 54, 58, 50, 54, 58, 50, 55, 10, 48, 58, 56, 57, - 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 97, 49, 97, 58, - 54, 58, 50, 54, 58, 50, 55, 10, 48, 58, 56, 97, 51, 97, 58, 54, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 56, 97, 57, 97, 58, 54, 58, 50, 54, 58, 50, - 55, 10, 48, 58, 56, 97, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 40,118,105,111,108,101,110, 99,101, 32,102,105,103,104,116, 32, 40, - 119,111,114,108,100, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10,118,105,111,102,105,103,104,116, 58, 32, 10,118,105,111,102,105, - 103,104,116,117, 58, 10,118,105,111,102,105,103,104,116,106, 58, 10, 48, - 58, 97, 48, 50, 56, 48, 48, 58, 50, 56, 58, 48, 50, 58, 50, 48, 10, 10, - 59, 84,101,101,110, 97,103,101, 32, 77,117,116, 97,110,116, 32, 78,105, - 110,106, 97, 32, 84,117,114,116,108,101,115, 32, 40, 85, 83, 32, 38, 32, - 99,108,111,110,101,115, 41, 10,116,109,110,116, 58, 10,116,109,110,116, - 106, 58, 10,116,109,110,116,117, 97, 58, 10,116,109,104,116, 50,112, 58, - 10,116,109,110,116, 50,112,111, 58, 10,116,109,110,116, 50,112,106, 58, - 10,116,109,104,116, 58, 10,116,109,110,116,117, 58, 10,116,109,104,116, - 50,112, 97, 58, 10,116,109,104,116, 97, 58, 10,116,109,104,116, 98, 58, - 10, 48, 58, 54, 51, 53, 48, 48, 58,102, 51, 58, 48, 51, 58, 52, 49, 10, - 10, 59, 40,115,116,114,105,107,101,114,115, 32, 49, 57, 52, 53, 41, 32, - 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10,115, 49, 57, 52, 53, - 58, 10,115, 49, 57, 52, 53,106, 58, 10,115, 49, 57, 52, 53,106,110, 58, - 10,115, 49, 57, 52, 53, 97, 58, 10,115, 49, 57, 52, 53,107, 58, 10,115, - 49, 57, 52, 53, 98,108, 58, 10, 48, 58,102,101, 50, 97,102, 56, 58, 55, - 56, 58, 50,100, 58,102, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 115,104,105,101,110,114,121,117, 10,115,104,105,101,110,114,121,117, 58, - 10, 48, 58, 54, 48, 97,100, 99, 51, 52, 58, 55,101, 99, 58, 53, 52, 58, - 49, 48, 10, 48, 58, 54, 48, 97, 99, 98, 99, 52, 58, 52, 58, 48, 48, 58, - 101, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 87,105,103,103,105, - 101, 32, 87, 97,103,103,105,101, 10,119,105,103,103,105,101, 58, 10, 48, - 58,102,102,101, 49, 48, 56, 58, 53, 52, 58, 48, 48, 58, 52, 55, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,116,105,109,101,112,108,116, 46, 99, - 10,116,105,109,101,112,108,116, 58, 10,116,105,109,101,112,108,116, 99, - 58, 10,115,112, 97, 99,101,112,108,116, 58, 10,116,105,109,101,112,108, - 116, 97, 58, 10, 48, 58, 97, 98, 48, 56, 58, 50, 56, 58, 48, 48, 58,102, - 49, 10, 48, 58, 97, 57, 56, 98, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, - 109, 97,104,111,117,100, 97,105, 58, 10,115,115,116,114,105,107,101,114, - 97, 58, 10,115,115,116,114,105,107,101,114, 58, 10, 48, 58, 49, 48, 48, - 50, 57, 97, 58, 97, 52, 58, 48, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,108, 97,117,110, 99,104,101, - 114, 10,115,112, 97, 99,101,108,110, 99, 58, 10, 48, 58, 54, 48, 98,100, - 58, 50, 49, 58, 48, 48, 58, 48, 48, 10, 10,115,112, 97, 99,101,102,101, - 118, 58, 10,115,112, 97, 99,101,102,101,118,111, 58, 10,115,112, 97, 99, - 101,102,101,118,111, 50, 58, 10, 48, 58, 54, 48,101, 55, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 54, 48,102, 49, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 54, 48,101, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 83,112, 97, 99,101, 32, 70,101,118,101, - 114, 32, 40, 98,108, 97, 99,107, 32, 97,110,100, 32,119,104,105,116,101, - 32,115,101,116, 32, 50, 41, 10,115,102,101,118,114, 98,119, 97, 58, 10, - 115,102,101,118,101,114, 98,119, 58, 10, 48, 58, 54, 48, 57,100, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 97, 51, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 54, 48, 97, 57, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 54, 48, 97,102, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54, 48, 98, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 98, - 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 99, 49, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 99, 55, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 54, 48, 99,100, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 54, 48,101, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 54, 48,101, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48,102, - 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,103, 97,108, 97,103, 97, 46, 99, 10,103, 97,108, 97,103, 97, 58, - 10,103, 97,108, 97,103, 97,109,107, 58, 10,103, 97,108, 97,103, 97,109, - 119, 58, 10,103, 97,108, 97,103, 97,111, 58, 10,103, 97,108, 97,103, 97, - 100,115, 58, 10,103, 97,108,108, 97,103, 58, 10,103, 97,108, 97,103, 97, - 98, 50, 58, 10,103, 97,108, 97,103, 97, 56, 52, 58, 10,103, 97,108, 97, - 103, 97,109,102, 58, 10, 48, 58, 56, 97, 50, 48, 58, 50,100, 58, 48, 48, - 58, 49, 56, 10, 48, 58, 56, 51,101,100, 58, 54, 58, 48, 48, 58, 50, 52, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,117,108,108,115, 32,101, - 121,101, 32,100, 97,114,116,115, 10, 98,117,108,108,115,100,114,116, 58, - 10, 98,117,108,108,115,100,114,116,103, 58, 10, 48, 58, 53, 99, 48, 53, - 58, 56, 55, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 99, 53,101, 58, 49, - 58, 51, 48, 58, 51, 48, 10, 48, 58, 53, 99, 48, 54, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,111, 97,112, - 108, 97,110, 50, 46, 99, 10, 98, 97,116,116,108,101,103, 58, 10, 98, 97, - 116,116,108,101,103, 98, 58, 32, 10, 48, 58, 49, 48, 99, 97, 52, 99, 58, - 101,100, 58, 48, 48, 58, 50, 97, 10, 48, 58, 49, 48, 49, 50, 52, 49, 58, - 49, 58, 52, 53, 58, 52, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 97,116,101,116,114,105,115, 46, 99, 10, 97,116,101,116,114,105,115, 58, - 10, 97,116,101,116,114,105,115, 98, 50, 58, 10, 97,116,101,116,114,105, - 115, 97, 58, 10, 97,116,101,116,114,105,115, 98, 58, 10, 97,116,101,116, - 114,105,115, 99, 50, 58, 10, 97,116,101,116,114,105,115, 99, 58, 10, 97, - 116,101,116,114,105,115, 98, 51, 58, 10, 59, 48, 58, 57, 55, 57, 58, 57, - 48, 58, 51, 48, 58, 53, 50, 10, 48, 58, 57, 57,100, 58, 51, 99, 58, 51, - 48, 58, 51, 48, 10, 48, 58, 57,101, 98, 58, 49,101, 58, 52, 98, 58, 53, - 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,117,114, 98,111, 46, - 99, 32, 40, 98,117, 99,107, 32,114,111,100,103,101,114,115, 58, 32,112, - 108, 97,110,101,116, 32,111,102, 32,100,111,111,109, 32, 38, 32, 99,108, - 111,110,101,115, 41, 10, 59, 42, 42, 32,115, 99,111,114,101,115, 32,111, - 110, 32,116,104,101, 32,115,105,100,101, 32,111,102, 32,115, 99,114,101, - 101,110, 32,100,111,110, 96,116, 32,100,105,115,112,108, 97,121, 32,117, - 110,116,105,108,108, 32, 49,115,116, 32,103, 97,109,101, 32,105,115, 32, - 111,118,101,114, 32, 42, 42, 10, 59, 42, 42, 32, 97,108,115,111, 32,116, - 111,112, 32,115,105,100,101, 32,115, 99,111,114,101, 32,109, 97,121, 32, - 100,105,115,112,108, 97,121, 32, 49, 32,100,105,103,105,116, 32,117,110, - 116,105,108,108, 32, 49,115,116, 32,103, 97,109,101, 32,105,115, 32,111, - 118,101,114, 32, 42, 42, 10, 98,117, 99,107,114,111,103, 58, 10, 98,117, - 99,107,114,111,103,110, 58, 10, 98,117, 99,107,114,111,103,110, 50, 58, - 10, 48, 58, 99, 52, 48, 48, 58, 51,101, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 99, 53, 52, 57, 58, 49, 48, 58,102,102, 58,102,102, 10, 48, 58, 99, - 53, 52, 98, 58, 49, 58, 48,102, 58, 48,102, 10, 10,122,111,111,109, 57, - 48, 57, 58, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32, - 111,110, 32,103, 97,109,101, 32,115, 99,114,101,101,110, 32,117,112,100, - 97,116,101,100, 32, 97,102,116,101,114, 32, 49,115,116, 32,103, 97,109, - 101, 32, 42, 42, 10, 59, 42, 42, 32, 97,115,115,117,109,105,110,103, 32, - 121,111,117, 32,104, 97,118,101, 32,109, 97,100,101, 32,115, 99,111,114, - 101, 32,100,105,115,112,108, 97,121, 32,105,110, 32,100,105,112,115,119, - 105,116, 99,104, 32,109,101,110,117, 32, 33, 33, 42, 42, 10, 48, 58, 99, - 52, 48, 48, 58, 51,101, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 98,111,116, 97,110,105, 99, 10, 98,111,116, 97,110,105, 99, - 58, 10, 98,111,116, 97,110,105, 99,102, 58, 10, 48, 58, 55, 50, 48, 97, - 58, 52, 54, 58, 49, 56, 58, 49, 48, 10, 48, 58, 55, 48, 48, 97, 58, 49, - 101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 50, 51, 51, 58, 49, 58, 50, - 51, 58, 50, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 98,111,110,103,111, - 10, 98,111,110,103,111, 58, 10, 48, 58, 56, 51, 48, 48, 58, 49, 49, 58, - 48, 58, 49, 53, 10, 48, 58, 56, 51, 48, 49, 58, 49, 58, 48, 53, 58, 48, - 53, 10, 10,115,112, 97,110,103, 58, 10,115, 98, 98,114,111,115, 58, 10, - 115,112, 97,110,103, 98,108, 58, 10,115,112, 97,110,103,106, 58, 10, 48, - 58,102, 99, 48, 49, 58, 57,101, 58, 48, 48, 58, 48, 55, 10, 48, 58,101, - 49, 53, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42,116,114,105,118, 32,102,111,117,114, 10,115,116, 97,116,114,105, - 118, 52, 58, 10, 48, 58, 52, 56, 50, 98, 58, 49, 56, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,112, 97,105,114,115, 32,108,111, - 118,101, 58, 10,112, 97,105,114,108,111,118,101, 58, 10, 48, 58,102, 48, - 48, 55, 52, 56, 58, 54, 51, 58, 48, 48, 58, 50,100, 10, 10,111,117,116, - 114,117,110, 58, 10,111,117,116,114,117,110, 98, 58, 10, 48, 58, 54, 48, - 52, 54,101, 58, 49, 49, 56, 58, 48, 53, 58, 50, 48, 10, 10,111,117,116, - 114,117,110,114, 97, 58, 10, 48, 58, 54, 48, 52, 54,101, 58, 49, 49, 56, - 58, 48, 53, 58, 50, 48, 10, 48, 58, 54, 48, 52, 99, 56, 58, 49, 58, 52, - 102, 58, 52,102, 10, 10,111,117,116,114,117,110,100,120, 97, 58, 10,111, - 117,116,114,117,110,100,120, 58, 10,111,117,116,114,117,110,100,120,106, - 58, 10, 48, 58, 54, 48, 52, 54,101, 58, 49, 49, 56, 58, 48, 49, 58, 50, - 48, 10, 48, 58, 54, 48, 52, 99, 56, 58, 49, 58, 52,102, 58, 52,102, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,112,112,121, 46, 99, 10, - 109, 97,112,112,121, 58, 10,109, 97,112,112,121,106, 58, 10, 48, 58, 49, - 52, 54, 48, 58, 50, 56, 58, 48, 48, 58, 52, 49, 10, 48, 58, 49, 51, 56, - 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 55,101,100, 58, 54, - 58, 48, 48, 58, 50, 48, 10, 48, 58, 55,101, 48, 58, 50, 58, 48, 48, 58, - 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,108, 97,115,116, 32,115, - 116,114,105,107,101,114, 32, 47, 32,107,121,117,117,107,121,111,107,117, - 32,110,111, 32,115,116,114,105,107,101,114, 10,107,121,117,115,116,114, - 107,114, 58, 10, 48, 58,102, 48, 48,100, 48, 54, 58, 52,102, 58, 52, 49, - 58, 52,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,111, 98,105,108, - 101, 32,115,117,105,116, 32,103,117,110,100, 97,109, 32,101,120, 32,114, - 101,118,117,101, 10,103,117,110,100, 97,109,101,120, 58, 10, 48, 58, 50, - 48, 55, 56, 97, 55, 58, 54, 51, 58, 48, 49, 58, 53, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,103,114, 97,110,100, 32,115,116,114,105,107,101, - 114, 32, 50, 32, 40,106, 97,112, 97,110, 41, 10,103,115,116,114,105,107, - 50,106, 58, 10,103,115,116,114,105,107, 50,101, 58, 10, 48, 58,102,102, - 97,101,102, 51, 58, 52, 56, 58, 55, 54, 58, 50, 56, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42,103,111, 97,108, 32, 96, 57, 50, 10,103,111, 97,108, - 57, 50, 58, 10, 48, 58, 49, 48, 57,102, 53, 55, 58, 57, 57, 58, 50, 56, - 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,100, 97,110,103,101, - 114,111,117,115, 32,100,117,110,103,101,111,110,115, 10,100,100,117,110, - 103,101,111,110, 58, 10,100,100,117,110,103,101,111,110,101, 58, 10, 48, - 58, 57, 49, 53, 58, 57, 99, 58, 52, 98, 58, 51, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42,115,112, 97, 99,101, 32, 97,116,116, 97, 99,107, 47, - 104,101, 97,100, 32,111,110, 10,115,115,112, 97, 99, 97,104,111, 58, 10, - 48, 58,101, 52, 99, 98, 58, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, - 55, 56, 97, 58,102, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 98,111,120,121, 32, 98,111,121, 32, 40,117,115, 41, 32, 38, - 32,115,111,117,107,111, 32, 98, 97,110, 32,100,101,108,117,120,101, 32, - 40,106, 97,112, 97,110, 41, 10, 59, 42, 42, 32,100,111, 32,110,111,116, - 32,117,115,101, 32,105,110, 32,103, 97,109,101, 32,114,101,115,101,116, - 32, 40,102, 51, 41, 32,111,114, 32,115, 97,118,101, 32,102, 97,105,108, - 115, 32, 33, 33, 32, 42, 42, 10, 59, 42, 42, 32,115, 97,118,101,115, 32, - 104,105, 45,115, 99,111,114,101, 32, 97,110,100, 32,104,105,115, 99,111, - 114,101, 32,116, 97, 98,108,101, 32, 45, 32,110,111,116, 32,115,116,101, - 112, 32,114,101, 99,111,114,100,115, 32, 42, 42, 10, 98,111,120,121, 98, - 111,121, 58, 10,115,111,117,107,111, 98,100,120, 58, 10, 48, 58, 50, 50, - 100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 53, 53, 58, 50, 99, - 58, 48, 57, 58, 48, 48, 10, 48, 58, 53, 48, 48,102, 58, 49, 58, 48, 51, - 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,111,115,109,111, - 10, 99,111,115,109,111, 58, 10, 48, 58, 50, 48, 51, 56, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 50,101, 50, 50, 58, 49, 58, 55, 99, 58, 55, - 99, 10, 48, 58, 50,101, 52, 50, 58, 49, 58, 56, 50, 58, 56, 50, 10, 48, - 58, 50,101, 54, 50, 58, 49, 58, 56, 50, 58, 56, 50, 10, 48, 58, 50,101, - 56, 50, 58, 49, 58, 56, 50, 58, 56, 50, 10, 48, 58, 50,101, 97, 50, 58, - 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 50,102, 50, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 50,102, 52, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 50,102, 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 50,102, 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, - 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 50, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 52, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 48, 54, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 51, 48, 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 48, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, - 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, 52, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, 54, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 49, 56, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 51, 49, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 50, 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 50, - 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 50, 54, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 50, 56, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 50, 97, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 51, 51, 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 51, 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 51, - 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 51, 56, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 51, 97, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 52, 50, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 51, 52, 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 51, 52, 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 52, - 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 52, 97, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 97, - 115,116,101,114,111, 99,107, 10, 97,115,116,101,114,111, 99,107, 58, 10, - 97,115,116,101,114,111, 99,107,118, 58, 10, 48, 58, 49, 99, 58, 51, 53, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 40,106, 97, 99,107, 97,108, 32, 40,119,111,114,108,100, 41, 38, 32,116, - 111,112, 32,103,117,110,110,101,114, 32, 40,117,115, 41, 38, 32,116,111, - 112, 32,103,117,110,110,101,114, 32, 40, 98,111,111,116,108,101,103, 41, - 32, 38, 32,116,111,107,117,103,104,117, 32, 98,117,116, 97,105, 32,106, - 97, 99,107, 97,108, 32, 40,106, 97,112, 97,110, 41, 10,106, 97, 99,107, - 97,108, 58, 10,116,111,112,103,117,110,114, 58, 10,116,111,112,103,117, - 110, 98,108, 58, 10,106, 97, 99,107, 97,108,106, 58, 10,106, 97, 99,107, - 97,108,114, 58, 10, 49, 58, 55, 50,102, 56, 58, 50, 55, 58, 48, 48, 58, - 49,100, 10, 49, 58, 55, 51, 52, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 49, 58, 55, 51, 52, 49, 58, 49, 58, 48, 50, 58, 48, 50, 10, 10,112, 97, - 99,109, 97,110,105, 97, 58, 10,112, 97, 99,109, 97,110,105, 97,111, 58, - 10, 49, 58, 54, 52, 52, 58, 53, 48, 58, 48, 48, 58, 52,100, 10, 49, 58, - 54, 49, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,112, 97, 99,109, 97, - 110,105, 97,106, 58, 10, 49, 58, 54, 49, 99, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 49, 58, 54, 49,101, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, + 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99, + 111,114,101, 95,118, 48, 46, 56, 52, 32, 97,100,100,105,116,105,111,110, + 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, + 114, 47,102,105,114,101, 98,114, 97,110,100, 47,103,101,111,109, 97,110, + 47,111,116,104,101,114,115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99, - 105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 56, 46, 50, - 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, - 32, 98,121, 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97, - 110,100, 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, - 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,108, 97,100,121, - 32,102,114,111,103, 10,108, 97,100,121,102,114,111,103, 58, 10, 48, 58, - 101, 98, 52, 52, 58, 56,102, 58,100, 99, 58, 48, 48, 10, 48, 58,101, 98, - 100, 49, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 98, 97,107,117,114,101,116,115,117, 32, 98,114,101, 97,107,101, - 114, 10, 98, 97,107,117, 98,114,107,114, 58, 10, 48, 58, 49, 48, 99, 48, - 49, 97, 58, 54, 51, 58, 48, 48, 58, 52,101, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,100,101,109,111,110,101,121,101, 45,120, 10,100,101,109,111, - 110,101,121,101, 58, 10, 48, 58, 49, 50, 56, 58, 98, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,106,117,109,112,105,110, - 103, 32, 99,114,111,115,115, 10,106, 99,114,111,115,115, 58, 10, 48, 58, - 102, 53, 97, 98, 58, 49,101, 58, 48, 48, 58, 52, 57, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,100,111,114, 97, 99,104, 97,110, 32, 10,100,111, - 114, 97, 99,104, 97,110, 58, 10, 48, 58, 49, 56, 49, 53, 58, 53, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 53,100, 55, 48, 58, 49, 58, 55, 99, 58, 55, - 99, 10, 48, 58, 53,100, 55, 49, 58, 49, 58, 56, 97, 58, 56, 97, 10, 48, - 58, 53,100, 55, 50, 58, 49, 58, 57, 50, 58, 57, 50, 10, 48, 58, 53,100, - 55, 51, 58, 49, 58, 97, 50, 58, 97, 50, 10, 48, 58, 53,100, 55, 52, 58, - 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 53,100, 55, 56, 58, 49, 58, 55, - 99, 58, 55, 99, 10, 48, 58, 53,100, 55, 57, 58, 49, 58, 56, 97, 58, 56, - 97, 10, 48, 58, 53,100, 55, 97, 58, 49, 58, 57, 50, 58, 57, 50, 10, 48, - 58, 53,100, 55, 98, 58, 49, 58, 97, 50, 58, 97, 50, 10, 48, 58, 53,100, - 55, 99, 58, 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 53,100, 56, 48, 58, - 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 53,100, 56, 49, 58, 49, 58, 56, - 97, 58, 56, 97, 10, 48, 58, 53,100, 56, 50, 58, 49, 58, 57, 50, 58, 57, - 50, 10, 48, 58, 53,100, 56, 51, 58, 49, 58, 97, 50, 58, 97, 50, 10, 48, - 58, 53,100, 56, 52, 58, 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 53,100, - 56, 56, 58, 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 53,100, 56, 57, 58, - 49, 58, 56, 97, 58, 56, 97, 10, 48, 58, 53,100, 56, 97, 58, 49, 58, 57, - 50, 58, 57, 50, 10, 48, 58, 53,100, 56, 98, 58, 49, 58, 97, 50, 58, 97, - 50, 10, 48, 58, 53,100, 56, 99, 58, 49, 58, 55, 99, 58, 55, 99, 10, 48, - 58, 53,100, 57, 48, 58, 49, 58, 55, 99, 58, 55, 99, 10, 48, 58, 53,100, - 57, 49, 58, 49, 58, 56, 97, 58, 56, 97, 10, 48, 58, 53,100, 57, 50, 58, - 49, 58, 57, 50, 58, 57, 50, 10, 48, 58, 53,100, 57, 51, 58, 49, 58, 97, - 50, 58, 97, 50, 10, 48, 58, 53,100, 57, 52, 58, 49, 58, 55, 99, 58, 55, - 99, 10, 10, 59, 42, 42, 42, 42, 42, 42,112,111,114,107,121, 10,112,111, - 114,107,121, 58, 10, 48, 58, 49, 99, 51, 56, 58, 52, 97, 58, 48, 48, 58, - 50, 48, 10, 48, 58, 49, 99, 53, 54, 58, 49, 58, 51, 48, 58, 51, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 98,105,103, 32, 98,117, 99,107,115, 10, - 98,105,103, 98,117, 99,107,115, 58, 10, 48, 58, 52,100, 55,102, 58, 53, - 102, 58, 52, 56, 58, 48, 48, 10, 48, 58, 52,100,100, 99, 58, 49, 58, 50, - 48, 58, 50, 48, 10, 10, 10, 59, 42, 42, 42, 42, 42, 42, 98, 97,110,103, - 33, 32, 40,106, 97,112, 97,110, 41, 10, 98, 97,110,103,106, 58, 10, 48, - 58,102,101, 53, 97, 53, 48, 58,102, 48, 58, 51, 48, 58, 48, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42,112,114,111,112, 32, 99,121, 99,108,101, 32, - 40,114,101,118, 46,112,114, 50, 32,118,101,114, 46, 97, 41, 10, 59, 42, - 42, 32, 98,105,116, 32,100,111,100,103,121, 32,116,104,105,115, 32,111, - 110,101, 32, 45, 32,116,104,105,110,107, 32,105,116, 32,115, 97,118,101, - 115, 32,116,111,112, 32,116,101,110, 32,104,105,115, 99,111,114,101,115, - 32,116,104,111, 46, 46, 46, 46, 46, 46, 32, 32, 42, 42, 42, 10,112,114, - 111,112, 99,121, 99,108, 58, 10, 48, 58,101, 48, 52, 48, 51, 49, 58, 55, - 54, 58, 48, 48, 58, 51, 49, 10, 48, 58,101, 49, 53, 98,102, 57, 58, 50, - 50, 54, 58, 48, 48, 58, 48,102, 10, 10, 59, 42, 42, 42, 42, 42, 42,115, - 117,112,101,114, 45,120, 32, 40,110,116, 99, 32, 38, 32,109,105,116, 99, - 104,101,108,108, 41, 10,115,117,112,101,114,120, 58, 10,115,117,112,101, - 114,120,109, 58, 10, 48, 58,100, 48, 55, 99, 48, 58, 54, 56, 58, 51, 50, - 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,115,112,101,101,100, 32, - 97,114,116,116, 97, 99,107, 33, 10,115,112,101,101,100, 97,116,107, 58, - 10, 48, 58, 56, 97, 51, 99, 58, 52, 99, 58, 48, 48, 58, 48,102, 10, 10, - 112, 97, 99,104,101, 97,114,116, 58, 10, 48, 58, 52, 51,100, 49, 58, 50, - 58, 52,101, 58, 53, 53, 10, 48, 58, 52,101, 56, 56, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52, 51,101,100, 58, 54, 58, 52, 48, 58, 52, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112, 97, 99,108, 97,110,100, - 46, 99, 10,112, 97, 99,108, 97,110,100, 58, 10,112, 97, 99,108, 97,110, - 100,106, 58, 10,112, 97, 99,108, 97,110,100,106,111, 58, 10,112, 97, 99, - 108, 97,110,100,109, 58, 10,112, 97, 99,108, 97,110,100,106,111, 50, 58, - 10, 48, 58, 50, 49, 52, 48, 58, 52, 97, 58, 48, 48, 58,101, 54, 10, 48, - 58, 50, 48, 53,100, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,112, 97, 99, - 108, 97,110,100,112, 58, 32, 32, 59, 42, 42, 42, 42, 42,110,111,116, 32, - 119,111,114,107,105,110,103, 47,115, 97,118,105,110,103, 32,100,114,105, - 118,101,114, 32,105,115,115,117,101, 32,105, 32,116,104,105,110,107, 10, - 48, 58, 50, 49, 48, 48, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, - 49, 49, 48, 58, 52,101, 58, 48, 48, 58, 50, 52, 10, 48, 58, 50, 49, 49, - 50, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,106,114,112, 97, 99,109, 97,110, 46, 99, 10,106,114,112, 97, 99, - 109, 97,110, 58, 10,102, 97,115,116,106,114, 58, 10,106,114,112, 97, 99, - 97,100, 58, 10,106,114,104,101, 97,114,116,115, 58, 10,106,114,118,101, - 99,116,114, 58, 10,106,114,112, 97, 99,109, 97,110,102, 58, 10, 48, 58, - 52, 55, 53, 49, 58, 48, 49, 58, 52, 56, 58, 52, 56, 10, 48, 58, 52, 55, - 54,100, 58, 48, 54, 58, 52, 48, 58, 52, 48, 10, 48, 58, 52,101, 56, 56, - 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10,106,114,112, 97, 99,109, 98, - 108, 58, 10, 48, 58, 56,101, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 56, 55, 54,100, 58, 54, 58, 52, 48, 58, 52, 48, 10, 48, 58, 56, - 100, 99,101, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,115,116,114,101,101,116, 32,104,101, 97,116, 32, 45, 32, 99, - 97,114,100,105,110, 97,108, 32, 97,109,117,115,101,109,101,110,116,115, - 10,115,116,114,116,104,101, 97,116, 58, 10, 48, 58, 54, 50, 55, 48, 58, - 97, 55, 58, 48, 49, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 103, 97,105, 97, 32, 99,114,117,115, 97,100,101,114,115, 10,103, 97,105, - 97, 58, 10, 48, 58, 49, 48, 48, 48, 51, 48, 58, 57, 97, 58, 48, 48, 58, - 48, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 97,115,117,114, 97, 32, - 98,108, 97,100,101, 32, 45, 32,115,119,111,114,100, 32,111,102, 32,100, - 121,110, 97,115,116,121, 32, 40,106, 97,112, 97,110, 41, 10, 97,115,117, - 114, 97, 98,108,100, 58, 10, 48, 58, 52, 48, 51, 54,101, 97, 58, 50, 58, - 48, 48, 58, 48, 97, 10, 48, 58, 52, 48, 51, 55, 48, 97, 58, 52, 58, 48, - 52, 58, 48, 55, 10, 48, 58, 52, 48, 51, 55, 52, 97, 58, 52, 58, 48, 48, - 58, 53, 48, 10, 48, 58, 52, 48, 51, 55, 56, 97, 58, 52, 58, 48, 57, 58, - 48, 49, 10, 48, 58, 52, 48, 51, 54, 56, 98, 58, 49, 58, 49, 48, 58, 49, - 48, 10, 48, 58, 52, 48, 51, 54, 97, 97, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,119,105,110, 32,101, 97,103, - 108,101, 32,105,105, 32, 45, 32,116,104,101, 32,114,101,115, 99,117,101, - 32,109,105,115,115,105,111,110, 10,116,119,105,110,101, 97,103, 50, 58, - 10, 48, 58,101, 50, 48, 56, 58, 51, 58, 52, 48, 58, 48,102, 10, 48, 58, - 49, 53, 53, 55, 50, 58, 50,102, 58, 52, 48, 58, 48, 97, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,117,108,116,114, 97, 32,120, 32,119,101, 97,112, - 111,110,115, 32, 47, 32,117,108,116,114, 97, 32,107,101,105, 98,105,116, - 97,105, 10,117,108,116,114, 97,120, 58, 10,117,108,116,114, 97,120,103, - 58, 10, 48, 58, 49, 97, 99, 56,101, 58, 50, 56, 58, 52, 48, 58, 48, 52, - 10, 48, 58,101, 50, 51, 99, 58, 51, 58, 52, 48, 58, 48,102, 10, 10, 59, - 42, 42, 98,116,105,109,101, 32, 98,121, 32, 90,105,108,108,101,114, 32, - 10,118,101, 99, 98,116,105,109,101, 58, 10, 48, 58, 48, 48, 51, 51, 58, - 50, 55, 58, 48, 48, 58, 70, 70, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 99,101,110,116,105,112,101,100, 46, 99, 32, 98,121, 32, 90,105,108,108, - 101,114, 32, 10, 99,101,110,116,105,100,117,120, 58, 10,112, 97, 99,105, - 112,101,100,101, 58, 10,118,101, 99,116,105,112,101,100, 58, 10,118,101, - 99,116,114,112,101,100, 58, 10,107,105,108,108,105,112,101,100, 58, 10, - 48, 58, 48, 48, 48, 98, 58, 48,102, 58, 49, 48, 58, 48, 49, 10, 48, 58, - 48, 48, 50, 51, 58, 48,102, 58, 48, 52, 58, 49, 50, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,100,107,111,110,103, 46, 99, 32, 98,121, 32, 90, - 105,108,108,101,114, 32, 10,107,111,110,103, 50, 54, 48, 48, 58, 10, 48, - 58, 54, 49, 48, 48, 58, 65, 65, 58, 57, 52, 58, 55, 54, 10, 48, 58, 54, - 48, 66, 56, 58, 48, 51, 58, 53, 48, 58, 48, 48, 10, 48, 58, 55, 54, 52, - 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 54, 50, 49, 58, - 48, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 54, 48, 49, 58, 48, 49, - 58, 48, 55, 58, 48, 55, 10, 48, 58, 55, 53,101, 49, 58, 48, 49, 58, 48, - 54, 58, 48, 54, 10, 48, 58, 55, 53, 99, 49, 58, 48, 49, 58, 48, 53, 58, - 48, 53, 10, 48, 58, 55, 53, 97, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, - 10, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,103, 97, - 46, 99, 32, 98,121, 32, 90,105,108,108,101,114, 32, 10,103, 97,108, 97, - 103, 97, 57, 57, 58, 10,118,103, 97,108, 97,103, 97, 58, 10, 48, 58, 56, - 97, 50, 48, 58, 50,100, 58, 48, 48, 58, 49, 56, 10, 48, 58, 56, 51,101, - 100, 58, 54, 58, 48, 48, 58, 50, 52, 10, 10, 59, 42, 42,103, 97,108, 97, - 120,105, 97,110, 58, 32, 98,121, 32, 90,105,108,108,101,114, 32, 10, 98, - 117,103,108, 97,120,110, 58, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,105,108, - 108,105,112,101,100, 46, 99, 32, 98,121, 32, 90,105,108,108,101,114, 32, - 10,115,105,108,108,105,112,101,100, 58, 10, 48, 58, 54, 52, 58, 51, 48, - 58, 55, 53, 58, 49, 55, 10, 48, 58, 50, 52, 58, 49, 58, 97, 48, 58, 97, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,114,100,111, 46, 99, - 32, 98,121, 32, 90,105,108,108,101,114, 32, 10,109,114,100,105,103,100, - 111, 58, 10, 48, 58,101, 48, 49, 55, 58, 54, 52, 58, 48, 49, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42,122,101,114,111, 32,112,111,105,110, - 116, 32, 50, 10,122,101,114,111,112,110,116, 50, 58, 10, 48, 58,102,101, - 57, 48, 49, 97, 58, 51, 55, 58, 49, 52, 58, 48, 48, 10, 48, 58,102,101, - 57, 48, 52, 99, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 56, 98, 97,108, - 108, 97, 99,116, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, - 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111, - 114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101, - 110,116,114,121, 93, 10, 56, 98, 97,108,108, 97, 99,116, 50, 58, 10, 48, - 58, 49,100, 50, 56, 58, 48, 54, 58, 48, 48, 58, 49, 98, 10, 48, 58, 49, - 100, 52, 54, 58, 48, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49,100, 50, - 101, 58, 48, 54, 58, 48, 48, 58, 49, 98, 10, 48, 58, 49,100, 53, 48, 58, - 48, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49,100, 51, 52, 58, 48, 54, - 58, 48, 48, 58, 49, 98, 10, 48, 58, 49,100, 53, 97, 58, 48, 97, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 49,100, 51, 97, 58, 48, 54, 58, 48, 48, 58, - 49, 98, 10, 48, 58, 49,100, 54, 52, 58, 48, 97, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 49,100, 52, 48, 58, 48, 54, 58, 48, 48, 58, 49, 98, 10, 48, - 58, 49,100, 54,101, 58, 48, 97, 58, 48, 48, 58, 48, 48, 10, 56, 98,112, - 109, 58, 10, 48, 58, 49, 99, 54, 99, 58, 48, 54, 58, 48, 48, 58, 49, 98, - 10, 48, 58, 49, 99, 56, 97, 58, 48, 97, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 49, 99, 55, 50, 58, 48, 54, 58, 48, 48, 58, 49, 98, 10, 48, 58, 49, - 99, 57, 52, 58, 48, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 99, 55, - 56, 58, 48, 54, 58, 48, 48, 58, 49, 98, 10, 48, 58, 49, 99, 57,101, 58, - 48, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 99, 55,101, 58, 48, 54, - 58, 48, 48, 58, 49, 98, 10, 48, 58, 49, 99, 97, 56, 58, 48, 97, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 49, 99, 56, 52, 58, 48, 54, 58, 48, 48, 58, - 49, 98, 10, 48, 58, 49, 99, 98, 50, 58, 48, 97, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42,115,112,101, 99,105, 97,108, 32,102, - 111,114, 99,101,115, 32, 73, 73, 40, 66,121, 32, 70,105,114,101, 98,114, - 97,110,100, 41, 10,115,112, 99,102,114, 99,105,105, 58, 10, 48, 58, 49, - 97, 50, 50, 58, 49, 58, 51, 51, 58, 51, 51, 10, 48, 58, 49, 97, 50, 55, - 58, 53, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,115, - 112,101, 99,105, 97,108, 32,102,111,114, 99,101,115, 40, 66,121, 32, 70, - 105,114,101, 98,114, 97,110,100, 41, 10,115,112, 99,108,102,111,114, 99, - 58, 10, 48, 58, 49, 97, 50, 50, 58, 49, 58, 51, 51, 58, 51, 51, 10, 48, - 58, 49, 97, 50, 55, 58, 53, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42,115,116,114,105,107,101, 32, 98,111,119,108,105,110,103, - 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10, 59, 42, 42, - 42, 42,110,111, 32,104,105,115, 99,111,114,101, 32,108,105,115,116, 32, - 112,101,114, 32,115,101, 32, 98,117,116, 32,116,104,105,115, 32,119,105, - 108,108, 32,115, 97,118,101, 32,116,104,101, 32,116,111,112, 32, 53, 32, - 114,101,115,117,108,116,115, 32,112,101,114,109, 97,110, 97,110,116,108, - 121, 10, 59, 42, 42, 42, 42,105,102, 32,121,111,117, 32,108,105,107,101, - 32,105,102, 32,110,111,116, 44, 32,121,111,117, 32, 99, 97,110, 32,100, - 105,115, 97, 98,108,101, 32,116,104,105,115, 10,115, 98,111,119,108,105, - 110,103, 58, 10, 48, 58,102,101, 54, 49, 58,102, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42,114,117,110, 32, 97,110,100, 32,103, - 117,110, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,114, - 117,110,103,117,110, 58, 10, 48, 58, 51, 56, 48, 99, 56, 48, 58, 52, 98, - 58, 52, 98, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,108,111, 99, - 107,101,100, 32, 97,110,100, 32,108,111, 97,100,101,100, 40, 66,121, 32, - 70,105,114,101, 98,114, 97,110,100, 41, 10,108,111, 99,107,108,111, 97, - 100, 58, 10, 48, 58, 49, 48, 50, 55, 48, 51, 58,102, 54, 58, 50, 48, 58, - 49,101, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42,103,114,101, 97,116, 32, - 103,117,110,115, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, - 10,103,114,101, 97,116,103,117,110, 58, 10, 48, 58,101, 48, 48, 98, 58, - 53, 51, 58, 53, 53, 58, 53, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 103,101,110,105,120, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, - 41, 10,103,101,110,105,120, 58, 10, 48, 58, 49, 48, 98,100, 50, 99, 58, - 54, 52, 58, 52,101, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 112,105,116, 32, 38, 32,114,117,110, 10,112,105,116,110,114,117,110, 58, - 10,112,105,116,110,114,117,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, - 42, 80,105,116, 32, 38, 32, 82,117,110, 32, 40,115,101,116, 32, 50, 41, - 10, 48, 58, 56, 55, 49, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 10, 48, - 58, 56, 48, 97, 97, 58, 51, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56, 97, - 50, 49, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 56, 97, 48, 49, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 57,101, 49, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 56, 57, 99, 49, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 56, 57, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 56, 57, 56, 49, 58, 49, 58, 50, 55, 58, 50, 55, 10, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, + 40,101,109,112,105,114,101, 32, 99,105,116,121, 58, 32, 49, 57, 51, 49, + 32, 40, 98,111,111,116,108,101,103, 63, 41, 41, 32, 97,110,100, 32, 99, + 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,101,109,112, 99,105,116,121, 58, 13, 10,101,109,112, 99,105,116,121, + 105, 58, 13, 10,101,109,112, 99,105,116,121,106, 58, 13, 10,115,116,102, + 105,103,104,116, 58, 13, 10,101,109,112, 99,105,116,121,117, 58, 13, 10, + 115,116,102,105,103,104,116, 97, 58, 13, 10,115,116,102,105,103,104,116, + 103, 98, 58, 13, 10, 48, 58,101, 48, 49, 50, 58, 53, 53, 58, 48, 48, 58, + 52, 53, 13, 10, 13, 10,115, 97, 98,111,116,101,110, 98, 58, 13, 10,115, + 97, 98,111,116,101,110, 98, 97, 58, 13, 10, 99, 97, 99,116,117,115, 58, + 13, 10, 48, 58,102, 54,101, 48, 48, 58, 54, 99, 58, 48, 48, 58, 49,101, + 13, 10, 13, 10,112,117, 99,104,105, 99, 97,114, 58, 13, 10,112,117, 99, + 104,105, 99, 97,114,106, 58, 13, 10, 48, 58, 52, 48, 49, 99, 55,101, 58, + 51, 52, 56, 58, 48, 48, 58, 48, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,109,101,103, 97,122,111,110,101, 46, 99, 13, 10,109,101, + 103, 97,122,111,110,101, 58, 13, 10,109,101,103, 97,122,111,110,101,105, + 58, 13, 10,109,101,103, 97,122,111,110,101, 97, 58, 13, 10,109,101,103, + 97,122,111,110,101, 98, 58, 13, 10,109,101,103, 97,122,111,110,101, 99, + 58, 13, 10, 48, 58, 50, 52, 52, 54, 58, 56, 57, 58, 48, 48, 58, 53, 53, + 13, 10, 48, 58, 51, 98, 48, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 40,102,105,110, 97,108, 32, 98,108,111,119, 32, 40,119,111, + 114,108,100, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,102,105,110, 97,108, 98, 58, 13, 10,102,105,110, 97,108, 98,106, 58, + 13, 10,102,105,110, 97,108, 98,117, 58, 13, 10, 48, 58, 49, 48, 49,102, + 50, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 49, 48, + 52, 99, 58, 51, 50, 58, 48, 48, 58, 52, 53, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40,103,111,108,100, 32, + 98,117,103, 41, 13, 10,103,111,108,100, 98,117,103, 58, 13, 10, 48, 58, + 51, 68, 48, 57, 58, 49, 69, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42,116,101,116,114,105,115, 32,116,104,101, 32,103, + 114, 97,110,100, 32,109, 97,115,116,101,114, 32, 40,106, 97,112, 97,110, + 32, 57, 56, 48, 55, 49, 48, 41, 13, 10, 59, 42, 42, 32,116,104,105,115, + 32,115, 97,118,101,115, 32, 34,116,111,100, 97,121, 96,115, 32,115, 99, + 111,114,101,115, 34, 44, 32,116,104,101, 32,103, 97,109,101, 32,115, 97, + 118,101,115, 32,116,104,101, 32,103,114, 97,110,100, 32,109, 97,115,116, + 101,114, 32,115, 99,111,114,101,115, 32,117,115,105,110,103, 32, 42, 42, + 13, 10, 59, 42, 42, 32,110,118,114, 97,109, 32, 40,105, 32,116,104,105, + 110,107, 32, 33, 33, 32, 58, 48, 41, 32, 32, 42, 42, 13, 10,116,103,109, + 106, 58, 13, 10, 48, 58, 56, 48, 49, 55, 49, 49, 57, 56, 58, 51, 53, 58, + 48, 54, 58, 54, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,109,105, + 115,115, 32,112,117,122,122,108,101, 13, 10,109,115,112,117,122,122,108, + 101, 58, 13, 10, 48, 58, 49, 48, 48,102,102, 52, 58, 99, 58, 48, 98, 58, + 102, 52, 13, 10, 48, 58, 49, 48, 48, 54, 48, 56, 58, 50,102, 58, 52,100, + 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,109,111,110,115, + 116,101,114, 32,109, 97,117,108,101,114,115, 32, 40, 69,117,114,111,112, + 101, 32,118,101,114, 32, 69, 65, 65, 41, 38, 32,107,121,117,107,121,111, + 107,117, 32,115,101,110,116, 97,105, 32,100, 97,100, 97,110,100, 97,114, + 110, 32, 40,106, 97,112, 97,110, 32,118,101,114, 32,106, 97, 97, 41, 13, + 10,100, 97,100, 97,110,100,114,110, 58, 13, 10,109,109, 97,117,108,101, + 114,115, 58, 13, 10, 48, 58, 54, 48, 48, 55, 48, 49, 58, 57, 57, 58, 48, + 50, 58,101, 56, 13, 10, 13, 10,104,101, 97,100,111,110,105, 58, 13, 10, + 59, 42, 42, 32,100,111,101,115, 32,110,111,116, 32,115, 97,118,101, 32, + 105,110, 32,103, 97,109,101, 32,116,111,112, 32,115, 99,111,114,101, 44, + 32,111,110,108,121, 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108, + 101, 32,115, 97,118,101,115, 32, 42, 42, 13, 10, 48, 58, 48,101, 58,102, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,104,101, 97,100,111,110, 58, 13, + 10,104,101, 97,100,111,110, 49, 58, 13, 10, 59, 42, 42, 32,100,111,101, + 115, 32,110,111,116, 32,115, 97,118,101, 32,105,110, 32,103, 97,109,101, + 32,116,111,112, 32,115, 99,111,114,101, 44, 32,111,110,108,121, 32,104, + 105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,115, 97,118,101,115, + 32, 42, 42, 13, 10, 48, 58, 99, 55, 56, 48, 58, 49,101, 58, 51, 48, 58, + 51, 48, 13, 10, 13, 10,104,101, 97,100,111,110, 50, 58, 13, 10, 48, 58, + 99, 51, 57, 48, 58, 49, 50, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10,104, + 101, 97,100,111,110,115, 58, 13, 10,104,101, 97,100,111,110,115, 97, 58, + 13, 10,104,101, 97,100,111,110,109,122, 58, 13, 10, 48, 58, 99, 55, 56, + 97, 58,102, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10,104,101, 97,100,111, + 110, 98, 58, 13, 10, 48, 58,102,102, 48, 54, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,109,101,103, 97,116,101, + 99,104, 58, 32,101, 45,115,119, 97,116, 13, 10,109,116, 95,101,115,119, + 97,116, 58, 13, 10, 48, 58,102,102,102,102, 48, 52, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,109,101,103, 97, + 116,101, 99,104, 58, 32, 99,111,108,117,109,110,115, 13, 10,109,116, 95, + 99,111,108,115, 58, 13, 10, 48, 58,102,101,102, 97, 50, 48, 58, 56,101, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,100, + 121,110, 97, 32,103,101, 97,114,115, 13, 10, 59, 42, 42, 32,116,111,112, + 32,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,115, 32, + 115,111,111,110, 32, 97,115, 32, 49,115,116, 32,103, 97,109,101, 32,115, + 116, 97,114,116,115, 32, 42, 42, 13, 10, 59, 42, 42, 32,119, 97,105,116, + 32, 97, 98,111,117,116, 32, 49, 48, 32,115,101, 99,111,110,100,115, 32, + 97,102,116,101,114, 32,103, 97,109,101, 32,115,116, 97,114,116,115, 32, + 98,101,102,111,114,101, 32,101,110,116,101,114,105,110,103, 32, 97, 32, + 99,114,101,100,105,116, 44, 32,111,114, 32,115, 97,118,101, 32,119,111, + 110, 96,116, 32,119,111,114,107, 32, 42, 42, 13, 10,100,121,110, 97,103, + 101, 97,114, 58, 13, 10, 48, 58, 97,102, 58, 50, 99, 58, 56, 48, 58, 53, + 48, 13, 10, 48, 58,102,100, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 99,111,110,116,105,110,101,110,116, 97, + 108, 32, 99,105,114, 99,117,115, 32, 40,119,111,114,108,100, 32, 38, 32, + 117,115, 32,115,101,116, 32, 49, 41, 13, 10, 99,111,110,116, 99,105,114, + 99, 58, 13, 10, 99,111,110,116, 99,105,114, 99,117, 58, 13, 10, 48, 58, + 56, 51, 48, 54, 52, 58, 50, 53, 55, 58, 48, 48, 58, 52, 49, 13, 10, 48, + 58, 56, 52, 53, 56, 50, 58, 52, 58, 48, 48, 58,101, 48, 13, 10, 48, 58, + 56, 50, 54,101,102, 58, 49, 58, 53, 50, 58, 53, 50, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 99,111,110,116,105,110,101,110,116, 97,108, 32, + 99,105,114, 99,117,115, 32, 40,117,115, 32,115,101,116, 32, 50, 41, 13, + 10, 99,111,110,116, 99,105,114, 99,117, 97, 58, 13, 10, 48, 58, 56, 51, + 48, 54, 97, 58, 50, 53, 55, 58, 48, 48, 58, 52, 49, 13, 10, 48, 58, 56, + 52, 53, 56, 50, 58, 52, 58, 48, 48, 58,101, 48, 13, 10, 48, 58, 56, 50, + 54,101,102, 58, 49, 58, 53, 50, 58, 53, 50, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 49, 57, 52, 53,107, 32, 73, 73, 73, 13, 10, 49, 57, + 52, 53,107,105,105,105, 58, 13, 10, 49, 57, 52, 53,107,105,105,105,111, + 58, 13, 10, 48, 58, 49, 48, 48, 97, 50,100, 58, 54, 51, 58, 48, 51, 58, + 56, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,111,110,101, + 32, 43, 32,116,119,111, 13, 10,111,110,101,116,119,111, 58, 13, 10,111, + 110,101,116,119,111,101, 58, 13, 10, 48, 58,102, 99, 97,101, 58, 53, 50, + 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,115,101,103, 97,110,105,110,106, + 58, 13, 10,115,101,103, 97,110,105,110,106,117, 58, 13, 10,110,112,114, + 105,110, 99,101,115, 58, 13, 10,110,112,114,105,110, 99,101,115,117, 58, + 13, 10,110,112,114,105,110, 99,101,115, 98, 58, 13, 10,110,105,110,106, + 97, 58, 13, 10,110,112,114,105,110, 99,101,115,111, 58, 13, 10, 48, 58, + 69, 70, 48, 48, 58, 51, 49, 58, 48, 48, 58, 52, 51, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 82,101,110,106,117, 32, 75,105,122,111,107, + 117, 13, 10,114,101,110,106,117, 58, 13, 10, 48, 58,102, 50, 97, 97, 58, + 50, 56, 58, 98, 56, 58, 48, 49, 13, 10, 48, 58,102, 50,101, 97, 58, 50, + 58, 55, 48, 58, 49, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 78,101,114, 97,116,116,101, 32, 67,104,117, 13, 10,110,114, 97,116,101, + 99,104,117, 58, 13, 10, 48, 58,101, 53, 54, 56, 58, 50, 56, 58, 48, 48, + 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,105,114, + 97,116,101, 32,116,114,101, 97,115,117,114,101, 13, 10,112,105,114, 97, + 116,101,116,114, 58, 13, 10, 48, 58, 50,100, 99, 58, 52,102, 58, 53, 53, + 58, 52, 52, 13, 10, 13, 10, 59, 40,108,101,112,114,101, 99,104, 97,117, + 110, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10, 59, 42, 42, 32,108,101,116, 32,103, + 97,109,101, 32,100,105,115,112,108, 97,121, 32,104,105,115, 99,111,114, + 101, 32,116, 97, 98,108,101, 32, 97, 32,102,101,119, 32,116,105,109,101, + 115, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, + 98,101,102,111,114,101, 32, 42, 42, 13, 10, 59, 42, 42, 32,115,116, 97, + 114,116,105,110,103, 32, 97, 32,103, 97,109,101, 32, 42, 42, 13, 10,108, + 101,112,114,101, 99,104,110, 58, 13, 10,112,111,116,111,103,111,108,100, + 58, 13, 10,108,101,112,114,101, 99,104,112, 58, 13, 10, 48, 58, 48, 50, + 99, 97, 58, 53, 48, 58, 53, 53, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42,115,117,112,101,114, 32,114,105,100,101,114, 13, 10,115, + 117,112,114,114,105,100,114, 58, 13, 10, 48, 58, 56, 48, 99, 97, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 50, 49, 58, 49, 58, 50, + 52, 58, 50, 52, 13, 10, 48, 58, 56, 97, 48, 49, 58, 49, 58, 50, 52, 58, + 50, 52, 13, 10, 48, 58, 56, 57,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, + 13, 10, 48, 58, 56, 57, 99, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, + 48, 58, 56, 57, 97, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, + 56, 57, 56, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42,100,114,105,118,105,110,103, 32,102,111,114, 99,101, + 32, 40,112, 97, 99, 45,109, 97,110, 32, 99,111,110,118,101,114,115,105, + 111,110, 32, 38, 32, 99,108,111,110,101,115, 41, 13, 10,100,114,105,118, + 102,114, 99,112, 58, 13, 10,100,114,105,118,102,114, 99,103, 58, 13, 10, + 100,114,105,118,102,114, 99, 98, 58, 13, 10,100,114,105,118,102,114, 99, + 116, 58, 13, 10, 48, 58, 51, 99, 48, 53, 58, 52, 57, 58, 50, 48, 58, 50, + 48, 13, 10, 48, 58, 51, 99, 49,102, 58, 49, 58, 51, 49, 58, 51, 49, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110, + 111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, + 95,118, 56, 46, 51, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101, + 108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 47,102,105, + 114,101, 98,114, 97,110,100, 47,103,101,111,109, 97,110, 47,111,116,104, + 101,114,115, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,115,112,105,110,110,101,114, 13, 10,115,112,105,110,110, + 101,114, 58, 13, 10, 48, 58, 49, 99, 49, 49, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 49,101, 52, 48, 58,102, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, + 49, 56, 46, 99, 32, 40,115,104, 97,100,111,119, 32,100, 97,110, 99,101, + 114, 41, 13, 10,115,104,100, 97,110, 99,101,114, 58, 13, 10,115,104,100, + 97,110, 99,101,114,106, 58, 13, 10,115,104,100, 97,110, 99, 98,108, 58, + 13, 10,115,104,100, 97,110, 99,101,114, 49, 58, 13, 10, 48, 58,102,102, + 101, 99, 50, 52, 58, 49, 51, 97, 52, 58, 56, 48, 58, 53, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 99,111,111,116,101,114, 32,115, + 104,111,111,116,101,114, 13, 10,115, 99,111,116,114,115,104,116, 58, 13, + 10, 48, 58, 49, 99, 97, 48, 58, 52, 54, 58, 48, 49, 58, 49,100, 13, 10, + 48, 58, 49, 57, 57, 99, 58, 51, 58, 48, 49, 58, 52, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 77, 84, 86, 32, 82,111, 99,107, 45, 78, + 45, 82,111,108,108, 32, 84,114,105,118,105, 97, 32, 40, 80, 97,114,116, + 32, 50, 41, 13, 10,114,111, 99,107,116,114,118, 50, 58, 13, 10, 48, 58, + 52, 99, 50, 99, 58, 51, 99, 58, 52, 52, 58, 48, 13, 10, 48, 58, 52, 99, + 54, 54, 58, 49, 58, 50, 53, 58, 50, 53, 13, 10, 48, 58, 52, 51,101,100, + 58, 54, 58, 48, 48, 58, 52, 48, 13, 10, 48, 58, 52, 51,102, 48, 58, 49, + 58, 48, 53, 58, 48, 53, 13, 10, 13, 10,104,105,103,104,115,112,108,116, + 58, 13, 10,104,105,103,104,115,112,108,116, 97, 58, 13, 10, 48, 58, 54, + 48, 97, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 97, + 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 57,100, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 98, 98, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 98, 53, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 54, 48, 97,102, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 54, 48,102, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 54, 48,101, 99, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 54, 48,101, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, + 48, 99,100, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99, + 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99, 49, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,104,105,103,104,115,112,108, + 116, 98, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,112, 97, 99,101, 32, + 70,101,118,101,114, 32, 72,105,103,104, 32, 83,112,108,105,116,116,101, + 114, 32, 40, 97,108,116, 32, 83,111,117,110,100, 41, 13, 10, 48, 58, 54, + 48, 97, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48,102, + 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48,101, 99, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48,101, 55, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 97, 51, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 54, 48, 57,100, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 54, 48, 98, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 54, 48, 98, 53, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 54, 48, 97,102, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, + 48, 99,100, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99, + 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99, 49, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103,121,114,111,100,105,110, + 101,116, 58, 13, 10,103,121,114,111,100,105,110,101, 58, 13, 10, 98,117, + 122,122, 97,114,100, 58, 13, 10, 48, 58,102, 51, 48, 48, 58, 52, 53, 58, + 48, 48, 58, 48, 98, 13, 10, 48, 58, 57, 52,101, 50, 58, 49, 58, 48, 49, + 58, 48, 49, 13, 10, 48, 58, 57, 52, 97, 50, 58, 49, 58, 48, 49, 58, 48, + 49, 13, 10, 48, 58, 57, 52, 54, 50, 58, 49, 58, 48, 51, 58, 48, 51, 13, + 10, 48, 58, 57, 52, 50, 50, 58, 49, 58, 48, 54, 58, 48, 54, 13, 10, 48, + 58, 57, 51,101, 50, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, 48, 58, 57, + 51, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 51, 54, + 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 51, 50, 50, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100,107,111,110,103, 51, 58, + 13, 10,100,107,111,110,103, 51,106, 58, 13, 10,100,107,111,110,103, 51, + 98, 58, 13, 10, 48, 58, 54, 98, 48, 48, 58, 97, 97, 58,102, 51, 58, 55, + 54, 13, 10, 48, 58, 54, 99, 50, 48, 58, 52, 48, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 54, 99, 49, 54, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 54, 56,102, 51, 58, 48, 51, 58, 48, 49, 58, 48, 48, 13, 10, + 13, 10, 99,104, 97,110,103,101,115, 58, 13, 10,108,111,111,112,101,114, + 58, 13, 10, 99,104, 97,110,103,101,115, 97, 58, 13, 10, 48, 58, 56, 57, + 57, 97, 58, 54, 58, 50, 54, 58, 50, 55, 13, 10, 48, 58, 56, 57, 98, 97, + 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 49, 97, 58, 54, + 58, 50, 54, 58, 50, 55, 13, 10, 48, 58, 56, 97, 51, 97, 58, 54, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 57, 97, 58, 54, 58, 50, 54, 58, + 50, 55, 13, 10, 48, 58, 56, 97, 98, 97, 58, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 40,118,105,111,108,101,110, 99,101, 32,102,105,103, + 104,116, 32, 40,119,111,114,108,100, 41, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,118,105,111,102,105,103,104,116, 58, 13, 10, + 118,105,111,102,105,103,104,116,117, 58, 13, 10,118,105,111,102,105,103, + 104,116,106, 58, 13, 10, 48, 58, 97, 48, 50, 56, 48, 48, 58, 50, 56, 58, + 48, 50, 58, 50, 48, 13, 10, 13, 10, 59, 84,101,101,110, 97,103,101, 32, + 77,117,116, 97,110,116, 32, 78,105,110,106, 97, 32, 84,117,114,116,108, + 101,115, 32, 40, 85, 83, 32, 38, 32, 99,108,111,110,101,115, 41, 13, 10, + 116,109,110,116, 58, 13, 10,116,109,110,116,106, 58, 13, 10,116,109,110, + 116,117, 97, 58, 13, 10,116,109,104,116, 50,112, 58, 13, 10,116,109,110, + 116, 50,112,111, 58, 13, 10,116,109,110,116, 50,112,106, 58, 13, 10,116, + 109,104,116, 58, 13, 10,116,109,110,116,117, 58, 13, 10,116,109,104,116, + 50,112, 97, 58, 13, 10,116,109,104,116, 97, 58, 13, 10,116,109,104,116, + 98, 58, 13, 10, 48, 58, 54, 51, 53, 48, 48, 58,102, 51, 58, 48, 51, 58, + 52, 49, 13, 10, 13, 10, 59, 40,115,116,114,105,107,101,114,115, 32, 49, + 57, 52, 53, 41, 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, + 10,115, 49, 57, 52, 53, 58, 13, 10,115, 49, 57, 52, 53,106, 58, 13, 10, + 115, 49, 57, 52, 53,106,110, 58, 13, 10,115, 49, 57, 52, 53, 97, 58, 13, + 10,115, 49, 57, 52, 53,107, 58, 13, 10,115, 49, 57, 52, 53, 98,108, 58, + 13, 10, 48, 58,102,101, 50, 97,102, 56, 58, 55, 56, 58, 50,100, 58,102, + 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104,105,101, + 110,114,121,117, 13, 10,115,104,105,101,110,114,121,117, 58, 13, 10, 48, + 58, 54, 48, 97,100, 99, 51, 52, 58, 55,101, 99, 58, 53, 52, 58, 49, 48, + 13, 10, 48, 58, 54, 48, 97, 99, 98, 99, 52, 58, 52, 58, 48, 48, 58,101, + 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 87,105,103,103, + 105,101, 32, 87, 97,103,103,105,101, 13, 10,119,105,103,103,105,101, 58, + 13, 10, 48, 58,102,102,101, 49, 48, 56, 58, 53, 52, 58, 48, 48, 58, 52, + 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,105,109,101, + 112,108,116, 46, 99, 13, 10,116,105,109,101,112,108,116, 58, 13, 10,116, + 105,109,101,112,108,116, 99, 58, 13, 10,115,112, 97, 99,101,112,108,116, + 58, 13, 10,116,105,109,101,112,108,116, 97, 58, 13, 10, 48, 58, 97, 98, + 48, 56, 58, 50, 56, 58, 48, 48, 58,102, 49, 13, 10, 48, 58, 97, 57, 56, + 98, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,109, 97,104,111,117, + 100, 97,105, 58, 13, 10,115,115,116,114,105,107,101,114, 97, 58, 13, 10, + 115,115,116,114,105,107,101,114, 58, 13, 10, 48, 58, 49, 48, 48, 50, 57, + 97, 58, 97, 52, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,115,112, 97, 99,101, 32,108, 97,117,110, 99,104,101, + 114, 13, 10,115,112, 97, 99,101,108,110, 99, 58, 13, 10, 48, 58, 54, 48, + 98,100, 58, 50, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,112, 97, + 99,101,102,101,118, 58, 13, 10,115,112, 97, 99,101,102,101,118,111, 58, + 13, 10,115,112, 97, 99,101,102,101,118,111, 50, 58, 13, 10, 48, 58, 54, + 48,101, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48,102, + 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48,101, 99, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 83,112, 97, 99,101, 32, 70,101,118,101,114, 32, 40, 98,108, 97, 99, + 107, 32, 97,110,100, 32,119,104,105,116,101, 32,115,101,116, 32, 50, 41, + 13, 10,115,102,101,118,114, 98,119, 97, 58, 13, 10,115,102,101,118,101, + 114, 98,119, 58, 13, 10, 48, 58, 54, 48, 57,100, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 54, 48, 97, 51, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 54, 48, 97, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 54, 48, 97,102, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 54, 48, 98, 53, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, + 98, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99, 49, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99, 55, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 99,100, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 54, 48,101, 55, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 54, 48,101, 99, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 54, 48,102, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,103, 97, 46, + 99, 13, 10,103, 97,108, 97,103, 97, 58, 13, 10,103, 97,108, 97,103, 97, + 109,107, 58, 13, 10,103, 97,108, 97,103, 97,109,119, 58, 13, 10,103, 97, + 108, 97,103, 97,111, 58, 13, 10,103, 97,108, 97,103, 97,100,115, 58, 13, + 10,103, 97,108,108, 97,103, 58, 13, 10,103, 97,108, 97,103, 97, 98, 50, + 58, 13, 10,103, 97,108, 97,103, 97, 56, 52, 58, 13, 10,103, 97,108, 97, + 103, 97,109,102, 58, 13, 10, 48, 58, 56, 97, 50, 48, 58, 50,100, 58, 48, + 48, 58, 49, 56, 13, 10, 48, 58, 56, 51,101,100, 58, 54, 58, 48, 48, 58, + 50, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,117,108, + 108,115, 32,101,121,101, 32,100, 97,114,116,115, 13, 10, 98,117,108,108, + 115,100,114,116, 58, 13, 10, 98,117,108,108,115,100,114,116,103, 58, 13, + 10, 48, 58, 53, 99, 48, 53, 58, 56, 55, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 53, 99, 53,101, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, + 53, 99, 48, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,116,111, 97,112,108, 97,110, 50, 46, 99, 13, + 10, 98, 97,116,116,108,101,103, 58, 13, 10, 98, 97,116,116,108,101,103, + 98, 58, 13, 10, 48, 58, 49, 48, 99, 97, 52, 99, 58,101,100, 58, 48, 48, + 58, 50, 97, 13, 10, 48, 58, 49, 48, 49, 50, 52, 49, 58, 49, 58, 52, 53, + 58, 52, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,116, + 101,116,114,105,115, 46, 99, 13, 10, 97,116,101,116,114,105,115, 58, 13, + 10, 97,116,101,116,114,105,115, 98, 50, 58, 13, 10, 97,116,101,116,114, + 105,115, 97, 58, 13, 10, 97,116,101,116,114,105,115, 98, 58, 13, 10, 97, + 116,101,116,114,105,115, 99, 50, 58, 13, 10, 97,116,101,116,114,105,115, + 99, 58, 13, 10, 97,116,101,116,114,105,115, 98, 51, 58, 13, 10, 59, 48, + 58, 57, 55, 57, 58, 57, 48, 58, 51, 48, 58, 53, 50, 13, 10, 48, 58, 57, + 57,100, 58, 51, 99, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 57,101, 98, + 58, 49,101, 58, 52, 98, 58, 53, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,116,117,114, 98,111, 46, 99, 32, 40, 98,117, 99,107, 32, + 114,111,100,103,101,114,115, 58, 32,112,108, 97,110,101,116, 32,111,102, + 32,100,111,111,109, 32, 38, 32, 99,108,111,110,101,115, 41, 13, 10, 59, + 42, 42, 32,115, 99,111,114,101,115, 32,111,110, 32,116,104,101, 32,115, + 105,100,101, 32,111,102, 32,115, 99,114,101,101,110, 32,100,111,110, 96, + 116, 32,100,105,115,112,108, 97,121, 32,117,110,116,105,108,108, 32, 49, + 115,116, 32,103, 97,109,101, 32,105,115, 32,111,118,101,114, 32, 42, 42, + 13, 10, 59, 42, 42, 32, 97,108,115,111, 32,116,111,112, 32,115,105,100, + 101, 32,115, 99,111,114,101, 32,109, 97,121, 32,100,105,115,112,108, 97, + 121, 32, 49, 32,100,105,103,105,116, 32,117,110,116,105,108,108, 32, 49, + 115,116, 32,103, 97,109,101, 32,105,115, 32,111,118,101,114, 32, 42, 42, + 13, 10, 98,117, 99,107,114,111,103, 58, 13, 10, 98,117, 99,107,114,111, + 103,110, 58, 13, 10, 98,117, 99,107,114,111,103,110, 50, 58, 13, 10, 48, + 58, 99, 52, 48, 48, 58, 51,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 99, 53, 52, 57, 58, 49, 48, 58,102,102, 58,102,102, 13, 10, 48, 58, 99, + 53, 52, 98, 58, 49, 58, 48,102, 58, 48,102, 13, 10, 13, 10,122,111,111, + 109, 57, 48, 57, 58, 13, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111, + 114,101, 32,111,110, 32,103, 97,109,101, 32,115, 99,114,101,101,110, 32, + 117,112,100, 97,116,101,100, 32, 97,102,116,101,114, 32, 49,115,116, 32, + 103, 97,109,101, 32, 42, 42, 13, 10, 59, 42, 42, 32, 97,115,115,117,109, + 105,110,103, 32,121,111,117, 32,104, 97,118,101, 32,109, 97,100,101, 32, + 115, 99,111,114,101, 32,100,105,115,112,108, 97,121, 32,105,110, 32,100, + 105,112,115,119,105,116, 99,104, 32,109,101,110,117, 32, 33, 33, 42, 42, + 13, 10, 48, 58, 99, 52, 48, 48, 58, 51,101, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 98,111,116, 97,110,105, 99, 13, + 10, 98,111,116, 97,110,105, 99, 58, 13, 10, 98,111,116, 97,110,105, 99, + 102, 58, 13, 10, 48, 58, 55, 50, 48, 97, 58, 52, 54, 58, 49, 56, 58, 49, + 48, 13, 10, 48, 58, 55, 48, 48, 97, 58, 49,101, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 55, 50, 51, 51, 58, 49, 58, 50, 51, 58, 50, 51, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 98,111,110,103,111, 13, 10, 98,111, + 110,103,111, 58, 13, 10, 48, 58, 56, 51, 48, 48, 58, 49, 49, 58, 48, 58, + 49, 53, 13, 10, 48, 58, 56, 51, 48, 49, 58, 49, 58, 48, 53, 58, 48, 53, + 13, 10, 13, 10,115,112, 97,110,103, 58, 13, 10,115, 98, 98,114,111,115, + 58, 13, 10,115,112, 97,110,103, 98,108, 58, 13, 10,115,112, 97,110,103, + 106, 58, 13, 10, 48, 58,102, 99, 48, 49, 58, 57,101, 58, 48, 48, 58, 48, + 55, 13, 10, 48, 58,101, 49, 53, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,116,114,105,118, 32,102,111,117, + 114, 13, 10,115,116, 97,116,114,105,118, 52, 58, 13, 10, 48, 58, 52, 56, + 50, 98, 58, 49, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42,112, 97,105,114,115, 32,108,111,118,101, 58, 13, 10,112, + 97,105,114,108,111,118,101, 58, 13, 10, 48, 58,102, 48, 48, 55, 52, 56, + 58, 54, 51, 58, 48, 48, 58, 50,100, 13, 10, 13, 10,111,117,116,114,117, + 110, 58, 13, 10,111,117,116,114,117,110, 98, 58, 13, 10, 48, 58, 54, 48, + 52, 54,101, 58, 49, 49, 56, 58, 48, 53, 58, 50, 48, 13, 10, 13, 10,111, + 117,116,114,117,110,114, 97, 58, 13, 10, 48, 58, 54, 48, 52, 54,101, 58, + 49, 49, 56, 58, 48, 53, 58, 50, 48, 13, 10, 48, 58, 54, 48, 52, 99, 56, + 58, 49, 58, 52,102, 58, 52,102, 13, 10, 13, 10,111,117,116,114,117,110, + 100,120, 97, 58, 13, 10,111,117,116,114,117,110,100,120, 58, 13, 10,111, + 117,116,114,117,110,100,120,106, 58, 13, 10, 48, 58, 54, 48, 52, 54,101, + 58, 49, 49, 56, 58, 48, 49, 58, 50, 48, 13, 10, 48, 58, 54, 48, 52, 99, + 56, 58, 49, 58, 52,102, 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,109, 97,112,112,121, 46, 99, 13, 10,109, 97,112,112,121, + 58, 13, 10,109, 97,112,112,121,106, 58, 13, 10, 48, 58, 49, 52, 54, 48, + 58, 50, 56, 58, 48, 48, 58, 52, 49, 13, 10, 48, 58, 49, 51, 56, 53, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 55,101,100, 58, 54, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58, 55,101, 48, 58, 50, 58, 48, 48, 58, + 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,108, 97,115,116, + 32,115,116,114,105,107,101,114, 32, 47, 32,107,121,117,117,107,121,111, + 107,117, 32,110,111, 32,115,116,114,105,107,101,114, 13, 10,107,121,117, + 115,116,114,107,114, 58, 13, 10, 48, 58,102, 48, 48,100, 48, 54, 58, 52, + 102, 58, 52, 49, 58, 52,101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42,109,111, 98,105,108,101, 32,115,117,105,116, 32,103,117,110,100, 97, + 109, 32,101,120, 32,114,101,118,117,101, 13, 10,103,117,110,100, 97,109, + 101,120, 58, 13, 10, 48, 58, 50, 48, 55, 56, 97, 55, 58, 54, 51, 58, 48, + 49, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,103,114, + 97,110,100, 32,115,116,114,105,107,101,114, 32, 50, 32, 40,106, 97,112, + 97,110, 41, 13, 10,103,115,116,114,105,107, 50,106, 58, 13, 10,103,115, + 116,114,105,107, 50,101, 58, 13, 10, 48, 58,102,102, 97,101,102, 51, 58, + 52, 56, 58, 55, 54, 58, 50, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,103,111, 97,108, 32, 96, 57, 50, 13, 10,103,111, 97,108, 57, 50, + 58, 13, 10, 48, 58, 49, 48, 57,102, 53, 55, 58, 57, 57, 58, 50, 56, 58, + 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100, 97,110,103, + 101,114,111,117,115, 32,100,117,110,103,101,111,110,115, 13, 10,100,100, + 117,110,103,101,111,110, 58, 13, 10,100,100,117,110,103,101,111,110,101, + 58, 13, 10, 48, 58, 57, 49, 53, 58, 57, 99, 58, 52, 98, 58, 51, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,112, 97, 99,101, 32, 97, + 116,116, 97, 99,107, 47,104,101, 97,100, 32,111,110, 13, 10,115,115,112, + 97, 99, 97,104,111, 58, 13, 10, 48, 58,101, 52, 99, 98, 58, 99, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 56, 55, 56, 97, 58,102, 58, 51, 48, 58, + 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 98,111,120,121, + 32, 98,111,121, 32, 40,117,115, 41, 32, 38, 32,115,111,117,107,111, 32, + 98, 97,110, 32,100,101,108,117,120,101, 32, 40,106, 97,112, 97,110, 41, + 13, 10, 59, 42, 42, 32,100,111, 32,110,111,116, 32,117,115,101, 32,105, + 110, 32,103, 97,109,101, 32,114,101,115,101,116, 32, 40,102, 51, 41, 32, + 111,114, 32,115, 97,118,101, 32,102, 97,105,108,115, 32, 33, 33, 32, 42, + 42, 13, 10, 59, 42, 42, 32,115, 97,118,101,115, 32,104,105, 45,115, 99, + 111,114,101, 32, 97,110,100, 32,104,105,115, 99,111,114,101, 32,116, 97, + 98,108,101, 32, 45, 32,110,111,116, 32,115,116,101,112, 32,114,101, 99, + 111,114,100,115, 32, 42, 42, 13, 10, 98,111,120,121, 98,111,121, 58, 13, + 10,115,111,117,107,111, 98,100,120, 58, 13, 10, 48, 58, 50, 50,100, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 53, 53, 58, 50, 99, 58, + 48, 57, 58, 48, 48, 13, 10, 48, 58, 53, 48, 48,102, 58, 49, 58, 48, 51, + 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,111,115, + 109,111, 13, 10, 99,111,115,109,111, 58, 13, 10, 48, 58, 50, 48, 51, 56, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,101, 50, 50, 58, 49, + 58, 55, 99, 58, 55, 99, 13, 10, 48, 58, 50,101, 52, 50, 58, 49, 58, 56, + 50, 58, 56, 50, 13, 10, 48, 58, 50,101, 54, 50, 58, 49, 58, 56, 50, 58, + 56, 50, 13, 10, 48, 58, 50,101, 56, 50, 58, 49, 58, 56, 50, 58, 56, 50, + 13, 10, 48, 58, 50,101, 97, 50, 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, + 48, 58, 50,102, 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 50,102, 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, + 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 56, 50, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 97, 50, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 50, 50, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 52, 50, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 48, 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 51, 48, 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 51, 48, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 51, 49, 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, + 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 54, 50, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 56, 50, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 97, 50, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 51, 50, 50, 50, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 50, 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 51, 50, 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 51, 50, 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 51, 50, 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 51, + 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 51, 52, 50, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 51, 54, 50, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 51, 56, 50, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 51, 51, 97, 50, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 52, 50, 50, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 51, 52, 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 51, 52, 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 51, 52, 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 52, + 97, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 97,115,116,101,114,111, 99,107, 13, 10, 97,115,116,101, + 114,111, 99,107, 58, 13, 10, 97,115,116,101,114,111, 99,107,118, 58, 13, + 10, 48, 58, 49, 99, 58, 51, 53, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 40,106, 97, 99,107, 97,108, 32, + 40,119,111,114,108,100, 41, 38, 32,116,111,112, 32,103,117,110,110,101, + 114, 32, 40,117,115, 41, 38, 32,116,111,112, 32,103,117,110,110,101,114, + 32, 40, 98,111,111,116,108,101,103, 41, 32, 38, 32,116,111,107,117,103, + 104,117, 32, 98,117,116, 97,105, 32,106, 97, 99,107, 97,108, 32, 40,106, + 97,112, 97,110, 41, 13, 10,106, 97, 99,107, 97,108, 58, 13, 10,116,111, + 112,103,117,110,114, 58, 13, 10,116,111,112,103,117,110, 98,108, 58, 13, + 10,106, 97, 99,107, 97,108,106, 58, 13, 10,106, 97, 99,107, 97,108,114, + 58, 13, 10, 49, 58, 55, 50,102, 56, 58, 50, 55, 58, 48, 48, 58, 49,100, + 13, 10, 49, 58, 55, 51, 52, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 49, 58, 55, 51, 52, 49, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, + 112, 97, 99,109, 97,110,105, 97, 58, 13, 10,112, 97, 99,109, 97,110,105, + 97,111, 58, 13, 10, 49, 58, 54, 52, 52, 58, 53, 48, 58, 48, 48, 58, 52, + 100, 13, 10, 49, 58, 54, 49, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,112, 97, 99,109, 97,110,105, 97,106, 58, 13, 10, 49, 58, 54, 49, + 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 49, 58, 54, 49,101, 58, 49, + 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, - 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97, - 108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 56, 46, 49, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 47,102,105,114,101, 98,114, 97,110,100, - 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 32, 42, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97, + 116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105, + 103,104,115, 99,111,114,101, 95,118, 56, 46, 50, 32, 97,100,100,105,116, + 105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101, + 101,122,101,114, 47,102,105,114,101, 98,114, 97,110,100, 47,103,101,111, + 109, 97,110, 47,111,116,104,101,114,115, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,101,118,105,108, 32,115, - 116,111,110,101, 10, 59, 42, 42, 32,116,104,101, 32,103, 97,109,101, 32, - 104,105,115, 99,111,114,101, 32,105,115, 32,110,111,116, 32,119,111,114, - 107,105,110,103, 44, 32, 98,117,116, 32,116,104,101, 32,104,105,115, 99, - 111,114,101, 32,116, 97, 98,108,101, 32,115, 97,118,101,115, 32,111,107, - 32, 42, 42, 10,101,118,105,108,115,116,111,110, 58, 10, 48, 58, 97, 55, - 56, 50, 58, 51, 99, 58, 48, 49, 58, 50,101, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 99,104, 97,110,103,101, 32, 97,105,114, 32, 98,108, 97,100,101, - 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10, 99, 97,105, - 114, 98,108, 97,100, 58, 10, 48, 58, 53, 56, 48, 48, 51, 48, 58, 98, 49, - 58, 97, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,116, - 97,100,105,117,109, 32, 99,114,111,115,115, 10,115, 99,114,111,115,115, - 58, 10,115, 99,114,111,115,115,117, 58, 10,115, 99,114,111,115,115, 97, - 58, 10, 48, 58, 55, 48, 49,102, 98, 48, 58, 51,102, 58, 53, 51, 58, 48, - 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,114, 50,100, 32,116, 97,110, - 107, 10,114, 50,100,116, 97,110,107, 58, 10, 48, 58, 52, 51, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 52, 56, 58, 49, 58, 97, 57, 58, 97, 57, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,103,114, 97,110,100, 32,116,111, - 117,114, 10,103,114,110,100,116,111,117,114, 58, 10, 48, 58,102, 49, 56, - 50, 58, 50, 57, 58, 52, 49, 58, 48, 48, 10, 48, 58,102, 49,100,100, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,101, - 110,105,103,109, 97, 32, 50, 10,101,110,105,103,109, 97, 50, 58, 10,101, - 110,105,103,109, 97, 50, 97, 58, 10,101,110,105,103,109, 97, 50, 98, 58, - 10, 48, 58, 50, 48, 97,102, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 50, 48, 99, 49, 58, 51, 58, 50, 52, 58, 50, 52, 10, 10, 98, 97,116,116, - 108, 99,114,121, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, - 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111, - 114, 32,109, 97,107,105,110,103, 32,116,104,105,115, 32,101,110,116,114, - 121, 32,119,111,114,107, 93, 10, 48, 58, 52, 52, 52, 57, 58, 50, 97, 58, - 52, 56, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,109, 97,103,105, - 99, 97,108, 32,115,112,111,116, 10,109, 97,103,115,112,111,116, 58, 10, - 48, 58, 54, 48, 48, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, - 48, 48, 56, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,114,101,116,111,102,105,110,118, 46, 99, 10,114,101,116, - 111,102,105,110,118, 58, 10,114,101,116,111,102,105,110,118, 50, 58, 10, - 114,101,116,111,102,105,110,118, 49, 58, 10, 48, 58, 57, 57, 56, 48, 58, - 50, 51, 58, 48, 48, 58, 53, 52, 10, 48, 58, 57, 57, 48,102, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,102, - 105,101,108,100, 32,100, 97,121, 32, 97,110,100, 32, 99,108,111,110,101, - 41, 10,102,105,101,108,100,100, 97,121, 58, 10,117,110,100,111,117,107, - 97,105, 58, 32, 10, 48, 58, 99, 48, 48,100, 58, 53, 51, 54, 58, 52, 56, - 58, 49, 49, 10, 48, 58, 97, 49, 57, 48, 58, 49, 58, 48, 51, 58, 48, 51, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,111,122,111,110, 49, 10,111,122, - 111,110, 49, 58, 10, 48, 58, 52, 48, 52, 55, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 51, 48, 48, 58, 52,101, 58, 48, 49, 58, 49, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,109,117,115,116, 97, 99,104,101, 32, - 98,111,121, 10,109,117,115,116, 97, 99,104,101, 58, 10, 48, 58,102, 48, - 48, 48, 58, 53, 48, 58, 48, 48, 58, 52, 55, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,108,101,116,104, 97,108, 32,101,110,102,111,114, 99,101,114, - 115, 32, 73, 73, 32, 45, 32,103,117,110, 32,102,105,103,104,116,101,114, - 115, 32, 40,118,101,114, 32,101, 97, 97, 41, 10,108,101, 50, 58, 10, 48, - 58, 99, 48, 51,100, 57, 56, 58, 51,102, 58, 48, 53, 58, 52, 53, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,120,121, 32,103,117,110, - 110,101,114,115, 10,103, 97,108, 97,120,121,103,110, 58, 10, 48, 58, 48, - 49,101, 57, 99, 58, 49, 57, 48, 58, 53, 48, 58, 48, 48, 10, 48, 58, 48, - 50, 48, 50, 97, 58, 49, 58, 48, 97, 58, 48, 97, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,100,114, 97,103,111,111,110, 32,109,105,103,104,116, - 32, 40,118,101,114, 32,106, 97, 97, 41, 10,100,114, 97,103,111,111,110, - 106, 58, 10, 48, 58, 99, 48, 49, 98, 48, 48, 58, 57, 97, 58, 48, 48, 58, - 98, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,116,101,101, - 108, 32,103,117,110,110,101,114, 32, 50, 41, 10,115,103,117,110,110,101, - 114, 50, 58, 10,115,103,117,110,110,101,114, 50,106, 58, 10, 48, 58, 49, - 48, 56,101, 50, 98, 58, 49, 98, 55, 58, 48, 48, 58, 48, 50, 10, 48, 58, - 49, 48, 56, 99, 54, 98, 58, 57, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,122, 97,118,105,103, 97, 40, 66,121, 32, 70,105, - 114,101, 98,114, 97,110,100, 41, 10,122, 97,118,105,103, 97, 58, 10,122, - 97,118,105,103, 97,106, 58, 10, 48, 58, 48,100, 97, 48, 58, 53, 48, 58, - 48, 48, 58, 50, 48, 10, 48, 58, 49, 48, 50, 54, 58, 53, 58, 49, 52, 58, - 49, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,114,105, 99,107, - 121, 32,100,111, 99, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, - 41, 10,116,114, 99,107,121,100,111, 99, 58, 10, 48, 58,101, 48, 53, 97, - 58, 53, 97, 58, 50,100, 58, 52, 54, 32, 10, 10,115,100,116,101,110,110, - 105,115, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,108, 97,100,121, 32,102,114, + 111,103, 13, 10,108, 97,100,121,102,114,111,103, 58, 13, 10, 48, 58,101, + 98, 52, 52, 58, 56,102, 58,100, 99, 58, 48, 48, 13, 10, 48, 58,101, 98, + 100, 49, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 98, 97,107,117,114,101,116,115,117, 32, 98,114,101, 97, + 107,101,114, 13, 10, 98, 97,107,117, 98,114,107,114, 58, 13, 10, 48, 58, + 49, 48, 99, 48, 49, 97, 58, 54, 51, 58, 48, 48, 58, 52,101, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,100,101,109,111,110,101,121,101, 45, + 120, 13, 10,100,101,109,111,110,101,121,101, 58, 13, 10, 48, 58, 49, 50, + 56, 58, 98, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,106,117,109,112,105,110,103, 32, 99,114,111,115,115, 13, + 10,106, 99,114,111,115,115, 58, 13, 10, 48, 58,102, 53, 97, 98, 58, 49, + 101, 58, 48, 48, 58, 52, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,100,111,114, 97, 99,104, 97,110, 32, 13, 10,100,111,114, 97, 99, + 104, 97,110, 58, 13, 10, 48, 58, 49, 56, 49, 53, 58, 53, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 53,100, 55, 48, 58, 49, 58, 55, 99, 58, 55, 99, + 13, 10, 48, 58, 53,100, 55, 49, 58, 49, 58, 56, 97, 58, 56, 97, 13, 10, + 48, 58, 53,100, 55, 50, 58, 49, 58, 57, 50, 58, 57, 50, 13, 10, 48, 58, + 53,100, 55, 51, 58, 49, 58, 97, 50, 58, 97, 50, 13, 10, 48, 58, 53,100, + 55, 52, 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, 48, 58, 53,100, 55, 56, + 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, 48, 58, 53,100, 55, 57, 58, 49, + 58, 56, 97, 58, 56, 97, 13, 10, 48, 58, 53,100, 55, 97, 58, 49, 58, 57, + 50, 58, 57, 50, 13, 10, 48, 58, 53,100, 55, 98, 58, 49, 58, 97, 50, 58, + 97, 50, 13, 10, 48, 58, 53,100, 55, 99, 58, 49, 58, 55, 99, 58, 55, 99, + 13, 10, 48, 58, 53,100, 56, 48, 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, + 48, 58, 53,100, 56, 49, 58, 49, 58, 56, 97, 58, 56, 97, 13, 10, 48, 58, + 53,100, 56, 50, 58, 49, 58, 57, 50, 58, 57, 50, 13, 10, 48, 58, 53,100, + 56, 51, 58, 49, 58, 97, 50, 58, 97, 50, 13, 10, 48, 58, 53,100, 56, 52, + 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, 48, 58, 53,100, 56, 56, 58, 49, + 58, 55, 99, 58, 55, 99, 13, 10, 48, 58, 53,100, 56, 57, 58, 49, 58, 56, + 97, 58, 56, 97, 13, 10, 48, 58, 53,100, 56, 97, 58, 49, 58, 57, 50, 58, + 57, 50, 13, 10, 48, 58, 53,100, 56, 98, 58, 49, 58, 97, 50, 58, 97, 50, + 13, 10, 48, 58, 53,100, 56, 99, 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, + 48, 58, 53,100, 57, 48, 58, 49, 58, 55, 99, 58, 55, 99, 13, 10, 48, 58, + 53,100, 57, 49, 58, 49, 58, 56, 97, 58, 56, 97, 13, 10, 48, 58, 53,100, + 57, 50, 58, 49, 58, 57, 50, 58, 57, 50, 13, 10, 48, 58, 53,100, 57, 51, + 58, 49, 58, 97, 50, 58, 97, 50, 13, 10, 48, 58, 53,100, 57, 52, 58, 49, + 58, 55, 99, 58, 55, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,112, + 111,114,107,121, 13, 10,112,111,114,107,121, 58, 13, 10, 48, 58, 49, 99, + 51, 56, 58, 52, 97, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 49, 99, 53, + 54, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 98,105,103, 32, 98,117, 99,107,115, 13, 10, 98,105,103, 98,117, + 99,107,115, 58, 13, 10, 48, 58, 52,100, 55,102, 58, 53,102, 58, 52, 56, + 58, 48, 48, 13, 10, 48, 58, 52,100,100, 99, 58, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 98, 97,110,103, + 33, 32, 40,106, 97,112, 97,110, 41, 13, 10, 98, 97,110,103,106, 58, 13, + 10, 48, 58,102,101, 53, 97, 53, 48, 58,102, 48, 58, 51, 48, 58, 48, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,112,114,111,112, 32, 99,121, + 99,108,101, 32, 40,114,101,118, 46,112,114, 50, 32,118,101,114, 46, 97, + 41, 13, 10, 59, 42, 42, 32, 98,105,116, 32,100,111,100,103,121, 32,116, + 104,105,115, 32,111,110,101, 32, 45, 32,116,104,105,110,107, 32,105,116, + 32,115, 97,118,101,115, 32,116,111,112, 32,116,101,110, 32,104,105,115, + 99,111,114,101,115, 32,116,104,111, 46, 46, 46, 46, 46, 46, 32, 32, 42, + 42, 42, 13, 10,112,114,111,112, 99,121, 99,108, 58, 13, 10, 48, 58,101, + 48, 52, 48, 51, 49, 58, 55, 54, 58, 48, 48, 58, 51, 49, 13, 10, 48, 58, + 101, 49, 53, 98,102, 57, 58, 50, 50, 54, 58, 48, 48, 58, 48,102, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 45,120, 32, 40, + 110,116, 99, 32, 38, 32,109,105,116, 99,104,101,108,108, 41, 13, 10,115, + 117,112,101,114,120, 58, 13, 10,115,117,112,101,114,120,109, 58, 13, 10, + 48, 58,100, 48, 55, 99, 48, 58, 54, 56, 58, 51, 50, 58, 50, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,115,112,101,101,100, 32, 97,114,116, + 116, 97, 99,107, 33, 13, 10,115,112,101,101,100, 97,116,107, 58, 13, 10, + 48, 58, 56, 97, 51, 99, 58, 52, 99, 58, 48, 48, 58, 48,102, 13, 10, 13, + 10,112, 97, 99,104,101, 97,114,116, 58, 13, 10, 48, 58, 52, 51,100, 49, + 58, 50, 58, 52,101, 58, 53, 53, 13, 10, 48, 58, 52,101, 56, 56, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 51,101,100, 58, 54, 58, 52, + 48, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112, + 97, 99,108, 97,110,100, 46, 99, 13, 10,112, 97, 99,108, 97,110,100, 58, + 13, 10,112, 97, 99,108, 97,110,100,106, 58, 13, 10,112, 97, 99,108, 97, + 110,100,106,111, 58, 13, 10,112, 97, 99,108, 97,110,100,109, 58, 13, 10, + 112, 97, 99,108, 97,110,100,106,111, 50, 58, 13, 10, 48, 58, 50, 49, 52, + 48, 58, 52, 97, 58, 48, 48, 58,101, 54, 13, 10, 48, 58, 50, 48, 53,100, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,112, 97, 99,108, 97,110, + 100,112, 58, 32, 32, 59, 42, 42, 42, 42, 42,110,111,116, 32,119,111,114, + 107,105,110,103, 47,115, 97,118,105,110,103, 32,100,114,105,118,101,114, + 32,105,115,115,117,101, 32,105, 32,116,104,105,110,107, 13, 10, 48, 58, + 50, 49, 48, 48, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 49, + 49, 48, 58, 52,101, 58, 48, 48, 58, 50, 52, 13, 10, 48, 58, 50, 49, 49, + 50, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,106,114,112, 97, 99,109, 97,110, 46, 99, 13, 10,106,114, + 112, 97, 99,109, 97,110, 58, 13, 10,102, 97,115,116,106,114, 58, 13, 10, + 106,114,112, 97, 99, 97,100, 58, 13, 10,106,114,104,101, 97,114,116,115, + 58, 13, 10,106,114,118,101, 99,116,114, 58, 13, 10,106,114,112, 97, 99, + 109, 97,110,102, 58, 13, 10, 48, 58, 52, 55, 53, 49, 58, 48, 49, 58, 52, + 56, 58, 52, 56, 13, 10, 48, 58, 52, 55, 54,100, 58, 48, 54, 58, 52, 48, + 58, 52, 48, 13, 10, 48, 58, 52,101, 56, 56, 58, 48, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,106,114,112, 97, 99,109, 98,108, 58, 13, 10, 48, + 58, 56,101, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, + 55, 54,100, 58, 54, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 56,100, 99, + 101, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,115,116,114,101,101,116, 32,104,101, 97,116, 32, 45, 32, 99, + 97,114,100,105,110, 97,108, 32, 97,109,117,115,101,109,101,110,116,115, + 13, 10,115,116,114,116,104,101, 97,116, 58, 13, 10, 48, 58, 54, 50, 55, + 48, 58, 97, 55, 58, 48, 49, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,103, 97,105, 97, 32, 99,114,117,115, 97,100,101,114,115, + 13, 10,103, 97,105, 97, 58, 13, 10, 48, 58, 49, 48, 48, 48, 51, 48, 58, + 57, 97, 58, 48, 48, 58, 48, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 97,115,117,114, 97, 32, 98,108, 97,100,101, 32, 45, 32,115,119, + 111,114,100, 32,111,102, 32,100,121,110, 97,115,116,121, 32, 40,106, 97, + 112, 97,110, 41, 13, 10, 97,115,117,114, 97, 98,108,100, 58, 13, 10, 48, + 58, 52, 48, 51, 54,101, 97, 58, 50, 58, 48, 48, 58, 48, 97, 13, 10, 48, + 58, 52, 48, 51, 55, 48, 97, 58, 52, 58, 48, 52, 58, 48, 55, 13, 10, 48, + 58, 52, 48, 51, 55, 52, 97, 58, 52, 58, 48, 48, 58, 53, 48, 13, 10, 48, + 58, 52, 48, 51, 55, 56, 97, 58, 52, 58, 48, 57, 58, 48, 49, 13, 10, 48, + 58, 52, 48, 51, 54, 56, 98, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, + 58, 52, 48, 51, 54, 97, 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,116,119,105,110, 32,101, 97,103,108, + 101, 32,105,105, 32, 45, 32,116,104,101, 32,114,101,115, 99,117,101, 32, + 109,105,115,115,105,111,110, 13, 10,116,119,105,110,101, 97,103, 50, 58, + 13, 10, 48, 58,101, 50, 48, 56, 58, 51, 58, 52, 48, 58, 48,102, 13, 10, + 48, 58, 49, 53, 53, 55, 50, 58, 50,102, 58, 52, 48, 58, 48, 97, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,117,108,116,114, 97, 32,120, 32, + 119,101, 97,112,111,110,115, 32, 47, 32,117,108,116,114, 97, 32,107,101, + 105, 98,105,116, 97,105, 13, 10,117,108,116,114, 97,120, 58, 13, 10,117, + 108,116,114, 97,120,103, 58, 13, 10, 48, 58, 49, 97, 99, 56,101, 58, 50, + 56, 58, 52, 48, 58, 48, 52, 13, 10, 48, 58,101, 50, 51, 99, 58, 51, 58, + 52, 48, 58, 48,102, 13, 10, 13, 10, 59, 42, 42, 98,116,105,109,101, 32, + 98,121, 32, 90,105,108,108,101,114, 13, 10,118,101, 99, 98,116,105,109, + 101, 58, 13, 10, 48, 58, 48, 48, 51, 51, 58, 50, 55, 58, 48, 48, 58, 70, + 70, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,101,110,116,105, + 112,101,100, 46, 99, 32, 98,121, 32, 90,105,108,108,101,114, 13, 10, 99, + 101,110,116,105,100,117,120, 58, 13, 10,112, 97, 99,105,112,101,100,101, + 58, 13, 10,118,101, 99,116,105,112,101,100, 58, 13, 10,118,101, 99,116, + 114,112,101,100, 58, 13, 10,107,105,108,108,105,112,101,100, 58, 13, 10, + 48, 58, 48, 48, 48, 98, 58, 48,102, 58, 49, 48, 58, 48, 49, 13, 10, 48, + 58, 48, 48, 50, 51, 58, 48,102, 58, 48, 52, 58, 49, 50, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,100,107,111,110,103, 46, 99, 32, 98, + 121, 32, 90,105,108,108,101,114, 13, 10,107,111,110,103, 50, 54, 48, 48, + 58, 13, 10, 48, 58, 54, 49, 48, 48, 58, 65, 65, 58, 57, 52, 58, 55, 54, + 13, 10, 48, 58, 54, 48, 66, 56, 58, 48, 51, 58, 53, 48, 58, 48, 48, 13, + 10, 48, 58, 55, 54, 52, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 55, 54, 50, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 55, 54, 48, 49, 58, 48, 49, 58, 48, 55, 58, 48, 55, 13, 10, 48, 58, + 55, 53,101, 49, 58, 48, 49, 58, 48, 54, 58, 48, 54, 13, 10, 48, 58, 55, + 53, 99, 49, 58, 48, 49, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 55, 53, + 97, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,103, 97, 46, 99, 32, 98, + 121, 32, 90,105,108,108,101,114, 13, 10,103, 97,108, 97,103, 97, 57, 57, + 58, 13, 10,118,103, 97,108, 97,103, 97, 58, 13, 10, 48, 58, 56, 97, 50, + 48, 58, 50,100, 58, 48, 48, 58, 49, 56, 13, 10, 48, 58, 56, 51,101,100, + 58, 54, 58, 48, 48, 58, 50, 52, 13, 10, 13, 10, 59, 42, 42,103, 97,108, + 97,120,105, 97,110, 58, 32, 98,121, 32, 90,105,108,108,101,114, 13, 10, + 98,117,103,108, 97,120,110, 58, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,109,105,108,108,105,112,101,100, 46, 99, 32, 98,121, 32, 90,105,108, + 108,101,114, 13, 10,115,105,108,108,105,112,101,100, 58, 13, 10, 48, 58, + 54, 52, 58, 51, 48, 58, 55, 53, 58, 49, 55, 13, 10, 48, 58, 50, 52, 58, + 49, 58, 97, 48, 58, 97, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,109,114,100,111, 46, 99, 32, 98,121, 32, 90,105,108,108,101,114, + 13, 10,109,114,100,105,103,100,111, 58, 13, 10, 48, 58,101, 48, 49, 55, + 58, 54, 52, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42,122,101,114,111, 32,112,111,105,110,116, 32, 50, 13, 10,122,101, + 114,111,112,110,116, 50, 58, 13, 10, 48, 58,102,101, 57, 48, 49, 97, 58, + 51, 55, 58, 49, 52, 58, 48, 48, 13, 10, 48, 58,102,101, 57, 48, 52, 99, + 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 56, 98, 97,108,108, 97, + 99,116, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110, 107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32, 101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110,116, - 114,121, 93, 10, 48, 58, 48, 50, 48, 48, 58, 51, 99, 58, 48, 49, 58, 49, - 53, 10, 48, 58, 48, 50, 53, 48, 58, 51, 99, 58, 51, 98, 58, 52, 51, 10, - 48, 58, 48, 48, 50, 99, 58, 48, 51, 58, 56, 56, 58, 48, 49, 32, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,114, 97,112,105,100, 32,104,101,114,111, - 40, 74, 97,112, 97,110, 63, 41, 40, 66,121, 32, 70,105,114,101, 98,114, - 97,110,100, 41, 10, 59,119, 97,105,116, 32,116,111, 32,115,101,101, 32, - 116,111,112, 32,115, 99,111,114,101,115, 32, 98,101,102,111,114,101, 32, - 121,111,117, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 10,114, - 97,112,104,101,114,111, 58, 10, 48, 58, 49,102,101, 54, 48, 48, 58, 54, - 48, 58, 48, 48, 58, 48, 49, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 112,114,111,103,114,101,115,115, 40, 66,121, 32, 70,105,114,101, 98,114, - 97,110,100, 41, 40, 72,105,115, 99,111,114,101, 32,100,111,101,115, 32, - 110,111,116, 32,115,101,101,109, 32,116,111, 32, 99,104, 97,110,103,101, - 32,100,117,114,105,110,103, 32,103, 97,109,101, 41, 10,112,114,111,103, - 114,101,115,115, 58, 10, 48, 58, 56, 55, 49, 49, 58,101, 58, 48, 48, 58, - 48, 49, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,114,101, 98,105, - 108,108,105, 97,110, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, - 41, 40, 72,105,115, 99,111,114,101, 32,100,105,115,112,108, 97,121, 32, - 119,105,108,108, 32,110,111,116, 32, 99,104, 97,110,103,101, 46, 32, 73, - 116, 32,105,115, 32, 97,108,119, 97,121,115, 32, 53, 48, 44, 48, 48, 48, - 46, 32, 80,108,101, 97,115,101, 32, 99,104,101, 99,107, 41, 10,112, 98, - 105,108,108,105, 97,110, 58, 10, 48, 58,102, 50, 54, 98, 58, 50, 51, 58, - 48, 48, 58, 52, 53, 10, 48, 58,102, 50, 50, 50, 58, 51, 58, 48, 48, 58, - 48, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,116, 97,108, - 32,115,111,108,100,105,101,114, 32,105,115,115, 97, 99, 32, 73, 73, 40, - 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,109,115,105,115, - 97, 97, 99, 58, 10, 48, 58,101, 52, 97, 53, 58, 53, 48, 58, 48, 50, 58, - 52,100, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,107,117,110,103, 45, - 102,117, 32,116, 97,105,107,117,110, 40, 66,121, 32, 70,105,114,101, 98, - 114, 97,110,100, 41, 10,107,117,110,103,102,117,116, 58, 10,107,117,110, - 103,102,117,116, 97, 58, 10, 48, 58, 99, 49,100, 51, 58, 50, 99, 58, 48, - 48, 58, 49,102, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,107,105, 99, - 107, 32,115,116, 97,114,116, 32,119,104,101,101,108,105,101, 32,107,105, - 110,103, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,107, - 105,107,115,116, 97,114,116, 58, 10, 48, 58, 56, 49, 54,102, 58, 51, 58, - 48, 48, 58, 48, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,104,111, - 114,105,122,111,110, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, - 41, 10,104,111,114,105,122,111,110, 58, 10, 48, 58,101, 56, 48, 49, 58, - 57, 54, 58, 50, 56, 58, 50, 51, 10, 48, 58,101, 48, 51, 99, 58, 50, 58, - 50, 56, 58, 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,116,114, - 97,105,103,104,116, 32,102,108,117,115,104, 10, 59, 42, 42, 32,103,111, - 116,116, 97, 32,108,111,118,101, 32,116,104,111,115,101, 32,101, 97,114, - 108,121, 32,118,105,100,101,111,114, 97,109, 32,103, 97,109,101,115, 32, - 33, 33, 32, 42, 42, 10,115,102,108,117,115,104, 58, 10, 48, 58, 50, 49, - 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52,101, 51,100, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 52,101, 53,100, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52,101, 55,100, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 52,101, 57,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 52,101, 98,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52,102, 51, - 100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52,102, 53,100, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 52,102, 55,100, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52,102, 57,100, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 52,102, 98,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 53, 48, 51,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 48, 53, - 100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 48, 55,100, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 48, 57,100, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 53, 48, 98,100, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 53, 49, 51,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, - 53, 49, 53,100, 58, 49, 58, 52, 53, 58, 52, 53, 10, 48, 58, 53, 49, 55, - 100, 58, 49, 58, 52, 57, 58, 52, 57, 10, 48, 58, 53, 49, 57,100, 58, 49, - 58, 53, 49, 58, 53, 49, 10, 48, 58, 53, 49, 98,100, 58, 49, 58, 51,101, - 58, 51,101, 10, 48, 58, 53, 50, 51,100, 58, 49, 58, 51,101, 58, 51,101, - 10, 48, 58, 53, 50, 53,100, 58, 49, 58, 52, 53, 58, 52, 53, 10, 48, 58, - 53, 50, 55,100, 58, 49, 58, 52, 57, 58, 52, 57, 10, 48, 58, 53, 50, 57, - 100, 58, 49, 58, 53, 49, 58, 53, 49, 10, 48, 58, 53, 50, 98,100, 58, 49, - 58, 51,101, 58, 51,101, 10, 48, 58, 53, 51, 51,100, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 53, 51, 53,100, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 53, 51, 55,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 53, 51, 57,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 51, 98, - 100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42,115,107,121, 32, 97,114,109,121, 10,115,107,121, 97,114,109,121, 58, - 10, 48, 58, 56, 49, 51, 49, 58, 97,100, 58, 48, 48, 58, 56, 97, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,115,100, 32,103,117,110,100, 97,109, 32, - 110,101,111, 32, 98, 97,116,116,108,105,110,103, 32, 40,106, 97,112, 97, - 110, 41, 10,110,101,111, 98, 97,116,116,108, 58, 10, 48, 58, 50, 48, 48, - 54, 97, 52, 58, 55, 56, 58, 48, 48, 58, 48, 97, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42,114,111, 99,107, 32, 99,108,105,109, 98,101,114, 10,114, - 111, 99,107, 99,108,105,109, 58, 10, 48, 58, 56, 48,100, 57, 58, 49, 53, - 58, 48, 51, 58, 48, 48, 10, 48, 58, 56, 48,101, 98, 58, 49, 58, 48, 51, - 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,117, 99,107,109, - 97,110, 32,112,111, 99,107,105,109,111,110, 10,112,117, 99,107,112,107, - 109,110, 58, 10,112,117, 99,107,112,107,109,110, 97, 58, 10,112,117, 99, - 107,112,107,109,110, 98, 58, 10, 48, 58,102,102, 48, 48, 50, 48, 58, 51, - 48, 58, 51, 56, 58, 51, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, - 105,116,114,111, 98, 97,108,108, 32, 40,117,115, 41, 10,110,105,116,114, - 111, 98, 97,108, 58, 10,103,117,110, 98, 97,108,108, 58, 10,110,105,116, - 114,111, 98, 97,108, 97, 58, 10, 48, 58,102,102, 57,100,101, 98, 58, 49, - 52, 98, 58, 53, 52, 58, 48, 48, 10, 48, 58,102,102, 56, 48, 51, 97, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 56, 48, 51, 98, 58, 49, - 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101, - 116, 97,108, 32, 99,108, 97,115,104, 32, 40,106, 97,112, 97,110, 41, 10, - 109,101,116,108, 99,108,115,104, 58, 10, 48, 58, 56, 48, 50,102, 58, 56, - 99, 58, 52, 55, 58, 52, 48, 10, 48, 58, 56, 48, 48, 97, 58, 51, 58, 51, - 48, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 97, 99,104, - 32, 98,114,101, 97,107,101,114,115, 32, 40,106, 97,112, 97,110, 41, 10, - 109, 97, 99,104, 98,114,107,114, 58, 10, 48, 58, 50, 51,102, 53, 51, 50, - 58,102, 54, 58, 48, 51, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 98,111, 97,114,100,119, 97,108,107, 32, 99, 97,115,105,110,111, 10, - 59, 42, 42, 32,111,110,108,121, 32,115, 97,118,101,115, 32,116,104,101, - 32,116,111,112, 32,115, 99,111,114,101, 32,111,102, 32,101, 97, 99,104, - 32, 99, 97,114,100, 32,103, 97,109,101, 32, 42, 42, 10, 98,119, 99, 97, - 115,105,110,111, 58, 10, 48, 58, 52, 99, 51, 99, 58,100, 50, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52, 99, 99,101, 58, 49, 58, 52, 51, 58, 52, 51, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,119,105,110, 32, 98,101,101, - 32,121, 97,104,104,111,111, 33, 32, 40,118,101,114, 32,106, 97, 97, 41, - 10,116, 98,121, 97,104,104,111,111, 58, 10, 48, 58, 99, 48,102, 98, 52, - 50, 58, 56, 50, 58, 48, 48, 58, 49, 50, 10, 48, 58, 99, 48,102, 98, 52, - 51, 58, 49, 58, 53, 55, 58, 53, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42,116,104,101, 32,100,101,101,112, 32, 40,106, 97,112, 97,110, 41, 10, - 116,104,101,100,101,101,112, 58, 10,114,117,110,100,101,101,112, 58, 10, - 48, 58, 99, 50, 53, 54, 58, 51, 99, 58, 48, 52, 58, 48, 52, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42,102,105,114,101, 32, 98, 97,116,116,108,101, - 10,102,105,114,101, 98, 97,116,108, 58, 10, 48, 58, 56, 48, 48, 48, 58, - 50, 49, 58, 53, 52, 58, 48, 48, 10, 48, 58, 56, 48, 49,102, 58, 49, 58, - 55, 48, 58, 55, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,104,101, 97, - 100, 32,112, 97,110,105, 99, 40, 75,111,114,101, 97, 63, 41, 40, 66,121, - 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,104,101,100,112, 97,110, - 105, 99, 58, 10,104,101,100,112, 97,110,105, 99,102, 58, 10,104,101,100, - 112, 97,110,105, 99,111, 58, 10, 48, 58, 49, 48, 97, 56, 52, 48, 58, 50, - 56, 58, 48, 48, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, - 104, 97,109,112,105,111,110, 32,112,114,111, 32,119,114,101,115,116,108, - 105,110,103, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10, - 99,104,119,114,101,115,116,108, 58, 10, 48, 58, 99, 48, 48, 57, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 48, 48, 99, 58, 51, 58, 48, 48, - 58, 48, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,118, 97,115, 97, - 114, 97, 10,118, 97,115, 97,114, 97, 58, 10, 48, 58, 50, 97, 51, 50, 58, - 99, 53, 58, 48, 49, 58, 49,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 115, 97,108, 97,109, 97,100,101,114, 32, 50, 32, 40,106, 97, 97, 41, 10, - 115, 97,108,109,110,100,114, 50, 58, 10, 48, 58, 99, 48, 50, 48, 51, 51, - 58, 49, 51, 54, 58, 48, 58, 49, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42,115,101,120,121, 32,112, 97,114,111,100,105,117,115, 32, 40,118,101, - 114, 32,106, 97, 97, 41, 10,115,101,120,121,112, 97,114,111, 58, 10,115, - 101,120,121,112, 97,114,111, 97, 58, 10, 48, 58, 99, 49, 48, 55, 53, 50, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49, 48, 55, 53,101, 58, - 55, 56, 58, 48, 48, 58, 48, 54, 10, 48, 58, 99, 49, 48, 55, 53, 52, 58, - 49, 58, 55, 51, 58, 55, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,101, - 103,103,111,114, 10,101,103,103,111,114, 58, 10, 48, 58, 52, 99,102, 55, - 58, 51, 99, 58, 52, 99, 58, 48, 48, 10, 48, 58, 52,100, 51, 49, 58, 49, - 58, 53, 50, 58, 53, 50, 10, 48, 58, 52, 51,101,100, 58, 54, 58, 48, 48, - 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,100, 97,114,107, 32, - 116,111,119,101,114, 10,100, 97,114,107,116,111,119,114, 58, 10, 48, 58, - 97, 56, 50, 58, 57, 99, 58, 52, 98, 58, 51, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 99,104, 97, 99,107, 96,110, 32,112,111,112, 10, 99,104, - 97,107,110,112,111,112, 58, 10, 48, 58, 56, 52, 52, 57, 58, 49,102, 58, - 48, 52, 58, 48, 48, 10, 48, 58, 56, 52, 54, 54, 58, 49, 58, 49, 52, 58, - 49, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 98, 97,116,116,108,101, - 32,119,105,110,103,115, 10, 98,119,105,110,103, 58, 10, 48, 58,100, 48, - 48, 58,102, 48, 58, 51, 52, 58, 50, 48, 10, 48, 58, 48,100, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,117,101, - 98,114,105, 99,107, 10, 99,117,101, 98,114,105, 99,107, 58, 10, 99,117, - 101, 98,114,105, 99,107,106, 58, 10, 48, 58, 54, 48, 51, 54, 56, 58, 53, - 48, 58, 48, 48, 58, 52,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 114,121, 93, 13, 10, 56, 98, 97,108,108, 97, 99,116, 50, 58, 13, 10, 48, + 58, 49,100, 50, 56, 58, 48, 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, + 49,100, 52, 54, 58, 48, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, + 100, 50,101, 58, 48, 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49,100, + 53, 48, 58, 48, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49,100, 51, + 52, 58, 48, 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49,100, 53, 97, + 58, 48, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49,100, 51, 97, 58, + 48, 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49,100, 54, 52, 58, 48, + 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49,100, 52, 48, 58, 48, 54, + 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49,100, 54,101, 58, 48, 97, 58, + 48, 48, 58, 48, 48, 13, 10, 56, 98,112,109, 58, 13, 10, 48, 58, 49, 99, + 54, 99, 58, 48, 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49, 99, 56, + 97, 58, 48, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 99, 55, 50, + 58, 48, 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49, 99, 57, 52, 58, + 48, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 99, 55, 56, 58, 48, + 54, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49, 99, 57,101, 58, 48, 97, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 99, 55,101, 58, 48, 54, 58, + 48, 48, 58, 49, 98, 13, 10, 48, 58, 49, 99, 97, 56, 58, 48, 97, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 49, 99, 56, 52, 58, 48, 54, 58, 48, 48, + 58, 49, 98, 13, 10, 48, 58, 49, 99, 98, 50, 58, 48, 97, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,115,112,101, 99,105, + 97,108, 32,102,111,114, 99,101,115, 32, 73, 73, 40, 66,121, 32, 70,105, + 114,101, 98,114, 97,110,100, 41, 13, 10,115,112, 99,102,114, 99,105,105, + 58, 13, 10, 48, 58, 49, 97, 50, 50, 58, 49, 58, 51, 51, 58, 51, 51, 13, + 10, 48, 58, 49, 97, 50, 55, 58, 53, 58, 51, 48, 58, 51, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42,115,112,101, 99,105, 97,108, 32,102,111, + 114, 99,101,115, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, + 13, 10,115,112, 99,108,102,111,114, 99, 58, 13, 10, 48, 58, 49, 97, 50, + 50, 58, 49, 58, 51, 51, 58, 51, 51, 13, 10, 48, 58, 49, 97, 50, 55, 58, + 53, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 115,116,114,105,107,101, 32, 98,111,119,108,105,110,103, 40, 66,121, 32, + 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, 59, 42, 42, 42, 42,110, + 111, 32,104,105,115, 99,111,114,101, 32,108,105,115,116, 32,112,101,114, + 32,115,101, 32, 98,117,116, 32,116,104,105,115, 32,119,105,108,108, 32, + 115, 97,118,101, 32,116,104,101, 32,116,111,112, 32, 53, 32,114,101,115, + 117,108,116,115, 32,112,101,114,109, 97,110, 97,110,116,108,121, 13, 10, + 59, 42, 42, 42, 42,105,102, 32,121,111,117, 32,108,105,107,101, 32,105, + 102, 32,110,111,116, 44, 32,121,111,117, 32, 99, 97,110, 32,100,105,115, + 97, 98,108,101, 32,116,104,105,115, 13, 10,115, 98,111,119,108,105,110, + 103, 58, 13, 10, 48, 58,102,101, 54, 49, 58,102, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,114,117,110, 32, 97,110,100, + 32,103,117,110, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, + 13, 10,114,117,110,103,117,110, 58, 13, 10, 48, 58, 51, 56, 48, 99, 56, + 48, 58, 52, 98, 58, 52, 98, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42,108,111, 99,107,101,100, 32, 97,110,100, 32,108,111, 97,100, + 101,100, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, + 108,111, 99,107,108,111, 97,100, 58, 13, 10, 48, 58, 49, 48, 50, 55, 48, + 51, 58,102, 54, 58, 50, 48, 58, 49,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42,103,114,101, 97,116, 32,103,117,110,115, 40, 66,121, 32, 70, + 105,114,101, 98,114, 97,110,100, 41, 13, 10,103,114,101, 97,116,103,117, + 110, 58, 13, 10, 48, 58,101, 48, 48, 98, 58, 53, 51, 58, 53, 53, 58, 53, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,103,101,110,105,120, 40, + 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10,103,101,110, + 105,120, 58, 13, 10, 48, 58, 49, 48, 98,100, 50, 99, 58, 54, 52, 58, 52, + 101, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,105, + 116, 32, 38, 32,114,117,110, 13, 10,112,105,116,110,114,117,110, 58, 13, + 10,112,105,116,110,114,117,110, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, + 42, 80,105,116, 32, 38, 32, 82,117,110, 32, 40,115,101,116, 32, 50, 41, + 13, 10, 48, 58, 56, 55, 49, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 13, + 10, 48, 58, 56, 48, 97, 97, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, + 58, 56, 97, 50, 49, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 56, + 97, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57,101, + 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57, 99, 49, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57, 97, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57, 56, 49, 58, 49, 58, 50, 55, + 58, 50, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99, - 105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, - 55, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, - 45, 32, 98,121, 32,108,101,101,122,101,114, 47,103,101,111,109, 97,110, - 47,111,116,104,101,114,115, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115, + 116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, + 99,111,114,101, 95,118, 56, 46, 49, 32, 97,100,100,105,116,105,111,110, + 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, + 114, 47,102,105,114,101, 98,114, 97,110,100, 47,103,101,111,109, 97,110, + 47,111,116,104,101,114,115, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 97,114, 99, 97,100,101, - 32, 99,108, 97,115,115,105, 99,115, 32, 40,112,114,111,116,111,116,121, - 112,101, 41, 10, 59, 42, 42, 32,116,104,105,115, 32,101,110,116,114,121, - 32,115, 97,118,101,115, 32, 97,108,108, 32, 98,117,116, 32,116,104,101, - 32,116,111,112, 32, 52, 32,115, 99,111,114,101,115, 44, 32,110,118,114, - 97,109, 32,100,111,101,115, 32,116,104,101, 32,114,101,115,116, 32, 42, - 42, 10, 97,114, 99, 97,100,101, 99,108, 58, 10, 48, 58, 51,101,101,101, - 52, 49, 58, 51, 50, 58, 48, 48, 58, 49, 49, 10, 48, 58, 51,101,101,100, - 102, 54, 58, 51, 50, 58, 48, 48, 58, 49, 48, 10, 10,103,104,117,110,116, - 101,114, 58, 10, 48, 58, 49, 52, 54, 50, 58, 98,100, 58, 53, 48, 58, 48, - 48, 10, 48, 58, 49, 53, 49, 57, 58, 49, 58, 50, 97, 58, 50, 97, 10, 10, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42,101,118,105,108, 32,115,116,111,110,101, + 13, 10, 59, 42, 42, 32,116,104,101, 32,103, 97,109,101, 32,104,105,115, + 99,111,114,101, 32,105,115, 32,110,111,116, 32,119,111,114,107,105,110, + 103, 44, 32, 98,117,116, 32,116,104,101, 32,104,105,115, 99,111,114,101, + 32,116, 97, 98,108,101, 32,115, 97,118,101,115, 32,111,107, 32, 42, 42, + 13, 10,101,118,105,108,115,116,111,110, 58, 13, 10, 48, 58, 97, 55, 56, + 50, 58, 51, 99, 58, 48, 49, 58, 50,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 99,104, 97,110,103,101, 32, 97,105,114, 32, 98,108, 97,100, + 101, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, 99, + 97,105,114, 98,108, 97,100, 58, 13, 10, 48, 58, 53, 56, 48, 48, 51, 48, + 58, 98, 49, 58, 97, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,115,116, 97,100,105,117,109, 32, 99,114,111,115,115, 13, 10, + 115, 99,114,111,115,115, 58, 13, 10,115, 99,114,111,115,115,117, 58, 13, + 10,115, 99,114,111,115,115, 97, 58, 13, 10, 48, 58, 55, 48, 49,102, 98, + 48, 58, 51,102, 58, 53, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,114, 50,100, 32,116, 97,110,107, 13, 10,114, 50,100,116, + 97,110,107, 58, 13, 10, 48, 58, 52, 51, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 56, 58, 49, 58, 97, 57, 58, 97, 57, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42,103,114, 97,110,100, 32,116,111,117,114, + 13, 10,103,114,110,100,116,111,117,114, 58, 13, 10, 48, 58,102, 49, 56, + 50, 58, 50, 57, 58, 52, 49, 58, 48, 48, 13, 10, 48, 58,102, 49,100,100, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,101,110,105,103,109, 97, 32, 50, 13, 10,101,110,105,103,109, 97, + 50, 58, 13, 10,101,110,105,103,109, 97, 50, 97, 58, 13, 10,101,110,105, + 103,109, 97, 50, 98, 58, 13, 10, 48, 58, 50, 48, 97,102, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 50, 48, 99, 49, 58, 51, 58, 50, 52, 58, + 50, 52, 13, 10, 13, 10, 98, 97,116,116,108, 99,114,121, 58, 32, 59, 91, + 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, + 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,109, 97,107,105,110,103, + 32,116,104,105,115, 32,101,110,116,114,121, 32,119,111,114,107, 93, 13, + 10, 48, 58, 52, 52, 52, 57, 58, 50, 97, 58, 52, 56, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42,109, 97,103,105, 99, 97,108, 32,115, + 112,111,116, 13, 10,109, 97,103,115,112,111,116, 58, 13, 10, 48, 58, 54, + 48, 48, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 48, + 56, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,114,101,116,111,102,105,110,118, 46, 99, 13, 10,114,101, + 116,111,102,105,110,118, 58, 13, 10,114,101,116,111,102,105,110,118, 50, + 58, 13, 10,114,101,116,111,102,105,110,118, 49, 58, 13, 10, 48, 58, 57, + 57, 56, 48, 58, 50, 51, 58, 48, 48, 58, 53, 52, 13, 10, 48, 58, 57, 57, + 48,102, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 40,102,105,101,108,100, 32,100, 97,121, 32, 97,110, + 100, 32, 99,108,111,110,101, 41, 13, 10,102,105,101,108,100,100, 97,121, + 58, 13, 10,117,110,100,111,117,107, 97,105, 58, 13, 10, 48, 58, 99, 48, + 48,100, 58, 53, 51, 54, 58, 52, 56, 58, 49, 49, 13, 10, 48, 58, 97, 49, + 57, 48, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,111,122,111,110, 49, 13, 10,111,122,111,110, 49, 58, 13, + 10, 48, 58, 52, 48, 52, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 52, 51, 48, 48, 58, 52,101, 58, 48, 49, 58, 49, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42,109,117,115,116, 97, 99,104,101, 32, 98, + 111,121, 13, 10,109,117,115,116, 97, 99,104,101, 58, 13, 10, 48, 58,102, + 48, 48, 48, 58, 53, 48, 58, 48, 48, 58, 52, 55, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42,108,101,116,104, 97,108, 32,101,110,102,111,114, + 99,101,114,115, 32, 73, 73, 32, 45, 32,103,117,110, 32,102,105,103,104, + 116,101,114,115, 32, 40,118,101,114, 32,101, 97, 97, 41, 13, 10,108,101, + 50, 58, 13, 10, 48, 58, 99, 48, 51,100, 57, 56, 58, 51,102, 58, 48, 53, + 58, 52, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,103, 97,108, + 97,120,121, 32,103,117,110,110,101,114,115, 13, 10,103, 97,108, 97,120, + 121,103,110, 58, 13, 10, 48, 58, 48, 49,101, 57, 99, 58, 49, 57, 48, 58, + 53, 48, 58, 48, 48, 13, 10, 48, 58, 48, 50, 48, 50, 97, 58, 49, 58, 48, + 97, 58, 48, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100, + 114, 97,103,111,111,110, 32,109,105,103,104,116, 32, 40,118,101,114, 32, + 106, 97, 97, 41, 13, 10,100,114, 97,103,111,111,110,106, 58, 13, 10, 48, + 58, 99, 48, 49, 98, 48, 48, 58, 57, 97, 58, 48, 48, 58, 98, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,116,101,101,108, 32, + 103,117,110,110,101,114, 32, 50, 41, 13, 10,115,103,117,110,110,101,114, + 50, 58, 13, 10,115,103,117,110,110,101,114, 50,106, 58, 13, 10, 48, 58, + 49, 48, 56,101, 50, 98, 58, 49, 98, 55, 58, 48, 48, 58, 48, 50, 13, 10, + 48, 58, 49, 48, 56, 99, 54, 98, 58, 57, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,122, 97,118,105,103, 97, 40, 66, + 121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10,122, 97,118,105, + 103, 97, 58, 13, 10,122, 97,118,105,103, 97,106, 58, 13, 10, 48, 58, 48, + 100, 97, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 49, 48, + 50, 54, 58, 53, 58, 49, 52, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,116,114,105, 99,107,121, 32,100,111, 99, 40, 66,121, 32, + 70,105,114,101, 98,114, 97,110,100, 41, 13, 10,116,114, 99,107,121,100, + 111, 99, 58, 13, 10, 48, 58,101, 48, 53, 97, 58, 53, 97, 58, 50,100, 58, + 52, 54, 13, 10, 13, 10,115,100,116,101,110,110,105,115, 58, 32, 59, 91, + 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, + 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99, + 105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, 48, + 58, 48, 50, 48, 48, 58, 51, 99, 58, 48, 49, 58, 49, 53, 13, 10, 48, 58, + 48, 50, 53, 48, 58, 51, 99, 58, 51, 98, 58, 52, 51, 13, 10, 48, 58, 48, + 48, 50, 99, 58, 48, 51, 58, 56, 56, 58, 48, 49, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42,114, 97,112,105,100, 32,104,101,114,111, 40, 74, + 97,112, 97,110, 63, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110, + 100, 41, 13, 10, 59,119, 97,105,116, 32,116,111, 32,115,101,101, 32,116, + 111,112, 32,115, 99,111,114,101,115, 32, 98,101,102,111,114,101, 32,121, + 111,117, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 13, 10,114, + 97,112,104,101,114,111, 58, 13, 10, 48, 58, 49,102,101, 54, 48, 48, 58, + 54, 48, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,112,114,111,103,114,101,115,115, 40, 66,121, 32, 70,105,114,101, + 98,114, 97,110,100, 41, 40, 72,105,115, 99,111,114,101, 32,100,111,101, + 115, 32,110,111,116, 32,115,101,101,109, 32,116,111, 32, 99,104, 97,110, + 103,101, 32,100,117,114,105,110,103, 32,103, 97,109,101, 41, 13, 10,112, + 114,111,103,114,101,115,115, 58, 13, 10, 48, 58, 56, 55, 49, 49, 58,101, + 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 112,114,101, 98,105,108,108,105, 97,110, 40, 66,121, 32, 70,105,114,101, + 98,114, 97,110,100, 41, 40, 72,105,115, 99,111,114,101, 32,100,105,115, + 112,108, 97,121, 32,119,105,108,108, 32,110,111,116, 32, 99,104, 97,110, + 103,101, 46, 32, 73,116, 32,105,115, 32, 97,108,119, 97,121,115, 32, 53, + 48, 44, 48, 48, 48, 46, 32, 80,108,101, 97,115,101, 32, 99,104,101, 99, + 107, 41, 13, 10,112, 98,105,108,108,105, 97,110, 58, 13, 10, 48, 58,102, + 50, 54, 98, 58, 50, 51, 58, 48, 48, 58, 52, 53, 13, 10, 48, 58,102, 50, + 50, 50, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,109,101,116, 97,108, 32,115,111,108,100,105,101,114, 32, + 105,115,115, 97, 99, 32, 73, 73, 40, 66,121, 32, 70,105,114,101, 98,114, + 97,110,100, 41, 13, 10,109,115,105,115, 97, 97, 99, 58, 13, 10, 48, 58, + 101, 52, 97, 53, 58, 53, 48, 58, 48, 50, 58, 52,100, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42,107,117,110,103, 45,102,117, 32,116, 97,105, + 107,117,110, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, + 10,107,117,110,103,102,117,116, 58, 13, 10,107,117,110,103,102,117,116, + 97, 58, 13, 10, 48, 58, 99, 49,100, 51, 58, 50, 99, 58, 48, 48, 58, 49, + 102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,107,105, 99,107, 32, + 115,116, 97,114,116, 32,119,104,101,101,108,105,101, 32,107,105,110,103, + 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10,107,105, + 107,115,116, 97,114,116, 58, 13, 10, 48, 58, 56, 49, 54,102, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,104, + 111,114,105,122,111,110, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110, + 100, 41, 13, 10,104,111,114,105,122,111,110, 58, 13, 10, 48, 58,101, 56, + 48, 49, 58, 57, 54, 58, 50, 56, 58, 50, 51, 13, 10, 48, 58,101, 48, 51, + 99, 58, 50, 58, 50, 56, 58, 48, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,115,116,114, 97,105,103,104,116, 32,102,108,117,115,104, 13, + 10, 59, 42, 42, 32,103,111,116,116, 97, 32,108,111,118,101, 32,116,104, + 111,115,101, 32,101, 97,114,108,121, 32,118,105,100,101,111,114, 97,109, + 32,103, 97,109,101,115, 32, 33, 33, 32, 42, 42, 13, 10,115,102,108,117, + 115,104, 58, 13, 10, 48, 58, 50, 49, 53, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52,101, 51,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 52,101, 53,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 52,101, 55,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52,101, + 57,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52,101, 98,100, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52,102, 51,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52,102, 53,100, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 52,102, 55,100, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 52,102, 57,100, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52,102, 98,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 53, 48, 51,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 53, 48, 53,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 48, + 55,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 48, 57,100, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 48, 98,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 49, 51,100, 58, 49, 58, 51, + 101, 58, 51,101, 13, 10, 48, 58, 53, 49, 53,100, 58, 49, 58, 52, 53, 58, + 52, 53, 13, 10, 48, 58, 53, 49, 55,100, 58, 49, 58, 52, 57, 58, 52, 57, + 13, 10, 48, 58, 53, 49, 57,100, 58, 49, 58, 53, 49, 58, 53, 49, 13, 10, + 48, 58, 53, 49, 98,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, + 53, 50, 51,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 53, 50, + 53,100, 58, 49, 58, 52, 53, 58, 52, 53, 13, 10, 48, 58, 53, 50, 55,100, + 58, 49, 58, 52, 57, 58, 52, 57, 13, 10, 48, 58, 53, 50, 57,100, 58, 49, + 58, 53, 49, 58, 53, 49, 13, 10, 48, 58, 53, 50, 98,100, 58, 49, 58, 51, + 101, 58, 51,101, 13, 10, 48, 58, 53, 51, 51,100, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 53, 51, 53,100, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 53, 51, 55,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 53, 51, 57,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 53, 51, 98,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42,115,107,121, 32, 97,114,109,121, 13, 10,115,107, + 121, 97,114,109,121, 58, 13, 10, 48, 58, 56, 49, 51, 49, 58, 97,100, 58, + 48, 48, 58, 56, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, + 100, 32,103,117,110,100, 97,109, 32,110,101,111, 32, 98, 97,116,116,108, + 105,110,103, 32, 40,106, 97,112, 97,110, 41, 13, 10,110,101,111, 98, 97, + 116,116,108, 58, 13, 10, 48, 58, 50, 48, 48, 54, 97, 52, 58, 55, 56, 58, + 48, 48, 58, 48, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,114, + 111, 99,107, 32, 99,108,105,109, 98,101,114, 13, 10,114,111, 99,107, 99, + 108,105,109, 58, 13, 10, 48, 58, 56, 48,100, 57, 58, 49, 53, 58, 48, 51, + 58, 48, 48, 13, 10, 48, 58, 56, 48,101, 98, 58, 49, 58, 48, 51, 58, 48, + 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,117, 99,107,109, + 97,110, 32,112,111, 99,107,105,109,111,110, 13, 10,112,117, 99,107,112, + 107,109,110, 58, 13, 10,112,117, 99,107,112,107,109,110, 97, 58, 13, 10, + 112,117, 99,107,112,107,109,110, 98, 58, 13, 10, 48, 58,102,102, 48, 48, + 50, 48, 58, 51, 48, 58, 51, 56, 58, 51, 54, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42,110,105,116,114,111, 98, 97,108,108, 32, 40,117,115, + 41, 13, 10,110,105,116,114,111, 98, 97,108, 58, 13, 10,103,117,110, 98, + 97,108,108, 58, 13, 10,110,105,116,114,111, 98, 97,108, 97, 58, 13, 10, + 48, 58,102,102, 57,100,101, 98, 58, 49, 52, 98, 58, 53, 52, 58, 48, 48, + 13, 10, 48, 58,102,102, 56, 48, 51, 97, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,102,102, 56, 48, 51, 98, 58, 49, 58, 49, 48, 58, 49, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,116, 97,108, 32, + 99,108, 97,115,104, 32, 40,106, 97,112, 97,110, 41, 13, 10,109,101,116, + 108, 99,108,115,104, 58, 13, 10, 48, 58, 56, 48, 50,102, 58, 56, 99, 58, + 52, 55, 58, 52, 48, 13, 10, 48, 58, 56, 48, 48, 97, 58, 51, 58, 51, 48, + 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 97, 99, + 104, 32, 98,114,101, 97,107,101,114,115, 32, 40,106, 97,112, 97,110, 41, + 13, 10,109, 97, 99,104, 98,114,107,114, 58, 13, 10, 48, 58, 50, 51,102, + 53, 51, 50, 58,102, 54, 58, 48, 51, 58, 51, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 98,111, 97,114,100,119, 97,108,107, 32, 99, 97, + 115,105,110,111, 13, 10, 59, 42, 42, 32,111,110,108,121, 32,115, 97,118, + 101,115, 32,116,104,101, 32,116,111,112, 32,115, 99,111,114,101, 32,111, + 102, 32,101, 97, 99,104, 32, 99, 97,114,100, 32,103, 97,109,101, 32, 42, + 42, 13, 10, 98,119, 99, 97,115,105,110,111, 58, 13, 10, 48, 58, 52, 99, + 51, 99, 58,100, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 99, 99, + 101, 58, 49, 58, 52, 51, 58, 52, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,116,119,105,110, 32, 98,101,101, 32,121, 97,104,104,111,111, + 33, 32, 40,118,101,114, 32,106, 97, 97, 41, 13, 10,116, 98,121, 97,104, + 104,111,111, 58, 13, 10, 48, 58, 99, 48,102, 98, 52, 50, 58, 56, 50, 58, + 48, 48, 58, 49, 50, 13, 10, 48, 58, 99, 48,102, 98, 52, 51, 58, 49, 58, + 53, 55, 58, 53, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,116, + 104,101, 32,100,101,101,112, 32, 40,106, 97,112, 97,110, 41, 13, 10,116, + 104,101,100,101,101,112, 58, 13, 10,114,117,110,100,101,101,112, 58, 13, + 10, 48, 58, 99, 50, 53, 54, 58, 51, 99, 58, 48, 52, 58, 48, 52, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,102,105,114,101, 32, 98, 97,116, + 116,108,101, 13, 10,102,105,114,101, 98, 97,116,108, 58, 13, 10, 48, 58, + 56, 48, 48, 48, 58, 50, 49, 58, 53, 52, 58, 48, 48, 13, 10, 48, 58, 56, + 48, 49,102, 58, 49, 58, 55, 48, 58, 55, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42,104,101, 97,100, 32,112, 97,110,105, 99, 40, 75,111, + 114,101, 97, 63, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, + 41, 13, 10,104,101,100,112, 97,110,105, 99, 58, 13, 10,104,101,100,112, + 97,110,105, 99,102, 58, 13, 10,104,101,100,112, 97,110,105, 99,111, 58, + 13, 10, 48, 58, 49, 48, 97, 56, 52, 48, 58, 50, 56, 58, 48, 48, 58, 52, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,104, 97,109,112, + 105,111,110, 32,112,114,111, 32,119,114,101,115,116,108,105,110,103, 40, + 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, 99,104,119, + 114,101,115,116,108, 58, 13, 10, 48, 58, 99, 48, 48, 57, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 99, 48, 48, 99, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,118, 97,115, 97, + 114, 97, 13, 10,118, 97,115, 97,114, 97, 58, 13, 10, 48, 58, 50, 97, 51, + 50, 58, 99, 53, 58, 48, 49, 58, 49,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,115, 97,108, 97,109, 97,100,101,114, 32, 50, 32, 40,106, + 97, 97, 41, 13, 10,115, 97,108,109,110,100,114, 50, 58, 13, 10, 48, 58, + 99, 48, 50, 48, 51, 51, 58, 49, 51, 54, 58, 48, 58, 49, 52, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,115,101,120,121, 32,112, 97,114,111, + 100,105,117,115, 32, 40,118,101,114, 32,106, 97, 97, 41, 13, 10,115,101, + 120,121,112, 97,114,111, 58, 13, 10,115,101,120,121,112, 97,114,111, 97, + 58, 13, 10, 48, 58, 99, 49, 48, 55, 53, 50, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 99, 49, 48, 55, 53,101, 58, 55, 56, 58, 48, 48, 58, + 48, 54, 13, 10, 48, 58, 99, 49, 48, 55, 53, 52, 58, 49, 58, 55, 51, 58, + 55, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,101,103,103,111, + 114, 13, 10,101,103,103,111,114, 58, 13, 10, 48, 58, 52, 99,102, 55, 58, + 51, 99, 58, 52, 99, 58, 48, 48, 13, 10, 48, 58, 52,100, 51, 49, 58, 49, + 58, 53, 50, 58, 53, 50, 13, 10, 48, 58, 52, 51,101,100, 58, 54, 58, 48, + 48, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100, 97, + 114,107, 32,116,111,119,101,114, 13, 10,100, 97,114,107,116,111,119,114, + 58, 13, 10, 48, 58, 97, 56, 50, 58, 57, 99, 58, 52, 98, 58, 51, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,104, 97, 99,107, 96,110, + 32,112,111,112, 13, 10, 99,104, 97,107,110,112,111,112, 58, 13, 10, 48, + 58, 56, 52, 52, 57, 58, 49,102, 58, 48, 52, 58, 48, 48, 13, 10, 48, 58, + 56, 52, 54, 54, 58, 49, 58, 49, 52, 58, 49, 52, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 98, 97,116,116,108,101, 32,119,105,110,103,115, + 13, 10, 98,119,105,110,103, 58, 13, 10, 48, 58,100, 48, 48, 58,102, 48, + 58, 51, 52, 58, 50, 48, 13, 10, 48, 58, 48,100, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,117,101, 98, + 114,105, 99,107, 13, 10, 99,117,101, 98,114,105, 99,107, 58, 13, 10, 99, + 117,101, 98,114,105, 99,107,106, 58, 13, 10, 48, 58, 54, 48, 51, 54, 56, + 58, 53, 48, 58, 48, 48, 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110, + 111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, + 95,118, 55, 46, 57, 55, 32, 97,100,100,105,116,105,111,110,115, 32, 98, + 101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 47,103, + 101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 42, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 97,114, 99, 97,100,101, 32, 99,108, 97,115,115,105, 99,115, 32, + 40,112,114,111,116,111,116,121,112,101, 41, 13, 10, 59, 42, 42, 32,116, + 104,105,115, 32,101,110,116,114,121, 32,115, 97,118,101,115, 32, 97,108, + 108, 32, 98,117,116, 32,116,104,101, 32,116,111,112, 32, 52, 32,115, 99, + 111,114,101,115, 44, 32,110,118,114, 97,109, 32,100,111,101,115, 32,116, + 104,101, 32,114,101,115,116, 32, 42, 42, 13, 10, 97,114, 99, 97,100,101, + 99,108, 58, 13, 10, 48, 58, 51,101,101,101, 52, 49, 58, 51, 50, 58, 48, + 48, 58, 49, 49, 13, 10, 48, 58, 51,101,101,100,102, 54, 58, 51, 50, 58, + 48, 48, 58, 49, 48, 13, 10, 13, 10,103,104,117,110,116,101,114, 58, 13, + 10, 48, 58, 49, 52, 54, 50, 58, 98,100, 58, 53, 48, 58, 48, 48, 13, 10, + 48, 58, 49, 53, 49, 57, 58, 49, 58, 50, 97, 58, 50, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,101, 97,100, 32, 97,110,103,108,101, - 10,100,101, 97,100, 97,110,103, 58, 10, 48, 58, 49, 52, 52, 50, 58, 98, - 100, 58, 53, 48, 58, 48, 48, 10, 48, 58, 49, 52,102, 57, 58, 49, 58, 50, - 97, 58, 50, 97, 10, 10,103,104,117,110,116,101,114,115, 58, 10, 48, 58, - 49, 52, 56, 50, 58, 98,100, 58, 53, 48, 58, 48, 48, 10, 48, 58, 49, 53, - 51, 57, 58, 49, 58, 50, 97, 58, 50, 97, 10, 10,108,101, 97,100, 97,110, - 103, 58, 10, 48, 58, 49, 53, 52, 50, 58, 98,100, 58, 53, 48, 58, 48, 48, - 10, 48, 58, 49, 53,102, 57, 58, 49, 58, 50, 97, 58, 50, 97, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42,103,111,107,117,106,121,111,117, 32,112, 97, - 114,111,100,105,117,115, 32, 40,118,101,114, 32,106, 97,100, 41, 10,103, - 111,107,117,112, 97,114,111, 58, 10, 48, 58, 99, 48,100, 55, 51, 54, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 48,100, 55, 52, 50, 58, 55, - 56, 58, 48, 48, 58, 48, 57, 10, 48, 58, 99, 48,100, 55, 51, 56, 58, 49, - 58, 55, 51, 58, 55, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,121, - 115,116,105, 99, 32,119, 97,114,114,105,111,114,115, 32, 40,119,111,114, - 108,100, 32,118,101,114, 32,101, 97, 97, 41, 10,109,121,115,116,119, 97, - 114,114, 58, 10,109,121,115,116,119, 97,114,114,106, 58, 10,109,121,115, - 116,119, 97,114,114,117, 58, 10,109,121,115,116,119, 97,114,114, 97, 58, - 10,109,121,115,116,119, 97,114,114, 97, 97, 58, 10, 48, 58, 50, 48, 48, - 52, 48, 48, 58, 52,101, 58, 52, 56, 58, 48, 49, 10, 48, 58, 50, 48, 48, - 49, 55, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 48, 48, 49, - 55, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42,103,117, 97,114,100,105, 97,110,115, 47,100,101,110,106,105,110, - 32,109, 97,107, 97,105, 32, 73, 73, 40, 66,121, 32, 70,105,114,101, 98, - 114, 97,110,100, 41, 10,103,114,100,105, 97,110,115, 58, 10, 48, 58, 50, - 48, 49, 53, 56, 50, 58, 52, 97, 58, 99, 51, 58, 48, 49, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,100,114, 97,103,111,110, 32,103,117,110, 40,117, - 115, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,100, - 114, 97,103,110,103,117,110, 58, 10,100,114, 97,103,110,103,117,110,106, - 58, 10, 48, 58, 48, 49, 49,102, 51, 56, 52, 58, 49, 51,100, 58, 50, 48, - 58, 49, 98, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, - 99, 32, 40,101,115,112, 46,114, 97, 46,100,101, 41, 32, 40, 73,110,116, - 101,114,110, 97,116,105,111,110, 97,108, 32, 86,101,114, 32, 49, 57, 57, - 56, 32, 52, 47, 50, 50, 32, 97,110,100, 32, 99,108,111,110,101,115, 41, - 10,101,115,112,114, 97,100,101, 58, 10,101,115,112,114, 97,100,101,106, - 111, 58, 10,101,115,112,114, 97,100,101,106, 58, 10, 48, 58, 49, 48, 50, - 51, 98, 48, 58, 53, 48, 58, 48, 48, 58, 56, 99, 10, 48, 58, 49, 48, 50, - 50,101, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,116,101, 99,109,111, 32, 98,111,119,108, 32, 40,119,111,114, - 108,100, 63, 32, 38, 32,106, 97,112, 97,110, 41, 9, 10,116, 98,111,119, - 108, 58, 10,116, 98,111,119,108,106, 58, 10,116, 98,111,119,108,112, 58, - 10, 48, 58, 56, 48, 49, 53, 58, 98, 52, 58, 52, 49, 58, 48, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101,114,106, 97,119, - 115, 10,116,104,117,110,100,101,114,106, 58, 10,116,104,117,110,100,101, - 114,106, 97, 58, 10, 48, 58, 51,102,102,100, 57, 99, 58, 54, 52, 58, 48, - 48, 58, 57, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,114, 97,103, - 111,110, 32,109, 97,115,116,101,114, 10,100,114,103,110,109,115,116, 58, - 10, 48, 58,102,102, 56, 52,102, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 48, 58,102,102, 56, 52, 53, 48, 58, 54, 99, 58, 48, 48, 58, 48, 49, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,108, 97,115, 32,118,101,103, 97,115, - 32,103,105,114,108, 32, 40,103,105,114,108, 96, 57, 52, 41, 10,108,118, - 103,105,114,108, 57, 52, 58, 10, 48, 58, 99, 49, 55, 99,100, 58, 55, 55, - 58, 53, 51, 58, 48, 48, 10, 48, 58, 99, 49, 56, 52, 48, 58, 49, 58, 48, - 55, 58, 48, 55, 10, 48, 58, 99, 50, 51,100, 97, 58, 54, 58, 48, 48, 58, - 48, 48, 10, 10, 98,111,103,103,121, 56, 52, 98, 58, 10, 48, 58, 99, 52, - 48, 48, 58, 52, 53, 58, 48, 48, 58, 49, 49, 10, 48, 58, 99, 48, 52, 52, - 58, 54, 58, 49, 48, 58, 49, 48, 10, 48, 58, 99, 48, 52, 98, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10, 98,111,103,103,121, 56, 52, 58, 10, 48, 58, - 99, 52, 48, 48, 58, 52, 53, 58, 48, 48, 58, 49, 49, 10, 48, 58, 99, 48, - 52, 52, 58, 54, 58, 49, 48, 58, 49, 48, 10, 48, 58, 99, 48, 52, 98, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,111, - 102,102, 32,116,104,101, 32,119, 97,108,108, 32, 40, 50, 47, 51, 32,112, - 108, 97,121,101,114, 32,117,112,114,105,103,104,116, 41, 41, 10,111,102, - 102,116,119, 97,108,108, 58, 10,111,102,102,116,119, 97,108,108, 99, 58, - 10, 48, 58, 51,102,101,101, 50,101, 58, 51, 55, 58, 48, 48, 58, 52, 57, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,117, 98,108, 98,111, 98, - 108, 46, 99, 10, 59, 42, 42, 42, 42, 32,110,111,119, 32,115, 97,118,101, - 115, 32, 97,108,108, 32,104,105,115, 99,111,114,101, 32,100, 97,116, 97, - 32, 97,110,100, 32,115,112,101, 99,105, 97,108, 32,105,116,101,109, 32, - 99,111,117,110,116,101,114,115, 32, 42, 42, 42, 42, 10, 98,117, 98,108, - 98,111, 98,108, 58, 10, 98,117, 98, 54, 56, 55, 48, 53, 58, 10, 98,117, - 98,108, 98,111, 98,108,114, 58, 10, 98,117, 98,108, 98,111, 98,108,114, - 49, 58, 10, 98,111, 98,108, 98,111, 98,108, 58, 10, 98,117, 98,108, 98, - 111, 98,108, 49, 58, 10, 98,111, 98,108, 98,111, 98,108, 50, 58, 10,115, - 98,111, 98,108, 98,111, 98,108, 58, 10, 98, 98,114,101,100,117,120, 58, - 10, 98,117, 98,108, 98,111, 98,108, 98, 58, 10, 98,117, 98,108, 99, 97, - 118,101, 49, 48, 58, 10, 98,117, 98,108, 99, 97,118,101, 49, 49, 58, 10, - 115, 98,111, 98,108, 98,111, 98,108, 99, 58, 10, 48, 58,101, 54, 53, 52, - 58, 50, 51, 58, 48, 48, 58, 52, 56, 10, 48, 58,101, 54, 55, 98, 58, 51, - 58, 49,102, 58, 49, 51, 10, 48, 58,101, 54, 52, 99, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,100,102, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,101, 52, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, - 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 50, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,101, 51, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,101, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,101, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, - 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 97, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 98, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,102, 54, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,102, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,101,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, - 102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 48, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 99, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,101,100, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,102, 51, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,102, 52, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,100, - 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,100, 97, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, 53, 55, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,102, 52, 53, 56, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 54, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 54, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, - 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102,102, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102,100, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,102, 99, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,102, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,102, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, - 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 56, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102,101, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 54, 48, 52, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 54, 48, 53, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 54, 48, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, - 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 57, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 97, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 54, 49, 49, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 54, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10,115, - 98,111, 98,108, 98,111, 98, 58, 32, 32, 10,115, 98,111, 98,108, 98,111, + 13, 10,100,101, 97,100, 97,110,103, 58, 13, 10, 48, 58, 49, 52, 52, 50, + 58, 98,100, 58, 53, 48, 58, 48, 48, 13, 10, 48, 58, 49, 52,102, 57, 58, + 49, 58, 50, 97, 58, 50, 97, 13, 10, 13, 10,103,104,117,110,116,101,114, + 115, 58, 13, 10, 48, 58, 49, 52, 56, 50, 58, 98,100, 58, 53, 48, 58, 48, + 48, 13, 10, 48, 58, 49, 53, 51, 57, 58, 49, 58, 50, 97, 58, 50, 97, 13, + 10, 13, 10,108,101, 97,100, 97,110,103, 58, 13, 10, 48, 58, 49, 53, 52, + 50, 58, 98,100, 58, 53, 48, 58, 48, 48, 13, 10, 48, 58, 49, 53,102, 57, + 58, 49, 58, 50, 97, 58, 50, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,103,111,107,117,106,121,111,117, 32,112, 97,114,111,100,105,117, + 115, 32, 40,118,101,114, 32,106, 97,100, 41, 13, 10,103,111,107,117,112, + 97,114,111, 58, 13, 10, 48, 58, 99, 48,100, 55, 51, 54, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 99, 48,100, 55, 52, 50, 58, 55, 56, 58, + 48, 48, 58, 48, 57, 13, 10, 48, 58, 99, 48,100, 55, 51, 56, 58, 49, 58, + 55, 51, 58, 55, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, + 121,115,116,105, 99, 32,119, 97,114,114,105,111,114,115, 32, 40,119,111, + 114,108,100, 32,118,101,114, 32,101, 97, 97, 41, 13, 10,109,121,115,116, + 119, 97,114,114, 58, 13, 10,109,121,115,116,119, 97,114,114,106, 58, 13, + 10,109,121,115,116,119, 97,114,114,117, 58, 13, 10,109,121,115,116,119, + 97,114,114, 97, 58, 13, 10,109,121,115,116,119, 97,114,114, 97, 97, 58, + 13, 10, 48, 58, 50, 48, 48, 52, 48, 48, 58, 52,101, 58, 52, 56, 58, 48, + 49, 13, 10, 48, 58, 50, 48, 48, 49, 55, 48, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 50, 48, 48, 49, 55, 49, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,103,117, 97,114,100, + 105, 97,110,115, 47,100,101,110,106,105,110, 32,109, 97,107, 97,105, 32, + 73, 73, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, + 103,114,100,105, 97,110,115, 58, 13, 10, 48, 58, 50, 48, 49, 53, 56, 50, + 58, 52, 97, 58, 99, 51, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,100,114, 97,103,111,110, 32,103,117,110, 40,117,115, 41, 40, + 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10,100,114, 97, + 103,110,103,117,110, 58, 13, 10,100,114, 97,103,110,103,117,110,106, 58, + 13, 10, 48, 58, 48, 49, 49,102, 51, 56, 52, 58, 49, 51,100, 58, 50, 48, + 58, 49, 98, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118, + 101, 46, 99, 32, 40,101,115,112, 46,114, 97, 46,100,101, 41, 32, 40, 73, + 110,116,101,114,110, 97,116,105,111,110, 97,108, 32, 86,101,114, 32, 49, + 57, 57, 56, 32, 52, 47, 50, 50, 32, 97,110,100, 32, 99,108,111,110,101, + 115, 41, 13, 10,101,115,112,114, 97,100,101, 58, 13, 10,101,115,112,114, + 97,100,101,106,111, 58, 13, 10,101,115,112,114, 97,100,101,106, 58, 13, + 10, 48, 58, 49, 48, 50, 51, 98, 48, 58, 53, 48, 58, 48, 48, 58, 56, 99, + 13, 10, 48, 58, 49, 48, 50, 50,101, 99, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,101, 99,109,111, 32, + 98,111,119,108, 32, 40,119,111,114,108,100, 63, 32, 38, 32,106, 97,112, + 97,110, 41, 9, 13, 10,116, 98,111,119,108, 58, 13, 10,116, 98,111,119, + 108,106, 58, 13, 10,116, 98,111,119,108,112, 58, 13, 10, 48, 58, 56, 48, + 49, 53, 58, 98, 52, 58, 52, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42,116,104,117,110,100,101,114,106, 97,119,115, 13, 10, + 116,104,117,110,100,101,114,106, 58, 13, 10,116,104,117,110,100,101,114, + 106, 97, 58, 13, 10, 48, 58, 51,102,102,100, 57, 99, 58, 54, 52, 58, 48, + 48, 58, 57, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,114, + 97,103,111,110, 32,109, 97,115,116,101,114, 13, 10,100,114,103,110,109, + 115,116, 58, 13, 10, 48, 58,102,102, 56, 52,102, 48, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102,102, 56, 52, 53, 48, 58, 54, 99, 58, 48, + 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,108, 97, + 115, 32,118,101,103, 97,115, 32,103,105,114,108, 32, 40,103,105,114,108, + 96, 57, 52, 41, 13, 10,108,118,103,105,114,108, 57, 52, 58, 13, 10, 48, + 58, 99, 49, 55, 99,100, 58, 55, 55, 58, 53, 51, 58, 48, 48, 13, 10, 48, + 58, 99, 49, 56, 52, 48, 58, 49, 58, 48, 55, 58, 48, 55, 13, 10, 48, 58, + 99, 50, 51,100, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 98, + 111,103,103,121, 56, 52, 98, 58, 13, 10, 48, 58, 99, 52, 48, 48, 58, 52, + 53, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, 99, 48, 52, 52, 58, 54, 58, + 49, 48, 58, 49, 48, 13, 10, 48, 58, 99, 48, 52, 98, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 98,111,103,103,121, 56, 52, 58, 13, 10, 48, + 58, 99, 52, 48, 48, 58, 52, 53, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, + 99, 48, 52, 52, 58, 54, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 99, 48, + 52, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42,111,102,102, 32,116,104,101, 32,119, 97,108,108, 32, 40, + 50, 47, 51, 32,112,108, 97,121,101,114, 32,117,112,114,105,103,104,116, + 41, 41, 13, 10,111,102,102,116,119, 97,108,108, 58, 13, 10,111,102,102, + 116,119, 97,108,108, 99, 58, 13, 10, 48, 58, 51,102,101,101, 50,101, 58, + 51, 55, 58, 48, 48, 58, 52, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 98,117, 98,108, 98,111, 98,108, 46, 99, 13, 10, 59, 42, 42, + 42, 42, 32,110,111,119, 32,115, 97,118,101,115, 32, 97,108,108, 32,104, + 105,115, 99,111,114,101, 32,100, 97,116, 97, 32, 97,110,100, 32,115,112, + 101, 99,105, 97,108, 32,105,116,101,109, 32, 99,111,117,110,116,101,114, + 115, 32, 42, 42, 42, 42, 13, 10, 98,117, 98,108, 98,111, 98,108, 58, 13, + 10, 98,117, 98, 54, 56, 55, 48, 53, 58, 13, 10, 98,117, 98,108, 98,111, + 98,108,114, 58, 13, 10, 98,117, 98,108, 98,111, 98,108,114, 49, 58, 13, + 10, 98,111, 98,108, 98,111, 98,108, 58, 13, 10, 98,117, 98,108, 98,111, + 98,108, 49, 58, 13, 10, 98,111, 98,108, 98,111, 98,108, 50, 58, 13, 10, + 115, 98,111, 98,108, 98,111, 98,108, 58, 13, 10, 98, 98,114,101,100,117, + 120, 58, 13, 10, 98,117, 98,108, 98,111, 98,108, 98, 58, 13, 10, 98,117, + 98,108, 99, 97,118,101, 49, 48, 58, 13, 10, 98,117, 98,108, 99, 97,118, + 101, 49, 49, 58, 13, 10,115, 98,111, 98,108, 98,111, 98,108, 99, 58, 13, + 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, 58, 52, 56, 13, 10, + 48, 58,101, 54, 55, 98, 58, 51, 58, 49,102, 58, 49, 51, 13, 10, 48, 58, + 101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 100,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 48, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 52, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 54, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 49, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 53,101, 50, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,101, 51, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,101, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,101, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 101, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 97, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 98, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 54, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 55, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,102, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,101, 99, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 101,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 51, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 52, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100, 57, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100, 97, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,102, 52, 53, 55, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,102, 52, 53, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 54, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 54, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, + 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102,102, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 99, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 98, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,102, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, + 48, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 53, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 54, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 55, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 57, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 54, 48, 97, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 54, 49, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 54, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 115, 98,111, 98,108, 98,111, 98, 58, 13, 10,115, 98,111, 98,108, 98,111, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 83,117,112,101,114, 32, 66, 111, 98, 98,108,101, 32, 66,111, 98, 98,108,101, 32, 40,115,101,116, 32, - 49, 41, 10,115, 98,111, 98,108, 98,111, 98,108, 97, 58, 10,115, 98,111, - 98,108, 98,111, 98,108, 98, 58, 10,115, 98,111, 98,108, 98,111, 98,108, - 100, 58, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, 58, 52, 56, - 10, 48, 58,101, 54, 55, 98, 58, 51, 58, 49,102, 58, 49, 51, 10, 48, 58, - 101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99,102, 99, - 54, 58, 49, 58, 54, 48, 58, 54, 48, 10, 48, 58,100, 48, 48, 54, 58, 49, - 58, 54, 48, 58, 54, 48, 10, 48, 58,100, 48, 52, 54, 58, 49, 58, 54, 48, - 58, 54, 48, 10, 48, 58,100, 48, 56, 54, 58, 49, 58, 55,101, 58, 55,101, - 10, 48, 58,100, 48, 99, 54, 58, 49, 58, 55, 98, 58, 55, 98, 10, 48, 58, - 100, 49, 48, 54, 58, 49, 58, 55, 98, 58, 55, 98, 10, 48, 58,100, 49, 52, - 54, 58, 49, 58, 55, 98, 58, 55, 98, 10, 48, 58,100, 49, 56, 54, 58, 49, - 58, 55, 98, 58, 55, 98, 10, 48, 58,101, 53,100,102, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,101, 52, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,101, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, - 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 50, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 51, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,101, 55, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, - 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 98, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 54, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,102, 55, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, - 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 99, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101,100, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,102, 51, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,102, 52, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,100, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,100, - 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, 53, 55, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, 53, 56, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 54, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, - 102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102,100, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 99, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 53,102, 98, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, - 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102,101, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 52, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 54, 48, 53, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58,101, 54, 48, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 101, 54, 48, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, - 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 97, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 49, 49, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 54, 48, 98, 58, 50, 58, 48, 48, 58, 48, 48, - 10, 10, 98,111, 98,108, 99, 97,118,101, 58, 10, 98,117, 98,108, 99, 97, - 118,101, 58, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, 58, 52, - 101, 10, 48, 58,101, 54, 55, 98, 58, 51, 58, 49,102, 58, 49, 51, 10, 48, - 58,101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 100,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 48, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 52, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,101, 54, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,101, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 101, 51, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 55, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,101, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,101, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 102, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 55, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,101,101, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,101,102, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,102, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,101, 99, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 101,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 51, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 52, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,100, 57, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,100, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,102, 52, 53, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, - 53, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 49, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,102,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53, - 102, 99, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 98, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 53,102, 97, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 53,102, 57, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53,102, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 53,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, - 48, 52, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 53, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 54, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 55, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 54, 48, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 54, 48, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, - 49, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 54, 48, 98, 58, - 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, - 111,108,105, 45, 98,111,111, 45, 99,104,105, 41, 10, 59, 42, 42, 32,103, - 97,109,101, 32,117,112,100, 97,116,101,115, 32,115, 97,118,101,100, 32, - 104,105,115, 99,111,114,101, 32, 97,115, 32,115,111,111,110, 32, 97,115, - 32,121,111,117, 32,105,110,115,101,114,116, 32, 97, 32, 99,111,105,110, - 32, 42, 42, 10,111,108,105, 98,111, 99,104,117, 58, 10, 48, 58,102, 56, - 52, 99, 58, 53, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 56, 52,101, 58, - 49, 58, 48, 53, 58, 48, 53, 10, 48, 58, 56, 49, 98,100, 58, 49, 58, 54, - 48, 58, 54, 48, 10, 48, 58, 56, 49,100,100, 58, 49, 58, 54, 48, 58, 54, - 48, 10, 48, 58, 56, 49,102,100, 58, 49, 58, 48, 53, 58, 48, 53, 10, 48, - 58, 56, 50, 49,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 50, - 51,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 50, 53,100, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 49, 52,102, 58, 49, 58, 49, - 56, 58, 49, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 98,105,114, - 100,105,101, 32,107,105,110,103, 32, 50, 41, 40, 66,121, 32, 70,105,114, - 101, 98,114, 97,110,100, 41, 10, 98,107,105,110,103, 50, 58, 10, 48, 58, - 56, 49, 54, 54, 58, 57, 58, 48, 58, 48, 10, 48, 58, 56, 49, 56, 55, 58, - 49, 58, 48, 58, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,119,111, - 114,108,100, 32,114, 97,108,108,121, 32, 50, 58, 32,116,119,105,110, 32, - 114, 97, 99,105,110,103, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97, - 110,100, 41, 10,119,114, 97,108,108,121, 50, 58, 10, 48, 58,102,101, 99, - 55, 54, 54, 58, 50, 56, 56, 58, 53, 97, 58,102,102, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 40,103,104,111,115,116, 32,112,105,108,111,116,115, - 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,103,112, - 105,108,111,116,115, 58, 10, 48, 58, 49, 48,101, 48, 48, 49, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 49, 48,101, 48, 48, 53, 58, 52, 98, 58, - 48, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,103,114, - 97,110,100, 32,115,116,114,105,107,101,114, 41, 40, 66,121, 32, 70,105, - 114,101, 98,114, 97,110,100, 41, 10,103,115,116,114,105,107,101,114, 58, - 10,103,115,116,114,105,107,101,114, 97, 58, 10, 48, 58,102,102,101, 51, - 53, 55, 58, 52, 51, 58, 48,102, 58, 48, 49, 10, 10,103,115,116,114,105, - 107,101,114,106, 58, 10, 48, 58,102,102,101, 51, 52, 57, 58, 52, 51, 58, - 48,102, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,109, 97, - 100, 32,115,104, 97,114,107, 41, 10,109, 97,100,115,104, 97,114,107, 58, - 10, 48, 58, 50, 48, 49,100, 50, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 50, 48, 53,100,100, 50, 58, 99, 52, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 50, 48, 49,100, 50, 49, 58, 49, 58, 48, 97, 58, 48, 97, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 40,109, 97,100, 32,100,111,110,110, 97, - 32, 40,115,101,116, 32, 49, 41, 41, 10,109, 97,100,100,111,110,110, 97, - 58, 10, 48, 58, 56, 51, 53,102, 99, 58, 52, 58, 48, 48, 58, 51, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,114, 97,105,103, 97, 32, 45, 32, - 115,116,114, 97,116,111, 32,102,105,103,104,116,101,114, 41, 40, 85, 83, - 32, 97,110,100, 32, 74, 97,112, 97,110, 41, 40, 66,121, 32, 70,105,114, - 101, 98,114, 97,110,100, 41, 10,115,116,114, 97,116,111,102, 58, 10,114, - 97,105,103, 97, 58, 10, 48, 58, 48, 54, 48, 48, 56, 50, 58, 56, 99, 58, - 48, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,104, 97, - 108,108,101,121, 39,115, 32, 99,111,109,101,116, 41, 40, 66,121, 32, 70, - 105,114,101, 98,114, 97,110,100, 41, 10,104, 97,108,108,101,121,115, 58, - 10,104, 97,108,108,101,121, 99,106, 58, 10,104, 97,108,108,101,121,115, - 99, 58, 10, 48, 58,102, 99, 51, 99, 58, 50, 51, 58, 48, 50, 58, 53, 52, - 10, 48, 58,102, 99, 50, 49, 58, 51, 58, 48, 50, 58, 48, 48, 10, 10,104, - 97,108,108,101,121, 56, 55, 58, 10, 48, 58,102, 99, 53, 97, 58, 50, 51, - 58, 48, 50, 58, 53, 52, 10, 48, 58,102, 99, 51,102, 58, 51, 58, 48, 50, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,103,105,103, 97, - 115, 32,109, 97,114,107, 32, 73, 73, 41, 40, 98,111,111,116,108,101,103, - 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10,103,105, - 103, 97,115,109, 50, 98, 58, 10, 48, 58, 99, 48, 97, 48, 58, 52,100, 58, - 48, 48, 58, 50, 48, 10, 10,103,105,103, 97,115, 98, 58, 10,103,105,103, - 97,115, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 71,105,103, 97,115, 10, - 48, 58, 99, 98, 49, 48, 58, 52,100, 58, 56, 48, 58, 50, 48, 10, 10,111, - 105,103, 97,115, 58, 10, 48, 58, 99, 98, 49, 48, 58, 52,100, 58, 57, 48, - 58, 53, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 99,114,111,119, - 110,115, 32,103,111,108,102, 32, 40,115,101,116, 32, 49, 41, 41, 10, 99, - 114,103,111,108,102, 58, 10, 48, 58, 52, 48, 48, 49, 58, 49, 48, 99, 58, - 48, 52, 58, 48, 48, 10, 48, 58, 52, 49, 49, 97, 58, 49, 58, 48, 97, 58, - 48, 97, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,102, 97,110,116, 97, - 115,121, 32, 96, 57, 53, 41, 10,102, 97,110,116,115,121, 57, 53, 58, 10, - 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 51, 58, 51, 48, 58, 50, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,100,111,114,111,100,111,110, 32, 40, - 115,101,116, 32, 49, 41, 10,100,111,114,111,100,111,110, 58, 10,100,111, - 114,111,100,111,110, 50, 58, 10, 48, 58, 54, 48, 55, 51, 58, 49, 98, 58, - 48, 49, 58, 48, 48, 10, 48, 58,100, 51, 56, 49, 58, 52, 54, 58, 48,102, - 58, 49, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 98,101,110, 32, 98, - 101,114,111, 32, 98,101,104, 32, 40,106, 97,112, 97,110, 41, 10, 98,101, - 110, 98,101,114,111, 98, 58, 10, 48, 58,102, 97, 52,100, 58, 51, 58, 48, - 48, 58, 57, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,105,115,116, - 111,108, 32,100, 97,105,109,121,111, 32,110,111, 32, 98,111,117,107,101, - 110, 40, 74, 97,112, 97,110, 41, 40, 66,121, 32, 70,105,114,101, 98,114, - 97,110,100, 41, 10,112,105,115,116,111,108,100,109, 58, 10, 48, 58, 48, - 49,102, 55, 58, 50, 51, 58, 48, 53, 58, 51, 51, 10, 48, 58, 48, 49, 53, - 99, 58, 52, 58, 48, 53, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,116,104,101, 32,103, 97,109,101, 32,112, 97,114, 97,100,105,115, - 101, 32, 45, 32,109, 97,115,116,101,114, 32,111,102, 32,115,104,111,111, - 116,105,110,103, 10,103, 97,109,101,116,110,103,107, 58, 10, 48, 58,102, - 101,101, 48, 48, 50, 49,101, 58, 52, 58, 52, 48, 58, 48, 48, 10, 48, 58, - 102, 99, 48, 48, 48, 52, 53, 48, 58, 49, 53, 99,100, 58, 52, 55, 58, 50, - 48, 10, 48, 58,102,101,101, 49, 54, 48, 48, 48, 58, 52, 52,100, 58, 52, - 55, 58, 48, 48, 10, 48, 58,102,101,101, 49, 54, 52, 52, 56, 58, 49, 58, - 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97, - 99,114,111,115,115, 32, 73, 73, 40, 66,121, 32, 70,105,114,101, 98,114, - 97,110,100, 41, 40,114,101,100,105,116,101,100, 32,116,111, 32,105,110, - 99,108,117,100,101, 32,101, 97, 99,104, 32,115,116, 97,103,101, 39,115, - 32,104,105,115, 99,111,114,101, 32, 10, 59, 97,110,100, 32, 97,108,108, - 32,114, 97,110,107,115, 41, 10,109, 97, 99,114,111,115,115, 50, 58, 10, - 109, 97, 99,114,111,115,115, 50,103, 58, 10, 48, 58, 49,102,102, 97, 48, - 48, 58, 56, 48, 58, 48, 48, 58, 53, 48, 10, 48, 58, 49,102,102, 98, 48, - 48, 58, 56, 48, 58, 48, 48, 58, 53, 48, 10, 48, 58, 49,102,102, 99, 48, - 48, 58, 56, 48, 58, 48, 48, 58, 53, 48, 10, 48, 58, 49,102, 99, 52, 48, - 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, 48, 58, 49,102, 99, 54, - 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, 48, 58, 49,102, 99, - 56, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, 48, 58, 49,102, - 99, 97, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, 48, 58, 49, - 102, 99, 99, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, 48, 58, - 49,102, 99,101, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, 48, - 58, 49,102,100, 48, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 10, - 48, 58, 49,102,100, 50, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, - 10, 48, 58, 49,102,100, 52, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, - 51, 10, 48, 58, 49,102,100, 54, 48, 48, 58, 50, 48, 48, 58, 48, 49, 58, - 54, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101, - 114, 32,122,111,110,101, 40,119,111,114,108,100, 41, 40, 66,121, 32, 70, - 105,114,101, 98,114, 97,110,100, 41, 10,116,104,110,100,122,111,110,101, - 58, 10,116,104,110,100,122,111,110,101, 97, 58, 10, 48, 58, 51,102, 56, - 48, 52, 48, 58, 49, 97, 58, 49, 48, 58, 49, 48, 10, 10,116,104,110,100, - 122,111,110,101,106, 58, 10, 48, 58, 51,102, 56, 48, 51, 56, 58, 49, 97, - 58, 49, 48, 58, 49, 48, 10, 10,116,104,110,100,122,111,110,101, 52, 58, - 10, 48, 58, 51,102, 56, 48, 51, 99, 58, 49,101, 58, 49, 57, 58, 48, 49, - 10, 10,100, 97,115,115, 97,117,108,116, 52, 58, 10, 48, 58, 51,102, 56, - 48, 51, 99, 58, 49,101, 58, 49, 57, 58, 48, 49, 10, 10,100, 97,115,115, - 97,117,108,116, 58, 10, 48, 58, 51,102, 56, 48, 51, 99, 58, 49,101, 58, - 49, 57, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 97,121, - 104,101,109, 32, 50, 48, 48, 50, 40, 66,121, 32, 70,105,114,101, 98,114, - 97,110,100, 41, 10, 59, 32, 45, 32, 79,110,108,121, 32,119,111,114,107, - 115, 32,105,102, 32,121,111,117, 32,100,101,108,101,116,101, 32,116,104, - 101, 32,110,118,114, 97,109, 32, 97,102,116,101,114, 32,121,111,117, 32, - 116,117,114,110, 32,111,102,102, 32,116,104,101, 32,103, 97,109,101, 46, - 32, 77, 97,107,105,110,103, 32, 10, 59,116,104,101, 32,110,118,114, 97, - 109, 32,114,101, 97,100, 45,111,110,108,121, 32,119,105,108,108, 32,110, - 111,116, 32,119,111,114,107, 46, 10,109, 97,121,104,101,109, 58, 10, 48, - 58,101, 48, 56, 49, 58, 98, 97, 58, 49, 48, 58, 52, 53, 10, 10, 59, 42, + 49, 41, 13, 10,115, 98,111, 98,108, 98,111, 98,108, 97, 58, 13, 10,115, + 98,111, 98,108, 98,111, 98,108, 98, 58, 13, 10,115, 98,111, 98,108, 98, + 111, 98,108,100, 58, 13, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, + 48, 58, 52, 56, 13, 10, 48, 58,101, 54, 55, 98, 58, 51, 58, 49,102, 58, + 49, 51, 13, 10, 48, 58,101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 99,102, 99, 54, 58, 49, 58, 54, 48, 58, 54, 48, 13, 10, + 48, 58,100, 48, 48, 54, 58, 49, 58, 54, 48, 58, 54, 48, 13, 10, 48, 58, + 100, 48, 52, 54, 58, 49, 58, 54, 48, 58, 54, 48, 13, 10, 48, 58,100, 48, + 56, 54, 58, 49, 58, 55,101, 58, 55,101, 13, 10, 48, 58,100, 48, 99, 54, + 58, 49, 58, 55, 98, 58, 55, 98, 13, 10, 48, 58,100, 49, 48, 54, 58, 49, + 58, 55, 98, 58, 55, 98, 13, 10, 48, 58,100, 49, 52, 54, 58, 49, 58, 55, + 98, 58, 55, 98, 13, 10, 48, 58,100, 49, 56, 54, 58, 49, 58, 55, 98, 58, + 55, 98, 13, 10, 48, 58,101, 53,100,102, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,101, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,101, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,101, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 50, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 51, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 55, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 56, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 53,101, 57, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,101, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,101, 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,102, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 102, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101,101, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101,102, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 48, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 99, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 53,101,100, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,102, 51, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,102, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,100, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 100, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 52, 53, 55, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 52, 53, 56, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 49, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 50, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 54, 48, 48, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 53,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 53,102,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 53,102, 99, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53, + 102, 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 97, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 57, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 56, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102,101, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,101, 54, 48, 52, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 54, 48, 53, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 54, 48, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 101, 54, 48, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, + 48, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 97, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 49, 49, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 98, 58, 50, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 98,111, 98,108, 99, 97,118,101, 58, 13, + 10, 98,117, 98,108, 99, 97,118,101, 58, 13, 10, 48, 58,101, 54, 53, 52, + 58, 50, 51, 58, 48, 48, 58, 52,101, 13, 10, 48, 58,101, 54, 55, 98, 58, + 51, 58, 49,102, 58, 49, 51, 13, 10, 48, 58,101, 54, 52, 99, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,100,102, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,101, 48, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,101, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,101, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,101, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, + 51, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 55, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 56, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 57, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,101, 97, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,101, 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,102, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,102, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,101,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, + 102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 48, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101, 99, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,101,100, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,102, 51, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,102, 52, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,100, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,100, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, + 52, 53, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 52, 53, + 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 49, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 50, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 48, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 53,102,102, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 53,102,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 53,102, 99, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 53,102, 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 53,102, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, + 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102, 56, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 53,102,101, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 52, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 53, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 54, 48, 54, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,101, 54, 48, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 54, 48, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 54, 48, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 49, + 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 98, 58, + 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 40,111,108,105, 45, 98,111,111, 45, 99,104,105, 41, 13, 10, 59, 42, + 42, 32,103, 97,109,101, 32,117,112,100, 97,116,101,115, 32,115, 97,118, + 101,100, 32,104,105,115, 99,111,114,101, 32, 97,115, 32,115,111,111,110, + 32, 97,115, 32,121,111,117, 32,105,110,115,101,114,116, 32, 97, 32, 99, + 111,105,110, 32, 42, 42, 13, 10,111,108,105, 98,111, 99,104,117, 58, 13, + 10, 48, 58,102, 56, 52, 99, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,102, 56, 52,101, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 56, + 49, 98,100, 58, 49, 58, 54, 48, 58, 54, 48, 13, 10, 48, 58, 56, 49,100, + 100, 58, 49, 58, 54, 48, 58, 54, 48, 13, 10, 48, 58, 56, 49,102,100, 58, + 49, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 56, 50, 49,100, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 50, 51,100, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 56, 50, 53,100, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 56, 49, 52,102, 58, 49, 58, 49, 56, 58, 49, 56, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 98,105,114,100,105,101, + 32,107,105,110,103, 32, 50, 41, 40, 66,121, 32, 70,105,114,101, 98,114, + 97,110,100, 41, 13, 10, 98,107,105,110,103, 50, 58, 13, 10, 48, 58, 56, + 49, 54, 54, 58, 57, 58, 48, 58, 48, 13, 10, 48, 58, 56, 49, 56, 55, 58, + 49, 58, 48, 58, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, + 119,111,114,108,100, 32,114, 97,108,108,121, 32, 50, 58, 32,116,119,105, + 110, 32,114, 97, 99,105,110,103, 41, 40, 66,121, 32, 70,105,114,101, 98, + 114, 97,110,100, 41, 13, 10,119,114, 97,108,108,121, 50, 58, 13, 10, 48, + 58,102,101, 99, 55, 54, 54, 58, 50, 56, 56, 58, 53, 97, 58,102,102, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,103,104,111,115,116, 32, + 112,105,108,111,116,115, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97, + 110,100, 41, 13, 10,103,112,105,108,111,116,115, 58, 13, 10, 48, 58, 49, + 48,101, 48, 48, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, + 48,101, 48, 48, 53, 58, 52, 98, 58, 48, 48, 58, 49, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 40,103,114, 97,110,100, 32,115,116,114, + 105,107,101,114, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, + 41, 13, 10,103,115,116,114,105,107,101,114, 58, 13, 10,103,115,116,114, + 105,107,101,114, 97, 58, 13, 10, 48, 58,102,102,101, 51, 53, 55, 58, 52, + 51, 58, 48,102, 58, 48, 49, 13, 10, 13, 10,103,115,116,114,105,107,101, + 114,106, 58, 13, 10, 48, 58,102,102,101, 51, 52, 57, 58, 52, 51, 58, 48, + 102, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,109, + 97,100, 32,115,104, 97,114,107, 41, 13, 10,109, 97,100,115,104, 97,114, + 107, 58, 13, 10, 48, 58, 50, 48, 49,100, 50, 48, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 50, 48, 53,100,100, 50, 58, 99, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 50, 48, 49,100, 50, 49, 58, 49, 58, 48, 97, + 58, 48, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,109, 97, + 100, 32,100,111,110,110, 97, 32, 40,115,101,116, 32, 49, 41, 41, 13, 10, + 109, 97,100,100,111,110,110, 97, 58, 13, 10, 48, 58, 56, 51, 53,102, 99, + 58, 52, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 40,114, 97,105,103, 97, 32, 45, 32,115,116,114, 97,116,111, 32, + 102,105,103,104,116,101,114, 41, 40, 85, 83, 32, 97,110,100, 32, 74, 97, + 112, 97,110, 41, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, + 13, 10,115,116,114, 97,116,111,102, 58, 13, 10,114, 97,105,103, 97, 58, + 13, 10, 48, 58, 48, 54, 48, 48, 56, 50, 58, 56, 99, 58, 48, 48, 58, 50, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,104, 97,108,108, + 101,121, 39,115, 32, 99,111,109,101,116, 41, 40, 66,121, 32, 70,105,114, + 101, 98,114, 97,110,100, 41, 13, 10,104, 97,108,108,101,121,115, 58, 13, + 10,104, 97,108,108,101,121, 99,106, 58, 13, 10,104, 97,108,108,101,121, + 115, 99, 58, 13, 10, 48, 58,102, 99, 51, 99, 58, 50, 51, 58, 48, 50, 58, + 53, 52, 13, 10, 48, 58,102, 99, 50, 49, 58, 51, 58, 48, 50, 58, 48, 48, + 13, 10, 13, 10,104, 97,108,108,101,121, 56, 55, 58, 13, 10, 48, 58,102, + 99, 53, 97, 58, 50, 51, 58, 48, 50, 58, 53, 52, 13, 10, 48, 58,102, 99, + 51,102, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 40,103,105,103, 97,115, 32,109, 97,114,107, 32, 73, 73, + 41, 40, 98,111,111,116,108,101,103, 41, 40, 66,121, 32, 70,105,114,101, + 98,114, 97,110,100, 41, 13, 10,103,105,103, 97,115,109, 50, 98, 58, 13, + 10, 48, 58, 99, 48, 97, 48, 58, 52,100, 58, 48, 48, 58, 50, 48, 13, 10, + 13, 10,103,105,103, 97,115, 98, 58, 13, 10,103,105,103, 97,115, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 42, 71,105,103, 97,115, 13, 10, 48, 58, 99, + 98, 49, 48, 58, 52,100, 58, 56, 48, 58, 50, 48, 13, 10, 13, 10,111,105, + 103, 97,115, 58, 13, 10, 48, 58, 99, 98, 49, 48, 58, 52,100, 58, 57, 48, + 58, 53, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 99,114, + 111,119,110,115, 32,103,111,108,102, 32, 40,115,101,116, 32, 49, 41, 41, + 13, 10, 99,114,103,111,108,102, 58, 13, 10, 48, 58, 52, 48, 48, 49, 58, + 49, 48, 99, 58, 48, 52, 58, 48, 48, 13, 10, 48, 58, 52, 49, 49, 97, 58, + 49, 58, 48, 97, 58, 48, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 40,102, 97,110,116, 97,115,121, 32, 96, 57, 53, 41, 13, 10,102, 97, + 110,116,115,121, 57, 53, 58, 13, 10, 48, 58, 99, 56, 50, 53, 98, 54, 58, + 54, 51, 58, 51, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,100,111,114,111,100,111,110, 32, 40,115,101,116, 32, 49, 41, 13, + 10,100,111,114,111,100,111,110, 58, 13, 10,100,111,114,111,100,111,110, + 50, 58, 13, 10, 48, 58, 54, 48, 55, 51, 58, 49, 98, 58, 48, 49, 58, 48, + 48, 13, 10, 48, 58,100, 51, 56, 49, 58, 52, 54, 58, 48,102, 58, 49, 55, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 98,101,110, 32, 98,101, + 114,111, 32, 98,101,104, 32, 40,106, 97,112, 97,110, 41, 13, 10, 98,101, + 110, 98,101,114,111, 98, 58, 13, 10, 48, 58,102, 97, 52,100, 58, 51, 58, + 48, 48, 58, 57, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112, + 105,115,116,111,108, 32,100, 97,105,109,121,111, 32,110,111, 32, 98,111, + 117,107,101,110, 40, 74, 97,112, 97,110, 41, 40, 66,121, 32, 70,105,114, + 101, 98,114, 97,110,100, 41, 13, 10,112,105,115,116,111,108,100,109, 58, + 13, 10, 48, 58, 48, 49,102, 55, 58, 50, 51, 58, 48, 53, 58, 51, 51, 13, + 10, 48, 58, 48, 49, 53, 99, 58, 52, 58, 48, 53, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,104,101, 32,103, 97,109,101, + 32,112, 97,114, 97,100,105,115,101, 32, 45, 32,109, 97,115,116,101,114, + 32,111,102, 32,115,104,111,111,116,105,110,103, 13, 10,103, 97,109,101, + 116,110,103,107, 58, 13, 10, 48, 58,102,101,101, 48, 48, 50, 49,101, 58, + 52, 58, 52, 48, 58, 48, 48, 13, 10, 48, 58,102, 99, 48, 48, 48, 52, 53, + 48, 58, 49, 53, 99,100, 58, 52, 55, 58, 50, 48, 13, 10, 48, 58,102,101, + 101, 49, 54, 48, 48, 48, 58, 52, 52,100, 58, 52, 55, 58, 48, 48, 13, 10, + 48, 58,102,101,101, 49, 54, 52, 52, 56, 58, 49, 58, 48, 49, 58, 48, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97, 99,114,111, + 115,115, 32, 73, 73, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, + 41, 40,114,101,100,105,116,101,100, 32,116,111, 32,105,110, 99,108,117, + 100,101, 32,101, 97, 99,104, 32,115,116, 97,103,101, 39,115, 32,104,105, + 115, 99,111,114,101, 13, 10, 59, 97,110,100, 32, 97,108,108, 32,114, 97, + 110,107,115, 41, 13, 10,109, 97, 99,114,111,115,115, 50, 58, 13, 10,109, + 97, 99,114,111,115,115, 50,103, 58, 13, 10, 48, 58, 49,102,102, 97, 48, + 48, 58, 56, 48, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, 49,102,102, 98, + 48, 48, 58, 56, 48, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, 49,102,102, + 99, 48, 48, 58, 56, 48, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, 49,102, + 99, 52, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 13, 10, 48, 58, + 49,102, 99, 54, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 13, 10, + 48, 58, 49,102, 99, 56, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, + 13, 10, 48, 58, 49,102, 99, 97, 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, + 55, 51, 13, 10, 48, 58, 49,102, 99, 99, 48, 48, 58, 50, 48, 48, 58, 48, + 48, 58, 55, 51, 13, 10, 48, 58, 49,102, 99,101, 48, 48, 58, 50, 48, 48, + 58, 48, 48, 58, 55, 51, 13, 10, 48, 58, 49,102,100, 48, 48, 48, 58, 50, + 48, 48, 58, 48, 48, 58, 55, 51, 13, 10, 48, 58, 49,102,100, 50, 48, 48, + 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 13, 10, 48, 58, 49,102,100, 52, + 48, 48, 58, 50, 48, 48, 58, 48, 48, 58, 55, 51, 13, 10, 48, 58, 49,102, + 100, 54, 48, 48, 58, 50, 48, 48, 58, 48, 49, 58, 54, 51, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101,114, 32,122,111, + 110,101, 40,119,111,114,108,100, 41, 40, 66,121, 32, 70,105,114,101, 98, + 114, 97,110,100, 41, 13, 10,116,104,110,100,122,111,110,101, 58, 13, 10, + 116,104,110,100,122,111,110,101, 97, 58, 13, 10, 48, 58, 51,102, 56, 48, + 52, 48, 58, 49, 97, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10,116,104,110, + 100,122,111,110,101,106, 58, 13, 10, 48, 58, 51,102, 56, 48, 51, 56, 58, + 49, 97, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10,116,104,110,100,122,111, + 110,101, 52, 58, 13, 10, 48, 58, 51,102, 56, 48, 51, 99, 58, 49,101, 58, + 49, 57, 58, 48, 49, 13, 10, 13, 10,100, 97,115,115, 97,117,108,116, 52, + 58, 13, 10, 48, 58, 51,102, 56, 48, 51, 99, 58, 49,101, 58, 49, 57, 58, + 48, 49, 13, 10, 13, 10,100, 97,115,115, 97,117,108,116, 58, 13, 10, 48, + 58, 51,102, 56, 48, 51, 99, 58, 49,101, 58, 49, 57, 58, 49, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 97,121,104,101,109, 32, 50, + 48, 48, 50, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, + 10, 59, 32, 45, 32, 79,110,108,121, 32,119,111,114,107,115, 32,105,102, + 32,121,111,117, 32,100,101,108,101,116,101, 32,116,104,101, 32,110,118, + 114, 97,109, 32, 97,102,116,101,114, 32,121,111,117, 32,116,117,114,110, + 32,111,102,102, 32,116,104,101, 32,103, 97,109,101, 46, 32, 77, 97,107, + 105,110,103, 13, 10, 59,116,104,101, 32,110,118,114, 97,109, 32,114,101, + 97,100, 45,111,110,108,121, 32,119,105,108,108, 32,110,111,116, 32,119, + 111,114,107, 46, 13, 10,109, 97,121,104,101,109, 58, 13, 10, 48, 58,101, + 48, 56, 49, 58, 98, 97, 58, 49, 48, 58, 52, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 32,116,114,105,118, 32, 73, - 73, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 10, 59, 32, - 45, 32, 79,110,108,121, 32,115, 97,118,101,115, 32, 34, 69,120,112,101, - 114,116,115, 32, 79,110,108,121, 34, 32,115, 99,111,114,101,115, 44, 32, - 99, 97,110, 32,115, 97,118,101, 32,111,116,104,101,114, 32,115,108,111, - 116,115, 32, 98,117,116, 32,116,104,101, 32,103, 97,109,101,115, 32, 97, - 114,101, 32, 10, 59,100,105,102,102,101,114,101,110,116, 32,101,118,101, - 114,121, 32,116,105,109,101, 10, 59, 44, 32, 45, 32,117,110,108,101,115, - 115, 32,121,111,117, 32, 99,104,111,111,115,101, 32,116,104,101, 32,115, - 97,109,101, 32,116,104,114,101,101, 32,111,118,101,114, 32, 97,110,100, - 32,111,118,101,114, 32, 97,103, 97,105,110, 32,115,111, 32,111,110,108, - 121, 32, 34, 69,120,112,101,114,116,115, 32, 10, 59, 79,110,108,121, 34, - 32,103, 97,109,101, 32,115,116, 97,121,115, 32,116,104,101, 32,115, 97, - 109,101, 46, 10,115,117,112,101,114,116,114, 50, 58, 10, 48, 58, 52, 56, - 57, 49, 58, 50, 48, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,103,111,108,108,121, 33, 32,103,104,111,115,116, 33, 40, 66, - 121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 40,117,110, 97, 98,108, - 101, 32,116,111, 32,116,101,115,116, 32,112,114,111,112,101,114,108,121, - 32,100,117,101, 32,116,111, 32,108, 97, 99,107, 32,111,102, 32, 10, 59, - 115,105,103,104,116, 32,109,111,118,101,109,101,110,116, 32,111,110, 32, - 115, 99,114,101,101,110, 41, 10,103,111,108,108,121,103,104,111, 58, 10, - 48, 58, 49, 48, 51, 49, 50, 69, 58, 49, 52, 51, 58, 48, 50, 58, 48, 48, - 10, 10,119,105,122,100,102,105,114,101, 58, 10,119,105,122,100,102,105, - 114,101,117, 58, 10,100, 97,114,107,115,101, 97,108, 50, 58, 10, 48, 58, - 102,100, 99, 48, 51, 52, 58, 50, 56, 58, 48, 98, 58, 48, 48, 10, 48, 58, - 102,100, 99, 48, 53, 57, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,109,117,116, 97,110,116, 32,102,105,103,104, - 116,101,114, 32, 40,119,111,114,108,100, 32,114,101,118, 32, 52, 32,101, - 109, 45, 53, 41, 10,109,117,116, 97,110,116,102, 58, 10,100,101, 97,116, - 104, 98,114,100, 58, 10,109,117,116, 97,110,116,102, 51, 58, 10,109,117, - 116, 97,110,116,102, 52, 58, 10,109,117,116, 97,110,116,102, 50, 58, 10, - 48, 58, 49, 48, 48, 48,102, 99, 58, 51, 50, 58, 48, 49, 58, 48, 48, 10, - 48, 58, 49, 48, 48, 49, 50, 99, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,112,101,114,101,115,116,114,111,105, - 107, 97, 32,103,105,114,108,115, 32, 40,106, 97,112, 97,110, 41, 10,112, - 101,114,101,115,116,114,111, 58, 10,112,101,114,101,115,116,114,111,102, - 58, 10, 48, 58,102, 52, 99, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 10, - 48, 58,102, 56,102, 49, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,116,104,101, 32, 99,108,105,102,102,104, 97, - 110,103,101,114, 32, 45, 32,101,100,119, 97,114,100, 32,114, 97,110,100, - 121, 32, 40,119,111,114,108,100, 32,114,101,118,105,115,105,111,110, 32, - 50, 41, 41, 10,101,100,114, 97,110,100,121, 58, 10,101,100,114, 97,110, - 100,121,106, 58, 10,101,100,114, 97,110,100,121, 49, 58, 10,101,100,114, - 97,110,100,121, 50, 58, 10, 48, 58, 49, 57, 52, 48, 56, 48, 58, 56, 48, - 58, 52,100, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, - 116,105,109,101, 46, 99, 10, 98,110,106, 58, 10, 98,114,117, 98, 98,101, - 114, 58, 10, 98,110,106,109, 58, 10, 48, 58, 48, 48, 48, 97, 58, 51, 58, - 49, 50, 58, 48, 49, 10, 48, 58, 53, 48, 48, 58, 50, 54, 99, 58, 48, 49, - 58, 48, 48, 10, 48, 58, 54, 52, 48, 58, 49, 58, 52,100, 58, 52,100, 10, - 10,116,117, 98,101,112, 58, 10, 48, 58, 97, 48, 98, 54, 58, 50, 52, 48, - 58, 97, 56, 58, 52,100, 10, 48, 58, 97, 48, 57, 50, 58, 51, 58, 97, 56, - 58, 48, 48, 10, 10,116,117, 98,101,112, 98, 58, 10, 48, 58, 97, 48, 57, - 53, 58, 50, 52, 48, 58, 97, 56, 58, 52,100, 10, 48, 58, 97, 48, 56, 48, - 58, 51, 58, 97, 56, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 73, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, 13, 10, 59, + 32, 45, 32, 79,110,108,121, 32,115, 97,118,101,115, 32, 34, 69,120,112, + 101,114,116,115, 32, 79,110,108,121, 34, 32,115, 99,111,114,101,115, 44, + 32, 99, 97,110, 32,115, 97,118,101, 32,111,116,104,101,114, 32,115,108, + 111,116,115, 32, 98,117,116, 32,116,104,101, 32,103, 97,109,101,115, 32, + 97,114,101, 13, 10, 59,100,105,102,102,101,114,101,110,116, 32,101,118, + 101,114,121, 32,116,105,109,101, 13, 10, 59, 44, 32, 45, 32,117,110,108, + 101,115,115, 32,121,111,117, 32, 99,104,111,111,115,101, 32,116,104,101, + 32,115, 97,109,101, 32,116,104,114,101,101, 32,111,118,101,114, 32, 97, + 110,100, 32,111,118,101,114, 32, 97,103, 97,105,110, 32,115,111, 32,111, + 110,108,121, 32, 34, 69,120,112,101,114,116,115, 13, 10, 59, 79,110,108, + 121, 34, 32,103, 97,109,101, 32,115,116, 97,121,115, 32,116,104,101, 32, + 115, 97,109,101, 46, 13, 10,115,117,112,101,114,116,114, 50, 58, 13, 10, + 48, 58, 52, 56, 57, 49, 58, 50, 48, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,103,111,108,108,121, 33, 32,103,104, + 111,115,116, 33, 40, 66,121, 32, 70,105,114,101, 98,114, 97,110,100, 41, + 40,117,110, 97, 98,108,101, 32,116,111, 32,116,101,115,116, 32,112,114, + 111,112,101,114,108,121, 32,100,117,101, 32,116,111, 32,108, 97, 99,107, + 32,111,102, 13, 10, 59,115,105,103,104,116, 32,109,111,118,101,109,101, + 110,116, 32,111,110, 32,115, 99,114,101,101,110, 41, 13, 10,103,111,108, + 108,121,103,104,111, 58, 13, 10, 48, 58, 49, 48, 51, 49, 50, 69, 58, 49, + 52, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10,119,105,122,100,102,105, + 114,101, 58, 13, 10,119,105,122,100,102,105,114,101,117, 58, 13, 10,100, + 97,114,107,115,101, 97,108, 50, 58, 13, 10, 48, 58,102,100, 99, 48, 51, + 52, 58, 50, 56, 58, 48, 98, 58, 48, 48, 13, 10, 48, 58,102,100, 99, 48, + 53, 57, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,109,117,116, 97,110,116, 32,102,105,103,104,116,101, + 114, 32, 40,119,111,114,108,100, 32,114,101,118, 32, 52, 32,101,109, 45, + 53, 41, 13, 10,109,117,116, 97,110,116,102, 58, 13, 10,100,101, 97,116, + 104, 98,114,100, 58, 13, 10,109,117,116, 97,110,116,102, 51, 58, 13, 10, + 109,117,116, 97,110,116,102, 52, 58, 13, 10,109,117,116, 97,110,116,102, + 50, 58, 13, 10, 48, 58, 49, 48, 48, 48,102, 99, 58, 51, 50, 58, 48, 49, + 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 49, 50, 99, 58, 49, 58, 48, 49, + 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,101, + 114,101,115,116,114,111,105,107, 97, 32,103,105,114,108,115, 32, 40,106, + 97,112, 97,110, 41, 13, 10,112,101,114,101,115,116,114,111, 58, 13, 10, + 112,101,114,101,115,116,114,111,102, 58, 13, 10, 48, 58,102, 52, 99, 48, + 58, 50, 56, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58,102, 56,102, 49, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,116,104,101, 32, 99,108,105,102,102,104, 97,110,103,101,114, 32, + 45, 32,101,100,119, 97,114,100, 32,114, 97,110,100,121, 32, 40,119,111, + 114,108,100, 32,114,101,118,105,115,105,111,110, 32, 50, 41, 41, 13, 10, + 101,100,114, 97,110,100,121, 58, 13, 10,101,100,114, 97,110,100,121,106, + 58, 13, 10,101,100,114, 97,110,100,121, 49, 58, 13, 10,101,100,114, 97, + 110,100,121, 50, 58, 13, 10, 48, 58, 49, 57, 52, 48, 56, 48, 58, 56, 48, + 58, 52,100, 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 98,116,105,109,101, 46, 99, 13, 10, 98,110,106, 58, 13, 10, 98,114, + 117, 98, 98,101,114, 58, 13, 10, 98,110,106,109, 58, 13, 10, 48, 58, 48, + 48, 48, 97, 58, 51, 58, 49, 50, 58, 48, 49, 13, 10, 48, 58, 53, 48, 48, + 58, 50, 54, 99, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 54, 52, 48, 58, + 49, 58, 52,100, 58, 52,100, 13, 10, 13, 10,116,117, 98,101,112, 58, 13, + 10, 48, 58, 97, 48, 98, 54, 58, 50, 52, 48, 58, 97, 56, 58, 52,100, 13, + 10, 48, 58, 97, 48, 57, 50, 58, 51, 58, 97, 56, 58, 48, 48, 13, 10, 13, + 10,116,117, 98,101,112, 98, 58, 13, 10, 48, 58, 97, 48, 57, 53, 58, 50, + 52, 48, 58, 97, 56, 58, 52,100, 13, 10, 48, 58, 97, 48, 56, 48, 58, 51, + 58, 97, 56, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40, 98,108,117,101,115, 32,106, - 111,117,114,110,101,121, 41, 10, 98,106,111,117,114,110,101,121, 58, 10, - 48, 58, 49, 48, 51, 51, 56, 49, 58, 52, 57, 58, 48, 53, 58, 48, 53, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,109,101,103, 97, 32,116,119,105, - 110,115, 32, 91,117,112,100, 97,116,101,100, 93, 41, 10,109,116,119,105, - 110,115, 58, 10, 99,104,105,107,105,106, 58, 32, 10, 48, 58,102,102, 49, - 50, 99, 56, 58, 49, 57, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, - 57, 49, 54, 56, 58, 50, 56, 58, 48, 50, 58, 53, 98, 10, 48, 58,102,102, - 101, 48, 48, 54, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, + 111,117,114,110,101,121, 41, 13, 10, 98,106,111,117,114,110,101,121, 58, + 13, 10, 48, 58, 49, 48, 51, 51, 56, 49, 58, 52, 57, 58, 48, 53, 58, 48, + 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,109,101,103, 97, + 32,116,119,105,110,115, 32, 91,117,112,100, 97,116,101,100, 93, 41, 13, + 10,109,116,119,105,110,115, 58, 13, 10, 99,104,105,107,105,106, 58, 13, + 10, 48, 58,102,102, 49, 50, 99, 56, 58, 49, 57, 48, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,102,102, 57, 49, 54, 56, 58, 50, 56, 58, 48, 50, 58, + 53, 98, 13, 10, 48, 58,102,102,101, 48, 48, 54, 58, 48, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, + 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 54, + 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, + 32, 98,121, 32,108,101,101,122,101,114, 47,103,101,111,109, 97,110, 47, + 111,116,104,101,114,115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32,117, - 110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114, - 101, 95,118, 55, 46, 57, 54, 32, 97,100,100,105,116,105,111,110,115, 32, - 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 47, - 103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 42, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 10, 10,116,109,110,116, 50, 58, 10,116, - 109,110,116, 50, 97, 58, 10,116,109,104,116, 50, 50,112,101, 58, 10,116, - 109,110,116, 50, 50,112,117, 58, 10, 48, 58, 49, 48, 55, 54, 48, 48, 58, - 49, 52, 58, 48, 51, 58, 48, 49, 10, 48, 58, 49, 48, 55, 54, 99, 56, 58, - 50, 55, 58, 52, 55, 58, 52, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 40,112, 45, 52, 55, 32, 97, 99,101,115, 41, 10,112, 52, 55, 97, 99,101, - 115, 58, 10, 48, 58,102,101,101, 49, 98, 48, 52, 99, 58, 55, 56, 58, 49, - 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,109,111,117, - 115,101,114, 47,109,111,117,115,101,114, 32, 40, 99,111,115,109,111,115, - 41, 41, 10,109,111,117,115,101,114, 58, 10,109,111,117,115,101,114, 99, - 58, 10, 48, 58, 54, 49, 48, 55, 58, 97, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 54, 48, 98, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, - 49, 97, 54, 58, 49, 58, 50, 51, 58, 50, 51, 10, 48, 58, 57, 50, 52, 49, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, 48, 55, 58, - 48, 55, 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 48, 56, 58, 48, 56, 10, - 48, 58, 57, 49, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, - 49, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 40, 98,105,114,100,121, 32,116,114,121, 32, 40,106, 97,112, - 97,110, 41, 41, 10, 98,105,114,100,116,114,121, 58, 10, 48, 58,102,102, - 56, 53, 51, 48, 58, 51, 49, 97, 58, 48, 49, 58, 52, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 40,102, 49, 32,101,120,104, 97,117,115,116, 32, - 110,111,116,101, 41, 10, 59, 42, 42, 32,110,101,101,100,115, 32,116,101, - 115,116,105,110,103, 32, 45, 32, 99, 97,110, 32, 97,110,121,111,110,101, - 32,118,101,114,105,102,121, 32,116,104,105,115, 32,103, 97,109,101, 32, - 115, 97,118,101,115, 32,104,105,115, 99,111,114,101,115, 32, 63, 63, 32, - 42, 42, 10,102, 49,101,110, 58, 10,102, 49,101,110,117, 58, 10,102, 49, - 101,110,106, 58, 10, 48, 58, 50, 48,102, 50, 48,101, 58, 51, 56, 58, 52, - 50, 58, 48, 50, 10, 10, 59,109, 97,114,115, 32,109, 97,116,114,105,120, - 32, 40,117,115, 97, 47,106, 97,112, 97,110, 41, 40, 98,121, 32,116, 97, - 109,112,104, 97,120, 41, 10,109,109, 97,116,114,105,120, 58, 10,109,109, - 97,116,114,105,120,106, 58, 10,109,109, 97,116,114,105,120,100, 58, 10, - 48, 58,102,102, 48, 49, 48, 52, 58, 49, 52, 48, 58, 52, 51, 58, 48, 48, - 10, 48, 58,102,102, 52, 57, 56, 56, 58, 54, 58, 48, 48, 58, 57, 48, 10, - 10, 59,122,111,109, 98,105,101, 32,114, 97,105,100, 32, 40, 98,121, 32, - 116, 97,109,112,104, 97,120, 41, 10,122,111,109, 98,114, 97,105,100, 58, - 10,122,111,109, 98,114, 97,105,100,112, 58, 10,122,111,109, 98,114, 97, - 105,100,112,106, 58, 10, 48, 58, 50, 48, 99, 97, 98, 99, 58, 53, 48, 58, - 52,102, 58, 48, 48, 10, 10, 59,115,116,114,101,101,116, 32,102,105,103, - 104,116,101,114, 32, 50, 32, 40, 85, 83, 32, 57, 49, 48, 51, 49, 56, 41, - 40, 99,108,111,110,101, 41, 40, 98,121, 32,116, 97,109,112,104, 97,120, - 41, 10,115,102, 50,117,100, 58, 10, 48, 58,102,102,100, 50, 56, 97, 58, - 51, 48, 58, 48, 48, 58, 50, 48, 10, 48, 58,102,102,100, 51, 48, 50, 58, - 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59,119,105,108,108,111,119, 32, - 40,106, 97,112, 97,110, 44, 32,101,110,103,108,105,115,104, 41, 40, 99, - 108,111,110,101, 41, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10, - 119,105,108,108,111,119,111, 58, 10,119,105,108,108,111,119,117,111, 58, - 10, 48, 58,102,102,101,102, 99, 54, 58, 53, 48, 58, 48, 48, 58, 50, 48, - 10, 48, 58,102,102,102, 48, 51,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, - 10, 10,119,105,108,108,111,119, 58, 10,119,105,108,108,111,119,106, 58, - 10,119,105,108,108,111,119,117, 58, 32, 10, 48, 58,102,102,101,102, 99, - 54, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, 48, 58,102,102,102, 48, 51, - 101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 10, 59,115,112,105,100, - 101,114,109, 97,110, 32, 40,117,115, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,112, - 105,100,101,121, 58, 10,115,112,105,100,101,121,106, 58, 10, 48, 58, 50, - 48, 56, 99, 48, 48, 58, 56, 48, 58, 97, 48, 58, 48, 48, 10, 10, 59,112, - 101,114,102,101, 99,116, 32, 98,105,108,108,105, 97,114,100,115, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10,112, 98,105,108,108,114,100, - 58, 10,112, 98,105,108,108,114,100,115, 58, 10,112, 98,105,108,108,114, - 100,115, 97, 58, 10, 48, 58, 99, 57, 52, 48, 58, 65, 48, 58, 48, 48, 58, - 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 40,101,110,102,111,114, 99, - 101, 32, 40,106, 97,112, 97,110, 41, 41, 10,101,110,102,111,114, 99,101, - 58, 10,101,110,102,111,114, 99,101,106, 58, 10,101,110,102,111,114, 99, - 101,106, 97, 58, 10, 48, 58, 49, 48, 50, 54,102, 99, 58, 52, 58, 48, 48, - 58, 97, 48, 10, 10, 59,109, 97,110,105, 97, 99, 32,115,113,117, 97,114, - 101, 32, 40,117,110,112,114,111,116,101, 99,116,101,100, 41, 40, 98,121, - 32,116, 97,109,112,104, 97,120, 41, 10,109, 97,110,105, 97, 99,115,113, - 58, 10,109, 97,110,105, 97, 99,115,113, 97, 58, 10, 48, 58,102,101, 57, - 56, 50, 99, 58, 52, 56, 58, 53, 48, 58, 48, 48, 10, 10, 59,109, 97,110, - 105, 97, 99, 32,115,113,117, 97,114,101, 32, 40,112,114,111,116,111,116, - 121,112,101, 41, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10,109, - 97,110,105, 97, 99,115,112, 58, 10, 48, 58,102,102, 55, 49, 51,101, 58, - 54, 52, 58, 53, 48, 58, 48, 48, 10, 10, 59,108,105, 98,101,114, 97,116, - 105,111,110, 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10,108, - 105, 98,101,114, 97,116,101, 58, 10,100,117, 97,108, 97,115,108,116, 58, - 10,108,105, 98,101,114, 97,116,101, 98, 58, 10, 48, 58, 52, 49, 58, 51, - 58, 48, 53, 58, 48, 48, 10, 48, 58, 54, 51, 48, 52, 58, 54,101, 58, 50, - 48, 58, 54, 48, 10, 10, 59, 83, 70, 45, 88, 32, 40, 98,121, 32,116, 97, - 109,112,104, 97,120, 41, 10,115,102,120, 58, 10, 48, 58, 52, 48, 97, 56, - 58, 51, 58, 48, 48, 58, 48, 50, 10, 48, 58, 52, 53, 52, 48, 58, 49,101, - 58, 48, 48, 58, 49, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,103, - 117,109, 98,111, 41, 10, 59, 42, 42, 32,116,104,105,115, 32,104,105,115, - 99,111,114,101, 32,115,101,101,109,115, 32, 98,114,111,107,101,110, 44, - 32,116,104,105,110,107, 32,105,116,115, 32, 97, 32,100,114,105,118,101, - 114, 32,112,114,111, 98,108,101,109, 32, 42, 42, 10,103,117,109, 98,111, - 58, 10,109,115,112,117,122,122,108,101,103, 58, 10, 48, 58, 56, 48, 48, - 48, 48, 58, 51, 48, 58, 52, 98, 58, 53, 48, 10, 48, 58, 56, 49, 53,100, - 50, 58, 49, 50, 58, 48, 98, 58, 48, 97, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 40, 70, 45, 49, 32,103,114, 97,110,100, 32,112,114,105,120, 32, - 112, 97,114,116, 32, 73, 73, 41, 10,102, 49,103,112, 50, 58, 10, 48, 58, - 102,102, 57, 49, 99, 50, 58, 50,101,101, 58, 49, 52, 58, 53, 48, 10, 48, - 58,102,102, 97, 54, 49, 55, 58, 51,102, 58, 53, 57, 58, 52, 57, 10, 10, - 59,103,117,110, 98, 97,114,105, 99,104, 32, 40, 98,121, 32,116, 97,109, - 112,104, 97,120, 41, 10,103,110, 98, 97,114,105, 99,104, 58, 10, 48, 58, - 54, 48, 55, 54, 56, 54, 52, 58, 97, 53, 58, 48, 48, 58, 48, 49, 10, 10, - 59,115,116,114,105,107,101,114,115, 32, 49, 57, 52, 53, 32, 73, 73, 73, - 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10,115, 49, 57, 52, - 53,105,105,105, 58, 10, 48, 58, 54, 48, 56, 51, 99, 56, 52, 58, 99, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 56, 51,100, 56, 48, 58, 52, - 54, 58, 48, 48, 58, 48, 50, 10, 10, 59,100,114, 97,103,111,110, 32, 98, - 108, 97,122,101, 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10, - 100,114, 97,103,110, 98,108,122, 58, 10, 48, 58, 54, 48, 56, 50, 52, 66, - 52, 58,100,100, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 56, 50, 53, - 100, 52, 58, 52,100, 58, 48, 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 40, 98, 97,110,103, 33, 41, 10, 98, 97,110,103, 58, 10, 48, - 58,102,101, 53, 97, 52, 99, 58,101,101, 58, 52, 49, 58, 48, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 40, 97,108,108,105,103, 97,116,111,114, - 32,104,117,110,116, 32, 40,117,110,112,114,111,116,101, 99,116,101,100, - 41, 41, 32, 32, 32, 10, 97,108,105,103, 97,116,111,114,117,110, 58, 10, - 48, 58,102,101, 53, 49,100, 97, 58, 50, 58, 52, 50, 58, 54, 56, 10, 48, - 58,102,101, 97,102, 48, 50, 58, 57, 56, 58, 52, 50, 58, 50,101, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 40, 98,111,111,109,101,114, 32,114, 97, - 110,103, 96,114, 32, 47, 32,103,101,110,101,115,105,115, 41, 10, 59, 42, - 42, 32,121,111,117, 32,109,117,115,116, 32,108,101,116, 32,116,104,105, - 115, 32,103, 97,109,101, 32,100,105,115,112,108, 97,121, 32,116,104,101, - 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32, 98,101,102, - 111,114,101, 32,115,116, 97,114,116,105,110,103, 32,103, 97,109,101, 32, - 97,110,100, 32, 42, 42, 10, 59, 42, 42, 32,116,104,105,115, 32,103, 97, - 109,101, 32,111,110,108,121, 32,115, 97,118,101,115, 32,112,114,111,112, - 101,114,108,121, 32,105,102, 32,121,111,117, 32,101,120,105,116, 32,116, - 104,101, 32,103, 97,109,101, 32,119,104,101,110, 32,116,104,101, 32,104, - 105,115, 99,111,114,101, 32,105,115, 32,115, 99,114,111,108,108,105,110, - 103, 32, 42, 42, 10, 59, 42, 42, 32,117,112, 32,116,104,101, 32,115, 99, - 114,101,101,110, 32,100,117,114,105,110,103, 32, 97,116,116,114, 97, 99, - 116, 32,109,111,100,101, 44, 32,121,111,117, 32,104, 97,118,101, 32,116, - 111, 32, 98,101, 32,113,117,105, 99,107, 44, 32,121,111,117, 32,111,110, - 108,121, 32,103,101,116, 32, 97, 98,111,117,116, 32, 52, 45, 53, 32,115, - 101, 99,111,110,100,115, 32, 42, 42, 10, 59, 42, 42, 32,116,111, 32,100, - 111, 32,116,104,105,115, 46, 46, 46, 42, 42, 10, 98,111,111,109,114, 97, - 110,103, 58, 10, 98,111,111,109,114, 97,110, 97, 58, 10, 48, 58, 49, 48, - 58, 51, 58, 48, 55, 58, 48, 48, 10, 48, 58, 54, 50, 97, 50, 58, 51,102, - 58, 48, 55, 58, 56, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,112, - 101,110,103,117,105,110, 32, 98,114,111,116,104,101,114,115, 32, 40,106, - 97,112, 97,110, 41, 41, 10,112,101,110, 98,114,111,115, 58, 10, 48, 58, - 50, 48, 48, 48, 53, 48, 58, 54, 51, 58, 48, 48, 58, 52, 97, 10, 10, 59, - 68,105,109, 97,104,111,111, 47, 71,114,101, 97,116, 32, 77, 97,104,111, - 117, 32, 68, 97,105,115, 97,107,117,115,101,110, 32, 40, 98,121, 32,116, - 97,109,112,104, 97,120, 41, 10,100,105,109, 97,104,111,111, 58, 10,103, - 109, 97,104,111,117, 58, 10,100,105,109, 97,104,111,111,117, 58, 10,100, - 105,109, 97,104,111,117,100, 58, 10, 48, 58, 57, 50, 56, 53, 56, 54, 58, - 51, 67, 58, 48, 48, 58, 52, 48, 10, 10, 59, 40,100,114, 97,103,111,110, - 98, 97,108,108, 32,122, 32, 50, 32,115,117,112,101,114, 32, 98, 97,116, - 116,108,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,100, - 98,122, 50, 58, 10, 48, 58, 52, 56, 55, 55, 50, 97, 58, 50, 58, 48, 48, - 58, 48, 50, 10, 48, 58, 52, 56, 55, 55, 50, 99, 58, 50, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 40,103,114, 97,116,105, 97, - 32, 45, 32,115,101, 99,111,110,100, 32,101, 97,114,116,104, 41, 10,103, - 114, 97,116,105, 97, 58, 10,103,114, 97,116,105, 97, 97, 58, 10, 48, 58, - 102,101,101, 49, 98, 99, 50, 99, 58, 97, 48, 58, 99, 56, 58, 52, 51, 10, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 10, 13, 10,116,109,110,116, 50, 58, 13, 10,116,109,110,116, + 50, 97, 58, 13, 10,116,109,104,116, 50, 50,112,101, 58, 13, 10,116,109, + 110,116, 50, 50,112,117, 58, 13, 10, 48, 58, 49, 48, 55, 54, 48, 48, 58, + 49, 52, 58, 48, 51, 58, 48, 49, 13, 10, 48, 58, 49, 48, 55, 54, 99, 56, + 58, 50, 55, 58, 52, 55, 58, 52, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 40,112, 45, 52, 55, 32, 97, 99,101,115, 41, 13, 10,112, 52, + 55, 97, 99,101,115, 58, 13, 10, 48, 58,102,101,101, 49, 98, 48, 52, 99, + 58, 55, 56, 58, 49, 48, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 40,109,111,117,115,101,114, 47,109,111,117,115,101,114, 32, + 40, 99,111,115,109,111,115, 41, 41, 13, 10,109,111,117,115,101,114, 58, + 13, 10,109,111,117,115,101,114, 99, 58, 13, 10, 48, 58, 54, 49, 48, 55, + 58, 97, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 98, 56, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 49, 97, 54, 58, 49, 58, + 50, 51, 58, 50, 51, 13, 10, 48, 58, 57, 50, 52, 49, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, 48, 55, 58, 48, 55, 13, + 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, 48, + 58, 57, 49, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, + 49, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 40, 98,105,114,100,121, 32,116,114,121, 32, 40,106, + 97,112, 97,110, 41, 41, 13, 10, 98,105,114,100,116,114,121, 58, 13, 10, + 48, 58,102,102, 56, 53, 51, 48, 58, 51, 49, 97, 58, 48, 49, 58, 52, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,102, 49, 32,101,120, + 104, 97,117,115,116, 32,110,111,116,101, 41, 13, 10, 59, 42, 42, 32,110, + 101,101,100,115, 32,116,101,115,116,105,110,103, 32, 45, 32, 99, 97,110, + 32, 97,110,121,111,110,101, 32,118,101,114,105,102,121, 32,116,104,105, + 115, 32,103, 97,109,101, 32,115, 97,118,101,115, 32,104,105,115, 99,111, + 114,101,115, 32, 63, 63, 32, 42, 42, 13, 10,102, 49,101,110, 58, 13, 10, + 102, 49,101,110,117, 58, 13, 10,102, 49,101,110,106, 58, 13, 10, 48, 58, + 50, 48,102, 50, 48,101, 58, 51, 56, 58, 52, 50, 58, 48, 50, 13, 10, 13, + 10, 59,109, 97,114,115, 32,109, 97,116,114,105,120, 32, 40,117,115, 97, + 47,106, 97,112, 97,110, 41, 40, 98,121, 32,116, 97,109,112,104, 97,120, + 41, 13, 10,109,109, 97,116,114,105,120, 58, 13, 10,109,109, 97,116,114, + 105,120,106, 58, 13, 10,109,109, 97,116,114,105,120,100, 58, 13, 10, 48, + 58,102,102, 48, 49, 48, 52, 58, 49, 52, 48, 58, 52, 51, 58, 48, 48, 13, + 10, 48, 58,102,102, 52, 57, 56, 56, 58, 54, 58, 48, 48, 58, 57, 48, 13, + 10, 13, 10, 59,122,111,109, 98,105,101, 32,114, 97,105,100, 32, 40, 98, + 121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,122,111,109, 98,114, 97, + 105,100, 58, 13, 10,122,111,109, 98,114, 97,105,100,112, 58, 13, 10,122, + 111,109, 98,114, 97,105,100,112,106, 58, 13, 10, 48, 58, 50, 48, 99, 97, + 98, 99, 58, 53, 48, 58, 52,102, 58, 48, 48, 13, 10, 13, 10, 59,115,116, + 114,101,101,116, 32,102,105,103,104,116,101,114, 32, 50, 32, 40, 85, 83, + 32, 57, 49, 48, 51, 49, 56, 41, 40, 99,108,111,110,101, 41, 40, 98,121, + 32,116, 97,109,112,104, 97,120, 41, 13, 10,115,102, 50,117,100, 58, 13, + 10, 48, 58,102,102,100, 50, 56, 97, 58, 51, 48, 58, 48, 48, 58, 50, 48, + 13, 10, 48, 58,102,102,100, 51, 48, 50, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59,119,105,108,108,111,119, 32, 40,106, 97,112, 97, + 110, 44, 32,101,110,103,108,105,115,104, 41, 40, 99,108,111,110,101, 41, + 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,119,105,108,108, + 111,119,111, 58, 13, 10,119,105,108,108,111,119,117,111, 58, 13, 10, 48, + 58,102,102,101,102, 99, 54, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, + 48, 58,102,102,102, 48, 51,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,119,105,108,108,111,119, 58, 13, 10,119,105,108,108,111,119, + 106, 58, 13, 10,119,105,108,108,111,119,117, 58, 13, 10, 48, 58,102,102, + 101,102, 99, 54, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,102, + 102,102, 48, 51,101, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 13, 10, 59,115,112,105,100,101,114,109, 97,110, 32, 40,117,115, 41, 32, + 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10,115,112,105,100,101,121, 58, 13, 10,115,112,105, + 100,101,121,106, 58, 13, 10, 48, 58, 50, 48, 56, 99, 48, 48, 58, 56, 48, + 58, 97, 48, 58, 48, 48, 13, 10, 13, 10, 59,112,101,114,102,101, 99,116, + 32, 98,105,108,108,105, 97,114,100,115, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10,112, 98,105,108,108,114,100, 58, 13, 10,112, 98, + 105,108,108,114,100,115, 58, 13, 10,112, 98,105,108,108,114,100,115, 97, + 58, 13, 10, 48, 58, 99, 57, 52, 48, 58, 65, 48, 58, 48, 48, 58, 52, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,101,110,102,111,114, 99, + 101, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,101,110,102,111,114, 99, + 101, 58, 13, 10,101,110,102,111,114, 99,101,106, 58, 13, 10,101,110,102, + 111,114, 99,101,106, 97, 58, 13, 10, 48, 58, 49, 48, 50, 54,102, 99, 58, + 52, 58, 48, 48, 58, 97, 48, 13, 10, 13, 10, 59,109, 97,110,105, 97, 99, + 32,115,113,117, 97,114,101, 32, 40,117,110,112,114,111,116,101, 99,116, + 101,100, 41, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,109, + 97,110,105, 97, 99,115,113, 58, 13, 10,109, 97,110,105, 97, 99,115,113, + 97, 58, 13, 10, 48, 58,102,101, 57, 56, 50, 99, 58, 52, 56, 58, 53, 48, + 58, 48, 48, 13, 10, 13, 10, 59,109, 97,110,105, 97, 99, 32,115,113,117, + 97,114,101, 32, 40,112,114,111,116,111,116,121,112,101, 41, 40, 98,121, + 32,116, 97,109,112,104, 97,120, 41, 13, 10,109, 97,110,105, 97, 99,115, + 112, 58, 13, 10, 48, 58,102,102, 55, 49, 51,101, 58, 54, 52, 58, 53, 48, + 58, 48, 48, 13, 10, 13, 10, 59,108,105, 98,101,114, 97,116,105,111,110, + 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,108,105, 98, + 101,114, 97,116,101, 58, 13, 10,100,117, 97,108, 97,115,108,116, 58, 13, + 10,108,105, 98,101,114, 97,116,101, 98, 58, 13, 10, 48, 58, 52, 49, 58, + 51, 58, 48, 53, 58, 48, 48, 13, 10, 48, 58, 54, 51, 48, 52, 58, 54,101, + 58, 50, 48, 58, 54, 48, 13, 10, 13, 10, 59, 83, 70, 45, 88, 32, 40, 98, + 121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,115,102,120, 58, 13, 10, + 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58, + 52, 53, 52, 48, 58, 49,101, 58, 48, 48, 58, 49, 53, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 40,103,117,109, 98,111, 41, 13, 10, 59, 42, + 42, 32,116,104,105,115, 32,104,105,115, 99,111,114,101, 32,115,101,101, + 109,115, 32, 98,114,111,107,101,110, 44, 32,116,104,105,110,107, 32,105, + 116,115, 32, 97, 32,100,114,105,118,101,114, 32,112,114,111, 98,108,101, + 109, 32, 42, 42, 13, 10,103,117,109, 98,111, 58, 13, 10,109,115,112,117, + 122,122,108,101,103, 58, 13, 10, 48, 58, 56, 48, 48, 48, 48, 58, 51, 48, + 58, 52, 98, 58, 53, 48, 13, 10, 48, 58, 56, 49, 53,100, 50, 58, 49, 50, + 58, 48, 98, 58, 48, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 40, 70, 45, 49, 32,103,114, 97,110,100, 32,112,114,105,120, 32,112, 97, + 114,116, 32, 73, 73, 41, 13, 10,102, 49,103,112, 50, 58, 13, 10, 48, 58, + 102,102, 57, 49, 99, 50, 58, 50,101,101, 58, 49, 52, 58, 53, 48, 13, 10, + 48, 58,102,102, 97, 54, 49, 55, 58, 51,102, 58, 53, 57, 58, 52, 57, 13, + 10, 13, 10, 59,103,117,110, 98, 97,114,105, 99,104, 32, 40, 98,121, 32, + 116, 97,109,112,104, 97,120, 41, 13, 10,103,110, 98, 97,114,105, 99,104, + 58, 13, 10, 48, 58, 54, 48, 55, 54, 56, 54, 52, 58, 97, 53, 58, 48, 48, + 58, 48, 49, 13, 10, 13, 10, 59,115,116,114,105,107,101,114,115, 32, 49, + 57, 52, 53, 32, 73, 73, 73, 32, 40, 98,121, 32,116, 97,109,112,104, 97, + 120, 41, 13, 10,115, 49, 57, 52, 53,105,105,105, 58, 13, 10, 48, 58, 54, + 48, 56, 51, 99, 56, 52, 58, 99, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 54, 48, 56, 51,100, 56, 48, 58, 52, 54, 58, 48, 48, 58, 48, 50, 13, + 10, 13, 10, 59,100,114, 97,103,111,110, 32, 98,108, 97,122,101, 32, 40, + 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, 10,100,114, 97,103,110, + 98,108,122, 58, 13, 10, 48, 58, 54, 48, 56, 50, 52, 66, 52, 58,100,100, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 56, 50, 53,100, 52, 58, + 52,100, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 40, 98, 97,110,103, 33, 41, 13, 10, 98, 97,110,103, 58, 13, 10, + 48, 58,102,101, 53, 97, 52, 99, 58,101,101, 58, 52, 49, 58, 48, 49, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 97,108,108,105,103, 97, + 116,111,114, 32,104,117,110,116, 32, 40,117,110,112,114,111,116,101, 99, + 116,101,100, 41, 41, 13, 10, 97,108,105,103, 97,116,111,114,117,110, 58, + 13, 10, 48, 58,102,101, 53, 49,100, 97, 58, 50, 58, 52, 50, 58, 54, 56, + 13, 10, 48, 58,102,101, 97,102, 48, 50, 58, 57, 56, 58, 52, 50, 58, 50, + 101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 98,111,111,109, + 101,114, 32,114, 97,110,103, 96,114, 32, 47, 32,103,101,110,101,115,105, + 115, 41, 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,108, + 101,116, 32,116,104,105,115, 32,103, 97,109,101, 32,100,105,115,112,108, + 97,121, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116, 97, 98, + 108,101, 32, 98,101,102,111,114,101, 32,115,116, 97,114,116,105,110,103, + 32,103, 97,109,101, 32, 97,110,100, 32, 42, 42, 13, 10, 59, 42, 42, 32, + 116,104,105,115, 32,103, 97,109,101, 32,111,110,108,121, 32,115, 97,118, + 101,115, 32,112,114,111,112,101,114,108,121, 32,105,102, 32,121,111,117, + 32,101,120,105,116, 32,116,104,101, 32,103, 97,109,101, 32,119,104,101, + 110, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,105,115, 32,115, + 99,114,111,108,108,105,110,103, 32, 42, 42, 13, 10, 59, 42, 42, 32,117, + 112, 32,116,104,101, 32,115, 99,114,101,101,110, 32,100,117,114,105,110, + 103, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 44, 32,121,111, + 117, 32,104, 97,118,101, 32,116,111, 32, 98,101, 32,113,117,105, 99,107, + 44, 32,121,111,117, 32,111,110,108,121, 32,103,101,116, 32, 97, 98,111, + 117,116, 32, 52, 45, 53, 32,115,101, 99,111,110,100,115, 32, 42, 42, 13, + 10, 59, 42, 42, 32,116,111, 32,100,111, 32,116,104,105,115, 46, 46, 46, + 42, 42, 13, 10, 98,111,111,109,114, 97,110,103, 58, 13, 10, 98,111,111, + 109,114, 97,110, 97, 58, 13, 10, 48, 58, 49, 48, 58, 51, 58, 48, 55, 58, + 48, 48, 13, 10, 48, 58, 54, 50, 97, 50, 58, 51,102, 58, 48, 55, 58, 56, + 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,112,101,110,103, + 117,105,110, 32, 98,114,111,116,104,101,114,115, 32, 40,106, 97,112, 97, + 110, 41, 41, 13, 10,112,101,110, 98,114,111,115, 58, 13, 10, 48, 58, 50, + 48, 48, 48, 53, 48, 58, 54, 51, 58, 48, 48, 58, 52, 97, 13, 10, 13, 10, + 59, 68,105,109, 97,104,111,111, 47, 71,114,101, 97,116, 32, 77, 97,104, + 111,117, 32, 68, 97,105,115, 97,107,117,115,101,110, 32, 40, 98,121, 32, + 116, 97,109,112,104, 97,120, 41, 13, 10,100,105,109, 97,104,111,111, 58, + 13, 10,103,109, 97,104,111,117, 58, 13, 10,100,105,109, 97,104,111,111, + 117, 58, 13, 10,100,105,109, 97,104,111,117,100, 58, 13, 10, 48, 58, 57, + 50, 56, 53, 56, 54, 58, 51, 67, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, + 59, 40,100,114, 97,103,111,110, 98, 97,108,108, 32,122, 32, 50, 32,115, + 117,112,101,114, 32, 98, 97,116,116,108,101, 41, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 13, 10,100, 98,122, 50, 58, 13, 10, 48, 58, 52, + 56, 55, 55, 50, 97, 58, 50, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58, 52, + 56, 55, 55, 50, 99, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 40,103,114, 97,116,105, 97, 32, 45, 32,115,101, + 99,111,110,100, 32,101, 97,114,116,104, 41, 13, 10,103,114, 97,116,105, + 97, 58, 13, 10,103,114, 97,116,105, 97, 97, 58, 13, 10, 48, 58,102,101, + 101, 49, 98, 99, 50, 99, 58, 97, 48, 58, 99, 56, 58, 52, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,100,101,115,101,114,116, 32,119, 97, - 114, 41, 10,100,101,115,101,114,116,119,114, 58, 10, 48, 58,102,101,101, - 49, 98, 48, 50, 56, 58,101, 98, 58, 57, 52, 58, 50, 52, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 40,116,101,116,114,105,115, 32,112,108,117,115, 41, - 10,116,101,116,114,105,115,112, 58, 10, 48, 58,102,101,101, 49, 56, 52, - 97, 48, 58, 49, 51, 53, 58, 49, 48, 58, 49,101, 10, 48, 58,102,101,101, - 48, 48, 48, 49, 48, 58, 51, 49,101, 58, 53, 97, 58,101, 97, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 40,116,104,101, 32,104,105,115,116,111,114,121, - 32,111,102, 32,109, 97,114,116,105, 97,108, 32, 97,114,116,115, 41, 10, - 104,105,115,116,114,121,109, 97, 58, 10, 48, 58,101, 48, 50, 98,101, 48, - 58, 50, 56, 58, 52, 49, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 40,112,117,122,122, 32,108,111,111,112, 32, 40,101,117,114,111,112,101, - 41, 41, 10,112,117,122,122,108,111,111,112,101, 58, 10,112,117,122,122, - 108,111,111,112, 58, 10, 48, 58, 54, 48, 57, 56, 53, 97, 99, 58, 52, 49, - 58, 48, 48, 58, 51, 49, 10, 48, 58, 54, 48, 57, 56, 54,100, 52, 58, 52, - 49, 58, 48, 48, 58, 51, 48, 10, 10,112,117,122,122,108,111,111,112, 97, - 58, 10, 48, 58, 54, 48, 57, 99, 52, 98, 56, 58, 52, 49, 58, 48, 48, 58, - 51, 49, 10, 48, 58, 54, 48, 57, 99, 53,101, 48, 58, 52, 49, 58, 48, 48, - 58, 51, 48, 10, 10,112,117,122,122,108,111,111,112,106, 58, 10, 48, 58, - 54, 48, 57,100, 49, 97, 56, 58, 52, 49, 58, 48, 48, 58, 51, 48, 10, 48, - 58, 54, 48, 57,100, 48, 56, 48, 58, 52, 49, 58, 48, 48, 58, 51, 49, 10, - 10,112,117,122,122,108,111,111,112,107, 58, 10,112,117,122,122,108,111, - 111,112,117, 58, 10, 48, 58, 54, 48, 57, 99, 55, 48, 48, 58, 52, 49, 58, - 48, 48, 58, 51, 48, 10, 48, 58, 54, 48, 57, 99, 53,100, 56, 58, 52, 49, - 58, 48, 48, 58, 51, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, - 115,112,101,101,100, 32,115,112,105,110, 41, 10,115,112,101,101,100,115, - 112,110, 58, 10, 48, 58, 98, 48, 52, 99, 58, 54, 49, 58, 52, 97, 58, 50, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,107,121, 32,114, - 97,105,100,101,114, 41, 10,115,107,121,114, 97,105,100, 58, 10, 48, 58, - 97, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 40,115,101,110,103,101,107,105, 32,115,116,114,105,107,101,114, - 41, 10, 59, 42, 42, 32,116,104,101, 32,110,118,114, 97,109, 32,105,110, - 32,116,104,105,115, 32,103, 97,109,101, 32,105,115, 32, 97, 98,111,117, - 116, 32, 97,115, 32,114,101,108,105, 97, 98,108,101, 32, 97,115, 32,116, - 104,101, 32,101,110,103,108,105,115,104, 32, 99,114,105, 99,107,101,116, - 32,116,101, 97,109, 44, 32,104,101,110, 99,101, 32, 42, 42, 10, 59, 42, - 42, 32,116,104,101, 32,116,111,112, 32,115, 99,111,114,101, 32,105,115, - 32,115,111,109,101,116,105,109,101,115, 32,119,114,111,110,103, 46, 46, - 46, 46, 32, 98,117,116, 32,110,101,118,101,114,109,105,110,101, 32,101, - 104, 46, 46, 46, 63, 63, 32, 42, 42, 10, 59, 42, 42, 32,116,104,101, 32, - 116,111,100, 97,121,115, 32,116,111,112, 32,116,101,110, 32,104,105, 32, - 116, 97, 98,108,101, 32,115, 97,118,101,115, 32,102,105,110,101, 32,116, - 104,111,117,103,104, 46, 46, 46, 32, 42, 42, 10,115,101,110,103,101,107, - 105,115, 58, 10,115,101,110,103,101,107,105,115,106, 58, 10, 48, 58, 54, - 48, 98, 49,100,101, 56, 58, 55, 56, 58, 53, 51, 58, 48, 48, 10, 48, 58, - 54, 48, 98, 49,101, 52, 55, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 40,115,111,108,118, 97,108,111,117, 41, - 10,115,111,108,118, 97,108,111,117, 58, 10, 48, 58, 49, 48, 54, 54, 48, - 102, 58, 49, 49, 57, 58, 48, 48, 58, 48, 55, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 40,115, 46,115, 46,109,105,115,115,105,111,110, 41, 10, - 115,115,109,105,115,115,105,110, 58, 10, 48, 58, 98, 57, 49, 48, 48, 58, - 99, 48, 58, 48, 48, 58, 54,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 40,109,101,103, 97,100,111,110, 41, 10, 59, 42, 42, 32,111,110,108, - 121, 32,115, 97,118,101,115, 32,116,111,112, 32,115, 99,111,114,101, 32, - 63, 63, 63, 63, 32,100,111,110, 96,116, 32,107,110,111,119, 32,119,104, - 121, 32, 63, 63, 63, 63, 32, 97,110,121,111,110,101, 32,102,105,120, 32, - 116,104,105,115, 32, 63, 63, 32, 32, 42, 42, 10,109,101,103, 97,100,111, - 110, 58, 10, 48, 58, 55, 97, 48, 49, 58, 52, 56, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 55, 97, 54,101, 58, 50, 58, 48, 49, 58, 48, 48, 10, 48, 58, - 55, 56, 54, 50, 58, 49, 58,102, 52, 58,102, 52, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 40,108,101,103,105,111,110, 40,118,101,114, 32, 50, - 46, 48, 51, 32, 38, 32, 49, 46, 48, 53, 41, 41, 10,108,101,103,105,111, - 110, 58, 10, 48, 58, 54, 50,101, 56,101, 58, 50, 55, 58, 48, 48, 58, 50, - 57, 10, 48, 58, 54, 50,102,100,101, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 108,101,103,105,111,110,111, 58, 10,108,101,103,105,111,110,106, 98, 58, - 10,108,101,103,105,111,110,106, 58, 10, 48, 58, 54, 50,101, 56, 99, 58, - 50, 55, 58, 48, 48, 58, 50, 57, 10, 48, 58, 54, 50,102,100, 99, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, - 108,101,103,101,110,100, 41, 10,108,101,103,101,110,100, 58, 10,108,101, - 103,101,110,100, 98, 58, 10, 48, 58,101, 55, 48, 99, 58, 53,100, 58, 48, - 48, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,107,105, - 100, 32,110,111, 32,104,111,114,101, 32,104,111,114,101, 32,100, 97,105, - 115, 97,107,117,115,101,110, 41, 10,104,111,114,101,107,105,100, 58, 10, - 104,111,114,101,107,105,100, 98, 58, 10, 98,111,111, 98,104, 97, 99,107, - 58, 10, 48, 58, 52, 48, 50, 53, 97, 58, 50, 56, 58, 48, 48, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,105,112,109, 32,105,110, - 118, 97,100,101,114, 41, 10,105,112,109,105,110,118, 97,100, 58, 10, 48, - 58, 99, 48, 58, 97, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 40,103,111,108,100,101,110, 32,102,105,114,101, 32, 73, - 73, 41, 10,103,102,105,114,101, 50, 58, 10, 48, 58, 49, 48, 48, 51,100, - 58, 52, 53, 58, 52,102, 58, 52, 97, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 40, 98,101,115,116, 32, 98,111,117,116, 32, 98,111,120,105,110, - 103, 41, 10, 98, 98, 98,120,105,110,103, 58, 10, 48, 58,102,101,101, 48, - 102, 52, 53, 99, 58,100, 55, 58, 97, 48, 58, 53, 51, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 40, 97,108,112,104, 97, 32,102,105,103,104,116, - 101,114, 32, 47, 32,104,101, 97,100, 32,111,110, 41, 10, 97,108,112,104, - 97,104,111, 58, 10, 48, 58, 56, 55, 56, 97, 58,102, 58, 51, 48, 58, 51, - 48, 10, 48, 58,101, 52, 99, 98, 58, 99, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115, 97,109,117,114, 97,105, 32, - 97, 99,101,115, 32, 40,119,111,114,108,100, 41, 41, 10,115, 97,109,117, - 114, 97,105, 97, 58, 10, 48, 58,102,101, 55,100, 56, 48, 58, 57,101, 58, - 48, 48, 58, 48, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,102, - 108,111,119,101,114, 41, 10,102,108,111,119,101,114, 58, 10,102,108,111, - 119,101,114,115,106, 58, 10, 48, 58,100, 48, 54, 48, 58, 51, 55, 58, 48, - 48, 58, 50, 48, 10, 48, 58, 99, 48, 48,102, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 99, 48, 49, 48, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,102, 97,110, 99,121, 32,119,111, - 114,108,100, 32, 45, 32,101, 97,114,116,104, 32,111,102, 32, 99,114,105, - 115,105,115, 41, 10,102,110, 99,121,119,108,100, 58, 10, 48, 58,102,102, - 56, 51, 49, 49, 58, 97,101, 58, 48, 53, 58, 53, 54, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 40, 98,111,117,110, 99,105,110,103, 32, 98, 97, - 108,108,115, 41, 10, 98, 98, 97,108,108,115, 58, 10, 98, 98, 97,108,108, - 115, 97, 58, 10, 48, 58,102, 99, 54, 56, 56, 58, 51, 49, 58, 57, 48, 58, - 57, 48, 10, 48, 58,102, 99, 54, 56, 55, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 40,116,101,110,103, 97,105, 41, 32, 40, 98,121, 32,116, 97, - 109,112,104, 97,120, 41, 10,116,101,110,103, 97,105, 58, 10,116,101,110, - 103, 97,105,106, 58, 10, 48, 58,102,101, 52, 99, 98, 48, 58, 52, 56, 58, - 50,100, 58, 57, 56, 10, 10, 59, 40, 66,108, 97,122,101, 32, 79,110, 41, - 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 10, 98,108, 97,122, - 101,111,110, 58, 10, 48, 58, 51, 48, 52,102, 98, 48, 58, 55, 55, 58, 48, - 48, 58, 48,100, 10, 48, 58, 51, 48, 48, 50, 48, 99, 58, 56, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, 98,108, 97, - 110,100,105, 97, 41, 10, 98,108, 97,110,100,105, 97, 58, 10, 48, 58, 51, - 48, 49, 48, 57, 52, 58, 54, 50, 58, 48, 57, 58, 49, 55, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 40, 97,113,117, 97,114,105,117,109, 32, 40, - 106, 97,112, 97,110, 41, 41, 10, 97,113,117, 97,114,105,117,109, 58, 10, - 97,113,117, 97,114,105,117,109,106, 58, 10, 48, 58,102,102, 57, 48, 52, - 99, 58, 50, 56, 58, 52, 57, 58,101, 56, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 40,109, 97,115,107,101,100, 32,114,105,100,101,114,115, 32, - 99,108,117, 98, 32, 98, 97,116,116,108,101, 32,114, 97, 99,101, 41, 10, - 107, 97,109,101,110,114,105,100, 58, 10, 48, 58, 50, 48, 50,101, 57, 51, - 58, 57,102, 58, 48, 97, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 40,110, 46,121, 46, 32, 99, 97,112,116,111,114, 41, 10, 59, 42, - 42, 32,104,105,115, 99,111,114,101, 32,105,115, 32, 98,114,111,107,101, - 110, 32,105,110, 32,116,104,105,115, 32,103, 97,109,101, 44, 32,119,104, - 101,110, 32,104, 47,115, 99,111,114,101, 32,105,115, 32, 98,101, 97,116, - 101,110, 32,121,111,117, 32, 99, 97,110,110,111,116, 32,112,117,116, 32, - 121,111,117,114, 32,110, 97,109,101, 32,105,110, 32, 42, 42, 10, 59, 42, - 42, 32,116,104,101, 32,115, 99,111,114,101,115, 32,115, 97,118,101, 32, - 111,107, 32,116,104,111,117,103,104, 46, 46, 46, 32, 32, 42, 42, 10,110, - 121, 99, 97,112,116,111,114, 58, 10, 48, 58,101, 49,100, 97, 58, 50, 56, - 58, 48, 48, 58, 52,101, 10, 48, 58,101, 49, 56, 56, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,107,121, - 32,115,107,105,112,112,101,114, 41, 10,115,107,121,115,107,105,112,114, - 58, 10, 48, 58, 56, 49,102, 50, 58, 51, 58, 48, 49, 58, 48, 48, 10, 48, - 58, 56, 54, 49, 48, 58, 49,101, 58, 48, 49, 58, 49, 54, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 40,100,105,118,101,114, 32, 98,111,121, 41, - 10,100,105,118,101,114, 98,111,121, 58, 10, 48, 58, 52, 52, 55, 49, 53, - 58, 98, 49, 58, 51, 49, 58,101, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 40,110,111,115,116,114, 97,100, 97,109,117,115, 41, 10,110,111, - 115,116, 58, 10, 48, 58, 49, 48, 48, 51, 53, 48, 58, 50, 57, 58, 53, 57, - 58, 48, 48, 10, 48, 58, 49, 48, 48, 48, 49, 57, 58, 51, 58, 48, 49, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, 98,101, 97,109, - 32,105,110,118, 97,100,101,114, 41, 10, 98,101, 97,109,105,110,118, 58, - 10, 98,101, 97,109,105,110,118, 97, 58, 10,112, 97, 99,111,109,105,110, - 118, 58, 10, 48, 58, 49, 56, 51, 51, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 65,114,109,111,114,101,100, 32, 87, 97,114,114,105,111,114,115, - 40, 69,117,114,111,112,101, 47, 85, 83, 65, 41, 32, 40, 98,121, 32,116, - 97,109,112,104, 97,120, 41, 10, 97,114,109,119, 97,114, 58, 10, 97,114, - 109,119, 97,114,117, 58, 10, 97,114,109,119, 97,114, 97, 58, 10, 97,114, - 109,119, 97,114, 97,114, 49, 58, 10, 97,114,109,119, 97,114, 49,100, 58, - 10, 97,114,109,119, 97,114,114, 49, 58, 10, 97,114,109,119, 97,114,117, - 49, 58, 10,112,103,101, 97,114,114, 49, 58, 10,112,103,101, 97,114, 58, - 10, 48, 58,102,102, 50, 55,100, 54, 58, 50, 53, 54, 58, 48, 48, 58, 48, - 52, 32, 10, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,116,111, - 114,110, 97,100,111, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10, 99,116,111,114,110, 97,100,111, 58, 10, 48, 58, 50, 53, 58, 51, 58, - 48, 58, 48, 10, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,116, - 101,114,114, 97,110,101, 97,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10, 99,116,101,114,114, 97,110,105, 58, 10, 48, 58, 52, 52, - 58, 50, 58, 48, 58, 53, 48, 10, 48, 58, 52, 54, 58, 49, 58, 48, 58, 48, - 10, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,115,117,112,101, - 114, 32, 97,115,116,114,111, 32,102,105,103,104,116,101,114, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 99,115,117,112,101,114, 97, - 115, 58, 10, 48, 58, 52, 56, 48, 58, 49, 99, 58, 48, 58,102,102, 10, 48, - 58, 57, 56, 58, 50, 58, 48, 58, 48, 10, 10, 59, 40, 99, 97,115,115,101, + 114, 41, 13, 10,100,101,115,101,114,116,119,114, 58, 13, 10, 48, 58,102, + 101,101, 49, 98, 48, 50, 56, 58,101, 98, 58, 57, 52, 58, 50, 52, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,116,101,116,114,105,115, 32,112, + 108,117,115, 41, 13, 10,116,101,116,114,105,115,112, 58, 13, 10, 48, 58, + 102,101,101, 49, 56, 52, 97, 48, 58, 49, 51, 53, 58, 49, 48, 58, 49,101, + 13, 10, 48, 58,102,101,101, 48, 48, 48, 49, 48, 58, 51, 49,101, 58, 53, + 97, 58,101, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,116,104, + 101, 32,104,105,115,116,111,114,121, 32,111,102, 32,109, 97,114,116,105, + 97,108, 32, 97,114,116,115, 41, 13, 10,104,105,115,116,114,121,109, 97, + 58, 13, 10, 48, 58,101, 48, 50, 98,101, 48, 58, 50, 56, 58, 52, 49, 58, + 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,112,117,122,122, + 32,108,111,111,112, 32, 40,101,117,114,111,112,101, 41, 41, 13, 10,112, + 117,122,122,108,111,111,112,101, 58, 13, 10,112,117,122,122,108,111,111, + 112, 58, 13, 10, 48, 58, 54, 48, 57, 56, 53, 97, 99, 58, 52, 49, 58, 48, + 48, 58, 51, 49, 13, 10, 48, 58, 54, 48, 57, 56, 54,100, 52, 58, 52, 49, + 58, 48, 48, 58, 51, 48, 13, 10, 13, 10,112,117,122,122,108,111,111,112, + 97, 58, 13, 10, 48, 58, 54, 48, 57, 99, 52, 98, 56, 58, 52, 49, 58, 48, + 48, 58, 51, 49, 13, 10, 48, 58, 54, 48, 57, 99, 53,101, 48, 58, 52, 49, + 58, 48, 48, 58, 51, 48, 13, 10, 13, 10,112,117,122,122,108,111,111,112, + 106, 58, 13, 10, 48, 58, 54, 48, 57,100, 49, 97, 56, 58, 52, 49, 58, 48, + 48, 58, 51, 48, 13, 10, 48, 58, 54, 48, 57,100, 48, 56, 48, 58, 52, 49, + 58, 48, 48, 58, 51, 49, 13, 10, 13, 10,112,117,122,122,108,111,111,112, + 107, 58, 13, 10,112,117,122,122,108,111,111,112,117, 58, 13, 10, 48, 58, + 54, 48, 57, 99, 55, 48, 48, 58, 52, 49, 58, 48, 48, 58, 51, 48, 13, 10, + 48, 58, 54, 48, 57, 99, 53,100, 56, 58, 52, 49, 58, 48, 48, 58, 51, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,112,101,101, + 100, 32,115,112,105,110, 41, 13, 10,115,112,101,101,100,115,112,110, 58, + 13, 10, 48, 58, 98, 48, 52, 99, 58, 54, 49, 58, 52, 97, 58, 50, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,107,121, 32,114, + 97,105,100,101,114, 41, 13, 10,115,107,121,114, 97,105,100, 58, 13, 10, + 48, 58, 97, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 40,115,101,110,103,101,107,105, 32,115,116,114, + 105,107,101,114, 41, 13, 10, 59, 42, 42, 32,116,104,101, 32,110,118,114, + 97,109, 32,105,110, 32,116,104,105,115, 32,103, 97,109,101, 32,105,115, + 32, 97, 98,111,117,116, 32, 97,115, 32,114,101,108,105, 97, 98,108,101, + 32, 97,115, 32,116,104,101, 32,101,110,103,108,105,115,104, 32, 99,114, + 105, 99,107,101,116, 32,116,101, 97,109, 44, 32,104,101,110, 99,101, 32, + 42, 42, 13, 10, 59, 42, 42, 32,116,104,101, 32,116,111,112, 32,115, 99, + 111,114,101, 32,105,115, 32,115,111,109,101,116,105,109,101,115, 32,119, + 114,111,110,103, 46, 46, 46, 46, 32, 98,117,116, 32,110,101,118,101,114, + 109,105,110,101, 32,101,104, 46, 46, 46, 63, 63, 32, 42, 42, 13, 10, 59, + 42, 42, 32,116,104,101, 32,116,111,100, 97,121,115, 32,116,111,112, 32, + 116,101,110, 32,104,105, 32,116, 97, 98,108,101, 32,115, 97,118,101,115, + 32,102,105,110,101, 32,116,104,111,117,103,104, 46, 46, 46, 32, 42, 42, + 13, 10,115,101,110,103,101,107,105,115, 58, 13, 10,115,101,110,103,101, + 107,105,115,106, 58, 13, 10, 48, 58, 54, 48, 98, 49,100,101, 56, 58, 55, + 56, 58, 53, 51, 58, 48, 48, 13, 10, 48, 58, 54, 48, 98, 49,101, 52, 55, + 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 40,115,111,108,118, 97,108,111,117, 41, 13, 10,115,111,108, + 118, 97,108,111,117, 58, 13, 10, 48, 58, 49, 48, 54, 54, 48,102, 58, 49, + 49, 57, 58, 48, 48, 58, 48, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 40,115, 46,115, 46,109,105,115,115,105,111,110, 41, 13, 10, + 115,115,109,105,115,115,105,110, 58, 13, 10, 48, 58, 98, 57, 49, 48, 48, + 58, 99, 48, 58, 48, 48, 58, 54,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 40,109,101,103, 97,100,111,110, 41, 13, 10, 59, 42, 42, + 32,111,110,108,121, 32,115, 97,118,101,115, 32,116,111,112, 32,115, 99, + 111,114,101, 32, 63, 63, 63, 63, 32,100,111,110, 96,116, 32,107,110,111, + 119, 32,119,104,121, 32, 63, 63, 63, 63, 32, 97,110,121,111,110,101, 32, + 102,105,120, 32,116,104,105,115, 32, 63, 63, 32, 32, 42, 42, 13, 10,109, + 101,103, 97,100,111,110, 58, 13, 10, 48, 58, 55, 97, 48, 49, 58, 52, 56, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55, 97, 54,101, 58, 50, 58, 48, + 49, 58, 48, 48, 13, 10, 48, 58, 55, 56, 54, 50, 58, 49, 58,102, 52, 58, + 102, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,108,101, + 103,105,111,110, 40,118,101,114, 32, 50, 46, 48, 51, 32, 38, 32, 49, 46, + 48, 53, 41, 41, 13, 10,108,101,103,105,111,110, 58, 13, 10, 48, 58, 54, + 50,101, 56,101, 58, 50, 55, 58, 48, 48, 58, 50, 57, 13, 10, 48, 58, 54, + 50,102,100,101, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10,108,101,103,105, + 111,110,111, 58, 13, 10,108,101,103,105,111,110,106, 98, 58, 13, 10,108, + 101,103,105,111,110,106, 58, 13, 10, 48, 58, 54, 50,101, 56, 99, 58, 50, + 55, 58, 48, 48, 58, 50, 57, 13, 10, 48, 58, 54, 50,102,100, 99, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 40,108,101,103,101,110,100, 41, 13, 10,108,101,103,101,110,100, 58, + 13, 10,108,101,103,101,110,100, 98, 58, 13, 10, 48, 58,101, 55, 48, 99, + 58, 53,100, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 40,107,105,100, 32,110,111, 32,104,111,114,101, 32,104, + 111,114,101, 32,100, 97,105,115, 97,107,117,115,101,110, 41, 13, 10,104, + 111,114,101,107,105,100, 58, 13, 10,104,111,114,101,107,105,100, 98, 58, + 13, 10, 98,111,111, 98,104, 97, 99,107, 58, 13, 10, 48, 58, 52, 48, 50, + 53, 97, 58, 50, 56, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 40,105,112,109, 32,105,110,118, 97,100,101,114, + 41, 13, 10,105,112,109,105,110,118, 97,100, 58, 13, 10, 48, 58, 99, 48, + 58, 97, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 40,103,111,108,100,101,110, 32,102,105,114,101, 32, 73, 73, + 41, 13, 10,103,102,105,114,101, 50, 58, 13, 10, 48, 58, 49, 48, 48, 51, + 100, 58, 52, 53, 58, 52,102, 58, 52, 97, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 40, 98,101,115,116, 32, 98,111,117,116, 32, 98,111, + 120,105,110,103, 41, 13, 10, 98, 98, 98,120,105,110,103, 58, 13, 10, 48, + 58,102,101,101, 48,102, 52, 53, 99, 58,100, 55, 58, 97, 48, 58, 53, 51, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, 97,108,112,104, + 97, 32,102,105,103,104,116,101,114, 32, 47, 32,104,101, 97,100, 32,111, + 110, 41, 13, 10, 97,108,112,104, 97,104,111, 58, 13, 10, 48, 58, 56, 55, + 56, 97, 58,102, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58,101, 52, 99, 98, + 58, 99, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 40,115, 97,109,117,114, 97,105, 32, 97, 99,101,115, 32, 40, + 119,111,114,108,100, 41, 41, 13, 10,115, 97,109,117,114, 97,105, 97, 58, + 13, 10, 48, 58,102,101, 55,100, 56, 48, 58, 57,101, 58, 48, 48, 58, 48, + 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,102,108,111, + 119,101,114, 41, 13, 10,102,108,111,119,101,114, 58, 13, 10,102,108,111, + 119,101,114,115,106, 58, 13, 10, 48, 58,100, 48, 54, 48, 58, 51, 55, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, 48, 48,102, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 99, 48, 49, 48, 58, 49, 58, 51, 48, 58, 51, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,102, 97,110, + 99,121, 32,119,111,114,108,100, 32, 45, 32,101, 97,114,116,104, 32,111, + 102, 32, 99,114,105,115,105,115, 41, 13, 10,102,110, 99,121,119,108,100, + 58, 13, 10, 48, 58,102,102, 56, 51, 49, 49, 58, 97,101, 58, 48, 53, 58, + 53, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, 98,111, + 117,110, 99,105,110,103, 32, 98, 97,108,108,115, 41, 13, 10, 98, 98, 97, + 108,108,115, 58, 13, 10, 98, 98, 97,108,108,115, 97, 58, 13, 10, 48, 58, + 102, 99, 54, 56, 56, 58, 51, 49, 58, 57, 48, 58, 57, 48, 13, 10, 48, 58, + 102, 99, 54, 56, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 40,116,101,110,103, 97,105, 41, 32, 40, 98,121, 32,116, 97,109,112,104, + 97,120, 41, 13, 10,116,101,110,103, 97,105, 58, 13, 10,116,101,110,103, + 97,105,106, 58, 13, 10, 48, 58,102,101, 52, 99, 98, 48, 58, 52, 56, 58, + 50,100, 58, 57, 56, 13, 10, 13, 10, 59, 40, 66,108, 97,122,101, 32, 79, + 110, 41, 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, 13, 10, 98, + 108, 97,122,101,111,110, 58, 13, 10, 48, 58, 51, 48, 52,102, 98, 48, 58, + 55, 55, 58, 48, 48, 58, 48,100, 13, 10, 48, 58, 51, 48, 48, 50, 48, 99, + 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 40, 98,108, 97,110,100,105, 97, 41, 13, 10, 98,108, 97,110, + 100,105, 97, 58, 13, 10, 48, 58, 51, 48, 49, 48, 57, 52, 58, 54, 50, 58, + 48, 57, 58, 49, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 40, 97,113,117, 97,114,105,117,109, 32, 40,106, 97,112, 97,110, 41, 41, + 13, 10, 97,113,117, 97,114,105,117,109, 58, 13, 10, 97,113,117, 97,114, + 105,117,109,106, 58, 13, 10, 48, 58,102,102, 57, 48, 52, 99, 58, 50, 56, + 58, 52, 57, 58,101, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 40,109, 97,115,107,101,100, 32,114,105,100,101,114,115, 32, 99,108, + 117, 98, 32, 98, 97,116,116,108,101, 32,114, 97, 99,101, 41, 13, 10,107, + 97,109,101,110,114,105,100, 58, 13, 10, 48, 58, 50, 48, 50,101, 57, 51, + 58, 57,102, 58, 48, 97, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 40,110, 46,121, 46, 32, 99, 97,112,116,111,114, 41, 13, + 10, 59, 42, 42, 32,104,105,115, 99,111,114,101, 32,105,115, 32, 98,114, + 111,107,101,110, 32,105,110, 32,116,104,105,115, 32,103, 97,109,101, 44, + 32,119,104,101,110, 32,104, 47,115, 99,111,114,101, 32,105,115, 32, 98, + 101, 97,116,101,110, 32,121,111,117, 32, 99, 97,110,110,111,116, 32,112, + 117,116, 32,121,111,117,114, 32,110, 97,109,101, 32,105,110, 32, 42, 42, + 13, 10, 59, 42, 42, 32,116,104,101, 32,115, 99,111,114,101,115, 32,115, + 97,118,101, 32,111,107, 32,116,104,111,117,103,104, 46, 46, 46, 32, 32, + 42, 42, 13, 10,110,121, 99, 97,112,116,111,114, 58, 13, 10, 48, 58,101, + 49,100, 97, 58, 50, 56, 58, 48, 48, 58, 52,101, 13, 10, 48, 58,101, 49, + 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 40,115,107,121, 32,115,107,105,112,112,101,114, 41, + 13, 10,115,107,121,115,107,105,112,114, 58, 13, 10, 48, 58, 56, 49,102, + 50, 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 56, 54, 49, 48, 58, + 49,101, 58, 48, 49, 58, 49, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 40,100,105,118,101,114, 32, 98,111,121, 41, 13, 10,100,105, + 118,101,114, 98,111,121, 58, 13, 10, 48, 58, 52, 52, 55, 49, 53, 58, 98, + 49, 58, 51, 49, 58,101, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 40,110,111,115,116,114, 97,100, 97,109,117,115, 41, 13, 10,110, + 111,115,116, 58, 13, 10, 48, 58, 49, 48, 48, 51, 53, 48, 58, 50, 57, 58, + 53, 57, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 48, 49, 57, 58, 51, 58, + 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 40, 98,101, 97,109, 32,105,110,118, 97,100,101,114, 41, 13, 10, 98,101, + 97,109,105,110,118, 58, 13, 10, 98,101, 97,109,105,110,118, 97, 58, 13, + 10,112, 97, 99,111,109,105,110,118, 58, 13, 10, 48, 58, 49, 56, 51, 51, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 65,114,109,111,114, + 101,100, 32, 87, 97,114,114,105,111,114,115, 40, 69,117,114,111,112,101, + 47, 85, 83, 65, 41, 32, 40, 98,121, 32,116, 97,109,112,104, 97,120, 41, + 13, 10, 97,114,109,119, 97,114, 58, 13, 10, 97,114,109,119, 97,114,117, + 58, 13, 10, 97,114,109,119, 97,114, 97, 58, 13, 10, 97,114,109,119, 97, + 114, 97,114, 49, 58, 13, 10, 97,114,109,119, 97,114, 49,100, 58, 13, 10, + 97,114,109,119, 97,114,114, 49, 58, 13, 10, 97,114,109,119, 97,114,117, + 49, 58, 13, 10,112,103,101, 97,114,114, 49, 58, 13, 10,112,103,101, 97, + 114, 58, 13, 10, 48, 58,102,102, 50, 55,100, 54, 58, 50, 53, 54, 58, 48, + 48, 58, 48, 52, 13, 10, 13, 10, 59, 40, 99, 97,115,115,101,116,116,101, + 58, 32,116,111,114,110, 97,100,111, 41, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10, 99,116,111,114,110, 97,100,111, 58, 13, 10, 48, + 58, 50, 53, 58, 51, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40, 99, 97,115, + 115,101,116,116,101, 58, 32,116,101,114,114, 97,110,101, 97,110, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,116,101,114,114, + 97,110,105, 58, 13, 10, 48, 58, 52, 52, 58, 50, 58, 48, 58, 53, 48, 13, + 10, 48, 58, 52, 54, 58, 49, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40, 99, + 97,115,115,101,116,116,101, 58, 32,115,117,112,101,114, 32, 97,115,116, + 114,111, 32,102,105,103,104,116,101,114, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10, 99,115,117,112,101,114, 97,115, 58, 13, 10, + 48, 58, 52, 56, 48, 58, 49, 99, 58, 48, 58,102,102, 13, 10, 48, 58, 57, + 56, 58, 50, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40, 99, 97,115,115,101, 116,116,101, 58, 32,115, 99,114,117,109, 32,116,114,121, 32, 40,115,101, 116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 99,115, 99,114,116,114,121, - 58, 10, 48, 58, 52, 48, 48, 58, 50, 49, 58, 48, 49, 58, 49, 53, 10, 48, - 58, 97, 58, 51, 58, 49, 48, 58, 48, 49, 10, 99,115, 99,114,116,114,121, - 50, 58, 10, 48, 58, 52, 48, 48, 58, 50, 52, 58, 48, 58, 50, 98, 10, 48, - 58, 97, 58, 51, 58, 48, 58, 48, 10, 48, 58, 99, 97, 52, 49, 58, 49, 58, - 49, 58, 49, 10, 48, 58, 99, 97, 50, 49, 58, 49, 58, 50, 98, 58, 50, 98, - 10, 48, 58, 99, 97, 48, 49, 58, 49, 58, 50, 98, 58, 50, 98, 10, 48, 58, - 99, 57,101, 49, 58, 49, 58, 50, 98, 58, 50, 98, 10, 48, 58, 99, 97, 54, - 49, 58, 49, 58, 49, 58, 49, 10, 48, 58, 99, 57, 99, 49, 58, 49, 58, 50, - 98, 58, 50, 98, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,115, 99,114,116,114, + 121, 58, 13, 10, 48, 58, 52, 48, 48, 58, 50, 49, 58, 48, 49, 58, 49, 53, + 13, 10, 48, 58, 97, 58, 51, 58, 49, 48, 58, 48, 49, 13, 10, 99,115, 99, + 114,116,114,121, 50, 58, 13, 10, 48, 58, 52, 48, 48, 58, 50, 52, 58, 48, + 58, 50, 98, 13, 10, 48, 58, 97, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, + 99, 97, 52, 49, 58, 49, 58, 49, 58, 49, 13, 10, 48, 58, 99, 97, 50, 49, + 58, 49, 58, 50, 98, 58, 50, 98, 13, 10, 48, 58, 99, 97, 48, 49, 58, 49, + 58, 50, 98, 58, 50, 98, 13, 10, 48, 58, 99, 57,101, 49, 58, 49, 58, 50, + 98, 58, 50, 98, 13, 10, 48, 58, 99, 97, 54, 49, 58, 49, 58, 49, 58, 49, + 13, 10, 48, 58, 99, 57, 99, 49, 58, 49, 58, 50, 98, 58, 50, 98, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, - 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, - 32,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 53, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 47,103,101,111,109, 97,110, 47,111,116, - 104,101,114,115, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97, + 116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105, + 103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 53, 32, 97,100,100,105, + 116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108, + 101,101,122,101,114, 47,103,101,111,109, 97,110, 47,111,116,104,101,114, + 115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 40,117,112, 96,110, 32,100,111,119,110, - 32, 40,110,111,116, 32,101,110, 99,114,121,112,116,101,100, 41, 41, 10, - 117,112,110,100,111,119,110,117, 58, 10, 48, 58, 99, 57, 51,102, 58, 51, - 102, 58, 48, 49, 58, 48, 48, 10, 48, 58, 99, 57, 55, 98, 58, 49, 58, 48, - 49, 58, 48, 49, 10, 10,117,112,110,100,111,119,110, 58, 10, 48, 58, 99, - 57, 51,102, 58, 51,102, 58, 48, 49, 58, 48, 48, 10, 10,119,105,108,121, - 116,111,119,114, 58, 10, 97,116,111,109, 98,111,121, 58, 10, 97,116,111, - 109, 98,111,121, 97, 58, 10, 48, 58,100,100, 48, 48, 58, 52, 58, 48, 48, - 58, 48, 53, 10, 48, 58,100,100, 48, 52, 58, 97, 99, 58, 48, 58, 48, 10, - 48, 58,101, 55, 56,100, 58, 54, 58,102,102, 58,102,102, 10, 10, 59, 40, - 106,117,109,112, 32,107,105,100,115, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,106,117,109,112,107,105,100,115, 58, 10, 48, 58, 49, - 50, 51, 99, 49, 48, 58, 97, 48, 58, 53, 48, 58, 53, 48, 10, 48, 58, 49, - 50, 51, 99, 48, 49, 58, 51, 58, 48, 58, 48, 10, 10, 59, 40,105,110,102, - 101,114,110,111, 32, 40,115, 50, 54, 53, 48, 41, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,109,105,110,102,101,114,110,111, 58, 10, - 48, 58, 49, 99, 51, 97, 58, 53, 58, 49, 48, 58, 49, 48, 10, 10, 59, 40, - 104,105,103,104, 32,118,111,108,116, 97,103,101, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 32, 45, 32, 70,111,114, 32,116,104,101, 32, - 104,105,115, 99,111,114,101, 32,116,111, 32,100,105,115,112,108, 97,121, - 32, 99,111,114,114,101, 99,116,108,121, 32,105,110, 32,116,104,101, 32, - 111,112,101,110,105,110,103, 32,115, 99,114,101,101,110, 32, 97,108,119, - 97,121,115, 32,113,117,105,116, 32,116,104,101, 32,103, 97,109,101, 32, - 119,104,101,110, 32,111,112,101,110,105,110,103, 32,115, 99,114,101,101, - 110, 32,105,115, 32,100,105,115,112,108, 97,121,101,100, 33, 10,104,118, - 111,108,116, 97,103,101, 58, 10, 48, 58, 52, 48,100, 50, 48, 58, 49,101, - 48, 58, 52, 99, 58, 48, 48, 10, 48, 58, 52, 48, 48, 50, 48, 58, 51, 58, - 48, 49, 58, 48, 48, 10, 48, 58, 50, 48, 49, 54, 49, 53, 58, 49, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 50, 48, 49, 54, 57, 53, 58, 49, 58, 48, 49, - 58, 48, 49, 10, 48, 58, 50, 48, 49, 55, 49, 53, 58, 49, 58, 48, 58, 48, - 10, 48, 58, 50, 48, 49, 55, 57, 53, 58, 49, 58, 48, 58, 48, 10, 48, 58, - 50, 48, 49, 56, 49, 53, 58, 49, 58, 48, 58, 48, 10, 48, 58, 50, 48, 49, - 56, 57, 53, 58, 49, 58, 48, 58, 48, 10, 48, 58, 50, 48, 49, 57, 49, 53, - 58, 49, 58, 48, 58, 48, 10, 10, 59, 40,103,117,108,102, 32,119, 97,114, - 32,105,105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,103, - 117,108,102,119, 97,114, 50, 58, 10,103,117,108,102,119, 97,114, 50, 97, - 58, 10, 48, 58, 51, 49, 53, 97, 54, 58, 49, 54, 97, 58, 48, 48, 58, 48, - 49, 10, 48, 58, 51, 49, 53, 97, 50, 58, 52, 58, 48, 58, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 70, 45, 49, 32, 71,114, 97,110,100, 32, 80,114, - 105,120, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 44, 32, 71, 80, 32, - 114,101, 99,111,114,100,115, 32, 98,121, 32, 71,114,101, 97,116, 83,116, - 111,110,101, 41, 10,102, 49,103,112, 58, 10, 48, 58,102,102, 57, 49, 55, - 97, 58, 50,102, 48, 58, 49, 52, 58, 48, 48, 10, 48, 58,102,102, 97, 53, - 99, 98, 58, 51,102, 58, 53, 57, 58, 52, 57, 10, 10, 59, 40,101,113,117, - 105,116,101,115, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10,101,113,117,105,116,101,115, - 58, 10,101,113,117,105,116,101,115,115, 58, 10, 48, 58, 52, 48, 48, 50, - 48, 58, 52, 58, 48, 58, 48, 10, 48, 58, 52, 48, 97, 51, 48, 58, 97, 48, - 58, 48, 48, 58, 48, 57, 10, 10, 59, 40, 99,108, 97,121, 32,115,104,111, - 111,116, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 99,108, - 97,121,115,104,111,111, 58, 10, 48, 58, 50, 49, 52, 48, 58, 56, 58, 98, - 101, 58, 48, 48, 10, 10, 59, 40,100,105,110,103,111, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,100,105,110,103,111, 58, 10, 48, 58, - 52, 48, 50, 56, 58, 51, 49, 58, 48, 58, 48, 10, 10, 59, 40,114,111,108, - 108,101,114, 32,106, 97,109,109,101,114, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,114,106, 97,109,109,101,114, 58, 10, 48, 58, 97, - 52,102, 97, 58, 49,101, 58, 97, 56, 58, 53, 53, 10, 10, 59, 40,114,105, - 112, 32, 99,111,114,100, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10,114,105,112, 99,111,114,100, 58, 10, 48, 58, 51, 54, 58, 50, 58, - 48, 58, 48, 10, 10, 59, 40,110,101,120,116, 32,115,112, 97, 99,101, 44, - 32,116,104,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 116,110,101,120,115,112, 99,101, 58, 10, 48, 58, 55, 48, 48, 49, 54, 58, - 52, 58, 48, 58, 48, 10, 48, 58, 55, 50, 98, 52, 48, 58, 53, 48, 58, 48, - 58, 48, 10, 48, 58, 97, 48,102, 53, 54, 58, 49, 48, 58, 51, 48, 58, 52, - 101, 10, 10, 59, 40,110,101,116, 32,119, 97,114,115, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,110,101,116,119, 97,114,115, 58, 10, - 48, 58, 53, 56, 57, 48, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, - 48, 52, 48, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 56, 48, 54, 48, - 58, 49, 58, 48, 58, 48, 10, 48, 58, 56, 48, 56, 48, 58, 49, 58, 48, 58, - 48, 10, 48, 58, 56, 48, 97, 48, 58, 49, 58, 48, 58, 48, 10, 48, 58, 56, - 48, 99, 48, 58, 49, 58, 48, 58, 48, 10, 48, 58, 56, 48,101, 48, 58, 49, - 58, 49, 58, 49, 10, 48, 58, 56, 49, 48, 48, 58, 49, 58, 50, 52, 58, 50, - 52, 10, 48, 58, 56, 49, 49, 48, 58, 49, 58, 50, 52, 58, 50, 52, 10, 10, - 59, 40,108,101,116,104, 97,108, 32, 99,114, 97,115,104, 32,114, 97, 99, - 101, 32, 40,115,101,116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 99,114, - 115,104,114, 97, 99,101, 58, 10, 99,114,115,104,114, 97, 99,101, 50, 58, + 32, 40,110,111,116, 32,101,110, 99,114,121,112,116,101,100, 41, 41, 13, + 10,117,112,110,100,111,119,110,117, 58, 13, 10, 48, 58, 99, 57, 51,102, + 58, 51,102, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 99, 57, 55, 98, 58, + 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,117,112,110,100,111,119,110, + 58, 13, 10, 48, 58, 99, 57, 51,102, 58, 51,102, 58, 48, 49, 58, 48, 48, + 13, 10, 13, 10,119,105,108,121,116,111,119,114, 58, 13, 10, 97,116,111, + 109, 98,111,121, 58, 13, 10, 97,116,111,109, 98,111,121, 97, 58, 13, 10, + 48, 58,100,100, 48, 48, 58, 52, 58, 48, 48, 58, 48, 53, 13, 10, 48, 58, + 100,100, 48, 52, 58, 97, 99, 58, 48, 58, 48, 13, 10, 48, 58,101, 55, 56, + 100, 58, 54, 58,102,102, 58,102,102, 13, 10, 13, 10, 59, 40,106,117,109, + 112, 32,107,105,100,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,106,117,109,112,107,105,100,115, 58, 13, 10, 48, 58, 49, 50, + 51, 99, 49, 48, 58, 97, 48, 58, 53, 48, 58, 53, 48, 13, 10, 48, 58, 49, + 50, 51, 99, 48, 49, 58, 51, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,105, + 110,102,101,114,110,111, 32, 40,115, 50, 54, 53, 48, 41, 41, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109,105,110,102,101,114,110, + 111, 58, 13, 10, 48, 58, 49, 99, 51, 97, 58, 53, 58, 49, 48, 58, 49, 48, + 13, 10, 13, 10, 59, 40,104,105,103,104, 32,118,111,108,116, 97,103,101, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 70,111, + 114, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116,111, 32,100, + 105,115,112,108, 97,121, 32, 99,111,114,114,101, 99,116,108,121, 32,105, + 110, 32,116,104,101, 32,111,112,101,110,105,110,103, 32,115, 99,114,101, + 101,110, 32, 97,108,119, 97,121,115, 32,113,117,105,116, 32,116,104,101, + 32,103, 97,109,101, 32,119,104,101,110, 32,111,112,101,110,105,110,103, + 32,115, 99,114,101,101,110, 32,105,115, 32,100,105,115,112,108, 97,121, + 101,100, 33, 13, 10,104,118,111,108,116, 97,103,101, 58, 13, 10, 48, 58, + 52, 48,100, 50, 48, 58, 49,101, 48, 58, 52, 99, 58, 48, 48, 13, 10, 48, + 58, 52, 48, 48, 50, 48, 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, + 50, 48, 49, 54, 49, 53, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 50, 48, 49, 54, 57, 53, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, + 50, 48, 49, 55, 49, 53, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 50, 48, + 49, 55, 57, 53, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 50, 48, 49, 56, + 49, 53, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 50, 48, 49, 56, 57, 53, + 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 50, 48, 49, 57, 49, 53, 58, 49, + 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,103,117,108,102, 32,119, 97,114, + 32,105,105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 103,117,108,102,119, 97,114, 50, 58, 13, 10,103,117,108,102,119, 97,114, + 50, 97, 58, 13, 10, 48, 58, 51, 49, 53, 97, 54, 58, 49, 54, 97, 58, 48, + 48, 58, 48, 49, 13, 10, 48, 58, 51, 49, 53, 97, 50, 58, 52, 58, 48, 58, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 70, 45, 49, 32, 71,114, + 97,110,100, 32, 80,114,105,120, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 44, 32, 71, 80, 32,114,101, 99,111,114,100,115, 32, 98,121, 32, 71, + 114,101, 97,116, 83,116,111,110,101, 41, 13, 10,102, 49,103,112, 58, 13, + 10, 48, 58,102,102, 57, 49, 55, 97, 58, 50,102, 48, 58, 49, 52, 58, 48, + 48, 13, 10, 48, 58,102,102, 97, 53, 99, 98, 58, 51,102, 58, 53, 57, 58, + 52, 57, 13, 10, 13, 10, 59, 40,101,113,117,105,116,101,115, 41, 32, 97, + 110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 13, 10,101,113,117,105,116,101,115, 58, 13, 10,101,113,117, + 105,116,101,115,115, 58, 13, 10, 48, 58, 52, 48, 48, 50, 48, 58, 52, 58, + 48, 58, 48, 13, 10, 48, 58, 52, 48, 97, 51, 48, 58, 97, 48, 58, 48, 48, + 58, 48, 57, 13, 10, 13, 10, 59, 40, 99,108, 97,121, 32,115,104,111,111, + 116, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,108, + 97,121,115,104,111,111, 58, 13, 10, 48, 58, 50, 49, 52, 48, 58, 56, 58, + 98,101, 58, 48, 48, 13, 10, 13, 10, 59, 40,100,105,110,103,111, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,100,105,110,103,111, + 58, 13, 10, 48, 58, 52, 48, 50, 56, 58, 51, 49, 58, 48, 58, 48, 13, 10, + 13, 10, 59, 40,114,111,108,108,101,114, 32,106, 97,109,109,101,114, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,114,106, 97,109, + 109,101,114, 58, 13, 10, 48, 58, 97, 52,102, 97, 58, 49,101, 58, 97, 56, + 58, 53, 53, 13, 10, 13, 10, 59, 40,114,105,112, 32, 99,111,114,100, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,114,105,112, 99, + 111,114,100, 58, 13, 10, 48, 58, 51, 54, 58, 50, 58, 48, 58, 48, 13, 10, + 13, 10, 59, 40,110,101,120,116, 32,115,112, 97, 99,101, 44, 32,116,104, + 101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116,110, + 101,120,115,112, 99,101, 58, 13, 10, 48, 58, 55, 48, 48, 49, 54, 58, 52, + 58, 48, 58, 48, 13, 10, 48, 58, 55, 50, 98, 52, 48, 58, 53, 48, 58, 48, + 58, 48, 13, 10, 48, 58, 97, 48,102, 53, 54, 58, 49, 48, 58, 51, 48, 58, + 52,101, 13, 10, 13, 10, 59, 40,110,101,116, 32,119, 97,114,115, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,110,101,116,119, 97, + 114,115, 58, 13, 10, 48, 58, 53, 56, 57, 48, 58, 54, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 56, 48, 52, 48, 58, 49, 58, 50, 52, 58, 50, 52, 13, + 10, 48, 58, 56, 48, 54, 48, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 56, + 48, 56, 48, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 56, 48, 97, 48, 58, + 49, 58, 48, 58, 48, 13, 10, 48, 58, 56, 48, 99, 48, 58, 49, 58, 48, 58, + 48, 13, 10, 48, 58, 56, 48,101, 48, 58, 49, 58, 49, 58, 49, 13, 10, 48, + 58, 56, 49, 48, 48, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 56, + 49, 49, 48, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 13, 10, 59, 40,108, + 101,116,104, 97,108, 32, 99,114, 97,115,104, 32,114, 97, 99,101, 32, 40, + 115,101,116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,114,115,104, + 114, 97, 99,101, 58, 13, 10, 99,114,115,104,114, 97, 99,101, 50, 58, 13, 10, 48, 58,102,101, 50, 49, 98, 54, 58, 56, 48, 58, 52, 49, 58, 48, 48, - 10, 10, 59, 40,107,111,117,107,111,117,121, 97,107,121,117,104, 44, 32, - 116,104,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,107, - 111,117,121, 97,107,121,117, 58, 10, 48, 58, 52, 48, 97, 48, 49, 58, 55, - 48, 58, 48, 58, 48, 10, 48, 58, 52, 48, 48, 49, 48, 58, 52, 58, 48, 58, - 48, 10, 48, 58, 56, 48, 55, 48,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, - 48, 58, 56, 48, 55, 56,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, - 56, 48, 56, 48,100, 58, 49, 58, 50, 58, 50, 10, 48, 58, 56, 48, 56, 56, - 100, 58, 49, 58, 48, 58, 48, 10, 48, 58, 56, 48, 57, 48,100, 58, 49, 58, - 48, 58, 48, 10, 48, 58, 56, 48, 57, 56,100, 58, 49, 58, 48, 58, 48, 10, - 48, 58, 56, 48, 97, 48,100, 58, 49, 58, 48, 58, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, 40, - 99, 97,115,115,101,116,116,101, 58, 32,112,101,116,101,114, 32,112,101, - 112,112,101,114,115, 32,105, 99,101, 32, 99,114,101, 97,109, 32,102, 97, - 99,116,111,114,121, 41, 10, 99,112,112,105, 99,102, 58, 10, 99,112,112, - 105, 99,102, 50, 58, 10, 48, 58,100, 57, 52, 48, 58, 49,101, 58, 48, 53, - 58, 48, 48, 10, 48, 58,100, 56, 48, 48, 58, 49,101, 58, 52,100, 58, 48, - 48, 10, 48, 58, 51, 58, 51, 58, 48, 48, 58, 48, 53, 10, 48, 58, 57, 52, - 58, 49, 58, 49, 51, 58, 49, 51, 10, 10, 59, 40, 99, 97,115,115,101,116, - 116,101, 58, 32,114,111,111,116,105,110, 39, 32,116,111,111,116,105,110, - 39, 32, 40, 97,107, 97, 32,108, 97, 46,112, 97, 46,112, 97, 41, 41, 32, - 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10, 99,108, 97,112, 97,112, 97, 58, 10, 99,108, 97,112, - 97,112, 97, 50, 58, 10, 48, 58, 49, 58, 50, 58, 48, 48, 58, 52, 53, 10, - 48, 58, 51, 58, 49, 58, 48, 58, 48, 10, 10, 59, 40, 99, 97,115,115,101, - 116,116,101, 58, 32,112,114,111, 32,115,111, 99, 99,101,114, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 99,112,114,111,115,111, 99, - 99, 58, 10, 99,112,115,111, 99, 99,101,114, 58, 10, 48, 58, 53, 54, 97, - 58, 50, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 57, 49, 58, 51, 58, - 48, 58, 48, 10, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,110, - 105,103,104,116, 32,115,116, 97,114, 32, 40,115,101,116, 32, 49, 41, 41, - 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10, 99,110,105,103,104,116,115,116, 58, 10, 99,110, - 105,103,104,116,115,116, 50, 58, 10, 48, 58,100, 58, 50, 58, 48, 48, 58, - 48, 51, 10, 48, 58, 55, 56, 48, 48, 58, 52, 48, 58, 48, 51, 58, 48, 48, - 10, 48, 58, 55, 57, 52, 48, 58, 52, 48, 58, 54, 98, 58, 48, 48, 10, 10, - 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,109,105,115,115,105,111, - 110, 45,120, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 99, - 109,105,115,115,110,120, 58, 10, 48, 58, 50, 51, 58, 51, 58, 48, 58, 48, - 10, 10, 59, 40,116,111,102,102,121, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,116,111,102,102,121, 58, 10, 48, 58, 57, 49, 51, 58, - 97, 48, 58, 50, 48, 58,102,102, 10, 10, 59, 40, 98, 97,116,116,108,101, - 32, 99,114,111,115,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10, 98, 97,116,116,108,101,120, 58, 10, 48, 58, 97, 48, 51, 54, 58, - 51, 58, 48, 58, 48, 10, 48, 58, 97, 50, 54, 54, 58, 50, 51, 58, 48, 58, - 48, 10, 10, 59, 40, 98, 97,107,117,116,111,116,115,117, 32,107,105,106, + 13, 10, 13, 10, 59, 40,107,111,117,107,111,117,121, 97,107,121,117,104, + 44, 32,116,104,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,107,111,117,121, 97,107,121,117, 58, 13, 10, 48, 58, 52, 48, 97, + 48, 49, 58, 55, 48, 58, 48, 58, 48, 13, 10, 48, 58, 52, 48, 48, 49, 48, + 58, 52, 58, 48, 58, 48, 13, 10, 48, 58, 56, 48, 55, 48,100, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 56, 48, 55, 56,100, 58, 49, 58, 50, + 48, 58, 50, 48, 13, 10, 48, 58, 56, 48, 56, 48,100, 58, 49, 58, 50, 58, + 50, 13, 10, 48, 58, 56, 48, 56, 56,100, 58, 49, 58, 48, 58, 48, 13, 10, + 48, 58, 56, 48, 57, 48,100, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 56, + 48, 57, 56,100, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 56, 48, 97, 48, + 100, 58, 49, 58, 48, 58, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115, + 101,116,116,101, 58, 32,112,101,116,101,114, 32,112,101,112,112,101,114, + 115, 32,105, 99,101, 32, 99,114,101, 97,109, 32,102, 97, 99,116,111,114, + 121, 41, 13, 10, 99,112,112,105, 99,102, 58, 13, 10, 99,112,112,105, 99, + 102, 50, 58, 13, 10, 48, 58,100, 57, 52, 48, 58, 49,101, 58, 48, 53, 58, + 48, 48, 13, 10, 48, 58,100, 56, 48, 48, 58, 49,101, 58, 52,100, 58, 48, + 48, 13, 10, 48, 58, 51, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, 48, 58, + 57, 52, 58, 49, 58, 49, 51, 58, 49, 51, 13, 10, 13, 10, 59, 40, 99, 97, + 115,115,101,116,116,101, 58, 32,114,111,111,116,105,110, 39, 32,116,111, + 111,116,105,110, 39, 32, 40, 97,107, 97, 32,108, 97, 46,112, 97, 46,112, + 97, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,108, 97,112, 97,112, 97, 58, + 13, 10, 99,108, 97,112, 97,112, 97, 50, 58, 13, 10, 48, 58, 49, 58, 50, + 58, 48, 48, 58, 52, 53, 13, 10, 48, 58, 51, 58, 49, 58, 48, 58, 48, 13, + 10, 13, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,112,114,111, + 32,115,111, 99, 99,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10, 99,112,114,111,115,111, 99, 99, 58, 13, 10, 99,112,115, + 111, 99, 99,101,114, 58, 13, 10, 48, 58, 53, 54, 97, 58, 50, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 53, 57, 49, 58, 51, 58, 48, 58, 48, 13, + 10, 13, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,110,105,103, + 104,116, 32,115,116, 97,114, 32, 40,115,101,116, 32, 49, 41, 41, 32, 97, + 110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 13, 10, 99,110,105,103,104,116,115,116, 58, 13, 10, 99,110, + 105,103,104,116,115,116, 50, 58, 13, 10, 48, 58,100, 58, 50, 58, 48, 48, + 58, 48, 51, 13, 10, 48, 58, 55, 56, 48, 48, 58, 52, 48, 58, 48, 51, 58, + 48, 48, 13, 10, 48, 58, 55, 57, 52, 48, 58, 52, 48, 58, 54, 98, 58, 48, + 48, 13, 10, 13, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32,109, + 105,115,115,105,111,110, 45,120, 41, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 13, 10, 99,109,105,115,115,110,120, 58, 13, 10, 48, 58, 50, + 51, 58, 51, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,116,111,102,102,121, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116,111,102, + 102,121, 58, 13, 10, 48, 58, 57, 49, 51, 58, 97, 48, 58, 50, 48, 58,102, + 102, 13, 10, 13, 10, 59, 40, 98, 97,116,116,108,101, 32, 99,114,111,115, + 115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98, 97, + 116,116,108,101,120, 58, 13, 10, 48, 58, 97, 48, 51, 54, 58, 51, 58, 48, + 58, 48, 13, 10, 48, 58, 97, 50, 54, 54, 58, 50, 51, 58, 48, 58, 48, 13, + 10, 13, 10, 59, 40, 98, 97,107,117,116,111,116,115,117, 32,107,105,106, 117,117,116,101,105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10, 98, 97,107,117,116,111,116,117, 58, 10, 48, 58, 49,101, 48, 48, 58, - 54, 48, 58, 52, 50, 58, 53, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 40,116,117, 98,101, 45,105,116, 41, 10,116,117, 98,101,105,116, - 58, 10, 48, 58, 56,100, 48,100, 58, 52, 99, 58, 52, 98, 58, 48, 48, 10, - 48, 58, 56,100, 53, 55, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, + 13, 10, 98, 97,107,117,116,111,116,117, 58, 13, 10, 48, 58, 49,101, 48, + 48, 58, 54, 48, 58, 52, 50, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 40,116,117, 98,101, 45,105,116, 41, 13, 10,116, + 117, 98,101,105,116, 58, 13, 10, 48, 58, 56,100, 48,100, 58, 52, 99, 58, + 52, 98, 58, 48, 48, 13, 10, 48, 58, 56,100, 53, 55, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, + 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 52, + 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, + 32, 98,121, 32,108,101,101,122,101,114, 47,103,101,111,109, 97,110, 47, + 111,116,104,101,114,115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32, - 117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103,104,115, 99,111, - 114,101, 95,118, 55, 46, 57, 52, 32, 97,100,100,105,116,105,111,110,115, - 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, - 47,103,101,111,109, 97,110, 47,111,116,104,101,114,115, 32, 32, 42, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 40,115,116,111,114,109, - 32, 98,108, 97,100,101, 32, 40,117,115, 41, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,115,116,109, 98,108, 97,100,101, 58, 10,115, - 116,109, 98,108, 97,100,101,106, 58, 10, 48, 58, 50, 56,100, 51, 58, 56, - 48, 58, 49, 53, 58, 48, 48, 10, 10, 59, 40,115,112,108,101,110,100,111, + 42, 42, 13, 10, 13, 10, 59, 40,115,116,111,114,109, 32, 98,108, 97,100, + 101, 32, 40,117,115, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,115,116,109, 98,108, 97,100,101, 58, 13, 10,115,116,109, 98, + 108, 97,100,101,106, 58, 13, 10, 48, 58, 50, 56,100, 51, 58, 56, 48, 58, + 49, 53, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,112,108,101,110,100,111, 114, 32, 98,108, 97,115,116, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10,115,112,108,110,100,114, 98,116, 58, 10, 48, 58, 52, 48, 56, - 52, 48, 58, 49, 54, 56, 58, 53, 51, 58, 48, 49, 10, 48, 58, 52, 48, 48, - 50, 48, 58, 51, 58, 48, 49, 58, 48, 48, 10, 10, 59, 40,115,112, 97, 99, - 101, 32,107,105,110,103, 32, 50, 41, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10,115,112, 99,107,105,110,103, 50, 58, 10, 48, 58, 49, 99, - 102, 52, 58, 50, 58, 48, 58, 48, 10, 10, 59, 40, 98,101, 97,115,116, 32, - 98,117,115,116,101,114,115, 32, 40,119,111,114,108,100, 32, 63, 41, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98, 98,117,115,116, - 101,114,115, 58, 10, 98, 98,117,115,116,101,114,115,117, 97, 58, 10, 98, - 98,117,115,116,101,114,115,117, 58, 10, 48, 58, 56, 97, 53, 55, 56, 58, - 50, 58, 48, 48, 58, 48, 50, 10, 48, 58, 56, 97, 53, 55, 97, 58, 98,101, - 58, 51, 48, 58, 48, 48, 10, 10, 59, 40, 98,105,114,100,105,101, 32,107, - 105,110,103, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98, - 107,105,110,103, 58, 10, 48, 58, 56, 49, 54, 49, 58, 57, 58, 48, 58, 48, - 10, 48, 58, 56, 49, 55, 53, 58, 49, 58, 48, 58, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 40,114,101,100, 32,114,111, 98,105,110, 41, 10, - 114,101,100,114,111, 98,105,110, 58, 10, 48, 58, 99, 55, 52, 51, 58, 51, - 98, 58, 49, 98, 58, 48, 48, 10, 48, 58, 99, 54,101, 54, 58, 51, 58, 48, - 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,109,111, - 110,116,101, 32, 99, 97,114,108,111, 41, 10,109,111,110,116,101, 99, 97, - 114, 58, 10, 48, 58, 98, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 40,109, 97, 99,114,111,115,115, 32,112, - 108,117,115, 41, 10,109, 97, 99,114,111,115,115,112, 58, 10, 48, 58,102, - 49, 54,100,100, 99, 58, 53,101, 58, 48, 48, 58, 49, 52, 10, 10, 59, 40, - 99, 97,115,115,101,116,116,101, 58, 32,108,111, 99,107, 39,110, 39, 99, - 104, 97,115,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 99,108,111, 99,107,110, 99,104, 58, 10, 48, 58, 97, 58, 51, 58, 48, 58, - 48, 10, 48, 58, 98, 56, 48, 48, 58,102, 58, 48, 58, 48, 10, 48, 58, 98, - 56, 49, 48, 58, 49, 49, 58,102,102, 58, 48, 10, 10, 59, 40, 99, 97,115, - 115,101,116,116,101, 58, 32,102,105,103,104,116,105,110,103, 32,105, 99, - 101, 32,104,111, 99,107,101,121, 41, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10, 99,102,103,104,116,105, 99,101, 58, 10, 48, 58, 99, 50, - 58, 51, 58, 48, 50, 58, 48, 10, 48, 58, 52, 98, 48, 57, 58, 53, 48, 58, - 50, 48, 58, 48, 48, 10, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, - 32,100,105,115, 99,111, 32,110,111, 32, 49, 41, 32, 97,110,100, 32, 99, - 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 99,100,105,115, 99,111,110, 49, 58, 10, 99,115,119,101,101,116,104,116, - 58, 10, 48, 58, 56, 58, 51, 58, 48, 58, 48, 10, 48, 58, 52, 48, 48, 58, - 50, 49, 58, 48, 58, 48, 10, 10, 59, 40, 99, 97,115,115,101,116,116,101, - 58, 32, 98,117,109,112, 32,110, 32,106,117,109,112, 41, 32, 97,110,100, - 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10, 99, 98,117,114,110,114,117, 98, 58, 10, 99, 98,110,106, 58, 10, - 99, 98,117,114,110,114,117, 98, 50, 58, 10, 48, 58, 57, 58, 51, 58, 49, - 50, 58, 48, 49, 10, 48, 58, 55, 56, 48, 48, 58,102, 58, 48, 49, 58, 56, - 50, 10, 48, 58, 57, 56, 48, 48, 58,102, 58, 52,100, 58, 52,100, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,117,112,101,114, 32,115,104, - 97,110,103,104, 97,105, 32,100,114, 97,103,111,110, 96,115, 32,101,121, - 101, 32, 40,119,111,114,108,100, 44, 98,111,111,116,108,101,103, 41, 41, - 10,115,115,104, 97,110,103,104, 97, 98, 58, 10,115,115,104, 97,110,103, - 104, 97, 58, 10, 48, 58,102,101, 99, 52, 55, 56, 58, 49, 51,102, 58, 48, - 48, 58, 49, 99, 10, 10, 59, 40, 97,109,101,114,105, 99, 97,110, 32,104, - 111,114,115,101,115,104,111,101,115, 32, 40,117,115, 41, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,104,111,114,115,104,111,101,115, - 58, 10, 48, 58, 56,101, 49, 99, 58, 50, 58, 48, 58, 48, 10, 48, 58, 56, - 102, 51, 55, 58, 49, 58, 48, 58, 48, 10, 48, 58, 56,102,102, 48, 58, 49, - 58, 48, 58, 48, 10, 48, 58, 56, 98,100, 48, 58, 49, 58, 52, 99, 58, 52, - 99, 10, 10, 59, 40,101,120,118, 97,110,105, 97, 32, 40,106, 97,112, 97, - 110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,101,120, - 118, 97,110,105, 97, 58, 10,101,120,118, 97,110,105, 97,106, 58, 10, 48, - 58, 50, 49, 52,101,101, 56, 58, 50, 56, 58, 53, 48, 58, 48, 50, 10, 10, - 59, 40,103,117,110, 98,117,115,116,101,114, 32, 40,106, 97,112, 97,110, - 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,103,117,110, - 98,117,115,116,114, 58, 10,103,117,110, 98,117,115,116,114,117, 58, 10, - 103,117,110, 98,117,115,116,114,106, 58, 10, 48, 58, 50, 48, 51, 50, 97, - 48, 58, 50, 58, 48, 48, 58, 50, 49, 10, 48, 58, 50, 48, 51, 50, 97, 50, - 58, 57,101, 58, 49, 51, 58, 48, 48, 10, 10, 59, 40,121, 97,109, 97,116, - 111, 32, 40,115,101,116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,121, 97, - 109, 97,116,111, 58, 10,121, 97,109, 97,116,111, 50, 58, 10, 48, 58, 54, - 49, 48, 48, 58, 53, 48, 58, 48, 48, 58,102,102, 10, 48, 58, 54, 48, 51, - 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,117,115, 32, 97, 97, - 102, 32,109,117,115,116, 97,110,103, 32, 40,106, 97,112, 97,110, 41, 41, - 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,109,117,115,116, 97,110,103, 58, 10,109,117,115, - 116, 97,110,103, 98, 58, 10,109,117,115,116, 97,110,103,115, 58, 10,109, - 117,115,116, 97,110,103, 98, 50, 58, 10, 48, 58,102, 57, 48, 57, 48, 58, - 52, 58, 48, 48, 58, 49, 48, 10, 10, 59, 40,115,111,116,115,117,103,121, - 111, 32,115,104,111,117,115,104,111, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,115,111,116,115,117,103,121,111, 58, 10, 48, 58, 49, - 52, 50, 54, 57, 99, 58, 49, 48, 58, 48, 48, 58, 51, 50, 10, 48, 58, 49, - 52, 50, 54, 97, 99, 58, 53, 48, 58, 48, 52, 58, 48, 48, 10, 10, 59, 40, - 115,111,107,111,110,117,107,101, 32,116, 97,105,115,101,110, 32,103, 97, - 109,101, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,115,111,107,111,110,117,107,101, 58, 10, 48, 58, - 50, 48, 56, 48, 48, 52, 58, 49, 48, 58, 48, 48, 58, 52, 54, 10, 48, 58, - 50, 48, 56, 48, 49, 52, 58, 52, 48, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 40,115,101, 97, 32,102,105,103,104,116,101,114, 32,112,111,115,101,105, - 100,111,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, - 102,112,111,115,101,105,100, 58, 10, 48, 58, 56, 49, 56, 56, 58, 50, 58, - 48, 48, 58, 53, 48, 10, 48, 58, 56, 49, 56, 97, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 40,115, 46,112, 46,121, 46, 32, 45, 32,115,112,101, - 99,105, 97,108, 32,112,114,111,106,101, 99,116, 32,121, 32, 40,117,115, - 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,112,121, - 58, 10,115,112,121,117, 58, 10, 48, 58, 57, 97, 48, 58, 53, 48, 58, 49, - 49, 58, 48, 48, 10, 48, 58, 56, 51, 54, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 40,115, 99,117,100, 32,104, 97,109,109,101,114, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, 99,117,100,104, 97,109, - 109, 58, 10, 48, 58,102,100, 49,101, 97, 58, 51, 99, 58, 48, 48, 58, 48, - 49, 10, 10, 59, 40,115,117,112,101,114, 32, 99,117,112, 32,102,105,110, - 97,108,115, 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99, - 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 115, 99,102,105,110, 97,108,115, 58, 10,115, 99,102,105,110, 97,108,115, - 111, 58, 10, 48, 58, 52, 49, 48,102, 55, 52, 58, 53, 48, 58, 48, 48, 58, - 102,102, 10, 10,104,116,104,101,114,111, 57, 51, 58, 10, 99,117,112,102, - 105,110, 97,108, 58, 10,104,116,104,101,114,111, 57, 51,117, 58, 10, 48, - 58, 52, 49, 48,102, 54, 48, 58, 53, 48, 58, 48, 48, 58,102,102, 10, 10, - 59, 40,115,101,110, 32,106,105,110, 32, 45, 32,103,117, 97,114,100,105, - 97,110, 32,115,116,111,114,109, 32, 40,107,111,114,101, 97, 41, 41, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,103,114,100,110,115,116, - 114,109,107, 58, 10,103,114,100,110,115,116,114,109, 58, 10,114,101,100, - 102,111,120,119,112, 50, 58, 10,103,114,100,110,115,116,114,109,118, 58, - 10,114,101,100,102,111,120,119,112, 50, 97, 58, 10,103,114,100,110,115, - 116,114,109,103, 58, 10,103,114,100,110,115,116,114,109,106, 58, 10, 48, - 58, 51, 99, 48, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 57, 56, 10, 10, - 59, 40,115,104, 97,100,111,119, 32,102,111,114, 99,101, 32, 40,117,115, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,104, 97,100, - 102,114, 99,101, 58, 10,115,104, 97,100,102,114, 99,101,106,118, 50, 58, - 10,115,104, 97,100,102,114, 99,101,106, 58, 10,115,104, 97,100,102,114, - 99,101,117, 58, 10, 48, 58, 49,102, 48, 48, 50, 97, 58, 50, 58, 48, 48, - 58, 48, 53, 10, 48, 58, 49,102, 48, 48, 50, 99, 58, 50, 54, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 49,102, 48, 48, 50, 50, 58, 52, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 40,115,104,101,114,105,102,102, 41, 32, 97,110,100, - 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 32, 10,115,104,101,114,105,102,102, 58, 10, 98, 97,110,100,105,100, - 111, 58, 10,119,101,115,116,103,117,110, 50, 58, 10, 48, 58, 54, 48,102, - 49, 58, 51, 58, 48, 58, 48, 10, 10, 59, 40,115,105,110,100, 98, 97,100, - 32,109,121,115,116,101,114,121, 41, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10,115,105,110,100, 98, 97,100,109, 58, 10, 48, 58,101, 51, - 97, 48, 58, 51, 99, 58, 48, 48, 58, 52, 98, 10, 48, 58, 99, 57, 48, 98, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,115,111,110,105, 99, 32, - 98,108, 97,115,116, 32,109, 97,110, 32, 40,106, 97,112, 97,110, 41, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, 98,109, 58, 10, - 48, 58, 49, 48, 99, 48, 48, 48, 58, 50, 58, 48, 48, 58, 55, 51, 10, 48, - 58, 49, 48, 99, 48, 48, 50, 58, 51,101, 58, 48, 49, 58, 48, 48, 10, 10, - 59, 40,115,111,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,115,111,115, 58, 10, 48, 58, 52, 48, 54, 99, 58, 50, 58, 48, 58, 48, - 10, 10, 59, 40,115,116, 97,103,103,101,114, 32,105, 32, 40,106, 97,112, - 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, - 116, 97,103,103,101,114, 49, 58, 10,114,101,100,104, 97,119,107, 98, 58, - 10,114,101,100,104, 97,119,107,101, 58, 10,114,101,100,104, 97,119,107, - 105, 58, 10,114,101,100,104, 97,119,107, 58, 10,114,101,100,104, 97,119, - 107,107, 58, 10, 48, 58, 51, 99, 48, 51, 48, 48, 58, 51, 99, 58, 48, 48, - 58, 57, 56, 10, 10, 59, 40,115,112, 97, 99,101, 32,116, 97, 99,116,105, - 99,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,116, - 97, 99,116,105, 99,115, 58, 10, 48, 58,100, 55, 48, 48, 58, 97, 58, 48, - 58, 48, 10, 48, 58,101, 55, 48, 48, 58, 97, 58, 48, 58, 48, 10, 48, 58, - 102, 55, 48, 48, 58, 97, 58, 48, 58, 48, 10, 10, 59, 40,115,112, 97, 99, - 101, 32,108, 97,115,101,114, 41, 32, 97,110,100, 32, 99,108,111,110,101, - 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10,115,112, 99, - 108, 97,115,101,114, 58, 10,108, 97,115,101,114, 58, 10, 48, 58, 50, 48, - 51, 52, 58, 50, 58, 48, 58, 48, 10, 48, 58, 50, 48, 53, 98, 58, 49, 58, - 51,100, 58, 51,100, 10, 48, 58, 50,101, 55, 48, 58, 52, 97, 49, 58, 48, - 58, 48, 10,115,112, 99,101,119, 97,114,108, 58, 10,105,110,116,114,117, - 100,101,114, 58, 10, 48, 58, 50, 48, 51, 52, 58, 50, 58, 48, 58, 48, 10, - 48, 58, 50, 48, 53, 56, 58, 49, 58, 57, 58, 57, 10, 48, 58, 50,101, 55, - 48, 58, 52, 97, 49, 58, 48, 58, 48, 10, 10, 59, 40,115,112, 97, 99,101, - 32,102,111,114,116,114,101,115,115, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,115,112, 97, 99,101,102,114,116, 58, 10, 48, 58, 49, - 99, 48, 48, 58, 49, 48, 58, 48, 48, 58, 49, 98, 10, 48, 58, 49, 99, 49, - 56, 58, 52, 52, 58, 49, 98, 58, 48, 48, 10, 10, 59, 40,115,117,112,101, - 114, 32, 98,117,103, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,115,117,112,101,114, 98,117,103, 58, 10, 48, 58, 99, 58, 49, 58, 48, - 58, 48, 10, 10, 59, 40,115,117,112,101,114, 32,112,105,110, 98, 97,108, - 108, 32, 97, 99,116,105,111,110, 32, 40,106, 97,112, 97,110, 41, 41, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,112, 98, 97, 99,116, - 110, 58, 10,115,112, 98, 97, 99,116,110,106, 58, 10, 48, 58, 52, 49, 55, - 56, 48, 58, 51, 50, 58, 48, 48, 58, 48, 53, 10, 10, 59, 40,115,117,112, - 101,114, 32,115,116,105,110,103,114, 97,121, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,115,115,116,105,110,103,114,121, 58, 10, 48, - 58, 50, 48, 48, 50, 56, 58, 52, 58, 48, 48, 58, 55, 51, 10, 48, 58, 50, - 48, 55, 55, 48, 58, 57, 48, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,115, - 121,117,115,115,101, 32,111,111,122,117,109,111,117, 32, 40,106, 97,112, - 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, - 115,111,122,117,109,111, 58, 10, 48, 58, 50, 52, 58, 51, 58, 48, 58, 48, - 10, 48, 58, 55, 49, 52, 58, 55, 52, 58, 52, 50, 58, 52, 48, 10, 10, 59, - 40,114,105,110,103, 32,114, 97,103,101, 32, 40,119,111,114,108,100, 41, - 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,114,105,110,103,114, 97,103,101, 58, 10,114, - 105,110,103,114, 97,103,101,106, 58, 10,114,105,110,103,114, 97,103,101, - 117, 58, 10, 48, 58, 52, 48,101, 54, 54, 48, 58, 51, 48, 58, 48, 48, 58, - 52, 98, 10, 48, 58, 52, 48,101, 54, 57, 48, 58, 50, 56, 48, 58, 53, 51, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,112,111,119, - 101,114, 32,103,111, 97,108, 32, 40,119,111,114,108,100, 41, 10,112,119, - 114,103,111, 97,108, 58, 10, 48, 58, 52, 49, 49, 97,101,100, 58, 56, 55, - 58, 48, 51, 58, 52, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 120, 97,105,110, 46, 99, 32, 40,120, 97,105,110, 96,100, 32,115,108,101, - 101,110, 97, 41, 40,102,105,120, 41, 10,120,115,108,101,101,110, 97, 58, - 10,120,115,108,101,101,110, 97, 98, 58, 10,115,111,108, 97,114,119, 97, - 114, 58, 10,115,111,108,114,119, 97,114,114, 58, 10,120,115,108,101,101, - 110, 97,106, 58, 10,120,115,108,101,101,110, 97, 98, 97, 58, 10, 48, 58, - 51, 51, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 98, 99, 55, 58, - 51, 99, 58, 48, 48, 58, 50, 99, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 40,112,101,114,102,101, 99,116, 32,115,111,108,100,105,101,114,115, 32, - 40,106, 97,112, 97,110, 41, 41, 10,112,115,111,108,100,105,101,114, 58, - 10,115,115,111,108,100,105,101,114, 58, 10, 48, 58,101, 49, 98, 48,102, - 58, 51, 49, 58, 49, 48, 58, 51, 49, 10, 48, 58,101, 48, 48, 51, 50, 58, - 49, 58, 48, 54, 58, 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, - 112,111,105,110,116, 32, 98,108, 97,110,107, 41, 10,112,116, 98,108, 97, - 110,107, 58, 10,112,116, 98,108, 97,110,107, 97, 58, 10, 48, 58, 50, 49, - 99, 99,100, 52, 58, 54, 52, 58, 48, 48, 58, 48, 57, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 40,118,105,100,101,111, 32,112,105,110, 98, 97,108, - 108, 41, 10,118,105,100,101,111,112,105,110, 58, 10, 48, 58, 51, 55, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 99, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 40,103,117,110, 98,105,114,100, 32, 50, 41, 32, 40, 98,121, 32, 80, 97, - 117,108, 32, 80,114,105,101,115,116, 41, 10,103,117,110, 98,105,114,100, - 50, 58, 10, 48, 58, 54, 48, 52, 99, 55, 53, 56, 58, 50, 56, 58, 48, 48, - 58, 55, 48, 10, 48, 58, 54, 48, 52, 99, 55, 56, 48, 58, 51, 99, 58, 49, - 101, 58, 48, 48, 10, 10, 59, 40,115,111,108, 32,100,105,118,105,100,101, - 41, 32, 40, 98,121, 32, 80, 97,117,108, 32, 80,114,105,101,115,116, 41, - 10,115,111,108,100,105,118,105,100, 58, 10, 48, 58, 54, 48, 48, 98, 98, - 53, 48, 58, 49, 56, 58, 48, 48, 58, 53, 48, 10, 48, 58, 54, 48, 48, 98, - 98, 54, 56, 58, 49,101, 58, 50, 52, 58, 48, 50, 10, 10, 59, 40,115,116, - 114,105,107,101,114,115, 32, 49, 57, 52, 53, 32,105,105, 41, 32, 40, 98, - 121, 32, 80, 97,117,108, 32, 80,114,105,101,115,116, 41, 10,115, 49, 57, - 52, 53,105,105, 58, 10, 48, 58, 54, 48, 48, 99, 52,101, 99, 58, 50, 56, - 58, 48, 48, 58, 55, 48, 10, 48, 58, 54, 48, 48, 99, 53, 49, 52, 58, 51, - 99, 58, 49,101, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, - 118, 97,109,112,105,114,101, 32,115, 97,118,105,111,114, 32, 50, 58, 32, - 116,104,101, 32,108,111,114,100, 32,111,102, 32,118, 97,109,112,105,114, - 101, 32, 40,106, 97,112, 97,110, 32, 57, 55, 48, 57, 49, 51, 41, 10,118, - 115, 97,118, 50, 58, 10,118,115, 97,118, 50,100, 58, 10, 48, 58,102,102, - 102, 52, 50, 54, 58, 49, 98,102, 58, 48, 48, 58, 48, 51, 10, 10, 59, 40, - 116,114,105, 99,107, 32,116,114, 97,112, 32, 40,119,111,114,108,100, 63, - 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,116,114,105, 99,107,116,114,112, 58, 10, - 108, 97, 98,121,114,117,110,114, 58, 10,108, 97, 98,121,114,117,110,114, - 107, 58, 10, 48, 58, 50, 50, 97, 48, 58, 52, 48, 58, 48, 48, 58, 53, 51, - 10, 48, 58, 50, 51, 48, 56, 58, 52, 58, 48, 58, 48, 10, 10, 59, 40,116, - 111,114,121,117,109,111,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10,116,111,114,121,117,109,111,110, 58, 10, 48, 58,102,102,102, - 101, 50, 48, 58, 50, 56, 58, 48, 58, 48, 10, 10, 59, 40,116, 97, 99,116, + 110, 41, 13, 10,115,112,108,110,100,114, 98,116, 58, 13, 10, 48, 58, 52, + 48, 56, 52, 48, 58, 49, 54, 56, 58, 53, 51, 58, 48, 49, 13, 10, 48, 58, + 52, 48, 48, 50, 48, 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, + 40,115,112, 97, 99,101, 32,107,105,110,103, 32, 50, 41, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,115,112, 99,107,105,110,103, 50, + 58, 13, 10, 48, 58, 49, 99,102, 52, 58, 50, 58, 48, 58, 48, 13, 10, 13, + 10, 59, 40, 98,101, 97,115,116, 32, 98,117,115,116,101,114,115, 32, 40, + 119,111,114,108,100, 32, 63, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 13, 10, 98, 98,117,115,116,101,114,115, 58, 13, 10, 98, 98, + 117,115,116,101,114,115,117, 97, 58, 13, 10, 98, 98,117,115,116,101,114, + 115,117, 58, 13, 10, 48, 58, 56, 97, 53, 55, 56, 58, 50, 58, 48, 48, 58, + 48, 50, 13, 10, 48, 58, 56, 97, 53, 55, 97, 58, 98,101, 58, 51, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 40, 98,105,114,100,105,101, 32,107,105,110, + 103, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,107, + 105,110,103, 58, 13, 10, 48, 58, 56, 49, 54, 49, 58, 57, 58, 48, 58, 48, + 13, 10, 48, 58, 56, 49, 55, 53, 58, 49, 58, 48, 58, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,114,101,100, 32,114,111, 98,105, + 110, 41, 13, 10,114,101,100,114,111, 98,105,110, 58, 13, 10, 48, 58, 99, + 55, 52, 51, 58, 51, 98, 58, 49, 98, 58, 48, 48, 13, 10, 48, 58, 99, 54, + 101, 54, 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 40,109,111,110,116,101, 32, 99, 97,114,108,111, 41, + 13, 10,109,111,110,116,101, 99, 97,114, 58, 13, 10, 48, 58, 98, 54, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 40,109, 97, 99,114,111,115,115, 32,112,108,117,115, 41, 13, 10, + 109, 97, 99,114,111,115,115,112, 58, 13, 10, 48, 58,102, 49, 54,100,100, + 99, 58, 53,101, 58, 48, 48, 58, 49, 52, 13, 10, 13, 10, 59, 40, 99, 97, + 115,115,101,116,116,101, 58, 32,108,111, 99,107, 39,110, 39, 99,104, 97, + 115,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99, + 108,111, 99,107,110, 99,104, 58, 13, 10, 48, 58, 97, 58, 51, 58, 48, 58, + 48, 13, 10, 48, 58, 98, 56, 48, 48, 58,102, 58, 48, 58, 48, 13, 10, 48, + 58, 98, 56, 49, 48, 58, 49, 49, 58,102,102, 58, 48, 13, 10, 13, 10, 59, + 40, 99, 97,115,115,101,116,116,101, 58, 32,102,105,103,104,116,105,110, + 103, 32,105, 99,101, 32,104,111, 99,107,101,121, 41, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10, 99,102,103,104,116,105, 99,101, 58, + 13, 10, 48, 58, 99, 50, 58, 51, 58, 48, 50, 58, 48, 13, 10, 48, 58, 52, + 98, 48, 57, 58, 53, 48, 58, 50, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40, + 99, 97,115,115,101,116,116,101, 58, 32,100,105,115, 99,111, 32,110,111, + 32, 49, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,100,105,115, 99,111,110, 49, + 58, 13, 10, 99,115,119,101,101,116,104,116, 58, 13, 10, 48, 58, 56, 58, + 51, 58, 48, 58, 48, 13, 10, 48, 58, 52, 48, 48, 58, 50, 49, 58, 48, 58, + 48, 13, 10, 13, 10, 59, 40, 99, 97,115,115,101,116,116,101, 58, 32, 98, + 117,109,112, 32,110, 32,106,117,109,112, 41, 32, 97,110,100, 32, 99,108, + 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 99, 98,117,114,110,114,117, 98, 58, 13, 10, 99, 98,110,106, 58, 13, 10, + 99, 98,117,114,110,114,117, 98, 50, 58, 13, 10, 48, 58, 57, 58, 51, 58, + 49, 50, 58, 48, 49, 13, 10, 48, 58, 55, 56, 48, 48, 58,102, 58, 48, 49, + 58, 56, 50, 13, 10, 48, 58, 57, 56, 48, 48, 58,102, 58, 52,100, 58, 52, + 100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,115,117,112, + 101,114, 32,115,104, 97,110,103,104, 97,105, 32,100,114, 97,103,111,110, + 96,115, 32,101,121,101, 32, 40,119,111,114,108,100, 44, 98,111,111,116, + 108,101,103, 41, 41, 13, 10,115,115,104, 97,110,103,104, 97, 98, 58, 13, + 10,115,115,104, 97,110,103,104, 97, 58, 13, 10, 48, 58,102,101, 99, 52, + 55, 56, 58, 49, 51,102, 58, 48, 48, 58, 49, 99, 13, 10, 13, 10, 59, 40, + 97,109,101,114,105, 99, 97,110, 32,104,111,114,115,101,115,104,111,101, + 115, 32, 40,117,115, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,104,111,114,115,104,111,101,115, 58, 13, 10, 48, 58, 56,101, + 49, 99, 58, 50, 58, 48, 58, 48, 13, 10, 48, 58, 56,102, 51, 55, 58, 49, + 58, 48, 58, 48, 13, 10, 48, 58, 56,102,102, 48, 58, 49, 58, 48, 58, 48, + 13, 10, 48, 58, 56, 98,100, 48, 58, 49, 58, 52, 99, 58, 52, 99, 13, 10, + 13, 10, 59, 40,101,120,118, 97,110,105, 97, 32, 40,106, 97,112, 97,110, + 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,101,120, + 118, 97,110,105, 97, 58, 13, 10,101,120,118, 97,110,105, 97,106, 58, 13, + 10, 48, 58, 50, 49, 52,101,101, 56, 58, 50, 56, 58, 53, 48, 58, 48, 50, + 13, 10, 13, 10, 59, 40,103,117,110, 98,117,115,116,101,114, 32, 40,106, + 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,103,117,110, 98,117,115,116,114, 58, 13, 10,103,117,110, 98,117, + 115,116,114,117, 58, 13, 10,103,117,110, 98,117,115,116,114,106, 58, 13, + 10, 48, 58, 50, 48, 51, 50, 97, 48, 58, 50, 58, 48, 48, 58, 50, 49, 13, + 10, 48, 58, 50, 48, 51, 50, 97, 50, 58, 57,101, 58, 49, 51, 58, 48, 48, + 13, 10, 13, 10, 59, 40,121, 97,109, 97,116,111, 32, 40,115,101,116, 32, + 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,121, 97,109, 97,116,111, 58, 13, + 10,121, 97,109, 97,116,111, 50, 58, 13, 10, 48, 58, 54, 49, 48, 48, 58, + 53, 48, 58, 48, 48, 58,102,102, 13, 10, 48, 58, 54, 48, 51, 56, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,117,115, 32, 97, 97,102, + 32,109,117,115,116, 97,110,103, 32, 40,106, 97,112, 97,110, 41, 41, 32, + 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10,109,117,115,116, 97,110,103, 58, 13, 10,109,117, + 115,116, 97,110,103, 98, 58, 13, 10,109,117,115,116, 97,110,103,115, 58, + 13, 10,109,117,115,116, 97,110,103, 98, 50, 58, 13, 10, 48, 58,102, 57, + 48, 57, 48, 58, 52, 58, 48, 48, 58, 49, 48, 13, 10, 13, 10, 59, 40,115, + 111,116,115,117,103,121,111, 32,115,104,111,117,115,104,111, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,111,116,115,117,103, + 121,111, 58, 13, 10, 48, 58, 49, 52, 50, 54, 57, 99, 58, 49, 48, 58, 48, + 48, 58, 51, 50, 13, 10, 48, 58, 49, 52, 50, 54, 97, 99, 58, 53, 48, 58, + 48, 52, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,111,107,111,110,117,107, + 101, 32,116, 97,105,115,101,110, 32,103, 97,109,101, 32, 40,106, 97,112, + 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 115,111,107,111,110,117,107,101, 58, 13, 10, 48, 58, 50, 48, 56, 48, 48, + 52, 58, 49, 48, 58, 48, 48, 58, 52, 54, 13, 10, 48, 58, 50, 48, 56, 48, + 49, 52, 58, 52, 48, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115, + 101, 97, 32,102,105,103,104,116,101,114, 32,112,111,115,101,105,100,111, + 110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,102, + 112,111,115,101,105,100, 58, 13, 10, 48, 58, 56, 49, 56, 56, 58, 50, 58, + 48, 48, 58, 53, 48, 13, 10, 48, 58, 56, 49, 56, 97, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 40,115, 46,112, 46,121, 46, 32, 45, 32, + 115,112,101, 99,105, 97,108, 32,112,114,111,106,101, 99,116, 32,121, 32, + 40,117,115, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,115,112,121, 58, 13, 10,115,112,121,117, 58, 13, 10, 48, 58, 57, 97, + 48, 58, 53, 48, 58, 49, 49, 58, 48, 48, 13, 10, 48, 58, 56, 51, 54, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115, 99,117,100, 32, + 104, 97,109,109,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,115, 99,117,100,104, 97,109,109, 58, 13, 10, 48, 58,102,100, + 49,101, 97, 58, 51, 99, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 40, + 115,117,112,101,114, 32, 99,117,112, 32,102,105,110, 97,108,115, 32, 40, + 119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115, 99,102,105, + 110, 97,108,115, 58, 13, 10,115, 99,102,105,110, 97,108,115,111, 58, 13, + 10, 48, 58, 52, 49, 48,102, 55, 52, 58, 53, 48, 58, 48, 48, 58,102,102, + 13, 10, 13, 10,104,116,104,101,114,111, 57, 51, 58, 13, 10, 99,117,112, + 102,105,110, 97,108, 58, 13, 10,104,116,104,101,114,111, 57, 51,117, 58, + 13, 10, 48, 58, 52, 49, 48,102, 54, 48, 58, 53, 48, 58, 48, 48, 58,102, + 102, 13, 10, 13, 10, 59, 40,115,101,110, 32,106,105,110, 32, 45, 32,103, + 117, 97,114,100,105, 97,110, 32,115,116,111,114,109, 32, 40,107,111,114, + 101, 97, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 103,114,100,110,115,116,114,109,107, 58, 13, 10,103,114,100,110,115,116, + 114,109, 58, 13, 10,114,101,100,102,111,120,119,112, 50, 58, 13, 10,103, + 114,100,110,115,116,114,109,118, 58, 13, 10,114,101,100,102,111,120,119, + 112, 50, 97, 58, 13, 10,103,114,100,110,115,116,114,109,103, 58, 13, 10, + 103,114,100,110,115,116,114,109,106, 58, 13, 10, 48, 58, 51, 99, 48, 51, + 48, 48, 58, 51, 99, 58, 48, 48, 58, 57, 56, 13, 10, 13, 10, 59, 40,115, + 104, 97,100,111,119, 32,102,111,114, 99,101, 32, 40,117,115, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,104, 97,100,102,114, + 99,101, 58, 13, 10,115,104, 97,100,102,114, 99,101,106,118, 50, 58, 13, + 10,115,104, 97,100,102,114, 99,101,106, 58, 13, 10,115,104, 97,100,102, + 114, 99,101,117, 58, 13, 10, 48, 58, 49,102, 48, 48, 50, 97, 58, 50, 58, + 48, 48, 58, 48, 53, 13, 10, 48, 58, 49,102, 48, 48, 50, 99, 58, 50, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49,102, 48, 48, 50, 50, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,104,101,114,105,102, + 102, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,115,104,101,114,105,102,102, 58, 13, + 10, 98, 97,110,100,105,100,111, 58, 13, 10,119,101,115,116,103,117,110, + 50, 58, 13, 10, 48, 58, 54, 48,102, 49, 58, 51, 58, 48, 58, 48, 13, 10, + 13, 10, 59, 40,115,105,110,100, 98, 97,100, 32,109,121,115,116,101,114, + 121, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,105, + 110,100, 98, 97,100,109, 58, 13, 10, 48, 58,101, 51, 97, 48, 58, 51, 99, + 58, 48, 48, 58, 52, 98, 13, 10, 48, 58, 99, 57, 48, 98, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,111,110,105, 99, 32, 98,108, + 97,115,116, 32,109, 97,110, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115, 98,109, 58, 13, 10, + 48, 58, 49, 48, 99, 48, 48, 48, 58, 50, 58, 48, 48, 58, 55, 51, 13, 10, + 48, 58, 49, 48, 99, 48, 48, 50, 58, 51,101, 58, 48, 49, 58, 48, 48, 13, + 10, 13, 10, 59, 40,115,111,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 13, 10,115,111,115, 58, 13, 10, 48, 58, 52, 48, 54, 99, 58, + 50, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,115,116, 97,103,103,101,114, + 32,105, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,115,116, 97,103,103,101,114, 49, 58, 13, 10, + 114,101,100,104, 97,119,107, 98, 58, 13, 10,114,101,100,104, 97,119,107, + 101, 58, 13, 10,114,101,100,104, 97,119,107,105, 58, 13, 10,114,101,100, + 104, 97,119,107, 58, 13, 10,114,101,100,104, 97,119,107,107, 58, 13, 10, + 48, 58, 51, 99, 48, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 57, 56, 13, + 10, 13, 10, 59, 40,115,112, 97, 99,101, 32,116, 97, 99,116,105, 99,115, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,116, 97, + 99,116,105, 99,115, 58, 13, 10, 48, 58,100, 55, 48, 48, 58, 97, 58, 48, + 58, 48, 13, 10, 48, 58,101, 55, 48, 48, 58, 97, 58, 48, 58, 48, 13, 10, + 48, 58,102, 55, 48, 48, 58, 97, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40, + 115,112, 97, 99,101, 32,108, 97,115,101,114, 41, 32, 97,110,100, 32, 99, + 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,115,112, 99,108, 97,115,101,114, 58, 13, 10,108, 97,115,101,114, 58, + 13, 10, 48, 58, 50, 48, 51, 52, 58, 50, 58, 48, 58, 48, 13, 10, 48, 58, + 50, 48, 53, 98, 58, 49, 58, 51,100, 58, 51,100, 13, 10, 48, 58, 50,101, + 55, 48, 58, 52, 97, 49, 58, 48, 58, 48, 13, 10,115,112, 99,101,119, 97, + 114,108, 58, 13, 10,105,110,116,114,117,100,101,114, 58, 13, 10, 48, 58, + 50, 48, 51, 52, 58, 50, 58, 48, 58, 48, 13, 10, 48, 58, 50, 48, 53, 56, + 58, 49, 58, 57, 58, 57, 13, 10, 48, 58, 50,101, 55, 48, 58, 52, 97, 49, + 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,115,112, 97, 99,101, 32,102,111, + 114,116,114,101,115,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,115,112, 97, 99,101,102,114,116, 58, 13, 10, 48, 58, 49, 99, + 48, 48, 58, 49, 48, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58, 49, 99, 49, + 56, 58, 52, 52, 58, 49, 98, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,117, + 112,101,114, 32, 98,117,103, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,115,117,112,101,114, 98,117,103, 58, 13, 10, 48, 58, 99, + 58, 49, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,115,117,112,101,114, 32, + 112,105,110, 98, 97,108,108, 32, 97, 99,116,105,111,110, 32, 40,106, 97, + 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,115,112, 98, 97, 99,116,110, 58, 13, 10,115,112, 98, 97, 99,116,110, + 106, 58, 13, 10, 48, 58, 52, 49, 55, 56, 48, 58, 51, 50, 58, 48, 48, 58, + 48, 53, 13, 10, 13, 10, 59, 40,115,117,112,101,114, 32,115,116,105,110, + 103,114, 97,121, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,115,115,116,105,110,103,114,121, 58, 13, 10, 48, 58, 50, 48, 48, 50, + 56, 58, 52, 58, 48, 48, 58, 55, 51, 13, 10, 48, 58, 50, 48, 55, 55, 48, + 58, 57, 48, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,121,117, + 115,115,101, 32,111,111,122,117,109,111,117, 32, 40,106, 97,112, 97,110, + 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,115, + 111,122,117,109,111, 58, 13, 10, 48, 58, 50, 52, 58, 51, 58, 48, 58, 48, + 13, 10, 48, 58, 55, 49, 52, 58, 55, 52, 58, 52, 50, 58, 52, 48, 13, 10, + 13, 10, 59, 40,114,105,110,103, 32,114, 97,103,101, 32, 40,119,111,114, + 108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,114,105,110,103,114, 97,103, + 101, 58, 13, 10,114,105,110,103,114, 97,103,101,106, 58, 13, 10,114,105, + 110,103,114, 97,103,101,117, 58, 13, 10, 48, 58, 52, 48,101, 54, 54, 48, + 58, 51, 48, 58, 48, 48, 58, 52, 98, 13, 10, 48, 58, 52, 48,101, 54, 57, + 48, 58, 50, 56, 48, 58, 53, 51, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 40,112,111,119,101,114, 32,103,111, 97,108, 32, + 40,119,111,114,108,100, 41, 13, 10,112,119,114,103,111, 97,108, 58, 13, + 10, 48, 58, 52, 49, 49, 97,101,100, 58, 56, 55, 58, 48, 51, 58, 52, 54, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,120, 97,105,110, + 46, 99, 32, 40,120, 97,105,110, 96,100, 32,115,108,101,101,110, 97, 41, + 40,102,105,120, 41, 13, 10,120,115,108,101,101,110, 97, 58, 13, 10,120, + 115,108,101,101,110, 97, 98, 58, 13, 10,115,111,108, 97,114,119, 97,114, + 58, 13, 10,115,111,108,114,119, 97,114,114, 58, 13, 10,120,115,108,101, + 101,110, 97,106, 58, 13, 10,120,115,108,101,101,110, 97, 98, 97, 58, 13, + 10, 48, 58, 51, 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, + 98, 99, 55, 58, 51, 99, 58, 48, 48, 58, 50, 99, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 40,112,101,114,102,101, 99,116, 32,115,111,108, + 100,105,101,114,115, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,112,115, + 111,108,100,105,101,114, 58, 13, 10,115,115,111,108,100,105,101,114, 58, + 13, 10, 48, 58,101, 49, 98, 48,102, 58, 51, 49, 58, 49, 48, 58, 51, 49, + 13, 10, 48, 58,101, 48, 48, 51, 50, 58, 49, 58, 48, 54, 58, 48, 54, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40,112,111,105,110,116, 32, + 98,108, 97,110,107, 41, 13, 10,112,116, 98,108, 97,110,107, 58, 13, 10, + 112,116, 98,108, 97,110,107, 97, 58, 13, 10, 48, 58, 50, 49, 99, 99,100, + 52, 58, 54, 52, 58, 48, 48, 58, 48, 57, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 40,118,105,100,101,111, 32,112,105,110, 98, 97,108,108, + 41, 13, 10,118,105,100,101,111,112,105,110, 58, 13, 10, 48, 58, 51, 55, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 99, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 52, 49, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 40,103,117,110, 98,105,114,100, 32, 50, 41, 32, 40, + 98,121, 32, 80, 97,117,108, 32, 80,114,105,101,115,116, 41, 13, 10,103, + 117,110, 98,105,114,100, 50, 58, 13, 10, 48, 58, 54, 48, 52, 99, 55, 53, + 56, 58, 50, 56, 58, 48, 48, 58, 55, 48, 13, 10, 48, 58, 54, 48, 52, 99, + 55, 56, 48, 58, 51, 99, 58, 49,101, 58, 48, 48, 13, 10, 13, 10, 59, 40, + 115,111,108, 32,100,105,118,105,100,101, 41, 32, 40, 98,121, 32, 80, 97, + 117,108, 32, 80,114,105,101,115,116, 41, 13, 10,115,111,108,100,105,118, + 105,100, 58, 13, 10, 48, 58, 54, 48, 48, 98, 98, 53, 48, 58, 49, 56, 58, + 48, 48, 58, 53, 48, 13, 10, 48, 58, 54, 48, 48, 98, 98, 54, 56, 58, 49, + 101, 58, 50, 52, 58, 48, 50, 13, 10, 13, 10, 59, 40,115,116,114,105,107, + 101,114,115, 32, 49, 57, 52, 53, 32,105,105, 41, 32, 40, 98,121, 32, 80, + 97,117,108, 32, 80,114,105,101,115,116, 41, 13, 10,115, 49, 57, 52, 53, + 105,105, 58, 13, 10, 48, 58, 54, 48, 48, 99, 52,101, 99, 58, 50, 56, 58, + 48, 48, 58, 55, 48, 13, 10, 48, 58, 54, 48, 48, 99, 53, 49, 52, 58, 51, + 99, 58, 49,101, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 40,118, 97,109,112,105,114,101, 32,115, 97,118,105,111,114, 32, 50, + 58, 32,116,104,101, 32,108,111,114,100, 32,111,102, 32,118, 97,109,112, + 105,114,101, 32, 40,106, 97,112, 97,110, 32, 57, 55, 48, 57, 49, 51, 41, + 13, 10,118,115, 97,118, 50, 58, 13, 10,118,115, 97,118, 50,100, 58, 13, + 10, 48, 58,102,102,102, 52, 50, 54, 58, 49, 98,102, 58, 48, 48, 58, 48, + 51, 13, 10, 13, 10, 59, 40,116,114,105, 99,107, 32,116,114, 97,112, 32, + 40,119,111,114,108,100, 63, 41, 41, 32, 97,110,100, 32, 99,108,111,110, + 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116,114, + 105, 99,107,116,114,112, 58, 13, 10,108, 97, 98,121,114,117,110,114, 58, + 13, 10,108, 97, 98,121,114,117,110,114,107, 58, 13, 10, 48, 58, 50, 50, + 97, 48, 58, 52, 48, 58, 48, 48, 58, 53, 51, 13, 10, 48, 58, 50, 51, 48, + 56, 58, 52, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,116,111,114,121,117, + 109,111,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 116,111,114,121,117,109,111,110, 58, 13, 10, 48, 58,102,102,102,101, 50, + 48, 58, 50, 56, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,116, 97, 99,116, 105, 99,105, 97,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,116, 97, 99,116, 99,105, 97,110, 58, 10, 48, 58, 57, 56, 97, 56, 58, - 51, 58, 48, 58, 48, 10, 48, 58, 56, 48, 52, 56, 58, 49, 52, 48, 58, 48, - 48, 58, 49, 48, 10, 48, 58, 56, 48, 50, 56, 58, 50, 48, 58, 48, 48, 58, - 49, 48, 10, 10,116, 97, 99,116, 99,105, 97,110, 50, 58, 10, 48, 58, 57, - 56, 97, 56, 58, 51, 58, 56, 48, 58, 48, 48, 10, 48, 58, 56, 48, 52, 56, - 58, 49, 52, 48, 58, 56, 48, 58, 49, 48, 10, 48, 58, 56, 48, 50, 56, 58, - 50, 48, 58, 48, 48, 58, 49, 48, 10, 10, 59, 40,116,111,112, 32,114, 97, - 110,107,105,110,103, 32,115,116, 97,114,115, 32, 40,119,111,114,108,100, - 32,110,101,119, 32,118,101,114,115,105,111,110, 41, 41, 32, 97,110,100, - 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10,116,114,115,116, 97,114, 58, 10,116,114,115,116, 97,114,106, 58, - 10,116,114,115,116, 97,114,111, 58, 10,116,114,115,116, 97,114,111,106, - 58, 10,112,114,109,116,109,102,103,116, 58, 10,112,114,109,116,109,102, - 103,116,111, 58, 10, 48, 58, 52, 49, 51,100, 49, 48, 58, 50, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52, 49, 51,100, 49, 50, 58, 55,102,101, 58, 49, - 51, 58, 48, 48, 10, 10, 59, 40,110,111, 32,109, 97,110, 39,115, 32,108, - 97,110,100, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,110, - 111,109,110,108,110,100, 58, 10,110,111,109,110,108,110,100,103, 58, 10, - 48, 58, 54, 48, 48, 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, - 99, 53,100, 58, 54, 99, 48, 58,102,102, 58, 48, 48, 10, 10, 59, 40,110, - 105,103,104,116, 32,100,114,105,118,101,114, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 32, 45, 32, 72,105,115, 99,111,114,101, 32,105, - 115, 32,117,112,100, 97,116,101,100, 32,119,104,101,110, 32,110,101,119, - 32,103, 97,109,101, 32,115,116, 97,114,116,115, 33, 10,110,105,116,101, - 100,114,118,114, 58, 10, 48, 58, 97, 48, 58, 99, 58, 48, 58, 48, 10, 48, - 58, 49, 51, 48, 58, 49, 58, 53, 50, 58, 53, 50, 10, 10, 59, 40,110, 97, - 109, 99,111, 32, 99,108, 97,115,115,105, 99,115, 32,118,111,108, 46, 32, - 49, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 32, 45, 32, 65, 76, 76, 32,103, 97,109,101, - 115, 32, 77, 85, 83, 84, 32,114,117,110, 32,116,104,114,111,117,103,104, - 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 98,101,102,111, - 114,101, 32,115,116, 97,114,116,105,110,103, 32, 97, 32,110,101,119, 32, - 103, 97,109,101, 33, 10,110, 99,118, 49, 58, 10,110, 99,118, 49,106, 58, - 10,110, 99,118, 49,106, 50, 58, 10, 48, 58, 52, 48, 48, 57, 49, 52, 58, - 50,101,101, 58, 48, 55, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 40,111,117,116,102,111,120,105,101,115, 41, 10,111,117,116,102, - 120,105,101,115,106, 58, 10,111,117,116,102,120,105,101,115, 58, 10, 48, - 58, 50, 51, 54, 50, 49, 48, 58, 51,101, 58, 48, 48, 58, 53,102, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,111,114,105,101,110,116, 97,108, - 32,108,101,103,101,110,100, 41, 10,111,114,108,101,103,101,110,100, 58, - 10,111,114,108,101,103,101,110,100,101, 58, 10,111,114,108,101,103,101, - 110,100, 99, 58, 10, 48, 58, 56, 49, 49, 57, 52, 54, 58,100, 52, 58, 52, - 57, 58, 98, 48, 10, 10,111,114,108,101,103,101,110,100, 49, 48, 53,107, - 58, 10, 48, 58, 56, 49, 49, 57, 49, 56, 58,100, 52, 58, 52, 57, 58, 98, - 48, 10, 10,111,114,108,101,103,101,110,100, 49, 49, 49, 99, 58, 10,111, - 114,108,101,103,101,110,100, 49, 49, 49,116, 58, 10,111,114,108,101,103, - 101,110,100, 49, 49, 49,107, 58, 10, 48, 58, 56, 49, 49, 57, 49,101, 58, - 100, 52, 58, 52, 57, 58, 98, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 40,107,111,107,111,110,116,111,117,122, 97,105, 32,101,116,111, 32, - 109,111,110,111,103, 97,116, 97,114,105, 32, 40,106, 97,112, 97,110, 41, - 41, 10,101,116,111, 58, 10, 48, 58, 50, 48, 50,100, 48, 56, 58, 51, 48, - 58, 51, 55, 58,100, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40, - 103,111,108,102,105,110,103, 32,103,114,101, 97,116,115, 41, 10,103,108, - 102,103,114,101, 97,116, 58, 10, 48, 58, 49, 48, 48, 51, 50, 48, 58, 53, - 48, 58, 52, 49, 58, 57, 10, 48, 58, 49, 48, 48, 52, 48, 48, 58, 53, 48, - 58, 52, 49, 58, 57, 10, 10, 59, 40,109,101,116, 97,109,111,113,101,115, - 116,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,109, - 101,116,109,113,115,116,114, 58, 10, 48, 58,102, 48, 56, 48,101, 48, 58, - 49, 48, 48, 58, 48, 97, 58, 48, 49, 10, 10,110,109, 97,115,116,101,114, - 58, 10, 48, 58,102, 48, 56, 49, 48, 48, 58,101, 48, 58, 51, 48, 58, 48, - 49, 10, 10, 59, 40,109, 97,106,111,114, 32,116,105,116,108,101, 32, 50, - 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110, - 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,109, 97,106, - 116,105,116,108, 50, 58, 10,115,107,105,110,103, 97,109,101, 58, 10,115, - 107,105,110,103, 97,109,101, 50, 58, 10,109, 97,106,116,105,116,108, 50, - 98, 58, 10, 48, 58,101,100, 53, 52, 50, 58, 49, 52, 48, 58, 52,100, 58, - 48, 48, 10, 10,109, 97,106,116,105,116,108, 50,106, 58, 10, 48, 58,101, - 100, 53, 52, 50, 58, 49, 52, 48, 58, 52, 98, 58, 48, 48, 10, 10, 59, 40, - 109, 97,106,111,114, 32,108,101, 97,103,117,101, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,109,106,108,101, 97,103,117,101, 58, 10, - 48, 58,102,102,101, 48, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, - 10, 59, 40,109,105,103,104,116,121, 32,103,117,121, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,109,105,103,104,116,103,117,121, 58, - 10, 48, 58, 99, 48, 53, 53, 58, 55, 53, 58, 48, 48, 58, 52, 49, 10, 10, - 59, 40,109, 97,110,121, 32, 98,108,111, 99,107, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,109, 97,110,121, 98,108,111, 99, 58, 10, - 48, 58,102, 48, 48, 53, 48, 58, 52, 58, 48, 48, 58, 49, 57, 10, 48, 58, - 102, 48, 48, 53, 52, 58, 57, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, - 48, 51, 98, 50, 58, 54, 58, 48, 58, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 40,104,121,112,101,114, 32,112, 97, 99,109, 97,110, 32, 40, - 98,111,111,116,108,101,103, 41, 41, 10,104,121,112,101,114,112, 97, 99, - 98, 58, 10, 48, 58, 49, 48, 53, 51, 53, 99, 58, 50, 56, 58, 53, 48, 58, - 48, 48, 10, 48, 58, 49, 48, 53, 51, 55,101, 58, 49, 58, 52, 51, 58, 52, - 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95, - 102, 51, 46, 99, 32, 40,108, 97,110,100,109, 97,107,101,114, 32, 40,106, - 97,112, 97,110, 41, 41, 10,108, 97,110,100,109, 97,107,114, 58, 10,108, - 97,110,100,109, 97,107,114,112, 58, 10, 48, 58, 52, 48,102, 99, 51, 48, - 58, 50, 56, 58, 48, 48, 58, 53, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,110,109,107, 49, 54, 46, 99, 32, 40,107,111,117,116,101,116,115, - 117, 32,121,111,117,115, 97,105, 32,115,116,114, 97,104,108, 32, 40,106, - 97,112, 97,110, 32,115,101,116, 32, 49, 41, 41, 10,115,116,114, 97,104, - 108, 58, 10, 48, 58,102, 51, 48,100, 57, 58, 49, 56,102, 58, 53, 53, 58, - 56, 56, 10, 48, 58,102, 48,100, 56, 97, 58, 52, 58, 48, 48, 58, 53, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, 97, - 49, 46, 99, 32, 40,107,110,117, 99,107,108,101, 32,104,101, 97,100,115, - 32, 40,119,111,114,108,100, 41, 41, 10,107,110, 99,107,104,101, 97,100, - 58, 10,107,110, 99,107,104,101, 97,100,106, 58, 10, 48, 58, 50, 48, 57, - 51, 55, 50, 58, 50, 55, 58, 48, 48, 58, 52, 99, 10, 48, 58, 50, 48, 57, - 51, 55, 51, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, 40,103, 97,108, - 97, 99,116,105, 99, 32,119, 97,114,114,105,111,114,115, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,103,119, 97,114,114,105,111,114, - 58, 10, 48, 58, 49, 97, 52,102, 54, 58, 53, 48, 58, 48, 48, 58, 48, 49, - 10, 48, 58, 49,102, 55, 50,102, 58, 51, 58, 48, 48, 58, 56, 53, 10, 10, - 59, 40,103,114, 97,110,100, 32, 99,114,111,115,115, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,103, 99,112,105,110, 98, 97,108, 58, - 10, 48, 58,102,102, 50, 51, 49, 56, 58, 50, 58, 48, 48, 58, 48, 50, 10, - 48, 58,102,102, 50, 51, 49, 97, 58, 54,101, 58, 56, 49, 58, 48, 48, 10, - 48, 58,102,102, 48, 48, 48,101, 58, 55, 48, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, 50, 46, 99, 32, - 40,105, 99,104,105,100, 97,110,116, 45,114, 32, 40,112,117,122,122,108, - 101, 95, 97, 99,116,105,111,110, 32, 50, 32, 40,101,110,103,108,105,115, - 104, 32, 38, 32,106, 97,112, 97,110, 41, 41, 41, 10,105, 99,104,105,114, - 106, 58, 10,105, 99,104,105,100,110,116,101, 58, 10, 48, 58,102,102,102, - 99, 51,100, 58, 50, 55, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42,105,113, 98,108,111, 99,107, 46, 99, 32, 40,105,113, 45, - 98,108,111, 99,107, 41, 10,105,113, 98,108,111, 99,107, 58, 10, 48, 58, - 102, 49, 52, 57, 58, 50, 55, 58, 52, 49, 58, 48, 48, 10, 48, 58,102, 49, - 97, 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 49, 54,101, 58, - 49, 58, 49, 51, 58, 49, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,101, - 112,111,115, 46, 99, 32, 40,105,103,109,111, 41, 32, 10, 59, 42, 42, 32, - 111,110,108,121, 32,115, 97,118,101,115, 32,116,111,112, 32,115, 99,111, - 114,101, 32, 42, 42, 10,105,103,109,111, 58, 10, 48, 58, 55, 56, 52, 97, - 58, 51, 99, 58, 49, 48, 58, 48, 48, 10, 48, 58, 55, 56, 48, 53, 58, 49, - 58,102, 52, 58,102, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101, - 103, 97,115,121,115, 49, 46, 99, 32, 40,105,103, 97, 32,110,105,110,106, - 121,117,116,115,117,100,101,110, 32, 40,106, 97,112, 97,110, 41, 41, 10, - 105,103, 97,110,105,110,106,117, 58, 10, 48, 58,102, 48, 48, 48, 52, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 52, 48, 48, 49, 58, 57, 55, - 58, 50, 48, 58, 97, 99, 10, 48, 58,102, 48, 48, 49, 48, 58, 56, 58, 51, - 48, 58, 51, 48, 10, 10, 59, 40,114,101, 99,111,114,100, 98,114,101, 97, - 107,101,114, 32, 40,119,111,114,108,100, 41, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,114,101, 99,111,114,100, 98,114, 58, 10, 48, - 58, 49, 48, 51, 52,101,101, 58, 49,101, 48, 58, 48, 48, 58, 52, 53, 10, - 10,102,103,104,116, 97,116, 99,107, 58, 10,102, 97, 58, 10, 48, 58, 49, - 102, 97, 97, 56, 58,102, 50, 58, 48, 48, 58, 48, 51, 10, 48, 58, 49, 49, - 50, 50, 58, 52, 58, 48, 58, 48, 10, 10, 59, 40,102, 97,115,116, 32,108, - 97,110,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,102, - 97,115,116,108, 97,110,101, 58, 10, 48, 58, 51, 50, 97, 48, 58, 53, 48, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 51, 48, 57, 58, 51, 58, 48, 50, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120,121,111,110, - 105,120, 46, 99, 32, 40,120,121,111,110,105,120, 41, 10,120,121,111,110, - 105,120, 58, 10, 48, 58,100, 53, 48, 48, 58, 49, 51,102, 58, 52,102, 58, - 48, 48, 10, 48, 58,100, 54, 51, 57, 58, 49, 58, 48, 56, 58, 48, 56, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, 97, 49, - 46, 99, 32, 40, 99,111,115,109,111, 32,103, 97,110,103, 32,116,104,101, - 32,112,117,122,122,108,101, 32, 40,117,115, 41, 41, 10, 99,103, 97,110, - 103,112,122,108, 58, 10, 48, 58, 97,100,100, 50, 58, 99,101, 58,102,102, - 58, 97, 50, 10, 10, 99,103, 97,110,103,112,122,108,106, 58, 10, 48, 58, - 50, 48, 97,100,100, 50, 58, 99,101, 58,102,102, 58, 97, 50, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,115,117,112, 98,116,105,109,101, 46, 99, - 32, 40, 99,104,105,110, 97, 32,116,111,119,110, 32, 40,106, 97,112, 97, - 110, 41, 41, 10, 99,104,105,110, 97,116,119,110, 58, 10, 48, 58, 49, 97, - 51,101, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50,101, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, 40, - 99, 97,115,115,101,116,116,101, 58, 32,103,114, 97,112,108,111,112, 32, - 40, 97,107, 97, 32, 99,108,117,115,116,101,114, 32, 98,117,115,116,101, - 114, 40,115,101,116, 32, 49, 41, 41, 10, 99,103,114, 97,112,108,111,112, - 58, 10, 48, 58, 50, 97, 53, 49, 58, 53,100, 58, 52, 51, 58, 51, 48, 10, - 48, 58, 50, 51, 58, 54, 58, 51, 48, 58, 51, 48, 10, 10,100,101,109,111, - 110, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107, - 115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,109, - 97,107,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 32,119, - 111,114,107, 93, 10, 48, 58, 48, 49, 99, 48, 58, 49,101, 58, 48, 48, 58, - 49, 48, 10, 48, 58, 48, 48, 98, 54, 58, 48, 97, 58, 48, 48, 58, 48, 49, - 10, 48, 58, 48, 48, 48, 48, 58, 48, 97, 58, 48, 49, 58, 48, 48, 10, 10, - 59, 40,100,114,101, 97,109, 32,115,111, 99, 99,101,114, 32, 39, 57, 52, - 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,100,115,111, 99, 99,114, 57, 52, 58, 10, 48, - 58,101, 98, 53, 55, 98, 58, 56, 48, 58, 49, 48, 58, 48, 52, 10,100,115, - 111, 99, 99,114, 57, 52,106, 58, 10, 48, 58,101, 97,100, 54,100, 58, 56, - 48, 58, 49, 48, 58, 48, 52, 10,100,115,111, 99, 99,114, 57, 52,107, 58, - 10, 48, 58,101, 98, 55, 97, 49, 58, 56, 48, 58, 49, 48, 58, 48, 52, 10, + 13, 10,116, 97, 99,116, 99,105, 97,110, 58, 13, 10, 48, 58, 57, 56, 97, + 56, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, 56, 48, 52, 56, 58, 49, 52, + 48, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, 56, 48, 50, 56, 58, 50, 48, + 58, 48, 48, 58, 49, 48, 13, 10, 13, 10,116, 97, 99,116, 99,105, 97,110, + 50, 58, 13, 10, 48, 58, 57, 56, 97, 56, 58, 51, 58, 56, 48, 58, 48, 48, + 13, 10, 48, 58, 56, 48, 52, 56, 58, 49, 52, 48, 58, 56, 48, 58, 49, 48, + 13, 10, 48, 58, 56, 48, 50, 56, 58, 50, 48, 58, 48, 48, 58, 49, 48, 13, + 10, 13, 10, 59, 40,116,111,112, 32,114, 97,110,107,105,110,103, 32,115, + 116, 97,114,115, 32, 40,119,111,114,108,100, 32,110,101,119, 32,118,101, + 114,115,105,111,110, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116,114,115,116, + 97,114, 58, 13, 10,116,114,115,116, 97,114,106, 58, 13, 10,116,114,115, + 116, 97,114,111, 58, 13, 10,116,114,115,116, 97,114,111,106, 58, 13, 10, + 112,114,109,116,109,102,103,116, 58, 13, 10,112,114,109,116,109,102,103, + 116,111, 58, 13, 10, 48, 58, 52, 49, 51,100, 49, 48, 58, 50, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 52, 49, 51,100, 49, 50, 58, 55,102,101, 58, + 49, 51, 58, 48, 48, 13, 10, 13, 10, 59, 40,110,111, 32,109, 97,110, 39, + 115, 32,108, 97,110,100, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,110,111,109,110,108,110,100, 58, 13, 10,110,111,109,110,108, + 110,100,103, 58, 13, 10, 48, 58, 54, 48, 48, 52, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 54, 99, 53,100, 58, 54, 99, 48, 58,102,102, 58, + 48, 48, 13, 10, 13, 10, 59, 40,110,105,103,104,116, 32,100,114,105,118, + 101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, + 72,105,115, 99,111,114,101, 32,105,115, 32,117,112,100, 97,116,101,100, + 32,119,104,101,110, 32,110,101,119, 32,103, 97,109,101, 32,115,116, 97, + 114,116,115, 33, 13, 10,110,105,116,101,100,114,118,114, 58, 13, 10, 48, + 58, 97, 48, 58, 99, 58, 48, 58, 48, 13, 10, 48, 58, 49, 51, 48, 58, 49, + 58, 53, 50, 58, 53, 50, 13, 10, 13, 10, 59, 40,110, 97,109, 99,111, 32, + 99,108, 97,115,115,105, 99,115, 32,118,111,108, 46, 32, 49, 41, 32, 97, + 110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 32, 45, 32, 65, 76, 76, 32,103, 97,109,101,115, 32, 77, 85, + 83, 84, 32,114,117,110, 32,116,104,114,111,117,103,104, 32, 97,116,116, + 114, 97, 99,116, 32,109,111,100,101, 32, 98,101,102,111,114,101, 32,115, + 116, 97,114,116,105,110,103, 32, 97, 32,110,101,119, 32,103, 97,109,101, + 33, 13, 10,110, 99,118, 49, 58, 13, 10,110, 99,118, 49,106, 58, 13, 10, + 110, 99,118, 49,106, 50, 58, 13, 10, 48, 58, 52, 48, 48, 57, 49, 52, 58, + 50,101,101, 58, 48, 55, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 40,111,117,116,102,111,120,105,101,115, 41, 13, 10,111, + 117,116,102,120,105,101,115,106, 58, 13, 10,111,117,116,102,120,105,101, + 115, 58, 13, 10, 48, 58, 50, 51, 54, 50, 49, 48, 58, 51,101, 58, 48, 48, + 58, 53,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,111, + 114,105,101,110,116, 97,108, 32,108,101,103,101,110,100, 41, 13, 10,111, + 114,108,101,103,101,110,100, 58, 13, 10,111,114,108,101,103,101,110,100, + 101, 58, 13, 10,111,114,108,101,103,101,110,100, 99, 58, 13, 10, 48, 58, + 56, 49, 49, 57, 52, 54, 58,100, 52, 58, 52, 57, 58, 98, 48, 13, 10, 13, + 10,111,114,108,101,103,101,110,100, 49, 48, 53,107, 58, 13, 10, 48, 58, + 56, 49, 49, 57, 49, 56, 58,100, 52, 58, 52, 57, 58, 98, 48, 13, 10, 13, + 10,111,114,108,101,103,101,110,100, 49, 49, 49, 99, 58, 13, 10,111,114, + 108,101,103,101,110,100, 49, 49, 49,116, 58, 13, 10,111,114,108,101,103, + 101,110,100, 49, 49, 49,107, 58, 13, 10, 48, 58, 56, 49, 49, 57, 49,101, + 58,100, 52, 58, 52, 57, 58, 98, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 40,107,111,107,111,110,116,111,117,122, 97,105, 32,101, + 116,111, 32,109,111,110,111,103, 97,116, 97,114,105, 32, 40,106, 97,112, + 97,110, 41, 41, 13, 10,101,116,111, 58, 13, 10, 48, 58, 50, 48, 50,100, + 48, 56, 58, 51, 48, 58, 51, 55, 58,100, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 40,103,111,108,102,105,110,103, 32,103,114,101, + 97,116,115, 41, 13, 10,103,108,102,103,114,101, 97,116, 58, 13, 10, 48, + 58, 49, 48, 48, 51, 50, 48, 58, 53, 48, 58, 52, 49, 58, 57, 13, 10, 48, + 58, 49, 48, 48, 52, 48, 48, 58, 53, 48, 58, 52, 49, 58, 57, 13, 10, 13, + 10, 59, 40,109,101,116, 97,109,111,113,101,115,116,101,114, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109,101,116,109,113,115, + 116,114, 58, 13, 10, 48, 58,102, 48, 56, 48,101, 48, 58, 49, 48, 48, 58, + 48, 97, 58, 48, 49, 13, 10, 13, 10,110,109, 97,115,116,101,114, 58, 13, + 10, 48, 58,102, 48, 56, 49, 48, 48, 58,101, 48, 58, 51, 48, 58, 48, 49, + 13, 10, 13, 10, 59, 40,109, 97,106,111,114, 32,116,105,116,108,101, 32, + 50, 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111, + 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109, + 97,106,116,105,116,108, 50, 58, 13, 10,115,107,105,110,103, 97,109,101, + 58, 13, 10,115,107,105,110,103, 97,109,101, 50, 58, 13, 10,109, 97,106, + 116,105,116,108, 50, 98, 58, 13, 10, 48, 58,101,100, 53, 52, 50, 58, 49, + 52, 48, 58, 52,100, 58, 48, 48, 13, 10, 13, 10,109, 97,106,116,105,116, + 108, 50,106, 58, 13, 10, 48, 58,101,100, 53, 52, 50, 58, 49, 52, 48, 58, + 52, 98, 58, 48, 48, 13, 10, 13, 10, 59, 40,109, 97,106,111,114, 32,108, + 101, 97,103,117,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,109,106,108,101, 97,103,117,101, 58, 13, 10, 48, 58,102,102,101, + 48, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 40, + 109,105,103,104,116,121, 32,103,117,121, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,109,105,103,104,116,103,117,121, 58, 13, 10, + 48, 58, 99, 48, 53, 53, 58, 55, 53, 58, 48, 48, 58, 52, 49, 13, 10, 13, + 10, 59, 40,109, 97,110,121, 32, 98,108,111, 99,107, 41, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,109, 97,110,121, 98,108,111, 99, + 58, 13, 10, 48, 58,102, 48, 48, 53, 48, 58, 52, 58, 48, 48, 58, 49, 57, + 13, 10, 48, 58,102, 48, 48, 53, 52, 58, 57, 99, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,102, 48, 51, 98, 50, 58, 54, 58, 48, 58, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 40,104,121,112,101,114, 32,112, + 97, 99,109, 97,110, 32, 40, 98,111,111,116,108,101,103, 41, 41, 13, 10, + 104,121,112,101,114,112, 97, 99, 98, 58, 13, 10, 48, 58, 49, 48, 53, 51, + 53, 99, 58, 50, 56, 58, 53, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 53, + 51, 55,101, 58, 49, 58, 52, 51, 58, 52, 51, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40, + 108, 97,110,100,109, 97,107,101,114, 32, 40,106, 97,112, 97,110, 41, 41, + 13, 10,108, 97,110,100,109, 97,107,114, 58, 13, 10,108, 97,110,100,109, + 97,107,114,112, 58, 13, 10, 48, 58, 52, 48,102, 99, 51, 48, 58, 50, 56, + 58, 48, 48, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,110,109,107, 49, 54, 46, 99, 32, 40,107,111,117,116,101,116,115,117, + 32,121,111,117,115, 97,105, 32,115,116,114, 97,104,108, 32, 40,106, 97, + 112, 97,110, 32,115,101,116, 32, 49, 41, 41, 13, 10,115,116,114, 97,104, + 108, 58, 13, 10, 48, 58,102, 51, 48,100, 57, 58, 49, 56,102, 58, 53, 53, + 58, 56, 56, 13, 10, 48, 58,102, 48,100, 56, 97, 58, 52, 58, 48, 48, 58, + 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, + 99,111,110, 97, 49, 46, 99, 32, 40,107,110,117, 99,107,108,101, 32,104, + 101, 97,100,115, 32, 40,119,111,114,108,100, 41, 41, 13, 10,107,110, 99, + 107,104,101, 97,100, 58, 13, 10,107,110, 99,107,104,101, 97,100,106, 58, + 13, 10, 48, 58, 50, 48, 57, 51, 55, 50, 58, 50, 55, 58, 48, 48, 58, 52, + 99, 13, 10, 48, 58, 50, 48, 57, 51, 55, 51, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 13, 10, 59, 40,103, 97,108, 97, 99,116,105, 99, 32,119, 97, + 114,114,105,111,114,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,103,119, 97,114,114,105,111,114, 58, 13, 10, 48, 58, 49, 97, + 52,102, 54, 58, 53, 48, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 49,102, + 55, 50,102, 58, 51, 58, 48, 48, 58, 56, 53, 13, 10, 13, 10, 59, 40,103, + 114, 97,110,100, 32, 99,114,111,115,115, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,103, 99,112,105,110, 98, 97,108, 58, 13, 10, + 48, 58,102,102, 50, 51, 49, 56, 58, 50, 58, 48, 48, 58, 48, 50, 13, 10, + 48, 58,102,102, 50, 51, 49, 97, 58, 54,101, 58, 56, 49, 58, 48, 48, 13, + 10, 48, 58,102,102, 48, 48, 48,101, 58, 55, 48, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, 50, + 46, 99, 32, 40,105, 99,104,105,100, 97,110,116, 45,114, 32, 40,112,117, + 122,122,108,101, 95, 97, 99,116,105,111,110, 32, 50, 32, 40,101,110,103, + 108,105,115,104, 32, 38, 32,106, 97,112, 97,110, 41, 41, 41, 13, 10,105, + 99,104,105,114,106, 58, 13, 10,105, 99,104,105,100,110,116,101, 58, 13, + 10, 48, 58,102,102,102, 99, 51,100, 58, 50, 55, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,105,113, 98,108,111, 99, + 107, 46, 99, 32, 40,105,113, 45, 98,108,111, 99,107, 41, 13, 10,105,113, + 98,108,111, 99,107, 58, 13, 10, 48, 58,102, 49, 52, 57, 58, 50, 55, 58, + 52, 49, 58, 48, 48, 13, 10, 48, 58,102, 49, 97, 52, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58,102, 49, 54,101, 58, 49, 58, 49, 51, 58, 49, + 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,101,112,111,115, 46, + 99, 32, 40,105,103,109,111, 41, 13, 10, 59, 42, 42, 32,111,110,108,121, + 32,115, 97,118,101,115, 32,116,111,112, 32,115, 99,111,114,101, 32, 42, + 42, 13, 10,105,103,109,111, 58, 13, 10, 48, 58, 55, 56, 52, 97, 58, 51, + 99, 58, 49, 48, 58, 48, 48, 13, 10, 48, 58, 55, 56, 48, 53, 58, 49, 58, + 102, 52, 58,102, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, + 101,103, 97,115,121,115, 49, 46, 99, 32, 40,105,103, 97, 32,110,105,110, + 106,121,117,116,115,117,100,101,110, 32, 40,106, 97,112, 97,110, 41, 41, + 13, 10,105,103, 97,110,105,110,106,117, 58, 13, 10, 48, 58,102, 48, 48, + 48, 52, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 52, 48, 48, + 49, 58, 57, 55, 58, 50, 48, 58, 97, 99, 13, 10, 48, 58,102, 48, 48, 49, + 48, 58, 56, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 40,114,101, 99, + 111,114,100, 98,114,101, 97,107,101,114, 32, 40,119,111,114,108,100, 41, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,114,101, 99, + 111,114,100, 98,114, 58, 13, 10, 48, 58, 49, 48, 51, 52,101,101, 58, 49, + 101, 48, 58, 48, 48, 58, 52, 53, 13, 10, 13, 10,102,103,104,116, 97,116, + 99,107, 58, 13, 10,102, 97, 58, 13, 10, 48, 58, 49,102, 97, 97, 56, 58, + 102, 50, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58, 49, 49, 50, 50, 58, 52, + 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,102, 97,115,116, 32,108, 97,110, + 101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,102, 97, + 115,116,108, 97,110,101, 58, 13, 10, 48, 58, 51, 50, 97, 48, 58, 53, 48, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 51, 48, 57, 58, 51, 58, 48, + 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120, + 121,111,110,105,120, 46, 99, 32, 40,120,121,111,110,105,120, 41, 13, 10, + 120,121,111,110,105,120, 58, 13, 10, 48, 58,100, 53, 48, 48, 58, 49, 51, + 102, 58, 52,102, 58, 48, 48, 13, 10, 48, 58,100, 54, 51, 57, 58, 49, 58, + 48, 56, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 110, 97,109, 99,111,110, 97, 49, 46, 99, 32, 40, 99,111,115,109,111, 32, + 103, 97,110,103, 32,116,104,101, 32,112,117,122,122,108,101, 32, 40,117, + 115, 41, 41, 13, 10, 99,103, 97,110,103,112,122,108, 58, 13, 10, 48, 58, + 97,100,100, 50, 58, 99,101, 58,102,102, 58, 97, 50, 13, 10, 13, 10, 99, + 103, 97,110,103,112,122,108,106, 58, 13, 10, 48, 58, 50, 48, 97,100,100, + 50, 58, 99,101, 58,102,102, 58, 97, 50, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,115,117,112, 98,116,105,109,101, 46, 99, 32, 40, 99, + 104,105,110, 97, 32,116,111,119,110, 32, 40,106, 97,112, 97,110, 41, 41, + 13, 10, 99,104,105,110, 97,116,119,110, 58, 13, 10, 48, 58, 49, 97, 51, + 101, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50,101, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, + 40, 99, 97,115,115,101,116,116,101, 58, 32,103,114, 97,112,108,111,112, + 32, 40, 97,107, 97, 32, 99,108,117,115,116,101,114, 32, 98,117,115,116, + 101,114, 40,115,101,116, 32, 49, 41, 41, 13, 10, 99,103,114, 97,112,108, + 111,112, 58, 13, 10, 48, 58, 50, 97, 53, 49, 58, 53,100, 58, 52, 51, 58, + 51, 48, 13, 10, 48, 58, 50, 51, 58, 54, 58, 51, 48, 58, 51, 48, 13, 10, + 13, 10,100,101,109,111,110, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, + 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, + 32,102,111,114, 32,109, 97,107,105,110,103, 32,116,104,105,115, 32,101, + 110,116,114,121, 32,119,111,114,107, 93, 13, 10, 48, 58, 48, 49, 99, 48, + 58, 49,101, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, 48, 48, 98, 54, 58, + 48, 97, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 48, 48, 48, 48, 58, 48, + 97, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 40,100,114,101, 97,109, + 32,115,111, 99, 99,101,114, 32, 39, 57, 52, 41, 32, 97,110,100, 32, 99, + 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,100,115,111, 99, 99,114, 57, 52, 58, 13, 10, 48, 58,101, 98, 53, 55, + 98, 58, 56, 48, 58, 49, 48, 58, 48, 52, 13, 10,100,115, 99, 99,114, 57, + 52,106, 58, 13, 10, 48, 58,101, 97,100, 54,100, 58, 56, 48, 58, 49, 48, + 58, 48, 52, 13, 10,100,115,111, 99, 99,114, 57, 52,107, 58, 13, 10, 48, + 58,101, 98, 55, 97, 49, 58, 56, 48, 58, 49, 48, 58, 48, 52, 13, 10, 13, 10, 59, 40,100,121,110, 97,109,105, 99, 32,115,107,105, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,100,121,110, 97,109,115,107,105, - 58, 10, 48, 58,102, 48, 57, 50, 58, 52, 54, 58, 48, 48, 58, 49,101, 10, - 48, 58,102, 49, 48, 48, 58, 49, 53, 58, 48, 48, 58, 49, 51, 10, 48, 58, - 102, 48, 56, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,100, 97, - 114,107, 32,119, 97,114,114,105,111,114, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,100, 97,114,107,119, 97,114, 58, 10, 48, 58, 49, - 101, 51,101, 58, 50, 48, 58, 48, 58, 48, 10, 48, 58, 49,101, 53,101, 58, - 51, 99, 58, 48, 58, 48, 10, 48, 58, 49,101, 57, 97, 58, 97, 58, 48, 58, - 48, 10, 10, 59, 40,100, 97,114,107, 32,112,108, 97,110,101,116, 41, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,100, 97,114,107,112,108, - 110,116, 58, 10, 48, 58, 56, 48, 98, 56, 58, 49,101, 58, 48, 48, 58, 52, - 97, 10, 48, 58, 56, 48,102, 52, 58, 49,101, 58, 48, 48, 58, 53, 49, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 46, - 99, 32, 40, 98,108,111, 99,107, 32,103, 97,108, 32, 40, 98,111,111,116, - 108,101,103, 41, 10, 98,108, 99,107,103, 97,108, 98, 58, 10, 48, 58, 99, - 48, 54, 50, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, 98, 97,114,114,105, - 101,114, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110, - 107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32, - 109, 97,107,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 32, - 119,111,114,107, 93, 10, 48, 58, 48, 48, 55, 52, 58, 48, 52, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 48, 48, 99, 48, 58, 48, 54, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,105,110,101,109, 97, - 116, 46, 99, 32, 40, 98,111,120,105,110,103, 32, 98,117,103,115, 41, 10, - 98,111,120,105,110,103, 98, 58, 10, 48, 58,101, 48, 58, 51, 48, 58, 48, - 48, 58,102, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,116, - 97, 46, 99, 32, 40, 98,108, 97,110,100,105, 97, 32, 40,112,114,111,116, - 111,116,121,112,101, 41, 41, 10, 98,108, 97,110,100,105, 97,112, 58, 10, - 48, 58, 50, 48, 49, 48, 53, 54, 58, 54, 50, 58, 48, 57, 58, 49, 55, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,109,107, 49, 54, 46, 99, 32, - 40, 98,108, 97, 99,107, 32,104,101, 97,114,116, 41, 10, 98,108,107,104, - 101, 97,114,116, 58, 10, 98,108,107,104,101, 97,114,116,106, 58, 10, 48, - 58,102, 57, 48, 57, 48, 58, 52, 58, 48, 48, 58, 49, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,109, 99,114, 54, 56, 46, 99, 32, 40,115,112, - 121, 32,104,117,110,116,101,114, 32, 50, 32, 40,114,101,118, 32, 49, 32, - 38, 32, 50, 41, 41, 10,115,112,121,104,117,110,116, 50, 97, 58, 10,115, - 112,121,104,117,110,116, 50, 58, 10, 48, 58, 54, 48, 49, 51, 48, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 48, 98, 51, 58, 49, 58, 51, - 50, 58, 51, 50, 10, 10, 59, 40, 98,101,114, 97, 98,111,104, 32,109, 97, - 110, 32, 40,106, 97,112, 97,110, 32,118,101,114,115,105,111,110, 32, 99, - 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10, 98,101,114, 97, 98,111,104,109, 58, 10, - 98,101,114, 97, 98,111,104,109,111, 58, 10, 48, 58, 51,102, 48, 48, 58, - 54, 56, 58, 52, 50, 58, 48, 50, 10, 10, 59, 40,115,107,121, 32, 99,104, - 117,116,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, - 45, 32, 72,105,115, 99,111,114,101,115, 32, 97,114,101, 32,117,112,100, - 97,116,101,100, 32,119,104,101,110, 32,103, 97,109,101, 32,101,110,116, - 101,114,115, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 33, 10, - 115,107,121, 99,104,117,116, 58, 10, 48, 58, 55, 98, 58,102, 58, 48, 58, - 48, 10, 48, 58, 52, 48, 54,100, 58, 54, 58, 52, 48, 58, 52, 48, 10, 10, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,100,121,110, 97,109,115,107, + 105, 58, 13, 10, 48, 58,102, 48, 57, 50, 58, 52, 54, 58, 48, 48, 58, 49, + 101, 13, 10, 48, 58,102, 49, 48, 48, 58, 49, 53, 58, 48, 48, 58, 49, 51, + 13, 10, 48, 58,102, 48, 56, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 40,100, 97,114,107, 32,119, 97,114,114,105,111,114, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,100, 97,114,107,119, + 97,114, 58, 13, 10, 48, 58, 49,101, 51,101, 58, 50, 48, 58, 48, 58, 48, + 13, 10, 48, 58, 49,101, 53,101, 58, 51, 99, 58, 48, 58, 48, 13, 10, 48, + 58, 49,101, 57, 97, 58, 97, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,100, + 97,114,107, 32,112,108, 97,110,101,116, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,100, 97,114,107,112,108,110,116, 58, 13, 10, + 48, 58, 56, 48, 98, 56, 58, 49,101, 58, 48, 48, 58, 52, 97, 13, 10, 48, + 58, 56, 48,102, 52, 58, 49,101, 58, 48, 48, 58, 53, 49, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 46, 99, + 32, 40, 98,108,111, 99,107, 32,103, 97,108, 32, 40, 98,111,111,116,108, + 101,103, 41, 13, 10, 98,108, 99,107,103, 97,108, 98, 58, 13, 10, 48, 58, + 99, 48, 54, 50, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 98, 97, + 114,114,105,101,114, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116, + 104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102, + 111,114, 32,109, 97,107,105,110,103, 32,116,104,105,115, 32,101,110,116, + 114,121, 32,119,111,114,107, 93, 13, 10, 48, 58, 48, 48, 55, 52, 58, 48, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 48, 99, 48, 58, 48, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 99,105,110,101,109, 97,116, 46, 99, 32, 40, 98,111,120,105,110,103, + 32, 98,117,103,115, 41, 13, 10, 98,111,120,105,110,103, 98, 58, 13, 10, + 48, 58,101, 48, 58, 51, 48, 58, 48, 48, 58,102, 52, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40, 98,108, + 97,110,100,105, 97, 32, 40,112,114,111,116,111,116,121,112,101, 41, 41, + 13, 10, 98,108, 97,110,100,105, 97,112, 58, 13, 10, 48, 58, 50, 48, 49, + 48, 53, 54, 58, 54, 50, 58, 48, 57, 58, 49, 55, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,110,109,107, 49, 54, 46, 99, 32, 40, 98,108, + 97, 99,107, 32,104,101, 97,114,116, 41, 13, 10, 98,108,107,104,101, 97, + 114,116, 58, 13, 10, 98,108,107,104,101, 97,114,116,106, 58, 13, 10, 48, + 58,102, 57, 48, 57, 48, 58, 52, 58, 48, 48, 58, 49, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 99,114, 54, 56, 46, 99, 32, 40, + 115,112,121, 32,104,117,110,116,101,114, 32, 50, 32, 40,114,101,118, 32, + 49, 32, 38, 32, 50, 41, 41, 13, 10,115,112,121,104,117,110,116, 50, 97, + 58, 13, 10,115,112,121,104,117,110,116, 50, 58, 13, 10, 48, 58, 54, 48, + 49, 51, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 48, + 98, 51, 58, 49, 58, 51, 50, 58, 51, 50, 13, 10, 13, 10, 59, 40, 98,101, + 114, 97, 98,111,104, 32,109, 97,110, 32, 40,106, 97,112, 97,110, 32,118, + 101,114,115,105,111,110, 32, 99, 41, 41, 32, 97,110,100, 32, 99,108,111, + 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98, + 101,114, 97, 98,111,104,109, 58, 13, 10, 98,101,114, 97, 98,111,104,109, + 111, 58, 13, 10, 48, 58, 51,102, 48, 48, 58, 54, 56, 58, 52, 50, 58, 48, + 50, 13, 10, 13, 10, 59, 40,115,107,121, 32, 99,104,117,116,101,114, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 72,105,115, + 99,111,114,101,115, 32, 97,114,101, 32,117,112,100, 97,116,101,100, 32, + 119,104,101,110, 32,103, 97,109,101, 32,101,110,116,101,114,115, 32, 97, + 116,116,114, 97, 99,116, 32,109,111,100,101, 33, 13, 10,115,107,121, 99, + 104,117,116, 58, 13, 10, 48, 58, 55, 98, 58,102, 58, 48, 58, 48, 13, 10, + 48, 58, 52, 48, 54,100, 58, 54, 58, 52, 48, 58, 52, 48, 13, 10, 13, 10, 59, 40,116, 97,110,107, 32, 98,117,115,116,101,114,115, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,116, 97,110,107, 98,117,115,116, - 58, 10, 48, 58,102, 54, 48, 50, 58, 53, 48, 58, 48, 48, 58, 49, 48, 10, - 10, 59, 40,115,112, 97, 99,101, 32, 98,101, 97,109, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,115,112, 97, 99, 98,101, 97,109, 58, - 10, 48, 58, 99, 54, 58, 98, 58, 48, 58, 48, 10, 48, 58, 48,101, 58,102, - 58, 48, 58, 48, 10, 10, 59, 40,102,111,114,109, 97,116,105,111,110, 32, - 122, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,102,111,114,109, 97,116,122, 58, 10, 97, - 101,114,111, 98,111,116,111, 58, 10, 48, 58, 52, 51, 48, 58, 49, 51, 56, - 58, 48, 48, 58, 48,102, 10, 48, 58, 54, 48, 48, 58, 49, 52, 58, 48, 48, - 58, 52, 48, 10, 10, 59, 40, 97,110,103,101,108, 32,107,105,100,115, 32, - 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10, 97,110,103,101,108,107,100,115, 58, 10, 48, 58, 99, 49, 48, - 49, 58, 51, 58, 48, 49, 58, 48, 48, 10, 48, 58, 99, 49, 49, 98, 58, 49, - 49, 56, 58, 48, 49, 58, 50, 48, 10, 10, 59, 40,115,112, 97, 99,101, 32, - 115,101,101,107,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10,115,112, 97, 99,101,115,107,114, 58, 10, 48, 58, 56, 51, 99, 48, - 58, 51, 58, 48, 58, 48, 10, 48, 58, 99, 52, 54, 99, 58, 55, 58, 50,101, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42,102,105,114,101,116,114, - 107, 46, 99, 32, 40,102,105,114,101, 32,116,114,117, 99,107, 41, 10,102, - 105,114,101,116,114,107, 58, 10, 48, 58, 50, 56, 58, 49, 58, 48, 54, 58, - 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, - 95,102, 50, 46, 99, 32, 40,115,111,108,105,116, 97,114,121, 32,102,105, - 103,104,116,101,114, 32, 40,119,111,114,108,100, 41, 41, 10,115,111,108, - 102,105,103,116,114, 58, 10, 48, 58, 49, 48, 50, 98, 56, 48, 58, 52, 57, - 58, 48, 48, 58, 50, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 98, - 108, 97,115,116,111, 41, 10, 98,108, 97,115,116,111, 58, 10, 48, 58,102, - 102, 51, 97, 58, 53, 58, 51, 48, 58, 51, 48, 10, 10, 59, 40,101, 99,111, - 32,102,105,103,104,116,101,114,115, 32, 40,119,111,114,108,100, 32, 57, - 51, 49, 50, 48, 51, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10,101, 99,111,102,103,104,116,114,104, 58, 10,101, 99,111,102,103, - 104,116,114, 58, 10,101, 99,111,102,103,104,116,114, 97, 58, 10,101, 99, - 111,102,103,104,116,114,117, 49, 58, 10,117,101, 99,111,108,111,103,121, - 58, 10, 48, 58,102,102, 48, 51, 51, 57, 58, 97, 48, 58, 48, 97, 58, 48, - 48, 10, 48, 58,102,102, 56, 49, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 10,101, 99,111,102,103,104,116,114,117, 58, 10, 48, 58,102,102, 48, - 51, 51, 98, 58, 97, 48, 58, 48, 97, 58, 48, 48, 10, 48, 58,102,102, 56, - 49, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 32, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,112,115,105,107,121,111, 46, 99, 32, 40, 98, 97,116, - 116,108,101, 32,107, 45,114,111, 97,100, 32, 40,106, 97,112, 97,110, 41, - 41, 10, 98,116,108,107,114,111,100,106, 58, 10, 98,116,108,107,114,111, - 97,100, 58, 10, 98,116,108,107,114,111, 97,100,107, 58, 32, 10, 48, 58, - 102,101, 49, 97,102, 52, 58, 52,101, 58, 48, 48, 58, 48, 52, 10, 10, 59, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116, 97,110,107, 98,117,115, + 116, 58, 13, 10, 48, 58,102, 54, 48, 50, 58, 53, 48, 58, 48, 48, 58, 49, + 48, 13, 10, 13, 10, 59, 40,115,112, 97, 99,101, 32, 98,101, 97,109, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,112, 97, 99, + 98,101, 97,109, 58, 13, 10, 48, 58, 99, 54, 58, 98, 58, 48, 58, 48, 13, + 10, 48, 58, 48,101, 58,102, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,102, + 111,114,109, 97,116,105,111,110, 32,122, 41, 32, 97,110,100, 32, 99,108, + 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 102,111,114,109, 97,116,122, 58, 13, 10, 97,101,114,111, 98,111,116,111, + 58, 13, 10, 48, 58, 52, 51, 48, 58, 49, 51, 56, 58, 48, 48, 58, 48,102, + 13, 10, 48, 58, 54, 48, 48, 58, 49, 52, 58, 48, 48, 58, 52, 48, 13, 10, + 13, 10, 59, 40, 97,110,103,101,108, 32,107,105,100,115, 32, 40,106, 97, + 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10, 97,110,103,101,108,107,100,115, 58, 13, 10, 48, 58, 99, 49, 48, 49, + 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, 99, 49, 49, 98, 58, 49, + 49, 56, 58, 48, 49, 58, 50, 48, 13, 10, 13, 10, 59, 40,115,112, 97, 99, + 101, 32,115,101,101,107,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 13, 10,115,112, 97, 99,101,115,107,114, 58, 13, 10, 48, 58, + 56, 51, 99, 48, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, 99, 52, 54, 99, + 58, 55, 58, 50,101, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42,102,105,114,101,116,114,107, 46, 99, 32, 40,102,105,114,101, 32,116, + 114,117, 99,107, 41, 13, 10,102,105,114,101,116,114,107, 58, 13, 10, 48, + 58, 50, 56, 58, 49, 58, 48, 54, 58, 48, 54, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, 99, 32, 40, + 115,111,108,105,116, 97,114,121, 32,102,105,103,104,116,101,114, 32, 40, + 119,111,114,108,100, 41, 41, 13, 10,115,111,108,102,105,103,116,114, 58, + 13, 10, 48, 58, 49, 48, 50, 98, 56, 48, 58, 52, 57, 58, 48, 48, 58, 50, + 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 40, 98,108, 97,115, + 116,111, 41, 13, 10, 98,108, 97,115,116,111, 58, 13, 10, 48, 58,102,102, + 51, 97, 58, 53, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 40,101, 99, + 111, 32,102,105,103,104,116,101,114,115, 32, 40,119,111,114,108,100, 32, + 57, 51, 49, 50, 48, 51, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,101, 99,111,102,103,104,116,114,104, 58, 13, 10,101, 99, + 111,102,103,104,116,114, 58, 13, 10,101, 99,111,102,103,104,116,114, 97, + 58, 13, 10,101, 99,111,102,103,104,116,114,117, 49, 58, 13, 10,117,101, + 99,111,108,111,103,121, 58, 13, 10, 48, 58,102,102, 48, 51, 51, 57, 58, + 97, 48, 58, 48, 97, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 49, 48, 54, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,101, 99,111,102,103,104, + 116,114,117, 58, 13, 10, 48, 58,102,102, 48, 51, 51, 98, 58, 97, 48, 58, + 48, 97, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 49, 48, 54, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 112,115,105,107,121,111, 46, 99, 32, 40, 98, 97,116,116,108,101, 32,107, + 45,114,111, 97,100, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, 98,116, + 108,107,114,111,100,106, 58, 13, 10, 98,116,108,107,114,111, 97,100, 58, + 13, 10, 98,116,108,107,114,111, 97,100,107, 58, 13, 10, 48, 58,102,101, + 49, 97,102, 52, 58, 52,101, 58, 48, 48, 58, 48, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,105,115,115, 98, 46, 99, 32, 40,109, - 105,115,115, 32, 98,117, 98, 98,108,101, 32, 50, 41, 10,109,105,115,115, - 98, 50, 58, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, 58, 52, - 56, 10, 48, 58,101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58,101, 54, 52,100, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,114,101,110,101,103, 97,100,101, 46, 99, 32, 40, - 110,101,107,107,101,116,115,117, 32,107,111,117,104, 97, 32,107,117,110, - 105,111, 45,107,117,110, 32, 40,106, 97,112, 97,110, 32, 98,111,111,116, - 108,101,103, 41, 41, 10,107,117,110,105,111,107,117,110, 98, 58, 10,107, - 117,110,105,111,107,117,110, 58, 10, 48, 58, 50,101, 58, 51, 58, 48, 48, - 58, 48, 53, 32, 10, 48, 58, 49, 48, 50, 99, 58, 50, 56, 58, 52, 55, 58, - 48, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111, 99,107, - 114, 97,103,101, 46, 99, 32, 40,114,111, 99,107, 32, 96,110, 32,114, 97, - 103,101, 32, 40,119,111,114,108,100, 63, 41, 32, 10,114,111, 99,107,114, - 97,103,101, 58, 10,114,111, 99,107,114, 97,103,101,106, 58, 10, 48, 58, - 52, 57, 56, 48, 58, 52,101, 58, 48, 49, 58, 53, 51, 10, 48, 58, 52, 56, - 98,101, 58, 51, 58, 48, 49, 58, 56, 48, 10, 48, 58, 52,102, 99, 56, 58, - 49, 58, 53, 52, 58, 53, 52, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 82, - 111, 99,107, 32, 39,110, 32, 82, 97,103,101, 32, 40, 80,114,111,116,111, - 116,121,112,101, 63, 41, 10,114,111, 99,107,114, 97,103,101, 97, 58, 10, - 48, 58, 52, 57, 56, 48, 58, 52,101, 58, 48, 49, 58, 53, 51, 10, 48, 58, - 52, 56, 98,101, 58, 51, 58, 48, 49, 58, 56, 48, 10, 48, 58, 52, 56, 54, - 54, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,103, 97,108, 97,120,105, 97,110, 46, 99, 32, 40,122,101,114,111, - 32,116,105,109,101, 41, 10,122,101,114,111,116,105,109,101, 58, 10, 48, - 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 32, 10, 59, 40, - 115, 99,114, 97,109, 98,108,101,100, 32,101,103,103, 41, 32, 97,110,100, - 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10,115, 99,114,101,103,103, 58, 10,101,103,103,115, 58, 10, 48, 58, - 52, 48, 48, 58, 49,101, 58, 49, 55, 58, 48, 48, 10, 48, 58, 48, 49, 53, - 58, 51, 58, 48, 48, 58, 48, 51, 10, 10, 59, 40,115, 99,111,114,112,105, - 111,110, 32, 40, 98,111,111,116,108,101,103, 32,111,110, 32,103, 97,108, - 97,120,105, 97,110, 32,104, 97,114,100,119, 97,114,101, 41, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, 99,111,114,112,110,103, - 58, 10, 48, 58, 52, 50, 48, 55, 58,102, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 52, 50, 97,100, 58,102, 58, 49, 48, 58, 49, 48, 10, 10, 59, 40,115, - 97,117,114,111, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, - 10,115, 97,117,114,111, 58, 10,115, 97,117,114,111,112, 58, 10, 48, 58, - 101, 48, 48, 48, 58, 98, 52, 58, 48, 48, 58, 52,102, 10, 32, 10, 59, 40, - 115, 97,115,117,107,101, 32,118,115, 46, 32, 99,111,109,109, 97,110,100, - 101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, 97, - 115,117,107,101, 58, 10, 48, 58, 50, 52, 58, 50, 58, 48, 48, 58, 48, 53, - 10, 10, 59, 40,115, 97,109,117,114, 97,105, 32, 40,115,101,103, 97, 41, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, 97,109,117, - 114, 97,105, 58, 32, 10, 48, 58, 57, 55, 49, 97, 58, 49, 50, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 40,115, 97,102, 97,114,105, 32,114, 97,108,108, - 121, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32,104, - 105,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,102,116, - 101,114, 32,110,101,119, 32,103, 97,109,101, 32,115,116, 97,114,116, 32, - 33, 33, 33, 10,115, 97,102, 97,114,105,114, 58, 10,115, 97,102, 97,114, - 105,114,106, 58, 10, 48, 58, 50, 51, 56, 57, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 50, 51, 56, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 50, 49, 52, 49, 58, 49, 58, 50, 48, 58, 50, 48, 32, 10, 48, 58, 50, - 49, 54, 49, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 50, 49, 56, 49, - 58, 49, 58, 50, 48, 58, 50, 48, 32, 10, 48, 58, 50, 49, 97, 49, 58, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 50, 49, 99, 49, 58, 49, 58, 50, 48, - 58, 50, 48, 10, 48, 58, 50, 49,101, 49, 58, 49, 58, 50, 48, 58, 50, 48, - 10, 32, 10, 59, 40,115, 97,100, 97,114,105, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,115, 97,100, 97,114,105, 58, 32, 10, 48, 58, - 99, 51, 49,100, 58, 51, 99, 58, 51, 97, 58, 48, 49, 10, 10, 59, 40,114, - 105,100,105,110,103, 32,102,105,103,104,116, 32, 40,119,111,114,108,100, - 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,114,105,100,105,110,103,102, 58, 32, 10, - 114,105,100,105,110,103,102,117, 58, 32, 10,114,105,100,105,110,103,102, - 106, 58, 32, 10, 48, 58, 52, 48, 56, 48, 54, 48, 58, 56, 48, 58, 48, 48, - 58, 51,102, 10, 32, 10, 59, 40,114,101,105,107, 97,105, 32,100,111,117, - 115,104,105, 32, 40,106, 97,112, 97,110, 41, 41, 32, 10,114,101,105,107, - 97,105,100,115, 58, 10, 48, 58, 52, 51, 99, 97, 58, 49,101, 58, 48, 48, - 58,101, 56, 10, 48, 58, 52, 48,100,102, 58, 50, 58, 49, 51, 58, 56, 56, - 10, 10, 59, 40,114,101,100, 32, 97,108,101,114,116, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,114,101,100, 97,108,101,114,116, 58, - 10, 48, 58, 51, 48, 49, 58,102, 58, 48, 58, 48, 10, 32, 10, 59, 40,114, - 97,105,100,101,114,115, 53, 41, 32, 97,110,100, 32, 99,108,111,110,101, - 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,114, 97,105,100, - 101,114,115, 53, 58, 10,114, 97,105,100,101,114,115, 53,116, 58, 32, 10, - 48, 58,101, 48, 55, 53, 58, 51, 55, 58, 48, 48, 58, 53, 53, 10, 48, 58, - 56, 56, 56, 99, 58, 55, 58, 50, 50, 58, 49, 48, 10, 10, 59, 40,114, 97, - 102,102,108,101,115,105, 97, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10,114, 97,102,108,101,115,105, 97, 58, 10, 48, 58,100, 51, 48, - 48, 58, 53, 48, 58, 48, 48, 58, 52, 97, 10, 48, 58, 99, 48, 49, 55, 58, - 51, 58, 48, 48, 58, 48, 50, 10, 10, 59, 40,112,117,122,122,108,101, 32, - 100,101, 32, 98,111,119,108,105,110,103, 32, 40,106, 97,112, 97,110, 41, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,112,122,108, 98, - 111,119,108, 58, 10, 48, 58, 50, 48, 97, 57, 99, 52, 58, 54, 48, 58, 48, - 97, 58, 97, 56, 10, 32, 10, 59, 40,112,117,110,107, 32,115,104,111,116, - 32, 40,117,115, 32, 52, 32,112,108, 97,121,101,114,115, 41, 41, 32, 97, - 110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10,112,117,110,107,115,104,111,116, 58, 32, 10,112,117,110, - 107,115,104,111,116,106, 58, 10,112,117,110,107,115,104,111,116, 50, 58, - 10, 48, 58, 56, 48, 55, 48, 48, 58, 51, 48, 58, 48, 48, 58, 52, 48, 10, - 10, 59, 40,112,111,119,101,114, 32,115,117,114,103,101, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 72,105,115, 99,111,114, - 101,115, 32, 97,112,112,101, 97,114, 32, 99,111,114,114,101, 99,116,108, - 121, 32, 97,102,116,101,114, 32,103, 97,109,101, 32,101,110,116,101,114, - 115, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 33, 10,112,115, - 117,114,103,101, 58, 32, 10, 48, 58, 97, 56, 54, 99, 58, 54, 58, 50, 48, - 58, 51, 48, 32, 10, 48, 58, 98, 48, 56, 48, 58, 53, 48, 58, 51, 49, 58, - 102,102, 10, 10, 59, 40,112,111,112, 32,102,108, 97,109,101,114, 32, 40, - 112,114,111,116,101, 99,116,101,100, 41, 41, 32, 97,110,100, 32, 99,108, - 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 45, 32, - 104,105,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,102, - 116,101,114, 32,110,101,119, 32,103, 97,109,101, 32,115,116, 97,114,116, - 32, 33, 33, 33, 32, 10,112,111,112,102,108, 97,109,101, 58, 10,112,111, - 112,102,108, 97,109,101, 97, 58, 10,112,111,112,102,108, 97,109,101, 98, - 58, 10,112,111,112,102,108, 97,109,101,110, 58, 32, 10, 48, 58, 52, 48, - 48, 52, 58, 51, 58, 48, 58, 48, 10, 48, 58, 52, 48, 50, 49, 58, 51, 58, - 48, 58, 48, 10, 48, 58, 56, 55, 50,102, 58, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 56, 55, 51, 51, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, - 56, 55, 51, 55, 58, 49, 58, 50, 48, 58, 50, 48, 32, 10, 48, 58, 56, 55, - 51, 98, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 56, 55, 51,102, 58, - 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 56, 55, 52, 51, 58, 49, 58, 50, - 48, 58, 50, 48, 10, 10, 59, 40,112,111, 99,107,101,116, 32,103, 97,108, - 32, 40,106, 97,112, 97,110, 41, 41, 32, 97,110,100, 32, 99,108,111,110, - 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,112, 99,107, - 116,103, 97,108, 58, 10,112, 99,107,116,103, 97,108, 98, 58, 10,112, 99, - 107,116,103, 97,108, 50, 58, 10,115,112,111,111,108, 51, 58, 32, 10,115, - 112,111,111,108, 51,105, 58, 32, 10,112, 99,107,116,103, 97,108, 50,106, - 58, 10, 48, 58, 48, 52, 54, 55, 58, 50, 58, 54, 52, 58, 48, 48, 10, 10, - 112, 98, 97,108,108,111,111,110, 58, 10,112, 98, 97,108,108,111,111,110, - 114, 58, 10, 48, 58, 48, 50, 50, 48, 58, 55, 48, 58, 49, 49, 58, 51, 48, - 10, 48, 58, 48, 48, 50, 50, 58, 51, 58, 48, 48, 58, 48, 48, 10, 32, 10, - 59, 40,112,101,116,116, 97,110, 32,112,121,117,117, 32, 40,106, 97,112, - 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,112, - 101,116,116, 97,110,112, 58, 32, 10, 48, 58, 99, 48, 99, 50, 58, 49,101, - 58, 50, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 108, 97,112,102,103,104,116, 46, 99, 32, 45, 32, 65, 68, 68, 69, 68, 32, - 67, 76, 79, 78, 69, 10,112,101,114,102,114,109, 97,110, 58, 32, 10,112, - 101,114,102,114,109, 97,110,117, 58, 10, 48, 58, 56, 48, 48, 54, 58, 51, - 48, 58, 56, 57, 58, 49, 50, 10, 48, 58, 56, 54, 48, 57, 58, 48, 55, 58, - 50, 52, 58, 48, 48, 10, 10, 59, 40,112,101,114, 99,117,115,115,111,114, - 44, 32,116,104,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,112,101,114, 99,117,115,115, 58, 32, 10, 48, 58, 53,100, 97, 56, 58, - 51, 55, 58, 48, 48, 58, 50, 52, 10, 32, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 105,115,115, 32, 98,117, 98, 98,108,101, 32, 50, 41, 13, 10,109,105,115, + 115, 98, 50, 58, 13, 10, 48, 58,101, 54, 53, 52, 58, 50, 51, 58, 48, 48, + 58, 52, 56, 13, 10, 48, 58,101, 54, 52, 99, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,101, 54, 52,100, 58, 49, 58, 51, 48, 58, 51, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,101,110,101,103, 97, + 100,101, 46, 99, 32, 40,110,101,107,107,101,116,115,117, 32,107,111,117, + 104, 97, 32,107,117,110,105,111, 45,107,117,110, 32, 40,106, 97,112, 97, + 110, 32, 98,111,111,116,108,101,103, 41, 41, 13, 10,107,117,110,105,111, + 107,117,110, 98, 58, 13, 10,107,117,110,105,111,107,117,110, 58, 13, 10, + 48, 58, 50,101, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, 48, 58, 49, 48, + 50, 99, 58, 50, 56, 58, 52, 55, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,114,111, 99,107,114, 97,103,101, 46, 99, 32, 40, + 114,111, 99,107, 32, 96,110, 32,114, 97,103,101, 32, 40,119,111,114,108, + 100, 63, 41, 13, 10,114,111, 99,107,114, 97,103,101, 58, 13, 10,114,111, + 99,107,114, 97,103,101,106, 58, 13, 10, 48, 58, 52, 57, 56, 48, 58, 52, + 101, 58, 48, 49, 58, 53, 51, 13, 10, 48, 58, 52, 56, 98,101, 58, 51, 58, + 48, 49, 58, 56, 48, 13, 10, 48, 58, 52,102, 99, 56, 58, 49, 58, 53, 52, + 58, 53, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 82,111, 99,107, + 32, 39,110, 32, 82, 97,103,101, 32, 40, 80,114,111,116,111,116,121,112, + 101, 63, 41, 13, 10,114,111, 99,107,114, 97,103,101, 97, 58, 13, 10, 48, + 58, 52, 57, 56, 48, 58, 52,101, 58, 48, 49, 58, 53, 51, 13, 10, 48, 58, + 52, 56, 98,101, 58, 51, 58, 48, 49, 58, 56, 48, 13, 10, 48, 58, 52, 56, + 54, 54, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,103, 97,108, 97,120,105, 97,110, 46, 99, 32, 40,122, + 101,114,111, 32,116,105,109,101, 41, 13, 10,122,101,114,111,116,105,109, + 101, 58, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 40,115, 99,114, 97,109, 98,108,101,100, 32,101,103, + 103, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,115, 99,114,101,103,103, 58, 13, 10, + 101,103,103,115, 58, 13, 10, 48, 58, 52, 48, 48, 58, 49,101, 58, 49, 55, + 58, 48, 48, 13, 10, 48, 58, 48, 49, 53, 58, 51, 58, 48, 48, 58, 48, 51, + 13, 10, 13, 10, 59, 40,115, 99,111,114,112,105,111,110, 32, 40, 98,111, + 111,116,108,101,103, 32,111,110, 32,103, 97,108, 97,120,105, 97,110, 32, + 104, 97,114,100,119, 97,114,101, 41, 41, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10,115, 99,111,114,112,110,103, 58, 13, 10, 48, 58, + 52, 50, 48, 55, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 50, + 97,100, 58,102, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, 59, 40,115, 97, + 117,114,111, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 115, 97,117,114,111, 58, 13, 10,115, 97,117,114,111,112, 58, 13, 10, 48, + 58,101, 48, 48, 48, 58, 98, 52, 58, 48, 48, 58, 52,102, 13, 10, 13, 10, + 59, 40,115, 97,115,117,107,101, 32,118,115, 46, 32, 99,111,109,109, 97, + 110,100,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,115, 97,115,117,107,101, 58, 13, 10, 48, 58, 50, 52, 58, 50, 58, 48, + 48, 58, 48, 53, 13, 10, 13, 10, 59, 40,115, 97,109,117,114, 97,105, 32, + 40,115,101,103, 97, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,115, 97,109,117,114, 97,105, 58, 13, 10, 48, 58, 57, 55, 49, + 97, 58, 49, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115, 97, + 102, 97,114,105, 32,114, 97,108,108,121, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 32, 45, 32,104,105,115, 99,111,114,101, 32,117,112, + 100, 97,116,101,115, 32, 97,102,116,101,114, 32,110,101,119, 32,103, 97, + 109,101, 32,115,116, 97,114,116, 32, 33, 33, 33, 13, 10,115, 97,102, 97, + 114,105,114, 58, 13, 10,115, 97,102, 97,114,105,114,106, 58, 13, 10, 48, + 58, 50, 51, 56, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, + 51, 56, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 49, 52, + 49, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 50, 49, 54, 49, 58, + 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 50, 49, 56, 49, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 50, 49, 97, 49, 58, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58, 50, 49, 99, 49, 58, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 48, 58, 50, 49,101, 49, 58, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 13, 10, 59, 40,115, 97,100, 97,114,105, 41, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 13, 10,115, 97,100, 97,114,105, 58, 13, 10, 48, + 58, 99, 51, 49,100, 58, 51, 99, 58, 51, 97, 58, 48, 49, 13, 10, 13, 10, + 59, 40,114,105,100,105,110,103, 32,102,105,103,104,116, 32, 40,119,111, + 114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,114,105,100,105,110,103, + 102, 58, 13, 10,114,105,100,105,110,103,102,117, 58, 13, 10,114,105,100, + 105,110,103,102,106, 58, 13, 10, 48, 58, 52, 48, 56, 48, 54, 48, 58, 56, + 48, 58, 48, 48, 58, 51,102, 13, 10, 13, 10, 59, 40,114,101,105,107, 97, + 105, 32,100,111,117,115,104,105, 32, 40,106, 97,112, 97,110, 41, 41, 13, + 10,114,101,105,107, 97,105,100,115, 58, 13, 10, 48, 58, 52, 51, 99, 97, + 58, 49,101, 58, 48, 48, 58,101, 56, 13, 10, 48, 58, 52, 48,100,102, 58, + 50, 58, 49, 51, 58, 56, 56, 13, 10, 13, 10, 59, 40,114,101,100, 32, 97, + 108,101,114,116, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,114,101,100, 97,108,101,114,116, 58, 13, 10, 48, 58, 51, 48, 49, 58, + 102, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,114, 97,105,100,101,114,115, + 53, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,114, 97,105,100,101,114,115, 53, 58, + 13, 10,114, 97,105,100,101,114,115, 53,116, 58, 13, 10, 48, 58,101, 48, + 55, 53, 58, 51, 55, 58, 48, 48, 58, 53, 53, 13, 10, 48, 58, 56, 56, 56, + 99, 58, 55, 58, 50, 50, 58, 49, 48, 13, 10, 13, 10, 59, 40,114, 97,102, + 102,108,101,115,105, 97, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,114, 97,102,108,101,115,105, 97, 58, 13, 10, 48, 58,100, 51, + 48, 48, 58, 53, 48, 58, 48, 48, 58, 52, 97, 13, 10, 48, 58, 99, 48, 49, + 55, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10, 59, 40,112,117,122, + 122,108,101, 32,100,101, 32, 98,111,119,108,105,110,103, 32, 40,106, 97, + 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,112,122,108, 98,111,119,108, 58, 13, 10, 48, 58, 50, 48, 97, 57, 99, + 52, 58, 54, 48, 58, 48, 97, 58, 97, 56, 13, 10, 13, 10, 59, 40,112,117, + 110,107, 32,115,104,111,116, 32, 40,117,115, 32, 52, 32,112,108, 97,121, + 101,114,115, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,112,117,110,107,115,104, + 111,116, 58, 13, 10,112,117,110,107,115,104,111,116,106, 58, 13, 10,112, + 117,110,107,115,104,111,116, 50, 58, 13, 10, 48, 58, 56, 48, 55, 48, 48, + 58, 51, 48, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, 59, 40,112,111,119, + 101,114, 32,115,117,114,103,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 32, 45, 32, 72,105,115, 99,111,114,101,115, 32, 97,112,112, + 101, 97,114, 32, 99,111,114,114,101, 99,116,108,121, 32, 97,102,116,101, + 114, 32,103, 97,109,101, 32,101,110,116,101,114,115, 32, 97,116,116,114, + 97, 99,116, 32,109,111,100,101, 33, 13, 10,112,115,117,114,103,101, 58, + 13, 10, 48, 58, 97, 56, 54, 99, 58, 54, 58, 50, 48, 58, 51, 48, 13, 10, + 48, 58, 98, 48, 56, 48, 58, 53, 48, 58, 51, 49, 58,102,102, 13, 10, 13, + 10, 59, 40,112,111,112, 32,102,108, 97,109,101,114, 32, 40,112,114,111, + 116,101, 99,116,101,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101, + 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 45, 32,104,105,115, + 99,111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,102,116,101,114, + 32,110,101,119, 32,103, 97,109,101, 32,115,116, 97,114,116, 32, 33, 33, + 33, 13, 10,112,111,112,102,108, 97,109,101, 58, 13, 10,112,111,112,102, + 108, 97,109,101, 97, 58, 13, 10,112,111,112,102,108, 97,109,101, 98, 58, + 13, 10,112,111,112,102,108, 97,109,101,110, 58, 13, 10, 48, 58, 52, 48, + 48, 52, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, 52, 48, 50, 49, 58, 51, + 58, 48, 58, 48, 13, 10, 48, 58, 56, 55, 50,102, 58, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 56, 55, 51, 51, 58, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 56, 55, 51, 55, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 56, 55, 51, 98, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 56, 55, 51,102, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 56, 55, + 52, 51, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 40,112,111, + 99,107,101,116, 32,103, 97,108, 32, 40,106, 97,112, 97,110, 41, 41, 32, + 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10,112, 99,107,116,103, 97,108, 58, 13, 10,112, 99, + 107,116,103, 97,108, 98, 58, 13, 10,112, 99,107,116,103, 97,108, 50, 58, + 13, 10,115,112,111,111,108, 51, 58, 13, 10,115,112,111,111,108, 51,105, + 58, 13, 10,112, 99,107,116,103, 97,108, 50,106, 58, 13, 10, 48, 58, 48, + 52, 54, 55, 58, 50, 58, 54, 52, 58, 48, 48, 13, 10, 13, 10,112, 98, 97, + 108,108,111,111,110, 58, 13, 10,112, 98, 97,108,108,111,111,110,114, 58, + 13, 10, 48, 58, 48, 50, 50, 48, 58, 55, 48, 58, 49, 49, 58, 51, 48, 13, + 10, 48, 58, 48, 48, 50, 50, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 40,112,101,116,116, 97,110, 32,112,121,117,117, 32, 40,106, 97, + 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,112,101,116,116, 97,110,112, 58, 13, 10, 48, 58, 99, 48, 99, 50, 58, + 49,101, 58, 50, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,115,108, 97,112,102,103,104,116, 46, 99, 32, 45, 32, 65, 68, + 68, 69, 68, 32, 67, 76, 79, 78, 69, 13, 10,112,101,114,102,114,109, 97, + 110, 58, 13, 10,112,101,114,102,114,109, 97,110,117, 58, 13, 10, 48, 58, + 56, 48, 48, 54, 58, 51, 48, 58, 56, 57, 58, 49, 50, 13, 10, 48, 58, 56, + 54, 48, 57, 58, 48, 55, 58, 50, 52, 58, 48, 48, 13, 10, 13, 10, 59, 40, + 112,101,114, 99,117,115,115,111,114, 44, 32,116,104,101, 41, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,112,101,114, 99,117,115,115, + 58, 13, 10, 48, 58, 53,100, 97, 56, 58, 51, 55, 58, 48, 48, 58, 50, 52, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102, - 105, 99,105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 55, - 46, 57, 51, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111, - 119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 47,103,101,111,109, - 97,110, 47,111,116,104,101,114,115, 32, 32, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, + 108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32, + 104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 51, 32, 97,100, + 100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, + 32,108,101,101,122,101,114, 47,103,101,111,109, 97,110, 47,111,116,104, + 101,114,115, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 10, 10, 59, 40,112,101,101,107, 45, 97, 45, 98,111,111, - 33, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,112,101,101, - 107, 97, 98,111,111, 58, 10,112,101,101,107, 97, 98,111,111,117, 58, 10, - 48, 58, 49,102, 48, 50, 55, 56, 58, 54, 48, 58, 48, 48, 58,102, 97, 10, - 48, 58, 49,102, 48, 51, 56, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 32, - 10, 59, 40,112, 97,115,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10,112, 97,115,115, 58, 10, 48, 58, 56, 49, 50, 48, 48, 58, 53, - 48, 58, 52, 98, 58, 48, 48, 10, 48, 58, 56, 48, 48, 53,101, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 32, 10, 59, 40,112, 97,100,100,108,101, 32,109, - 97,110,105, 97, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 112, 97,100,100,108,101,109, 97, 58, 10, 48, 58, 56, 48, 49, 97, 56, 58, - 50, 56, 58, 48, 50, 58, 48, 51, 10, 48, 58, 56, 50, 49, 48, 56, 58, 97, - 48, 58, 48, 48, 58, 50, 48, 10, 10, 59, 40,111,110,110, 97, 32,115, 97, - 110,115,105,114,111,117, 32, 45, 32,116,121,112,104,111,111,110, 32,103, - 97,108, 32, 40,115,101,116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108, - 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,111, - 110,110, 97, 51, 52,114,111, 58, 32, 10,111,110,110, 97, 51, 52,114,111, - 97, 58, 10, 48, 58,101, 49,100, 55, 58, 56, 50, 58, 48, 48, 58, 54, 53, - 32, 10, 48, 58,101, 49, 56, 56, 58, 51, 58, 48, 48, 58, 48, 49, 10, 32, - 10, 59, 40,110,111, 98,111,114, 97,110,107, 97, 32, 40,106, 97,112, 97, - 110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,110,111, - 98, 58, 10,110,111, 98, 98, 58, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, - 58, 48, 48, 58, 50,101, 10, 48, 58,102, 48, 48, 48, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 40,110,105,110,106, 97,107,117,110, 32,109, 97, - 106,111,117, 32,110,111, 32, 98,111,117,107,101,110, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,110,105,110,106, 97,107,117,110, 58, - 10, 48, 58,101, 48, 97, 51, 58, 51, 55, 58, 48, 48, 58, 50, 48, 10, 48, - 58, 99, 48, 56, 99, 58, 55, 58, 50, 50, 58, 49, 48, 10, 32, 10, 59, 40, - 110,105,110,106, 97, 32,107,105,100, 32,105,105, 32, 40,115,101,116, 32, - 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 32, 10,110,105,110,106, 97,107,100, 50, - 58, 10,110,105,110,106, 97,107,100, 50, 97, 58, 32, 10,110,105,110,106, - 97,107,100, 50, 98, 58, 32, 10,114,100, 97, 99,116,105,111,110, 58, 10, - 110,105,110,106, 97,107,100, 50, 99, 58, 10, 48, 58,101, 48,102, 52, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 52,101, 58, 54, 52, 58, - 51, 49, 58, 50, 48, 10, 10, 99,111,108,117,109,110,115, 58, 10, 99,111, - 108,117,109,110,115,106, 58, 10, 99,111,108,117,109,110,115, 50, 58, 10, - 99,111,108,117,109,110, 50,106, 58, 10, 48, 58,102,102,102, 99, 49,102, - 58, 57, 48, 58, 53, 53, 58, 48, 48, 10, 10, 59, 40,110,101,119, 32,115, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, + 10, 13, 10, 59, 40,112,101,101,107, 45, 97, 45, 98,111,111, 33, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,112,101,101,107, 97, + 98,111,111, 58, 13, 10,112,101,101,107, 97, 98,111,111,117, 58, 13, 10, + 48, 58, 49,102, 48, 50, 55, 56, 58, 54, 48, 58, 48, 48, 58,102, 97, 13, + 10, 48, 58, 49,102, 48, 51, 56, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 40,112, 97,115,115, 41, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10,112, 97,115,115, 58, 13, 10, 48, 58, 56, 49, 50, + 48, 48, 58, 53, 48, 58, 52, 98, 58, 48, 48, 13, 10, 48, 58, 56, 48, 48, + 53,101, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,112, 97, + 100,100,108,101, 32,109, 97,110,105, 97, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,112, 97,100,100,108,101,109, 97, 58, 13, 10, + 48, 58, 56, 48, 49, 97, 56, 58, 50, 56, 58, 48, 50, 58, 48, 51, 13, 10, + 48, 58, 56, 50, 49, 48, 56, 58, 97, 48, 58, 48, 48, 58, 50, 48, 13, 10, + 13, 10, 59, 40,111,110,110, 97, 32,115, 97,110,115,105,114,111,117, 32, + 45, 32,116,121,112,104,111,111,110, 32,103, 97,108, 32, 40,115,101,116, + 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,111,110,110, 97, 51, 52,114, + 111, 58, 13, 10,111,110,110, 97, 51, 52,114,111, 97, 58, 13, 10, 48, 58, + 101, 49,100, 55, 58, 56, 50, 58, 48, 48, 58, 54, 53, 13, 10, 48, 58,101, + 49, 56, 56, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 40,110, + 111, 98,111,114, 97,110,107, 97, 32, 40,106, 97,112, 97,110, 41, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,110,111, 98, 58, 13, + 10,110,111, 98, 98, 58, 13, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, + 48, 48, 58, 50,101, 13, 10, 48, 58,102, 48, 48, 48, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 40,110,105,110,106, 97,107,117,110, 32, + 109, 97,106,111,117, 32,110,111, 32, 98,111,117,107,101,110, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,110,105,110,106, 97,107, + 117,110, 58, 13, 10, 48, 58,101, 48, 97, 51, 58, 51, 55, 58, 48, 48, 58, + 50, 48, 13, 10, 48, 58, 99, 48, 56, 99, 58, 55, 58, 50, 50, 58, 49, 48, + 13, 10, 13, 10, 59, 40,110,105,110,106, 97, 32,107,105,100, 32,105,105, + 32, 40,115,101,116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110, + 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,110,105, + 110,106, 97,107,100, 50, 58, 13, 10,110,105,110,106, 97,107,100, 50, 97, + 58, 13, 10,110,105,110,106, 97,107,100, 50, 98, 58, 13, 10,114,100, 97, + 99,116,105,111,110, 58, 13, 10,110,105,110,106, 97,107,100, 50, 99, 58, + 13, 10, 48, 58,101, 48,102, 52, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58,101, 48, 52,101, 58, 54, 52, 58, 51, 49, 58, 50, 48, 13, 10, 13, + 10, 99,111,108,117,109,110,115, 58, 13, 10, 99,111,108,117,109,110,115, + 106, 58, 13, 10, 99,111,108,117,109,110,115, 50, 58, 13, 10, 99,111,108, + 117,109,110, 50,106, 58, 13, 10, 48, 58,102,102,102, 99, 49,102, 58, 57, + 48, 58, 53, 53, 58, 48, 48, 13, 10, 13, 10, 59, 40,110,101,119, 32,115, 105,110, 98, 97,100, 32, 55, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10,110,101,119,115,105,110, 55, 58, 32, 10,110,101,119,115,105, - 110, 55, 97, 58, 10, 48, 58, 52, 51,100, 51, 58, 52, 56, 58, 48, 48, 58, - 49, 48, 10, 48, 58, 52, 49, 51,100, 58, 51, 58, 48, 58, 48, 10, 10, 59, - 40,110, 97,118, 97,108,111,110,101, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,110, 97,118, 97,108,111,110,101, 58, 10,110, 97,118, - 97,114,111,110,101, 58, 32, 10, 48, 58, 52, 48, 50,100, 58, 51, 58, 48, - 58, 48, 10, 10, 59, 40,110, 97,116,111, 32,100,101,102,101,110,115,101, - 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,110, 97,116,111,100,101,102, 58, 10,110, 97, - 116,111,100,101,102, 97, 58, 10, 48, 58, 56,100,102, 54, 58, 52, 57, 58, - 51, 48, 58, 50, 48, 10, 10, 59, 40,110, 97,115,116, 97,114, 32, 40,119, - 111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,110, 97,115,116, 97,114, - 58, 10,110, 97,115,116, 97,114,119, 58, 10,114, 97,115,116,115, 97,103, - 50, 58, 10, 48, 58, 54, 48, 49,101,101,102, 58, 51, 97, 58, 48, 48, 58, - 52, 50, 10, 48, 58, 54, 48, 48, 53, 52, 53, 58, 51, 58, 48, 48, 58, 55, - 55, 10, 32, 10, 59, 40,104,101,120,105,111,110, 32, 40,106, 97,112, 97, - 110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,104,101, - 120,105,111,110, 58, 32, 10,104,101,120,105,111,110, 98, 58, 10, 48, 58, - 97, 55, 52, 48, 58, 51, 58, 48, 48, 58, 49, 48, 10, 48, 58, 97, 55, 52, - 51, 58, 50, 55,100, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,103,111,116,121, 97, 46, 99, 32, 40,103,111,116, 45,121, 97, - 32, 40, 49, 50, 47, 50, 52, 49, 57, 56, 49, 44,112,114,111,116,111,116, - 121,112,101, 32, 63, 41, 41, 32, 45, 32, 65, 68, 68, 69, 68, 32, 67, 76, - 79, 78, 69, 10,103,111,116,121, 97, 58, 10,116,104,101,104, 97,110,100, - 58, 32, 10, 48, 58, 53, 48, 50, 49, 58, 51, 58, 48, 48, 58, 48, 49, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40,114, 97,100, - 97,114, 32,122,111,110,101, 32, 45, 32, 65, 68, 68, 69, 68, 32, 67, 76, - 79, 78, 69, 41, 10,111,117,116,108,105,110,101, 58, 10,114, 97,100, 97, - 114,122,111,110, 58, 10,114, 97,100, 97,114,122,111,110, 49, 58, 32, 10, - 114, 97,100, 97,114,122,111,110,116, 58, 32, 10, 48, 58, 49, 99, 48, 56, - 58, 51, 53, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,105,110,118,105,110, - 99,111, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,105,110, - 118,105,110, 99,111, 58, 10, 48, 58, 56, 51, 57, 56, 58, 49, 54, 58, 48, - 48, 58, 48, 48, 10, 32, 10, 59, 40,105,110,118,105,110, 99,111, 32, 47, - 32,104,101, 97,100, 32,111,110, 32, 50, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,105,110,118,104,111, 50, 58, 10, 48, 58, 56, 51, - 98, 54, 58, 49, 54, 58, 48, 48, 58, 48, 48, 32, 10, 48, 58, 56, 51, 57, - 50, 58, 49, 50, 58, 51, 48, 58, 51, 48, 10, 10, 59, 40,107, 97,111,115, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,107, 97,111,115, - 58, 32, 10, 48, 58, 48, 51, 99, 56, 58, 51, 48, 58, 56, 52, 58, 52, 52, - 10, 10, 59, 40,107,101,110, 45,103,111, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,107,101,110,103,111, 58, 32, 10,107,101,110,103, - 111, 97, 58, 10,108,116,115,119,111,114,100,115, 58, 10, 48, 58,101, 48, - 57,102, 50, 58, 56, 50, 58, 49, 48, 58, 50, 48, 10, 32, 10, 59, 40,107, - 111,100,117,114,101, 32,111,111,107, 97,109,105, 32, 40,106, 97,112, 97, - 110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,107,111, - 100,117,114,101, 58, 32, 10, 48, 58, 54, 51, 55, 99, 48, 58, 52, 58, 48, - 48, 58, 48, 48, 32, 10, 48, 58, 54, 51, 53, 98, 52, 58, 50, 56, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 40,107,110,117, 99,107,108,101, 32, 98, 97, - 115,104, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,107, 98, - 97,115,104, 58, 10,107, 98, 97,115,104,107, 58, 10, 48, 58, 49, 48, 48, - 48, 56, 48, 58, 51, 99, 58, 48, 48, 58, 51, 48, 32, 10, 10, 59, 40,107, - 110,117, 99,107,108,101, 32,106,111,101, 32, 40,115,101,116, 32, 49, 41, + 110, 41, 13, 10,110,101,119,115,105,110, 55, 58, 13, 10,110,101,119,115, + 105,110, 55, 97, 58, 13, 10, 48, 58, 52, 51,100, 51, 58, 52, 56, 58, 48, + 48, 58, 49, 48, 13, 10, 48, 58, 52, 49, 51,100, 58, 51, 58, 48, 58, 48, + 13, 10, 13, 10, 59, 40,110, 97,118, 97,108,111,110,101, 41, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,110, 97,118, 97,108,111,110, + 101, 58, 13, 10,110, 97,118, 97,114,111,110,101, 58, 13, 10, 48, 58, 52, + 48, 50,100, 58, 51, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,110, 97,116, + 111, 32,100,101,102,101,110,115,101, 41, 32, 97,110,100, 32, 99,108,111, + 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,110, + 97,116,111,100,101,102, 58, 13, 10,110, 97,116,111,100,101,102, 97, 58, + 13, 10, 48, 58, 56,100,102, 54, 58, 52, 57, 58, 51, 48, 58, 50, 48, 13, + 10, 13, 10, 59, 40,110, 97,115,116, 97,114, 32, 40,119,111,114,108,100, + 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,110, 97,115,116, 97,114, 58, 13, 10, + 110, 97,115,116, 97,114,119, 58, 13, 10,114, 97,115,116,115, 97,103, 50, + 58, 13, 10, 48, 58, 54, 48, 49,101,101,102, 58, 51, 97, 58, 48, 48, 58, + 52, 50, 13, 10, 48, 58, 54, 48, 48, 53, 52, 53, 58, 51, 58, 48, 48, 58, + 55, 55, 13, 10, 13, 10, 59, 40,104,101,120,105,111,110, 32, 40,106, 97, + 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,104,101,120,105,111,110, 58, 13, 10,104,101,120,105,111,110, 98, 58, + 13, 10, 48, 58, 97, 55, 52, 48, 58, 51, 58, 48, 48, 58, 49, 48, 13, 10, + 48, 58, 97, 55, 52, 51, 58, 50, 55,100, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,103,111,116,121, 97, 46, 99, 32, + 40,103,111,116, 45,121, 97, 32, 40, 49, 50, 47, 50, 52, 49, 57, 56, 49, + 44,112,114,111,116,111,116,121,112,101, 32, 63, 41, 41, 32, 45, 32, 65, + 68, 68, 69, 68, 32, 67, 76, 79, 78, 69, 13, 10,103,111,116,121, 97, 58, + 13, 10,116,104,101,104, 97,110,100, 58, 13, 10, 48, 58, 53, 48, 50, 49, + 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 99,118,115, 46, 99, 32, 40,114, 97,100, 97,114, 32,122,111,110,101, + 32, 45, 32, 65, 68, 68, 69, 68, 32, 67, 76, 79, 78, 69, 41, 13, 10,111, + 117,116,108,105,110,101, 58, 13, 10,114, 97,100, 97,114,122,111,110, 58, + 13, 10,114, 97,100, 97,114,122,111,110, 49, 58, 13, 10,114, 97,100, 97, + 114,122,111,110,116, 58, 13, 10, 48, 58, 49, 99, 48, 56, 58, 51, 53, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,105,110,118,105,110, 99,111, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,105,110,118, + 105,110, 99,111, 58, 13, 10, 48, 58, 56, 51, 57, 56, 58, 49, 54, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,105,110,118,105,110, 99,111, 32, + 47, 32,104,101, 97,100, 32,111,110, 32, 50, 41, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 13, 10,105,110,118,104,111, 50, 58, 13, 10, 48, + 58, 56, 51, 98, 54, 58, 49, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 56, 51, 57, 50, 58, 49, 50, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, + 40,107, 97,111,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,107, 97,111,115, 58, 13, 10, 48, 58, 48, 51, 99, 56, 58, 51, 48, + 58, 56, 52, 58, 52, 52, 13, 10, 13, 10, 59, 40,107,101,110, 45,103,111, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,107,101,110, + 103,111, 58, 13, 10,107,101,110,103,111, 97, 58, 13, 10,108,116,115,119, + 111,114,100,115, 58, 13, 10, 48, 58,101, 48, 57,102, 50, 58, 56, 50, 58, + 49, 48, 58, 50, 48, 13, 10, 13, 10, 59, 40,107,111,100,117,114,101, 32, + 111,111,107, 97,109,105, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,107,111,100,117,114,101, 58, + 13, 10, 48, 58, 54, 51, 55, 99, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 54, 51, 53, 98, 52, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 40,107,110,117, 99,107,108,101, 32, 98, 97,115,104, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,107, 98, 97,115, + 104, 58, 13, 10,107, 98, 97,115,104,107, 58, 13, 10, 48, 58, 49, 48, 48, + 48, 56, 48, 58, 51, 99, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 40, + 107,110,117, 99,107,108,101, 32,106,111,101, 32, 40,115,101,116, 32, 49, + 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,107,110, 99,108,106,111,101, 58, 13, + 10,107,110, 99,108,106,111,101, 97, 58, 13, 10, 98, 99,114,117,115,104, + 101,114, 58, 13, 10, 48, 58,102, 48, 49, 97, 58, 50,100, 58, 48, 48, 58, + 52, 51, 13, 10, 13, 10, 59, 40,107,117,114,105, 32,107,105,110,116,111, + 110, 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111, + 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,107, + 117,114,105,107,105,110,116, 58, 13, 10,107,117,114,105,107,105,110,116, + 117, 58, 13, 10,107,117,114,105,107,105,110,116,106, 58, 13, 10,107,117, + 114,105,107,105,110,116, 97, 58, 13, 10, 48, 58, 56, 97, 97, 51, 58, 97, + 48, 58, 48, 48, 58, 50,101, 13, 10, 13, 10, 59, 40,108,101,103,101,110, + 100, 32,111,102, 32,109, 97,107, 97,105, 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,107,110, 99,108,106,111,101, 58, 10,107,110, - 99,108,106,111,101, 97, 58, 10, 98, 99,114,117,115,104,101,114, 58, 10, - 48, 58,102, 48, 49, 97, 58, 50,100, 58, 48, 48, 58, 52, 51, 10, 10, 59, - 40,107,117,114,105, 32,107,105,110,116,111,110, 32, 40,119,111,114,108, - 100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,107,117,114,105,107,105,110,116, 58, - 10,107,117,114,105,107,105,110,116,117, 58, 10,107,117,114,105,107,105, - 110,116,106, 58, 10,107,117,114,105,107,105,110,116, 97, 58, 10, 48, 58, - 56, 97, 97, 51, 58, 97, 48, 58, 48, 48, 58, 50,101, 10, 32, 10, 59, 40, - 108,101,103,101,110,100, 32,111,102, 32,109, 97,107, 97,105, 32, 40,119, - 111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,108,111,109, 97,107, 97, - 105, 58, 10,109, 97,107, 97,105,100,101,110, 58, 32, 10, 48, 58,102,102, - 48, 48, 48, 58, 50, 58, 48, 48, 58, 48, 51, 32, 10, 48, 58,102,102, 48, - 48, 50, 58, 55,101, 58, 48, 48, 58, 48, 48, 32, 10, 48, 58,102,101, 48, - 54, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 32, 10, 59, 40,107,121,114, - 111,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,107,121, - 114,111,115, 58, 32, 10,107,121,114,111,115,106, 58, 10, 48, 58, 50, 48, - 101, 48, 48, 58, 97,101, 58, 48, 49, 58, 48, 50, 32, 10, 48, 58, 50, 48, - 48, 50, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,108,105,122, - 97,114,100, 32,119,105,122, 97,114,100, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,108,105,122,119,105,122, 58, 32, 10, 48, 58, 52, - 100, 97,102, 58, 51, 99, 58, 52,100, 58, 48, 49, 10, 48, 58, 52, 51,101, - 100, 58, 54, 58, 48, 48, 58, 52, 48, 10, 10, 59, 40,108,111,115,116, 32, - 116,111,109, 98, 32, 40,101, 97,115,121, 41, 41, 32, 97,110,100, 32, 99, - 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, - 10,108,111,115,116,116,111,109, 98, 58, 32, 10,108,111,115,116,116,111, - 109, 98,104, 58, 32, 10, 48, 58, 56, 49, 49, 48, 58, 53, 48, 58, 48, 51, - 58, 48, 48, 10, 10, 59, 40,109, 97, 99,104, 32,114,105,100,101,114, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,109, 97, 99,104,114, - 105,100,114, 58, 10, 48, 58, 48, 55, 49, 52, 58, 53, 48, 58, 48, 48, 58, - 52, 98, 10, 32, 10, 59, 40,109, 97,100, 32, 99,114, 97,115,104,101,114, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,109, 97,100, 99, - 114, 97,115,104, 58, 10, 48, 58, 99, 50, 98, 51, 58, 52, 98, 58, 48, 48, - 58, 52, 98, 10, 10, 59, 40,109, 97,103,105, 99, 97,108, 32,115,112,111, - 116, 32,105,105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 109, 97,103,115,112,111,116, 50, 58, 10, 48, 58, 54, 48, 48, 55, 58, 50, - 58, 48, 48, 58, 50, 48, 32, 10, 48, 58, 54, 48, 48, 57, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 40,109,101,103, 97,116, 97, 99,107, 41, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,109,101,103, 97,116, 97, - 99,107, 58, 10, 48, 58, 48, 48, 99, 52, 58,102, 58, 48, 48, 58, 49, 97, - 10, 10, 59, 40,109,105,110,101,102,105,101,108,100, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 32, 10,109,105,110,101,102,108,100, 58, - 10, 48, 58, 56, 48,102, 51, 58, 51, 99, 58, 48, 49, 58, 52, 51, 10,109, - 105,110,101,102,108,100,102,101, 58, 10, 48, 58,101,102, 51, 58, 51, 99, - 58, 48, 51, 58, 53, 48, 10, 32, 10, 59, 40, 98,117, 99,107,121, 32,111, - 39,104, 97,114,101, 32, 40,119,111,114,108,100, 32,118,101,114,115,105, - 111,110, 32,101, 97, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10, 98,117, 99,107,121, - 58, 10, 98,117, 99,107,121,117, 97, 98, 58, 10, 98,117, 99,107,121, 97, - 97, 98, 58, 10, 98,117, 99,107,121,101, 97, 58, 10, 48, 58, 56, 48, 49, - 101, 48, 58, 53, 48, 58, 48, 48, 58, 48, 52, 10, 32, 10, 59, 40,109,105, - 115,116,101,114, 32,118,105,107,105,110,103, 41, 32, 97,110,100, 32, 99, - 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 109,114,118,105,107,105,110,103, 58, 10,109,114,118,105,107,110,103,106, - 58, 32, 10, 48, 58,100, 52, 50, 99, 58, 49, 53, 58, 53, 57, 58, 52, 55, - 10, 48, 58,100, 51, 48, 48, 58, 49, 53, 58, 48, 48, 58, 48, 49, 32, 10, - 48, 58, 99, 48, 56, 54, 58, 51, 58, 48, 48, 58, 48, 50, 10, 32, 10, 59, + 101,111, 77, 97,110, 41, 13, 10,108,111,109, 97,107, 97,105, 58, 13, 10, + 109, 97,107, 97,105,100,101,110, 58, 13, 10, 48, 58,102,102, 48, 48, 48, + 58, 50, 58, 48, 48, 58, 48, 51, 13, 10, 48, 58,102,102, 48, 48, 50, 58, + 55,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,101, 48, 54, 48, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,107,121,114,111,115, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,107,121,114, + 111,115, 58, 13, 10,107,121,114,111,115,106, 58, 13, 10, 48, 58, 50, 48, + 101, 48, 48, 58, 97,101, 58, 48, 49, 58, 48, 50, 13, 10, 48, 58, 50, 48, + 48, 50, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,108, + 105,122, 97,114,100, 32,119,105,122, 97,114,100, 41, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,108,105,122,119,105,122, 58, 13, 10, + 48, 58, 52,100, 97,102, 58, 51, 99, 58, 52,100, 58, 48, 49, 13, 10, 48, + 58, 52, 51,101,100, 58, 54, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, 59, + 40,108,111,115,116, 32,116,111,109, 98, 32, 40,101, 97,115,121, 41, 41, + 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,108,111,115,116,116,111,109, 98, 58, 13, 10, + 108,111,115,116,116,111,109, 98,104, 58, 13, 10, 48, 58, 56, 49, 49, 48, + 58, 53, 48, 58, 48, 51, 58, 48, 48, 13, 10, 13, 10, 59, 40,109, 97, 99, + 104, 32,114,105,100,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,109, 97, 99,104,114,105,100,114, 58, 13, 10, 48, 58, 48, + 55, 49, 52, 58, 53, 48, 58, 48, 48, 58, 52, 98, 13, 10, 13, 10, 59, 40, + 109, 97,100, 32, 99,114, 97,115,104,101,114, 41, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 13, 10,109, 97,100, 99,114, 97,115,104, 58, 13, + 10, 48, 58, 99, 50, 98, 51, 58, 52, 98, 58, 48, 48, 58, 52, 98, 13, 10, + 13, 10, 59, 40,109, 97,103,105, 99, 97,108, 32,115,112,111,116, 32,105, + 105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109, 97, + 103,115,112,111,116, 50, 58, 13, 10, 48, 58, 54, 48, 48, 55, 58, 50, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58, 54, 48, 48, 57, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 40,109,101,103, 97,116, 97, 99,107, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109,101,103, 97, + 116, 97, 99,107, 58, 13, 10, 48, 58, 48, 48, 99, 52, 58,102, 58, 48, 48, + 58, 49, 97, 13, 10, 13, 10, 59, 40,109,105,110,101,102,105,101,108,100, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109,105,110, + 101,102,108,100, 58, 13, 10, 48, 58, 56, 48,102, 51, 58, 51, 99, 58, 48, + 49, 58, 52, 51, 13, 10,109,105,110,101,102,108,100,102,101, 58, 13, 10, + 48, 58,101,102, 51, 58, 51, 99, 58, 48, 51, 58, 53, 48, 13, 10, 13, 10, + 59, 40, 98,117, 99,107,121, 32,111, 39,104, 97,114,101, 32, 40,119,111, + 114,108,100, 32,118,101,114,115,105,111,110, 32,101, 97, 41, 32, 97,110, + 100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10, 98,117, 99,107,121, 58, 13, 10, 98,117, 99,107,121,117, + 97, 98, 58, 13, 10, 98,117, 99,107,121, 97, 97, 98, 58, 13, 10, 98,117, + 99,107,121,101, 97, 58, 13, 10, 48, 58, 56, 48, 49,101, 48, 58, 53, 48, + 58, 48, 48, 58, 48, 52, 13, 10, 13, 10, 59, 40,109,105,115,116,101,114, + 32,118,105,107,105,110,103, 41, 32, 97,110,100, 32, 99,108,111,110,101, + 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109,114,118, + 105,107,105,110,103, 58, 13, 10,109,114,118,105,107,110,103,106, 58, 13, + 10, 48, 58,100, 52, 50, 99, 58, 49, 53, 58, 53, 57, 58, 52, 55, 13, 10, + 48, 58,100, 51, 48, 48, 58, 49, 53, 58, 48, 48, 58, 48, 49, 13, 10, 48, + 58, 99, 48, 56, 54, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10, 59, 40,109,111,110,101,121, 32,109,111,110,101,121, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,109,111,110,121,109,111,110,121, 58, 10, - 48, 58, 55, 53, 49, 50, 58, 52, 56, 58, 48, 97, 58, 48, 48, 10, 48, 58, - 55, 50, 54,100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 32, 10, 59, 40,109, - 121,115,116,105, 99, 32,114, 97,105,100,101,114,115, 32, 40,119,111,114, - 108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,109,121,115,116,105, 99,114,105, - 58, 10,103,117,110,104,111,104,107,105, 58, 10, 48, 58,101, 56, 97,102, - 56, 58, 51, 56, 58, 48, 48, 58, 52,100, 32, 10, 48, 58,101, 56, 98, 51, - 48, 58, 57, 52, 58, 50,101, 58, 48, 48, 10, 10, 59, 40,109,121,115,116, - 101,114,105,111,117,115, 32,115,116,111,110,101,115, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,109,121,115,116,115,116,111,110, 58, - 10,109,121,115,116,115,116,111,110,111, 58, 10,109,121,115,116,115,116, - 111,110,111,105, 58, 10, 48, 58, 48, 51, 48, 56, 58, 51, 55, 58, 48, 48, - 58, 48, 99, 10, 48, 58, 48, 48, 49, 97, 58, 53, 58, 48, 48, 58, 48, 48, - 32, 10, 48, 58, 49, 48, 51, 51, 58, 56, 58, 52, 48, 58, 52, 49, 10, 32, - 10, 59, 40, 99,121, 98,101,114, 98,111,116,115, 58, 32,102,117,108,108, - 109,101,116, 97,108, 32,109, 97,100,110,101,115,115, 32, 40,106, 97,112, - 97,110, 32, 57, 53, 48, 52, 50, 48, 41, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10, 99,121, 98,111,116,115, 58, 32, 10, 99,121, 98, - 111,116,115,106, 58, 10, 99,121, 98,111,116,115,117, 58, 10, 99,121, 98, - 111,116,115,106,100, 58, 10, 99,121, 98,111,116,115,117,100, 58, 10, 48, - 58,102,102,101, 54, 97, 48, 58, 53, 58, 48, 48, 58, 52, 51, 10, 48, 58, - 102,102,101, 54, 97, 53, 58, 52, 98, 58, 52, 49, 58, 48, 48, 10, 32, 10, - 59, 40,115,112, 97, 99,101, 32,116,114,101,107, 32, 40,117,112,114,105, - 103,104,116, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10,115,112, 97, 99,101,116, - 114,107, 58, 10,115,112, 97, 99,101,116,114,107, 99, 58, 10, 48, 58, 56, - 51, 56, 99, 58, 52, 58, 48, 58, 48, 10, 10,115,112, 97, 99,101,122, 97, - 112, 58, 32, 10, 48, 58,100, 48, 48,102, 58, 49, 58,102,102, 58,102,102, - 32, 10, 48, 58,100, 48, 52, 49, 58, 54, 58, 48, 58, 48, 32, 10, 48, 58, - 100, 48, 49,100, 58, 54, 58, 48, 58, 48, 10, 10, 10, 59, 40, 97,109,101, - 114,105, 99, 97,110, 32,115,112,101,101,100,119, 97,121, 32, 40,115,101, - 116, 32, 49, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 45, 32, 42, 32, 85, 78, 68, 69, - 82, 32, 84, 69, 83, 84, 32, 42, 10, 97,109,115,112,100,119,121, 58, 32, - 10, 97,109,115,112,100,119,121, 97, 58, 10, 48, 58,101, 52, 48, 50, 58, - 49, 57, 48, 58, 53, 48, 58, 48, 48, 32, 10, 48, 58,101, 54, 48, 50, 58, - 49, 57, 48, 58, 53, 48, 58, 48, 48, 32, 10, 48, 58,101, 51,100,101, 58, - 50, 51, 58, 48, 48, 58, 53, 99, 10, 32, 10, 59, 40,115,112,101,101,100, - 32, 98, 97,108,108, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 32, 10,115,112,101,101,100, 98, 97,108, 58, 32, 10, 48, 58,102, 56, 48, - 48, 58, 52, 54, 58, 50, 48, 58, 53, 48, 10, 10, 59, 40,115,112,101,101, - 100, 32,102,114,101, 97,107, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 10,115,112,101,101,100,102,114,107, 58, 10, 48, 58, 49, 50, 56, - 58, 50, 58, 48, 58, 48, 10, 32, 10, 59, 40,115,112,105,110, 97,108, 32, - 98,114,101, 97,107,101,114,115, 32, 40,119,111,114,108,100, 41, 41, 32, - 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 32, 10,115,112,105,110,108, 98,114,107, 58, 32, 10,115, - 112,105,110,108, 98,114,107,117, 58, 32, 10, 48, 58,102,102, 97, 99, 55, - 54, 58, 56, 99, 58, 48, 48, 58, 53, 48, 32, 10,115,112,105,110,108, 98, - 114,107,106, 58, 10, 48, 58,102,102, 97, 99, 99,101, 58, 56, 99, 58, 48, - 48, 58, 53, 48, 10, 32, 10, 59, 40,115,112,111,114,116,115, 32,109, 97, - 116, 99,104, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115, - 112,114,116,109,116, 99,104, 58, 32, 10, 48, 58, 55, 53, 48, 48, 58, 51, - 48, 58, 52, 97, 58, 48, 48, 32, 10, 48, 58, 55, 55, 52, 51, 58, 50, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 40,115, 46,114, 46,100, 46, 32,109,105, - 115,115,105,111,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,115,114,100,109,105,115,115,110, 58, 10,102,120, 58, 10, 48, 58,101, - 54,101,102, 58, 53,102, 58, 48, 48, 58,102,102, 10, 10, 59, 40,115,116, - 97,114, 32,106, 97, 99,107,101,114, 32, 40,115,101,103, 97, 41, 41, 32, - 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,115,116, 97,114,106, 97, 99,107, 58, 10, 48, 58, 99, - 48,101, 49, 58, 49,101, 58, 48, 48, 58, 53, 50, 32, 10, 48, 58, 99, 48, - 100, 98, 58, 51, 58, 48, 48, 58, 48, 51, 10, 10,115,116, 97,114,106, 97, - 99,107,115, 58, 10, 48, 58, 99, 49, 48, 50, 58, 50, 51, 58, 48, 48, 58, - 53, 50, 10, 48, 58, 99, 48,102, 98, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 40,115,116,114,101,110,103,116,104, 32, 38, 32,115,107,105,108, - 108, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,115,116,114,110,115,107,105,108, 58, 10, - 103,117,105,110,101,115,115, 58, 32, 10, 48, 58, 99, 48, 99, 52, 58, 49, - 101, 58, 50, 50, 58, 48, 48, 10, 48, 58, 99, 52, 51, 48, 58, 54, 48, 58, - 48, 57, 58, 48, 48, 10, 32, 10, 59, 40,115,117,112,101,114, 32, 98,111, - 110,100, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,115,117, - 112,101,114, 98,111,110, 58, 10, 48, 58, 56, 49, 48,102, 58, 53, 48, 58, - 48, 48, 58, 52, 56, 10, 10, 59, 40,115,117,112,101,114, 32,105,110,118, - 97,100,101,114, 32, 97,116,116, 97, 99,107, 41, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 10,115,105, 97, 50, 54, 53, 48, 58, 32, 10,116, - 105,110,118, 50, 54, 53, 48, 58, 32, 10, 48, 58, 49,100, 48, 55, 58, 50, - 58, 48, 58, 48, 10, 48, 58, 49, 57,102, 97, 58, 49, 58, 51, 48, 58, 51, - 48, 32, 10, 48, 58, 49, 97, 49, 97, 58, 49, 58, 51, 48, 58, 51, 48, 10, - 48, 58, 49, 97, 51, 97, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 49, - 97, 53, 97, 58, 49, 58, 51, 48, 58, 51, 48, 10, 32, 10, 59, 40,115,117, - 112,101,114, 98,105,107,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, - 110, 41, 32, 10,115,117,112,101,114, 98,105,107, 58, 32, 10, 48, 58, 49, - 99, 48, 56, 58, 49,101, 58, 48, 48, 58, 51, 48, 10, 10, 59, 40,115,121, - 118, 97,108,105,111,110, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,115,121,118, 97,108,105,111,110, - 58, 10, 48, 58, 49, 48, 57, 48,101, 99, 58, 49, 48, 58, 48, 48, 58, 48, - 49, 32, 10, 48, 58, 49, 48, 57, 48,102, 99, 58, 53, 52, 58, 52, 57, 58, - 48, 48, 32, 10, 48, 58, 49, 48, 52, 50, 54, 54, 58, 52, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 40,116, 97,105,108,103,117,110,110,101,114, 41, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,116, 97,105,108,103, 58, - 10, 48, 58,100, 56, 58, 52, 58, 48, 58, 48, 10, 10, 59, 40,116,101, 99, - 109,111, 32,107,110,105,103,104,116, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 45, 32,104, - 105,115, 99,111,114,101,115, 32,117,112,100, 97,116,101, 32, 97,102,116, - 101,114, 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,105, - 115, 32,100,105,115,112,108, 97,121,101,100, 32,105,110, 32, 97,116,116, - 114, 97, 99,116, 32,109,111,100,101, 10,116,107,110,105,103,104,116, 58, - 32, 10,119,105,108,100,102, 97,110,103, 58, 32, 10,119,105,108,100,102, - 97,110,103,115, 58, 10, 48, 58, 54, 48, 57, 99,101, 58, 50, 56, 58, 48, - 48, 58, 49, 97, 10, 32, 10, 59, 40,116,105,109,101, 32,108,105,109,105, - 116, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10,116,105, - 109,101,108,105,109,116, 58, 10, 48, 58, 56, 48, 99, 97, 58, 51, 58, 48, - 58, 48, 32, 10, 48, 58, 56, 57, 56, 49, 58, 49, 58, 50, 55, 58, 50, 55, - 10, 48, 58, 56, 57, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 32, 10, 48, - 58, 56, 57, 99, 49, 58, 49, 58, 50, 55, 58, 50, 55, 10, 48, 58, 56, 57, - 101, 49, 58, 49, 58, 50, 55, 58, 50, 55, 10, 48, 58, 56, 97, 48, 49, 58, - 49, 58, 50, 55, 58, 50, 55, 32, 10, 48, 58, 56, 97, 50, 49, 58, 49, 58, - 50, 55, 58, 50, 55, 10, 32, 10, 59, 40,116,105,109,101, 32,116,117,110, - 110,101,108, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10, - 116,105,109,101,116,117,110,108, 58, 10, 48, 58, 56, 48, 49,102, 58, 54, - 58, 48, 58, 48, 10, 48, 58, 99, 52, 54,100, 58, 54, 58, 54, 51, 58, 54, - 51, 10, 10, 59, 40,116,111,107,105, 32,110,111, 32,115,101,110,115,104, + 71,101,111, 77, 97,110, 41, 13, 10,109,111,110,121,109,111,110,121, 58, + 13, 10, 48, 58, 55, 53, 49, 50, 58, 52, 56, 58, 48, 97, 58, 48, 48, 13, + 10, 48, 58, 55, 50, 54,100, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 40,109,121,115,116,105, 99, 32,114, 97,105,100,101,114,115, 32, + 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101, + 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109,121,115, + 116,105, 99,114,105, 58, 13, 10,103,117,110,104,111,104,107,105, 58, 13, + 10, 48, 58,101, 56, 97,102, 56, 58, 51, 56, 58, 48, 48, 58, 52,100, 13, + 10, 48, 58,101, 56, 98, 51, 48, 58, 57, 52, 58, 50,101, 58, 48, 48, 13, + 10, 13, 10, 59, 40,109,121,115,116,101,114,105,111,117,115, 32,115,116, + 111,110,101,115, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,109,121,115,116,115,116,111,110, 58, 13, 10,109,121,115,116,115,116, + 111,110,111, 58, 13, 10,109,121,115,116,115,116,111,110,111,105, 58, 13, + 10, 48, 58, 48, 51, 48, 56, 58, 51, 55, 58, 48, 48, 58, 48, 99, 13, 10, + 48, 58, 48, 48, 49, 97, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 49, 48, 51, 51, 58, 56, 58, 52, 48, 58, 52, 49, 13, 10, 13, 10, 59, 40, + 99,121, 98,101,114, 98,111,116,115, 58, 32,102,117,108,108,109,101,116, + 97,108, 32,109, 97,100,110,101,115,115, 32, 40,106, 97,112, 97,110, 32, + 57, 53, 48, 52, 50, 48, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10, 99,121, 98,111,116,115, 58, 13, 10, 99,121, 98,111,116, + 115,106, 58, 13, 10, 99,121, 98,111,116,115,117, 58, 13, 10, 99,121, 98, + 111,116,115,106,100, 58, 13, 10, 99,121, 98,111,116,115,117,100, 58, 13, + 10, 48, 58,102,102,101, 54, 97, 48, 58, 53, 58, 48, 48, 58, 52, 51, 13, + 10, 48, 58,102,102,101, 54, 97, 53, 58, 52, 98, 58, 52, 49, 58, 48, 48, + 13, 10, 13, 10, 59, 40,115,112, 97, 99,101, 32,116,114,101,107, 32, 40, + 117,112,114,105,103,104,116, 41, 41, 32, 97,110,100, 32, 99,108,111,110, + 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,112, + 97, 99,101,116,114,107, 58, 13, 10,115,112, 97, 99,101,116,114,107, 99, + 58, 13, 10, 48, 58, 56, 51, 56, 99, 58, 52, 58, 48, 58, 48, 13, 10, 13, + 10,115,112, 97, 99,101,122, 97,112, 58, 13, 10, 48, 58,100, 48, 48,102, + 58, 49, 58,102,102, 58,102,102, 13, 10, 48, 58,100, 48, 52, 49, 58, 54, + 58, 48, 58, 48, 13, 10, 48, 58,100, 48, 49,100, 58, 54, 58, 48, 58, 48, + 13, 10, 13, 10, 13, 10, 59, 40, 97,109,101,114,105, 99, 97,110, 32,115, + 112,101,101,100,119, 97,121, 32, 40,115,101,116, 32, 49, 41, 41, 32, 97, + 110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 45, 32, 42, 32, 85, 78, 68, 69, 82, 32, 84, 69, 83, 84, 32, + 42, 13, 10, 97,109,115,112,100,119,121, 58, 13, 10, 97,109,115,112,100, + 119,121, 97, 58, 13, 10, 48, 58,101, 52, 48, 50, 58, 49, 57, 48, 58, 53, + 48, 58, 48, 48, 13, 10, 48, 58,101, 54, 48, 50, 58, 49, 57, 48, 58, 53, + 48, 58, 48, 48, 13, 10, 48, 58,101, 51,100,101, 58, 50, 51, 58, 48, 48, + 58, 53, 99, 13, 10, 13, 10, 59, 40,115,112,101,101,100, 32, 98, 97,108, + 108, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,112, + 101,101,100, 98, 97,108, 58, 13, 10, 48, 58,102, 56, 48, 48, 58, 52, 54, + 58, 50, 48, 58, 53, 48, 13, 10, 13, 10, 59, 40,115,112,101,101,100, 32, + 102,114,101, 97,107, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,115,112,101,101,100,102,114,107, 58, 13, 10, 48, 58, 49, 50, 56, + 58, 50, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,115,112,105,110, 97,108, + 32, 98,114,101, 97,107,101,114,115, 32, 40,119,111,114,108,100, 41, 41, + 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,115,112,105,110,108, 98,114,107, 58, 13, 10, + 115,112,105,110,108, 98,114,107,117, 58, 13, 10, 48, 58,102,102, 97, 99, + 55, 54, 58, 56, 99, 58, 48, 48, 58, 53, 48, 13, 10,115,112,105,110,108, + 98,114,107,106, 58, 13, 10, 48, 58,102,102, 97, 99, 99,101, 58, 56, 99, + 58, 48, 48, 58, 53, 48, 13, 10, 13, 10, 59, 40,115,112,111,114,116,115, + 32,109, 97,116, 99,104, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,115,112,114,116,109,116, 99,104, 58, 13, 10, 48, 58, 55, 53, + 48, 48, 58, 51, 48, 58, 52, 97, 58, 48, 48, 13, 10, 48, 58, 55, 55, 52, + 51, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,115, 46,114, + 46,100, 46, 32,109,105,115,115,105,111,110, 41, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 13, 10,115,114,100,109,105,115,115,110, 58, 13, + 10,102,120, 58, 13, 10, 48, 58,101, 54,101,102, 58, 53,102, 58, 48, 48, + 58,102,102, 13, 10, 13, 10, 59, 40,115,116, 97,114, 32,106, 97, 99,107, + 101,114, 32, 40,115,101,103, 97, 41, 41, 32, 97,110,100, 32, 99,108,111, + 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115, + 116, 97,114,106, 97, 99,107, 58, 13, 10, 48, 58, 99, 48,101, 49, 58, 49, + 101, 58, 48, 48, 58, 53, 50, 13, 10, 48, 58, 99, 48,100, 98, 58, 51, 58, + 48, 48, 58, 48, 51, 13, 10, 13, 10,115,116, 97,114,106, 97, 99,107,115, + 58, 13, 10, 48, 58, 99, 49, 48, 50, 58, 50, 51, 58, 48, 48, 58, 53, 50, + 13, 10, 48, 58, 99, 48,102, 98, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 40,115,116,114,101,110,103,116,104, 32, 38, 32,115,107,105, + 108,108, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,115,116,114,110,115,107,105,108, + 58, 13, 10,103,117,105,110,101,115,115, 58, 13, 10, 48, 58, 99, 48, 99, + 52, 58, 49,101, 58, 50, 50, 58, 48, 48, 13, 10, 48, 58, 99, 52, 51, 48, + 58, 54, 48, 58, 48, 57, 58, 48, 48, 13, 10, 13, 10, 59, 40,115,117,112, + 101,114, 32, 98,111,110,100, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,115,117,112,101,114, 98,111,110, 58, 13, 10, 48, 58, 56, + 49, 48,102, 58, 53, 48, 58, 48, 48, 58, 52, 56, 13, 10, 13, 10, 59, 40, + 115,117,112,101,114, 32,105,110,118, 97,100,101,114, 32, 97,116,116, 97, + 99,107, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115, + 105, 97, 50, 54, 53, 48, 58, 13, 10,116,105,110,118, 50, 54, 53, 48, 58, + 13, 10, 48, 58, 49,100, 48, 55, 58, 50, 58, 48, 58, 48, 13, 10, 48, 58, + 49, 57,102, 97, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 49, 97, + 49, 97, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 49, 97, 51, 97, + 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 49, 97, 53, 97, 58, 49, + 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 40,115,117,112,101,114, 98, + 105,107,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 115,117,112,101,114, 98,105,107, 58, 13, 10, 48, 58, 49, 99, 48, 56, 58, + 49,101, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 40,115,121,118, 97, + 108,105,111,110, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, + 71,101,111, 77, 97,110, 41, 13, 10,115,121,118, 97,108,105,111,110, 58, + 13, 10, 48, 58, 49, 48, 57, 48,101, 99, 58, 49, 48, 58, 48, 48, 58, 48, + 49, 13, 10, 48, 58, 49, 48, 57, 48,102, 99, 58, 53, 52, 58, 52, 57, 58, + 48, 48, 13, 10, 48, 58, 49, 48, 52, 50, 54, 54, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 40,116, 97,105,108,103,117,110,110,101,114, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116, 97,105, + 108,103, 58, 13, 10, 48, 58,100, 56, 58, 52, 58, 48, 58, 48, 13, 10, 13, + 10, 59, 40,116,101, 99,109,111, 32,107,110,105,103,104,116, 41, 32, 97, + 110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 45, 32,104,105,115, 99,111,114,101,115, 32,117,112,100, 97, + 116,101, 32, 97,102,116,101,114, 32,104,105,115, 99,111,114,101, 32,116, + 97, 98,108,101, 32,105,115, 32,100,105,115,112,108, 97,121,101,100, 32, + 105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 13, 10,116, + 107,110,105,103,104,116, 58, 13, 10,119,105,108,100,102, 97,110,103, 58, + 13, 10,119,105,108,100,102, 97,110,103,115, 58, 13, 10, 48, 58, 54, 48, + 57, 99,101, 58, 50, 56, 58, 48, 48, 58, 49, 97, 13, 10, 13, 10, 59, 40, + 116,105,109,101, 32,108,105,109,105,116, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,116,105,109,101,108,105,109,116, 58, 13, 10, + 48, 58, 56, 48, 99, 97, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, 56, 57, + 56, 49, 58, 49, 58, 50, 55, 58, 50, 55, 13, 10, 48, 58, 56, 57, 97, 49, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57, 99, 49, 58, 49, + 58, 50, 55, 58, 50, 55, 13, 10, 48, 58, 56, 57,101, 49, 58, 49, 58, 50, + 55, 58, 50, 55, 13, 10, 48, 58, 56, 97, 48, 49, 58, 49, 58, 50, 55, 58, + 50, 55, 13, 10, 48, 58, 56, 97, 50, 49, 58, 49, 58, 50, 55, 58, 50, 55, + 13, 10, 13, 10, 59, 40,116,105,109,101, 32,116,117,110,110,101,108, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116,105,109,101, + 116,117,110,108, 58, 13, 10, 48, 58, 56, 48, 49,102, 58, 54, 58, 48, 58, + 48, 13, 10, 48, 58, 99, 52, 54,100, 58, 54, 58, 54, 51, 58, 54, 51, 13, + 10, 13, 10, 59, 40,116,111,107,105, 32,110,111, 32,115,101,110,115,104, 105, 32, 45, 32, 99,104,114,111,110,111, 32,115,111,108,100,105,101,114, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,116,111,107,105, - 115,101,110,115, 58, 10, 48, 58, 99, 48, 52,100, 58, 53, 52, 58, 48, 48, - 58, 50, 48, 10, 48, 58, 99, 48, 97, 49, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 40,116,111,117,103,104, 32,116,117,114,102, 32, 40,106, 97, - 112, 97,110, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10,116,116,117,114,102, 58, - 10,116,116,117,114,102,117, 58, 10,116,116,117,114,102, 98,108, 58, 10, - 48, 58, 50, 48, 48, 49, 48, 48, 58, 52, 58, 48, 48, 58, 48, 56, 10, 48, - 58, 50, 48, 48, 49, 48, 52, 58, 55, 99, 58, 48, 56, 58, 48, 48, 10, 32, - 10, 59, 40,117,108,116,114, 97,109, 97,110, 32, 99,108,117, 98, 32, 45, - 32,116, 97,116, 97,107, 97,101, 33, 32,117,108,116,114, 97,109, 97,110, - 32,107,121,111,117,100, 97,105, 33, 33, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,117,109, 97,110, 99,108,117, 98, 58, 32, 10, 48, - 58, 50, 48, 48, 55, 52, 50, 58, 50, 58, 48, 48, 58, 48, 55, 10, 48, 58, - 50, 48, 48, 54, 97, 50, 58, 97, 48, 58, 48, 48, 58, 48, 48, 32, 10, 10, - 59, 40,118, 97,108,107,121,114,105,101, 32,110,111, 32,100,101,110,115, - 101,116,115,117, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,118, 97,108,107,121,114,105,101, 58, 32, - 10, 48, 58, 49, 48, 48, 54, 50, 48, 58, 52, 58, 48, 48, 58, 97, 48, 32, - 10, 48, 58, 49, 48, 48, 54, 50, 52, 58, 57, 99, 58, 53, 54, 58, 48, 48, - 10, 10, 59, 40,118, 97,110,103,117, 97,114,100, 32,105,105, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10,118, 97,110,103,114,100, - 50, 58, 10, 48, 58, 99, 51, 56, 48, 58, 54, 48, 58, 48, 97, 58, 48, 48, - 10, 48, 58,102, 54, 50, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 32, 10, - 59, 40,118, 97,115,116, 97,114, 32, 40,115,101,116, 32, 49, 41, 41, 32, - 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 32, 10,118, 97,115,116, 97,114, 58, 32, 10,118, 97,115, - 116, 97,114, 50, 58, 10,118, 97,115,116, 97,114, 51, 58, 10,118, 97,115, - 116, 97,114, 52, 58, 10, 48, 58, 99,100, 97, 49, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 99,100, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 32, - 10, 48, 58, 99,100,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 32, 10, 48, - 58, 99,101, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99,101, - 50, 49, 58, 49, 58, 48, 50, 58, 48, 50, 32, 10, 48, 58, 99,101, 52, 49, - 58, 49, 58, 50, 56, 58, 50, 56, 32, 10, 48, 58, 99,101, 54, 49, 58, 49, - 58, 50, 56, 58, 50, 56, 32, 10, 48, 58,102, 49, 50, 56, 58, 56, 53, 58, - 48, 48, 58, 49, 54, 32, 10, 10, 59, 40,119, 97,105, 32,119, 97,105, 32, - 106,111, 99,107,101,121, 32,103, 97,116,101, 45,105,110, 33, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10,119,119,106,103,116,105, - 110, 58, 10, 48, 58, 48, 50, 50, 48, 58, 55, 48, 58, 50, 52, 58, 50, 52, - 32, 10, 48, 58, 48, 48, 49, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 40,119, 97,108,108, 32,115,116,114,101,101,116, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 32, 10,119, 97,108,108,115,116, 58, 10, - 48, 58, 49, 99, 49, 57, 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 40,119, 97,116,101,114, 32,109, 97,116, 99,104, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,119,109, 97,116, 99,104, 58, 32, 10, 48, - 58, 99, 48, 48, 48, 58, 51, 99, 58, 56, 52, 58, 48, 50, 32, 10, 48, 58, - 99, 48, 56, 54, 58, 51, 58, 48, 48, 58, 48, 50, 32, 10, 48, 58,100, 51, - 48, 48, 58, 49, 53, 58, 48, 48, 58, 48, 49, 32, 10, 48, 58,100, 51, 56, - 48, 58, 49, 53, 58, 52, 49, 58, 52, 57, 32, 10, 48, 58,100, 52, 48, 48, - 58, 50,100, 48, 58, 56, 52, 58, 52,100, 10, 10, 59, 40,119, 97,116,101, - 114, 32,115,107,105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,119, 97,116,101,114,115,107,105, 58, 32, 10, 48, 58, 56, 51, 53, 98, - 58, 51, 58, 48, 58, 48, 10, 10, 59, 40, 99, 97,112, 99,111,109, 32,115, - 112,111,114,116,115, 32, 99,108,117, 98, 32, 40,106, 97,112, 97,110, 32, - 57, 55, 48, 55, 50, 50, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101, - 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 10, 99,115, 99, - 108,117, 98,106, 58, 10, 99,115, 99,108,117, 98, 97, 58, 10, 99,115, 99, - 108,117, 98, 58, 10, 99,115, 99,108,117, 98, 49, 58, 10, 99,115, 99,108, - 117, 98,104, 58, 10, 99,115, 99,108,117, 98,106,121, 58, 10, 99,115, 99, - 108,117, 98, 49,100, 58, 10, 48, 58,102,102, 57, 56, 57, 52, 58, 53, 48, - 58, 48, 48, 58, 98, 50, 32, 10, 48, 58,102,102, 57, 56,101, 52, 58,100, - 99, 58, 49, 97, 58, 48, 49, 32, 10, 10, 59, 40,105,110, 32,116,104,101, - 32,104,117,110,116, 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, - 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 32, 45, 32, 70, 73, 88, 69, 68, 32, 69, 78, 84, 82, 89, 33, 32, 10, - 105,110,116,104,117,110,116, 58, 10,105,110,116,104,117,110,116,117, 58, - 10,107, 97,105,116,101,105,100,115, 58, 10, 48, 58,101, 48, 49, 56, 48, - 58,100, 56, 58, 48, 48, 58, 48, 50, 10, 32, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,115,121,115,116,101,109, 49, 54, 46, 99, 32, 40,119,111,110, - 100,101,114, 32, 98,111,121, 32,105,105,105, 32, 45, 32,109,111,110,115, - 116,101,114, 32,108, 97,105,114, 32, 40,115,101,116, 32, 49, 41, 41, 10, - 119, 98, 51, 98, 98,108, 58, 10,119, 98, 51, 50, 58, 10,119, 98, 51, 49, - 58, 10,119, 98, 51, 52, 58, 10,119, 98, 51, 58, 10,119, 98, 51, 51, 58, - 10,119, 98, 51, 53, 58, 10,119, 98, 51, 53, 97, 58, 10,119, 98, 51, 49, - 100, 58, 10,119, 98, 51, 50,100, 58, 10,119, 98, 51, 51,100, 58, 10,119, - 98, 51, 52,100, 58, 10,119, 98, 51, 53,100, 58, 10, 48, 58,102,102, 99, - 56, 98, 56, 58, 50, 56, 58, 52, 99, 58, 48, 48, 10, 48, 58,102,102, 99, - 56,100,101, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42,119,111,110,100,101,114, 32, 98,111,121, 32, 73, 73, 73, 32, 45, - 32,109,111,110,115,116,101,114,115, 32,108, 97,105,114, 32, 40,106, 97, - 112, 97,110, 44,115,121,115,116,101,109, 32, 49, 54, 98, 44, 32,102,100, - 49, 48, 57, 52, 32, 51, 49, 55, 45, 48, 48, 56, 53, 41, 9, 10,119, 98, - 51, 98, 98, 58, 10, 48, 58,102,102, 48, 56, 98, 56, 58, 50, 55, 58, 52, - 99, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115, - 116,101,109, 49, 54, 46, 99, 32, 40,119,111,110,100,101,114, 32, 98,111, - 121, 32, 51, 32, 40, 98,111,111,116,108,101,103, 41, 41, 10,119, 98, 51, - 98,108, 58, 10, 48, 58,102,102, 99, 56, 98, 56, 58, 50, 56, 58, 52, 99, - 58, 48, 48, 10, 48, 58,102,102, 99, 56,100,101, 58, 49, 58, 51, 48, 58, - 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,105, 99,100,117, - 97,108, 46, 99, 32, 40,112,117,108,115, 97,114, 41, 10,112,117,108,115, - 97,114, 58, 10, 48, 58, 56, 53,102, 52, 58, 51, 57, 58, 53, 48, 58, 53, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108,115,112,110, - 98,108, 46, 99, 32, 40,104,111,116, 32,112,105,110, 98, 97,108,108, 41, - 10,104,111,116,112,105,110, 98,108, 58, 10, 48, 58, 56, 48, 49, 55, 56, - 48, 58, 51, 48, 58, 48, 48, 58, 48, 57, 10, 48, 58, 56, 48, 48, 48, 48, - 55, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,100,111,111,121,111,110,103, 46, 99, 32, 40,103,117,110, 32,100, - 101, 97,108,101,114, 32, 96, 57, 52, 41, 10,103,117,110,100,108, 57, 52, - 58, 10,112,114,105,109,101,108,108, 97, 58, 10, 48, 58, 99, 51, 50, 50, - 58, 51, 97, 58, 52, 49, 58, 48, 49, 10, 10, 59, 40,107, 97,114, 97,116, - 101, 32,116,111,117,114,110, 97,109,101,110,116, 44, 32,116,104,101, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,107, 97,114, 97,116, - 111,117,114, 58, 10,107, 97,114, 97,116,111,117,114,106, 58, 10, 48, 58, - 102,102,100, 52,102,101, 58, 99, 48, 58, 54, 50, 58, 48, 49, 10, 10, 59, - 40,104,101, 98,101,114,101,107,101, 32,110,111, 32,112,111,112,111,111, - 110, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,104,101, 98,101,114,112,111,112, 58, 10, 48, 58, 51, - 48, 52, 57, 50, 48, 58, 97, 48, 58, 48, 48, 58, 49, 99, 10, 10, 59, 40, - 104, 97,115, 97,109,117, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,104, 97,115, 97,109,117, 58, 10, - 48, 58, 97, 51, 49, 49, 53, 58, 49, 48, 53, 58, 48, 48, 58, 48, 52, 10, - 10, 59, 40,104, 97,108, 50, 49, 41, 32, 97,110,100, 32, 99,108,111,110, - 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,104, 97,108, - 50, 49, 58, 10,104, 97,108, 50, 49,106, 58, 10, 48, 58,102,101, 54, 98, - 58, 51, 99, 58, 48, 48, 58, 52, 49, 10, 48, 58,102, 99,101, 49, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,103,121,112,115,121, 32,106,117, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116,111,107, + 105,115,101,110,115, 58, 13, 10, 48, 58, 99, 48, 52,100, 58, 53, 52, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, 48, 97, 49, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 40,116,111,117,103,104, 32,116,117,114, + 102, 32, 40,106, 97,112, 97,110, 41, 41, 32, 97,110,100, 32, 99,108,111, + 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,116, + 116,117,114,102, 58, 13, 10,116,116,117,114,102,117, 58, 13, 10,116,116, + 117,114,102, 98,108, 58, 13, 10, 48, 58, 50, 48, 48, 49, 48, 48, 58, 52, + 58, 48, 48, 58, 48, 56, 13, 10, 48, 58, 50, 48, 48, 49, 48, 52, 58, 55, + 99, 58, 48, 56, 58, 48, 48, 13, 10, 13, 10, 59, 40,117,108,116,114, 97, + 109, 97,110, 32, 99,108,117, 98, 32, 45, 32,116, 97,116, 97,107, 97,101, + 33, 32,117,108,116,114, 97,109, 97,110, 32,107,121,111,117,100, 97,105, + 33, 33, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,117, + 109, 97,110, 99,108,117, 98, 58, 13, 10, 48, 58, 50, 48, 48, 55, 52, 50, + 58, 50, 58, 48, 48, 58, 48, 55, 13, 10, 48, 58, 50, 48, 48, 54, 97, 50, + 58, 97, 48, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,118, 97,108, + 107,121,114,105,101, 32,110,111, 32,100,101,110,115,101,116,115,117, 32, + 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,118, 97,108,107,121,114,105,101, 58, 13, 10, 48, 58, 49, + 48, 48, 54, 50, 48, 58, 52, 58, 48, 48, 58, 97, 48, 13, 10, 48, 58, 49, + 48, 48, 54, 50, 52, 58, 57, 99, 58, 53, 54, 58, 48, 48, 13, 10, 13, 10, + 59, 40,118, 97,110,103,117, 97,114,100, 32,105,105, 41, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,118, 97,110,103,114,100, 50, 58, + 13, 10, 48, 58, 99, 51, 56, 48, 58, 54, 48, 58, 48, 97, 58, 48, 48, 13, + 10, 48, 58,102, 54, 50, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 40,118, 97,115,116, 97,114, 32, 40,115,101,116, 32, 49, 41, 41, + 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,118, 97,115,116, 97,114, 58, 13, 10,118, 97, + 115,116, 97,114, 50, 58, 13, 10,118, 97,115,116, 97,114, 51, 58, 13, 10, + 118, 97,115,116, 97,114, 52, 58, 13, 10, 48, 58, 99,100, 97, 49, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99,100, 99, 49, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 99,100,101, 49, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 99,101, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 99,101, 50, 49, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, + 48, 58, 99,101, 52, 49, 58, 49, 58, 50, 56, 58, 50, 56, 13, 10, 48, 58, + 99,101, 54, 49, 58, 49, 58, 50, 56, 58, 50, 56, 13, 10, 48, 58,102, 49, + 50, 56, 58, 56, 53, 58, 48, 48, 58, 49, 54, 13, 10, 13, 10, 59, 40,119, + 97,105, 32,119, 97,105, 32,106,111, 99,107,101,121, 32,103, 97,116,101, + 45,105,110, 33, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,119,119,106,103,116,105,110, 58, 13, 10, 48, 58, 48, 50, 50, 48, 58, + 55, 48, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 48, 48, 49, 99, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,119, 97,108,108, 32,115, + 116,114,101,101,116, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,119, 97,108,108,115,116, 58, 13, 10, 48, 58, 49, 99, 49, 57, 58, + 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,119, 97,116,101, + 114, 32,109, 97,116, 99,104, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,119,109, 97,116, 99,104, 58, 13, 10, 48, 58, 99, 48, 48, + 48, 58, 51, 99, 58, 56, 52, 58, 48, 50, 13, 10, 48, 58, 99, 48, 56, 54, + 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58,100, 51, 48, 48, 58, 49, + 53, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,100, 51, 56, 48, 58, 49, 53, + 58, 52, 49, 58, 52, 57, 13, 10, 48, 58,100, 52, 48, 48, 58, 50,100, 48, + 58, 56, 52, 58, 52,100, 13, 10, 13, 10, 59, 40,119, 97,116,101,114, 32, + 115,107,105, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 119, 97,116,101,114,115,107,105, 58, 13, 10, 48, 58, 56, 51, 53, 98, 58, + 51, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40, 99, 97,112, 99,111,109, 32, + 115,112,111,114,116,115, 32, 99,108,117, 98, 32, 40,106, 97,112, 97,110, + 32, 57, 55, 48, 55, 50, 50, 41, 41, 32, 97,110,100, 32, 99,108,111,110, + 101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,115, + 99,108,117, 98,106, 58, 13, 10, 99,115, 99,108,117, 98, 97, 58, 13, 10, + 99,115, 99,108,117, 98, 58, 13, 10, 99,115, 99,108,117, 98, 49, 58, 13, + 10, 99,115, 99,108,117, 98,104, 58, 13, 10, 99,115, 99,108,117, 98,106, + 121, 58, 13, 10, 99,115, 99,108,117, 98, 49,100, 58, 13, 10, 48, 58,102, + 102, 57, 56, 57, 52, 58, 53, 48, 58, 48, 48, 58, 98, 50, 13, 10, 48, 58, + 102,102, 57, 56,101, 52, 58,100, 99, 58, 49, 97, 58, 48, 49, 13, 10, 13, + 10, 59, 40,105,110, 32,116,104,101, 32,104,117,110,116, 32, 40,119,111, + 114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 70, 73, 88, 69, 68, + 32, 69, 78, 84, 82, 89, 33, 13, 10,105,110,116,104,117,110,116, 58, 13, + 10,105,110,116,104,117,110,116,117, 58, 13, 10,107, 97,105,116,101,105, + 100,115, 58, 13, 10, 48, 58,101, 48, 49, 56, 48, 58,100, 56, 58, 48, 48, + 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121, + 115,116,101,109, 49, 54, 46, 99, 32, 40,119,111,110,100,101,114, 32, 98, + 111,121, 32,105,105,105, 32, 45, 32,109,111,110,115,116,101,114, 32,108, + 97,105,114, 32, 40,115,101,116, 32, 49, 41, 41, 13, 10,119, 98, 51, 98, + 98,108, 58, 13, 10,119, 98, 51, 50, 58, 13, 10,119, 98, 51, 49, 58, 13, + 10,119, 98, 51, 52, 58, 13, 10,119, 98, 51, 58, 13, 10,119, 98, 51, 51, + 58, 13, 10,119, 98, 51, 53, 58, 13, 10,119, 98, 51, 53, 97, 58, 13, 10, + 119, 98, 51, 49,100, 58, 13, 10,119, 98, 51, 50,100, 58, 13, 10,119, 98, + 51, 51,100, 58, 13, 10,119, 98, 51, 52,100, 58, 13, 10,119, 98, 51, 53, + 100, 58, 13, 10, 48, 58,102,102, 99, 56, 98, 56, 58, 50, 56, 58, 52, 99, + 58, 48, 48, 13, 10, 48, 58,102,102, 99, 56,100,101, 58, 49, 58, 51, 48, + 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,119,111,110,100, + 101,114, 32, 98,111,121, 32, 73, 73, 73, 32, 45, 32,109,111,110,115,116, + 101,114,115, 32,108, 97,105,114, 32, 40,106, 97,112, 97,110, 44,115,121, + 115,116,101,109, 32, 49, 54, 98, 44, 32,102,100, 49, 48, 57, 52, 32, 51, + 49, 55, 45, 48, 48, 56, 53, 41, 9, 13, 10,119, 98, 51, 98, 98, 58, 13, + 10, 48, 58,102,102, 48, 56, 98, 56, 58, 50, 55, 58, 52, 99, 58, 51, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101, + 109, 49, 54, 46, 99, 32, 40,119,111,110,100,101,114, 32, 98,111,121, 32, + 51, 32, 40, 98,111,111,116,108,101,103, 41, 41, 13, 10,119, 98, 51, 98, + 108, 58, 13, 10, 48, 58,102,102, 99, 56, 98, 56, 58, 50, 56, 58, 52, 99, + 58, 48, 48, 13, 10, 48, 58,102,102, 99, 56,100,101, 58, 49, 58, 51, 48, + 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,105, + 99,100,117, 97,108, 46, 99, 32, 40,112,117,108,115, 97,114, 41, 13, 10, + 112,117,108,115, 97,114, 58, 13, 10, 48, 58, 56, 53,102, 52, 58, 51, 57, + 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,103, 97,108,115,112,110, 98,108, 46, 99, 32, 40,104,111,116, 32,112, + 105,110, 98, 97,108,108, 41, 13, 10,104,111,116,112,105,110, 98,108, 58, + 13, 10, 48, 58, 56, 48, 49, 55, 56, 48, 58, 51, 48, 58, 48, 48, 58, 48, + 57, 13, 10, 48, 58, 56, 48, 48, 48, 48, 55, 58, 49, 58, 48, 51, 58, 48, + 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,111,111,121, + 111,110,103, 46, 99, 32, 40,103,117,110, 32,100,101, 97,108,101,114, 32, + 96, 57, 52, 41, 13, 10,103,117,110,100,108, 57, 52, 58, 13, 10,112,114, + 105,109,101,108,108, 97, 58, 13, 10, 48, 58, 99, 51, 50, 50, 58, 51, 97, + 58, 52, 49, 58, 48, 49, 13, 10, 13, 10, 59, 40,107, 97,114, 97,116,101, + 32,116,111,117,114,110, 97,109,101,110,116, 44, 32,116,104,101, 41, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,107, 97,114, 97,116, + 111,117,114, 58, 13, 10,107, 97,114, 97,116,111,117,114,106, 58, 13, 10, + 48, 58,102,102,100, 52,102,101, 58, 99, 48, 58, 54, 50, 58, 48, 49, 13, + 10, 13, 10, 59, 40,104,101, 98,101,114,101,107,101, 32,110,111, 32,112, + 111,112,111,111,110, 32, 40,106, 97,112, 97,110, 41, 41, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,104,101, 98,101,114,112,111,112, + 58, 13, 10, 48, 58, 51, 48, 52, 57, 50, 48, 58, 97, 48, 58, 48, 48, 58, + 49, 99, 13, 10, 13, 10, 59, 40,104, 97,115, 97,109,117, 32, 40,106, 97, + 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10,104, 97,115, 97,109,117, 58, 13, 10, 48, 58, 97, 51, 49, 49, 53, 58, + 49, 48, 53, 58, 48, 48, 58, 48, 52, 13, 10, 13, 10, 59, 40,104, 97,108, + 50, 49, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 13, 10,104, 97,108, 50, 49, 58, 13, 10, + 104, 97,108, 50, 49,106, 58, 13, 10, 48, 58,102,101, 54, 98, 58, 51, 99, + 58, 48, 48, 58, 52, 49, 13, 10, 48, 58,102, 99,101, 49, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,103,121,112,115,121, 32,106,117, 103,103,108,101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 72,105,115, 99,111,114,101, 32,100,105,115,112,108, 97,121, 115, 32, 99,111,114,114,101, 99,116,108,121, 32, 97,102,116,101,114, 32, 97, 32,110,101,119, 32,103, 97,109,101, 32,115,116, 97,114,116,115, 33, - 10,103,121,112,115,121,106,117,103, 58, 10, 48, 58, 48,101, 48, 48, 58, - 53, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48,101, 50, 51, 58, 49, 58, 48, - 101, 58, 48,101, 10, 10, 59, 40,103,117,122,122,108,101,114, 41, 32, 40, - 98,121, 32, 71,101,111, 77, 97,110, 41, 10,103,117,122,122,108,101,114, - 58, 10,103,117,122,122,108,101,114,115, 58, 10, 48, 58, 56, 53, 56, 52, - 58, 53, 48, 58, 48, 48, 58, 53, 53, 10, 48, 58, 56, 48, 48, 55, 58, 54, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,100,101, 97,100, 32,101,121,101, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 72,105, - 115, 99,111,114,101, 32,100,105,115,112,108, 97,121,115, 32, 99,111,114, - 114,101, 99,116,108,121, 32, 97,102,116,101,114, 32, 97, 32,110,101,119, - 32,103, 97,109,101, 32,115,116, 97,114,116,115, 33, 10,100,101, 97,100, - 101,121,101, 58, 10, 48, 58, 48,101, 48, 48, 58, 54, 58, 48, 58, 48, 10, - 48, 58, 48,101, 50, 97, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,116,119,105,110, 49, 54, 46, 99, 32, 40,109, - 105,115,115,105,110,103, 32,105,110, 32, 97, 99,116,105,111,110, 32, 40, - 118,101,114,115,105,111,110, 32,116, 41, 41, 10,109,105, 97, 58, 10,109, - 105, 97,106, 58, 10,109,105, 97, 50, 58, 10, 48, 58, 54, 50, 49, 48, 48, - 58, 52,102, 58, 48, 48, 58, 53, 52, 10, 48, 58, 54, 48, 49, 50, 97, 58, - 52, 58, 48, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 116, 97,105,116,111, 95,102, 50, 46, 99, 32, 40,109,101,103, 97, 32, 98, - 108, 97,115,116, 32, 40,119,111,114,108,100, 41, 41, 10,109,101,103, 97, - 98,108,115,116, 58, 10,109,101,103, 97, 98,108,115,116,106, 58, 10,109, - 101,103, 97, 98,108,115,116,117, 58, 10, 48, 58, 50, 48, 51,102, 51, 56, - 58, 51, 50, 58, 48, 48, 58, 53, 50, 10, 48, 58, 50, 48, 52, 51,101, 97, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 48, 52, 51,101, 98, 58, - 49, 58, 48, 56, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 109,117,103,115,109, 97,115,104, 46, 99, 32, 40,109,117,103, 32,115,109, - 97,115,104,101,114,115, 41, 10,109,117,103,115,109, 97,115,104, 58, 10, - 48, 58, 49, 99, 48, 49, 99, 52, 58,101, 58, 48, 51, 58,100, 50, 10, 48, - 58, 49, 99, 48, 48, 98, 52, 58, 52,102, 58, 50,101, 58, 50, 48, 10, 10, + 13, 10,103,121,112,115,121,106,117,103, 58, 13, 10, 48, 58, 48,101, 48, + 48, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48,101, 50, 51, 58, + 49, 58, 48,101, 58, 48,101, 13, 10, 13, 10, 59, 40,103,117,122,122,108, + 101,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,103, + 117,122,122,108,101,114, 58, 13, 10,103,117,122,122,108,101,114,115, 58, + 13, 10, 48, 58, 56, 53, 56, 52, 58, 53, 48, 58, 48, 48, 58, 53, 53, 13, + 10, 48, 58, 56, 48, 48, 55, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 40,100,101, 97,100, 32,101,121,101, 41, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 32, 45, 32, 72,105,115, 99,111,114,101, 32,100, + 105,115,112,108, 97,121,115, 32, 99,111,114,114,101, 99,116,108,121, 32, + 97,102,116,101,114, 32, 97, 32,110,101,119, 32,103, 97,109,101, 32,115, + 116, 97,114,116,115, 33, 13, 10,100,101, 97,100,101,121,101, 58, 13, 10, + 48, 58, 48,101, 48, 48, 58, 54, 58, 48, 58, 48, 13, 10, 48, 58, 48,101, + 50, 97, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,116,119,105,110, 49, 54, 46, 99, 32, 40,109,105,115, + 115,105,110,103, 32,105,110, 32, 97, 99,116,105,111,110, 32, 40,118,101, + 114,115,105,111,110, 32,116, 41, 41, 13, 10,109,105, 97, 58, 13, 10,109, + 105, 97,106, 58, 13, 10,109,105, 97, 50, 58, 13, 10, 48, 58, 54, 50, 49, + 48, 48, 58, 52,102, 58, 48, 48, 58, 53, 52, 13, 10, 48, 58, 54, 48, 49, + 50, 97, 58, 52, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, 99, 32, 40,109, + 101,103, 97, 32, 98,108, 97,115,116, 32, 40,119,111,114,108,100, 41, 41, + 13, 10,109,101,103, 97, 98,108,115,116, 58, 13, 10,109,101,103, 97, 98, + 108,115,116,106, 58, 13, 10,109,101,103, 97, 98,108,115,116,117, 58, 13, + 10, 48, 58, 50, 48, 51,102, 51, 56, 58, 51, 50, 58, 48, 48, 58, 53, 50, + 13, 10, 48, 58, 50, 48, 52, 51,101, 97, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 50, 48, 52, 51,101, 98, 58, 49, 58, 48, 56, 58, 48, 56, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,117,103,115,109, + 97,115,104, 46, 99, 32, 40,109,117,103, 32,115,109, 97,115,104,101,114, + 115, 41, 13, 10,109,117,103,115,109, 97,115,104, 58, 13, 10, 48, 58, 49, + 99, 48, 49, 99, 52, 58,101, 58, 48, 51, 58,100, 50, 13, 10, 48, 58, 49, + 99, 48, 48, 98, 52, 58, 52,102, 58, 50,101, 58, 50, 48, 13, 10, 13, 10, 59, 40,103,117,108,102, 32,115,116,111,114,109, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,103,117,108,102,115,116,114,109, 58, 10,103,117,108,102,115,116,114, - 109,109, 58, 10,103,117,108,102,115,116,114,109, 97, 58, 10,103,117,108, - 102,115,116,114,109, 98, 58, 10, 48, 58, 99, 53, 56, 48, 58, 56, 48, 58, - 48, 48, 58, 50,101, 10, 48, 58, 99, 54, 49, 56, 58, 52, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 40,103,114, 97,110,100, 32, 99,104, 97,109,112,105, - 111,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,103,114, - 99,104, 97,109,112, 58, 10, 48, 58, 52, 50, 49, 53, 58,102, 58, 48, 58, - 48, 10, 10, 59, 40,103,111,105,110,100,111,108, 41, 32, 97,110,100, 32, - 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, - 10,103,111,105,110,100,111,108, 58, 10,104,111,109,111, 58, 10,103,111, - 105,110,100,111,108,107, 58, 10,103,111,105,110,100,111,108,117, 58, 10, - 48, 58, 99, 48,100, 56, 58, 50, 58, 48, 53, 58, 48, 48, 10, 48, 58, 99, - 48, 55, 54, 58, 53, 48, 58, 48, 53, 58, 53, 57, 10, 10, 59, 40,102,117, - 110,110,121, 32,109,111,117,115,101, 41, 32,112, 97,114,101,110,116, 10, - 102,117,110,110,121,109,111,117, 58, 10, 48, 58, 56, 48, 52, 65, 58, 48, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 50, 49, 58, 48, 49, 58, - 50, 52, 58, 50, 52, 10, 48, 58, 57, 50, 48, 49, 58, 48, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58, 57, 49, 69, 49, 58, 48, 49, 58, 50, 52, 58, 50, - 52, 10, 48, 58, 57, 49, 67, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, - 48, 58, 57, 49, 65, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, - 57, 49, 56, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40,102, - 117,110,107,121, 32,102,105,115,104, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,102,110,107,121,102,105,115,104, 58, 10, 48, 58,101, - 48, 51, 48, 58, 57, 58, 48, 58, 48, 10, 10, 59, 40,102,117,110,107,121, - 32, 98,101,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 102,117,110,107,121, 98,101,101, 58, 10,102,117,110,107,121, 98,101,101, - 98, 58, 10, 48, 58, 56, 50, 56, 98, 58, 50,100, 58, 48, 48, 58, 48, 99, - 10, 10,102,114,111,103,115, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, - 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, - 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105, - 115, 32,101,110,116,114,121, 93, 10, 48, 58,101, 53, 48, 56, 58, 48, 54, - 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 51, 55, 58, 48, 54, 58, 48, - 48, 58, 51, 48, 10, 10, 59, 40,102,114,101,101,122,101, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,102,114,101,101,122,101, 58, 10, - 48, 58, 52, 98, 57, 48, 58, 53, 48, 58,102, 52, 58, 48, 48, 10, 10, 59, - 40,114,111, 98,111,116,114,111,110, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, - 67,104, 97,110,103,105,110,103, 32, 68, 73, 80, 32,115,119,105,116, 99, - 104, 32,115,101,116,116,105,110,103,115, 32,114,101,115,101,116,115, 32, - 116,104,101, 32, 68, 97,105,108,121, 32,104,101,114,111,101,115, 32,116, - 97, 98,108,101, 32, 40, 79, 78, 76, 89, 41, 33, 10, 59,114,111, 98,111, - 116,114,111,110, 58, 10, 59,114,111, 98,111,116,114,111,110,121,111, 58, - 10, 59, 48, 58, 99,102, 54,101, 58, 56, 99, 58, 48, 52, 58, 49, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101,115,116,114,111,121,114, - 46, 99, 32, 40,100,101,115,116,114,111,121,101,114, 41, 10, 59, 42, 42, - 32,104,105,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32,111, - 110, 99,101, 32,102,105,114,115,116, 32,103, 97,109,101, 32,105,115, 32, - 111,118,101,114, 32, 42, 42, 10,100,101,115,116,114,111,121,114, 58, 10, - 48, 58,100,100, 58, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 116,117,114, 98,111, 46, 99, 32, 40,115,117, 98,114,111, 99, 51,100, 41, - 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32,117,112,100, - 97,116,101,115, 32, 97,102,116,101,114, 32,104,105,115, 99,111,114,101, - 32,100,105,115,112,108, 97,121,101,100, 32,105,110, 32, 97,116,116,114, - 97, 99,116, 32,109,111,100,101, 32, 42, 42, 10,115,117, 98,114,111, 99, - 51,100, 58, 10, 48, 58,101, 52, 48, 48, 58, 51,101, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 98, 48, 52, 57, 58, 49, 58,102, 54, 58,102, 54, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,108,101,109,109,105,110,103,115, 46, - 99, 32, 40,108,101,109,109,105,110,103,115, 32, 40,117,115, 32,112,114, - 111,116,111,116,121,112,101, 41, 41, 10,108,101,109,109,105,110,103,115, - 58, 10, 48, 58, 49, 48, 97, 52, 48, 50, 58, 53, 48, 58, 52, 52, 58, 48, - 49, 10, 10, 59, 40,102,111,111,116, 98, 97,108,108, 32, 99,104, 97,109, - 112, 32, 40,119,111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,102,111, - 111,116, 99,104,109,112, 58, 10,104,116,104,101,114,111, 58, 10, 48, 58, - 49, 48, 97, 57, 50, 48, 58, 53, 48, 58, 48, 97, 58, 48, 48, 10,101,117, - 114,111, 99,104, 57, 50, 58, 10, 48, 58, 49, 48, 97, 57, 57, 99, 58, 53, - 48, 58, 48, 97, 58, 48, 48, 10, 10, 59, 40,105, 39,109, 32,115,111,114, - 114,121, 32, 40,117,115, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101, - 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,105,109,115,111, - 114,114,121, 58, 10,105,109,115,111,114,114,121,106, 58, 10, 48, 58, 99, - 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 50, 10, 48, 58,100, 51, 48, 48, - 58, 97, 48, 58, 48, 48, 58, 50, 48, 10, 10, 59, 40,110,105,110,106, 97, - 32,103, 97,105,100,101,110, 32, 40,119,111,114,108,100, 41, 41, 32, 99, - 108,111,110,101,115, 10,115,104, 97,100,111,119,119, 58, 10,114,121,117, - 107,101,110,100,110, 58, 10,115,104, 97,100,111,119,119, 97, 58, 10,103, - 97,105,100,101,110, 58, 10,109, 97,115,116,110,105,110,106, 58, 10,114, - 121,117,107,101,110,100,110, 97, 58, 10, 48, 58, 54, 50,101, 51, 52, 58, - 100, 48, 58, 50,101, 58, 48, 48, 10, 48, 58, 54, 50,101, 52, 55, 58, 49, - 58, 48, 57, 58, 48, 57, 10, 10, 59, 40,102,108, 97,115,104, 32,103, 97, - 108, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,102,108, 97, - 115,104,103, 97,108, 58, 10,102,108, 97,115,104,103, 97,108, 97, 58, 10, - 48, 58,102, 54, 57, 48, 58, 53,101, 58, 48, 48, 58, 52, 48, 10, 10, 59, - 40,102,105,114,101, 32,111,110,101, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,102,105,114,101,111,110,101, 58, 10, 48, 58, 56, 51, - 49, 97, 58, 53, 97, 58, 48, 48, 58, 50, 52, 10, 10, 59, 40,101,110,100, - 117,114,111, 32,114, 97, 99,101,114, 32, 40, 98,111,111,116,108,101,103, - 32,115,101,116, 32, 50, 41, 41, 32, 99,108,111,110,101, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,101,110,100,117,114,111, 98, 50, 58, - 10, 48, 58, 48, 52, 51, 52, 48, 48, 58, 53, 52, 58, 48, 49, 58, 48, 48, - 10, 10, 59, 40,100,121,110, 97,109,105,116,101, 32,100,117,107,101, 41, - 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10,100,121,110,100,117,107,101, 58, 10,100,121,110, - 100,117,107,101,102, 58, 10,100,121,110,100,117,107,101,106, 58, 10,100, - 121,110,100,117,107,101,117, 58, 10, 48, 58, 49, 51, 52, 54, 58, 55, 55, - 58, 53, 48, 58, 50, 97, 10,100, 98,108,100,121,110, 58, 10,100, 98,108, - 100,121,110,106, 58, 10,100, 98,108,100,121,110,117, 58, 10,100, 98,108, - 100,121,110,102, 58, 10, 48, 58, 49, 53, 53, 99, 58, 56, 99, 58, 53, 48, - 58, 48, 48, 10, 10, 59, 40,100,101,118,105,108, 32,122,111,110,101, 41, - 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,100,101,118,122,111, - 110,101, 58, 10,100,101,118,122,111,110,101, 50, 58, 10, 48, 58, 55,101, - 99, 48, 58, 53, 98, 58, 49,101, 58, 50, 54, 10, 48, 58, 54, 48, 48, 55, - 58, 51, 58, 48, 58, 48, 10, 10, 59, 40,100,101,118,105,108, 32,102,105, - 115,104, 41, 32,112, 97,114,101,110,116, 10,100,101,118,105,108,102,115, - 104, 58, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 58, 48, 10, 10, 59, + 13, 10,103,117,108,102,115,116,114,109, 58, 13, 10,103,117,108,102,115, + 116,114,109,109, 58, 13, 10,103,117,108,102,115,116,114,109, 97, 58, 13, + 10,103,117,108,102,115,116,114,109, 98, 58, 13, 10, 48, 58, 99, 53, 56, + 48, 58, 56, 48, 58, 48, 48, 58, 50,101, 13, 10, 48, 58, 99, 54, 49, 56, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,103,114, 97,110, + 100, 32, 99,104, 97,109,112,105,111,110, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,103,114, 99,104, 97,109,112, 58, 13, 10, 48, + 58, 52, 50, 49, 53, 58,102, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,103, + 111,105,110,100,111,108, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,103,111,105,110, + 100,111,108, 58, 13, 10,104,111,109,111, 58, 13, 10,103,111,105,110,100, + 111,108,107, 58, 13, 10,103,111,105,110,100,111,108,117, 58, 13, 10, 48, + 58, 99, 48,100, 56, 58, 50, 58, 48, 53, 58, 48, 48, 13, 10, 48, 58, 99, + 48, 55, 54, 58, 53, 48, 58, 48, 53, 58, 53, 57, 13, 10, 13, 10, 59, 40, + 102,117,110,110,121, 32,109,111,117,115,101, 41, 32,112, 97,114,101,110, + 116, 13, 10,102,117,110,110,121,109,111,117, 58, 13, 10, 48, 58, 56, 48, + 52, 65, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 50, 50, + 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 50, 48, 49, + 58, 48, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 69, 49, 58, + 48, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 67, 49, 58, 48, + 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 65, 49, 58, 48, 49, + 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 56, 49, 58, 48, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,102,117,110,107,121, 32,102, + 105,115,104, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 102,110,107,121,102,105,115,104, 58, 13, 10, 48, 58,101, 48, 51, 48, 58, + 57, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,102,117,110,107,121, 32, 98, + 101,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,102, + 117,110,107,121, 98,101,101, 58, 13, 10,102,117,110,107,121, 98,101,101, + 98, 58, 13, 10, 48, 58, 56, 50, 56, 98, 58, 50,100, 58, 48, 48, 58, 48, + 99, 13, 10, 13, 10,102,114,111,103,115, 58, 32, 59, 91, 83,112,101, 99, + 105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97, + 110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32, + 116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, 48, 58,101, 53, 48, + 56, 58, 48, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 48, 51, 55, + 58, 48, 54, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 40,102,114,101, + 101,122,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 102,114,101,101,122,101, 58, 13, 10, 48, 58, 52, 98, 57, 48, 58, 53, 48, + 58,102, 52, 58, 48, 48, 13, 10, 13, 10, 59, 40,114,111, 98,111,116,114, + 111,110, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, + 32, 71,101,111, 77, 97,110, 41, 32, 45, 32, 67,104, 97,110,103,105,110, + 103, 32, 68, 73, 80, 32,115,119,105,116, 99,104, 32,115,101,116,116,105, + 110,103,115, 32,114,101,115,101,116,115, 32,116,104,101, 32, 68, 97,105, + 108,121, 32,104,101,114,111,101,115, 32,116, 97, 98,108,101, 32, 40, 79, + 78, 76, 89, 41, 33, 13, 10, 59,114,111, 98,111,116,114,111,110, 58, 13, + 10, 59,114,111, 98,111,116,114,111,110,121,111, 58, 13, 10, 59, 48, 58, + 99,102, 54,101, 58, 56, 99, 58, 48, 52, 58, 49, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,100,101,115,116,114,111,121,114, 46, 99, + 32, 40,100,101,115,116,114,111,121,101,114, 41, 13, 10, 59, 42, 42, 32, + 104,105,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, 32,111,110, + 99,101, 32,102,105,114,115,116, 32,103, 97,109,101, 32,105,115, 32,111, + 118,101,114, 32, 42, 42, 13, 10,100,101,115,116,114,111,121,114, 58, 13, + 10, 48, 58,100,100, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, + 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,116,117,114, 98,111, 46, 99, 32, 40,115,117, 98,114,111, + 99, 51,100, 41, 13, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114, + 101, 32,117,112,100, 97,116,101,115, 32, 97,102,116,101,114, 32,104,105, + 115, 99,111,114,101, 32,100,105,115,112,108, 97,121,101,100, 32,105,110, + 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 42, 42, 13, 10, + 115,117, 98,114,111, 99, 51,100, 58, 13, 10, 48, 58,101, 52, 48, 48, 58, + 51,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 98, 48, 52, 57, 58, 49, + 58,102, 54, 58,102, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,108,101,109,109,105,110,103,115, 46, 99, 32, 40,108,101,109,109,105, + 110,103,115, 32, 40,117,115, 32,112,114,111,116,111,116,121,112,101, 41, + 41, 13, 10,108,101,109,109,105,110,103,115, 58, 13, 10, 48, 58, 49, 48, + 97, 52, 48, 50, 58, 53, 48, 58, 52, 52, 58, 48, 49, 13, 10, 13, 10, 59, + 40,102,111,111,116, 98, 97,108,108, 32, 99,104, 97,109,112, 32, 40,119, + 111,114,108,100, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, + 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,102,111,111,116, 99, + 104,109,112, 58, 13, 10,104,116,104,101,114,111, 58, 13, 10, 48, 58, 49, + 48, 97, 57, 50, 48, 58, 53, 48, 58, 48, 97, 58, 48, 48, 13, 10,101,117, + 114,111, 99,104, 57, 50, 58, 13, 10, 48, 58, 49, 48, 97, 57, 57, 99, 58, + 53, 48, 58, 48, 97, 58, 48, 48, 13, 10, 13, 10, 59, 40,105, 39,109, 32, + 115,111,114,114,121, 32, 40,117,115, 41, 41, 32, 97,110,100, 32, 99,108, + 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 105,109,115,111,114,114,121, 58, 13, 10,105,109,115,111,114,114,121,106, + 58, 13, 10, 48, 58, 99, 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 50, 13, + 10, 48, 58,100, 51, 48, 48, 58, 97, 48, 58, 48, 48, 58, 50, 48, 13, 10, + 13, 10, 59, 40,110,105,110,106, 97, 32,103, 97,105,100,101,110, 32, 40, + 119,111,114,108,100, 41, 41, 32, 99,108,111,110,101,115, 13, 10,115,104, + 97,100,111,119,119, 58, 13, 10,114,121,117,107,101,110,100,110, 58, 13, + 10,115,104, 97,100,111,119,119, 97, 58, 13, 10,103, 97,105,100,101,110, + 58, 13, 10,109, 97,115,116,110,105,110,106, 58, 13, 10,114,121,117,107, + 101,110,100,110, 97, 58, 13, 10, 48, 58, 54, 50,101, 51, 52, 58,100, 48, + 58, 50,101, 58, 48, 48, 13, 10, 48, 58, 54, 50,101, 52, 55, 58, 49, 58, + 48, 57, 58, 48, 57, 13, 10, 13, 10, 59, 40,102,108, 97,115,104, 32,103, + 97,108, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,102, + 108, 97,115,104,103, 97,108, 58, 13, 10,102,108, 97,115,104,103, 97,108, + 97, 58, 13, 10, 48, 58,102, 54, 57, 48, 58, 53,101, 58, 48, 48, 58, 52, + 48, 13, 10, 13, 10, 59, 40,102,105,114,101, 32,111,110,101, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,102,105,114,101,111,110, + 101, 58, 13, 10, 48, 58, 56, 51, 49, 97, 58, 53, 97, 58, 48, 48, 58, 50, + 52, 13, 10, 13, 10, 59, 40,101,110,100,117,114,111, 32,114, 97, 99,101, + 114, 32, 40, 98,111,111,116,108,101,103, 32,115,101,116, 32, 50, 41, 41, + 32, 99,108,111,110,101, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,101,110,100,117,114,111, 98, 50, 58, 13, 10, 48, 58, 48, 52, 51, + 52, 48, 48, 58, 53, 52, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 40, + 100,121,110, 97,109,105,116,101, 32,100,117,107,101, 41, 32, 97,110,100, + 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,100,121,110,100,117,107,101, 58, 13, 10,100,121,110,100,117, + 107,101,102, 58, 13, 10,100,121,110,100,117,107,101,106, 58, 13, 10,100, + 121,110,100,117,107,101,117, 58, 13, 10, 48, 58, 49, 51, 52, 54, 58, 55, + 55, 58, 53, 48, 58, 50, 97, 13, 10,100, 98,108,100,121,110, 58, 13, 10, + 100, 98,108,100,121,110,106, 58, 13, 10,100, 98,108,100,121,110,117, 58, + 13, 10,100, 98,108,100,121,110,102, 58, 13, 10, 48, 58, 49, 53, 53, 99, + 58, 56, 99, 58, 53, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40,100,101,118, + 105,108, 32,122,111,110,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10,100,101,118,122,111,110,101, 58, 13, 10,100,101,118,122, + 111,110,101, 50, 58, 13, 10, 48, 58, 55,101, 99, 48, 58, 53, 98, 58, 49, + 101, 58, 50, 54, 13, 10, 48, 58, 54, 48, 48, 55, 58, 51, 58, 48, 58, 48, + 13, 10, 13, 10, 59, 40,100,101,118,105,108, 32,102,105,115,104, 41, 32, + 112, 97,114,101,110,116, 13, 10,100,101,118,105,108,102,115,104, 58, 13, + 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 58, 48, 13, 10, 13, 10, 59, 40,104, 97,109,109,101,114,105,110, 39, 32,104, 97,114,114,121, 32, 40, 119,111,114,108,100, 41, 41, 32, 99,108,111,110,101,115, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10,100,107,103,101,110,115, 97,110,109, - 55, 50, 58, 10, 48, 58, 97, 48, 57, 97, 48, 58, 57,102, 58, 52, 48, 58, - 50, 48, 10, 48, 58, 97, 48, 97, 52, 48, 58, 48, 51, 58, 52, 48, 58, 48, - 50, 10, 10, 59, 40, 99,117,116,105,101, 32,113, 41, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10, 99,117,116,105,101,113, 58, 10, 48, 58, - 50, 50, 49, 53, 58, 99, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40,112,117,114,117, - 114,117,110, 41, 10,112,117,114,117,114,117,110, 58, 10, 48, 58, 56, 48, - 102, 50, 98, 56, 58, 52, 98, 58, 48, 48, 58, 56, 53, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,110,105,110,106, 97,119, 46, 99, 32, 40,116,104, - 101, 32,110,105,110,106, 97, 32,119, 97,114,114,105,111,114,115, 32, 40, - 119,111,114,108,100, 41, 41, 10,110,105,110,106, 97,119, 58, 10,110,105, - 110,106, 97,119,106, 58, 10,110,105,110,106, 97,119,117, 58, 10, 48, 58, - 99, 52, 54, 52, 53, 58, 51,102, 56, 58, 48, 49, 58, 52, 55, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,118,105, 99,100,117,101,108, 46, 99, 32, - 40,105,110,118,105,110, 99,111, 47,100,101,101,112, 32,115, 99, 97,110, - 41, 10, 59, 32, 42, 42, 32,112,108, 97,121,101,114, 32,115, 99,111,114, - 101,115, 32,102,114,111,109, 32,108, 97,115,116, 32,103, 97,109,101, 32, - 112,108, 97,121,101,100, 32, 97,108,115,111, 32,115, 97,118,101,100, 32, - 45, 32,110,111, 32, 98,105,103, 32,100,101, 97,108, 32, 33, 33, 32, 32, - 42, 42, 10,105,110,118,100,115, 58, 10, 48, 58, 56, 51, 57, 56, 58,101, - 54, 58, 48, 48, 58, 48, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 32, 71,101,111, 77, 97,110, 41, 13, 10,100,107,103,101,110,115, 97,110, + 109, 55, 50, 58, 13, 10, 48, 58, 97, 48, 57, 97, 48, 58, 57,102, 58, 52, + 48, 58, 50, 48, 13, 10, 48, 58, 97, 48, 97, 52, 48, 58, 48, 51, 58, 52, + 48, 58, 48, 50, 13, 10, 13, 10, 59, 40, 99,117,116,105,101, 32,113, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 99,117,116,105, + 101,113, 58, 13, 10, 48, 58, 50, 50, 49, 53, 58, 99, 58, 48, 48, 58, 48, + 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114, + 111, 46, 99, 32, 40,112,117,114,117,114,117,110, 41, 13, 10,112,117,114, + 117,114,117,110, 58, 13, 10, 48, 58, 56, 48,102, 50, 98, 56, 58, 52, 98, + 58, 48, 48, 58, 56, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,110,105,110,106, 97,119, 46, 99, 32, 40,116,104,101, 32,110,105,110, + 106, 97, 32,119, 97,114,114,105,111,114,115, 32, 40,119,111,114,108,100, + 41, 41, 13, 10,110,105,110,106, 97,119, 58, 13, 10,110,105,110,106, 97, + 119,106, 58, 13, 10,110,105,110,106, 97,119,117, 58, 13, 10, 48, 58, 99, + 52, 54, 52, 53, 58, 51,102, 56, 58, 48, 49, 58, 52, 55, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,118,105, 99,100,117,101,108, 46, 99, + 32, 40,105,110,118,105,110, 99,111, 47,100,101,101,112, 32,115, 99, 97, + 110, 41, 13, 10, 59, 32, 42, 42, 32,112,108, 97,121,101,114, 32,115, 99, + 111,114,101,115, 32,102,114,111,109, 32,108, 97,115,116, 32,103, 97,109, + 101, 32,112,108, 97,121,101,100, 32, 97,108,115,111, 32,115, 97,118,101, + 100, 32, 45, 32,110,111, 32, 98,105,103, 32,100,101, 97,108, 32, 33, 33, + 32, 32, 42, 42, 13, 10,105,110,118,100,115, 58, 13, 10, 48, 58, 56, 51, + 57, 56, 58,101, 54, 58, 48, 48, 58, 48, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116, - 101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32,104,105,103, - 104,115, 99,111,114,101, 95,118, 55, 46, 57, 50, 32, 97,100,100,105,116, - 105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101, - 101,122,101,114, 47,103,101,111,109, 97,110, 32, 32, 42, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, + 10, 59, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, 99, + 105, 97,108, 32,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, + 50, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, + 45, 32, 98,121, 32,108,101,101,122,101,114, 47,103,101,111,109, 97,110, + 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40, - 112,117,122,122,108,105, 41, 10,112,117,122,122,108,105, 58, 10, 48, 58, - 56, 48,101, 97, 98, 99, 58, 52, 99, 58, 48, 48, 58, 52,102, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95, 98, 46, 99, 32, - 40,104,105,116, 32,116,104,101, 32,105, 99,101, 32, 40,117,115, 41, 41, - 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97,105,116, - 32,117,110,116,105,108,108, 32,116,104,101, 32,104,105,115, 99,111,114, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 109,101,116,114,111, 46, 99, 32, 40,112,117,122,122,108,105, 41, 13, 10, + 112,117,122,122,108,105, 58, 13, 10, 48, 58, 56, 48,101, 97, 98, 99, 58, + 52, 99, 58, 48, 48, 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,116, 97,105,116,111, 95, 98, 46, 99, 32, 40,104,105,116, 32, + 116,104,101, 32,105, 99,101, 32, 40,117,115, 41, 41, 13, 10, 59, 42, 42, + 32,121,111,117, 32,109,117,115,116, 32,119, 97,105,116, 32,117,110,116, + 105,108,108, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116, 97, + 98,108,101, 32,104, 97,115, 32,100,105,115,112,108, 97,121,101,100, 32, + 105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 98,101, + 102,111,114,101, 32, 42, 42, 13, 10, 59, 42, 42, 32,115,116, 97,114,116, + 105,110,103, 32, 97, 32,103, 97,109,101, 44, 32,102,111,114, 32,116,104, + 101, 32,115, 97,118,101, 32,116,111, 32,119,111,114,107, 32, 42, 42, 13, + 10,104,105,116,105, 99,101, 58, 13, 10, 48, 58, 56, 48, 50, 56, 51, 48, + 58, 50, 55, 58, 48, 48, 58, 52, 98, 13, 10, 48, 58, 56, 48, 50, 56, 53, + 50, 58, 49, 58, 53, 54, 58, 53, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,109, 57, 50, 46, 99, 32, 40,103,117,110,102,111,114, 99, + 101, 32, 50, 41, 13, 10,103,117,110,102,111,114, 99, 50, 58, 13, 10,103, + 101,111,115,116,111,114,109, 58, 13, 10, 48, 58,101, 97, 53, 97,101, 58, + 52, 98, 58, 48, 48, 58, 97, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,115,104, 97,114,114,105,101,114, 46, 99, 32, 40,101,110,100, + 117,114,111, 32,114, 97, 99,101,114, 32, 40, 98,111,111,116,108,101,103, + 32,115,101,116, 32, 49, 41, 41, 13, 10,101,110,100,117,114,111, 98,108, + 58, 13, 10, 48, 58, 52, 51, 52, 48, 48, 58, 52, 97, 48, 58, 48, 49, 58, + 50, 48, 13, 10, 48, 58, 52, 51, 98, 57, 48, 58, 49, 48, 58, 57, 57, 58, + 57, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,105, 99, + 115,104,101, 97,116, 46, 99, 32, 40, 98,105,103, 32,114,117,110, 32, 40, + 49, 49,116,104, 32,114, 97,108,108,121,101, 32,118,101,114,115,105,111, + 110, 41, 41, 13, 10, 98,105,103,114,117,110, 58, 13, 10, 48, 58,102, 54, + 49,100, 97, 58, 50, 98, 99, 58, 53, 48, 58, 48, 53, 13, 10, 13, 10, 59, + 40, 99,114,117,100,101, 32, 98,117,115,116,101,114, 32, 40,119,111,114, + 108,100, 32,102,120, 32,118,101,114,115,105,111,110, 41, 41, 32, 97,110, + 100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97, + 110, 41, 13, 10, 99, 98,117,115,116,101,114, 58, 13, 10, 99, 98,117,115, + 116,101,114,119, 58, 13, 10, 99, 98,117,115,116,101,114,106, 58, 13, 10, + 48, 58, 56, 48, 48, 56, 48, 58, 50, 56, 58, 48, 49, 58, 48, 48, 13, 10, + 116,119,111, 99,114,117,100,101, 58, 13, 10,116,119,111, 99,114,117,100, + 101, 97, 58, 13, 10, 48, 58, 56, 48, 48, 56, 48, 58, 50, 56, 58, 48, 49, + 58, 48, 48, 13, 10, 48, 58, 56, 48, 48, 99, 48, 58, 50, 56, 58, 52, 49, + 58, 48, 48, 13, 10, 13, 10, 59, 40, 98,111,117,110,116,121, 44, 32,116, + 104,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98, + 111,117,110,116,121, 58, 13, 10, 48, 58, 98, 49, 98, 97, 58, 54, 58, 48, + 58, 48, 13, 10, 48, 58, 98, 50, 51, 97, 58, 54, 58, 48, 58, 48, 13, 10, + 48, 58, 98, 50, 98, 97, 58, 54, 58, 48, 58, 48, 13, 10, 48, 58, 98, 49, + 57, 97, 58, 54, 58, 50, 54, 58, 50, 55, 13, 10, 48, 58, 98, 50, 49, 97, + 58, 54, 58, 50, 54, 58, 50, 55, 13, 10, 48, 58, 98, 50, 57, 97, 58, 54, + 58, 50, 54, 58, 50, 55, 13, 10, 13, 10, 59, 40, 98,111,116,116,111,109, + 32,111,102, 32,116,104,101, 32,110,105,110,116,104, 32, 40,118,101,114, + 115,105,111,110, 32,116, 41, 41, 32, 97,110,100, 32, 99,108,111,110,101, + 115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,111,116, + 116,111,109, 57, 58, 13, 10, 98,111,116,116,111,109, 57,110, 58, 13, 10, + 109,115,116, 97,100,105,117,109, 58, 13, 10, 48, 58, 52, 49, 55, 54, 58, + 56, 50, 58, 52, 49, 58, 55, 48, 13, 10, 13, 10, 59, 40, 98,111,109, 98, + 32, 98,101,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, + 10, 98,111,109, 98, 98,101,101, 58, 13, 10, 48, 58, 50, 50, 49, 52, 58, + 53, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 40, 98,111,103,101,121, + 32,109, 97,110,111,114, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10, 98,111,103,101,121,109, 97,110, 58, 13, 10, 48, 58, 48, 48, + 50, 49, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 49, 51,101, 48, + 58, 50, 57, 58, 48, 48, 58, 49,101, 13, 10, 48, 58, 49, 52, 48, 57, 58, + 50, 55, 58, 48,102, 58, 48, 48, 13, 10, 13, 10, 59, 40, 98,108,111, 99, + 107, 32,104,111,108,101, 41, 32, 97,110,100, 32, 99,108,111,110,101,115, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,108,111, 99, + 107,104,108, 58, 13, 10,113,117, 97,114,116,104, 58, 13, 10, 48, 58, 52, + 49, 54, 51, 58, 52, 52, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10, 59, 40, + 98,105,111, 32, 97,116,116, 97, 99,107, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10, 98,105,111, 97,116, 97, 99,107, 58, 13, 10, + 48, 58, 56, 48, 48,101, 58, 50, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, + 56, 48, 49, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 40, + 98,108, 97, 99,107, 32,104,111,108,101, 41, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10, 98,108,107,104,111,108,101, 58, 13, 10, 48, + 58, 52, 49, 52, 48, 58, 57, 58, 53, 56, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,115,116,108,102,111,114, 99,101, 46, 99, + 32, 40,115,116,101,101,108, 32,102,111,114, 99,101, 41, 13, 10,115,116, + 108,102,111,114, 99,101, 58, 13, 10, 48, 58, 49, 48, 53, 55, 55, 50, 58, + 51, 50, 58, 52,101, 58, 48, 48, 13, 10, 48, 58, 49, 48, 53, 55, 56, 52, + 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, 59, 40, 98,105,103, 32, + 112,114,111, 32,119,114,101,115,116,108,105,110,103, 33, 44,116,104,101, + 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,105,103, + 112,114,111,119,114, 58, 13, 10,116, 97,103,116,101, 97,109, 58, 13, 10, + 48, 58, 52, 48, 54, 58, 49, 50, 99, 58, 48, 48, 58, 49, 57, 13, 10, 48, + 58, 51, 50, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10, 59, 40, 98, + 105,103, 32,107, 97,114,110, 97,107, 41, 32, 40, 98,121, 32, 71,101,111, + 77, 97,110, 41, 13, 10, 98,105,103,107, 97,114,110,107, 58, 13, 10, 48, + 58, 49, 48, 50, 48, 56, 54, 58, 97, 48, 58, 48, 48, 58, 48, 97, 13, 10, + 48, 58,102,102, 56, 48, 49,101, 58, 52, 58, 48, 48, 58, 56, 48, 13, 10, + 13, 10, 59, 40, 98,101,101,122,101,114, 32, 40,115,101,116, 49, 41, 41, + 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,101,101,122, + 101,114, 58, 13, 10, 48, 58, 48, 53, 48, 55, 58, 53, 48, 58, 53, 53, 58, + 48, 48, 13, 10, 13, 10, 59, 40, 98,101,101,122,101,114, 32, 40,115,101, + 116, 50, 41, 41, 32, 99,108,111,110,101, 32, 45, 32,109,111,100,105,102, + 105,101,100, 32,104,105,115, 99,111,114,101, 32,115, 97,118,101, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,101,101,122,101,114, + 49, 58, 13, 10, 48, 58, 48, 53, 48, 51, 58, 53, 48, 58, 53, 53, 58, 48, + 48, 13, 10, 13, 10, 59, 40, 98, 97,116,116,108, 97,110,116,105,115, 41, + 32, 40, 98, 97,116,116,108, 97,110,116,105,115, 32, 40,106, 97,112, 97, + 110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98, + 97,116,116,108,110,116,115, 58, 13, 10, 98, 97,116,116,108,110,116,115, + 106, 58, 13, 10, 98, 97,116,116,108,110,116,115, 97, 58, 13, 10, 48, 58, + 49, 48, 53, 48, 58, 52, 58, 48, 58, 48, 13, 10, 48, 58, 49, 49, 48, 48, + 58, 53, 48, 58, 48, 48, 58, 53, 50, 13, 10, 13, 10, 59, 40, 98, 97, 99, + 107, 32,115,116,114,101,101,116, 32,115,111, 99, 99,101,114, 41, 32, 40, + 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, 98,115,115,111, 99, 99, + 101,114, 58, 13, 10, 98,115,115,111, 99, 99,101,114, 97, 58, 13, 10, 48, + 58, 50, 48, 48,101, 57, 48, 58, 50, 56, 58, 52, 49, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119, 97,114,114,105,111,114, + 98, 46, 99, 32, 40,119, 97,114,114,105,111,114, 32, 98,108, 97,100,101, + 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,119, 97,114,114,105,111,114, + 98, 58, 13, 10, 48, 58, 50, 48, 50, 97, 51, 56, 58,101,102, 58, 53, 48, + 58, 48, 48, 13, 10, 48, 58, 50, 48, 50, 98, 50, 53, 58, 49, 58, 48, 49, + 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,112, + 115, 50, 46, 99, 32, 40,114,111, 99,107,109, 97,110, 32, 50, 32, 58, 32, + 116,104,101, 32,112,111,119,101,114, 32,102,105,103,104,116,101,114,115, + 32, 40,106, 97,112, 97,110, 32, 57, 54, 48, 55, 48, 56, 41, 41, 13, 10, + 114,111, 99,107,109, 97,110, 50,106, 58, 13, 10,114, 99,107,109, 97,110, + 50,106,114,101,103,105,111,110, 58, 13, 10, 48, 58,102,102,101,102, 99, + 48, 58, 49, 49, 56, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58,102,102,102, + 48, 52, 55, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 83,107, + 117,108,108, 32, 38, 32, 67,114,111,115,115, 98,111,110,101,115, 32, 40, + 115,101,116, 50, 41, 32, 99,108,111,110,101, 13, 10, 59,115,107,117,108, + 108,120, 98, 50, 58, 13, 10, 59,115,107,117,108,108,120, 98,111, 58, 13, + 10, 59,115,107,117,108,108,120, 98, 49, 58, 13, 10, 59,115,107,117,108, + 108,120, 98, 51, 58, 13, 10, 59,115,107,117,108,108,120, 98, 52, 58, 13, + 10, 59, 48, 58,102,102,102, 53, 54, 56, 58, 49, 48, 48, 58, 54,102, 58, + 48, 48, 13, 10, 59, 48, 58,102,102,102, 54, 54, 54, 58, 49, 58, 53, 52, + 58, 53, 52, 13, 10, 13, 10, 59, 83, 97,116,117,114,100, 97,121, 32, 78, + 105,103,104,116, 32, 83,108, 97,109, 32, 77, 97,115,116,101,114,115, 32, + 99,108,111,110,101,115, 13, 10,115,108, 97,109,109, 97,115,116,117, 58, + 13, 10, 48, 58,102,102, 97, 49, 51, 56, 58, 48, 50, 58, 48, 48, 58, 49, + 48, 13, 10, 48, 58,102,102, 97, 49, 51, 97, 58, 97,101, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 82,111, 98,111, 99,111,112, 32, 99,108,111, + 110,101,115, 13, 10,114,111, 98,111, 99,111,112,119, 58, 13, 10,114,111, + 98,111, 99,111,112,106, 58, 13, 10,114,111, 98,111, 99,111,112,117, 58, + 13, 10,114,111, 98,111, 99,111,112,117, 48, 58, 13, 10, 48, 58,102,102, + 56,101,100, 56, 58, 97, 48, 58, 52,100, 58, 48, 48, 13, 10, 48, 58,102, + 102, 98, 53, 50, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, + 102, 98, 53, 50, 51, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42,100,101, 99, 48, 46, 99, 32, 40,114,111, 98, + 111, 99,111,112, 32, 40,119,111,114,108,100, 32,114,101,118,105,115,105, + 111,110, 32, 52, 41, 41, 13, 10,114,111, 98,111, 99,111,112, 58, 13, 10, + 48, 58,102,102, 56,101,100, 56, 58, 97, 48, 58, 52,100, 58, 48, 48, 13, + 10, 48, 58,102,102, 98, 53, 50, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,102,102, 98, 53, 50, 51, 58, 49, 58, 48, 53, 58, 48, 53, 13, + 10, 13, 10,114,111, 98,111, 99,111,112, 98, 58, 13, 10, 97,117,116,111, + 109, 97,116, 58, 13, 10, 48, 58,102,102, 56,101,100, 56, 58, 97, 48, 58, + 52,100, 58, 48, 48, 13, 10, 48, 58,102,102, 98, 53, 50, 50, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 98, 53, 50, 51, 58, 49, 58, + 48, 53, 58, 48, 53, 13, 10, 48, 58,102,102, 98, 53, 50, 52, 58, 50, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 80,117,122,122,108,101, 32, 66, + 111, 98, 98,108,101, 32, 52, 32, 99,108,111,110,101,115, 13, 10,112, 98, + 111, 98, 98,108,101, 52,106, 58, 13, 10,112, 98,111, 98, 98,108,101, 52, + 117, 58, 13, 10, 48, 58, 52, 48,101, 56, 53, 97, 58, 49, 49, 54, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 52, 48,101, 56, 98, 97, 58, 49, 58, 52, + 49, 58, 52, 49, 13, 10, 13, 10,103,105,106,111,101, 58, 13, 10,103,105, + 106,111,101,117, 58, 13, 10,103,105,106,111,101,106, 58, 13, 10,103,105, + 106,111,101, 97, 58, 13, 10, 48, 58, 49, 56,102, 57, 48, 48, 58,102, 56, + 58, 52, 49, 58, 48, 49, 13, 10, 13, 10, 59, 69,108,101,118, 97,116,111, + 114, 32, 65, 99,116,105,111,110, 32, 50, 32, 99,108,111,110,101,115, 13, + 10,101,108,118, 97, 99,116, 50,117, 58, 13, 10,101,108,118, 97, 99,116, + 114,106, 58, 13, 10, 48, 58, 52, 48, 99,101, 51, 97, 58, 55, 99, 58, 48, + 48, 58, 48, 49, 13, 10, 48, 58, 52, 48, 99,101, 51, 99, 58, 49, 58, 99, + 51, 58, 99, 51, 13, 10, 13, 10,103, 97,108,112, 97,110,105, 99, 58, 13, + 10,103, 97,108,112, 97,110,105, 98, 58, 13, 10, 48, 58, 53, 51,101, 55, + 50, 56, 58, 53, 48, 58, 51, 48, 58, 51, 49, 13, 10, 13, 10, 59, 68,111, + 117, 98,108,101, 32, 68,114, 97,103,111,110, 32, 50, 32, 99,108,111,110, + 101,115, 13, 10,100,100,114, 97,103,111,110, 50,117, 58, 13, 10, 48, 58, + 48,102, 57, 49, 58, 49,101, 58, 48, 50, 58, 50, 51, 13, 10, 48, 58, 48, + 48, 50, 51, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10,100,100,114, + 97,103,111,110, 50, 58, 13, 10,100,100,114, 97,103,111,110, 50, 98, 58, + 13, 10, 48, 58, 48,102, 57, 49, 58, 49,101, 58, 48, 50, 58, 50, 51, 13, + 10, 48, 58, 48, 48, 50, 51, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, + 10, 59, 67, 97,109,101,108, 84,114,121, 32, 99,108,111,110,101,115, 13, + 10, 99, 97,109,101,108,116,114,121, 97,117, 58, 13, 10, 99, 97,109,101, + 108,116,114,121,106, 58, 13, 10, 99, 97,109,101,108,116,114,121, 97, 58, + 13, 10, 48, 58, 49, 48, 54, 99, 57,101, 58, 50, 52, 52, 58, 51, 53, 58, + 52, 52, 13, 10, 48, 58, 49, 48, 54, 54, 98, 48, 58, 51,101, 58, 48, 54, + 58, 48, 48, 13, 10, 48, 58, 49, 48, 53, 52, 51, 48, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 87,111,110,100,101,114, 32, 77,111,109, + 111, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,119,110,100, + 114,109,111,109,111, 58, 13, 10, 48, 58, 52,101, 48, 48, 58, 52, 53, 58, + 48, 58, 50,102, 13, 10, 13, 10, 59, 89,111,117,106,121,117,100,110, 32, + 40, 74, 97,112, 97,110, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, + 41, 13, 10,121,111,117,106,121,117,100,110, 58, 13, 10, 48, 58,101, 53, + 54, 53, 58, 51, 55, 58, 55, 48, 58, 52,101, 13, 10, 13, 10, 59, 90,101, + 114,111, 72,111,117,114, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,122,101,114,111,104,111,117,114, 58, 13, 10,122,101,114,111,104, + 111,117,114, 97, 58, 13, 10,122,101,114,111,104,111,117,114,105, 58, 13, + 10, 48, 58, 51, 48, 50, 51, 58, 52, 58, 48, 58, 48, 13, 10, 13, 10, 59, + 68,101,118, 97,115,116, 97,116,111,114,115, 32, 99,108,111,110,101,115, + 13, 10,100,101,118,115,116,111,114,115, 50, 58, 13, 10,100,101,118,115, + 116,111,114,115, 51, 58, 13, 10,103, 97,114,117,107, 97, 58, 13, 10, 48, + 58, 52, 49, 99, 52, 58, 50,101, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, + 59, 77, 97,105,110, 32, 69,118,101,110,116, 32, 40, 98,121, 32, 71,101, + 111, 77, 97,110, 41, 13, 10,109, 97,105,110,101,118,116, 58, 13, 10,109, + 97,105,110,101,118,116, 50,112, 58, 13, 10,114,105,110,103,111,104,106, + 97, 58, 13, 10,109, 97,105,110,101,118,116,111, 58, 13, 10, 48, 58, 52, + 49, 53,100, 58, 52, 53, 58, 97,101, 58, 55, 55, 13, 10, 13, 10, 59, 77, + 97,114,107,104, 97,109, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, + 13, 10,109, 97,114,107,104, 97,109, 58, 13, 10, 48, 58, 99, 48, 99, 52, + 58, 51, 99, 58, 50, 97, 58, 48, 48, 13, 10, 13, 10,114,111,117,116,101, + 49, 54, 98,108, 58, 13, 10,114,111,117,116,101, 49, 54, 97, 58, 13, 10, + 114,111,117,116,101,120, 58, 13, 10, 48, 58, 52, 48, 51, 50, 58, 57, 58, + 48, 58, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111, + 117,116,101, 49, 54, 46, 99, 13, 10,114,111,117,116,101, 49, 54, 58, 13, + 10,114,111,117,116,101, 49, 54, 99, 58, 13, 10, 48, 58, 52, 48, 51, 50, + 58, 57, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 77,111,103,117, 99, + 104, 97,110, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10,109, + 111,103,117, 99,104, 97,110, 58, 13, 10, 48, 58, 53,101,100, 97, 58, 54, + 58, 48, 58, 48, 13, 10, 13, 10, 59, 78, 97,117,103,104,116,121, 32, 66, + 111,121, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, + 97,110, 41, 32, 45, 32,115, 99,111,114,101, 32,117,112,100, 97,116,101, + 115, 32, 97,102,116,101,114, 32,103, 97,109,101, 32,115,116, 97,114,116, + 32, 33, 33, 33, 13, 10,110, 97,117,103,104,116,121, 97, 58, 13, 10,110, + 97,117,103,104,116,121, 99, 58, 13, 10, 48, 58, 52, 48, 48, 52, 58, 51, + 58, 48, 58, 48, 13, 10, 48, 58, 56, 55, 51, 51, 58, 49, 58, 50, 48, 58, + 50, 48, 13, 10, 48, 58, 56, 55, 51, 55, 58, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 56, 55, 51,100, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 56, 55, 51,102, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 56, 55, 52, 51, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59,105, + 110, 32,116,104,105,115, 32,103, 97,109,101, 32,116,111, 32,109, 97,107, + 101, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,100,105,115,112, + 108, 97,121, 32, 98,121, 32,115,116, 97,114,116,105,110,103, 32, 97, 32, + 110,101,119, 32,103, 97,109,101, 32, 40,105,102, 32,121,111,117, 32, 98, + 101, 97,116, 32,116,104,101, 32,104,105,115, 99,111,114,101, 41, 32, 98, + 101,102,111,114,101, 32,121,111,117, 32,101,120,105,116, 13, 10,110, 97, + 117,103,104,116,121, 98, 58, 13, 10,110, 97,117,103,104,116,121, 98, 97, + 58, 13, 10,110, 97,117,103,104,116,121, 98, 99, 58, 13, 10, 48, 58, 52, + 48, 48, 52, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, 52, 48, 50, 49, 58, + 51, 58, 48, 58, 48, 13, 10, 48, 58, 56, 55, 50,102, 58, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58, 56, 55, 51, 51, 58, 49, 58, 50, 48, 58, 50, + 48, 13, 10, 48, 58, 56, 55, 51, 55, 58, 49, 58, 50, 48, 58, 50, 48, 13, + 10, 48, 58, 56, 55, 51, 98, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, + 58, 56, 55, 51,102, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 56, + 55, 52, 51, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 86,105, + 100,101,111, 32, 72,117,115,116,108,101,114, 32, 97,110,100, 32, 99,108, + 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 13, 10, + 104,117,115,116,108,101,114, 98, 58, 13, 10, 98,105,108,108,105, 97,114, + 100, 58, 13, 10,118,112,111,111,108, 58, 13, 10,104,117,115,116,108,101, + 114,100, 58, 13, 10, 48, 58, 56, 52, 99, 48, 58,101, 58, 48, 58, 48, 13, + 10, 48, 58, 56, 48, 97, 56, 58, 51, 58, 48, 58, 50, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 42,115, 99,111, 98,114, 97, 46, 99, 32, + 40,118,105,100,101,111, 32,104,117,115,116,108,101,114, 41, 13, 10,104, + 117,115,116,108,101,114, 58, 13, 10,104,117,115,116,108,101,114, 98, 51, + 58, 13, 10,104,117,115,116,108,101,114, 98, 52, 58, 13, 10, 48, 58, 56, + 52, 99, 48, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 97, + 56, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 48, 58, 56, 48, 48, 51, 58, + 49, 58, 48, 97, 58, 48, 97, 13, 10, 13, 10, 59, 77,111,111,110,119, 97, + 114, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71, + 101,111, 77, 97,110, 41, 13, 10,109,111,111,110,119, 97,114, 58, 13, 10, + 109,111,111,110,119, 97,114, 97, 58, 13, 10, 48, 58, 56, 48,102, 50, 58, + 51, 99, 58, 48, 50, 58, 52, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40,108,105,103, + 104,116, 98,114,105,110,103,101,114, 32, 40,106, 97,112, 97,110, 41, 41, + 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97,105, + 116, 32,117,110,116,105,108, 32,116,104,101, 32,104,105,115, 99,111,114, 101, 32,116, 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112,108, 97, 121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100, - 101, 32, 98,101,102,111,114,101, 32, 42, 42, 10, 59, 42, 42, 32,115,116, - 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 44, 32,102,111,114, - 32,116,104,101, 32,115, 97,118,101, 32,116,111, 32,119,111,114,107, 32, - 42, 42, 32, 10,104,105,116,105, 99,101, 58, 10, 48, 58, 56, 48, 50, 56, - 51, 48, 58, 50, 55, 58, 48, 48, 58, 52, 98, 10, 48, 58, 56, 48, 50, 56, - 53, 50, 58, 49, 58, 53, 54, 58, 53, 54, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,109, 57, 50, 46, 99, 32, 40,103,117,110,102,111,114, 99,101, - 32, 50, 41, 10,103,117,110,102,111,114, 99, 50, 58, 10,103,101,111,115, - 116,111,114,109, 58, 10, 48, 58,101, 97, 53, 97,101, 58, 52, 98, 58, 48, - 48, 58, 97, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97, - 114,114,105,101,114, 46, 99, 32, 40,101,110,100,117,114,111, 32,114, 97, - 99,101,114, 32, 40, 98,111,111,116,108,101,103, 32,115,101,116, 32, 49, - 41, 41, 10,101,110,100,117,114,111, 98,108, 58, 10, 48, 58, 52, 51, 52, - 48, 48, 58, 52, 97, 48, 58, 48, 49, 58, 50, 48, 10, 48, 58, 52, 51, 98, - 57, 48, 58, 49, 48, 58, 57, 57, 58, 57, 57, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 99,105, 99,115,104,101, 97,116, 46, 99, 32, 40, 98,105, - 103, 32,114,117,110, 32, 40, 49, 49,116,104, 32,114, 97,108,108,121,101, - 32,118,101,114,115,105,111,110, 41, 41, 10, 98,105,103,114,117,110, 58, - 10, 48, 58,102, 54, 49,100, 97, 58, 50, 98, 99, 58, 53, 48, 58, 48, 53, - 10, 10, 59, 40, 99,114,117,100,101, 32, 98,117,115,116,101,114, 32, 40, - 119,111,114,108,100, 32,102,120, 32,118,101,114,115,105,111,110, 41, 41, - 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10, 99, 98,117,115,116,101,114, 58, 10, 99, 98,117, - 115,116,101,114,119, 58, 10, 99, 98,117,115,116,101,114,106, 58, 10, 48, - 58, 56, 48, 48, 56, 48, 58, 50, 56, 58, 48, 49, 58, 48, 48, 10,116,119, - 111, 99,114,117,100,101, 58, 10,116,119,111, 99,114,117,100,101, 97, 58, - 10, 48, 58, 56, 48, 48, 56, 48, 58, 50, 56, 58, 48, 49, 58, 48, 48, 10, - 48, 58, 56, 48, 48, 99, 48, 58, 50, 56, 58, 52, 49, 58, 48, 48, 10, 10, - 59, 40, 98,111,117,110,116,121, 44, 32,116,104,101, 41, 32, 40, 98,121, - 32, 71,101,111, 77, 97,110, 41, 10, 98,111,117,110,116,121, 58, 10, 48, - 58, 98, 49, 98, 97, 58, 54, 58, 48, 58, 48, 10, 48, 58, 98, 50, 51, 97, - 58, 54, 58, 48, 58, 48, 10, 48, 58, 98, 50, 98, 97, 58, 54, 58, 48, 58, - 48, 10, 48, 58, 98, 49, 57, 97, 58, 54, 58, 50, 54, 58, 50, 55, 10, 48, - 58, 98, 50, 49, 97, 58, 54, 58, 50, 54, 58, 50, 55, 10, 48, 58, 98, 50, - 57, 97, 58, 54, 58, 50, 54, 58, 50, 55, 10, 10, 59, 40, 98,111,116,116, - 111,109, 32,111,102, 32,116,104,101, 32,110,105,110,116,104, 32, 40,118, - 101,114,115,105,111,110, 32,116, 41, 41, 32, 97,110,100, 32, 99,108,111, - 110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98,111, - 116,116,111,109, 57, 58, 10, 98,111,116,116,111,109, 57,110, 58, 10,109, - 115,116, 97,100,105,117,109, 58, 10, 48, 58, 52, 49, 55, 54, 58, 56, 50, - 58, 52, 49, 58, 55, 48, 10, 10, 59, 40, 98,111,109, 98, 32, 98,101,101, - 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98,111,109, 98, - 98,101,101, 58, 10, 48, 58, 50, 50, 49, 52, 58, 53, 58, 48, 48, 58, 48, - 49, 10, 10, 59, 40, 98,111,103,101,121, 32,109, 97,110,111,114, 41, 32, - 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98,111,103,101,121,109, - 97,110, 58, 10, 48, 58, 48, 48, 50, 49, 58, 51, 58, 48, 48, 58, 48, 49, - 10, 48, 58, 49, 51,101, 48, 58, 50, 57, 58, 48, 48, 58, 49,101, 10, 48, - 58, 49, 52, 48, 57, 58, 50, 55, 58, 48,102, 58, 48, 48, 10, 10, 59, 40, - 98,108,111, 99,107, 32,104,111,108,101, 41, 32, 97,110,100, 32, 99,108, - 111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98, - 108,111, 99,107,104,108, 58, 10,113,117, 97,114,116,104, 58, 10, 48, 58, - 52, 49, 54, 51, 58, 52, 52, 58, 48, 48, 58, 48, 53, 10, 10, 59, 40, 98, - 105,111, 32, 97,116,116, 97, 99,107, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10, 98,105,111, 97,116, 97, 99,107, 58, 10, 48, 58, 56, - 48, 48,101, 58, 50, 58, 48, 48, 58, 53, 48, 10, 48, 58, 56, 48, 49, 48, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 40, 98,108, 97, 99,107, 32, - 104,111,108,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 98,108,107,104,111,108,101, 58, 10, 48, 58, 52, 49, 52, 48, 58, 57, 58, - 53, 56, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,116, - 108,102,111,114, 99,101, 46, 99, 32, 40,115,116,101,101,108, 32,102,111, - 114, 99,101, 41, 10,115,116,108,102,111,114, 99,101, 58, 10, 48, 58, 49, - 48, 53, 55, 55, 50, 58, 51, 50, 58, 52,101, 58, 48, 48, 10, 48, 58, 49, - 48, 53, 55, 56, 52, 58, 49, 58, 48, 50, 58, 48, 50, 10, 10, 59, 40, 98, - 105,103, 32,112,114,111, 32,119,114,101,115,116,108,105,110,103, 33, 44, - 116,104,101, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98, - 105,103,112,114,111,119,114, 58, 10,116, 97,103,116,101, 97,109, 58, 10, - 48, 58, 52, 48, 54, 58, 49, 50, 99, 58, 48, 48, 58, 49, 57, 10, 48, 58, - 51, 50, 58, 51, 58, 48, 48, 58, 48, 53, 10, 10, 59, 40, 98,105,103, 32, - 107, 97,114,110, 97,107, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, - 41, 10, 98,105,103,107, 97,114,110,107, 58, 10, 48, 58, 49, 48, 50, 48, - 56, 54, 58, 97, 48, 58, 48, 48, 58, 48, 97, 10, 48, 58,102,102, 56, 48, - 49,101, 58, 52, 58, 48, 48, 58, 56, 48, 10, 10, 59, 40, 98,101,101,122, - 101,114, 32, 40,115,101,116, 49, 41, 41, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10, 98,101,101,122,101,114, 58, 10, 48, 58, 48, 53, 48, - 55, 58, 53, 48, 58, 53, 53, 58, 48, 48, 10, 10, 59, 40, 98,101,101,122, - 101,114, 32, 40,115,101,116, 50, 41, 41, 32, 99,108,111,110,101, 32, 45, - 32,109,111,100,105,102,105,101,100, 32,104,105,115, 99,111,114,101, 32, - 115, 97,118,101, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, 98, - 101,101,122,101,114, 49, 58, 10, 48, 58, 48, 53, 48, 51, 58, 53, 48, 58, - 53, 53, 58, 48, 48, 10, 10, 59, 40, 98, 97,116,116,108, 97,110,116,105, - 115, 41, 32, 40, 98, 97,116,116,108, 97,110,116,105,115, 32, 40,106, 97, - 112, 97,110, 41, 41, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 98, 97,116,116,108,110,116,115, 58, 10, 98, 97,116,116,108,110,116,115, - 106, 58, 10, 98, 97,116,116,108,110,116,115, 97, 58, 10, 48, 58, 49, 48, - 53, 48, 58, 52, 58, 48, 58, 48, 10, 48, 58, 49, 49, 48, 48, 58, 53, 48, - 58, 48, 48, 58, 53, 50, 10, 10, 59, 40, 98, 97, 99,107, 32,115,116,114, - 101,101,116, 32,115,111, 99, 99,101,114, 41, 32, 40, 98,121, 32, 71,101, - 111, 77, 97,110, 41, 10, 98,115,115,111, 99, 99,101,114, 58, 10, 98,115, - 115,111, 99, 99,101,114, 97, 58, 10, 48, 58, 50, 48, 48,101, 57, 48, 58, - 50, 56, 58, 52, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,119, 97,114,114,105,111,114, 98, 46, 99, 32, 40,119, 97,114,114,105, - 111,114, 32, 98,108, 97,100,101, 32, 40,106, 97,112, 97,110, 41, 41, 10, - 119, 97,114,114,105,111,114, 98, 58, 10, 48, 58, 50, 48, 50, 97, 51, 56, - 58,101,102, 58, 53, 48, 58, 48, 48, 10, 48, 58, 50, 48, 50, 98, 50, 53, - 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 99,112,115, 50, 46, 99, 32, 40,114,111, 99,107,109, 97,110, 32, 50, - 32, 58, 32,116,104,101, 32,112,111,119,101,114, 32,102,105,103,104,116, - 101,114,115, 32, 40,106, 97,112, 97,110, 32, 57, 54, 48, 55, 48, 56, 41, - 41, 10,114,111, 99,107,109, 97,110, 50,106, 58, 10,114, 99,107,109, 97, - 110, 50,106,114,101,103,105,111,110, 58, 10, 48, 58,102,102,101,102, 99, - 48, 58, 49, 49, 56, 58, 48, 48, 58, 48, 50, 10, 48, 58,102,102,102, 48, - 52, 55, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, 83,107,117,108,108, - 32, 38, 32, 67,114,111,115,115, 98,111,110,101,115, 32, 40,115,101,116, - 50, 41, 32, 99,108,111,110,101, 10, 59,115,107,117,108,108,120, 98, 50, - 58, 10, 59,115,107,117,108,108,120, 98,111, 58, 10, 59,115,107,117,108, - 108,120, 98, 49, 58, 10, 59,115,107,117,108,108,120, 98, 51, 58, 10, 59, - 115,107,117,108,108,120, 98, 52, 58, 10, 59, 48, 58,102,102,102, 53, 54, - 56, 58, 49, 48, 48, 58, 54,102, 58, 48, 48, 10, 59, 48, 58,102,102,102, - 54, 54, 54, 58, 49, 58, 53, 52, 58, 53, 52, 10, 10, 59, 83, 97,116,117, - 114,100, 97,121, 32, 78,105,103,104,116, 32, 83,108, 97,109, 32, 77, 97, - 115,116,101,114,115, 32, 99,108,111,110,101,115, 10,115,108, 97,109,109, - 97,115,116,117, 58, 32, 10, 48, 58,102,102, 97, 49, 51, 56, 58, 48, 50, - 58, 48, 48, 58, 49, 48, 10, 48, 58,102,102, 97, 49, 51, 97, 58, 97,101, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 82,111, 98,111, 99,111,112, 32, 99, - 108,111,110,101,115, 10,114,111, 98,111, 99,111,112,119, 58, 10,114,111, - 98,111, 99,111,112,106, 58, 10,114,111, 98,111, 99,111,112,117, 58, 10, - 114,111, 98,111, 99,111,112,117, 48, 58, 10, 48, 58,102,102, 56,101,100, - 56, 58, 97, 48, 58, 52,100, 58, 48, 48, 10, 48, 58,102,102, 98, 53, 50, - 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 98, 53, 50, 51, - 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 100,101, 99, 48, 46, 99, 32, 40,114,111, 98,111, 99,111,112, 32, 40,119, - 111,114,108,100, 32,114,101,118,105,115,105,111,110, 32, 52, 41, 41, 10, - 114,111, 98,111, 99,111,112, 58, 10, 48, 58,102,102, 56,101,100, 56, 58, - 97, 48, 58, 52,100, 58, 48, 48, 10, 48, 58,102,102, 98, 53, 50, 50, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 98, 53, 50, 51, 58, 49, - 58, 48, 53, 58, 48, 53, 10, 10,114,111, 98,111, 99,111,112, 98, 58, 10, - 97,117,116,111,109, 97,116, 58, 10, 48, 58,102,102, 56,101,100, 56, 58, - 97, 48, 58, 52,100, 58, 48, 48, 10, 48, 58,102,102, 98, 53, 50, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 98, 53, 50, 51, 58, 49, - 58, 48, 53, 58, 48, 53, 10, 48, 58,102,102, 98, 53, 50, 52, 58, 50, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 80,117,122,122,108,101, 32, 66,111, 98, - 98,108,101, 32, 52, 32, 99,108,111,110,101,115, 10,112, 98,111, 98, 98, - 108,101, 52,106, 58, 10,112, 98,111, 98, 98,108,101, 52,117, 58, 10, 48, - 58, 52, 48,101, 56, 53, 97, 58, 49, 49, 54, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 52, 48,101, 56, 98, 97, 58, 49, 58, 52, 49, 58, 52, 49, 10, 10, - 103,105,106,111,101, 58, 10,103,105,106,111,101,117, 58, 10,103,105,106, - 111,101,106, 58, 10,103,105,106,111,101, 97, 58, 10, 48, 58, 49, 56,102, - 57, 48, 48, 58,102, 56, 58, 52, 49, 58, 48, 49, 10, 10, 59, 69,108,101, - 118, 97,116,111,114, 32, 65, 99,116,105,111,110, 32, 50, 32, 99,108,111, - 110,101,115, 10,101,108,118, 97, 99,116, 50,117, 58, 10,101,108,118, 97, - 99,116,114,106, 58, 10, 48, 58, 52, 48, 99,101, 51, 97, 58, 55, 99, 58, - 48, 48, 58, 48, 49, 10, 48, 58, 52, 48, 99,101, 51, 99, 58, 49, 58, 99, - 51, 58, 99, 51, 10, 10,103, 97,108,112, 97,110,105, 99, 58, 10,103, 97, - 108,112, 97,110,105, 98, 58, 10, 48, 58, 53, 51,101, 55, 50, 56, 58, 53, - 48, 58, 51, 48, 58, 51, 49, 10, 10, 59, 68,111,117, 98,108,101, 32, 68, - 114, 97,103,111,110, 32, 50, 32, 99,108,111,110,101,115, 10,100,100,114, - 97,103,111,110, 50,117, 58, 10, 48, 58, 48,102, 57, 49, 58, 49,101, 58, - 48, 50, 58, 50, 51, 10, 48, 58, 48, 48, 50, 51, 58, 51, 58, 48, 50, 58, - 48, 48, 10, 10,100,100,114, 97,103,111,110, 50, 58, 10,100,100,114, 97, - 103,111,110, 50, 98, 58, 10, 48, 58, 48,102, 57, 49, 58, 49,101, 58, 48, - 50, 58, 50, 51, 10, 48, 58, 48, 48, 50, 51, 58, 51, 58, 48, 50, 58, 48, - 48, 10, 10, 59, 67, 97,109,101,108, 84,114,121, 32, 99,108,111,110,101, - 115, 10, 99, 97,109,101,108,116,114,121, 97,117, 58, 10, 99, 97,109,101, - 108,116,114,121,106, 58, 10, 99, 97,109,101,108,116,114,121, 97, 58, 10, - 48, 58, 49, 48, 54, 99, 57,101, 58, 50, 52, 52, 58, 51, 53, 58, 52, 52, - 10, 48, 58, 49, 48, 54, 54, 98, 48, 58, 51,101, 58, 48, 54, 58, 48, 48, - 10, 48, 58, 49, 48, 53, 52, 51, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 87,111,110,100,101,114, 32, 77,111,109,111, 32, 40, 98,121, 32, - 71,101,111, 77, 97,110, 41, 10,119,110,100,114,109,111,109,111, 58, 10, - 48, 58, 52,101, 48, 48, 58, 52, 53, 58, 48, 58, 50,102, 10, 10, 59, 89, - 111,117,106,121,117,100,110, 32, 40, 74, 97,112, 97,110, 41, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,121,111,117,106,121,117,100,110, - 58, 10, 48, 58,101, 53, 54, 53, 58, 51, 55, 58, 55, 48, 58, 52,101, 10, - 10, 59, 90,101,114,111, 72,111,117,114, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,122,101,114,111,104,111,117,114, 58, 10,122,101,114, - 111,104,111,117,114, 97, 58, 10,122,101,114,111,104,111,117,114,105, 58, - 10, 48, 58, 51, 48, 50, 51, 58, 52, 58, 48, 58, 48, 10, 10, 59, 68,101, - 118, 97,115,116, 97,116,111,114,115, 32, 99,108,111,110,101,115, 10,100, - 101,118,115,116,111,114,115, 50, 58, 10,100,101,118,115,116,111,114,115, - 51, 58, 10,103, 97,114,117,107, 97, 58, 10, 48, 58, 52, 49, 99, 52, 58, - 50,101, 58, 48, 49, 58, 48, 49, 10, 10, 59, 77, 97,105,110, 32, 69,118, - 101,110,116, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10,109, 97, - 105,110,101,118,116, 58, 10,109, 97,105,110,101,118,116, 50,112, 58, 10, - 114,105,110,103,111,104,106, 97, 58, 10,109, 97,105,110,101,118,116,111, - 58, 10, 48, 58, 52, 49, 53,100, 58, 52, 53, 58, 97,101, 58, 55, 55, 10, - 10, 59, 77, 97,114,107,104, 97,109, 32, 40, 98,121, 32, 71,101,111, 77, - 97,110, 41, 10,109, 97,114,107,104, 97,109, 58, 10, 48, 58, 99, 48, 99, - 52, 58, 51, 99, 58, 50, 97, 58, 48, 48, 10, 10,114,111,117,116,101, 49, - 54, 98,108, 58, 10,114,111,117,116,101, 49, 54, 97, 58, 10,114,111,117, - 116,101,120, 58, 10, 48, 58, 52, 48, 51, 50, 58, 57, 58, 48, 58, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111,117,116,101, 49, 54, 46, - 99, 10,114,111,117,116,101, 49, 54, 58, 10,114,111,117,116,101, 49, 54, - 99, 58, 10, 48, 58, 52, 48, 51, 50, 58, 57, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 77,111,103,117, 99,104, 97,110, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,109,111,103,117, 99,104, 97,110, 58, 10, 48, 58, 53, - 101,100, 97, 58, 54, 58, 48, 58, 48, 10, 10, 59, 78, 97,117,103,104,116, - 121, 32, 66,111,121, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71, - 101,111, 77, 97,110, 41, 32, 45, 32,115, 99,111,114,101, 32,117,112,100, - 97,116,101,115, 32, 97,102,116,101,114, 32,103, 97,109,101, 32,115,116, - 97,114,116, 32, 33, 33, 33, 10,110, 97,117,103,104,116,121, 97, 58, 10, - 110, 97,117,103,104,116,121, 99, 58, 10, 48, 58, 52, 48, 48, 52, 58, 51, - 58, 48, 58, 48, 10, 48, 58, 56, 55, 51, 51, 58, 49, 58, 50, 48, 58, 50, - 48, 10, 48, 58, 56, 55, 51, 55, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, - 58, 56, 55, 51,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 56, 55, - 51,102, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 56, 55, 52, 51, 58, - 49, 58, 50, 48, 58, 50, 48, 10, 10, 59,105,110, 32,116,104,105,115, 32, - 103, 97,109,101, 32,116,111, 32,109, 97,107,101, 32,116,104,101, 32,104, - 105,115, 99,111,114,101, 32,100,105,115,112,108, 97,121, 32, 98,121, 32, - 115,116, 97,114,116,105,110,103, 32, 97, 32,110,101,119, 32,103, 97,109, - 101, 32, 40,105,102, 32,121,111,117, 32, 98,101, 97,116, 32,116,104,101, - 32,104,105,115, 99,111,114,101, 41, 32, 98,101,102,111,114,101, 32,121, - 111,117, 32,101,120,105,116, 10,110, 97,117,103,104,116,121, 98, 58, 32, - 10,110, 97,117,103,104,116,121, 98, 97, 58, 10,110, 97,117,103,104,116, - 121, 98, 99, 58, 10, 48, 58, 52, 48, 48, 52, 58, 51, 58, 48, 58, 48, 10, - 48, 58, 52, 48, 50, 49, 58, 51, 58, 48, 58, 48, 10, 48, 58, 56, 55, 50, - 102, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 56, 55, 51, 51, 58, 49, - 58, 50, 48, 58, 50, 48, 10, 48, 58, 56, 55, 51, 55, 58, 49, 58, 50, 48, - 58, 50, 48, 10, 48, 58, 56, 55, 51, 98, 58, 49, 58, 50, 48, 58, 50, 48, - 32, 10, 48, 58, 56, 55, 51,102, 58, 49, 58, 50, 48, 58, 50, 48, 32, 10, - 48, 58, 56, 55, 52, 51, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 59, 86, - 105,100,101,111, 32, 72,117,115,116,108,101,114, 32, 97,110,100, 32, 99, - 108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, 77, 97,110, 41, 10, - 104,117,115,116,108,101,114, 98, 58, 10, 98,105,108,108,105, 97,114,100, - 58, 10,118,112,111,111,108, 58, 10,104,117,115,116,108,101,114,100, 58, - 10, 48, 58, 56, 52, 99, 48, 58,101, 58, 48, 58, 48, 10, 48, 58, 56, 48, - 97, 56, 58, 51, 58, 48, 58, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 42,115, 99,111, 98,114, 97, 46, 99, 32, 40,118,105,100,101,111, 32, - 104,117,115,116,108,101,114, 41, 10,104,117,115,116,108,101,114, 58, 10, - 104,117,115,116,108,101,114, 98, 51, 58, 10,104,117,115,116,108,101,114, - 98, 52, 58, 10, 48, 58, 56, 52, 99, 48, 58,102, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 56, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 50, 10, 48, 58, - 56, 48, 48, 51, 58, 49, 58, 48, 97, 58, 48, 97, 10, 10, 59, 77,111,111, - 110,119, 97,114, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98, - 121, 32, 71,101,111, 77, 97,110, 41, 10,109,111,111,110,119, 97,114, 58, - 10,109,111,111,110,119, 97,114, 97, 58, 10, 48, 58, 56, 48,102, 50, 58, - 51, 99, 58, 48, 50, 58, 52, 99, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40,108,105,103,104,116, - 98,114,105,110,103,101,114, 32, 40,106, 97,112, 97,110, 41, 41, 10, 59, - 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97,105,116, 32,117, - 110,116,105,108, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116, - 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112,108, 97,121,101,100, - 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 98, - 101,102,111,114,101, 32, 42, 42, 10, 59, 42, 42, 32,115,116, 97,114,116, - 105,110,103, 32, 97, 32,103, 97,109,101, 44, 32,102,111,114, 32,116,104, - 101, 32,115, 97,118,101, 32,116,111, 32,119,111,114,107, 32, 42, 42, 32, - 10,108,105,103,104,116, 98,114, 58, 10,108,105,103,104,116, 98,114,106, - 58, 10, 48, 58, 52, 48, 97, 51, 49, 50, 58, 55, 48, 58, 48, 48, 58, 48, - 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,108,115, 97,115,113,117, - 97,100, 46, 99, 32, 40,108, 97,110,100, 32,115,101, 97, 32, 97,105,114, - 32,115,113,117, 97,100, 32, 47, 32,114,105,107,117, 32,107, 97,105, 32, - 107,117,117, 32,115, 97,105,122,101,110,115,101,110, 41, 10,108,115, 97, - 115,113,117, 97,100, 58, 10, 48, 58, 97, 56, 49, 52, 58, 51, 58, 48, 48, - 58, 48, 49, 10, 48, 58, 97, 52, 54, 99, 58, 55, 48, 58, 54, 56, 58, 48, - 48, 10, 48, 58,100, 55, 53, 52, 58,100, 58, 50, 48, 58, 51, 48, 10, 10, - 115,116,111,114,109,105,110,103, 58, 10, 48, 58, 97, 56, 49, 52, 58, 51, - 58, 48, 48, 58, 48, 49, 10, 48, 58, 97, 52, 54, 99, 58, 55, 48, 58, 54, - 57, 58, 48, 48, 10, 48, 58,100, 55, 53, 52, 58,100, 58, 50, 48, 58, 51, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, - 50, 46, 99, 32, 40,109, 97,114,118,101,108, 32,108, 97,110,100, 32, 40, - 117,115, 41, 41, 10,109, 97,114,118,108, 97,110,100, 58, 10, 48, 58, 49, - 48, 54, 49, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 10, 48, 58, 52, - 48, 98, 54, 53, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,109, 57, 50, 46, 99, 32, 40,117,110,100,101,114, - 99,111,118,101,114, 32, 99,111,112,115, 32, 40,119,111,114,108,100, 41, - 41, 10,117, 99, 99,111,112,115, 58, 10,117, 99, 99,111,112,115,117, 58, - 10, 48, 58,101, 51,101, 57, 97, 58, 52, 57, 58, 51, 48, 58, 48, 49, 10, - 10,117, 99, 99,111,112,115,106, 58, 10,117, 99, 99,111,112,115, 97,114, - 58, 10, 48, 58,101, 51,101, 55, 99, 58, 52, 57, 58, 51, 48, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, - 40,119,105,116,115, 32, 40,106, 97,112, 97,110, 41, 41, 10,119,105,116, - 115, 58, 10, 48, 58,102,102,100, 54, 99, 50, 58, 52, 57, 58, 48, 48, 58, - 52, 98, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, - 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101,116,116,101, 58, 32,112, - 114,111, 32, 98,111,119,108,105,110,103, 41, 10, 99,112,114,111, 98,111, - 119,108, 58, 10, 48, 58, 51, 51, 58, 50, 52, 58, 53, 48, 58, 49, 51, 10, - 48, 58, 51, 54, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,116, 97,105,116,111, 95,122, 46, 99, 32, 40,115,112, - 97, 99,101, 32,103,117,110, 32, 40,119,111,114,108,100, 41, 41, 10,115, - 112, 97, 99,101,103,117,110, 58, 10,115,112, 97, 99,101,103,117,110,106, - 58, 10,115,112, 97, 99,101,103,117,110,117, 58, 10, 48, 58, 51, 49, 56, - 100, 55, 52, 58, 57, 55, 58, 48, 48, 58, 53, 56, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 54, 46, 99, 32, 40,114, - 105,111,116, 32, 99,105,116,121, 41, 10,114,105,111,116, 99,105,116,121, - 58, 10, 48, 58,102,102, 99,101, 48, 48, 58, 51,102, 58, 48, 48, 58, 52, - 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, - 49, 46, 99, 32, 40,114,101,103,117,108,117,115, 32, 40,110,101,119, 32, - 118,101,114, 41, 41, 10,114,101,103,117,108,117,115, 58, 10,114,101,103, - 117,108,117,115,111, 58, 10,114,101,103,117,108,117,115,117, 58, 10, 48, - 58, 99,101, 52, 48, 58, 49,101, 58, 52, 49, 58, 52, 97, 10, 48, 58, 99, - 48,101, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99,100, 48, 49, - 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,108,101,108, 97,110,100, 46, 99, 32, 40, 99,101,114, 98,101,114, - 117,115, 41, 10, 59, 42, 42, 32,111,110,108,121, 32,115,101,101,109,115, - 32,116,111, 32,115, 97,118,101, 32,116,111,112, 32,115, 99,111,114,101, - 32, 42, 42, 10, 99,101,114, 98,101,114,117,115, 58, 10, 48, 58,101, 56, - 51, 98, 58, 98, 97, 58, 50, 55, 58, 48, 48, 10, 48, 58,101, 48, 48, 52, - 58, 49, 58, 49, 98, 58, 49, 98, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,103, 97,108, 97,120,105, 97,110, 46, 99, 32, 40,111,109,101,103, 97, - 41, 10,111,109,101,103, 97, 58, 10, 48, 58, 52, 51, 99, 48, 58, 48,102, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119,103,112, - 46, 99, 32, 40,119,111,114,108,100, 32,103,114, 97,110,100, 32,112,114, - 105,120, 32, 40,117,115, 32, 38, 32,106,111,121,115,116,105, 99,107, 32, - 118,101,114,115,105,111,110, 32,115,101,116, 32, 49, 32,106, 97,112, 97, - 110, 41, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97, + 101, 32, 98,101,102,111,114,101, 32, 42, 42, 13, 10, 59, 42, 42, 32,115, + 116, 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 44, 32,102,111, + 114, 32,116,104,101, 32,115, 97,118,101, 32,116,111, 32,119,111,114,107, + 32, 42, 42, 13, 10,108,105,103,104,116, 98,114, 58, 13, 10,108,105,103, + 104,116, 98,114,106, 58, 13, 10, 48, 58, 52, 48, 97, 51, 49, 50, 58, 55, + 48, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,108,115, 97,115,113,117, 97,100, 46, 99, 32, 40,108, 97,110,100, + 32,115,101, 97, 32, 97,105,114, 32,115,113,117, 97,100, 32, 47, 32,114, + 105,107,117, 32,107, 97,105, 32,107,117,117, 32,115, 97,105,122,101,110, + 115,101,110, 41, 13, 10,108,115, 97,115,113,117, 97,100, 58, 13, 10, 48, + 58, 97, 56, 49, 52, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 97, + 52, 54, 99, 58, 55, 48, 58, 54, 56, 58, 48, 48, 13, 10, 48, 58,100, 55, + 53, 52, 58,100, 58, 50, 48, 58, 51, 48, 13, 10, 13, 10,115,116,111,114, + 109,105,110,103, 58, 13, 10, 48, 58, 97, 56, 49, 52, 58, 51, 58, 48, 48, + 58, 48, 49, 13, 10, 48, 58, 97, 52, 54, 99, 58, 55, 48, 58, 54, 57, 58, + 48, 48, 13, 10, 48, 58,100, 55, 53, 52, 58,100, 58, 50, 48, 58, 51, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111, + 115, 50, 46, 99, 32, 40,109, 97,114,118,101,108, 32,108, 97,110,100, 32, + 40,117,115, 41, 41, 13, 10,109, 97,114,118,108, 97,110,100, 58, 13, 10, + 48, 58, 49, 48, 54, 49, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 13, + 10, 48, 58, 52, 48, 98, 54, 53, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 57, 50, 46, 99, 32, + 40,117,110,100,101,114, 99,111,118,101,114, 32, 99,111,112,115, 32, 40, + 119,111,114,108,100, 41, 41, 13, 10,117, 99, 99,111,112,115, 58, 13, 10, + 117, 99, 99,111,112,115,117, 58, 13, 10, 48, 58,101, 51,101, 57, 97, 58, + 52, 57, 58, 51, 48, 58, 48, 49, 13, 10, 13, 10,117, 99, 99,111,112,115, + 106, 58, 13, 10,117, 99, 99,111,112,115, 97,114, 58, 13, 10, 48, 58,101, + 51,101, 55, 99, 58, 52, 57, 58, 51, 48, 58, 48, 49, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,119,105, + 116,115, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,119,105,116,115, 58, + 13, 10, 48, 58,102,102,100, 54, 99, 50, 58, 52, 57, 58, 48, 48, 58, 52, + 98, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99,111, + 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101,116,116,101, 58, 32, + 112,114,111, 32, 98,111,119,108,105,110,103, 41, 13, 10, 99,112,114,111, + 98,111,119,108, 58, 13, 10, 48, 58, 51, 51, 58, 50, 52, 58, 53, 48, 58, + 49, 51, 13, 10, 48, 58, 51, 54, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,122, + 46, 99, 32, 40,115,112, 97, 99,101, 32,103,117,110, 32, 40,119,111,114, + 108,100, 41, 41, 13, 10,115,112, 97, 99,101,103,117,110, 58, 13, 10,115, + 112, 97, 99,101,103,117,110,106, 58, 13, 10,115,112, 97, 99,101,103,117, + 110,117, 58, 13, 10, 48, 58, 51, 49, 56,100, 55, 52, 58, 57, 55, 58, 48, + 48, 58, 53, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, + 121,115,116,101,109, 49, 54, 46, 99, 32, 40,114,105,111,116, 32, 99,105, + 116,121, 41, 13, 10,114,105,111,116, 99,105,116,121, 58, 13, 10, 48, 58, + 102,102, 99,101, 48, 48, 58, 51,102, 58, 48, 48, 58, 52, 53, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 46, + 99, 32, 40,114,101,103,117,108,117,115, 32, 40,110,101,119, 32,118,101, + 114, 41, 41, 13, 10,114,101,103,117,108,117,115, 58, 13, 10,114,101,103, + 117,108,117,115,111, 58, 13, 10,114,101,103,117,108,117,115,117, 58, 13, + 10, 48, 58, 99,101, 52, 48, 58, 49,101, 58, 52, 49, 58, 52, 97, 13, 10, + 48, 58, 99, 48,101, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 99,100, 48, 49, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,108,101,108, 97,110,100, 46, 99, 32, 40, + 99,101,114, 98,101,114,117,115, 41, 13, 10, 59, 42, 42, 32,111,110,108, + 121, 32,115,101,101,109,115, 32,116,111, 32,115, 97,118,101, 32,116,111, + 112, 32,115, 99,111,114,101, 32, 42, 42, 13, 10, 99,101,114, 98,101,114, + 117,115, 58, 13, 10, 48, 58,101, 56, 51, 98, 58, 98, 97, 58, 50, 55, 58, + 48, 48, 13, 10, 48, 58,101, 48, 48, 52, 58, 49, 58, 49, 98, 58, 49, 98, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,120, + 105, 97,110, 46, 99, 32, 40,111,109,101,103, 97, 41, 13, 10,111,109,101, + 103, 97, 58, 13, 10, 48, 58, 52, 51, 99, 48, 58, 48,102, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119,103,112, 46, + 99, 32, 40,119,111,114,108,100, 32,103,114, 97,110,100, 32,112,114,105, + 120, 32, 40,117,115, 32, 38, 32,106,111,121,115,116,105, 99,107, 32,118, + 101,114,115,105,111,110, 32,115,101,116, 32, 49, 32,106, 97,112, 97,110, + 41, 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97, 105,116, 32,117,110,116,105,108,108, 32,116,104,101, 32,104,105,115, 99, 111,114,101, 32,116, 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112, 108, 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109, - 111,100,101, 32, 98,101,102,111,114,101, 32, 42, 42, 10, 59, 42, 42, 32, - 115,116, 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 44, 32,102, - 111,114, 32,116,104,101, 32,115, 97,118,101, 32,116,111, 32,119,111,114, - 107, 32, 42, 42, 32, 10, 59, 42, 42, 32, 84, 72, 73, 83, 32, 83, 65, 86, - 69, 32, 68, 79, 69, 83, 32, 78, 79, 84, 32, 83, 65, 86, 69, 32, 84, 72, - 69, 32, 67, 79, 85, 82, 83, 69, 32, 82, 69, 67, 79, 82, 68, 83, 32, 42, - 42, 10,119,103,112, 58, 10, 48, 58, 49, 48, 98, 98,100, 57, 58, 99, 53, - 58, 48, 49, 58, 48, 50, 10, 48, 58, 49, 48, 98, 99, 57, 98, 58, 49, 58, - 52, 52, 58, 52, 52, 10, 10,119,103,112,106,111,121, 58, 10, 48, 58, 49, - 48, 98, 98,100,100, 58, 99, 53, 58, 48, 49, 58, 48, 50, 10, 48, 58, 49, - 48, 98, 99, 57,102, 58, 49, 58, 52, 52, 58, 52, 52, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,100,101, 99,111, 46, 99, 32, 40,115,108,121, 32, - 115,112,121, 32, 40,117,115, 32,114,101,118,105,115,105,111,110, 32, 51, - 41, 41, 10,115,108,121,115,112,121, 58, 10,115,108,121,115,112,121, 51, - 58, 10,115,101, 99,114,101,116, 97,103, 58, 10,115,108,121,115,112,121, - 50, 58, 10, 48, 58, 51, 48, 54, 97,100, 99, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 51, 48, 52, 48, 48, 48, 58, 57,102, 58, 48, 48, 58, 51, - 51, 10, 48, 58, 51, 48, 54, 97,100,100, 58, 49, 58, 51, 48, 58, 51, 48, - 10, 10,115,101, 99,114,101,116, 97,103,106, 58, 10, 48, 58, 51, 48, 54, - 99, 49, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 52, 48, - 48, 48, 58, 57,102, 58, 48, 48, 58, 51, 51, 10, 48, 58, 51, 48, 54, 99, - 49, 55, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,116, 97,105,116,111, 95,122, 46, 99, 32, 40,100,111,117, 98, - 108,101, 32, 97,120,108,101, 32, 40,117,115, 41, 41, 10,100, 98,108, 97, - 120,108,101, 58, 10, 48, 58, 50, 48, 50, 99, 57, 49, 58, 49, 56,102, 58, - 49, 51, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97, - 105,116,111, 95,102, 51, 46, 99, 32, 40, 99,108,101,111,112, 97,116,114, - 97,115, 32,102,111,114,116,117,110,101, 32, 40,106, 97,112, 97,110, 41, - 41, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,119, 97,105, - 116, 32,117,110,116,105,108,108, 32,116,104,101, 32,104,105,115, 99,111, - 114,101, 32,116, 97, 98,108,101, 32,104, 97,115, 32,100,105,115,112,108, - 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111, - 100,101, 32, 98,101,102,111,114,101, 32, 42, 42, 10, 59, 42, 42, 32,115, - 116, 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 44, 32,102,111, - 114, 32,116,104,101, 32,115, 97,118,101, 32,116,111, 32,119,111,114,107, - 32, 42, 42, 10, 99,108,101,111,112, 97,116,114, 58, 10, 48, 58, 52, 49, - 50,100,101, 52, 58, 55, 56, 58, 48, 48, 58, 52, 97, 10, 10, 59, 42, 42, + 111,100,101, 32, 98,101,102,111,114,101, 32, 42, 42, 13, 10, 59, 42, 42, + 32,115,116, 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 44, 32, + 102,111,114, 32,116,104,101, 32,115, 97,118,101, 32,116,111, 32,119,111, + 114,107, 32, 42, 42, 13, 10, 59, 42, 42, 32, 84, 72, 73, 83, 32, 83, 65, + 86, 69, 32, 68, 79, 69, 83, 32, 78, 79, 84, 32, 83, 65, 86, 69, 32, 84, + 72, 69, 32, 67, 79, 85, 82, 83, 69, 32, 82, 69, 67, 79, 82, 68, 83, 32, + 42, 42, 13, 10,119,103,112, 58, 13, 10, 48, 58, 49, 48, 98, 98,100, 57, + 58, 99, 53, 58, 48, 49, 58, 48, 50, 13, 10, 48, 58, 49, 48, 98, 99, 57, + 98, 58, 49, 58, 52, 52, 58, 52, 52, 13, 10, 13, 10,119,103,112,106,111, + 121, 58, 13, 10, 48, 58, 49, 48, 98, 98,100,100, 58, 99, 53, 58, 48, 49, + 58, 48, 50, 13, 10, 48, 58, 49, 48, 98, 99, 57,102, 58, 49, 58, 52, 52, + 58, 52, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, + 99,111, 46, 99, 32, 40,115,108,121, 32,115,112,121, 32, 40,117,115, 32, + 114,101,118,105,115,105,111,110, 32, 51, 41, 41, 13, 10,115,108,121,115, + 112,121, 58, 13, 10,115,108,121,115,112,121, 51, 58, 13, 10,115,101, 99, + 114,101,116, 97,103, 58, 13, 10,115,108,121,115,112,121, 50, 58, 13, 10, + 48, 58, 51, 48, 54, 97,100, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 51, 48, 52, 48, 48, 48, 58, 57,102, 58, 48, 48, 58, 51, 51, 13, + 10, 48, 58, 51, 48, 54, 97,100,100, 58, 49, 58, 51, 48, 58, 51, 48, 13, + 10, 13, 10,115,101, 99,114,101,116, 97,103,106, 58, 13, 10, 48, 58, 51, + 48, 54, 99, 49, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, + 48, 52, 48, 48, 48, 58, 57,102, 58, 48, 48, 58, 51, 51, 13, 10, 48, 58, + 51, 48, 54, 99, 49, 55, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,122, 46, 99, + 32, 40,100,111,117, 98,108,101, 32, 97,120,108,101, 32, 40,117,115, 41, + 41, 13, 10,100, 98,108, 97,120,108,101, 58, 13, 10, 48, 58, 50, 48, 50, + 99, 57, 49, 58, 49, 56,102, 58, 49, 51, 58, 49, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, + 32, 40, 99,108,101,111,112, 97,116,114, 97,115, 32,102,111,114,116,117, + 110,101, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, 59, 42, 42, 32,121, + 111,117, 32,109,117,115,116, 32,119, 97,105,116, 32,117,110,116,105,108, + 108, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108, + 101, 32,104, 97,115, 32,100,105,115,112,108, 97,121,101,100, 32,105,110, + 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 98,101,102,111, + 114,101, 32, 42, 42, 13, 10, 59, 42, 42, 32,115,116, 97,114,116,105,110, + 103, 32, 97, 32,103, 97,109,101, 44, 32,102,111,114, 32,116,104,101, 32, + 115, 97,118,101, 32,116,111, 32,119,111,114,107, 32, 42, 42, 13, 10, 99, + 108,101,111,112, 97,116,114, 58, 13, 10, 48, 58, 52, 49, 50,100,101, 52, + 58, 55, 56, 58, 48, 48, 58, 52, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32, - 58,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 49, 32, 97, - 100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98, - 121, 32,108,101,101,122,101,114, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, + 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58, + 104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 57, 49, 32, 97,100, + 100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, + 32,108,101,101,122,101,114, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 42, 42, 42, 42, - 42, 42,110, 97,109, 99,111,115, 50, 46, 99, 32, 40,109,105,114, 97,105, - 32,110,105,110,106, 97, 32, 40,106, 97,112, 97,110, 41, 41, 10,109,105, - 114,110,105,110,106, 97, 58, 10, 48, 58, 49, 48, 48, 52, 48, 48, 58,100, - 48, 58, 52,100, 58, 48, 48, 10, 48, 58, 49, 48, 48, 52, 99,101, 58, 49, - 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 101,116, 97, 46, 99, 32, 40,103,117,110,100,104, 97,114, 97, 41, 10,103, - 117,110,100,104, 97,114, 97, 58, 10,103,117,110,100,104, 97,114, 97, 99, - 58, 10, 48, 58, 50, 48,102, 57, 48, 56, 58, 51, 51, 58, 48, 48, 58, 54, - 101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,109,107, 49, 54, 46, - 99, 32, 40,103,117,110,110, 97,105,108, 41, 10,103,117,110,110, 97,105, - 108, 58, 10, 48, 58,102, 97,102, 48, 48, 58, 54,101, 58, 48, 48, 58, 52, - 57, 10, 48, 58,102, 97, 56, 48, 48, 58, 55, 56, 58, 48, 48, 58, 53, 53, - 10, 48, 58,102,101, 48, 48, 52, 58,102, 57, 51, 58, 48, 48, 58, 53, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,120,105, 97, - 110, 46, 99, 32, 40,115,107,121, 32, 98, 97,115,101, 41, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,110, 97,109, 99,111,115, 50, 46, 99, 32, 40,109,105,114, 97, + 105, 32,110,105,110,106, 97, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, + 109,105,114,110,105,110,106, 97, 58, 13, 10, 48, 58, 49, 48, 48, 52, 48, + 48, 58,100, 48, 58, 52,100, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 52, + 99,101, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,103,117,110,100,104, + 97,114, 97, 41, 13, 10,103,117,110,100,104, 97,114, 97, 58, 13, 10,103, + 117,110,100,104, 97,114, 97, 99, 58, 13, 10, 48, 58, 50, 48,102, 57, 48, + 56, 58, 51, 51, 58, 48, 48, 58, 54,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,110,109,107, 49, 54, 46, 99, 32, 40,103,117,110,110, + 97,105,108, 41, 13, 10,103,117,110,110, 97,105,108, 58, 13, 10, 48, 58, + 102, 97,102, 48, 48, 58, 54,101, 58, 48, 48, 58, 52, 57, 13, 10, 48, 58, + 102, 97, 56, 48, 48, 58, 55, 56, 58, 48, 48, 58, 53, 53, 13, 10, 48, 58, + 102,101, 48, 48, 52, 58,102, 57, 51, 58, 48, 48, 58, 53, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108, 97,120,105, 97,110, + 46, 99, 32, 40,115,107,121, 32, 98, 97,115,101, 41, 13, 10, 59, 42, 42, 32,105,102, 32,121,111,117, 32, 98,101, 97,116, 32,116,104,101, 32,116, 111,112, 32,115, 99,111,114,101, 32,100,111,110, 96,116, 32,101,120,105, 116, 32,103, 97,109,101, 32,117,110,116,105,108, 32,105,116, 32,105,115, - 32,100,105,115,112,108, 97,121,105,110,103, 32,105,110, 32, 42, 42, 10, - 59, 42, 42, 32,116,104,101, 32,116,111,112, 32, 99,101,110,116,114,101, - 32,111,102, 32,116,104,101, 32,115, 99,114,101,101,110, 32, 42, 42, 10, - 115,107,121, 98, 97,115,101, 58, 10, 48, 58, 56, 48, 51, 97, 58, 51, 54, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 48, 48, 58, 49, 58, 49, 52, - 58, 49, 52, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 57, 49,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 48, - 49, 58, 49, 58, 48, 53, 58, 48, 53, 10, 48, 58, 57, 50, 50, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 50, 52, 49, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100, 99,111,110, - 46, 99, 32, 40,115,100, 32,103,117,110,100, 97,109, 32,112,115,121, 99, - 104,111, 32,115, 97,108, 97,109, 97,110,100,101,114, 32,110,111, 32,107, - 121,111,117,105, 41, 10, 59, 42, 42, 32,102,111,114, 32,115,111,109,101, - 32,114,101, 97,115,111,110, 32,121,111,117, 32,104, 97,118,101, 32,116, - 111, 32,112,114,101,115,115, 32,107,101,121, 32, 57, 32,116,111, 32,105, - 110,115,101,114,116, 32, 99,114,101,100,105,116,115, 32, 42, 42, 10, 59, - 42, 42, 32,103, 97,109,101, 32, 40,100,114,105,118,101,114, 32, 63, 63, - 41, 32,114,101,108, 97,116,101,100, 32,112,114,111, 98,108,101,109, 32, - 45, 32,110,111,116, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32, - 42, 42, 10,115,100,103,110,100,109,112,115, 58, 10, 48, 58, 56, 98, 54, - 48, 48, 58, 57, 99, 58, 48, 48, 58, 49, 97, 10, 10, 59, 42, 42, 42, 42, + 32,100,105,115,112,108, 97,121,105,110,103, 32,105,110, 32, 42, 42, 13, + 10, 59, 42, 42, 32,116,104,101, 32,116,111,112, 32, 99,101,110,116,114, + 101, 32,111,102, 32,116,104,101, 32,115, 99,114,101,101,110, 32, 42, 42, + 13, 10,115,107,121, 98, 97,115,101, 58, 13, 10, 48, 58, 56, 48, 51, 97, + 58, 51, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 48, 48, 58, + 49, 58, 49, 52, 58, 49, 52, 13, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, 48, 53, 58, 48, 53, 13, + 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 57, 50, 52, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,100, 99,111,110, 46, 99, 32, 40,115,100, + 32,103,117,110,100, 97,109, 32,112,115,121, 99,104,111, 32,115, 97,108, + 97,109, 97,110,100,101,114, 32,110,111, 32,107,121,111,117,105, 41, 13, + 10, 59, 42, 42, 32,102,111,114, 32,115,111,109,101, 32,114,101, 97,115, + 111,110, 32,121,111,117, 32,104, 97,118,101, 32,116,111, 32,112,114,101, + 115,115, 32,107,101,121, 32, 57, 32,116,111, 32,105,110,115,101,114,116, + 32, 99,114,101,100,105,116,115, 32, 42, 42, 13, 10, 59, 42, 42, 32,103, + 97,109,101, 32, 40,100,114,105,118,101,114, 32, 63, 63, 41, 32,114,101, + 108, 97,116,101,100, 32,112,114,111, 98,108,101,109, 32, 45, 32,110,111, + 116, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32, 42, 42, 13, 10, + 115,100,103,110,100,109,112,115, 58, 13, 10, 48, 58, 56, 98, 54, 48, 48, + 58, 57, 99, 58, 48, 48, 58, 49, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,112,112,101,114, 46, 99, 32, 40,112,111,112,112, - 101,114, 41, 10, 59, 42, 42, 32,100,111, 32,110,111,116, 32,114,101,115, - 101,116, 32,116,104,105,115, 32,103, 97,109,101, 32, 45, 32,105,116, 32, - 115, 99,114,101,119,115, 32,117,112, 32,116,104,101, 32,104,105,115, 99, - 111,114,101, 32, 38, 32,104,105,115, 99,111,114,101, 32,115, 97,118,105, - 110,103, 32, 42, 42, 10,112,111,112,112,101,114, 58, 10, 48, 58, 99, 55, - 48, 48, 58, 51, 99, 58, 52,102, 58, 48, 48, 10, 48, 58,100, 98, 50, 98, - 58, 51, 58, 48, 48, 58, 48, 49, 10, 48, 58, 99, 49,101,100, 58, 54, 58, - 48, 48, 58, 50, 48, 10, 48, 58, 99, 56, 99, 97, 58, 49, 58, 49, 57, 58, - 49, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 97,114,106,109, - 98,114,101, 46, 99, 32, 40, 99, 97,114, 32,106, 97,109, 98,111,114,101, - 101, 41, 10, 99, 97,114,106,109, 98,114,101, 58, 10, 48, 58, 56, 50, 48, - 97, 58, 97, 48, 58, 48, 48, 58, 52, 53, 10, 48, 58, 56, 50, 49, 55, 58, - 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, - 115,118, 46, 99, 32, 40,109,111,110,115,116,101,114, 32,115,108,105,100, - 101,114, 32, 40,106, 97,112, 97,110, 41, 41, 10,109,115,108,105,100,101, - 114, 58, 10, 48, 58, 50, 97, 99, 99, 58, 97, 56, 58, 48, 48, 58, 48, 50, - 10, 48, 58, 99, 48, 58, 49, 58, 49, 53, 58, 49, 53, 10, 10, 59, 42, 42, + 101,114, 41, 13, 10, 59, 42, 42, 32,100,111, 32,110,111,116, 32,114,101, + 115,101,116, 32,116,104,105,115, 32,103, 97,109,101, 32, 45, 32,105,116, + 32,115, 99,114,101,119,115, 32,117,112, 32,116,104,101, 32,104,105,115, + 99,111,114,101, 32, 38, 32,104,105,115, 99,111,114,101, 32,115, 97,118, + 105,110,103, 32, 42, 42, 13, 10,112,111,112,112,101,114, 58, 13, 10, 48, + 58, 99, 55, 48, 48, 58, 51, 99, 58, 52,102, 58, 48, 48, 13, 10, 48, 58, + 100, 98, 50, 98, 58, 51, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 99, 49, + 101,100, 58, 54, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, 56, 99, 97, + 58, 49, 58, 49, 57, 58, 49, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 99, 97,114,106,109, 98,114,101, 46, 99, 32, 40, 99, 97,114, + 32,106, 97,109, 98,111,114,101,101, 41, 13, 10, 99, 97,114,106,109, 98, + 114,101, 58, 13, 10, 48, 58, 56, 50, 48, 97, 58, 97, 48, 58, 48, 48, 58, + 52, 53, 13, 10, 48, 58, 56, 50, 49, 55, 58, 49, 58, 51, 48, 58, 51, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,115,118, 46, 99, 32, + 40,109,111,110,115,116,101,114, 32,115,108,105,100,101,114, 32, 40,106, + 97,112, 97,110, 41, 41, 13, 10,109,115,108,105,100,101,114, 58, 13, 10, + 48, 58, 50, 97, 99, 99, 58, 97, 56, 58, 48, 48, 58, 48, 50, 13, 10, 48, + 58, 99, 48, 58, 49, 58, 49, 53, 58, 49, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,111,115, 97,105, 99, 46, 99, 32, 40,109,111,115, - 97,105, 99, 41, 10,109,111,115, 97,105, 99, 58, 10, 48, 58, 50, 48, 49, - 101, 55, 58, 53, 48, 58, 53, 52, 58, 48, 48, 10, 48, 58, 50, 48, 50, 51, - 53, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 99, 97,118,101, 46, 99, 32, 40, 97,105,114, 32,103, 97,108,108, - 101,116, 32, 40,116, 97,105,119, 97,110, 41, 41, 10, 97,103, 97,108,108, - 101,116, 58, 10, 97,103, 97,108,108,101,116,104, 58, 10, 97,103, 97,108, - 108,101,116,106, 58, 10, 97,103, 97,108,108,101,116,107, 58, 10, 97,103, - 97,108,108,101,116,116, 58, 10, 97,103, 97,108,108,101,116,117, 58, 10, - 48, 58, 49, 48, 48, 50, 57, 50, 58, 53, 97, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 49, 48, 48, 50, 48, 48, 58, 50, 58, 48, 50, 58, 49, 97, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,115,107,121,107,105,100, 46, 99, 32, - 40,100,114, 97,103,111,110, 32, 98,117,115,116,101,114, 41, 10,100,114, - 103,110, 98,115,116,114, 58, 10, 48, 58, 52, 56, 53, 97, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 52, 56, 53, 98, 58, 49, 58, 49, 48, 58, 49, - 48, 10, 48, 58, 52, 48, 54, 99, 58, 55, 58, 50,102, 58, 48, 48, 10, 48, - 58, 52, 48, 54,101, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,115,104, 97,110,103,104, 97, 51, 46, 99, 32, 40, - 98,108,111, 99,107,101,110, 32, 40,106, 97,112, 97,110, 41, 41, 10, 98, - 108,111, 99,107,101,110, 58, 10, 48, 58, 51, 48, 56, 54,101, 99, 58, 52, - 102, 58, 48, 48, 58, 53, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 122, 56, 48, 98,119, 46, 99, 32, 40, 97,115,116,114,111, 32,105,110,118, - 97,100,101,114, 41, 10, 59, 42, 42, 32,103,111,100, 44, 32,116,104,101, - 32,116,104,105,110,103,115, 32,105, 32,100,111, 32,116,111, 32,103,105, - 118,101, 32,121, 96, 97,108,108, 32,116,104,101,115,101, 32,104,105,115, - 99,111,114,101, 32,115, 97,118,101,115, 32, 33, 33, 32, 42, 42, 10, 59, - 42, 42, 32,105,115, 32,116,104,105,115, 32,116,104,101, 32,108,111,110, - 103,101,115,116, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 97, 32, - 121,101,116, 32, 63, 32, 42, 42, 10, 97,115,116,105,110,118, 97,100, 58, - 10, 48, 58, 49,102, 99, 97, 58, 49, 52, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 50,102, 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 50,102, - 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 50,102, 53,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 50,102, 55,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 50,102, 57,100, 58, 49, 58, 51,101, 58, 51, - 101, 10, 48, 58, 51, 48, 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, - 58, 51, 48, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 48, - 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 48, 55,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 48, 57,100, 58, 49, 58, 51, - 101, 58, 51,101, 10, 48, 58, 51, 49, 49,100, 58, 49, 58, 51,101, 58, 51, - 101, 10, 48, 58, 51, 49, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 51, 49, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 49, - 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 49, 57,100, 58, - 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 50, 49,100, 58, 49, 58, 51, - 101, 58, 51,101, 10, 48, 58, 51, 50, 51,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 51, 50, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 51, 50, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 50, - 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 51, 49,100, 58, - 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 51, 51,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 51, 51, 53,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 51, 51, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 51, 51, 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 10,107,111,115, - 109,111,107,105,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 75,111,115, - 109,111, 32, 75,105,108,108,101,114, 10, 48, 58, 49,102, 99, 52, 58, 49, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, 49,100, 58, 49, 58, 51, - 101, 58, 51,101, 10, 48, 58, 50,102, 51,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 50,102, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 50,102, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 50,102, - 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 48, 49,100, 58, - 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 48, 51,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 51, 48, 53,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 51, 48, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 51, 48, 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 49, - 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 49, 51,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 49, 53,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 51, 49, 55,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 51, 49, 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, - 58, 51, 50, 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 50, - 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 50, 53,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 50, 55,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 51, 50, 57,100, 58, 49, 58, 51,101, 58, 51, - 101, 10, 48, 58, 51, 51, 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, - 58, 51, 51, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 51, - 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 51, 55,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 51, 57,100, 58, 49, 58, 51, - 101, 58, 51,101, 10, 10,107, 97,109,105,107, 97,122,101, 58, 10, 48, 58, - 49,102, 99, 53, 58, 49, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50,102, - 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 50,102, 51,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 50,102, 53,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 50,102, 55,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 50,102, 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, - 58, 51, 48, 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 48, - 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 48, 53,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 48, 55,100, 58, 49, 58, 52, - 49, 58, 52, 49, 10, 48, 58, 51, 48, 57,100, 58, 49, 58, 51,101, 58, 51, - 101, 10, 48, 58, 51, 49, 49,100, 58, 49, 58, 51,101, 58, 51,101, 10, 48, - 58, 51, 49, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 49, - 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 49, 55,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 49, 57,100, 58, 49, 58, 51, - 101, 58, 51,101, 10, 48, 58, 51, 50, 49,100, 58, 49, 58, 51,101, 58, 51, - 101, 10, 48, 58, 51, 50, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 51, 50, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 50, - 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 50, 57,100, 58, - 49, 58, 51,101, 58, 51,101, 10, 48, 58, 51, 51, 49,100, 58, 49, 58, 51, - 101, 58, 51,101, 10, 48, 58, 51, 51, 51,100, 58, 49, 58, 52, 49, 58, 52, - 49, 10, 48, 58, 51, 51, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, - 58, 51, 51, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 10, 48, 58, 51, 51, - 57,100, 58, 49, 58, 51,101, 58, 51,101, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, 99, 32, 40,100,105,110, - 111, 32,114,101,120, 32, 40,119,111,114,108,100, 32, 38, 32,117,115, 41, - 41, 10,100,105,110,111,114,101,120, 58, 10,100,105,110,111,114,101,120, - 106, 58, 10,100,105,110,111,114,101,120,117, 58, 10, 48, 58, 54, 48, 50, - 55, 54, 48, 58, 57, 48, 58, 48, 48, 58, 52,102, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,109,101,103, 97,115,121,115, 49, 46, 99, 32, 40, 99, - 121, 98, 97,116,116,108,101,114, 41, 10, 99,121, 98, 97,116,116,108,114, - 58, 10, 48, 58, 49,102, 48, 49, 48, 49, 58,101,100, 58, 48, 50, 58, 50, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,107, 97,114,110,111,118, - 46, 99, 32, 40, 99,104,101,108,110,111,118, 32, 45, 32, 97,116,111,109, - 105, 99, 32,114,117,110,110,101,114, 32, 40,117,115, 41, 41, 10, 99,104, - 101,108,110,111,118,117, 58, 10, 48, 58, 48, 54, 48, 48, 52, 56, 58, 48, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 54, 48, 48, 56, 48, 58, 50, - 67, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 54, 48, 48, 67, 48, 58, 50, - 67, 58, 52, 49, 58, 48, 48, 10, 10, 99,104,101,108,110,111,118, 58, 10, - 99,104,101,108,110,111,118,106, 58, 10, 99,104,101,108,110,111,118,106, - 98,108, 58, 10, 99,104,101,108,110,111,118,106, 98,108, 97, 58, 10, 48, - 58, 48, 54, 48, 48, 52, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 48, 54, 48, 48, 56, 48, 58, 50, 67, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 48, 54, 48, 48, 67, 48, 58, 50, 67, 58, 52, 49, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110,109,107, 49, 54, 46, 99, 32, - 40, 97, 99,114,111, 98, 97,116, 32,109,105,115,115,105,111,110, 41, 10, - 97, 99,114,111, 98, 97,116,109, 58, 10, 48, 58, 56, 48, 48,101, 97, 58, - 56,100, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 48,100, 97, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 48, 50, 49, 58, 49, 58, 52, - 56, 58, 52, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110,101, - 111,103,101,111, 46, 99, 32, 40,110,105,103,104,116,109, 97,114,101, 32, - 105,110, 32,116,104,101, 32,100, 97,114,107, 41, 10,110,105,116,100, 58, - 10,110,105,116,100, 98,108, 58, 10, 48, 58, 49, 48, 53,100, 97, 52, 58, - 51,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 53,100,100,100, 58, - 49, 58, 52, 49, 58, 52, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 115,110,107, 46, 99, 32, 40, 97,116,104,101,110, 97, 41, 32, 40,102,105, - 120, 41, 10, 59, 42, 42, 32,102,105,120,101,100, 44, 32, 98,117,116, 32, - 100,101,108,101,116,101, 32, 97,110,121, 32, 97,116,104,101,110, 97, 46, - 104,105, 32,102,105,108,101, 32, 98,101,102,111,114,101, 32,112,108, 97, - 121,105,110,103, 32,102,105,114,115,116, 32,116,105,109,101, 32, 42, 42, - 10, 97,116,104,101,110, 97, 58, 10, 48, 58,102,101, 53, 50, 58, 54,102, - 58, 52, 49, 58, 51, 48, 10, 48, 58,100, 55,102, 53, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116, - 111, 95,102, 51, 46, 99, 32, 40,112,117,122,122,108,101, 32, 98,111, 98, - 98,108,101, 32, 50,120, 32, 40,106, 97,112, 97,110, 41, 41, 10,112, 98, - 111, 98, 98,108,101, 50,120, 58, 10, 48, 58, 52, 48,100, 98, 55, 56, 58, - 49, 48, 52, 58, 48, 48, 58, 51,101, 10, 48, 58, 52, 48,100, 98,100, 56, - 58, 49, 58, 52, 49, 58, 52, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,110, 97,109, 99,111,115, 50, 46, 99, 32, 40,112,104,101,108,105,111, - 115, 32, 40,106, 97,112, 97,110, 41, 41, 10,112,104,101,108,105,111,115, - 58, 10,112,104,101,108,105,111,115,106, 58, 10, 48, 58, 49, 48, 48, 48, - 49, 50, 58, 52, 52, 58, 48, 48, 58, 52, 53, 10, 48, 58, 52, 48, 99, 52, - 55, 56, 58, 52, 58, 48, 48, 58, 53, 48, 10, 48, 58, 49, 48, 57, 51, 55, - 51, 58, 49, 49, 58, 48, 50, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,115,101,105, 99,114,111,115,115, 46, 99, 32, 40,115,101,105, - 99,114,111,115,115, 41, 10,115,101,105, 99,114,111,115,115, 58, 10,115, - 101, 99,116,114,122,111,110, 58, 10, 48, 58, 55, 97,100, 52, 58, 49,101, - 58, 48, 48, 58, 48, 97, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, - 101,116,114,111, 46, 99, 32, 40, 98,108, 97,122,105,110,103, 32,116,111, - 114,110, 97,100,111, 41, 10, 98,108,122,110,116,114,110,100, 58, 10, 48, - 58,102,102, 57, 51, 51, 56, 58, 53, 48, 58, 48, 50, 58, 48, 48, 10, 48, - 58,102,102, 57, 51, 56, 53, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,110,101,109,101,115,105,115, 46, 99, 32, - 40, 98,108, 97, 99,107, 32,112, 97,110,116,104,101,114, 41, 10, 98,108, - 107,112,110,116,104,114, 58, 10, 48, 58, 57, 48, 52, 48, 48, 58, 57, 57, - 58, 48, 48, 58, 53, 57, 10, 48, 58, 57, 48, 51, 48, 48, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119,101, 99, - 108,101,109, 97,110, 46, 99, 32, 40,119,101, 99, 32,108,101, 32,109, 97, - 110,115, 32, 50, 52, 41, 10, 59, 42, 42, 32,111,110,108,121, 32,115, 97, - 118,101,115, 32,116,111,112, 32, 49, 48, 32,115, 99,111,114,101,115, 32, - 40,111,110,101,115, 32,121,111,117, 32,112,117,116, 32,121,111,117,114, - 32,110, 97,109,101, 32,116,111, 41, 32, 42, 42, 10,119,101, 99,108,101, - 109, 97,110, 58, 10,119,101, 99,108,101,109, 97,110, 50, 58, 10,119,101, - 99,108,101,109, 97,110, 97, 58, 10,119,101, 99,108,101,109, 97,110, 98, - 58, 10, 48, 58, 52, 49, 49, 49, 48, 58, 54, 52, 58, 48, 48, 58, 50, 48, - 10, 48, 58, 52, 48, 48, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111,108,108,101,114,103, 46, 99, - 32, 40,114,111,108,108,101,114,103, 97,109,101,115, 32, 40,117,115, 41, - 41, 10, 59, 42, 42, 32,117,110,116,101,115,116,101,100, 32, 45, 32,110, - 111, 32,103,111,111,100, 32, 97,116, 32,116,104,105,115, 32,103, 97,109, - 101, 32, 33, 33, 32, 42, 42, 10,114,111,108,108,101,114,103, 58, 10,114, - 111,108,108,101,114,103,106, 58, 10, 48, 58, 50, 97, 56, 48, 58, 50, 56, - 58, 48, 56, 58, 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102, - 108,107, 97,116, 99,107, 46, 99, 32, 40,107, 97, 41, 10,109,120, 53, 48, - 48, 48, 58, 10, 48, 58, 51, 97, 48, 48, 58, 53, 48, 58, 48, 48, 58, 49, - 52, 10, 48, 58, 51, 57, 53,101, 58, 51, 58, 48, 48, 58, 57, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,102,108,107, 97,116, 99,107, 46, 99, - 10,102,108,107, 97,116, 99,107, 58, 10,102,108,107, 97,116, 99,107, 97, - 58, 10, 48, 58, 51, 97, 48, 48, 58, 53, 48, 58, 48, 48, 58, 49, 52, 10, - 48, 58, 51, 57, 53,101, 58, 51, 58, 48, 48, 58, 57, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,109,111, 98, - 105,108,101, 32,115,117,105,116, 32,103,117,110,100, 97,109, 41, 10,109, - 115,103,117,110,100, 97,109, 58, 10,109,115,103,117,110,100, 97,109, 49, - 58, 10, 48, 58, 50, 48, 52, 50, 56, 55, 58, 54, 51, 58, 48, 49, 58, 49, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,111,111, 98,105,110, - 46, 99, 32, 40,116,111,111, 98,105,110, 96, 32, 40,118,101,114,115,105, - 111,110, 32, 51, 41, 41, 10,116,111,111, 98,105,110, 58, 10, 48, 58,102, - 102,102,102, 52, 48, 58, 51, 50, 58, 48, 49, 58,101,102, 10, 10,109,115, - 104,118,115,102, 58, 10,109,115,104,118,115,102, 97, 49, 58, 10,109,115, - 104,118,115,102, 98, 49, 58, 10,109,115,104,118,115,102, 98, 58, 10,109, - 115,104,118,115,102,104, 58, 10,109,115,104,118,115,102,106, 50, 58, 10, - 109,115,104,118,115,102,106, 49, 58, 10,109,115,104,118,115,102,106, 58, - 10,109,115,104,118,115,102,117, 49, 58, 10,109,115,104,118,115,102,117, - 58, 10,109,115,104,118,115,102, 97, 58, 10,109,115,104,118,115,102,117, - 49,100, 58, 10, 48, 58,102,102, 50, 98, 48, 99, 58, 54, 51, 58, 48, 48, - 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116, - 111, 95, 98, 46, 99, 32, 40, 97,115,104,117,114, 97, 32, 98,108, 97,115, - 116,101,114, 32, 40,117,115, 41, 41, 10, 97,115,104,117,114, 97,117, 58, - 10, 48, 58, 54, 48, 49, 57,102, 57, 58, 54, 51, 58, 48, 48, 58, 49, 57, - 10, 48, 58, 54, 48, 49, 50, 97, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,108, - 46, 99, 32, 40, 99,104, 97,109,112,105,111,110, 32,119,114,101,115,116, - 108,101,114, 32, 40,119,111,114,108,100, 41, 41, 10, 99,104, 97,109,112, - 119,114, 58, 10, 48, 58, 56, 57, 98, 55, 58, 50, 56, 58, 48, 48, 58, 52, - 101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 98,108, 97,100,101, - 115,116,108, 46, 99, 32, 40, 98,108, 97,100,101,115, 32,111,102, 32,115, - 116,101,101,108, 32, 40,118,101,114,115,105,111,110, 32,116, 41, 41, 10, - 98,108, 97,100,101,115,116,108, 58, 10, 98,108, 97,100,101,115,116,108, - 101, 58, 10, 98,108, 97,100,101,115,116,108,108, 58, 10, 48, 58, 52, 49, - 55, 48, 58, 56, 50, 58, 50, 51, 58, 49, 53, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 54, 46, 99, 32, 40, 97, - 116,111,109,105, 99, 32,112,111,105,110,116, 41, 10, 97,116,111,109,105, - 99,112, 58, 10, 48, 58,102,102,100, 57, 48,102, 58, 50, 55, 58, 48, 49, - 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109,101,103, - 97,115,121,115, 49, 46, 99, 32, 40,116,104,101, 32, 97,115,116,121, 97, - 110, 97,120, 41, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, - 32,117,112,100, 97,116,101,115, 32,119,104,101,110, 32,102,105,114,115, - 116, 32,103, 97,109,101, 32,115,116, 97,114,116,115, 32, 42, 42, 10, 97, - 115,116,121, 97,110, 97,120, 58, 10, 48, 58,102, 56, 57, 48, 57, 58, 57, - 55, 58, 48, 48, 58, 52,101, 10, 48, 58,102, 56, 56, 53,100, 58,102, 58, - 48, 48, 58, 48, 48, 10, 48, 58,102, 56, 56, 54, 51, 58, 49, 58, 48, 50, - 58, 48, 50, 10, 10,108,111,114,100,111,102,107, 58, 10, 48, 58,102, 56, - 57, 50, 49, 58, 57, 55, 58, 48, 48, 58, 52,101, 10, 48, 58,102, 56, 56, - 55, 53, 58,102, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 56, 56, 55, 98, - 58, 49, 58, 48, 50, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 42,109,114,102,108,101, 97, 46, 99, 32, 40,116,104,101, 32, 97,109, - 97,122,105,110,103, 32, 97,100,118,101,110,116,117,114,101,115, 32,111, - 102, 32,109,114, 46, 32,102, 46, 32,108,101, 97, 41, 10, 59, 42, 42, 32, - 116,104,105,115, 32,103, 97,109,101, 32,100,111,101,115, 32,110,111,116, - 32,100,105,115,112,108, 97,121, 32,116,104,101, 32,116,111,112, 32,115, - 99,111,114,101, 32,105,110, 32,116,104,101, 32,116,111,112, 32, 99,101, - 110,116,114,101, 32,111,102, 32,116,104,101, 32,115, 99,114,101,101,110, - 32, 42, 42, 10, 59, 42, 42, 32,117,110,116,105,108,108, 32,116,104,101, - 32,103, 97,109,101, 32,104, 97,115, 32,114, 97,110, 32,102,111,114, 32, - 97, 32,119,104,105,108,101, 32,119,105,116,104,111,117,116, 32,105,110, - 115,101,114,116,105,110,103, 32, 97,110,121, 32, 99,114,101,100,105,116, - 115, 32, 98,117,116, 32,116,104,105,115, 32, 42, 42, 10, 59, 42, 42, 32, - 100,111,101,115, 32,110,111,116, 32,109, 97,116,116,101,114, 32, 97,115, - 32,108,111,110,103, 32, 97,115, 32,116,104,101, 32,100,101,102, 97,117, - 108,116, 32, 53, 44, 48, 48, 48, 32,104,105,103,104, 32,115, 99,111,114, - 101, 32,104, 97,115, 32, 98,101,101,110, 32, 98,101, 97,116,101,110, 32, - 111,110, 32,121,111,117,114, 42, 42, 10, 59, 42, 42, 32,102,105,114,115, - 116, 32,103, 97,109,101, 46, 46, 46, 46, 46, 46, 46, 10, 59, 42, 42, 32, - 119,104,105, 99,104, 32,105,115,110, 96,116, 32,104, 97,114,100, 44, 32, - 111,114, 32,121,111,117, 32, 99, 97,110, 32,106,117,115,116, 32,108,101, - 116, 32,116,104,101, 32,103, 97,109,101, 32,114,117,110, 32,116,104,114, - 111,117,103,104, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, - 102,111,114, 32, 97, 32, 42, 42, 10, 59, 42, 42, 32, 99,111,117,112,108, - 101, 32,111,102, 32,109,105,110,117,116,101,115, 32,117,110,116,105,108, - 32,116,104,101, 32, 53, 44, 48, 48, 48, 32,116,111,112, 32,115, 99,111, - 114,101, 32,105,115, 32,111,110, 32,115, 99,114,101,101,110, 46, 32,105, - 116, 96,115, 32,117,112, 32,116,111, 32,121,111,117, 32, 33, 33, 33, 32, - 42, 42, 10,109,114,102,108,101, 97, 58, 10, 48, 58, 99, 97,102,100, 58, - 57, 57, 58, 51, 48, 58, 50, 48, 10, 48, 58, 99, 54,102, 56, 58, 54, 58, - 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,115, - 121,115,116,101,109, 49, 46, 99, 32, 40, 98,117,108,108,102,105,103,104, - 116, 41, 10, 98,117,108,108,102,103,116, 58, 10,116,104,101,116,111,103, - 121,117, 58, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 52, - 57, 10, 48, 58, 99, 48, 49, 52, 58, 51, 58, 48, 48, 58, 48, 50, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109, 54, 50, 46, 99, 32, 40,115, - 112,101,108,117,110,107,101,114, 41, 10,115,112,101,108,117,110,107,114, - 58, 10,115,112,101,108,117,110,107,114,106, 58, 10, 48, 58,101, 48, 53, - 50, 58, 54, 52, 58, 51, 57, 58, 51,102, 10, 48, 58,101, 48, 51, 98, 58, - 50, 58, 51, 57, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 98,117,103,103,121, 99,104,108, 46, 99, 32, 40, 98,117,103,103,121, - 32, 99,104, 97,108,108,101,110,103,101, 41, 10, 98,117,103,103,121, 99, - 104,108, 58, 10, 98,117,103,103,121, 99,104,108,116, 58, 10, 48, 58, 56, - 56, 49, 52, 58, 52,101, 99, 58, 48, 52, 58, 48, 48, 10, 48, 58, 56, 48, - 101, 49, 58, 49, 58, 48, 52, 58, 48, 52, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 42,116, 97,105,116,111, 95,122, 46, 99, 32, 40, 98, 97,116, - 116,108,101, 32,115,104, 97,114,107, 32, 40,117,115, 41, 41, 10, 98,115, - 104, 97,114,107, 58, 10, 98,115,104, 97,114,107,106, 58, 10, 98,115,104, - 97,114,107,117, 58, 10, 48, 58, 49, 48,101, 57, 98, 54, 58, 51, 49, 58, - 48, 48, 58, 52, 57, 10, 48, 58, 49, 48,102, 48, 99, 54, 58, 52, 58, 48, - 48, 58, 56, 52, 10, 10, 98,115,104, 97,114,107,106,106,115, 58, 10, 48, - 58, 49, 48,101, 57, 97,101, 58, 51, 49, 58, 48, 48, 58, 52, 57, 10, 48, - 58, 49, 48,102, 48, 99, 54, 58, 52, 58, 48, 48, 58, 56, 52, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,116,116,108,101,114, 97, 46, - 99, 32, 40, 98, 97,116,116,108,101, 32,114, 97,110,103,101,114,115, 32, - 40,119,111,114,108,100, 41, 41, 10, 98, 97,116,116,108,101,114, 97, 58, - 10, 98,108,100,119,111,108,102, 58, 10, 98,108,100,119,111,108,102,106, - 58, 10, 48, 58, 49,102, 48, 50, 50, 48, 58, 56, 97, 58, 52, 49, 58, 48, - 48, 10, 48, 58, 49,102, 48, 48, 48,101, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 49,102, 48, 48, 48,102, 58, 49, 58, 49, 48, 58, 49, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, - 99, 32, 40,109,111,110,101,121, 32,112,117,122,122,108,101, 32,101,120, - 99,104, 97,110,103,101,114, 32, 47, 32,109,111,110,101,121, 32,105,100, - 111,108, 32,101,120, 99,104, 97,110,103,101,114, 41, 10,109,105,101,120, - 99,104,110,103, 58, 10, 48, 58, 49, 48, 48, 48, 48, 50, 58, 57,101, 58, - 48, 48, 58, 48,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,115, - 101,116, 97, 46, 99, 32, 40,100,114, 97,103,111,110, 32,117,110,105,116, - 32, 47, 32, 99, 97,115,116,108,101, 32,111,102, 32,100,114, 97,103,111, - 110, 41, 10,100,114,103,110,117,110,105,116, 58, 10, 48, 58,102,102,100, - 53, 48,101, 58, 53, 48, 58, 48, 48, 58, 50,101, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 99,108,111, 97,107, 46, 99, 32, 40, 99,108,111, - 97,107, 32, 38, 32,100, 97,103,103,101,114, 41, 10, 99,108,111, 97,107, - 58, 10, 99,108,111, 97,107,102,114, 58, 10, 99,108,111, 97,107,103,114, - 58, 10, 99,108,111, 97,107,115,112, 58, 10, 48, 58,102, 51, 53, 58, 97, - 48, 58, 49, 49, 58, 53, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 97,105, 99, 41, 13, 10,109,111,115, 97,105, 99, 58, 13, 10, 48, 58, 50, + 48, 49,101, 55, 58, 53, 48, 58, 53, 52, 58, 48, 48, 13, 10, 48, 58, 50, + 48, 50, 51, 53, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, 99, 32, 40, 97,105,114, + 32,103, 97,108,108,101,116, 32, 40,116, 97,105,119, 97,110, 41, 41, 13, + 10, 97,103, 97,108,108,101,116, 58, 13, 10, 97,103, 97,108,108,101,116, + 104, 58, 13, 10, 97,103, 97,108,108,101,116,106, 58, 13, 10, 97,103, 97, + 108,108,101,116,107, 58, 13, 10, 97,103, 97,108,108,101,116,116, 58, 13, + 10, 97,103, 97,108,108,101,116,117, 58, 13, 10, 48, 58, 49, 48, 48, 50, + 57, 50, 58, 53, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, + 50, 48, 48, 58, 50, 58, 48, 50, 58, 49, 97, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,115,107,121,107,105,100, 46, 99, 32, 40,100,114, + 97,103,111,110, 32, 98,117,115,116,101,114, 41, 13, 10,100,114,103,110, + 98,115,116,114, 58, 13, 10, 48, 58, 52, 56, 53, 97, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 52, 56, 53, 98, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 48, 58, 52, 48, 54, 99, 58, 55, 58, 50,102, 58, 48, 48, 13, + 10, 48, 58, 52, 48, 54,101, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97,110,103,104, 97, 51, + 46, 99, 32, 40, 98,108,111, 99,107,101,110, 32, 40,106, 97,112, 97,110, + 41, 41, 13, 10, 98,108,111, 99,107,101,110, 58, 13, 10, 48, 58, 51, 48, + 56, 54,101, 99, 58, 52,102, 58, 48, 48, 58, 53, 55, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,122, 56, 48, 98,119, 46, 99, 32, 40, 97, + 115,116,114,111, 32,105,110,118, 97,100,101,114, 41, 13, 10, 59, 42, 42, + 32,103,111,100, 44, 32,116,104,101, 32,116,104,105,110,103,115, 32,105, + 32,100,111, 32,116,111, 32,103,105,118,101, 32,121, 96, 97,108,108, 32, + 116,104,101,115,101, 32,104,105,115, 99,111,114,101, 32,115, 97,118,101, + 115, 32, 33, 33, 32, 42, 42, 13, 10, 59, 42, 42, 32,105,115, 32,116,104, + 105,115, 32,116,104,101, 32,108,111,110,103,101,115,116, 32,104,105,115, + 99,111,114,101, 46,100, 97,116, 97, 32,121,101,116, 32, 63, 32, 42, 42, + 13, 10, 97,115,116,105,110,118, 97,100, 58, 13, 10, 48, 58, 49,102, 99, + 97, 58, 49, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 49,100, + 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 50,102, 51,100, 58, 49, + 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 50,102, 53,100, 58, 49, 58, 52, + 49, 58, 52, 49, 13, 10, 48, 58, 50,102, 55,100, 58, 49, 58, 52, 49, 58, + 52, 49, 13, 10, 48, 58, 50,102, 57,100, 58, 49, 58, 51,101, 58, 51,101, + 13, 10, 48, 58, 51, 48, 49,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, + 48, 58, 51, 48, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, + 51, 48, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 48, + 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 48, 57,100, + 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 49, 49,100, 58, 49, + 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 49, 51,100, 58, 49, 58, 52, + 49, 58, 52, 49, 13, 10, 48, 58, 51, 49, 53,100, 58, 49, 58, 52, 49, 58, + 52, 49, 13, 10, 48, 58, 51, 49, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, + 13, 10, 48, 58, 51, 49, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, + 48, 58, 51, 50, 49,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, + 51, 50, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, + 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 55,100, + 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 57,100, 58, 49, + 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 51, 49,100, 58, 49, 58, 51, + 101, 58, 51,101, 13, 10, 48, 58, 51, 51, 51,100, 58, 49, 58, 52, 49, 58, + 52, 49, 13, 10, 48, 58, 51, 51, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, + 13, 10, 48, 58, 51, 51, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, + 48, 58, 51, 51, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 13, 10, + 107,111,115,109,111,107,105,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, + 75,111,115,109,111, 32, 75,105,108,108,101,114, 13, 10, 48, 58, 49,102, + 99, 52, 58, 49, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 49, + 100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 50,102, 51,100, 58, + 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 50,102, 53,100, 58, 49, 58, + 52, 49, 58, 52, 49, 13, 10, 48, 58, 50,102, 55,100, 58, 49, 58, 52, 49, + 58, 52, 49, 13, 10, 48, 58, 50,102, 57,100, 58, 49, 58, 51,101, 58, 51, + 101, 13, 10, 48, 58, 51, 48, 49,100, 58, 49, 58, 51,101, 58, 51,101, 13, + 10, 48, 58, 51, 48, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, + 58, 51, 48, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, + 48, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 48, 57, + 100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 49, 49,100, 58, + 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 49, 51,100, 58, 49, 58, + 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 49, 53,100, 58, 49, 58, 52, 49, + 58, 52, 49, 13, 10, 48, 58, 51, 49, 55,100, 58, 49, 58, 52, 49, 58, 52, + 49, 13, 10, 48, 58, 51, 49, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, + 10, 48, 58, 51, 50, 49,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, + 58, 51, 50, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, + 50, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 55, + 100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 57,100, 58, + 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 51, 49,100, 58, 49, 58, + 51,101, 58, 51,101, 13, 10, 48, 58, 51, 51, 51,100, 58, 49, 58, 52, 49, + 58, 52, 49, 13, 10, 48, 58, 51, 51, 53,100, 58, 49, 58, 52, 49, 58, 52, + 49, 13, 10, 48, 58, 51, 51, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, + 10, 48, 58, 51, 51, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 13, + 10,107, 97,109,105,107, 97,122,101, 58, 13, 10, 48, 58, 49,102, 99, 53, + 58, 49, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50,102, 49,100, 58, + 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 50,102, 51,100, 58, 49, 58, + 52, 49, 58, 52, 49, 13, 10, 48, 58, 50,102, 53,100, 58, 49, 58, 52, 49, + 58, 52, 49, 13, 10, 48, 58, 50,102, 55,100, 58, 49, 58, 52, 49, 58, 52, + 49, 13, 10, 48, 58, 50,102, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, + 10, 48, 58, 51, 48, 49,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, + 58, 51, 48, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, + 48, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 48, 55, + 100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 48, 57,100, 58, + 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, 49, 49,100, 58, 49, 58, + 51,101, 58, 51,101, 13, 10, 48, 58, 51, 49, 51,100, 58, 49, 58, 52, 49, + 58, 52, 49, 13, 10, 48, 58, 51, 49, 53,100, 58, 49, 58, 52, 49, 58, 52, + 49, 13, 10, 48, 58, 51, 49, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, + 10, 48, 58, 51, 49, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, + 58, 51, 50, 49,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 48, 58, 51, + 50, 51,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 53, + 100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 55,100, 58, + 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, 58, 51, 50, 57,100, 58, 49, 58, + 51,101, 58, 51,101, 13, 10, 48, 58, 51, 51, 49,100, 58, 49, 58, 51,101, + 58, 51,101, 13, 10, 48, 58, 51, 51, 51,100, 58, 49, 58, 52, 49, 58, 52, + 49, 13, 10, 48, 58, 51, 51, 53,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, + 10, 48, 58, 51, 51, 55,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 48, + 58, 51, 51, 57,100, 58, 49, 58, 51,101, 58, 51,101, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, 99, + 32, 40,100,105,110,111, 32,114,101,120, 32, 40,119,111,114,108,100, 32, + 38, 32,117,115, 41, 41, 13, 10,100,105,110,111,114,101,120, 58, 13, 10, + 100,105,110,111,114,101,120,106, 58, 13, 10,100,105,110,111,114,101,120, + 117, 58, 13, 10, 48, 58, 54, 48, 50, 55, 54, 48, 58, 57, 48, 58, 48, 48, + 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101, + 103, 97,115,121,115, 49, 46, 99, 32, 40, 99,121, 98, 97,116,116,108,101, + 114, 41, 13, 10, 99,121, 98, 97,116,116,108,114, 58, 13, 10, 48, 58, 49, + 102, 48, 49, 48, 49, 58,101,100, 58, 48, 50, 58, 50, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,107, 97,114,110,111,118, 46, 99, 32, + 40, 99,104,101,108,110,111,118, 32, 45, 32, 97,116,111,109,105, 99, 32, + 114,117,110,110,101,114, 32, 40,117,115, 41, 41, 13, 10, 99,104,101,108, + 110,111,118,117, 58, 13, 10, 48, 58, 48, 54, 48, 48, 52, 56, 58, 48, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 54, 48, 48, 56, 48, 58, 50, + 67, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 54, 48, 48, 67, 48, 58, + 50, 67, 58, 52, 49, 58, 48, 48, 13, 10, 13, 10, 99,104,101,108,110,111, + 118, 58, 13, 10, 99,104,101,108,110,111,118,106, 58, 13, 10, 99,104,101, + 108,110,111,118,106, 98,108, 58, 13, 10, 99,104,101,108,110,111,118,106, + 98,108, 97, 58, 13, 10, 48, 58, 48, 54, 48, 48, 52, 56, 58, 48, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 54, 48, 48, 56, 48, 58, 50, 67, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 54, 48, 48, 67, 48, 58, 50, + 67, 58, 52, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42,110,109,107, 49, 54, 46, 99, 32, 40, 97, 99,114,111, 98, 97, + 116, 32,109,105,115,115,105,111,110, 41, 13, 10, 97, 99,114,111, 98, 97, + 116,109, 58, 13, 10, 48, 58, 56, 48, 48,101, 97, 58, 56,100, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 56, 48, 48,100, 97, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 56, 48, 48, 50, 49, 58, 49, 58, 52, 56, 58, 52, + 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111, + 103,101,111, 46, 99, 32, 40,110,105,103,104,116,109, 97,114,101, 32,105, + 110, 32,116,104,101, 32,100, 97,114,107, 41, 13, 10,110,105,116,100, 58, + 13, 10,110,105,116,100, 98,108, 58, 13, 10, 48, 58, 49, 48, 53,100, 97, + 52, 58, 51,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 53,100, + 100,100, 58, 49, 58, 52, 49, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,115,110,107, 46, 99, 32, 40, 97,116,104,101,110, 97, + 41, 32, 40,102,105,120, 41, 13, 10, 59, 42, 42, 32,102,105,120,101,100, + 44, 32, 98,117,116, 32,100,101,108,101,116,101, 32, 97,110,121, 32, 97, + 116,104,101,110, 97, 46,104,105, 32,102,105,108,101, 32, 98,101,102,111, + 114,101, 32,112,108, 97,121,105,110,103, 32,102,105,114,115,116, 32,116, + 105,109,101, 32, 42, 42, 13, 10, 97,116,104,101,110, 97, 58, 13, 10, 48, + 58,102,101, 53, 50, 58, 54,102, 58, 52, 49, 58, 51, 48, 13, 10, 48, 58, + 100, 55,102, 53, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, + 40,112,117,122,122,108,101, 32, 98,111, 98, 98,108,101, 32, 50,120, 32, + 40,106, 97,112, 97,110, 41, 41, 13, 10,112, 98,111, 98, 98,108,101, 50, + 120, 58, 13, 10, 48, 58, 52, 48,100, 98, 55, 56, 58, 49, 48, 52, 58, 48, + 48, 58, 51,101, 13, 10, 48, 58, 52, 48,100, 98,100, 56, 58, 49, 58, 52, + 49, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, + 97,109, 99,111,115, 50, 46, 99, 32, 40,112,104,101,108,105,111,115, 32, + 40,106, 97,112, 97,110, 41, 41, 13, 10,112,104,101,108,105,111,115, 58, + 13, 10,112,104,101,108,105,111,115,106, 58, 13, 10, 48, 58, 49, 48, 48, + 48, 49, 50, 58, 52, 52, 58, 48, 48, 58, 52, 53, 13, 10, 48, 58, 52, 48, + 99, 52, 55, 56, 58, 52, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, 49, 48, + 57, 51, 55, 51, 58, 49, 49, 58, 48, 50, 58, 48, 49, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,115,101,105, 99,114,111,115,115, 46, 99, + 32, 40,115,101,105, 99,114,111,115,115, 41, 13, 10,115,101,105, 99,114, + 111,115,115, 58, 13, 10,115,101, 99,116,114,122,111,110, 58, 13, 10, 48, + 58, 55, 97,100, 52, 58, 49,101, 58, 48, 48, 58, 48, 97, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40, + 98,108, 97,122,105,110,103, 32,116,111,114,110, 97,100,111, 41, 13, 10, + 98,108,122,110,116,114,110,100, 58, 13, 10, 48, 58,102,102, 57, 51, 51, + 56, 58, 53, 48, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58,102,102, 57, 51, + 56, 53, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,110,101,109,101,115,105,115, 46, 99, 32, 40, 98,108, + 97, 99,107, 32,112, 97,110,116,104,101,114, 41, 13, 10, 98,108,107,112, + 110,116,104,114, 58, 13, 10, 48, 58, 57, 48, 52, 48, 48, 58, 57, 57, 58, + 48, 48, 58, 53, 57, 13, 10, 48, 58, 57, 48, 51, 48, 48, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119, + 101, 99,108,101,109, 97,110, 46, 99, 32, 40,119,101, 99, 32,108,101, 32, + 109, 97,110,115, 32, 50, 52, 41, 13, 10, 59, 42, 42, 32,111,110,108,121, + 32,115, 97,118,101,115, 32,116,111,112, 32, 49, 48, 32,115, 99,111,114, + 101,115, 32, 40,111,110,101,115, 32,121,111,117, 32,112,117,116, 32,121, + 111,117,114, 32,110, 97,109,101, 32,116,111, 41, 32, 42, 42, 13, 10,119, + 101, 99,108,101,109, 97,110, 58, 13, 10,119,101, 99,108,101,109, 97,110, + 50, 58, 13, 10,119,101, 99,108,101,109, 97,110, 97, 58, 13, 10,119,101, + 99,108,101,109, 97,110, 98, 58, 13, 10, 48, 58, 52, 49, 49, 49, 48, 58, + 54, 52, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 52, 48, 48, 48, 54, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,114,111,108,108,101,114,103, 46, 99, 32, 40,114,111,108,108,101, + 114,103, 97,109,101,115, 32, 40,117,115, 41, 41, 13, 10, 59, 42, 42, 32, + 117,110,116,101,115,116,101,100, 32, 45, 32,110,111, 32,103,111,111,100, + 32, 97,116, 32,116,104,105,115, 32,103, 97,109,101, 32, 33, 33, 32, 42, + 42, 13, 10,114,111,108,108,101,114,103, 58, 13, 10,114,111,108,108,101, + 114,103,106, 58, 13, 10, 48, 58, 50, 97, 56, 48, 58, 50, 56, 58, 48, 56, + 58, 48, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,108, + 107, 97,116, 99,107, 46, 99, 32, 40,107, 97, 41, 13, 10,109,120, 53, 48, + 48, 48, 58, 13, 10, 48, 58, 51, 97, 48, 48, 58, 53, 48, 58, 48, 48, 58, + 49, 52, 13, 10, 48, 58, 51, 57, 53,101, 58, 51, 58, 48, 48, 58, 57, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,108,107, 97,116, + 99,107, 46, 99, 13, 10,102,108,107, 97,116, 99,107, 58, 13, 10,102,108, + 107, 97,116, 99,107, 97, 58, 13, 10, 48, 58, 51, 97, 48, 48, 58, 53, 48, + 58, 48, 48, 58, 49, 52, 13, 10, 48, 58, 51, 57, 53,101, 58, 51, 58, 48, + 48, 58, 57, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, + 101,116, 97, 46, 99, 32, 40,109,111, 98,105,108,101, 32,115,117,105,116, + 32,103,117,110,100, 97,109, 41, 13, 10,109,115,103,117,110,100, 97,109, + 58, 13, 10,109,115,103,117,110,100, 97,109, 49, 58, 13, 10, 48, 58, 50, + 48, 52, 50, 56, 55, 58, 54, 51, 58, 48, 49, 58, 49, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,116,111,111, 98,105,110, 46, 99, 32, + 40,116,111,111, 98,105,110, 96, 32, 40,118,101,114,115,105,111,110, 32, + 51, 41, 41, 13, 10,116,111,111, 98,105,110, 58, 13, 10, 48, 58,102,102, + 102,102, 52, 48, 58, 51, 50, 58, 48, 49, 58,101,102, 13, 10, 13, 10,109, + 115,104,118,115,102, 58, 13, 10,109,115,104,118,115,102, 97, 49, 58, 13, + 10,109,115,104,118,115,102, 98, 49, 58, 13, 10,109,115,104,118,115,102, + 98, 58, 13, 10,109,115,104,118,115,102,104, 58, 13, 10,109,115,104,118, + 115,102,106, 50, 58, 13, 10,109,115,104,118,115,102,106, 49, 58, 13, 10, + 109,115,104,118,115,102,106, 58, 13, 10,109,115,104,118,115,102,117, 49, + 58, 13, 10,109,115,104,118,115,102,117, 58, 13, 10,109,115,104,118,115, + 102, 97, 58, 13, 10,109,115,104,118,115,102,117, 49,100, 58, 13, 10, 48, + 58,102,102, 50, 98, 48, 99, 58, 54, 51, 58, 48, 48, 58, 48, 51, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95, 98, + 46, 99, 32, 40, 97,115,104,117,114, 97, 32, 98,108, 97,115,116,101,114, + 32, 40,117,115, 41, 41, 13, 10, 97,115,104,117,114, 97,117, 58, 13, 10, + 48, 58, 54, 48, 49, 57,102, 57, 58, 54, 51, 58, 48, 48, 58, 49, 57, 13, + 10, 48, 58, 54, 48, 49, 50, 97, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, + 95,108, 46, 99, 32, 40, 99,104, 97,109,112,105,111,110, 32,119,114,101, + 115,116,108,101,114, 32, 40,119,111,114,108,100, 41, 41, 13, 10, 99,104, + 97,109,112,119,114, 58, 13, 10, 48, 58, 56, 57, 98, 55, 58, 50, 56, 58, + 48, 48, 58, 52,101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 98,108, 97,100,101,115,116,108, 46, 99, 32, 40, 98,108, 97,100,101, + 115, 32,111,102, 32,115,116,101,101,108, 32, 40,118,101,114,115,105,111, + 110, 32,116, 41, 41, 13, 10, 98,108, 97,100,101,115,116,108, 58, 13, 10, + 98,108, 97,100,101,115,116,108,101, 58, 13, 10, 98,108, 97,100,101,115, + 116,108,108, 58, 13, 10, 48, 58, 52, 49, 55, 48, 58, 56, 50, 58, 50, 51, + 58, 49, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,115, + 121,115,116,101,109, 49, 54, 46, 99, 32, 40, 97,116,111,109,105, 99, 32, + 112,111,105,110,116, 41, 13, 10, 97,116,111,109,105, 99,112, 58, 13, 10, + 48, 58,102,102,100, 57, 48,102, 58, 50, 55, 58, 48, 49, 58, 50, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,115, + 121,115, 49, 46, 99, 32, 40,116,104,101, 32, 97,115,116,121, 97,110, 97, + 120, 41, 13, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32, + 117,112,100, 97,116,101,115, 32,119,104,101,110, 32,102,105,114,115,116, + 32,103, 97,109,101, 32,115,116, 97,114,116,115, 32, 42, 42, 13, 10, 97, + 115,116,121, 97,110, 97,120, 58, 13, 10, 48, 58,102, 56, 57, 48, 57, 58, + 57, 55, 58, 48, 48, 58, 52,101, 13, 10, 48, 58,102, 56, 56, 53,100, 58, + 102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 56, 56, 54, 51, 58, 49, + 58, 48, 50, 58, 48, 50, 13, 10, 13, 10,108,111,114,100,111,102,107, 58, + 13, 10, 48, 58,102, 56, 57, 50, 49, 58, 57, 55, 58, 48, 48, 58, 52,101, + 13, 10, 48, 58,102, 56, 56, 55, 53, 58,102, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,102, 56, 56, 55, 98, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109,114,102,108,101, 97, + 46, 99, 32, 40,116,104,101, 32, 97,109, 97,122,105,110,103, 32, 97,100, + 118,101,110,116,117,114,101,115, 32,111,102, 32,109,114, 46, 32,102, 46, + 32,108,101, 97, 41, 13, 10, 59, 42, 42, 32,116,104,105,115, 32,103, 97, + 109,101, 32,100,111,101,115, 32,110,111,116, 32,100,105,115,112,108, 97, + 121, 32,116,104,101, 32,116,111,112, 32,115, 99,111,114,101, 32,105,110, + 32,116,104,101, 32,116,111,112, 32, 99,101,110,116,114,101, 32,111,102, + 32,116,104,101, 32,115, 99,114,101,101,110, 32, 42, 42, 13, 10, 59, 42, + 42, 32,117,110,116,105,108,108, 32,116,104,101, 32,103, 97,109,101, 32, + 104, 97,115, 32,114, 97,110, 32,102,111,114, 32, 97, 32,119,104,105,108, + 101, 32,119,105,116,104,111,117,116, 32,105,110,115,101,114,116,105,110, + 103, 32, 97,110,121, 32, 99,114,101,100,105,116,115, 32, 98,117,116, 32, + 116,104,105,115, 32, 42, 42, 13, 10, 59, 42, 42, 32,100,111,101,115, 32, + 110,111,116, 32,109, 97,116,116,101,114, 32, 97,115, 32,108,111,110,103, + 32, 97,115, 32,116,104,101, 32,100,101,102, 97,117,108,116, 32, 53, 44, + 48, 48, 48, 32,104,105,103,104, 32,115, 99,111,114,101, 32,104, 97,115, + 32, 98,101,101,110, 32, 98,101, 97,116,101,110, 32,111,110, 32,121,111, + 117,114, 42, 42, 13, 10, 59, 42, 42, 32,102,105,114,115,116, 32,103, 97, + 109,101, 46, 46, 46, 46, 46, 46, 46, 13, 10, 59, 42, 42, 32,119,104,105, + 99,104, 32,105,115,110, 96,116, 32,104, 97,114,100, 44, 32,111,114, 32, + 121,111,117, 32, 99, 97,110, 32,106,117,115,116, 32,108,101,116, 32,116, + 104,101, 32,103, 97,109,101, 32,114,117,110, 32,116,104,114,111,117,103, + 104, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32,102,111,114, + 32, 97, 32, 42, 42, 13, 10, 59, 42, 42, 32, 99,111,117,112,108,101, 32, + 111,102, 32,109,105,110,117,116,101,115, 32,117,110,116,105,108, 32,116, + 104,101, 32, 53, 44, 48, 48, 48, 32,116,111,112, 32,115, 99,111,114,101, + 32,105,115, 32,111,110, 32,115, 99,114,101,101,110, 46, 32,105,116, 96, + 115, 32,117,112, 32,116,111, 32,121,111,117, 32, 33, 33, 33, 32, 42, 42, + 13, 10,109,114,102,108,101, 97, 58, 13, 10, 48, 58, 99, 97,102,100, 58, + 57, 57, 58, 51, 48, 58, 50, 48, 13, 10, 48, 58, 99, 54,102, 56, 58, 54, + 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 42,115,121,115,116,101,109, 49, 46, 99, 32, 40, 98,117,108,108,102, + 105,103,104,116, 41, 13, 10, 98,117,108,108,102,103,116, 58, 13, 10,116, + 104,101,116,111,103,121,117, 58, 13, 10, 48, 58,100, 51, 48, 48, 58, 51, + 99, 58, 48, 48, 58, 52, 57, 13, 10, 48, 58, 99, 48, 49, 52, 58, 51, 58, + 48, 48, 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42,109, 54, 50, 46, 99, 32, 40,115,112,101,108,117,110,107,101,114, 41, + 13, 10,115,112,101,108,117,110,107,114, 58, 13, 10,115,112,101,108,117, + 110,107,114,106, 58, 13, 10, 48, 58,101, 48, 53, 50, 58, 54, 52, 58, 51, + 57, 58, 51,102, 13, 10, 48, 58,101, 48, 51, 98, 58, 50, 58, 51, 57, 58, + 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 98,117, + 103,103,121, 99,104,108, 46, 99, 32, 40, 98,117,103,103,121, 32, 99,104, + 97,108,108,101,110,103,101, 41, 13, 10, 98,117,103,103,121, 99,104,108, + 58, 13, 10, 98,117,103,103,121, 99,104,108,116, 58, 13, 10, 48, 58, 56, + 56, 49, 52, 58, 52,101, 99, 58, 48, 52, 58, 48, 48, 13, 10, 48, 58, 56, + 48,101, 49, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,122, 46, 99, 32, 40, + 98, 97,116,116,108,101, 32,115,104, 97,114,107, 32, 40,117,115, 41, 41, + 13, 10, 98,115,104, 97,114,107, 58, 13, 10, 98,115,104, 97,114,107,106, + 58, 13, 10, 98,115,104, 97,114,107,117, 58, 13, 10, 48, 58, 49, 48,101, + 57, 98, 54, 58, 51, 49, 58, 48, 48, 58, 52, 57, 13, 10, 48, 58, 49, 48, + 102, 48, 99, 54, 58, 52, 58, 48, 48, 58, 56, 52, 13, 10, 13, 10, 98,115, + 104, 97,114,107,106,106,115, 58, 13, 10, 48, 58, 49, 48,101, 57, 97,101, + 58, 51, 49, 58, 48, 48, 58, 52, 57, 13, 10, 48, 58, 49, 48,102, 48, 99, + 54, 58, 52, 58, 48, 48, 58, 56, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 98, 97,116,116,108,101,114, 97, 46, 99, 32, 40, 98, + 97,116,116,108,101, 32,114, 97,110,103,101,114,115, 32, 40,119,111,114, + 108,100, 41, 41, 13, 10, 98, 97,116,116,108,101,114, 97, 58, 13, 10, 98, + 108,100,119,111,108,102, 58, 13, 10, 98,108,100,119,111,108,102,106, 58, + 13, 10, 48, 58, 49,102, 48, 50, 50, 48, 58, 56, 97, 58, 52, 49, 58, 48, + 48, 13, 10, 48, 58, 49,102, 48, 48, 48,101, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 49,102, 48, 48, 48,102, 58, 49, 58, 49, 48, 58, 49, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111, + 103,101,111, 46, 99, 32, 40,109,111,110,101,121, 32,112,117,122,122,108, + 101, 32,101,120, 99,104, 97,110,103,101,114, 32, 47, 32,109,111,110,101, + 121, 32,105,100,111,108, 32,101,120, 99,104, 97,110,103,101,114, 41, 13, + 10,109,105,101,120, 99,104,110,103, 58, 13, 10, 48, 58, 49, 48, 48, 48, + 48, 50, 58, 57,101, 58, 48, 48, 58, 48,102, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,100,114, 97, + 103,111,110, 32,117,110,105,116, 32, 47, 32, 99, 97,115,116,108,101, 32, + 111,102, 32,100,114, 97,103,111,110, 41, 13, 10,100,114,103,110,117,110, + 105,116, 58, 13, 10, 48, 58,102,102,100, 53, 48,101, 58, 53, 48, 58, 48, + 48, 58, 50,101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 99,108,111, 97,107, 46, 99, 32, 40, 99,108,111, 97,107, 32, 38, 32,100, + 97,103,103,101,114, 41, 13, 10, 99,108,111, 97,107, 58, 13, 10, 99,108, + 111, 97,107,102,114, 58, 13, 10, 99,108,111, 97,107,103,114, 58, 13, 10, + 99,108,111, 97,107,115,112, 58, 13, 10, 48, 58,102, 51, 53, 58, 97, 48, + 58, 49, 49, 58, 53, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, - 99,111,114,101, 95,118, 55, 46, 57, 32, 97,100,100,105,116,105,111,110, - 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, - 114, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103, + 104,115, 99,111,114,101, 95,118, 55, 46, 57, 32, 97,100,100,105,116,105, + 111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101, + 122,101,114, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95, 98, 46, 99, 32, 40, - 114, 97,109, 98,111, 32, 51, 32,117,115, 41, 10,114, 97,109, 98,111, 51, - 117, 58, 10,114, 97,109, 98,111, 51, 58, 10, 48, 58, 56, 48, 50, 54, 48, - 48, 58, 53, 48, 58, 48, 49, 58, 52,101, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 42,116, 97,105,116,111, 95, 98, 46, 99, 32, 40,114, 97,109, - 98,111, 32, 51, 32,101,117,114,111,112,101, 41, 10,114, 97,109, 98,111, - 51,112, 58, 10, 48, 58, 56, 48, 50, 54, 48, 48, 58, 53, 48, 58, 48, 49, - 58, 50,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116, - 111, 95,122, 46, 99, 32, 40, 97,113,117, 97, 32,106, 97, 99,107, 32, 40, - 119,111,114,108,100, 41, 41, 10, 59, 42, 42, 32,103, 97,109,101, 32,100, - 105,115,112,108, 97,121,115, 32,104,105,103,104,115, 99,111,114,101,115, - 32,119,114,111,110,103, 32, 40,110,111,119,116, 32,116,111, 32,100,111, - 32,119,105,116,104, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32, - 102,105,108,101, 44,100,114,105,118,101,114, 32,105,115,115,117,101, 32, - 63, 63, 41, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32, - 100,105,115,112,108, 97,121,115, 32,111,107, 46, 46, 10, 97,113,117, 97, - 106, 97, 99,107, 58, 10, 97,113,117, 97,106, 97, 99,107,106, 58, 10, 48, - 58, 49, 48, 48, 49, 54, 48, 58, 55, 99, 58, 48, 48, 58, 48, 50, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 99,104,115, 46, - 99, 32, 40,115,117,112,101,114, 32, 99,104, 97,115,101, 32, 45, 32, 99, - 114,105,109,105,110, 97,108, 32,116,101,114,109,105,110, 97,116,105,111, - 110, 32, 40,117,115, 41, 41, 10,115,117,112,101,114, 99,104,115, 58, 10, - 115,117,112,101,114, 99,104,115,106, 58, 10,115,117,112,101,114, 99,104, - 115,117, 58, 10, 48, 58, 49, 48, 50, 56, 49, 53, 58, 52, 57, 58, 48, 48, - 58, 52, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114, - 111, 46, 99, 32, 40, 98, 97,108, 32, 99,117, 98,101, 41, 10, 98, 97,108, - 99,117, 98,101, 58, 10, 48, 58,102, 48, 52, 97, 99, 48, 58, 52, 97, 58, - 48, 48, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,108, - 112,104, 97, 54, 56,107, 46, 99, 32, 40,115,107,121, 32, 97,100,118,101, - 110,116,117,114,101, 32, 40,119,111,114,108,100, 32, 38, 32,117,115, 41, - 41, 10,115,107,121, 97,100,118,110,116, 58, 10,115,107,121, 97,100,118, - 110,116,117, 58, 10, 48, 58, 52, 48, 48, 51, 49, 58, 51, 58, 48, 48, 58, - 50, 52, 10, 48, 58, 52, 49, 49, 48, 50, 58, 98, 99, 58, 48, 48, 58, 50, - 48, 10, 10,115,107,121, 97,100,118,110,116,106, 58, 10, 48, 58, 52, 48, - 48, 51, 49, 58, 51, 58, 48, 48, 58, 50, 52, 10, 48, 58, 52, 49, 49, 48, - 50, 58, 98, 99, 58, 48, 48, 58, 52, 57, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,110,101,109,101,115,105,115, 46, 99, 32, 40,107,105,116,116, - 101,110, 32,107, 97, 98,111,111,100,108,101, 41, 10,107,105,116,116,101, - 110,107, 58, 10, 48, 58, 52, 48, 48, 53, 97, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 50, 56, 48, 48, 58, 50, 56, 58, 48, 48, 58, 49, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,106, 97,120, 46, 99, 32, - 40,116,121,112,104,111,111,110, 41, 10,116,121,112,104,111,111,110, 58, - 10, 48, 58, 50, 49, 48, 48, 58, 53, 48, 58, 49, 97, 58, 48, 48, 10, 48, - 58, 50, 48, 53, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, 97, 49, 46, 99, 32, 40, - 116,105,110,107,108,101, 32,112,105,116, 32, 40,106, 97,112, 97,110, 41, - 41, 10,116,105,110,107,108,112,105,116, 58, 10, 48, 58, 53, 99, 97, 56, - 58, 49, 55, 52, 58, 48, 48, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,108, 97,115,115,112, 46, 99, 32, 40, 99,104, 97,109,101,108, - 101,111,110, 41, 10, 99,104, 97,109,101,108,101,111, 58, 10, 48, 58, 52, - 102, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 50, 48, 58, 54,101, - 58, 50, 54, 58, 48, 48, 10, 48, 58, 53, 48, 58, 49, 58, 53, 48, 58, 53, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,112,114,105,110,116, - 50, 46, 99, 32, 40,115,112,114,105,110,116, 32, 49, 41, 10,115,112,114, - 105,110,116, 49, 58, 10, 48, 58, 53, 55, 58, 51, 58, 51, 48, 58, 51, 48, - 10, 10, 99,104, 97,115,101,104,113, 58, 32, 59, 91, 83,112,101, 99,105, - 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, - 97,115, 32,102,111,114, 32,109, 97,107,105,110,103, 32,116,104,105,115, - 32,101,110,116,114,121, 32,119,111,114,107, 44, 32, 97,110,100, 32,100, - 110, 97,100,105,115,116,117,114, 98,101,114, 32,102,111,114, 32, 97,100, - 100,105,110,103, 32, 99,108,111,110,101,115, 93, 10, 99,104, 97,115,101, - 104,113,106, 58, 10, 99,104, 97,115,101,104,113,117, 58, 10, 99,104, 97, - 115,101,104,113,106,117, 58, 10, 48, 58, 49, 48, 49, 55, 54, 48, 58, 97, - 48, 58, 50, 48, 58, 50, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 115,112, 99,102,111,114, 99,101, 32, 40,115,112, 97, 99,101, 32,102,111, - 114, 99,101, 41, 10,115,112, 99,102,111,114, 99,101, 58, 10,109,101,116, - 101,111,114, 58, 10,115,112, 99,102,111,114, 99, 50, 58, 10,109,101,116, - 101,111,114,115, 58, 10, 48, 58, 52, 51, 48, 48, 58, 53, 48, 58, 51, 48, - 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, - 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, 99,111,114,101, - 95,118, 55, 46, 56, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101, - 108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 42, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95, + 98, 46, 99, 32, 40,114, 97,109, 98,111, 32, 51, 32,117,115, 41, 13, 10, + 114, 97,109, 98,111, 51,117, 58, 13, 10,114, 97,109, 98,111, 51, 58, 13, + 10, 48, 58, 56, 48, 50, 54, 48, 48, 58, 53, 48, 58, 48, 49, 58, 52,101, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116, + 111, 95, 98, 46, 99, 32, 40,114, 97,109, 98,111, 32, 51, 32,101,117,114, + 111,112,101, 41, 13, 10,114, 97,109, 98,111, 51,112, 58, 13, 10, 48, 58, + 56, 48, 50, 54, 48, 48, 58, 53, 48, 58, 48, 49, 58, 50,101, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,122, 46, + 99, 32, 40, 97,113,117, 97, 32,106, 97, 99,107, 32, 40,119,111,114,108, + 100, 41, 41, 13, 10, 59, 42, 42, 32,103, 97,109,101, 32,100,105,115,112, + 108, 97,121,115, 32,104,105,103,104,115, 99,111,114,101,115, 32,119,114, + 111,110,103, 32, 40,110,111,119,116, 32,116,111, 32,100,111, 32,119,105, + 116,104, 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32,102,105,108, + 101, 44,100,114,105,118,101,114, 32,105,115,115,117,101, 32, 63, 63, 41, + 13, 10, 59, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32,100,105, + 115,112,108, 97,121,115, 32,111,107, 46, 46, 13, 10, 97,113,117, 97,106, + 97, 99,107, 58, 13, 10, 97,113,117, 97,106, 97, 99,107,106, 58, 13, 10, + 48, 58, 49, 48, 48, 49, 54, 48, 58, 55, 99, 58, 48, 48, 58, 48, 50, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,112,101,114, 99, + 104,115, 46, 99, 32, 40,115,117,112,101,114, 32, 99,104, 97,115,101, 32, + 45, 32, 99,114,105,109,105,110, 97,108, 32,116,101,114,109,105,110, 97, + 116,105,111,110, 32, 40,117,115, 41, 41, 13, 10,115,117,112,101,114, 99, + 104,115, 58, 13, 10,115,117,112,101,114, 99,104,115,106, 58, 13, 10,115, + 117,112,101,114, 99,104,115,117, 58, 13, 10, 48, 58, 49, 48, 50, 56, 49, + 53, 58, 52, 57, 58, 48, 48, 58, 52, 55, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40, 98, 97,108, 32, + 99,117, 98,101, 41, 13, 10, 98, 97,108, 99,117, 98,101, 58, 13, 10, 48, + 58,102, 48, 52, 97, 99, 48, 58, 52, 97, 58, 48, 48, 58, 48, 50, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,108,112,104, 97, 54, 56, + 107, 46, 99, 32, 40,115,107,121, 32, 97,100,118,101,110,116,117,114,101, + 32, 40,119,111,114,108,100, 32, 38, 32,117,115, 41, 41, 13, 10,115,107, + 121, 97,100,118,110,116, 58, 13, 10,115,107,121, 97,100,118,110,116,117, + 58, 13, 10, 48, 58, 52, 48, 48, 51, 49, 58, 51, 58, 48, 48, 58, 50, 52, + 13, 10, 48, 58, 52, 49, 49, 48, 50, 58, 98, 99, 58, 48, 48, 58, 50, 48, + 13, 10, 13, 10,115,107,121, 97,100,118,110,116,106, 58, 13, 10, 48, 58, + 52, 48, 48, 51, 49, 58, 51, 58, 48, 48, 58, 50, 52, 13, 10, 48, 58, 52, + 49, 49, 48, 50, 58, 98, 99, 58, 48, 48, 58, 52, 57, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,110,101,109,101,115,105,115, 46, 99, 32, + 40,107,105,116,116,101,110, 32,107, 97, 98,111,111,100,108,101, 41, 13, + 10,107,105,116,116,101,110,107, 58, 13, 10, 48, 58, 52, 48, 48, 53, 97, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 50, 56, 48, 48, 58, + 50, 56, 58, 48, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 97,106, 97,120, 46, 99, 32, 40,116,121,112,104,111,111,110, + 41, 13, 10,116,121,112,104,111,111,110, 58, 13, 10, 48, 58, 50, 49, 48, + 48, 58, 53, 48, 58, 49, 97, 58, 48, 48, 13, 10, 48, 58, 50, 48, 53, 48, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,110, 97,109, 99,111,110, 97, 49, 46, 99, 32, 40,116,105,110, + 107,108,101, 32,112,105,116, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, + 116,105,110,107,108,112,105,116, 58, 13, 10, 48, 58, 53, 99, 97, 56, 58, + 49, 55, 52, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,108, 97,115,115,112, 46, 99, 32, 40, 99,104, 97,109,101, + 108,101,111,110, 41, 13, 10, 99,104, 97,109,101,108,101,111, 58, 13, 10, + 48, 58, 52,102, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 50, + 48, 58, 54,101, 58, 50, 54, 58, 48, 48, 13, 10, 48, 58, 53, 48, 58, 49, + 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,115,112,114,105,110,116, 50, 46, 99, 32, 40,115,112,114,105,110,116, + 32, 49, 41, 13, 10,115,112,114,105,110,116, 49, 58, 13, 10, 48, 58, 53, + 55, 58, 51, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 99,104, 97,115,101, + 104,113, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110, + 107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32, + 109, 97,107,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 32, + 119,111,114,107, 44, 32, 97,110,100, 32,100,110, 97,100,105,115,116,117, + 114, 98,101,114, 32,102,111,114, 32, 97,100,100,105,110,103, 32, 99,108, + 111,110,101,115, 93, 13, 10, 99,104, 97,115,101,104,113,106, 58, 13, 10, + 99,104, 97,115,101,104,113,117, 58, 13, 10, 99,104, 97,115,101,104,113, + 106,117, 58, 13, 10, 48, 58, 49, 48, 49, 55, 54, 48, 58, 97, 48, 58, 50, + 48, 58, 50, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, + 112, 99,102,111,114, 99,101, 32, 40,115,112, 97, 99,101, 32,102,111,114, + 99,101, 41, 13, 10,115,112, 99,102,111,114, 99,101, 58, 13, 10,109,101, + 116,101,111,114, 58, 13, 10,115,112, 99,102,111,114, 99, 50, 58, 13, 10, + 109,101,116,101,111,114,115, 58, 13, 10, 48, 58, 52, 51, 48, 48, 58, 53, + 48, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105, + 103,104,115, 99,111,114,101, 95,118, 55, 46, 56, 32, 97,100,100,105,116, + 105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101, + 101,122,101,114, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 42,115,101,110,106,121,111, 46, 99, 32, 40, 98, 97,108,117, 98, - 97, 45,108,111,117,107, 32,110,111, 32,100,101,110,115,101,116,115,117, - 41, 10, 98, 97,108,117, 98, 97, 58, 10, 48, 58, 56, 48,102, 54, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48,102, 56, 58, 49, 58, 48, 51, - 58, 48, 51, 10, 48, 58, 57, 50, 54, 49, 58, 49, 58, 56, 97, 58, 56, 97, - 10, 48, 58, 57, 50, 52, 49, 58, 49, 58, 56, 97, 58, 56, 97, 10, 48, 58, - 57, 50, 50, 49, 58, 49, 58, 56, 97, 58, 56, 97, 10, 48, 58, 57, 50, 48, - 49, 58, 49, 58, 56, 51, 58, 56, 51, 10, 48, 58, 57, 49,101, 49, 58, 49, - 58, 56, 48, 58, 56, 48, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 56, 48, - 58, 56, 48, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 56, 48, 58, 56, 48, - 10, 48, 58, 57, 49, 56, 49, 58, 49, 58, 56, 48, 58, 56, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 98,108,111,111,100, 98,114,111, 46, - 99, 32, 40,115,107,121, 32,115,109, 97,115,104,101,114, 41, 10,115,107, - 121,115,109, 97,115,104, 58, 10, 48, 58, 56, 57, 50, 53,101, 58, 53, 48, - 58, 53, 51, 58, 48, 48, 10, 48, 58, 56, 48, 48, 48, 56, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 56, 48, 48, 48, 57, 58, 49, 58, 48, 50, 58, - 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,121,110,121, 46, - 99, 32, 40,110,101,119, 32,121,111,114,107, 32,110,101,119, 32,121,111, - 114,107, 41, 10,110,121,110,121, 58, 10,110,121,110,121,103, 58, 10,119, - 97,114, 99, 97,100,105, 97, 58, 10, 48, 58, 99, 48, 48, 48, 58,102, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 55, 97, 55,100, 58, 49, 58, 55, 55, 58, - 55, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 57, 50, 46, 99, 32, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,115,101,110,106,121, + 111, 46, 99, 32, 40, 98, 97,108,117, 98, 97, 45,108,111,117,107, 32,110, + 111, 32,100,101,110,115,101,116,115,117, 41, 13, 10, 98, 97,108,117, 98, + 97, 58, 13, 10, 48, 58, 56, 48,102, 54, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 56, 48,102, 56, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, + 48, 58, 57, 50, 54, 49, 58, 49, 58, 56, 97, 58, 56, 97, 13, 10, 48, 58, + 57, 50, 52, 49, 58, 49, 58, 56, 97, 58, 56, 97, 13, 10, 48, 58, 57, 50, + 50, 49, 58, 49, 58, 56, 97, 58, 56, 97, 13, 10, 48, 58, 57, 50, 48, 49, + 58, 49, 58, 56, 51, 58, 56, 51, 13, 10, 48, 58, 57, 49,101, 49, 58, 49, + 58, 56, 48, 58, 56, 48, 13, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 56, + 48, 58, 56, 48, 13, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 56, 48, 58, + 56, 48, 13, 10, 48, 58, 57, 49, 56, 49, 58, 49, 58, 56, 48, 58, 56, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 98,108,111,111, + 100, 98,114,111, 46, 99, 32, 40,115,107,121, 32,115,109, 97,115,104,101, + 114, 41, 13, 10,115,107,121,115,109, 97,115,104, 58, 13, 10, 48, 58, 56, + 57, 50, 53,101, 58, 53, 48, 58, 53, 51, 58, 48, 48, 13, 10, 48, 58, 56, + 48, 48, 48, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, + 48, 48, 57, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,110,121,110,121, 46, 99, 32, 40,110,101,119, 32, + 121,111,114,107, 32,110,101,119, 32,121,111,114,107, 41, 13, 10,110,121, + 110,121, 58, 13, 10,110,121,110,121,103, 58, 13, 10,119, 97,114, 99, 97, + 100,105, 97, 58, 13, 10, 48, 58, 99, 48, 48, 48, 58,102, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 55, 97, 55,100, 58, 49, 58, 55, 55, 58, 55, 55, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, 57, 50, 46, 99, 32, 40,110,105,110,106, 97, 32, 98, 97,115,101, 98, 97,108,108, 32, 98, 97, - 116,109, 97,110, 32, 40,117,115, 41, 41, 10,110, 98, 98, 97,116,109, 97, - 110, 58, 10,108,101, 97,103,117,101,109,110, 58, 10,110, 98, 98, 97,116, - 109, 97,110,117, 58, 10, 48, 58,101, 50, 53,100, 52, 58, 52,102, 58, 48, - 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,111,108, - 102,105,101,100, 46, 99, 32, 40,118,111,108,105,102,105,101,100, 32, 40, - 106, 97,112, 97,110, 41, 41, 10, 59, 42, 42, 32,116,111,112, 32,115, 99, - 111,114,101, 32,111,110, 32,116,111,112, 32, 99,101,110,116,114,101, 32, - 111,102, 32,115, 99,114,101,101,110, 32,100,111,101,115, 32,110,111,116, - 32,117,112,100, 97,116,101, 32,117,110,116,105,108,108, 32, 32, 42, 42, - 10, 59, 42, 42, 32, 97,102,116,101,114, 32,102,105,114,115,116, 32,100, - 101,109,111, 32,103, 97,109,101, 32,105,110, 32, 97,116,116,114, 97, 99, - 116, 32,109,111,100,101, 32, 42, 42, 10,118,111,108,102,105,101,100, 58, - 10,118,111,108,102,105,101,100,106,111, 58, 10,118,111,108,102,105,101, - 100,106, 58, 10,118,111,108,102,105,101,100,117, 58, 10,118,111,108,102, - 105,101,100,111, 58, 10,118,111,108,102,105,101,100,117,111, 58, 10, 48, - 58, 49, 48, 48, 50, 48, 48, 58, 50, 54, 58, 48, 48, 58, 53, 48, 10, 48, - 58, 49, 48, 48, 50, 48, 49, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10, 59, + 116,109, 97,110, 32, 40,117,115, 41, 41, 13, 10,110, 98, 98, 97,116,109, + 97,110, 58, 13, 10,108,101, 97,103,117,101,109,110, 58, 13, 10,110, 98, + 98, 97,116,109, 97,110,117, 58, 13, 10, 48, 58,101, 50, 53,100, 52, 58, + 52,102, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,118,111,108,102,105,101,100, 46, 99, 32, 40,118,111,108,105, + 102,105,101,100, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, 59, 42, 42, + 32,116,111,112, 32,115, 99,111,114,101, 32,111,110, 32,116,111,112, 32, + 99,101,110,116,114,101, 32,111,102, 32,115, 99,114,101,101,110, 32,100, + 111,101,115, 32,110,111,116, 32,117,112,100, 97,116,101, 32,117,110,116, + 105,108,108, 32, 32, 42, 42, 13, 10, 59, 42, 42, 32, 97,102,116,101,114, + 32,102,105,114,115,116, 32,100,101,109,111, 32,103, 97,109,101, 32,105, + 110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 42, 42, 13, + 10,118,111,108,102,105,101,100, 58, 13, 10,118,111,108,102,105,101,100, + 106,111, 58, 13, 10,118,111,108,102,105,101,100,106, 58, 13, 10,118,111, + 108,102,105,101,100,117, 58, 13, 10,118,111,108,102,105,101,100,111, 58, + 13, 10,118,111,108,102,105,101,100,117,111, 58, 13, 10, 48, 58, 49, 48, + 48, 50, 48, 48, 58, 50, 54, 58, 48, 48, 58, 53, 48, 13, 10, 48, 58, 49, + 48, 48, 50, 48, 49, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,105, 99,100,117,101,108, 46, 99, 32, - 40,100,101,112,116,104, 99,104, 97,114,103,101, 41, 10,100,101,112,116, - 104, 99,104, 58, 10,100,101,112,116,104, 99,104,111, 58, 10,115,117, 98, - 104,117,110,116, 58, 10, 48, 58,101, 52, 48, 56, 58, 99, 58, 53, 53, 58, - 53, 97, 10, 10, 97,114,107,110,111,105,100, 50, 58, 32, 32, 59, 42, 42, - 32,121,111,117, 32,109,117,115,116, 32,108,101,116, 32,116,104,101, 32, - 104,105,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,100,105,115,112, - 108, 97,121, 32,102,105,114,115,116, 32, 98,101,102,111,114,101, 32,115, - 116, 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 32, 42, 42, 10, - 97,114,107,110,111,105,100, 50,106, 58, 10, 97,114,107,110,111,105,100, - 50,117, 58, 10, 97,114,107,110,111,105,100, 50, 98, 58, 10, 48, 58,101, - 99, 56, 49, 58, 50, 55, 58, 48, 49, 58, 52,101, 10, 48, 58,101, 51, 97, - 56, 58, 48, 51, 58, 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 40, 98,108,111, 99,107, 32, 98,108,111, 99,107, 32, 40, - 119,111,114,108,100, 32, 57, 49, 48, 57, 49, 48, 41, 41, 10, 98,108,111, - 99,107, 97, 58, 10, 48, 58,101, 48,102, 48, 58, 53, 48, 58, 53, 52, 58, - 56, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,115,121, - 115, 49, 46, 99, 32, 40,115, 97,105,110,116, 32,100,114, 97,103,111,110, - 41, 10,115,116,100,114, 97,103,111,110, 58, 10,115,116,100,114, 97,103, - 111,110, 97, 58, 10,115,116,100,114, 97,103,111,110, 98, 58, 10, 48, 58, - 102, 56,100, 48, 48, 58, 55, 99, 58, 48, 48, 58,100, 51, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,115, 98,114,107,111,117,116, 46, 99, 32, 40,115, - 117,112,101,114, 32, 98,114,101, 97,107,111,117,116, 40,102,105,120, 41, - 41, 10,115, 98,114,107,111,117,116, 58, 10,115, 98,114,107,111,117,116, - 51, 58, 10,115, 98,114,107,111,117,116, 99, 58, 10,115, 98,114,107,111, - 117,116, 99,116, 58, 10, 48, 58, 50, 50, 58, 48, 56, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109, 99,114, 54, 56, - 46, 99, 32, 40,112,105,103,115,107,105,110, 32, 54, 50, 49, 97,100, 41, - 10,112,105,103,115,107,105,110, 58, 10, 48, 58, 49, 52, 50, 97, 49, 55, - 58, 49, 53, 55, 58, 48, 53, 58, 48, 51, 10, 10,112,105,103,115,107,105, - 110, 97, 58, 10,112,105,103,115,107,105,110, 98, 58, 10, 48, 58, 49, 52, - 50, 98, 52,100, 58, 49, 53, 55, 58, 48, 53, 58, 48, 51, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,108, 46, 99, 32, - 40, 99,117, 98,121, 32, 98,111,112, 41, 10, 99,117, 98,121, 98,111,112, - 58, 10, 48, 58, 56, 52, 54, 50, 58, 50, 56, 58, 48, 53, 58, 48, 52, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, - 32, 40, 98, 97,110,103, 32, 98, 97,110,103, 32, 98, 97,108,108, 32, 40, - 118, 49, 46, 48, 53, 41, 41, 10, 98, 97,110,103, 98, 97,108,108, 58, 10, - 48, 58,102, 48, 52, 98, 50, 52, 58, 57, 97, 58, 52, 54, 58, 48, 51, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109, 57, 50, 46, 99, 32, 40, - 103,117,110,102,111,114, 99,101, 32, 45, 32, 98, 97,116,116,108,101, 32, - 102,105,114,101, 32,101,110,103,117,108,102,101,100, 32,116,101,114,114, - 111,114, 32,105,115,108, 97,110,100, 32, 40,119,111,114,108,100, 41, 41, - 10,103,117,110,102,111,114, 99,101, 58, 10,103,117,110,102,111,114, 99, - 101,117, 58, 10, 48, 58,101, 54, 54, 51, 51, 58, 52, 48, 58, 52, 52, 58, - 50, 48, 10, 10,103,117,110,102,111,114, 99,101,106, 58, 10, 48, 58,101, - 54, 54, 51, 51, 58, 52, 48, 58, 52, 52, 58, 52,102, 10, 10, 59, 42, 42, + 40,100,101,112,116,104, 99,104, 97,114,103,101, 41, 13, 10,100,101,112, + 116,104, 99,104, 58, 13, 10,100,101,112,116,104, 99,104,111, 58, 13, 10, + 115,117, 98,104,117,110,116, 58, 13, 10, 48, 58,101, 52, 48, 56, 58, 99, + 58, 53, 53, 58, 53, 97, 13, 10, 13, 10, 97,114,107,110,111,105,100, 50, + 58, 32, 32, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, 32,108,101, + 116, 32,116,104,101, 32,104,105,115, 99,111,114,101, 32,116, 97, 98,108, + 101, 32,100,105,115,112,108, 97,121, 32,102,105,114,115,116, 32, 98,101, + 102,111,114,101, 32,115,116, 97,114,116,105,110,103, 32, 97, 32,103, 97, + 109,101, 32, 42, 42, 13, 10, 97,114,107,110,111,105,100, 50,106, 58, 13, + 10, 97,114,107,110,111,105,100, 50,117, 58, 13, 10, 97,114,107,110,111, + 105,100, 50, 98, 58, 13, 10, 48, 58,101, 99, 56, 49, 58, 50, 55, 58, 48, + 49, 58, 52,101, 13, 10, 48, 58,101, 51, 97, 56, 58, 48, 51, 58, 48, 49, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 40, + 98,108,111, 99,107, 32, 98,108,111, 99,107, 32, 40,119,111,114,108,100, + 32, 57, 49, 48, 57, 49, 48, 41, 41, 13, 10, 98,108,111, 99,107, 97, 58, + 13, 10, 48, 58,101, 48,102, 48, 58, 53, 48, 58, 53, 52, 58, 56, 53, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,115,121,115, + 49, 46, 99, 32, 40,115, 97,105,110,116, 32,100,114, 97,103,111,110, 41, + 13, 10,115,116,100,114, 97,103,111,110, 58, 13, 10,115,116,100,114, 97, + 103,111,110, 97, 58, 13, 10,115,116,100,114, 97,103,111,110, 98, 58, 13, + 10, 48, 58,102, 56,100, 48, 48, 58, 55, 99, 58, 48, 48, 58,100, 51, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 98,114,107,111,117,116, + 46, 99, 32, 40,115,117,112,101,114, 32, 98,114,101, 97,107,111,117,116, + 40,102,105,120, 41, 41, 13, 10,115, 98,114,107,111,117,116, 58, 13, 10, + 115, 98,114,107,111,117,116, 51, 58, 13, 10,115, 98,114,107,111,117,116, + 99, 58, 13, 10,115, 98,114,107,111,117,116, 99,116, 58, 13, 10, 48, 58, + 50, 50, 58, 48, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42,109, 99,114, 54, 56, 46, 99, 32, 40,112,105, + 103,115,107,105,110, 32, 54, 50, 49, 97,100, 41, 13, 10,112,105,103,115, + 107,105,110, 58, 13, 10, 48, 58, 49, 52, 50, 97, 49, 55, 58, 49, 53, 55, + 58, 48, 53, 58, 48, 51, 13, 10, 13, 10,112,105,103,115,107,105,110, 97, + 58, 13, 10,112,105,103,115,107,105,110, 98, 58, 13, 10, 48, 58, 49, 52, + 50, 98, 52,100, 58, 49, 53, 55, 58, 48, 53, 58, 48, 51, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,108, 46, + 99, 32, 40, 99,117, 98,121, 32, 98,111,112, 41, 13, 10, 99,117, 98,121, + 98,111,112, 58, 13, 10, 48, 58, 56, 52, 54, 50, 58, 50, 56, 58, 48, 53, + 58, 48, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109, + 101,116,114,111, 46, 99, 32, 40, 98, 97,110,103, 32, 98, 97,110,103, 32, + 98, 97,108,108, 32, 40,118, 49, 46, 48, 53, 41, 41, 13, 10, 98, 97,110, + 103, 98, 97,108,108, 58, 13, 10, 48, 58,102, 48, 52, 98, 50, 52, 58, 57, + 97, 58, 52, 54, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42,109, 57, 50, 46, 99, 32, 40,103,117,110,102,111,114, 99,101, + 32, 45, 32, 98, 97,116,116,108,101, 32,102,105,114,101, 32,101,110,103, + 117,108,102,101,100, 32,116,101,114,114,111,114, 32,105,115,108, 97,110, + 100, 32, 40,119,111,114,108,100, 41, 41, 13, 10,103,117,110,102,111,114, + 99,101, 58, 13, 10,103,117,110,102,111,114, 99,101,117, 58, 13, 10, 48, + 58,101, 54, 54, 51, 51, 58, 52, 48, 58, 52, 52, 58, 50, 48, 13, 10, 13, + 10,103,117,110,102,111,114, 99,101,106, 58, 13, 10, 48, 58,101, 54, 54, + 51, 51, 58, 52, 48, 58, 52, 52, 58, 52,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, 99, 32, 40, - 112,117,108,105,114,117,108, 97, 32, 40,119,111,114,108,100, 41, 41, 10, - 112,117,108,105,114,117,108, 97, 58, 10,112,117,108,105,114,117,108, 97, - 106, 58, 10, 48, 58, 51, 48,100, 53, 56, 54, 58,102, 57, 58, 48, 48, 58, - 52, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 56, 48, 56, 48, 98, - 119, 46, 99, 32, 40,115,112, 97, 99,101, 32,115,116,114, 97,110,103,101, - 114, 32, 38, 32,115,112, 97, 99,101, 32,115,116,114, 97,110,103,101,114, - 32, 50, 41, 10,115,115,116,114, 97,110,103,114, 58, 10,115,115,116,114, - 97,110,103,114, 50, 58, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, - 46, 99, 32, 40,122,101,107,116,111,114, 32, 40,114,101,118,105,115,105, - 111,110, 32, 98, 41, 41, 10,122,101,107,116,111,114, 58, 10, 48, 58, 99, - 57, 50, 52, 58, 51, 57, 58, 57, 48, 58, 49, 48, 10, 48, 58, 99,102,100, - 50, 58,102, 58, 48, 99, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101, - 116,116,101, 58, 32, 97,115,116,114,111, 32,102, 97,110,116, 97,115,105, - 97, 41, 10, 99, 97,115,116,102, 97,110,116, 58, 10, 48, 58, 48, 98, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 56, 58, 49, 58, 51,102, 58, - 51,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, - 46, 99, 32, 40, 98, 97,116,116,108,101, 32, 99,105,116,121, 41, 10, 98, - 116,108,101, 99,105,116,121, 58, 10, 48, 58, 51,101, 58, 54, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 51,102, 58, 49, 58, 48, 50, 58, 48, 50, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, 99, 32, 40,112,114, - 101,116,116,121, 32,115,111,108,100,105,101,114, 32,115, 97,105,108,101, - 114, 32,109,111,111,110, 41, 10,115, 97,105,108,111,114,109,110, 58, 10, - 115, 97,105,108,111,114,109,110,111, 58, 10,115, 97,105,108,111,114,109, - 110,104, 58, 10,115, 97,105,108,111,114,109,110,106, 58, 10,115, 97,105, - 108,111,114,109,110,107, 58, 10,115, 97,105,108,111,114,109,110,111,104, - 58, 10,115, 97,105,108,111,114,109,110,111,106, 58, 10,115, 97,105,108, - 111,114,109,110,111,107, 58, 10,115, 97,105,108,111,114,109,110,111,116, - 58, 10,115, 97,105,108,111,114,109,110,111,117, 58, 10,115, 97,105,108, - 111,114,109,110,116, 58, 10,115, 97,105,108,111,114,109,110,117, 58, 10, - 48, 58, 49, 48, 57, 52, 52,102, 58, 52, 55, 58, 48, 50, 58, 48, 53, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, 99, 32, 40,109, - 97,122,105,110,103,101,114, 32,122, 41, 10,109, 97,122,105,110,103,101, - 114, 58, 10,109, 97,122,105,110,103,101,114,106, 58, 10, 48, 58, 49, 48, - 48, 48, 50, 50, 58, 52, 51, 58, 48, 48, 58, 52,101, 10, 10, 59, 42, 42, - 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, 32, 40,109,115, 32,112, - 97, 99,109, 97,110, 32, 40, 98,111,111,116,108,101,103, 41, 10,109,115, - 112, 97, 99,109, 97, 98, 58, 10, 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, - 52, 48, 58, 52, 48, 10, 48, 48, 58, 52, 51, 68, 49, 58, 48, 49, 58, 52, - 56, 58, 52, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, - 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, 99,111,114, - 101, 95,118, 55, 46, 55, 32, 97,100,100,105,116,105,111,110,115, 32, 98, - 101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 42, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 112,117,108,105,114,117,108, 97, 32, 40,119,111,114,108,100, 41, 41, 13, + 10,112,117,108,105,114,117,108, 97, 58, 13, 10,112,117,108,105,114,117, + 108, 97,106, 58, 13, 10, 48, 58, 51, 48,100, 53, 56, 54, 58,102, 57, 58, + 48, 48, 58, 52, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 56, 48, 56, 48, 98,119, 46, 99, 32, 40,115,112, 97, 99,101, 32,115,116, + 114, 97,110,103,101,114, 32, 38, 32,115,112, 97, 99,101, 32,115,116,114, + 97,110,103,101,114, 32, 50, 41, 13, 10,115,115,116,114, 97,110,103,114, + 58, 13, 10,115,115,116,114, 97,110,103,114, 50, 58, 13, 10, 48, 58, 50, + 48,102, 52, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,115,101,103, 97, 46, 99, 32, 40,122,101,107,116, + 111,114, 32, 40,114,101,118,105,115,105,111,110, 32, 98, 41, 41, 13, 10, + 122,101,107,116,111,114, 58, 13, 10, 48, 58, 99, 57, 50, 52, 58, 51, 57, + 58, 57, 48, 58, 49, 48, 13, 10, 48, 58, 99,102,100, 50, 58,102, 58, 48, + 99, 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,101, + 99,111, 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101,116,116,101, + 58, 32, 97,115,116,114,111, 32,102, 97,110,116, 97,115,105, 97, 41, 13, + 10, 99, 97,115,116,102, 97,110,116, 58, 13, 10, 48, 58, 48, 98, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 56, 58, 49, 58, 51,102, 58, + 51,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110, + 101,115, 46, 99, 32, 40, 98, 97,116,116,108,101, 32, 99,105,116,121, 41, + 13, 10, 98,116,108,101, 99,105,116,121, 58, 13, 10, 48, 58, 51,101, 58, + 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51,102, 58, 49, 58, 48, 50, + 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118, + 101, 46, 99, 32, 40,112,114,101,116,116,121, 32,115,111,108,100,105,101, + 114, 32,115, 97,105,108,101,114, 32,109,111,111,110, 41, 13, 10,115, 97, + 105,108,111,114,109,110, 58, 13, 10,115, 97,105,108,111,114,109,110,111, + 58, 13, 10,115, 97,105,108,111,114,109,110,104, 58, 13, 10,115, 97,105, + 108,111,114,109,110,106, 58, 13, 10,115, 97,105,108,111,114,109,110,107, + 58, 13, 10,115, 97,105,108,111,114,109,110,111,104, 58, 13, 10,115, 97, + 105,108,111,114,109,110,111,106, 58, 13, 10,115, 97,105,108,111,114,109, + 110,111,107, 58, 13, 10,115, 97,105,108,111,114,109,110,111,116, 58, 13, + 10,115, 97,105,108,111,114,109,110,111,117, 58, 13, 10,115, 97,105,108, + 111,114,109,110,116, 58, 13, 10,115, 97,105,108,111,114,109,110,117, 58, + 13, 10, 48, 58, 49, 48, 57, 52, 52,102, 58, 52, 55, 58, 48, 50, 58, 48, + 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, + 99, 32, 40,109, 97,122,105,110,103,101,114, 32,122, 41, 13, 10,109, 97, + 122,105,110,103,101,114, 58, 13, 10,109, 97,122,105,110,103,101,114,106, + 58, 13, 10, 48, 58, 49, 48, 48, 48, 50, 50, 58, 52, 51, 58, 48, 48, 58, + 52,101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,112, 97, 99,109, 97, + 110, 46, 99, 32, 40,109,115, 32,112, 97, 99,109, 97,110, 32, 40, 98,111, + 111,116,108,101,103, 41, 13, 10,109,115,112, 97, 99,109, 97, 98, 58, 13, + 10, 48, 48, 58, 52, 69, 56, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 48, 58, 52, 51, 69, 68, 58, 48, 54, 58, 52, 48, 58, 52, 48, 13, + 10, 48, 48, 58, 52, 51, 68, 49, 58, 48, 49, 58, 52, 56, 58, 52, 56, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32, + 108, 97,116,101,115,116, 32, 58,104,105,103,104,115, 99,111,114,101, 95, + 118, 55, 46, 55, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108, + 111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,117,107,107,105, 49, 54, 46, 99, 32, 40,103,121, 97,107,117, 116,101,110, 33, 33, 32,112,117,122,122,108,101, 32, 98, 97,110, 99,104, - 111, 32, 40,106, 97,112, 97,110, 41, 10,112, 98, 97,110, 99,104,111, 58, - 10, 48, 58, 52, 48, 50,101, 49,102, 58, 51, 98, 58, 48, 49, 58, 48, 52, - 10, 48, 58, 52, 48, 48, 97,100, 51, 58, 51, 58, 48, 49, 58, 97, 48, 10, - 48, 58, 52, 48, 48, 98, 52, 49, 58, 51, 58, 48, 53, 58, 51, 50, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,119, 97,114,108,111,114,100, 46, - 99, 32, 40,119, 97,114,108,111,114,100, 41, 10,119, 97,114,108,111,114, - 100,115, 58, 10, 48, 58,102, 51, 58, 57, 58, 52,100, 58, 54, 49, 10, 48, - 58, 49, 50, 54, 58, 50, 58, 55, 53, 58, 55, 53, 10, 48, 58, 49, 50,100, - 58, 50, 58, 49, 51, 58, 50, 54, 10, 48, 58, 49, 51, 97, 58, 50, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,114, 97, - 118,117,115, 97, 46, 99, 32, 40,102,105,120, 41, 10,116,114, 97,118,114, - 117,115, 97, 58, 10,109,111,116,111,114, 97, 99,101, 58, 10,109,111,116, - 111,116,111,117,114, 58, 10,116,114, 97,118,114,117,115, 97, 98, 58, 10, - 48, 58,101, 48, 55, 99, 58, 52, 98, 58, 48, 48, 58, 49, 53, 10, 48, 58, - 101, 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, 32, 40,112,111,110, - 112,111,107,111, 41, 10,112,111,110,112,111,107,111, 58, 10,112,111,110, - 112,111,107,111,118, 58, 10, 99, 97,110,100,111,114,121, 58, 10, 48, 58, - 52, 99, 52, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52,101, 53, - 97, 58, 49, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 54, 99, 58, - 54, 58, 48,102, 58, 48, 48, 10, 48, 58, 52, 99, 53, 51, 58, 49, 58, 48, - 50, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105, - 116,111, 95,102, 51, 46, 99, 32, 40,103,101,107,105,114,105,110,100, 97, - 110, 32, 40,106, 97,112, 97,110, 41, 41, 10,103,101,107,105,114,105,100, - 110,106, 58, 10,103,101,107,105,114,105,100,110, 58, 10, 48, 58, 52, 48, - 56,101, 55, 50, 58, 55, 97, 58, 48, 48, 58, 48, 49, 10, 48, 58, 52, 48, - 56,101, 52, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, + 111, 32, 40,106, 97,112, 97,110, 41, 13, 10,112, 98, 97,110, 99,104,111, + 58, 13, 10, 48, 58, 52, 48, 50,101, 49,102, 58, 51, 98, 58, 48, 49, 58, + 48, 52, 13, 10, 48, 58, 52, 48, 48, 97,100, 51, 58, 51, 58, 48, 49, 58, + 97, 48, 13, 10, 48, 58, 52, 48, 48, 98, 52, 49, 58, 51, 58, 48, 53, 58, + 51, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,119, 97, + 114,108,111,114,100, 46, 99, 32, 40,119, 97,114,108,111,114,100, 41, 13, + 10,119, 97,114,108,111,114,100,115, 58, 13, 10, 48, 58,102, 51, 58, 57, + 58, 52,100, 58, 54, 49, 13, 10, 48, 58, 49, 50, 54, 58, 50, 58, 55, 53, + 58, 55, 53, 13, 10, 48, 58, 49, 50,100, 58, 50, 58, 49, 51, 58, 50, 54, + 13, 10, 48, 58, 49, 51, 97, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,114, 97,118,117,115, 97, 46, + 99, 32, 40,102,105,120, 41, 13, 10,116,114, 97,118,114,117,115, 97, 58, + 13, 10,109,111,116,111,114, 97, 99,101, 58, 13, 10,109,111,116,111,116, + 111,117,114, 58, 13, 10,116,114, 97,118,114,117,115, 97, 98, 58, 13, 10, + 48, 58,101, 48, 55, 99, 58, 52, 98, 58, 48, 48, 58, 49, 53, 13, 10, 48, + 58,101, 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, 32, 40, + 112,111,110,112,111,107,111, 41, 13, 10,112,111,110,112,111,107,111, 58, + 13, 10,112,111,110,112,111,107,111,118, 58, 13, 10, 99, 97,110,100,111, + 114,121, 58, 13, 10, 48, 58, 52, 99, 52, 48, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 52,101, 53, 97, 58, 49, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 48, 54, 99, 58, 54, 58, 48,102, 58, 48, 48, 13, 10, + 48, 58, 52, 99, 53, 51, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, + 99, 32, 40,103,101,107,105,114,105,110,100, 97,110, 32, 40,106, 97,112, + 97,110, 41, 41, 13, 10,103,101,107,105,114,105,100,110,106, 58, 13, 10, + 103,101,107,105,114,105,100,110, 58, 13, 10, 48, 58, 52, 48, 56,101, 55, + 50, 58, 55, 97, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 48, 56,101, + 52, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,116, 97,114,102,105,114,101, 46, 99, 32, 40,115, - 116, 97,114, 32,102,105,114,101, 41, 10,115,116, 97,114,102,105,114,101, - 58, 10, 48, 58, 56, 50, 98, 97, 58, 97, 53, 58, 48, 48, 58, 48, 48, 10, - 10,119,111,116,119, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116, - 104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102, - 111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32, - 101,110,116,114,121, 93, 10,119,111,116,119, 99, 58, 10, 48, 58, 48, 49, - 102, 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 49, 50, 97, - 58, 48, 54, 58, 48, 48, 58, 49,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,118,115,110,101,115, 46, 99, 32, 40,118,115, 46, 32,119,114,101, - 99,107,105,110,103, 32, 99,114,101,119, 41, 10,119,114,101, 99,107,105, - 110,103, 58, 10, 48, 58, 97, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 54, 48, 48, 48, 58, 49,101, 58, 48, 54, 58, 49, 54, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,117,110,105, 99,111, 49, 54, 46, 99, 32, 40, - 122,101,114,111, 32,112,111,105,110,116, 41, 10,122,101,114,111,112,110, - 116, 58, 10,122,101,114,111,112,110,116,106, 58, 10,122,101,114,111,112, - 110,116, 97, 58, 10, 48, 58,101,102, 49,101, 98, 52, 58, 50, 52, 58, 48, - 48, 58, 49, 48, 10, 48, 58,101,102, 49,102, 53, 56, 58, 50, 51, 58, 53, - 53, 58, 53, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,117,110,100, - 114,102,105,114,101, 46, 99, 32, 40,117,110,100,101,114, 32,102,105,114, - 101, 32, 40,119,111,114,108,100, 41, 41, 10,117,110,100,114,102,105,114, - 101, 58, 10, 48, 58, 50, 48,100,102, 97,102, 58, 55, 53, 58, 48, 56, 58, - 53, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99,111, 99, - 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101,116,116,101, 58, 32,112, - 114,111, 32,116,101,110,110,105,115, 32, 38, 32,119,111,114,108,100, 32, - 116,101,110,110,105,115, 41, 10, 99,112,116,101,110,110,105,115, 58, 10, - 119,116,101,110,110,105,115, 58, 10, 48, 58,100, 98, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 98, 50, 58, 49, 58,100, 97, 58,100, 97, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,109,117,110, 99,104,109,111, 46, 99, 32, - 40,106,111,121,102,117,108, 32,114,111, 97,100, 32, 47, 32,109,117,110, - 99,104, 32,109,111, 98,105,108,101, 41, 10,106,111,121,102,117,108,114, - 58, 10,109,110, 99,104,109,111, 98,108, 58, 10, 48, 58, 56, 49, 51, 97, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 51, 49, 51, 58, 54, 98, - 58, 51, 48, 58, 52, 98, 10, 48, 58, 56, 49, 51, 98, 58, 49, 58, 49, 48, - 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, - 46, 99, 32, 40,100,104, 97,114,109, 97, 32,100,111,117,106,111,117, 41, - 10,100,104, 97,114,109, 97, 58, 10,100,104, 97,114,109, 97,107, 58, 10, - 100,104, 97,114,109, 97,106, 58, 10, 48, 58, 52, 48,101, 51, 48, 50, 58, - 52, 98, 58, 48, 48, 58, 53, 97, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 116, 97,114, 32,102,105,114,101, 41, 13, 10,115,116, 97,114,102,105,114, + 101, 58, 13, 10, 48, 58, 56, 50, 98, 97, 58, 97, 53, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,119,111,116,119, 58, 32, 59, 91, 83,112,101, 99,105, + 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, + 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116, + 104,105,115, 32,101,110,116,114,121, 93, 13, 10,119,111,116,119, 99, 58, + 13, 10, 48, 58, 48, 49,102, 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 48, 49, 50, 97, 58, 48, 54, 58, 48, 48, 58, 49,101, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, 46, 99, + 32, 40,118,115, 46, 32,119,114,101, 99,107,105,110,103, 32, 99,114,101, + 119, 41, 13, 10,119,114,101, 99,107,105,110,103, 58, 13, 10, 48, 58, 97, + 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 48, 48, 58, + 49,101, 58, 48, 54, 58, 49, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,117,110,105, 99,111, 49, 54, 46, 99, 32, 40,122,101,114,111, + 32,112,111,105,110,116, 41, 13, 10,122,101,114,111,112,110,116, 58, 13, + 10,122,101,114,111,112,110,116,106, 58, 13, 10,122,101,114,111,112,110, + 116, 97, 58, 13, 10, 48, 58,101,102, 49,101, 98, 52, 58, 50, 52, 58, 48, + 48, 58, 49, 48, 13, 10, 48, 58,101,102, 49,102, 53, 56, 58, 50, 51, 58, + 53, 53, 58, 53, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 117,110,100,114,102,105,114,101, 46, 99, 32, 40,117,110,100,101,114, 32, + 102,105,114,101, 32, 40,119,111,114,108,100, 41, 41, 13, 10,117,110,100, + 114,102,105,114,101, 58, 13, 10, 48, 58, 50, 48,100,102, 97,102, 58, 55, + 53, 58, 48, 56, 58, 53, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115, + 101,116,116,101, 58, 32,112,114,111, 32,116,101,110,110,105,115, 32, 38, + 32,119,111,114,108,100, 32,116,101,110,110,105,115, 41, 13, 10, 99,112, + 116,101,110,110,105,115, 58, 13, 10,119,116,101,110,110,105,115, 58, 13, + 10, 48, 58,100, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 98, + 50, 58, 49, 58,100, 97, 58,100, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,109,117,110, 99,104,109,111, 46, 99, 32, 40,106,111,121,102, + 117,108, 32,114,111, 97,100, 32, 47, 32,109,117,110, 99,104, 32,109,111, + 98,105,108,101, 41, 13, 10,106,111,121,102,117,108,114, 58, 13, 10,109, + 110, 99,104,109,111, 98,108, 58, 13, 10, 48, 58, 56, 49, 51, 97, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 51, 49, 51, 58, 54, 98, 58, + 51, 48, 58, 52, 98, 13, 10, 48, 58, 56, 49, 51, 98, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,116, + 114,111, 46, 99, 32, 40,100,104, 97,114,109, 97, 32,100,111,117,106,111, + 117, 41, 13, 10,100,104, 97,114,109, 97, 58, 13, 10,100,104, 97,114,109, + 97,107, 58, 13, 10,100,104, 97,114,109, 97,106, 58, 13, 10, 48, 58, 52, + 48,101, 51, 48, 50, 58, 52, 98, 58, 48, 48, 58, 53, 97, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104, - 115, 99,111,114,101, 95,118, 55, 46, 54, 32, 97,100,100,105,116,105,111, - 110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122, - 101,114, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116, + 101,115,116, 32, 58,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, + 54, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, + 45, 32, 98,121, 32,108,101,101,122,101,114, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,115,104, 97,110,103,104, 97,105, 46, 99, 32, - 40,115,104, 97,110,103,104, 97,105, 32,105,105, 32, 40,106, 97,112, 97, - 110, 41, 41, 10,115,104, 97,110,103,104, 97, 50, 58, 10,115,104, 97,110, - 103,104, 97, 50, 97, 58, 10, 48, 58, 49, 56, 48, 98, 58, 98,101, 58, 57, - 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97, - 110,103,104, 97,105, 46, 99, 32, 40,115,104, 97,110,103,104, 97,105, 32, - 40,106, 97,112, 97,110, 41, 41, 10,115,104, 97,110,103,104, 97,105,106, - 58, 10,115,104, 97,110,103,104, 97,105, 58, 10, 48, 58, 50, 48, 49, 98, - 58, 98, 52, 58, 57, 48, 58, 49,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 42,116, 97,105,116,111, 95,108, 46, 99, 32, 40, 99, 97, 99,104, - 97,116, 32, 40,106, 97,112, 97,110, 41, 41, 10, 99, 97, 99,104, 97,116, - 58, 10, 48, 58, 56,100, 48,100, 58, 52, 99, 58, 52, 98, 58, 48, 48, 10, - 48, 58, 56,100, 53, 55, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99, 48, 46, 99, 32, 40, 98,111, - 117,108,100,101,114, 32,100, 97,115,104, 47, 98,111,117,108,100,101,114, - 32,100, 97,115,104, 32,112, 97,114,116, 32, 50, 32, 40,119,111,114,108, - 100, 41, 41, 10, 59, 32, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, - 32,117,112,100, 97,116,101,115, 32, 97,116, 32,115,116, 97,114,116, 32, - 111,102, 32,102,105,114,115,116, 32,103, 97,109,101, 32, 42, 42, 10, 98, - 111,117,108,100, 97,115,104, 58, 10, 48, 58, 51, 48, 54,100, 52,100, 58, - 52, 52, 58, 48, 48, 58, 53, 50, 10, 48, 58, 51, 48, 54, 97, 97, 49, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 42,103, 97,101,108, 99,111, 46, 99, 32, 40, 98,105,111,109,101, 99,104, - 97,110,105, 99, 97,108, 32,116,111,121, 32, 40,117,110,112,114,111,116, - 101, 99,116,101,100, 41, 41, 10, 59, 42, 42, 32,121,111,117, 32,109,117, - 115,116, 32,108,101,116, 32,116,104,101, 32,104,105,103,104,115, 99,111, - 114,101, 32,100,105,115,112,108, 97,121, 32,105,110, 32, 97,116,116,114, - 97, 99,116, 32,109,111,100,101, 32, 98,101,102,111,114,101, 32,115,116, - 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 32, 32, 42, 42, 32, - 10, 98,105,111,109,116,111,121, 58, 10, 98,105,111,109,116,111,121, 97, - 58, 10, 48, 58,102,102, 48, 55, 57, 52, 58, 49, 55, 58, 48, 54, 58, 50, - 101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,114,118,105, - 110,115, 46, 99, 32, 40,109, 97,114,118,105,110,115, 32,109, 97,122,101, - 41, 10,109, 97,114,118,105,110,115, 58, 10, 48, 58, 99, 50, 57, 48, 58, - 52, 54, 58, 48, 48, 58, 52, 98, 10, 48, 58, 99, 50, 56, 98, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 99, 50, 56, 99, 58, 49, 58, 48, 49, 58, - 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,111,117,116,114, - 117,110, 46, 99, 32, 40,115,117,112,101,114, 32,104, 97,110,103, 45,111, - 110, 32, 40, 98,111,111,116,108,101,103, 41, 41, 10,115,104, 97,110,103, - 111,110, 98, 58, 10,115,104, 97,110,103,111,110,114, 98, 58, 10,115,104, - 97,110,103,111,110,114,111, 58, 10, 48, 58, 50, 48,100, 52, 48, 48, 58, - 49, 98, 50, 58, 48, 49, 58, 48, 48, 10, 48, 58, 50, 48,100, 53, 97,100, - 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 50, 48,100, 54, 55, 56, 58, - 55, 48, 58, 57, 57, 58, 57, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,110, 97,109, 99,111,115, 50, 46, 99, 32, 40,100,114, 97,103,111,110, - 32,115, 97, 98,101,114, 41, 10,100,115, 97, 98,101,114, 58, 10,100,115, - 97, 98,101,114, 97, 58, 10, 48, 58, 49, 48, 56, 48, 56, 48, 58, 56, 99, - 58, 99,101, 58, 54, 48, 10, 48, 58, 49, 48, 56, 49, 57,101, 58, 52, 48, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 56, 49,100, 57, 58, 49, 58, - 55, 48, 58, 55, 48, 10, 10,100,115, 97, 98,101,114,106, 58, 10, 48, 58, - 49, 48, 56, 48, 56, 48, 58, 56, 99, 58, 99,101, 58, 57, 53, 10, 48, 58, - 49, 48, 56, 49, 57,101, 58, 52, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 49, 48, 56, 49,100, 57, 58, 49, 58, 55, 48, 58, 55, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,104,105,103,101,109, 97,114,117, 32, 40,112, - 105,114, 97,116,101, 32,115,104,105,112, 32,104,105,103,101,109, 97,114, - 117, 41, 10,104,105,103,101,109, 97,114,117, 58, 10, 48, 58,101,101, 48, - 48, 58, 56, 50, 58, 48, 48, 58, 52,102, 10, 48, 58,101,101, 57, 55, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 48, 52,101, 58, 55, 58, 50, - 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,114, - 97,100,117,107,101, 46, 99, 32, 40, 98, 97,114, 97,100,117,107,101, 41, - 10, 98, 97,114, 97,100,117,107,101, 58, 10, 97,108,105,101,110,115,101, - 99, 58, 10, 48, 58, 50, 56, 48, 58, 52, 57, 58, 48, 48, 58, 50, 48, 10, - 48, 58, 55, 52, 58, 51, 58, 48, 48, 58, 54, 53, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,101,120,116,114,101, - 109,101, 32,100,111,119,110,104,105,108,108, 32,118, 49, 46, 53, 41, 10, - 101,120,116,100,119,110,104,108, 58, 10, 48, 58, 50, 48, 50, 56, 54, 99, - 58, 50, 99, 52, 58, 52,100, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 97,116, 97,114,105,115,121,115, 49, 46, 99, 32, 40,105,110,100, - 105, 97,110, 97, 32,106,111,110,101,115, 32, 97,110,100, 32,116,104,101, - 32,116,101,109,112,108,101, 32,111,102, 32,100,111,111,109, 32, 40,115, - 101,116, 32, 49, 38, 52, 41, 41, 10,105,110,100,121,116,101,109,112, 58, - 10,105,110,100,121,116,101,109,112, 52, 58, 10,105,110,100,121,116,101, - 109,112,100, 58, 10,105,110,100,121,116,101,109,112, 50, 58, 10, 48, 58, - 52, 48, 49,101, 53, 54, 58, 51, 50, 58, 48, 49, 58, 49, 54, 10, 48, 58, - 52, 48, 48,102, 98,101, 58, 51, 50, 58, 48, 49, 58, 49, 54, 10, 10,105, - 110,100,121,116,101,109,112, 51, 58, 10, 48, 58, 52, 48, 49,101, 53, 54, - 58, 51, 50, 58, 48, 49, 58, 49, 54, 10, 48, 58, 52, 48, 49, 49, 53, 50, - 58, 51, 50, 58, 48, 49, 58, 49, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42,116,117,110,104,117,110,116, 46, 99, 32, 40,116,117,110,110,101,108, - 32,104,117,110,116, 41, 10,116,117,110,104,117,110,116, 58, 10,116,117, - 110,104,117,110,116, 99, 58, 10, 48, 58, 51, 48, 48, 58, 50, 48, 58, 48, - 48, 58, 52, 52, 10, 48, 58, 98, 48, 58, 49, 58, 48, 51, 58, 48, 51, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,109,104, 97,118,111, 99, 46, 99, 32, - 40,109, 97,106,111,114, 32,104, 97,118,111, 99, 32, 40,114,101,118, 32, - 51, 41, 41, 10,109,104, 97,118,111, 99, 58, 10, 48, 58, 49, 56, 52, 58, - 52, 54, 58, 48, 98, 58, 48, 48, 10, 48, 58, 57, 53, 58, 49, 58, 48, 50, - 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, - 50, 46, 99, 32, 40,122,117,110,122,117,110,107,121,111,117, 32,110,111, - 32,121, 97, 98,111,117, 32, 40,106, 97,112, 97,110, 41, 41, 10,122,117, - 110,107,121,111,117, 58, 10, 48, 58,102,102,102, 97, 48, 49, 58, 52,102, - 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,115,104, 97,110,103,104, 97,105, 46, 99, 32, 40,115,104, 97,110,103, + 104, 97,105, 32,105,105, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,115, + 104, 97,110,103,104, 97, 50, 58, 13, 10,115,104, 97,110,103,104, 97, 50, + 97, 58, 13, 10, 48, 58, 49, 56, 48, 98, 58, 98,101, 58, 57, 48, 58, 48, + 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97,110, + 103,104, 97,105, 46, 99, 32, 40,115,104, 97,110,103,104, 97,105, 32, 40, + 106, 97,112, 97,110, 41, 41, 13, 10,115,104, 97,110,103,104, 97,105,106, + 58, 13, 10,115,104, 97,110,103,104, 97,105, 58, 13, 10, 48, 58, 50, 48, + 49, 98, 58, 98, 52, 58, 57, 48, 58, 49,101, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,108, 46, 99, 32, 40, + 99, 97, 99,104, 97,116, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, 99, + 97, 99,104, 97,116, 58, 13, 10, 48, 58, 56,100, 48,100, 58, 52, 99, 58, + 52, 98, 58, 48, 48, 13, 10, 48, 58, 56,100, 53, 55, 58, 49, 58, 49, 48, + 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,100, + 101, 99, 48, 46, 99, 32, 40, 98,111,117,108,100,101,114, 32,100, 97,115, + 104, 47, 98,111,117,108,100,101,114, 32,100, 97,115,104, 32,112, 97,114, + 116, 32, 50, 32, 40,119,111,114,108,100, 41, 41, 13, 10, 59, 32, 42, 42, + 32,116,111,112, 32,115, 99,111,114,101, 32,117,112,100, 97,116,101,115, + 32, 97,116, 32,115,116, 97,114,116, 32,111,102, 32,102,105,114,115,116, + 32,103, 97,109,101, 32, 42, 42, 13, 10, 98,111,117,108,100, 97,115,104, + 58, 13, 10, 48, 58, 51, 48, 54,100, 52,100, 58, 52, 52, 58, 48, 48, 58, + 53, 50, 13, 10, 48, 58, 51, 48, 54, 97, 97, 49, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,103, 97, + 101,108, 99,111, 46, 99, 32, 40, 98,105,111,109,101, 99,104, 97,110,105, + 99, 97,108, 32,116,111,121, 32, 40,117,110,112,114,111,116,101, 99,116, + 101,100, 41, 41, 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, + 32,108,101,116, 32,116,104,101, 32,104,105,103,104,115, 99,111,114,101, + 32,100,105,115,112,108, 97,121, 32,105,110, 32, 97,116,116,114, 97, 99, + 116, 32,109,111,100,101, 32, 98,101,102,111,114,101, 32,115,116, 97,114, + 116,105,110,103, 32, 97, 32,103, 97,109,101, 32, 32, 42, 42, 13, 10, 98, + 105,111,109,116,111,121, 58, 13, 10, 98,105,111,109,116,111,121, 97, 58, + 13, 10, 48, 58,102,102, 48, 55, 57, 52, 58, 49, 55, 58, 48, 54, 58, 50, + 101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,114, + 118,105,110,115, 46, 99, 32, 40,109, 97,114,118,105,110,115, 32,109, 97, + 122,101, 41, 13, 10,109, 97,114,118,105,110,115, 58, 13, 10, 48, 58, 99, + 50, 57, 48, 58, 52, 54, 58, 48, 48, 58, 52, 98, 13, 10, 48, 58, 99, 50, + 56, 98, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 50, 56, 99, + 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 42,111,117,116,114,117,110, 46, 99, 32, 40,115,117,112,101, + 114, 32,104, 97,110,103, 45,111,110, 32, 40, 98,111,111,116,108,101,103, + 41, 41, 13, 10,115,104, 97,110,103,111,110, 98, 58, 13, 10,115,104, 97, + 110,103,111,110,114, 98, 58, 13, 10,115,104, 97,110,103,111,110,114,111, + 58, 13, 10, 48, 58, 50, 48,100, 52, 48, 48, 58, 49, 98, 50, 58, 48, 49, + 58, 48, 48, 13, 10, 48, 58, 50, 48,100, 53, 97,100, 58, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58, 50, 48,100, 54, 55, 56, 58, 55, 48, 58, 57, + 57, 58, 57, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, + 97,109, 99,111,115, 50, 46, 99, 32, 40,100,114, 97,103,111,110, 32,115, + 97, 98,101,114, 41, 13, 10,100,115, 97, 98,101,114, 58, 13, 10,100,115, + 97, 98,101,114, 97, 58, 13, 10, 48, 58, 49, 48, 56, 48, 56, 48, 58, 56, + 99, 58, 99,101, 58, 54, 48, 13, 10, 48, 58, 49, 48, 56, 49, 57,101, 58, + 52, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 56, 49,100, 57, + 58, 49, 58, 55, 48, 58, 55, 48, 13, 10, 13, 10,100,115, 97, 98,101,114, + 106, 58, 13, 10, 48, 58, 49, 48, 56, 48, 56, 48, 58, 56, 99, 58, 99,101, + 58, 57, 53, 13, 10, 48, 58, 49, 48, 56, 49, 57,101, 58, 52, 48, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 56, 49,100, 57, 58, 49, 58, 55, + 48, 58, 55, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,104, + 105,103,101,109, 97,114,117, 32, 40,112,105,114, 97,116,101, 32,115,104, + 105,112, 32,104,105,103,101,109, 97,114,117, 41, 13, 10,104,105,103,101, + 109, 97,114,117, 58, 13, 10, 48, 58,101,101, 48, 48, 58, 56, 50, 58, 48, + 48, 58, 52,102, 13, 10, 48, 58,101,101, 57, 55, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,100, 48, 52,101, 58, 55, 58, 50, 48, 58, 51, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,114, 97,100, + 117,107,101, 46, 99, 32, 40, 98, 97,114, 97,100,117,107,101, 41, 13, 10, + 98, 97,114, 97,100,117,107,101, 58, 13, 10, 97,108,105,101,110,115,101, + 99, 58, 13, 10, 48, 58, 50, 56, 48, 58, 52, 57, 58, 48, 48, 58, 50, 48, + 13, 10, 48, 58, 55, 52, 58, 51, 58, 48, 48, 58, 54, 53, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,101, + 120,116,114,101,109,101, 32,100,111,119,110,104,105,108,108, 32,118, 49, + 46, 53, 41, 13, 10,101,120,116,100,119,110,104,108, 58, 13, 10, 48, 58, + 50, 48, 50, 56, 54, 99, 58, 50, 99, 52, 58, 52,100, 58, 52, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 97,116, 97,114,105,115,121,115, + 49, 46, 99, 32, 40,105,110,100,105, 97,110, 97, 32,106,111,110,101,115, + 32, 97,110,100, 32,116,104,101, 32,116,101,109,112,108,101, 32,111,102, + 32,100,111,111,109, 32, 40,115,101,116, 32, 49, 38, 52, 41, 41, 13, 10, + 105,110,100,121,116,101,109,112, 58, 13, 10,105,110,100,121,116,101,109, + 112, 52, 58, 13, 10,105,110,100,121,116,101,109,112,100, 58, 13, 10,105, + 110,100,121,116,101,109,112, 50, 58, 13, 10, 48, 58, 52, 48, 49,101, 53, + 54, 58, 51, 50, 58, 48, 49, 58, 49, 54, 13, 10, 48, 58, 52, 48, 48,102, + 98,101, 58, 51, 50, 58, 48, 49, 58, 49, 54, 13, 10, 13, 10,105,110,100, + 121,116,101,109,112, 51, 58, 13, 10, 48, 58, 52, 48, 49,101, 53, 54, 58, + 51, 50, 58, 48, 49, 58, 49, 54, 13, 10, 48, 58, 52, 48, 49, 49, 53, 50, + 58, 51, 50, 58, 48, 49, 58, 49, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42,116,117,110,104,117,110,116, 46, 99, 32, 40,116,117,110,110, + 101,108, 32,104,117,110,116, 41, 13, 10,116,117,110,104,117,110,116, 58, + 13, 10,116,117,110,104,117,110,116, 99, 58, 13, 10, 48, 58, 51, 48, 48, + 58, 50, 48, 58, 48, 48, 58, 52, 52, 13, 10, 48, 58, 98, 48, 58, 49, 58, + 48, 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, + 104, 97,118,111, 99, 46, 99, 32, 40,109, 97,106,111,114, 32,104, 97,118, + 111, 99, 32, 40,114,101,118, 32, 51, 41, 41, 13, 10,109,104, 97,118,111, + 99, 58, 13, 10, 48, 58, 49, 56, 52, 58, 52, 54, 58, 48, 98, 58, 48, 48, + 13, 10, 48, 58, 57, 53, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, 50, 46, 99, 32, 40, + 122,117,110,122,117,110,107,121,111,117, 32,110,111, 32,121, 97, 98,111, + 117, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,122,117,110,107,121,111, + 117, 58, 13, 10, 48, 58,102,102,102, 97, 48, 49, 58, 52,102, 58, 48, 48, + 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, 99, 111,114,101, 95,118, 55, 46, 53, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, - 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 98,108,109, 98,121, 99, 97,114, 46, 99, 32, 40, 98, - 108,111,109, 98,121, 32, 99, 97,114, 41, 10, 59, 42, 42, 32,104,105,103, - 104,115, 99,111,114,101, 32,111,110,108,121, 32,115, 97,118,101,115, 32, - 44, 32,111,116,104,101,114, 32, 99,111,117,114,115,101, 32,104,105,103, - 104,115, 99,111,114,101,115, 32, 97,114,101, 32,110,111,116, 32,112,111, - 115,115,105, 98,108,101, 32, 42, 42, 10, 59, 42, 42, 32, 97,115, 32,116, - 104,101,121, 32,100,111,110, 96,116, 32,108,111, 97,100, 32,105,110, 32, - 117,110,116,105,108, 32,121,111,117, 32,102,105,110,105,115,104, 32, 97, - 32, 99,111,117,114,115,101, 32, 42, 42, 10, 98,108,109, 98,121, 99, 97, - 114, 58, 10, 98,108,109, 98,121, 99, 97,114,117, 58, 10, 48, 58,102,101, - 99,100, 98, 99, 58, 49, 49, 55, 58, 52,101, 58, 48, 56, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,119,105,108,108,105, 97,109,115, 46, 99, 32, - 40,109, 97,121,100, 97,121, 32, 40,115,101,116, 32, 49, 41, 41, 10,109, - 97,121,100, 97,121, 58, 10,109, 97,121,100, 97,121, 97, 58, 10,109, 97, - 121,100, 97,121, 98, 58, 10, 98, 97,116,108,122,111,110,101, 58, 10, 48, - 58, 98, 50, 54, 48, 58, 51, 99, 58, 48, 48, 58, 53, 53, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, 98, 49, 46, 99, 32, - 40,110,101, 98,117,108, 97,115, 32,114, 97,121, 32, 40,106, 97,112, 97, - 110, 41, 41, 10,110,101, 98,117,108,114, 97,121, 58, 10,110,101, 98,117, - 108,114, 97,121,106, 58, 10, 48, 58, 50, 50, 97, 55, 54, 57, 58, 56, 97, - 58, 50, 50, 58, 52, 99, 10, 48, 58, 50, 51, 98,101, 54, 97, 58, 52, 58, - 48, 48, 58, 97, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101, - 116,114,111, 46, 99, 32, 40,108, 97,100,121, 32,107,105,108,108,101,114, - 41, 10,108, 97,100,121,107,105,108,108, 58, 10,109,111,101,103,111,110, - 116, 97, 58, 10, 48, 58,102,102,101, 50, 48,102, 58, 54, 55, 58, 48, 48, - 58, 56, 99, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,101,120,122,105, - 115,117,115, 46, 99, 32, 40,101,120,122,105,115,117,115, 32, 40,106, 97, - 112, 97,110, 41, 41, 10,101,120,122,105,115,117,115, 58, 10,101,120,122, - 105,115,117,115, 97, 58, 10,101,120,122,105,115,117,115,116, 58, 10, 48, - 58,102, 56, 52, 48, 58, 51, 99, 58, 48, 48, 58, 52,102, 10, 59, 48, 58, - 99, 57, 99, 54, 58, 49, 58, 50, 48, 58, 50, 48, 10, 59, 48, 58, 99, 57, - 99, 97, 58, 49, 58, 50, 48, 58, 50, 48, 10, 59, 48, 58, 99, 57, 99,101, - 58, 49, 58, 48, 53, 58, 48, 53, 10, 59, 48, 58, 99, 57,100, 50, 58, 49, - 58, 48, 50, 58, 48, 50, 10, 59, 48, 58, 99, 57,100, 54, 58, 49, 58, 48, - 50, 58, 48, 50, 10, 59, 48, 58, 99, 57,100, 97, 58, 49, 58, 48, 53, 58, - 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97,115, - 121,115,101, 46, 99, 32, 40,116,114, 97,110,115,102,111,114,109,101,114, - 41, 10, 59, 42, 42, 32,115, 97,118,101,115, 32,116,111,112, 32, 49, 48, - 32,115, 99,111,114,101,115, 32,100,105,115,112,108, 97,121,101,100, 32, - 105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 42, 42, - 10,116,114, 97,110,115,102,114,109, 58, 10, 97,115,116,114,111,102,108, - 58, 10, 48, 58,102, 57, 48, 48, 58, 51, 55, 58, 48, 48, 58, 52, 98, 10, - 48, 58, 99, 48, 56, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 98,108,109, 98,121, 99, 97,114, 46, 99, + 32, 40, 98,108,111,109, 98,121, 32, 99, 97,114, 41, 13, 10, 59, 42, 42, + 32,104,105,103,104,115, 99,111,114,101, 32,111,110,108,121, 32,115, 97, + 118,101,115, 32, 44, 32,111,116,104,101,114, 32, 99,111,117,114,115,101, + 32,104,105,103,104,115, 99,111,114,101,115, 32, 97,114,101, 32,110,111, + 116, 32,112,111,115,115,105, 98,108,101, 32, 42, 42, 13, 10, 59, 42, 42, + 32, 97,115, 32,116,104,101,121, 32,100,111,110, 96,116, 32,108,111, 97, + 100, 32,105,110, 32,117,110,116,105,108, 32,121,111,117, 32,102,105,110, + 105,115,104, 32, 97, 32, 99,111,117,114,115,101, 32, 42, 42, 13, 10, 98, + 108,109, 98,121, 99, 97,114, 58, 13, 10, 98,108,109, 98,121, 99, 97,114, + 117, 58, 13, 10, 48, 58,102,101, 99,100, 98, 99, 58, 49, 49, 55, 58, 52, + 101, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119, + 105,108,108,105, 97,109,115, 46, 99, 32, 40,109, 97,121,100, 97,121, 32, + 40,115,101,116, 32, 49, 41, 41, 13, 10,109, 97,121,100, 97,121, 58, 13, + 10,109, 97,121,100, 97,121, 97, 58, 13, 10,109, 97,121,100, 97,121, 98, + 58, 13, 10, 98, 97,116,108,122,111,110,101, 58, 13, 10, 48, 58, 98, 50, + 54, 48, 58, 51, 99, 58, 48, 48, 58, 53, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, 98, 49, 46, 99, 32, 40, - 103,117,110, 32, 98,117,108,108,101,116, 32, 40,106, 97,112, 97,110, 41, - 41, 10,103,117,110, 98,117,108,101,116,106, 58, 10, 48, 58, 50, 49, 99, - 99,100, 52, 58, 54, 56, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42,115,101,103, 97,115,121,115,101, 46, 99, 32, 40,104, 97, - 110,103, 45,111,110, 32,106,114, 46, 41, 10,104, 97,110,103,111,110,106, - 114, 58, 10, 48, 58,100, 48, 48, 48, 58, 54, 57, 58, 48, 50, 58, 50, 99, - 10, 48, 58, 99, 48, 55,100, 58, 51, 58, 48, 50, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42,115,101,103, 97,115,121,115,101, 46, 99, 32, - 40,114,105,100,100,108,101, 32,111,102, 32,116,104,101, 32,112,121,112, - 104, 97,103,111,114, 97,115, 32, 40,106, 97,112, 97,110, 41, 41, 10,114, - 105,100,108,101,111,102,112, 58, 10, 48, 58,101, 50, 49, 53, 58, 99, 56, - 58, 48, 48, 58, 52,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,104, - 105,110, 97,103, 97,116, 46, 99, 32, 40, 99,104,105,110, 97, 32,103, 97, - 116,101, 32, 40,117,115, 41, 41, 10, 99,104,105,110, 97,103, 97,116, 58, - 10,115, 97,105,121,117,103,111,117, 98, 49, 58, 10,115, 97,105,121,117, - 103,111,117, 98, 50, 58, 10,115, 97,105,121,117,103,111,117, 58, 10, 48, - 58, 99, 56, 51, 58, 50, 51, 58, 48, 48, 58, 50, 49, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,117,110,105, 99,111, 49, 54, 46, 99, 32, 40, 98, - 117,114,103,108, 97,114, 32,120, 41, 10, 98,117,114,103,108, 97,114,120, - 58, 10, 48, 58,102,102, 50, 53, 50, 52, 58, 53, 97, 58, 48, 49, 58, 48, - 49, 10, 48, 58,102,102, 99,101, 55, 99, 58, 52, 58, 48, 49, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, 46, 99, 32, - 40,104,111,103, 97,110,115, 32, 97,108,108,101,121, 41, 10,104,111,103, - 97,108,108,101,121, 58, 10, 48, 58, 52, 97, 48, 58, 49, 57, 58, 49, 50, - 58, 50,102, 10, 48, 58, 52, 98,101, 58, 50, 58, 49, 50, 58, 50, 56, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 99,111, 98,114, 97, 46, 99, 32, - 40, 99, 97,108,105,112,115,111, 41, 10, 99, 97,108,105,112,115,111, 58, - 10, 48, 58, 56, 49, 99, 98, 58, 51, 99, 58, 48, 49, 58, 52, 53, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,102,111,111,100,102, 46, 99, 32, 40, - 102,111,111,100, 32,102,105,103,104,116, 41, 10,102,111,111,100,102, 58, - 10,102,111,111,100,102, 99, 58, 10,102,111,111,100,102, 50, 58, 10,102, - 111,111,100,102, 49, 58, 10, 48, 58, 49, 55, 98, 97, 56, 58, 50,100, 58, - 52, 97, 58, 52, 53, 10, 48, 58, 49, 55,102, 54, 52, 58, 51, 99, 58, 48, - 48, 58, 50,102, 10, 48, 58, 49, 56, 54, 48,101, 58, 55, 58, 51, 53, 58, - 97, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, + 110,101, 98,117,108, 97,115, 32,114, 97,121, 32, 40,106, 97,112, 97,110, + 41, 41, 13, 10,110,101, 98,117,108,114, 97,121, 58, 13, 10,110,101, 98, + 117,108,114, 97,121,106, 58, 13, 10, 48, 58, 50, 50, 97, 55, 54, 57, 58, + 56, 97, 58, 50, 50, 58, 52, 99, 13, 10, 48, 58, 50, 51, 98,101, 54, 97, + 58, 52, 58, 48, 48, 58, 97, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40,108, 97,100,121, 32,107, + 105,108,108,101,114, 41, 13, 10,108, 97,100,121,107,105,108,108, 58, 13, + 10,109,111,101,103,111,110,116, 97, 58, 13, 10, 48, 58,102,102,101, 50, + 48,102, 58, 54, 55, 58, 48, 48, 58, 56, 99, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,101,120,122,105,115,117,115, 46, 99, 32, 40,101, + 120,122,105,115,117,115, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,101, + 120,122,105,115,117,115, 58, 13, 10,101,120,122,105,115,117,115, 97, 58, + 13, 10,101,120,122,105,115,117,115,116, 58, 13, 10, 48, 58,102, 56, 52, + 48, 58, 51, 99, 58, 48, 48, 58, 52,102, 13, 10, 59, 48, 58, 99, 57, 99, + 54, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 59, 48, 58, 99, 57, 99, 97, + 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 59, 48, 58, 99, 57, 99,101, 58, + 49, 58, 48, 53, 58, 48, 53, 13, 10, 59, 48, 58, 99, 57,100, 50, 58, 49, + 58, 48, 50, 58, 48, 50, 13, 10, 59, 48, 58, 99, 57,100, 54, 58, 49, 58, + 48, 50, 58, 48, 50, 13, 10, 59, 48, 58, 99, 57,100, 97, 58, 49, 58, 48, + 53, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, + 101,103, 97,115,121,115,101, 46, 99, 32, 40,116,114, 97,110,115,102,111, + 114,109,101,114, 41, 13, 10, 59, 42, 42, 32,115, 97,118,101,115, 32,116, + 111,112, 32, 49, 48, 32,115, 99,111,114,101,115, 32,100,105,115,112,108, + 97,121,101,100, 32,105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111, + 100,101, 32, 42, 42, 13, 10,116,114, 97,110,115,102,114,109, 58, 13, 10, + 97,115,116,114,111,102,108, 58, 13, 10, 48, 58,102, 57, 48, 48, 58, 51, + 55, 58, 48, 48, 58, 52, 98, 13, 10, 48, 58, 99, 48, 56, 48, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, + 97,109, 99,111,110, 98, 49, 46, 99, 32, 40,103,117,110, 32, 98,117,108, + 108,101,116, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,103,117,110, 98, + 117,108,101,116,106, 58, 13, 10, 48, 58, 50, 49, 99, 99,100, 52, 58, 54, + 56, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42,115,101,103, 97,115,121,115,101, 46, 99, 32, 40,104, 97,110,103, 45, + 111,110, 32,106,114, 46, 41, 13, 10,104, 97,110,103,111,110,106,114, 58, + 13, 10, 48, 58,100, 48, 48, 48, 58, 54, 57, 58, 48, 50, 58, 50, 99, 13, + 10, 48, 58, 99, 48, 55,100, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97,115,121,115,101, 46, + 99, 32, 40,114,105,100,100,108,101, 32,111,102, 32,116,104,101, 32,112, + 121,112,104, 97,103,111,114, 97,115, 32, 40,106, 97,112, 97,110, 41, 41, + 13, 10,114,105,100,108,101,111,102,112, 58, 13, 10, 48, 58,101, 50, 49, + 53, 58, 99, 56, 58, 48, 48, 58, 52,101, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 99,104,105,110, 97,103, 97,116, 46, 99, 32, 40, 99,104, + 105,110, 97, 32,103, 97,116,101, 32, 40,117,115, 41, 41, 13, 10, 99,104, + 105,110, 97,103, 97,116, 58, 13, 10,115, 97,105,121,117,103,111,117, 98, + 49, 58, 13, 10,115, 97,105,121,117,103,111,117, 98, 50, 58, 13, 10,115, + 97,105,121,117,103,111,117, 58, 13, 10, 48, 58, 99, 56, 51, 58, 50, 51, + 58, 48, 48, 58, 50, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,117,110,105, 99,111, 49, 54, 46, 99, 32, 40, 98,117,114,103,108, 97, + 114, 32,120, 41, 13, 10, 98,117,114,103,108, 97,114,120, 58, 13, 10, 48, + 58,102,102, 50, 53, 50, 52, 58, 53, 97, 58, 48, 49, 58, 48, 49, 13, 10, + 48, 58,102,102, 99,101, 55, 99, 58, 52, 58, 48, 49, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, 46, 99, 32, + 40,104,111,103, 97,110,115, 32, 97,108,108,101,121, 41, 13, 10,104,111, + 103, 97,108,108,101,121, 58, 13, 10, 48, 58, 52, 97, 48, 58, 49, 57, 58, + 49, 50, 58, 50,102, 13, 10, 48, 58, 52, 98,101, 58, 50, 58, 49, 50, 58, + 50, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 99,111, 98, + 114, 97, 46, 99, 32, 40, 99, 97,108,105,112,115,111, 41, 13, 10, 99, 97, + 108,105,112,115,111, 58, 13, 10, 48, 58, 56, 49, 99, 98, 58, 51, 99, 58, + 48, 49, 58, 52, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 102,111,111,100,102, 46, 99, 32, 40,102,111,111,100, 32,102,105,103,104, + 116, 41, 13, 10,102,111,111,100,102, 58, 13, 10,102,111,111,100,102, 99, + 58, 13, 10,102,111,111,100,102, 50, 58, 13, 10,102,111,111,100,102, 49, + 58, 13, 10, 48, 58, 49, 55, 98, 97, 56, 58, 50,100, 58, 52, 97, 58, 52, + 53, 13, 10, 48, 58, 49, 55,102, 54, 52, 58, 51, 99, 58, 48, 48, 58, 50, + 102, 13, 10, 48, 58, 49, 56, 54, 48,101, 58, 55, 58, 51, 53, 58, 97, 53, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,110, 97, 49, 46, 99, 32, 40,101,109,101,114, 97,108,100,105, 97, 32, 40,106, - 97,112, 97,110, 41, 41, 10,101,109,101,114, 97,108,100, 97, 58, 10, 48, - 58, 57, 99, 57,101, 58, 49, 48,101, 58, 52, 98, 58, 48, 49, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40,112, - 117,108,115,116, 97,114, 41, 10,112,117,108,115,116, 97,114, 58, 10, 48, - 58, 49, 48, 48, 48, 48, 48, 58, 50, 99, 58, 48, 48, 58, 53, 56, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40, - 112,111,112, 32, 96,110, 32, 98,111,117,110, 99,101, 41, 10,112,111,112, - 98,111,117,110, 99, 58, 10, 48, 58, 49, 48, 48, 48, 48, 52, 58, 54, 52, - 56, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 109,101,116,114,111, 46, 99, 32, 40,112,111,105,116,116,111, 33, 41, 10, - 112,111,105,116,116,111, 58, 10, 48, 58, 52, 48,101, 51, 49, 97, 58, 52, - 101, 58, 48, 48, 58, 52, 49, 10, 48, 58, 52, 48,101, 50,101, 99, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48,101, 50,101,100, 58, 49, 58, - 48, 50, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,104, + 97,112, 97,110, 41, 41, 13, 10,101,109,101,114, 97,108,100, 97, 58, 13, + 10, 48, 58, 57, 99, 57,101, 58, 49, 48,101, 58, 52, 98, 58, 48, 49, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, + 99, 32, 40,112,117,108,115,116, 97,114, 41, 13, 10,112,117,108,115,116, + 97,114, 58, 13, 10, 48, 58, 49, 48, 48, 48, 48, 48, 58, 50, 99, 58, 48, + 48, 58, 53, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110,101, + 111,103,101,111, 46, 99, 32, 40,112,111,112, 32, 96,110, 32, 98,111,117, + 110, 99,101, 41, 13, 10,112,111,112, 98,111,117,110, 99, 58, 13, 10, 48, + 58, 49, 48, 48, 48, 48, 52, 58, 54, 52, 56, 58, 48, 48, 58, 48, 49, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, + 99, 32, 40,112,111,105,116,116,111, 33, 41, 13, 10,112,111,105,116,116, + 111, 58, 13, 10, 48, 58, 52, 48,101, 51, 49, 97, 58, 52,101, 58, 48, 48, + 58, 52, 49, 13, 10, 48, 58, 52, 48,101, 50,101, 99, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 52, 48,101, 50,101,100, 58, 49, 58, 48, 50, + 58, 48, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,104, 101,101,107,121,109,115, 46, 99, 32, 40, 99,104,101,101,107,121, 32,109, - 111,117,115,101, 41, 10, 99,104,101,101,107,121,109,115, 58, 10, 48, 58, - 51, 48, 48, 57, 58, 57, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 49, - 52, 58, 49, 58, 51, 54, 58, 51, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 99,105,110,101,109, 97,116, 46, 99, 32, 40,115,111,108, 97,114, - 32,113,117,101,115,116, 41, 10,115,111,108, 97,114,113, 58, 10, 48, 58, - 101, 48, 58, 53, 48, 58, 48, 56, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,109,101,103, 97,115,121,115, 49, 46, 99, 32, 40,115,111, - 108,100, 97,109, 32, 40,106, 97,112, 97,110, 41, 41, 10, 59, 42, 42, 32, - 121,111,117, 32,109,117,115,116, 32,108,101,116, 32,116,104,101, 32,103, - 97,109,101, 32,100,105,115,112,108, 97,121, 32,116,104,101, 32,104,105, - 103,104,115, 99,111,114,101, 32,105,110, 32, 97,116,116,114, 97, 99,116, - 32,109,111,100,101, 32, 98,101,102,111,114,101, 32, 42, 42, 10, 59, 42, - 42, 32,115,116, 97,114,116,105,110,103, 32, 97, 32,103, 97,109,101, 32, - 45, 32,106,117,115,116, 32,108,105,107,101, 32,105,110, 32,115,116, 97, - 114, 32,102,111,114, 99,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 42, 10, - 115,111,108,100, 97,109,106, 58, 10,115,111,108,100, 97,109, 58, 10, 48, - 58, 49,102, 48, 48, 98, 97, 58, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 49,102, 51,102, 98,101, 58, 50, 52, 97, 58, 48, 48, 58, 56, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,103,117,110,100,101, 97,108,114, 46, - 99, 32, 40,121, 97,109, 33, 32,121, 97,109, 33, 63, 41, 10,121, 97,109, - 121, 97,109, 58, 10,119,105,115,101,103,117,121, 58, 10,121, 97,109,121, - 97,109,107, 58, 10, 48, 58,101, 98, 97, 56, 58, 51,102, 58, 48, 48, 58, - 52,100, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, - 99, 32, 40,112, 97,110,103, 32,112,111,109,109,115, 41, 10,112, 97,110, - 103,112,111,109,115, 58, 10, 48, 58, 99, 48,100,101, 54, 51, 58, 55, 55, - 58, 49, 48, 58, 48, 49, 10, 10,112, 97,110,103,112,111,109,115,109, 58, - 10, 48, 58, 99, 48,100,101, 54, 51, 58, 55, 55, 58, 49, 48, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, - 51, 46, 99, 32, 40,112,117,122,122,108,101, 32, 98,111, 98, 98,108,101, - 32, 52, 32, 40,119,111,114,108,100, 41, 41, 10,112, 98,111, 98, 98,108, - 101, 52, 58, 10, 48, 58, 52, 48,101, 56, 53, 97, 58, 49, 49, 54, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 52, 48,101, 56, 98, 97, 58, 49, 58, 52, 49, - 58, 52, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,117,117,107, - 105, 49, 54, 46, 99, 32, 40,103,111, 32,103,111, 33, 32,109,105,108,101, - 32,115,109,105,108,101, 41, 10,103,111,103,111,109,105,108,101, 58, 10, - 48, 58, 52, 48, 54, 54, 48,100, 58, 49, 54, 49, 58, 48, 49, 58, 49, 52, - 10, 48, 58, 52, 48, 54, 54, 67, 70, 58, 49, 58, 48, 53, 58, 48, 53, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 49, 46, - 99, 32, 40,109, 97,114, 99,104,101,110, 32,109, 97,122,101, 32, 40,106, - 97,112, 97,110, 41, 41, 10,109,109, 97,122,101, 58, 10, 48, 58, 49, 50, - 99, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 50, 52, 49, 58, - 50, 55, 58, 48, 48, 58, 48, 49, 10, 48, 58, 49, 49, 48, 48, 58, 49, 58, - 57, 53, 58, 57, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 97,114,103, - 117,115, 46, 99, 32, 40, 98,117,116, 97,115, 97,110, 32, 40,106, 97,112, - 97,110, 41, 41, 10, 98,117,116, 97,115, 97,110,106, 58, 10, 98,117,116, - 97,115, 97,110, 58, 10, 48, 58,102, 97, 98, 48, 58, 49, 49, 48, 58, 48, - 48, 58, 48, 55, 10, 48, 58,102, 99, 97, 48, 58, 53, 58, 48, 48, 58, 48, - 48, 10, 48, 58,102, 99, 97, 50, 58, 49, 58, 48, 50, 58, 48, 50, 10, 10, - 59, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 49, 46, 99, 32, 40, - 112,117,122,122,108,101, 32, 99,108,117, 98, 32, 40,106, 97,112, 97,110, - 32,112,114,111,116,111,116,121,112,101, 41, 41, 10,112,117,122,108, 99, - 108,117, 98, 58, 10, 48, 58, 50, 52,102, 99, 58, 55, 99, 58, 48,102, 58, - 50,101, 10, 48, 58, 50, 54, 51,102, 58, 98,102, 58, 48,100, 58, 52, 53, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, - 32, 40,115,104,111, 99,107, 32,116,114,111,111,112,101,114,115, 41, 10, - 115,104,111, 99,107,116,114,111, 58, 10, 48, 58, 49, 48,101,102, 48, 52, - 58, 50, 55, 58, 48, 48, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42,116,111, 97,112,108, 97,110, 50, 46, 99, 32, 40,116,101,107,105, 32, - 112, 97,107,105, 41, 10,116,101,107,105,112, 97,107,105, 58, 10, 48, 58, - 56, 48, 48, 49, 51, 58, 51,102, 58, 48, 48, 58, 54, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,100, 99,111,110, 46, 99, 32, 40,100, 45, 99,111, - 110, 41, 10,100, 99,111,110, 58, 10, 48, 58, 56, 51, 49, 51, 56, 58, 54, - 52, 58, 53, 51, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,106, - 97, 99,107, 46, 99, 32, 40, 98,114,105,120, 32, 47, 32,122,122,121,122, - 122,121,120,120, 32,115,101,116, 32, 49, 38, 50, 41, 10, 98,114,105,120, - 58, 10,122,122,121,122,122,121,120,120, 58, 10,122,122,121,122,122,121, - 120,120, 50, 58, 10, 48, 58, 53, 49, 48, 48, 58, 50, 56, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 53, 52, 48, 48, 58, 49,101, 58, 57,100, 58, 97, 51, - 10, 48, 58, 53, 49, 50, 54, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42,115,104,111,111,116,111,117,116, 46, 99, 32, - 40,115,104,111,111,116, 32,111,117,116, 32, 40,117,115, 41, 41, 10,115, - 104,111,111,116,111,117,116, 58, 10, 48, 58, 50, 52, 97, 58, 52,101, 58, - 52, 52, 58, 54, 48, 10, 48, 58, 53, 51, 58, 51, 58, 48, 53, 58, 48, 48, - 10, 48, 58, 53, 52, 58, 49, 58, 56, 48, 58, 56, 48, 10, 10,115,104,111, - 111,116,111,117,116,106, 58, 10,115,104,111,111,116,111,117,116, 98, 58, - 10, 48, 58, 50, 52, 97, 58, 52,101, 58, 52, 52, 58, 54, 48, 10, 48, 58, - 53,102, 58, 51, 58, 48, 53, 58, 48, 48, 10, 48, 58, 54, 48, 58, 49, 58, - 56, 48, 58, 56, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,112, 97,110, + 111,117,115,101, 41, 13, 10, 99,104,101,101,107,121,109,115, 58, 13, 10, + 48, 58, 51, 48, 48, 57, 58, 57, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 51, 48, 49, 52, 58, 49, 58, 51, 54, 58, 51, 54, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 99,105,110,101,109, 97,116, 46, 99, 32, 40, + 115,111,108, 97,114, 32,113,117,101,115,116, 41, 13, 10,115,111,108, 97, + 114,113, 58, 13, 10, 48, 58,101, 48, 58, 53, 48, 58, 48, 56, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,115, + 121,115, 49, 46, 99, 32, 40,115,111,108,100, 97,109, 32, 40,106, 97,112, + 97,110, 41, 41, 13, 10, 59, 42, 42, 32,121,111,117, 32,109,117,115,116, + 32,108,101,116, 32,116,104,101, 32,103, 97,109,101, 32,100,105,115,112, + 108, 97,121, 32,116,104,101, 32,104,105,103,104,115, 99,111,114,101, 32, + 105,110, 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32, 98,101, + 102,111,114,101, 32, 42, 42, 13, 10, 59, 42, 42, 32,115,116, 97,114,116, + 105,110,103, 32, 97, 32,103, 97,109,101, 32, 45, 32,106,117,115,116, 32, + 108,105,107,101, 32,105,110, 32,115,116, 97,114, 32,102,111,114, 99,101, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 42, 42, 13, 10,115,111,108,100, 97,109, + 106, 58, 13, 10,115,111,108,100, 97,109, 58, 13, 10, 48, 58, 49,102, 48, + 48, 98, 97, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49,102, 51, + 102, 98,101, 58, 50, 52, 97, 58, 48, 48, 58, 56, 49, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,103,117,110,100,101, 97,108,114, 46, 99, + 32, 40,121, 97,109, 33, 32,121, 97,109, 33, 63, 41, 13, 10,121, 97,109, + 121, 97,109, 58, 13, 10,119,105,115,101,103,117,121, 58, 13, 10,121, 97, + 109,121, 97,109,107, 58, 13, 10, 48, 58,101, 98, 97, 56, 58, 51,102, 58, + 48, 48, 58, 52,100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,109, + 101,116,114,111, 46, 99, 32, 40,112, 97,110,103, 32,112,111,109,109,115, + 41, 13, 10,112, 97,110,103,112,111,109,115, 58, 13, 10, 48, 58, 99, 48, + 100,101, 54, 51, 58, 55, 55, 58, 49, 48, 58, 48, 49, 13, 10, 13, 10,112, + 97,110,103,112,111,109,115,109, 58, 13, 10, 48, 58, 99, 48,100,101, 54, + 51, 58, 55, 55, 58, 49, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40,112, + 117,122,122,108,101, 32, 98,111, 98, 98,108,101, 32, 52, 32, 40,119,111, + 114,108,100, 41, 41, 13, 10,112, 98,111, 98, 98,108,101, 52, 58, 13, 10, + 48, 58, 52, 48,101, 56, 53, 97, 58, 49, 49, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 48,101, 56, 98, 97, 58, 49, 58, 52, 49, 58, 52, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,117,117,107,105, + 49, 54, 46, 99, 32, 40,103,111, 32,103,111, 33, 32,109,105,108,101, 32, + 115,109,105,108,101, 41, 13, 10,103,111,103,111,109,105,108,101, 58, 13, + 10, 48, 58, 52, 48, 54, 54, 48,100, 58, 49, 54, 49, 58, 48, 49, 58, 49, + 52, 13, 10, 48, 58, 52, 48, 54, 54, 67, 70, 58, 49, 58, 48, 53, 58, 48, + 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99, + 111,115, 49, 46, 99, 32, 40,109, 97,114, 99,104,101,110, 32,109, 97,122, + 101, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,109,109, 97,122,101, 58, + 13, 10, 48, 58, 49, 50, 99, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 49, 50, 52, 49, 58, 50, 55, 58, 48, 48, 58, 48, 49, 13, 10, 48, + 58, 49, 49, 48, 48, 58, 49, 58, 57, 53, 58, 57, 53, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 97,114,103,117,115, 46, 99, 32, 40, 98,117, + 116, 97,115, 97,110, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, 98,117, + 116, 97,115, 97,110,106, 58, 13, 10, 98,117,116, 97,115, 97,110, 58, 13, + 10, 48, 58,102, 97, 98, 48, 58, 49, 49, 48, 58, 48, 48, 58, 48, 55, 13, + 10, 48, 58,102, 99, 97, 48, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,102, 99, 97, 50, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 49, 46, 99, 32, 40,112, + 117,122,122,108,101, 32, 99,108,117, 98, 32, 40,106, 97,112, 97,110, 32, + 112,114,111,116,111,116,121,112,101, 41, 41, 13, 10,112,117,122,108, 99, + 108,117, 98, 58, 13, 10, 48, 58, 50, 52,102, 99, 58, 55, 99, 58, 48,102, + 58, 50,101, 13, 10, 48, 58, 50, 54, 51,102, 58, 98,102, 58, 48,100, 58, + 52, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110,101,111,103, + 101,111, 46, 99, 32, 40,115,104,111, 99,107, 32,116,114,111,111,112,101, + 114,115, 41, 13, 10,115,104,111, 99,107,116,114,111, 58, 13, 10, 48, 58, + 49, 48,101,102, 48, 52, 58, 50, 55, 58, 48, 48, 58, 48, 56, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42,116,111, 97,112,108, 97,110, 50, 46, + 99, 32, 40,116,101,107,105, 32,112, 97,107,105, 41, 13, 10,116,101,107, + 105,112, 97,107,105, 58, 13, 10, 48, 58, 56, 48, 48, 49, 51, 58, 51,102, + 58, 48, 48, 58, 54, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 100, 99,111,110, 46, 99, 32, 40,100, 45, 99,111,110, 41, 13, 10,100, 99, + 111,110, 58, 13, 10, 48, 58, 56, 51, 49, 51, 56, 58, 54, 52, 58, 53, 51, + 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,106, 97, 99, + 107, 46, 99, 32, 40, 98,114,105,120, 32, 47, 32,122,122,121,122,122,121, + 120,120, 32,115,101,116, 32, 49, 38, 50, 41, 13, 10, 98,114,105,120, 58, + 13, 10,122,122,121,122,122,121,120,120, 58, 13, 10,122,122,121,122,122, + 121,120,120, 50, 58, 13, 10, 48, 58, 53, 49, 48, 48, 58, 50, 56, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 53, 52, 48, 48, 58, 49,101, 58, 57,100, + 58, 97, 51, 13, 10, 48, 58, 53, 49, 50, 54, 58, 49, 58, 53, 48, 58, 53, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,104,111,111,116, + 111,117,116, 46, 99, 32, 40,115,104,111,111,116, 32,111,117,116, 32, 40, + 117,115, 41, 41, 13, 10,115,104,111,111,116,111,117,116, 58, 13, 10, 48, + 58, 50, 52, 97, 58, 52,101, 58, 52, 52, 58, 54, 48, 13, 10, 48, 58, 53, + 51, 58, 51, 58, 48, 53, 58, 48, 48, 13, 10, 48, 58, 53, 52, 58, 49, 58, + 56, 48, 58, 56, 48, 13, 10, 13, 10,115,104,111,111,116,111,117,116,106, + 58, 13, 10,115,104,111,111,116,111,117,116, 98, 58, 13, 10, 48, 58, 50, + 52, 97, 58, 52,101, 58, 52, 52, 58, 54, 48, 13, 10, 48, 58, 53,102, 58, + 51, 58, 48, 53, 58, 48, 48, 13, 10, 48, 58, 54, 48, 58, 49, 58, 56, 48, + 58, 56, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112, 97,110, 100,111,114, 97,115, 46, 99, 32, 40,112, 97,110,100,111,114, 97,115, 32, - 112, 97,108, 97, 99,101, 41, 10,112, 97,110,100,111,114, 97,115, 58, 10, - 48, 58, 54, 49, 48, 48, 58, 50,100, 58, 49, 56, 58, 50, 48, 10, 48, 58, - 54, 48,100, 48, 58, 52, 58, 48, 48, 58, 53, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, 32, 40,100,114,101, - 97,109, 32,115,104,111,112,112,101,114, 41, 10,100,114,101,109,115,104, - 112,114, 58, 10, 48, 58, 52, 99, 48, 48, 58,102, 48, 58, 48, 48, 58, 48, - 49, 10, 48, 58, 52, 56, 48, 56, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 52, 56, 48, 57, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40,110, 97, - 109, 45, 49, 57, 55, 53, 41, 10,110, 97,109, 49, 57, 55, 53, 58, 10, 48, - 58, 49, 48, 48, 48, 52, 48, 58, 52,102, 58, 48, 48, 58, 52, 98, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, - 99, 32, 40,116,104,117,110,100,101,114, 32,102,111,120, 32, 40,106, 97, - 112, 97,110, 41, 41, 10,116,104,117,110,100,102,111,120, 58, 10,116,104, - 117,110,100,102,111,120,106, 58, 10,116,104,117,110,100,102,111,120,117, - 58, 10, 48, 58, 51, 48, 51, 98, 50, 99, 58, 51, 50, 58, 48, 48, 58, 52, - 57, 10, 48, 58, 51, 48, 51, 99, 53, 54, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 51, 48, 51, 98, 53, 57, 58, 49, 58, 48, 49, 58, 48, 49, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,104, 97,109,112, 98, 97,115, - 46, 99, 32, 40, 99,104, 97,109,112,105,111,110, 32, 98, 97,115,101, 98, - 97,108,108, 32, 40,102,105,120, 41, 41, 10, 99,104, 97,109,112, 98, 97, - 115, 58, 10, 48, 58, 56, 99, 51, 48, 58, 50,102, 58, 52, 48, 58, 48, 48, - 10, 48, 58, 56, 99, 53, 99, 58, 49, 58, 48, 53, 58, 48, 53, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, 99, 32, 40,100, 97, - 110,103,117,110, 32,102,101,118,101,114,111,110, 32, 40,106, 97,112, 97, - 110, 41, 41, 10,100,102,101,118,101,114,111,110, 58, 10,102,101,118,101, - 114,115,111,115, 58, 10, 48, 58, 49, 48, 51,101, 98, 52, 58, 49, 54,100, - 58, 48, 50, 58, 48, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, - 97,118,101, 46, 99, 32, 40,103,117,119, 97,110,103,101, 32, 40,106, 97, - 112, 97,110, 41, 41, 10,103,117,119, 97,110,103,101, 58, 10, 48, 58, 50, - 48, 50, 52,102, 48, 58, 49, 52, 48, 58, 48, 48, 58, 49, 48, 10, 48, 58, - 50, 48, 50, 52, 97, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,103,117, - 119, 97,110,103,101,115, 58, 10, 48, 58, 50, 48, 50, 52,102, 97, 58, 49, - 52, 48, 58, 48, 58, 49, 48, 10, 48, 58, 50, 48, 50, 52, 98, 54, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, - 97,109, 99,111,115, 49, 46, 99, 32, 40, 98,108, 97,122,101,114, 32, 40, - 106, 97,112, 97,110, 41, 41, 10, 98,108, 97,122,101,114, 58, 10, 48, 58, - 51, 48, 97,100, 58, 53,102, 58, 48, 48, 58, 50, 48, 10, 48, 58, 50, 56, - 56, 56, 58, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 56, 56, 98, 58, - 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, - 101,111,103,101,111, 46, 99, 32, 40, 97,101,114,111, 32,102,105,103,104, - 116,101,114,115, 32, 51, 47,115,111,110,105, 99, 32,119,105,110,103,115, - 32, 51, 41, 10,115,111,110,105, 99,119,105, 51, 58, 10, 48, 58, 49, 48, - 48, 48, 48, 99, 58, 99,102, 58, 52, 98, 58, 50, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40, 97,101, - 114,111, 32,102,105,103,104,116,101,114,115, 32, 50, 47,115,111,110,105, - 99, 32,119,105,110,103,115, 32, 50, 41, 10,115,111,110,105, 99,119,105, - 50, 58, 10, 48, 58, 49, 48, 48, 48, 48,101, 58, 53, 50, 58, 52, 56, 58, - 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,101, 99, 48, 46, 99, - 32, 40,109,105,100,110,105,103,104,116, 32,114,101,115,105,115,116, 97, - 110, 99,101, 32, 40,119,111,114,108,100, 32, 38, 32,117,115, 41, 41, 10, - 109,105,100,114,101,115, 58, 10,109,105,100,114,101,115,117, 58, 10,109, - 105,100,114,101,115, 98, 58, 10,109,105,100,114,101,115, 98,106, 58, 10, - 48, 58, 49, 48, 50, 54,101, 97, 58, 53, 48, 58, 48, 48, 58, 50, 54, 10, - 48, 58, 49, 48, 50, 55, 49, 48, 58, 49, 58, 55, 56, 58, 55, 56, 10, 10, - 109,105,100,114,101,115,106, 58, 10, 48, 58, 49, 48, 50, 54,101, 99, 58, - 53, 48, 58, 48, 48, 58, 50, 54, 10, 48, 58, 49, 48, 50, 55, 49, 50, 58, - 49, 58, 55, 56, 58, 55, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 118,115,110,101,115, 46, 99, 32, 40,116,104,101, 32,103,111,111,110,105, - 101,115, 41, 10,103,111,111,110,105,101,115, 58, 10, 48, 58, 55,102, 48, - 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 112, 97,108, 97, 99,101, 41, 13, 10,112, 97,110,100,111,114, 97,115, 58, + 13, 10, 48, 58, 54, 49, 48, 48, 58, 50,100, 58, 49, 56, 58, 50, 48, 13, + 10, 48, 58, 54, 48,100, 48, 58, 52, 58, 48, 48, 58, 53, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112, 97, 99,109, 97,110, 46, 99, + 32, 40,100,114,101, 97,109, 32,115,104,111,112,112,101,114, 41, 13, 10, + 100,114,101,109,115,104,112,114, 58, 13, 10, 48, 58, 52, 99, 48, 48, 58, + 102, 48, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 56, 48, 56, 58, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 56, 48, 57, 58, 49, 58, 48, + 51, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, + 101,111,103,101,111, 46, 99, 32, 40,110, 97,109, 45, 49, 57, 55, 53, 41, + 13, 10,110, 97,109, 49, 57, 55, 53, 58, 13, 10, 48, 58, 49, 48, 48, 48, + 52, 48, 58, 52,102, 58, 48, 48, 58, 52, 98, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 50, 46, 99, 32, 40, + 116,104,117,110,100,101,114, 32,102,111,120, 32, 40,106, 97,112, 97,110, + 41, 41, 13, 10,116,104,117,110,100,102,111,120, 58, 13, 10,116,104,117, + 110,100,102,111,120,106, 58, 13, 10,116,104,117,110,100,102,111,120,117, + 58, 13, 10, 48, 58, 51, 48, 51, 98, 50, 99, 58, 51, 50, 58, 48, 48, 58, + 52, 57, 13, 10, 48, 58, 51, 48, 51, 99, 53, 54, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 48, 51, 98, 53, 57, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,104, 97, + 109,112, 98, 97,115, 46, 99, 32, 40, 99,104, 97,109,112,105,111,110, 32, + 98, 97,115,101, 98, 97,108,108, 32, 40,102,105,120, 41, 41, 13, 10, 99, + 104, 97,109,112, 98, 97,115, 58, 13, 10, 48, 58, 56, 99, 51, 48, 58, 50, + 102, 58, 52, 48, 58, 48, 48, 13, 10, 48, 58, 56, 99, 53, 99, 58, 49, 58, + 48, 53, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 99, 97,118,101, 46, 99, 32, 40,100, 97,110,103,117,110, 32,102,101,118, + 101,114,111,110, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,100,102,101, + 118,101,114,111,110, 58, 13, 10,102,101,118,101,114,115,111,115, 58, 13, + 10, 48, 58, 49, 48, 51,101, 98, 52, 58, 49, 54,100, 58, 48, 50, 58, 48, + 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, + 46, 99, 32, 40,103,117,119, 97,110,103,101, 32, 40,106, 97,112, 97,110, + 41, 41, 13, 10,103,117,119, 97,110,103,101, 58, 13, 10, 48, 58, 50, 48, + 50, 52,102, 48, 58, 49, 52, 48, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, + 50, 48, 50, 52, 97, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 103,117,119, 97,110,103,101,115, 58, 13, 10, 48, 58, 50, 48, 50, 52,102, + 97, 58, 49, 52, 48, 58, 48, 58, 49, 48, 13, 10, 48, 58, 50, 48, 50, 52, + 98, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 49, 46, 99, 32, 40, 98,108, + 97,122,101,114, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10, 98,108, 97, + 122,101,114, 58, 13, 10, 48, 58, 51, 48, 97,100, 58, 53,102, 58, 48, 48, + 58, 50, 48, 13, 10, 48, 58, 50, 56, 56, 56, 58, 56, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 50, 56, 56, 98, 58, 49, 58, 48, 51, 58, 48, 51, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, + 99, 32, 40, 97,101,114,111, 32,102,105,103,104,116,101,114,115, 32, 51, + 47,115,111,110,105, 99, 32,119,105,110,103,115, 32, 51, 41, 13, 10,115, + 111,110,105, 99,119,105, 51, 58, 13, 10, 48, 58, 49, 48, 48, 48, 48, 99, + 58, 99,102, 58, 52, 98, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40, 97,101,114,111, + 32,102,105,103,104,116,101,114,115, 32, 50, 47,115,111,110,105, 99, 32, + 119,105,110,103,115, 32, 50, 41, 13, 10,115,111,110,105, 99,119,105, 50, + 58, 13, 10, 48, 58, 49, 48, 48, 48, 48,101, 58, 53, 50, 58, 52, 56, 58, + 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,100,101, 99, 48, + 46, 99, 32, 40,109,105,100,110,105,103,104,116, 32,114,101,115,105,115, + 116, 97,110, 99,101, 32, 40,119,111,114,108,100, 32, 38, 32,117,115, 41, + 41, 13, 10,109,105,100,114,101,115, 58, 13, 10,109,105,100,114,101,115, + 117, 58, 13, 10,109,105,100,114,101,115, 98, 58, 13, 10,109,105,100,114, + 101,115, 98,106, 58, 13, 10, 48, 58, 49, 48, 50, 54,101, 97, 58, 53, 48, + 58, 48, 48, 58, 50, 54, 13, 10, 48, 58, 49, 48, 50, 55, 49, 48, 58, 49, + 58, 55, 56, 58, 55, 56, 13, 10, 13, 10,109,105,100,114,101,115,106, 58, + 13, 10, 48, 58, 49, 48, 50, 54,101, 99, 58, 53, 48, 58, 48, 48, 58, 50, + 54, 13, 10, 48, 58, 49, 48, 50, 55, 49, 50, 58, 49, 58, 55, 56, 58, 55, + 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110,101, + 115, 46, 99, 32, 40,116,104,101, 32,103,111,111,110,105,101,115, 41, 13, + 10,103,111,111,110,105,101,115, 58, 13, 10, 48, 58, 55,102, 48, 58, 51, + 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,108,112,104, 97, 54, 56,107, 46, 99, 32, 40,116,105,109,101, 32, 115,111,108,100,105,101,114,115, 32, 40,117,115, 32,114,101,118, 32, 51, - 41, 41, 10, 59, 42, 42, 32,105,103,110,111,114,101, 32,102,105,114,115, - 116, 32,104,105,103,104,115, 99,111,114,101, 32,115, 99,114,101,101,110, - 44, 32,117,112,100, 97,116,101,115, 32,111,110, 32,110,101,120,116, 32, - 104,105,103,104,115, 99,111,114,101, 32,115,104,111,119, 32, 33, 33, 32, - 42, 42, 10,116,105,109,101,115,111,108,100, 58, 10,116,105,109,101,115, - 111,108,100, 49, 58, 10, 48, 58, 50, 48, 52, 49, 48, 49, 58, 98,102, 58, - 48, 48, 58, 48, 99, 10, 48, 58, 52, 48, 48, 51, 48, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 52, 48, 48, 51, 99, 58, 49, 58, 48, 50, 58, 48, - 50, 10, 48, 58, 52, 48, 48, 51,100, 58, 49, 58, 48, 57, 58, 48, 57, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 66, 97,116,116,108,101, 32, 70,105,101, - 108,100, 32, 40, 98,111,111,116,108,101,103, 41, 10, 98,116,108,102,105, - 101,108,100, 98, 58, 10, 98,116,108,102,105,101,108,100, 58, 10, 48, 58, - 52, 48, 48, 51, 48, 58, 52, 58, 48, 48, 58, 55, 48, 10, 48, 58, 50, 48, - 52, 49, 48, 49, 58, 98,102, 58, 48, 48, 58, 48, 99, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,118,115,110,101,115, 46, 99, 32, 40, 99,108,117, - 32, 99,108,117, 32,108, 97,110,100, 41, 10, 99,108,117, 99,108,117, 58, - 10, 48, 58, 55, 53, 49, 58, 52,102, 58, 49,100, 58, 55, 48, 10, 48, 58, - 49, 57, 58, 51, 58, 48, 53, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 97,101,114,111,102,103,116, 46, 99, 32, 40,116,117,114, 98, - 111, 32,102,111,114, 99,101, 41, 10,116,117,114, 98,111,102,114, 99, 58, - 10, 48, 58, 99, 50, 50, 49, 98, 58, 52,101, 58, 48, 52, 58, 53, 52, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, - 99, 32, 40,116,119,105,110, 32,113,105,120, 40,117,115, 32,112,114,111, - 116,111,116,121,112,101, 41, 10,116,119,105,110,113,105,120, 58, 10, 48, - 58, 52, 48, 54, 98, 54,102, 58, 57, 98, 58, 48, 48, 58, 53, 52, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 41, 41, 13, 10, 59, 42, 42, 32,105,103,110,111,114,101, 32,102,105,114, + 115,116, 32,104,105,103,104,115, 99,111,114,101, 32,115, 99,114,101,101, + 110, 44, 32,117,112,100, 97,116,101,115, 32,111,110, 32,110,101,120,116, + 32,104,105,103,104,115, 99,111,114,101, 32,115,104,111,119, 32, 33, 33, + 32, 42, 42, 13, 10,116,105,109,101,115,111,108,100, 58, 13, 10,116,105, + 109,101,115,111,108,100, 49, 58, 13, 10, 48, 58, 50, 48, 52, 49, 48, 49, + 58, 98,102, 58, 48, 48, 58, 48, 99, 13, 10, 48, 58, 52, 48, 48, 51, 48, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 48, 51, 99, 58, + 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, 58, 52, 48, 48, 51,100, 58, 49, + 58, 48, 57, 58, 48, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 66, + 97,116,116,108,101, 32, 70,105,101,108,100, 32, 40, 98,111,111,116,108, + 101,103, 41, 13, 10, 98,116,108,102,105,101,108,100, 98, 58, 13, 10, 98, + 116,108,102,105,101,108,100, 58, 13, 10, 48, 58, 52, 48, 48, 51, 48, 58, + 52, 58, 48, 48, 58, 55, 48, 13, 10, 48, 58, 50, 48, 52, 49, 48, 49, 58, + 98,102, 58, 48, 48, 58, 48, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,118,115,110,101,115, 46, 99, 32, 40, 99,108,117, 32, 99,108, + 117, 32,108, 97,110,100, 41, 13, 10, 99,108,117, 99,108,117, 58, 13, 10, + 48, 58, 55, 53, 49, 58, 52,102, 58, 49,100, 58, 55, 48, 13, 10, 48, 58, + 49, 57, 58, 51, 58, 48, 53, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 97,101,114,111,102,103,116, 46, 99, 32, 40,116,117, + 114, 98,111, 32,102,111,114, 99,101, 41, 13, 10,116,117,114, 98,111,102, + 114, 99, 58, 13, 10, 48, 58, 99, 50, 50, 49, 98, 58, 52,101, 58, 48, 52, + 58, 53, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,116, 97,105, + 116,111, 95,102, 51, 46, 99, 32, 40,116,119,105,110, 32,113,105,120, 40, + 117,115, 32,112,114,111,116,111,116,121,112,101, 41, 13, 10,116,119,105, + 110,113,105,120, 58, 13, 10, 48, 58, 52, 48, 54, 98, 54,102, 58, 57, 98, + 58, 48, 48, 58, 53, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101, - 115,116, 32, 58,104,105,103,104,115, 99,111,114,101, 95,118, 55, 46, 52, - 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, - 32, 98,121, 32,108,101,101,122,101,114, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103, + 104,115, 99,111,114,101, 95,118, 55, 46, 52, 32, 97,100,100,105,116,105, + 111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101, + 122,101,114, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,111,109, - 111,107,111, 46, 99, 32, 40,109,111,109,111,107,111, 32, 49, 50, 48, 37, - 41, 10,109,111,109,111,107,111, 58, 10, 48, 58, 99,101, 48, 49, 58, 57, - 102, 58, 50, 48, 58, 50, 48, 10, 48, 58, 99, 48, 52, 57, 58, 55, 58, 50, - 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,121,117,110,115, - 117,110, 49, 54, 46, 99, 32, 40,109, 97,103,105, 99, 32, 98,117, 98, 98, - 108,101, 41, 10,109, 97,103,105, 99, 98,117, 98, 58, 10, 48, 58,102,102, - 51, 99, 54, 54, 58, 52,101, 58, 48, 48, 58, 50, 48, 10, 10,109, 97,103, - 105, 99, 98,117, 98, 97, 58, 10,109, 97,103,105, 99, 98,117, 98, 98, 58, - 10, 48, 58,102,102, 99, 49, 50, 55, 58, 52,100, 58, 48, 55, 58, 50, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42,122, 97,120,120,111,110, 46, 99, 32, - 40,105,120,105,111,110, 32, 40,112,114,111,116,111,116,121,112,101, 41, - 41, 10,105,120,105,111,110, 58, 10, 48, 58, 54, 49, 48,100, 58, 49,101, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 49,100, 50, 58, 49,101, 58, 50, - 51, 58, 50, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105, - 116,111, 95,102, 51, 46, 99, 32, 40,101,108,101,118, 97,116,111,114, 32, - 97, 99,116,105,111,110, 32,114,101,116,117,114,110,115, 32, 40,119,111, - 114,108,100, 41, 41, 10,101,108,118, 97, 99,116,114, 58, 10, 48, 58, 52, - 48, 99,101, 51, 97, 58, 55, 99, 58, 48, 48, 58, 48, 49, 10, 48, 58, 52, - 48, 99,101, 51, 99, 58, 49, 58, 99, 51, 58, 99, 51, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,115, 99,114,101,103,103, 46, 99, 32, 40,100,111, - 109,109,121, 41, 10,100,111,109,109,121, 58, 10, 48, 58, 49, 97, 58, 51, - 58, 48, 48, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,111, - 109,101,103, 97,102, 46, 99, 32, 40,111,109,101,103, 97, 32,102,105,103, - 104,116,101,114, 32, 47, 32,111,109,101,103, 97, 32,102,105,103,104,116, - 101,114, 32,115,112,101, 99,105, 97,108, 41, 10, 59, 42, 42, 32,111,110, - 108,121, 32,115, 97,118,101,115, 32,112, 97,115,114,116, 32,111,102, 32, - 104,105,103,104,115, 99,111,114,101, 32, 63, 63, 32, 45, 32,116, 97, 98, - 108,101,115, 32,111,107, 32,116,104,111,117,103,104, 32, 33, 33, 32, 42, - 42, 10,111,109,101,103, 97,102, 58, 10,111,109,101,103, 97,102,115, 58, - 10, 48, 58,102, 56, 56, 48, 58, 55,102, 58, 48, 48, 58, 50, 52, 10, 48, - 58,102, 55,100, 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 55, - 100, 53, 58, 49, 58, 50, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40,100, 97,114,105, - 117,115, 32,103, 97,105,100,101,110, 32, 45, 32,115,105,108,118,101,114, - 32,104, 97,119,107, 32, 47, 32,101,120,116,114, 97, 32,118,101,114,115, - 105,111,110, 32, 41, 10,100, 97,114,105,117,115,103, 58, 10,100, 97,114, - 105,117,115,103,120, 58, 10,100, 97,114,105,117,115,103,117, 58, 10,100, - 97,114,105,117,115,103,106, 58, 10, 48, 58, 52, 48, 54, 99,100, 52, 58, - 51, 57, 58, 48, 48, 58, 53, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 116, 97,105,116,111, 95, 98, 46, 99, 32, 40,115,105,108,101,110,116, 32, - 100,114, 97,103,111,110, 32, 40,119,111,114,108,100, 41, 41, 10,115,105, - 108,101,110,116,100, 58, 10,115,105,108,101,110,116,100,106, 58, 10,115, - 105,108,101,110,116,100,117, 58, 10, 48, 58, 52, 48, 51, 69, 48, 51, 58, - 54, 53, 58, 48, 49, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,109,101,103, 97,115,121,115, 49, 46, 99, 32, 40,104, 97, 99,104,111, - 111, 41, 10,104, 97, 99,104,111,111, 58, 10, 48, 58,102, 48, 48, 55, 50, - 58, 49, 48, 48, 58, 48, 48, 58, 53, 57, 10, 48, 58,102, 48, 49, 55,101, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 48, 48, 55, 51, 58, 49, - 58, 48, 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,110, - 107, 54, 56, 46, 99, 32, 40,115,116,114,101,101,116, 32,115,109, 97,114, - 116, 32, 40,117,115, 32,118,101,114,115,105,111,110, 32, 49, 41, 41, 32, - 47, 32, 40,117,115, 32,118,101,114,115,105,111,110, 32, 50, 41, 10,115, - 116,114,101,101,116,115,109, 49, 58, 10,115,116,114,101,101,116,115,109, - 58, 10,115,116,114,101,101,116,115,109,106, 58, 10,115,116,114,101,101, - 116,115,109,119, 58, 10, 48, 58, 52, 49, 52, 55, 48, 58, 97, 48, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 52, 51,102, 55,101, 58, 52, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, - 50, 46, 99, 32, 40,102,105,110,101,115,116, 32,104,111,117,114, 32, 40, - 106, 97,112, 97,110, 41, 41, 10,102,105,110,101,104,111,117,114, 58, 10, - 48, 58, 49, 48, 54, 97,102,101, 58, 54, 52, 58, 48, 48, 58, 53, 97, 10, - 48, 58, 49, 48, 48, 48, 50, 97, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,103, 97,109,101,112,108, 97,110, 46, 99, - 32, 40,107,105,108,108,101,114, 32, 99,111,109,101,116, 41, 10,107,105, - 108,108, 99,111,109, 58, 10, 48, 58, 56, 56, 58, 50, 58, 52, 55, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,119,105,110, 49, 54, 46, - 99, 32, 40,100,101,118,105,108, 32,119,111,114,108,100, 41, 10,100,101, - 118,105,108,119, 58, 10,109, 97,106,117,117, 58, 10, 48, 58, 54, 48, 49, - 51, 49, 58,101,102, 58, 48, 48, 58, 49, 48, 10, 48, 58, 54, 48, 48, 52, - 57, 58, 51, 58, 48, 48, 58, 51, 48, 10, 10,100, 97,114,107, 97,100,118, - 58, 10, 48, 58, 54, 48, 49, 51, 49, 58,101,102, 58, 48, 48, 58, 49, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,117,110, 97, 49, 54, 46, 99, - 32, 40,117,108,116,114, 97, 32, 98, 97,108,108,111,111,110, 41, 10,117, - 98, 97,108,108,111,111,110, 58, 10, 48, 58, 56, 48, 48, 52, 56, 99, 58, - 52,102, 58, 48, 48, 58, 52, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 109,101,103, 97,115,121,115, 49, 46, 99, 32, 40,116, 97,107,101,100, 97, - 32,115,104,105,110,103,101,110, 32, 40,106, 97,112, 97,110, 41, 41, 10, - 116,115,104,105,110,103,101,110, 58, 10,116,115,104,105,110,103,101,110, - 97, 58, 10, 48, 58,102, 48,102, 48, 48, 58, 51, 97, 58, 48, 48, 58, 52, - 101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, - 40,115,116,114,105,107,101, 32,103,117,110,110,101,114, 32,115, 46,116, - 46,103, 46, 41, 10,115,116,103, 58, 10, 48, 58,102,102,100, 97, 51,101, - 58, 50, 56, 58, 52, 50, 58, 48, 48, 10, 48, 58,102,102,100, 97, 54, 52, - 58, 49, 58, 51, 49, 58, 51, 49, 10, 10, 59, 42, 42, 42, 42, 42, 40,102, - 45, 49, 32,100,114,101, 97,109, 41, 10,102, 49,100,114,101, 97,109, 58, - 10,102, 49,100,114,101, 97,109, 98, 58, 10, 48, 58,102,102,102, 49, 51, - 50, 58, 54, 48, 58, 53, 57, 58, 48, 49, 10, 48, 58,102,102,102, 50,101, - 57, 58, 53,102, 58, 48, 49, 58, 51, 52, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 97,116, 97,114,105,115,121, 49, 46, 99, 32, 40,114,111, 97,100, 32, - 114,117,110,110,101,114, 41, 10,114,111, 97,100,114,117,110,110, 58, 10, - 48, 58, 52, 48, 49,101, 52, 50, 58, 51, 50, 58, 48, 48, 58,100, 97, 10, - 10, 59, 97,100,100,101,100, 32,103, 97,108, 97,120,105, 97,106, 32, 40, - 103, 97,108, 97,120,105, 97,110, 32, 40,110, 97,109, 99,111, 32,115,101, - 116, 32, 50, 41, 41, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, - 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, 99,111, - 114,101, 95,118, 55, 46, 51, 32, 97,100,100,105,116,105,111,110,115, 32, - 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,111,109,111,107,111, 46, + 99, 32, 40,109,111,109,111,107,111, 32, 49, 50, 48, 37, 41, 13, 10,109, + 111,109,111,107,111, 58, 13, 10, 48, 58, 99,101, 48, 49, 58, 57,102, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 99, 48, 52, 57, 58, 55, 58, 50, 48, + 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,121,117,110, + 115,117,110, 49, 54, 46, 99, 32, 40,109, 97,103,105, 99, 32, 98,117, 98, + 98,108,101, 41, 13, 10,109, 97,103,105, 99, 98,117, 98, 58, 13, 10, 48, + 58,102,102, 51, 99, 54, 54, 58, 52,101, 58, 48, 48, 58, 50, 48, 13, 10, + 13, 10,109, 97,103,105, 99, 98,117, 98, 97, 58, 13, 10,109, 97,103,105, + 99, 98,117, 98, 98, 58, 13, 10, 48, 58,102,102, 99, 49, 50, 55, 58, 52, + 100, 58, 48, 55, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 122, 97,120,120,111,110, 46, 99, 32, 40,105,120,105,111,110, 32, 40,112, + 114,111,116,111,116,121,112,101, 41, 41, 13, 10,105,120,105,111,110, 58, + 13, 10, 48, 58, 54, 49, 48,100, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 54, 49,100, 50, 58, 49,101, 58, 50, 51, 58, 50, 52, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, + 51, 46, 99, 32, 40,101,108,101,118, 97,116,111,114, 32, 97, 99,116,105, + 111,110, 32,114,101,116,117,114,110,115, 32, 40,119,111,114,108,100, 41, + 41, 13, 10,101,108,118, 97, 99,116,114, 58, 13, 10, 48, 58, 52, 48, 99, + 101, 51, 97, 58, 55, 99, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 48, + 99,101, 51, 99, 58, 49, 58, 99, 51, 58, 99, 51, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,115, 99,114,101,103,103, 46, 99, 32, 40,100, + 111,109,109,121, 41, 13, 10,100,111,109,109,121, 58, 13, 10, 48, 58, 49, + 97, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,111,109,101,103, 97,102, 46, 99, 32, 40,111,109,101,103, + 97, 32,102,105,103,104,116,101,114, 32, 47, 32,111,109,101,103, 97, 32, + 102,105,103,104,116,101,114, 32,115,112,101, 99,105, 97,108, 41, 13, 10, + 59, 42, 42, 32,111,110,108,121, 32,115, 97,118,101,115, 32,112, 97,115, + 114,116, 32,111,102, 32,104,105,103,104,115, 99,111,114,101, 32, 63, 63, + 32, 45, 32,116, 97, 98,108,101,115, 32,111,107, 32,116,104,111,117,103, + 104, 32, 33, 33, 32, 42, 42, 13, 10,111,109,101,103, 97,102, 58, 13, 10, + 111,109,101,103, 97,102,115, 58, 13, 10, 48, 58,102, 56, 56, 48, 58, 55, + 102, 58, 48, 48, 58, 50, 52, 13, 10, 48, 58,102, 55,100, 52, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 55,100, 53, 58, 49, 58, 50, 48, + 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,116, 97,105, + 116,111, 95,102, 51, 46, 99, 32, 40,100, 97,114,105,117,115, 32,103, 97, + 105,100,101,110, 32, 45, 32,115,105,108,118,101,114, 32,104, 97,119,107, + 32, 47, 32,101,120,116,114, 97, 32,118,101,114,115,105,111,110, 32, 41, + 13, 10,100, 97,114,105,117,115,103, 58, 13, 10,100, 97,114,105,117,115, + 103,120, 58, 13, 10,100, 97,114,105,117,115,103,117, 58, 13, 10,100, 97, + 114,105,117,115,103,106, 58, 13, 10, 48, 58, 52, 48, 54, 99,100, 52, 58, + 51, 57, 58, 48, 48, 58, 53, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42,116, 97,105,116,111, 95, 98, 46, 99, 32, 40,115,105,108,101,110, + 116, 32,100,114, 97,103,111,110, 32, 40,119,111,114,108,100, 41, 41, 13, + 10,115,105,108,101,110,116,100, 58, 13, 10,115,105,108,101,110,116,100, + 106, 58, 13, 10,115,105,108,101,110,116,100,117, 58, 13, 10, 48, 58, 52, + 48, 51, 69, 48, 51, 58, 54, 53, 58, 48, 49, 58, 50, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,115,121,115, 49, 46, + 99, 32, 40,104, 97, 99,104,111,111, 41, 13, 10,104, 97, 99,104,111,111, + 58, 13, 10, 48, 58,102, 48, 48, 55, 50, 58, 49, 48, 48, 58, 48, 48, 58, + 53, 57, 13, 10, 48, 58,102, 48, 49, 55,101, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,102, 48, 48, 55, 51, 58, 49, 58, 48, 53, 58, 48, 53, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,110,107, 54, 56, 46, + 99, 32, 40,115,116,114,101,101,116, 32,115,109, 97,114,116, 32, 40,117, + 115, 32,118,101,114,115,105,111,110, 32, 49, 41, 41, 32, 47, 32, 40,117, + 115, 32,118,101,114,115,105,111,110, 32, 50, 41, 13, 10,115,116,114,101, + 101,116,115,109, 49, 58, 13, 10,115,116,114,101,101,116,115,109, 58, 13, + 10,115,116,114,101,101,116,115,109,106, 58, 13, 10,115,116,114,101,101, + 116,115,109,119, 58, 13, 10, 48, 58, 52, 49, 52, 55, 48, 58, 97, 48, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58, 52, 51,102, 55,101, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,110, 97, + 109, 99,111,115, 50, 46, 99, 32, 40,102,105,110,101,115,116, 32,104,111, + 117,114, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,102,105,110,101,104, + 111,117,114, 58, 13, 10, 48, 58, 49, 48, 54, 97,102,101, 58, 54, 52, 58, + 48, 48, 58, 53, 97, 13, 10, 48, 58, 49, 48, 48, 48, 50, 97, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,103, + 97,109,101,112,108, 97,110, 46, 99, 32, 40,107,105,108,108,101,114, 32, + 99,111,109,101,116, 41, 13, 10,107,105,108,108, 99,111,109, 58, 13, 10, + 48, 58, 56, 56, 58, 50, 58, 52, 55, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42,116,119,105,110, 49, 54, 46, 99, 32, 40,100,101, + 118,105,108, 32,119,111,114,108,100, 41, 13, 10,100,101,118,105,108,119, + 58, 13, 10,109, 97,106,117,117, 58, 13, 10, 48, 58, 54, 48, 49, 51, 49, + 58,101,102, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, 54, 48, 48, 52, 57, + 58, 51, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10,100, 97,114,107, 97,100, + 118, 58, 13, 10, 48, 58, 54, 48, 49, 51, 49, 58,101,102, 58, 48, 48, 58, + 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,117,110, 97, + 49, 54, 46, 99, 32, 40,117,108,116,114, 97, 32, 98, 97,108,108,111,111, + 110, 41, 13, 10,117, 98, 97,108,108,111,111,110, 58, 13, 10, 48, 58, 56, + 48, 48, 52, 56, 99, 58, 52,102, 58, 48, 48, 58, 52, 53, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42,109,101,103, 97,115,121,115, 49, 46, 99, + 32, 40,116, 97,107,101,100, 97, 32,115,104,105,110,103,101,110, 32, 40, + 106, 97,112, 97,110, 41, 41, 13, 10,116,115,104,105,110,103,101,110, 58, + 13, 10,116,115,104,105,110,103,101,110, 97, 58, 13, 10, 48, 58,102, 48, + 102, 48, 48, 58, 51, 97, 58, 48, 48, 58, 52,101, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42,115,101,116, 97, 46, 99, 32, 40,115,116,114,105, + 107,101, 32,103,117,110,110,101,114, 32,115, 46,116, 46,103, 46, 41, 13, + 10,115,116,103, 58, 13, 10, 48, 58,102,102,100, 97, 51,101, 58, 50, 56, + 58, 52, 50, 58, 48, 48, 13, 10, 48, 58,102,102,100, 97, 54, 52, 58, 49, + 58, 51, 49, 58, 51, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 40,102, + 45, 49, 32,100,114,101, 97,109, 41, 13, 10,102, 49,100,114,101, 97,109, + 58, 13, 10,102, 49,100,114,101, 97,109, 98, 58, 13, 10, 48, 58,102,102, + 102, 49, 51, 50, 58, 54, 48, 58, 53, 57, 58, 48, 49, 13, 10, 48, 58,102, + 102,102, 50,101, 57, 58, 53,102, 58, 48, 49, 58, 51, 52, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 97,116, 97,114,105,115,121, 49, 46, 99, 32, + 40,114,111, 97,100, 32,114,117,110,110,101,114, 41, 13, 10,114,111, 97, + 100,114,117,110,110, 58, 13, 10, 48, 58, 52, 48, 49,101, 52, 50, 58, 51, + 50, 58, 48, 48, 58,100, 97, 13, 10, 13, 10, 59, 97,100,100,101,100, 32, + 103, 97,108, 97,120,105, 97,106, 32, 40,103, 97,108, 97,120,105, 97,110, + 32, 40,110, 97,109, 99,111, 32,115,101,116, 32, 50, 41, 41, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42,116, 97,105,116,111, 95, 98, 46, 99, 32, 40,114,121,117, 32, - 106,105,110, 32, 40,106, 97,112, 97,110, 41, 41, 10,114,121,117,106,105, - 110, 58, 10, 48, 58, 49, 48, 51,101, 51, 99, 58, 54, 51, 58, 53, 52, 58, - 48, 49, 10, 48, 58, 49, 48, 51,102, 50, 48, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,120,120,109,105,115,115,105, - 111, 32, 40,120,120, 32,109,105,115,115,105,111,110, 41, 10,120,120,109, - 105,115,115,105,111, 58, 10, 48, 58,101, 48, 49, 56, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 48, 56, 52, 58, 54, 49, 58, 50, 48, 58, 50, - 48, 10, 48, 58, 99, 49, 97, 48, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, - 58, 99, 49, 99, 48, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 99, 49, - 101, 48, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 99, 50, 48, 48, 58, - 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 99, 50, 50, 48, 58, 49, 58, 51, - 51, 58, 51, 51, 10, 48, 58, 99, 50, 52, 48, 58, 49, 58, 48, 49, 58, 48, - 49, 10, 48, 58, 99, 50, 54, 48, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,107, 97,114,110,111,118, 46, 99, 32, 40, - 119,111,110,100,101,114, 32,112,108, 97,110,101,116, 32, 40,106, 97,112, - 97,110, 41, 41, 10,119,110,100,114,112,108,110,116, 58, 10, 48, 58, 54, - 48, 48, 52, 56, 58, 97, 99, 58, 48, 48, 58, 48, 49, 10, 48, 58, 54, 48, - 48,100,100, 58, 49, 58, 52,100, 58, 52,100, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40,109,111,117,106, 97, - 32, 40,106, 97,112, 97,110, 41, 41, 10,109,111,117,106, 97, 58, 10, 48, - 58,102, 48, 48, 48, 54, 52, 58, 49, 50, 99, 58, 48, 48, 58, 51, 55, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97,110,103,107,105,100, - 46, 99, 32, 40,115,104, 97,110,103,104, 97,105, 32,107,105,100, 32, 40, - 106, 97,112, 97,110, 41, 41, 10,115,104, 97,110,103,107,105,100, 58, 10, - 104,105,114,121,117,107,101,110, 58, 10, 48, 58,101, 49, 50, 56, 58, 53, - 48, 58, 48, 48, 58, 49, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 98,106,116,119,105,110, 32, 40,116,104,117,110,100,101,114, 32,100,114, - 97,103,111,110, 32, 50, 41, 10,116,100,114, 97,103,111,110, 50, 58, 10, - 48, 58, 49,102,102, 49, 48, 49, 58, 54, 98, 58, 49, 56, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 98,105,103, 32, 98, 97,110,103, 10, - 98,105,103, 98, 97,110,103, 58, 10,116,100,114, 97,103,111,110, 50, 97, - 58, 10, 48, 58, 49,102,102, 49, 48, 49, 58, 54, 98, 58, 49, 56, 58, 48, - 48, 10, 48, 58, 49,102,102, 49, 54, 57, 58, 49, 58, 48, 49, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,110, 97, 56, 46, 99, - 32, 40,114,111,117,103,104, 32,114, 97,110,103,101,114,115, 40,118, 50, - 46, 48, 32,115,104, 97,114,112, 32,105,109, 97,103,101, 32,108,105, 99, - 101,110, 99,101, 41, 41, 10,114,114, 97,110,103,101,114, 98, 58, 10, 48, - 58,100, 50, 50, 48, 58, 52, 99, 58, 48, 48, 58, 50, 48, 10, 48, 58, 99, - 56, 53, 49, 58, 50, 58, 48, 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,112, 97,114,111,100,105,117,115, 46, 99, 32, 40,112, 97, - 114,111,100,105,117,115, 32,100, 97, 33, 32, 40,106, 97,112, 97,110, 41, - 41, 10,112, 97,114,111,100,105,117,115, 58, 10,112, 97,114,111,100,105, - 117,115,106, 58, 32, 10,112, 97,114,111,100,105,117,115, 97, 58, 10,112, - 97,114,111,100,105,117,115,101, 58, 10, 48, 58, 49,102, 53, 48, 58, 53, - 101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49,102, 53, 49, 58, 49, 58, 48, - 53, 58, 48, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111, - 103,101,111, 46, 99, 32, 40,122,101,100, 32, 98,108, 97,100,101, 41, 10, - 122,101,100, 98,108, 97,100,101, 58, 10, 48, 58, 49, 48, 56,102, 48, 48, - 58, 53, 48, 58, 48, 48, 58, 49, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,110,101,111,103,101,111, 46, 99, 32, 40, 99,121, 98,101,114, 45, - 108,105,112, 41, 10, 99,121, 98,101,114,108,105,112, 58, 10, 48, 58, 49, - 48, 48, 48, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,100,111,111,121,111,110,103, 46, 99, 32, 40, - 114, 45,115,104, 97,114,107, 41, 10,114,115,104, 97,114,107, 58, 10, 48, - 58, 51, 52, 48, 51, 56, 50, 58, 52,101, 58, 52,101, 58, 52, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42,112,114,101,104,105,115,108,101, 46, 99, - 32, 40,112,114,101,104,105,115,116,111,114,105, 99, 32,105,115,108,101, - 32,105,110, 32, 49, 57, 51, 48, 32, 40,119,111,114,108,100, 41, 41, 10, - 112,114,101,104,105,115,108,101, 58, 10,103,101,110,115,105,116,111,117, - 58, 10,112,114,101,104,105,115,108,101,117, 58, 10,112,114,101,104,105, - 115,108,101,107, 58, 10, 48, 58, 55, 48, 48, 97, 48, 58, 52,101, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 55, 48, 48, 51,100, 58, 53, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 55, 48, 48,101, 99, 58, 49, 58, 48, 49, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 98, 97,115,107,101,116, 98, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97, + 116,101,115,116, 32, 58,104,105,103,104,115, 99,111,114,101, 95,118, 55, + 46, 51, 32, 97,100,100,105,116,105,111,110,115, 32, 98,101,108,111,119, + 32, 45, 32, 98,121, 32,108,101,101,122,101,114, 42, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42,116, 97,105,116,111, 95, 98, 46, 99, 32, 40,114,121,117, 32,106,105, + 110, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,114,121,117,106,105,110, + 58, 13, 10, 48, 58, 49, 48, 51,101, 51, 99, 58, 54, 51, 58, 53, 52, 58, + 48, 49, 13, 10, 48, 58, 49, 48, 51,102, 50, 48, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,120,120,109,105, + 115,115,105,111, 32, 40,120,120, 32,109,105,115,115,105,111,110, 41, 13, + 10,120,120,109,105,115,115,105,111, 58, 13, 10, 48, 58,101, 48, 49, 56, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 48, 56, 52, 58, 54, + 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 99, 49, 97, 48, 58, 49, 58, + 51, 48, 58, 51, 48, 13, 10, 48, 58, 99, 49, 99, 48, 58, 49, 58, 51, 48, + 58, 51, 48, 13, 10, 48, 58, 99, 49,101, 48, 58, 49, 58, 51, 48, 58, 51, + 48, 13, 10, 48, 58, 99, 50, 48, 48, 58, 49, 58, 51, 48, 58, 51, 48, 13, + 10, 48, 58, 99, 50, 50, 48, 58, 49, 58, 51, 51, 58, 51, 51, 13, 10, 48, + 58, 99, 50, 52, 48, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 99, + 50, 54, 48, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42,107, 97,114,110,111,118, 46, 99, 32, 40,119,111,110, + 100,101,114, 32,112,108, 97,110,101,116, 32, 40,106, 97,112, 97,110, 41, + 41, 13, 10,119,110,100,114,112,108,110,116, 58, 13, 10, 48, 58, 54, 48, + 48, 52, 56, 58, 97, 99, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 54, 48, + 48,100,100, 58, 49, 58, 52,100, 58, 52,100, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, 32, 40,109,111,117, + 106, 97, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,109,111,117,106, 97, + 58, 13, 10, 48, 58,102, 48, 48, 48, 54, 52, 58, 49, 50, 99, 58, 48, 48, + 58, 51, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, + 97,110,103,107,105,100, 46, 99, 32, 40,115,104, 97,110,103,104, 97,105, + 32,107,105,100, 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,115,104, 97, + 110,103,107,105,100, 58, 13, 10,104,105,114,121,117,107,101,110, 58, 13, + 10, 48, 58,101, 49, 50, 56, 58, 53, 48, 58, 48, 48, 58, 49, 55, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,106,116,119,105,110, 32, + 40,116,104,117,110,100,101,114, 32,100,114, 97,103,111,110, 32, 50, 41, + 13, 10,116,100,114, 97,103,111,110, 50, 58, 13, 10, 48, 58, 49,102,102, + 49, 48, 49, 58, 54, 98, 58, 49, 56, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 98,105,103, 32, 98, 97,110,103, 13, 10, 98,105, + 103, 98, 97,110,103, 58, 13, 10,116,100,114, 97,103,111,110, 50, 97, 58, + 13, 10, 48, 58, 49,102,102, 49, 48, 49, 58, 54, 98, 58, 49, 56, 58, 48, + 48, 13, 10, 48, 58, 49,102,102, 49, 54, 57, 58, 49, 58, 48, 49, 58, 48, + 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,110, 97, + 56, 46, 99, 32, 40,114,111,117,103,104, 32,114, 97,110,103,101,114,115, + 40,118, 50, 46, 48, 32,115,104, 97,114,112, 32,105,109, 97,103,101, 32, + 108,105, 99,101,110, 99,101, 41, 41, 13, 10,114,114, 97,110,103,101,114, + 98, 58, 13, 10, 48, 58,100, 50, 50, 48, 58, 52, 99, 58, 48, 48, 58, 50, + 48, 13, 10, 48, 58, 99, 56, 53, 49, 58, 50, 58, 48, 48, 58, 48, 51, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112, 97,114,111,100,105, + 117,115, 46, 99, 32, 40,112, 97,114,111,100,105,117,115, 32,100, 97, 33, + 32, 40,106, 97,112, 97,110, 41, 41, 13, 10,112, 97,114,111,100,105,117, + 115, 58, 13, 10,112, 97,114,111,100,105,117,115,106, 58, 13, 10,112, 97, + 114,111,100,105,117,115, 97, 58, 13, 10,112, 97,114,111,100,105,117,115, + 101, 58, 13, 10, 48, 58, 49,102, 53, 48, 58, 53,101, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 49,102, 53, 49, 58, 49, 58, 48, 53, 58, 48, 53, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, + 46, 99, 32, 40,122,101,100, 32, 98,108, 97,100,101, 41, 13, 10,122,101, + 100, 98,108, 97,100,101, 58, 13, 10, 48, 58, 49, 48, 56,102, 48, 48, 58, + 53, 48, 58, 48, 48, 58, 49, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40, 99,121, 98,101,114, + 45,108,105,112, 41, 13, 10, 99,121, 98,101,114,108,105,112, 58, 13, 10, + 48, 58, 49, 48, 48, 48, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,111,111,121,111,110, + 103, 46, 99, 32, 40,114, 45,115,104, 97,114,107, 41, 13, 10,114,115,104, + 97,114,107, 58, 13, 10, 48, 58, 51, 52, 48, 51, 56, 50, 58, 52,101, 58, + 52,101, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112, + 114,101,104,105,115,108,101, 46, 99, 32, 40,112,114,101,104,105,115,116, + 111,114,105, 99, 32,105,115,108,101, 32,105,110, 32, 49, 57, 51, 48, 32, + 40,119,111,114,108,100, 41, 41, 13, 10,112,114,101,104,105,115,108,101, + 58, 13, 10,103,101,110,115,105,116,111,117, 58, 13, 10,112,114,101,104, + 105,115,108,101,117, 58, 13, 10,112,114,101,104,105,115,108,101,107, 58, + 13, 10, 48, 58, 55, 48, 48, 97, 48, 58, 52,101, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 55, 48, 48, 51,100, 58, 53, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 55, 48, 48,101, 99, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 98, 97,115,107,101,116, 98, 46, 99, 32, 40,115,117,112,101,114, 32, 98, 97,115,107,101,116, 98, 97, - 108,108, 41, 40,102,105,120, 41, 10,115, 98, 97,115,107,101,116, 98, 58, - 10, 48, 58, 50, 97, 50, 54, 58, 49, 57, 52, 58,101,102, 58, 49, 52, 10, - 48, 58, 50, 48, 97, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, - 53, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 51, 53, 48, 49, - 58, 49, 58, 49, 48, 58, 49, 48, 10, 48, 58, 51, 52,101, 49, 58, 49, 58, - 49, 48, 58, 49, 48, 10, 48, 58, 51, 52, 99, 49, 58, 49, 58, 49, 48, 58, - 49, 48, 10, 48, 58, 51, 52, 97, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, - 48, 58, 51, 52, 56, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, - 52, 54, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 108,108, 41, 40,102,105,120, 41, 13, 10,115, 98, 97,115,107,101,116, 98, + 58, 13, 10, 48, 58, 50, 97, 50, 54, 58, 49, 57, 52, 58,101,102, 58, 49, + 52, 13, 10, 48, 58, 50, 48, 97, 99, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 51, 53, 50, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, + 58, 51, 53, 48, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 51, + 52,101, 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 51, 52, 99, + 49, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 51, 52, 97, 49, 58, + 49, 58, 49, 48, 58, 49, 48, 13, 10, 48, 58, 51, 52, 56, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 52, 54, 49, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104, - 105,103,104,115, 99,111,114,101, 95,118, 55, 46, 50, 32, 97,100,100,105, - 116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108, - 101,101,122,101,114, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, + 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, 99, + 111,114,101, 95,118, 55, 46, 50, 32, 97,100,100,105,116,105,111,110,115, + 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101,114, + 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,104,113,102,108, 97,103, 46, - 99, 32, 40, 99,104,101,113,117,101,114,101,100, 32,102,108, 97,103, 41, - 10, 99,104,113,102,108, 97,103, 58, 10, 48, 58, 49,102, 48, 56, 58,100, - 100, 58, 51, 48, 58, 52, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40,112,117,122,122,108,101, - 32, 98,111, 98, 98,108,101, 32, 51, 32, 40,119,111,114,108,100, 41, 41, - 10,112, 98,111, 98, 98,108,101, 51, 58, 10, 48, 58, 52, 49,101,102,102, - 48, 58, 57, 57, 58, 48, 48, 58, 48, 52, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,115,103,108, 97,100,105, 97,116, 46, 99, 32, 40,103,108, 97, - 100,105, 97,116,111,114, 32, 49, 57, 56, 52, 41, 10,115,103,108, 97,100, - 105, 97,116, 58, 10, 48, 58,100, 57, 98, 48, 58, 50, 56, 58, 48, 48, 58, - 52, 98, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, 46, - 99, 32, 40,104,111,116,100,111,103, 32,115,116,111,114,109, 41, 10,104, - 111,116,100,111,103,115,116, 58, 10, 48, 58, 51, 48, 49, 49, 48, 48, 58, - 53, 52, 58, 48, 48, 58, 49, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 98,106,116,119,105,110, 46, 99, 32, 40, 98,105,111, 45,115,104,105, - 112, 32,112, 97,108, 97,100,105,110, 41, 10, 98,105,111,115,104,105,112, - 58, 10,115, 98,115,103,111,109,111, 58, 10, 48, 58,102, 48, 49, 53, 48, - 58, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 48, 49, 54, 57, 58, 97, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 48, 50, 48, 55, 58, 49, 58, - 52, 99, 58, 52, 99, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, - 99,111, 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101,116,116,101, - 58, 32, 98,111,117,108,100,101,114, 32,100, 97,115,104, 41, 10, 99, 98, - 100, 97,115,104, 58, 10, 48, 58, 50, 48, 48, 58, 56, 99, 58, 48, 49, 58, - 49, 51, 10, 48, 58, 50, 51, 58, 51, 58, 56, 56, 58, 48, 49, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 42,116,101,116,114,105,115,112, 50, 46, - 99, 32, 40,116,101,116,114,105,115, 32,112,108,117,115, 32, 50, 40, 74, - 65, 80, 65, 78, 41, 41, 10,116,101,112,108,117,115, 50,106, 58, 10,116, - 101,116,114,105,115,112, 50, 58, 10,116,101,116,114,105,115,112, 50,106, - 97, 58, 10, 48, 58, 49, 48,100,102, 98, 55, 58, 98, 51, 58, 48, 49, 58, - 48, 48, 10, 48, 58, 49, 48,101, 48, 54, 53, 58, 49, 58, 48, 49, 58, 48, - 49, 10, 48, 58, 49, 48, 98, 48,102, 50, 58, 52, 54, 48, 58, 48, 51, 58, - 48, 57, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 99,110,105,110, - 106, 97, 46, 99, 32, 40,114,111, 98,111, 99,111,112, 32, 50, 41, 10,114, - 111, 98,111, 99,111,112, 50, 58, 10,114,111, 98,111, 99,111,112, 50,106, - 58, 10,114,111, 98,111, 99,111,112, 50,117, 58, 10,114,111, 98,111, 99, - 111,112, 50,117, 97, 58, 10, 48, 58, 49, 98, 56, 51, 48, 48, 58, 50, 55, - 58, 52,101, 58, 50, 49, 10, 48, 58, 49, 98, 56, 50, 48, 48, 58, 50, 56, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 98, 56, 48, 50, 48, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,110, - 101,111,103,101,111, 46, 99, 32, 40,112,117,122,122,108,101, 32, 98,111, - 98, 98,108,101, 50, 47, 98,117,115,116, 32, 97, 32,109,111,118,101, 32, - 97,103, 97,105,110, 41, 10,112, 98,111, 98, 98,108, 50,110, 58, 10, 48, - 58, 49, 48,101,101, 48, 48, 58, 49, 49, 50, 58, 48, 48, 58,100, 52, 10, - 48, 58, 49, 48,102,101, 56, 98, 58, 49, 58, 50, 51, 58, 50, 51, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104,111, 99,107,105,110,103, 46, - 99, 32, 40,115,104,111, 99,107,105,110,103, 41, 10,115,104,111, 99,107, - 105,110,103, 58, 10,115,104,111, 99,107,105,110,103,107, 58, 10,115,104, - 111, 99,107,105,110,103,107,111, 58, 10, 48, 58,102,102, 48,100, 49, 57, - 58, 54, 51, 58, 52, 49, 58, 54, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 99,104,113,102,108, 97,103, 46, 99, 32, + 40, 99,104,101,113,117,101,114,101,100, 32,102,108, 97,103, 41, 13, 10, + 99,104,113,102,108, 97,103, 58, 13, 10, 48, 58, 49,102, 48, 56, 58,100, + 100, 58, 51, 48, 58, 52, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40,112,117,122,122, + 108,101, 32, 98,111, 98, 98,108,101, 32, 51, 32, 40,119,111,114,108,100, + 41, 41, 13, 10,112, 98,111, 98, 98,108,101, 51, 58, 13, 10, 48, 58, 52, + 49,101,102,102, 48, 58, 57, 57, 58, 48, 48, 58, 48, 52, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,115,103,108, 97,100,105, 97,116, 46, + 99, 32, 40,103,108, 97,100,105, 97,116,111,114, 32, 49, 57, 56, 52, 41, + 13, 10,115,103,108, 97,100,105, 97,116, 58, 13, 10, 48, 58,100, 57, 98, + 48, 58, 50, 56, 58, 48, 48, 58, 52, 98, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 99, 97,118,101, 46, 99, 32, 40,104,111,116,100,111, + 103, 32,115,116,111,114,109, 41, 13, 10,104,111,116,100,111,103,115,116, + 58, 13, 10, 48, 58, 51, 48, 49, 49, 48, 48, 58, 53, 52, 58, 48, 48, 58, + 49, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,106,116, + 119,105,110, 46, 99, 32, 40, 98,105,111, 45,115,104,105,112, 32,112, 97, + 108, 97,100,105,110, 41, 13, 10, 98,105,111,115,104,105,112, 58, 13, 10, + 115, 98,115,103,111,109,111, 58, 13, 10, 48, 58,102, 48, 49, 53, 48, 58, + 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 48, 49, 54, 57, 58, 97, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 48, 50, 48, 55, 58, 49, + 58, 52, 99, 58, 52, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,100,101, 99,111, 99, 97,115,115, 46, 99, 32, 40, 99, 97,115,115,101, + 116,116,101, 58, 32, 98,111,117,108,100,101,114, 32,100, 97,115,104, 41, + 13, 10, 99, 98,100, 97,115,104, 58, 13, 10, 48, 58, 50, 48, 48, 58, 56, + 99, 58, 48, 49, 58, 49, 51, 13, 10, 48, 58, 50, 51, 58, 51, 58, 56, 56, + 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42,116, + 101,116,114,105,115,112, 50, 46, 99, 32, 40,116,101,116,114,105,115, 32, + 112,108,117,115, 32, 50, 40, 74, 65, 80, 65, 78, 41, 41, 13, 10,116,101, + 112,108,117,115, 50,106, 58, 13, 10,116,101,116,114,105,115,112, 50, 58, + 13, 10,116,101,116,114,105,115,112, 50,106, 97, 58, 13, 10, 48, 58, 49, + 48,100,102, 98, 55, 58, 98, 51, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, + 49, 48,101, 48, 54, 53, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, + 49, 48, 98, 48,102, 50, 58, 52, 54, 48, 58, 48, 51, 58, 48, 57, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 99,110,105,110,106, 97, + 46, 99, 32, 40,114,111, 98,111, 99,111,112, 32, 50, 41, 13, 10,114,111, + 98,111, 99,111,112, 50, 58, 13, 10,114,111, 98,111, 99,111,112, 50,106, + 58, 13, 10,114,111, 98,111, 99,111,112, 50,117, 58, 13, 10,114,111, 98, + 111, 99,111,112, 50,117, 97, 58, 13, 10, 48, 58, 49, 98, 56, 51, 48, 48, + 58, 50, 55, 58, 52,101, 58, 50, 49, 13, 10, 48, 58, 49, 98, 56, 50, 48, + 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 98, 56, 48, + 50, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 42,110,101,111,103,101,111, 46, 99, 32, 40,112,117, + 122,122,108,101, 32, 98,111, 98, 98,108,101, 50, 47, 98,117,115,116, 32, + 97, 32,109,111,118,101, 32, 97,103, 97,105,110, 41, 13, 10,112, 98,111, + 98, 98,108, 50,110, 58, 13, 10, 48, 58, 49, 48,101,101, 48, 48, 58, 49, + 49, 50, 58, 48, 48, 58,100, 52, 13, 10, 48, 58, 49, 48,102,101, 56, 98, + 58, 49, 58, 50, 51, 58, 50, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,115,104,111, 99,107,105,110,103, 46, 99, 32, 40,115,104,111, + 99,107,105,110,103, 41, 13, 10,115,104,111, 99,107,105,110,103, 58, 13, + 10,115,104,111, 99,107,105,110,103,107, 58, 13, 10,115,104,111, 99,107, + 105,110,103,107,111, 58, 13, 10, 48, 58,102,102, 48,100, 49, 57, 58, 54, + 51, 58, 52, 49, 58, 54, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,114,105,110,101, 98, 46, 99, 32, 40, 98, 97,116,116,108, - 101, 32, 99,114,117,105,115,101,114, 32,109, 49, 50, 41, 10, 98, 99,114, - 117,122,109, 49, 50, 58, 10, 48, 58, 56, 53, 56, 99, 58, 52, 53, 58, 48, - 48, 58, 49, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110,101,109, - 101,115,105,115, 46, 99, 32, 40,116,119,105,110, 98,101,101, 41, 10,116, - 119,105,110, 98,101,101, 58, 10, 48, 58, 49,102, 53, 56, 48, 58, 53, 56, - 58, 48, 48, 58, 48, 97, 10, 48, 58, 49,101, 98, 97, 48, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,107,121, - 100,105,118,101,114, 46, 99, 32, 40,115,107,121, 32,100,105,118,101,114, - 41, 10, 59, 42, 42, 32,110,111,116,101, 32,104,105,103,104,115, 99,111, - 114,101, 32,109,117,115,116, 32, 98,101, 32,100,105,115,112,108, 97,121, - 105,110,103, 32,110,101,119, 32,116,111,112, 32,115, 99,111,114,101, 32, - 116,111, 32,115, 97,118,101, 32,112,114,111,112,101,114,108,121, 32, 42, - 42, 10, 59, 42, 42, 32,115,111, 32,115,116, 97,114,116, 32, 97, 32,110, - 101,119, 32,103, 97,109,101, 32, 97,102,116,101,114, 32, 97, 32,110,101, - 119, 32,104,105,103,104,115, 99,111,114,101, 32, 97,110,100, 32,107,105, - 108,108, 32,109, 97,110, 32, 51, 32,116,105,109,101,115, 32, 42, 42, 10, - 59, 42, 42, 32,117,110,116,105,108,108, 32,110,101,119, 32,104,105,103, - 104,115, 99,111,114,101, 32,105,115, 32,100,105,115,112,108, 97,121,101, - 100, 46, 32, 42, 42, 10,115,107,121,100,105,118,101,114, 58, 10, 48, 58, - 97,102, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,109, 97,103,105,120, 46, 99, 32, 40, 99, 97,110,110,111,110, - 32, 98, 97,108,108, 41, 10, 99, 97,110,110, 98, 97,108,108, 58, 10, 99, - 97,110,110, 98, 97,108,108,118, 58, 10, 48, 58,102, 56, 48, 48, 58, 56, - 48, 58, 48, 48, 58, 50,101, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 101, 32, 99,114,117,105,115,101,114, 32,109, 49, 50, 41, 13, 10, 98, 99, + 114,117,122,109, 49, 50, 58, 13, 10, 48, 58, 56, 53, 56, 99, 58, 52, 53, + 58, 48, 48, 58, 49, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,110,101,109,101,115,105,115, 46, 99, 32, 40,116,119,105,110, 98,101, + 101, 41, 13, 10,116,119,105,110, 98,101,101, 58, 13, 10, 48, 58, 49,102, + 53, 56, 48, 58, 53, 56, 58, 48, 48, 58, 48, 97, 13, 10, 48, 58, 49,101, + 98, 97, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,115,107,121,100,105,118,101,114, 46, 99, 32, 40, + 115,107,121, 32,100,105,118,101,114, 41, 13, 10, 59, 42, 42, 32,110,111, + 116,101, 32,104,105,103,104,115, 99,111,114,101, 32,109,117,115,116, 32, + 98,101, 32,100,105,115,112,108, 97,121,105,110,103, 32,110,101,119, 32, + 116,111,112, 32,115, 99,111,114,101, 32,116,111, 32,115, 97,118,101, 32, + 112,114,111,112,101,114,108,121, 32, 42, 42, 13, 10, 59, 42, 42, 32,115, + 111, 32,115,116, 97,114,116, 32, 97, 32,110,101,119, 32,103, 97,109,101, + 32, 97,102,116,101,114, 32, 97, 32,110,101,119, 32,104,105,103,104,115, + 99,111,114,101, 32, 97,110,100, 32,107,105,108,108, 32,109, 97,110, 32, + 51, 32,116,105,109,101,115, 32, 42, 42, 13, 10, 59, 42, 42, 32,117,110, + 116,105,108,108, 32,110,101,119, 32,104,105,103,104,115, 99,111,114,101, + 32,105,115, 32,100,105,115,112,108, 97,121,101,100, 46, 32, 42, 42, 13, + 10,115,107,121,100,105,118,101,114, 58, 13, 10, 48, 58, 97,102, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,109, 97,103,105,120, 46, 99, 32, 40, 99, 97,110,110,111,110, 32, 98, + 97,108,108, 41, 13, 10, 99, 97,110,110, 98, 97,108,108, 58, 13, 10, 99, + 97,110,110, 98, 97,108,108,118, 58, 13, 10, 48, 58,102, 56, 48, 48, 58, + 56, 48, 58, 48, 48, 58, 50,101, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104,105,103,104,115, - 99,111,114,101, 95,118, 55, 46, 49, 32, 97,100,100,105,116,105,111,110, - 115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108,101,101,122,101, - 114, 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 13, 10, 59, 42, 32,108, 97,116,101,115,116, 32, 58,104, + 105,103,104,115, 99,111,114,101, 95,118, 55, 46, 49, 32, 97,100,100,105, + 116,105,111,110,115, 32, 98,101,108,111,119, 32, 45, 32, 98,121, 32,108, + 101,101,122,101,114, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,118,115,110,101,115, 46, 99, 32, 40,112,108, 97, - 116,111,111,110, 41, 10,112,108, 97,116,111,111,110, 58, 10, 48, 58, 55, - 48, 48, 58,101, 57, 58, 49, 48, 58, 54, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,118,115,110,101,115, 46, 99, 32, 40,115,117,112,101,114, - 32,115,107,121,107,105,100, 41, 10,118,115,115,107,121,107,105,100, 58, - 10, 48, 58, 49, 48, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 54, - 58, 54, 58, 48, 48, 58, 51,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 98,111,115, 99,111, 46, 99, 32, 40, 98,111,115, 99,111,110,105, 97,110, - 41, 10, 59, 32, 42, 42, 32,104,105,103,104,115, 99,111,114,101, 32, 98, - 101, 97,116,101,110, 32, 97,116, 32, 50, 48, 44, 48, 48, 48, 32,101,118, - 101,114,121, 32,116,105,109,101, 32, 42, 42, 10, 59, 32, 42, 42, 32,110, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, + 46, 99, 32, 40,112,108, 97,116,111,111,110, 41, 13, 10,112,108, 97,116, + 111,111,110, 58, 13, 10, 48, 58, 55, 48, 48, 58,101, 57, 58, 49, 48, 58, + 54, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110, + 101,115, 46, 99, 32, 40,115,117,112,101,114, 32,115,107,121,107,105,100, + 41, 13, 10,118,115,115,107,121,107,105,100, 58, 13, 10, 48, 58, 49, 48, + 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 54, 58, 54, 58, 48, + 48, 58, 51,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 98,111, + 115, 99,111, 46, 99, 32, 40, 98,111,115, 99,111,110,105, 97,110, 41, 13, + 10, 59, 32, 42, 42, 32,104,105,103,104,115, 99,111,114,101, 32, 98,101, + 97,116,101,110, 32, 97,116, 32, 50, 48, 44, 48, 48, 48, 32,101,118,101, + 114,121, 32,116,105,109,101, 32, 42, 42, 13, 10, 59, 32, 42, 42, 32,110, 111, 32,119, 97,121, 32, 97,114,111,117,110,100, 32,116,104,105,115, 32, - 42, 42, 10, 59, 32, 42, 42, 32,104,105,103,104,115, 99,111,114,101, 32, - 116, 97, 98,108,101, 32,111,107, 32,116,104,111,117,103,104, 32, 33, 33, - 32, 58, 48, 41, 32, 32, 32, 32, 32, 32, 42, 42, 10, 98,111,115, 99,111, - 109,100, 58, 10, 98,111,115, 99,111, 58, 10, 98,111,115, 99,111,109,100, - 111, 58, 10, 98,111,115, 99,111,111, 58, 10, 98,111,115, 99,111,111, 50, - 58, 10, 48, 58, 56, 98, 99, 53, 58,102, 58, 49, 55, 58, 49, 56, 10, 48, - 58, 56, 98,101, 52, 58, 49, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, - 56, 53, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 54, 48, - 58, 56, 58, 48, 48, 58, 48, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,103, 97,109,101,112,108, 97,110, 46, 99, 32, 40, 99,104, 97,108,108, - 101,110,103,101,114, 41, 10, 99,104, 97,108,108,101,110,103, 58, 10, 48, - 58, 99, 99, 58,102, 58, 48, 48, 58, 49,102, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,109, 57, 50, 46, 99, 32, 40,108,101,116,104, 97,108, 32, - 116,104,117,110,100,101,114, 41, 10,108,101,116,104, 97,108,116,104, 58, - 10,116,104,110,100, 98,108,115,116, 58, 10, 48, 58,101, 48, 48, 56, 54, - 58, 98, 55, 58, 48, 48, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40, 97,114, 97, 98, - 105, 97,110, 32,109, 97,103,105, 99, 41, 10, 97,114, 97, 98,105, 97,110, - 109, 58, 10, 97,114, 97, 98,105, 97,110,109,106, 58, 10, 97,114, 97, 98, - 105, 97,110,109,117, 58, 10, 48, 58, 52, 49, 48,101,102, 56, 58, 51, 48, - 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118, - 115,110,101,115, 46, 99, 32, 40,100,117, 99,107, 32,104,117,110,116, 41, - 10,100,117, 99,107,104,117,110,116, 58, 10, 48, 58, 54, 52, 48, 58, 50, - 48, 58, 49, 50, 58, 50, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 118,115,110,101,115, 46, 99, 32, 40,100,114, 32,109, 97,114,105,111, 41, - 10,100,114,109, 97,114,105,111, 58, 10, 48, 58, 49, 50, 48, 58, 57, 98, - 58, 48, 48, 58, 49, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118, - 115,110,101,115, 46, 99, 32, 40,118,115, 32,115,117,112,101,114, 32,109, - 97,114,105,111, 32, 98,114,111,115, 41, 10,115,117,112,114,109,114,105, - 111, 58, 10, 48, 58, 54, 54, 55, 53, 58, 56, 98, 58, 48, 53, 58, 48, 48, - 10, 48, 58, 55,100, 55, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10,115,117, - 112,114,109,114,105,111, 97, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 86, - 115, 46, 32, 83,117,112,101,114, 32, 77, 97,114,105,111, 32, 66,114,111, - 115, 46, 32, 40, 97,108,116, 41, 10, 48, 58, 54, 54, 55, 53, 58, 56, 98, - 58, 48, 53, 58, 48, 48, 10, 48, 58, 55,100, 55, 58, 54, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,108,101,108, 97,110, - 100, 46, 99, 32, 40,100, 97,110,103,101,114, 32,122,111,110,101, 41, 10, - 100, 97,110,103,101,114,122, 58, 10, 49, 58,101, 57, 48, 56, 58, 49, 50, - 101, 58, 53, 50, 58, 49, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 115,101,103, 97, 46, 99, 32, 40,101,108,105,109,105,110, 97,116,111,114, - 41, 10,101,108,105,109, 50, 58, 10, 48, 58, 99, 57, 50, 52, 58, 49, 52, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 57, 57,102, 58, 49,101, 58, 48, - 99, 58, 48, 51, 10, 10,101,108,105,109, 50, 97, 58, 10, 48, 58, 99, 57, - 50, 52, 58, 49, 52, 58, 50, 53, 58, 48, 53, 10, 48, 58, 99, 57, 57,102, - 58, 49,101, 58, 48, 99, 58, 48, 51, 10, 10,101,108,105,109, 52, 58, 10, - 48, 58, 99, 99, 52,100, 58, 49,101, 58, 48, 99, 58, 48, 51, 10, 48, 58, - 99, 57, 50, 56, 58, 49, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,122,111,100,105, 97,107, 46, 99, 32, 40,100,111, - 103, 32,102,105,103,104,116, 41, 10,100,111,103,102,105,103,104,116, 58, - 10, 48, 58, 53, 56, 55,101, 58, 56, 50, 58, 50, 48, 58,102,102, 10, 48, - 58, 98, 50,100,102, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 98, 50, - 102,102, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 98, 51, 49,102, 58, - 49, 58, 48, 51, 58, 48, 51, 10, 48, 58, 98, 51, 51,102, 58, 49, 58, 48, - 53, 58, 48, 53, 10, 48, 58, 98, 51, 53,102, 58, 49, 58, 48, 50, 58, 48, - 50, 10, 48, 58, 98, 51, 55,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 98, 51, 57,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, + 42, 42, 13, 10, 59, 32, 42, 42, 32,104,105,103,104,115, 99,111,114,101, + 32,116, 97, 98,108,101, 32,111,107, 32,116,104,111,117,103,104, 32, 33, + 33, 32, 58, 48, 41, 32, 32, 32, 32, 32, 32, 42, 42, 13, 10, 98,111,115, + 99,111,109,100, 58, 13, 10, 98,111,115, 99,111, 58, 13, 10, 98,111,115, + 99,111,109,100,111, 58, 13, 10, 98,111,115, 99,111,111, 58, 13, 10, 98, + 111,115, 99,111,111, 50, 58, 13, 10, 48, 58, 56, 98, 99, 53, 58,102, 58, + 49, 55, 58, 49, 56, 13, 10, 48, 58, 56, 98,101, 52, 58, 49, 48, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 56, 56, 53, 99, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 56, 48, 54, 48, 58, 56, 58, 48, 48, 58, 48, 50, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,109,101,112, + 108, 97,110, 46, 99, 32, 40, 99,104, 97,108,108,101,110,103,101,114, 41, + 13, 10, 99,104, 97,108,108,101,110,103, 58, 13, 10, 48, 58, 99, 99, 58, + 102, 58, 48, 48, 58, 49,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,109, 57, 50, 46, 99, 32, 40,108,101,116,104, 97,108, 32,116,104, + 117,110,100,101,114, 41, 13, 10,108,101,116,104, 97,108,116,104, 58, 13, + 10,116,104,110,100, 98,108,115,116, 58, 13, 10, 48, 58,101, 48, 48, 56, + 54, 58, 98, 55, 58, 48, 48, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,116, 97,105,116,111, 95,102, 51, 46, 99, 32, 40, 97, + 114, 97, 98,105, 97,110, 32,109, 97,103,105, 99, 41, 13, 10, 97,114, 97, + 98,105, 97,110,109, 58, 13, 10, 97,114, 97, 98,105, 97,110,109,106, 58, + 13, 10, 97,114, 97, 98,105, 97,110,109,117, 58, 13, 10, 48, 58, 52, 49, + 48,101,102, 56, 58, 51, 48, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, 46, 99, 32, 40,100, + 117, 99,107, 32,104,117,110,116, 41, 13, 10,100,117, 99,107,104,117,110, + 116, 58, 13, 10, 48, 58, 54, 52, 48, 58, 50, 48, 58, 49, 50, 58, 50, 56, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115,110,101,115, + 46, 99, 32, 40,100,114, 32,109, 97,114,105,111, 41, 13, 10,100,114,109, + 97,114,105,111, 58, 13, 10, 48, 58, 49, 50, 48, 58, 57, 98, 58, 48, 48, + 58, 49, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,115, + 110,101,115, 46, 99, 32, 40,118,115, 32,115,117,112,101,114, 32,109, 97, + 114,105,111, 32, 98,114,111,115, 41, 13, 10,115,117,112,114,109,114,105, + 111, 58, 13, 10, 48, 58, 54, 54, 55, 53, 58, 56, 98, 58, 48, 53, 58, 48, + 48, 13, 10, 48, 58, 55,100, 55, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,115,117,112,114,109,114,105,111, 97, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42, 86,115, 46, 32, 83,117,112,101,114, 32, 77, 97,114,105,111, + 32, 66,114,111,115, 46, 32, 40, 97,108,116, 41, 13, 10, 48, 58, 54, 54, + 55, 53, 58, 56, 98, 58, 48, 53, 58, 48, 48, 13, 10, 48, 58, 55,100, 55, + 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,108,101,108, 97,110,100, 46, 99, 32, 40,100, 97,110,103,101, + 114, 32,122,111,110,101, 41, 13, 10,100, 97,110,103,101,114,122, 58, 13, + 10, 49, 58,101, 57, 48, 56, 58, 49, 50,101, 58, 53, 50, 58, 49, 52, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, 46, 99, + 32, 40,101,108,105,109,105,110, 97,116,111,114, 41, 13, 10,101,108,105, + 109, 50, 58, 13, 10, 48, 58, 99, 57, 50, 52, 58, 49, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 99, 57, 57,102, 58, 49,101, 58, 48, 99, 58, 48, + 51, 13, 10, 13, 10,101,108,105,109, 50, 97, 58, 13, 10, 48, 58, 99, 57, + 50, 52, 58, 49, 52, 58, 50, 53, 58, 48, 53, 13, 10, 48, 58, 99, 57, 57, + 102, 58, 49,101, 58, 48, 99, 58, 48, 51, 13, 10, 13, 10,101,108,105,109, + 52, 58, 13, 10, 48, 58, 99, 99, 52,100, 58, 49,101, 58, 48, 99, 58, 48, + 51, 13, 10, 48, 58, 99, 57, 50, 56, 58, 49, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,122,111,100,105, 97, + 107, 46, 99, 32, 40,100,111,103, 32,102,105,103,104,116, 41, 13, 10,100, + 111,103,102,105,103,104,116, 58, 13, 10, 48, 58, 53, 56, 55,101, 58, 56, + 50, 58, 50, 48, 58,102,102, 13, 10, 48, 58, 98, 50,100,102, 58, 49, 58, + 50, 52, 58, 50, 52, 13, 10, 48, 58, 98, 50,102,102, 58, 49, 58, 50, 52, + 58, 50, 52, 13, 10, 48, 58, 98, 51, 49,102, 58, 49, 58, 48, 51, 58, 48, + 51, 13, 10, 48, 58, 98, 51, 51,102, 58, 49, 58, 48, 53, 58, 48, 53, 13, + 10, 48, 58, 98, 51, 53,102, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, + 58, 98, 51, 55,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 98, + 51, 57,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,108, 97,121, 99,104, 49, 48, 46, 99, 32, 40,112, 108, 97,121, 99,104,111,105, 99,101, 32, 49, 48, 32, 45, 32, 98, 97,108, - 108,111,111,110, 32,102,105,103,104,116, 41, 10, 59,112, 99, 95, 98,102, - 103,104,116, 58, 10, 59, 49, 58, 54, 50, 57, 58, 53, 58, 48, 48, 58, 48, - 48, 10, 59, 49, 58,100, 58, 53, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42,112,108, 97,121, 99,104, 49, 48, 46, 99, 32, 40, - 112,108, 97,121, 99,104,111,105, 99,101, 32, 49, 48, 32, 45, 32, 49, 57, - 52, 50, 41, 10, 59,112, 99, 95, 49, 57, 52, 50, 58, 10, 59, 49, 58, 55, - 98,102, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42,108,119,105,110,103,115, 46, 99, 32, 40,115,101, 99,116,105,111, - 110, 32,122, 41, 10,115,101, 99,116,105,111,110,122, 58, 10,115,101, 99, - 116,105,111,110,122, 97, 58, 10, 48, 58, 99,101, 48, 48, 58, 53, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 99,101, 57, 55, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 99,101, 52,102, 58, 49, 58, 48, 56, 58, 48, 56, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,109,110,116, 46, 99, 32, 40, - 116,104,117,110,100,101,114, 32, 99,114,111,115,115, 32, 50, 41, 10,116, - 104,110,100,114,120, 50, 58, 10,116,104,110,100,114,120, 50, 97, 58, 10, - 116,104,110,100,114,120, 50,106, 58, 10, 48, 58, 49, 48, 48, 50,102, 48, - 58, 53, 48, 58, 48, 48, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 97,108,112,104, 97, 54, 56,107, 46, 99, 32, 40,115,107,121, - 32,115,111,108,100,105,101,114,115, 41, 10,115,107,121,115,111,108,100, - 114, 58, 10,115,107,121,115,111,108,100,114, 98,108, 58, 10, 48, 58, 50, - 48, 52, 49, 48, 48, 58, 99, 48, 58, 48, 48, 58, 48, 99, 10, 48, 58, 52, - 48, 48, 51, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 99, 97,118,101, 46, 99, 32, 40,100,111,110,112, 97, 99, - 104,105, 41, 10,100,111,110,112, 97, 99,104,105, 58, 10,100,111,110,112, - 97, 99,104,106, 58, 10,100,111,110,112, 97, 99,104,105,104,107, 58, 10, - 100,111,110,112, 97, 99,104,105,107,114, 58, 10, 48, 58, 49, 48, 49, 55, - 56, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 49, 56, 52, - 54, 58, 53, 97, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42, 99, 97,118,101, 46, 99, 10,100,100,111,110,112, 97, 99,104, - 58, 10,100,100,111,110,112, 97, 99,104,106, 58, 10,100,100,111,110,112, - 97, 99,104, 97, 58, 10, 48, 58, 49, 48, 49, 54,101, 97, 58, 54, 52, 58, - 48, 48, 58, 48, 53, 10, 48, 58, 49, 48, 49, 54, 50, 54, 58, 52, 58, 48, - 48, 58, 48, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,113,117, 97, - 110,116,117,109, 46, 99, 32, 40,113,117, 97,110,116,117,109, 41, 10, 59, - 42, 32,115,105,103,110,105,116,117,114,101, 32,105,115, 32,115, 99,114, - 101,119,101,100, 32,117,112, 32, 40,111,116,104,101,114, 32,115, 99,111, - 114,101,115, 32,111,107, 41, 32, 42, 10,113,117, 97,110,116,117,109, 58, - 10,113,117, 97,110,116,117,109, 49, 58, 10,113,117, 97,110,116,117,109, - 112, 58, 10, 48, 58, 49, 98, 53, 97, 97, 58, 49, 50, 53, 52, 58, 48, 48, - 58, 53, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42,112,108, 97,121, 99,104, - 49, 48, 46, 99, 32, 40,112,108, 97,121, 32, 99,104,111,105, 99,101, 32, - 49, 48, 58,115,117,112,101,114, 32,109, 97,114,105,111, 32, 98,114,111, - 115, 41, 10, 59,112, 99, 95,115,109, 98, 58, 10, 59, 49, 58, 55,100, 55, - 58, 55, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 108,111,111,110, 32,102,105,103,104,116, 41, 13, 10, 59,112, 99, 95, 98, + 102,103,104,116, 58, 13, 10, 59, 49, 58, 54, 50, 57, 58, 53, 58, 48, 48, + 58, 48, 48, 13, 10, 59, 49, 58,100, 58, 53, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,112,108, 97,121, 99,104, 49, + 48, 46, 99, 32, 40,112,108, 97,121, 99,104,111,105, 99,101, 32, 49, 48, + 32, 45, 32, 49, 57, 52, 50, 41, 13, 10, 59,112, 99, 95, 49, 57, 52, 50, + 58, 13, 10, 59, 49, 58, 55, 98,102, 58, 54, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,108,119,105,110,103,115, 46, + 99, 32, 40,115,101, 99,116,105,111,110, 32,122, 41, 13, 10,115,101, 99, + 116,105,111,110,122, 58, 13, 10,115,101, 99,116,105,111,110,122, 97, 58, + 13, 10, 48, 58, 99,101, 48, 48, 58, 53, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 99,101, 57, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 99,101, 52,102, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,116,109,110,116, 46, 99, 32, 40,116,104, + 117,110,100,101,114, 32, 99,114,111,115,115, 32, 50, 41, 13, 10,116,104, + 110,100,114,120, 50, 58, 13, 10,116,104,110,100,114,120, 50, 97, 58, 13, + 10,116,104,110,100,114,120, 50,106, 58, 13, 10, 48, 58, 49, 48, 48, 50, + 102, 48, 58, 53, 48, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 97,108,112,104, 97, 54, 56,107, 46, 99, 32, + 40,115,107,121, 32,115,111,108,100,105,101,114,115, 41, 13, 10,115,107, + 121,115,111,108,100,114, 58, 13, 10,115,107,121,115,111,108,100,114, 98, + 108, 58, 13, 10, 48, 58, 50, 48, 52, 49, 48, 48, 58, 99, 48, 58, 48, 48, + 58, 48, 99, 13, 10, 48, 58, 52, 48, 48, 51, 48, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99, 97,118,101, + 46, 99, 32, 40,100,111,110,112, 97, 99,104,105, 41, 13, 10,100,111,110, + 112, 97, 99,104,105, 58, 13, 10,100,111,110,112, 97, 99,104,106, 58, 13, + 10,100,111,110,112, 97, 99,104,105,104,107, 58, 13, 10,100,111,110,112, + 97, 99,104,105,107,114, 58, 13, 10, 48, 58, 49, 48, 49, 55, 56, 50, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 49, 56, 52, 54, 58, + 53, 97, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 99, 97,118,101, 46, 99, 13, 10,100,100,111,110,112, 97, 99, + 104, 58, 13, 10,100,100,111,110,112, 97, 99,104,106, 58, 13, 10,100,100, + 111,110,112, 97, 99,104, 97, 58, 13, 10, 48, 58, 49, 48, 49, 54,101, 97, + 58, 54, 52, 58, 48, 48, 58, 48, 53, 13, 10, 48, 58, 49, 48, 49, 54, 50, + 54, 58, 52, 58, 48, 48, 58, 48, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,113,117, 97,110,116,117,109, 46, 99, 32, 40,113,117, 97, + 110,116,117,109, 41, 13, 10, 59, 42, 32,115,105,103,110,105,116,117,114, + 101, 32,105,115, 32,115, 99,114,101,119,101,100, 32,117,112, 32, 40,111, + 116,104,101,114, 32,115, 99,111,114,101,115, 32,111,107, 41, 32, 42, 13, + 10,113,117, 97,110,116,117,109, 58, 13, 10,113,117, 97,110,116,117,109, + 49, 58, 13, 10,113,117, 97,110,116,117,109,112, 58, 13, 10, 48, 58, 49, + 98, 53, 97, 97, 58, 49, 50, 53, 52, 58, 48, 48, 58, 53, 52, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42,112,108, 97,121, 99,104, 49, 48, 46, 99, + 32, 40,112,108, 97,121, 32, 99,104,111,105, 99,101, 32, 49, 48, 58,115, + 117,112,101,114, 32,109, 97,114,105,111, 32, 98,114,111,115, 41, 13, 10, + 59,112, 99, 95,115,109, 98, 58, 13, 10, 59, 49, 58, 55,100, 55, 58, 55, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 112,108, 97,121, 99,104, 49, 48, 46, 99, 32, 40,112,108, 97,121, 32, 99, 104,111,105, 99,101, 32, 49, 48, 58,114, 99, 32,112,114,111, 32, 97,109, - 41, 10, 59,112, 99, 95,114, 99,112, 97,109, 58, 10, 59, 49, 58, 51, 55, - 56, 58, 54, 52, 58, 49, 55, 58, 50, 57, 32, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,100,101,110,105, 97,109, 46, 99, 32, 40,107, 97,114,105, - 97,110, 32, 99,114,111,115,115, 41, 10,107, 97,114,105, 97,110,120, 58, - 10, 48, 58,102,102, 48, 54, 57, 99, 58, 54, 56, 58, 52, 98, 58, 51, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 99, 99,108,105,109, 98, - 101,114, 46, 99, 32, 40,115,119,105,109,109,101,114, 41, 10,115,119,105, - 109,109,101,114, 58, 10,115,119,105,109,109,101,114, 97, 58, 10,115,119, - 105,109,109,101,114, 98, 58, 10, 48, 58, 56, 52,101, 48, 58, 50,100, 58, - 48, 48, 58, 52, 56, 10, 48, 58, 56, 53, 55, 55, 58, 54, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40, - 104,101, 97,114,116, 32, 97,116,116, 97, 99,107, 41, 10,104,101, 97,114, - 116, 97,116,107, 58, 10, 48, 58, 51, 99, 48, 48, 58, 50, 55, 58, 48, 49, - 58, 49, 98, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,118,115, 46, - 99, 32, 40,108,111,103,103,101,114, 41, 10,108,111,103,103,101,114, 58, - 10, 48, 58, 51, 99, 48, 57, 58, 51, 48, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40,100, 97,122,122, - 108,101,114, 41, 10, 59, 42, 42, 32,117,100, 97,116,101,115, 32,104,105, - 103,104,115, 99,111,114,101, 32, 97,116, 32,101,110,100, 32,111,102, 32, - 49,115,116, 32,103, 97,109,101, 32, 42, 42, 10, 59, 42, 42, 32,111,114, - 32, 97,102,116,101,114, 32, 50,110,100, 32, 97,116,116,114, 97, 99,116, - 32,109,111,100,101, 32, 42, 42, 10,100, 97,122,122,108,101,114, 58, 10, - 48, 58, 51, 99,101, 97, 58, 50, 48, 58, 48, 48, 58, 49, 98, 10, 48, 58, - 51,100, 49, 49, 58, 50, 98, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40,118,105,100,101,111, 32, - 56, 32, 98, 97,108,108, 41, 10, 56, 98, 97,108,108, 58, 10, 56, 98, 97, - 108,108, 49, 58, 10, 48, 58, 51, 99, 48, 99, 58, 51, 56, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,117,112,114,108,111, - 99,111, 46, 99, 32, 40,115,117,112,101,114, 32,108,111, 99,111,109,111, - 116,105,118,101, 41, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 97,118,101, - 115, 32,116,111,112, 32, 49, 48, 32,115, 99,111,114,101,115, 32,111,110, - 108,121, 10, 59, 42, 42, 42, 42, 42, 99, 97,110, 96,116, 32, 98,101, 32, + 41, 13, 10, 59,112, 99, 95,114, 99,112, 97,109, 58, 13, 10, 59, 49, 58, + 51, 55, 56, 58, 54, 52, 58, 49, 55, 58, 50, 57, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,100,101,110,105, 97,109, 46, 99, 32, 40,107, + 97,114,105, 97,110, 32, 99,114,111,115,115, 41, 13, 10,107, 97,114,105, + 97,110,120, 58, 13, 10, 48, 58,102,102, 48, 54, 57, 99, 58, 54, 56, 58, + 52, 98, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 99, 99,108,105,109, 98,101,114, 46, 99, 32, 40,115,119,105,109,109, + 101,114, 41, 13, 10,115,119,105,109,109,101,114, 58, 13, 10,115,119,105, + 109,109,101,114, 97, 58, 13, 10,115,119,105,109,109,101,114, 98, 58, 13, + 10, 48, 58, 56, 52,101, 48, 58, 50,100, 58, 48, 48, 58, 52, 56, 13, 10, + 48, 58, 56, 53, 55, 55, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40,104,101, 97,114, + 116, 32, 97,116,116, 97, 99,107, 41, 13, 10,104,101, 97,114,116, 97,116, + 107, 58, 13, 10, 48, 58, 51, 99, 48, 48, 58, 50, 55, 58, 48, 49, 58, 49, + 98, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,118,115, 46, + 99, 32, 40,108,111,103,103,101,114, 41, 13, 10,108,111,103,103,101,114, + 58, 13, 10, 48, 58, 51, 99, 48, 57, 58, 51, 48, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 32, 40, + 100, 97,122,122,108,101,114, 41, 13, 10, 59, 42, 42, 32,117,100, 97,116, + 101,115, 32,104,105,103,104,115, 99,111,114,101, 32, 97,116, 32,101,110, + 100, 32,111,102, 32, 49,115,116, 32,103, 97,109,101, 32, 42, 42, 13, 10, + 59, 42, 42, 32,111,114, 32, 97,102,116,101,114, 32, 50,110,100, 32, 97, + 116,116,114, 97, 99,116, 32,109,111,100,101, 32, 42, 42, 13, 10,100, 97, + 122,122,108,101,114, 58, 13, 10, 48, 58, 51, 99,101, 97, 58, 50, 48, 58, + 48, 48, 58, 49, 98, 13, 10, 48, 58, 51,100, 49, 49, 58, 50, 98, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 99,118, + 115, 46, 99, 32, 40,118,105,100,101,111, 32, 56, 32, 98, 97,108,108, 41, + 13, 10, 56, 98, 97,108,108, 58, 13, 10, 56, 98, 97,108,108, 49, 58, 13, + 10, 48, 58, 51, 99, 48, 99, 58, 51, 56, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115,117,112,114,108,111, 99,111, + 46, 99, 32, 40,115,117,112,101,114, 32,108,111, 99,111,109,111,116,105, + 118,101, 41, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,115, 97,118,101,115, + 32,116,111,112, 32, 49, 48, 32,115, 99,111,114,101,115, 32,111,110,108, + 121, 13, 10, 59, 42, 42, 42, 42, 42, 99, 97,110, 96,116, 32, 98,101, 32, 98,111,116,104,101,114,101,100, 32,119,105,116,104, 32,108,111,119,101, - 114, 32,115, 99,111,114,101,115, 32, 33, 33, 10,115,117,112,114,108,111, - 99,111, 58, 10,115,117,112,114,108,111, 99,111, 97, 58, 10,115,117,112, - 114,108,111, 99,111,111, 58, 10, 48, 58,102,100, 48, 48, 58, 49,101, 58, - 48, 50, 58, 48, 48, 10, 48, 58,102, 99, 97, 48, 58, 49, 50, 58, 52, 49, - 58, 52, 56, 10, 48, 58,102, 99, 50, 99, 58, 51, 58, 48, 50, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32,108, 97,116, - 101,115,116, 32,117,110,111,102,102,105, 99,105, 97,108, 32, 97,100,100, - 105,116,105,111,110,115, 32, 97, 98,111,118,101, 32,116,104,105,115, 32, - 108,105,110,101, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 32,111,102,102,105, 99,105, 97,108, - 32,104,105,115, 99,111,114,101, 46,100, 97,116, 32,118, 55, 46, 48, 32, - 115,116, 97,114,116,115, 32,104,101,114,101, 32, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 49, 57, 52, 51, 46, 99, 10, 49, 57, 52, 51,117, - 58, 10, 49, 57, 52, 51, 58, 10, 49, 57, 52, 51,117, 97, 58, 10, 48, 58, - 101, 54, 48, 48, 58, 54, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 49, - 49, 48, 58, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 49, 98,101, 58, - 49, 58, 50, 52, 58, 50, 52, 10, 48, 58,100, 49,100,101, 58, 49, 58, 50, - 52, 58, 50, 52, 10, 48, 58,100, 49,102,101, 58, 49, 58, 48, 50, 58, 48, - 50, 10, 48, 58,100, 50, 49,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,100, 50, 51,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 50, - 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 50, 55,101, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 10, 49, 57, 52, 51,107, 97,105, 58, 10, - 49, 57, 52, 51,106, 58, 10, 49, 57, 52, 51, 98, 58, 10, 49, 57, 52, 51, - 106, 97, 58, 10, 49, 57, 52, 51, 98,106, 58, 10, 48, 58,101, 54, 48, 48, - 58, 54, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 49, 49, 48, 58, 56, - 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 49, 98,101, 58, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58,100, 49,100,101, 58, 49, 58, 48, 50, 58, 48, 50, - 10, 48, 58,100, 49,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 100, 50, 49,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 50, 51, - 101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 50, 53,101, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 50, 55,101, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 56, 48, 56, 48, - 98,119, 46, 99, 10, 50, 56, 48,122,122,122, 97,112, 58, 10, 48, 58, 50, - 48, 51,100, 58, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 48, 50, 57, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 98, 97,108,108, 98,111,109, 98, - 58, 10, 48, 58, 50, 48,100, 99, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, - 10, 98,108,117,101,115,104,114,107, 58, 10, 48, 58, 50, 48, 48, 97, 58, - 48, 53, 58, 48, 48, 58, 48, 48, 10, 10, 98,111,119,108,101,114, 58, 10, - 48, 58, 50, 50, 97, 48, 58, 48, 56, 58, 48, 48, 58, 48, 48, 10, 10, 99, - 108,111,119,110,115, 58, 32, 32, 59, 42, 42, 42, 32,100,111,110,116, 32, - 115,116, 97,114,116, 32,103, 97,109,101, 32,117,110,116,105,108,108, 32, - 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32,115,116, 97,114,116, - 115, 46, 40,104,105,115, 99,111,114,101, 32, 97,108,115,111, 32,117,112, - 100, 97,116,101,100, 32,116,104,101,110, 41, 10, 99,108,111,119,110,115, - 49, 58, 32, 32, 59, 42, 42, 42, 32,100,111,110,116, 32,115,116, 97,114, - 116, 32,103, 97,109,101, 32,117,110,116,105,108,108, 32, 97,116,116,114, - 97, 99,116, 32,109,111,100,101, 32,115,116, 97,114,116,115, 46, 40,104, - 105,115, 99,111,114,101, 32, 97,108,115,111, 32,117,112,100, 97,116,101, - 100, 32,116,104,101,110, 41, 10, 48, 58, 50, 48, 49, 53, 58, 48, 50, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 51,101, 97, 48, 58, 49, 52, 48, 58, 48, - 48, 58, 54, 54, 10, 10,100,101,115,101,114,116,103,117, 58, 10, 48, 58, - 50, 48, 48, 54, 58, 48, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 48, - 48, 98, 58, 48, 50, 58, 48, 48, 58, 48, 48, 10, 10,103, 97,108,120,119, - 97,114,115, 58, 10,115,116, 97,114,119, 58, 10,103, 97,108,120,119, 97, - 114,115,116, 58, 10,103, 97,108,120,119, 97,114,115, 50, 58, 10,115,116, - 97,114,119, 49, 58, 10, 48, 58, 50, 48, 48, 53, 58, 48, 54, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 32,117,112,100, 97,116,101,100, 32,119,104,101, - 110, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 10,104,101,108, - 105,102,105,114,101, 58, 10,104,101,108,105,102,105,114,101, 97, 58, 10, - 48, 58, 54, 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,105,110, - 118, 97,100,112,116, 50, 58, 10,105,110,118, 97,100,100,108,120, 58, 32, - 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, 58, 48, 53, 10, 48, 58, - 50, 51, 52, 48, 58, 97, 58, 49, 98, 58, 49, 98, 10, 10,109,111,111,110, - 98, 97,115,101, 58, 10,109,111,111,110, 98, 97,115,101, 97, 58, 10, 48, - 58, 50, 51, 52, 48, 58, 97, 58, 48,100, 58, 49, 52, 10, 48, 58, 50, 48, - 102, 52, 58, 50, 58, 48, 48, 58, 48, 53, 10, 10,105,110,118,114,118,110, - 103,101, 58, 10,105,110,118,114,118,110,103,101, 97, 58, 10,105,110,118, - 114,118,110,103,101, 98, 58, 10,105,110,118,114,118,110,103,101,100,117, - 58, 10,105,110,118,114,118,110,103,101,103,119, 58, 10, 48, 58, 50, 48, - 49, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,108, 97,103,117,110, 97, - 114, 58, 10, 48, 58, 50, 48, 49, 49, 58, 57, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 50, 48, 48, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,108,114, - 101,115, 99,117,101, 58, 10,119, 97,114,108, 58, 10,100,101,115,116,101, - 114,116,104, 58, 10,108,114,101,115, 99,117,101,109, 58, 32, 32, 10,108, - 114,101,115, 99,117,101,109, 50, 58, 10, 59,117,112,100, 97,116,101,100, - 32,119,104,101,110, 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, - 10, 48, 58, 50, 48,100, 98, 58, 49, 58, 48, 97, 58, 48, 97, 10, 48, 58, - 50, 48, 99,102, 58, 97, 58, 49, 98, 58, 49, 98, 10, 48, 58, 50, 48,102, - 52, 58, 50, 58, 48, 48, 58, 48, 53, 10, 10,108,117,112,105,110, 51, 58, - 10, 48, 58, 50, 48,100, 99, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10, - 111,122,109, 97,119, 97,114,115, 58, 10,111,122,109, 97,119, 97,114,115, - 50, 58, 10,115,111,108,102,105,103,104,116, 58, 10,115,112, 97, 99,101, - 112,104, 58, 10, 48, 58, 50, 48, 52, 51, 58, 48, 50, 58, 48, 48, 58, 48, - 48, 10, 10,112,111,108, 97,114,105,115, 58, 10, 48, 58, 50, 51, 49, 52, - 58, 48, 50, 58, 48, 48, 58, 48, 48, 10, 10,112,111,108, 97,114,105,115, - 97, 58, 10,112,111,108, 97,114,105,115, 98,114, 58, 10, 48, 58, 50, 49, - 53, 48, 58, 49, 52, 58, 48, 48, 58, 48, 48, 32, 32, 10, 48, 58, 50, 49, - 54, 53, 58, 49,101, 58, 50, 97, 58, 50, 97, 32, 10, 48, 58, 50, 51, 49, - 52, 58, 48, 50, 58, 48, 48, 58, 48, 48, 32, 10, 10,114,111,108,108,105, - 110,103, 99, 58, 10, 48, 58, 50, 51, 48, 50, 58, 48,102, 58, 48, 48, 58, - 48, 48, 10, 10,115, 99,104, 97,115,101,114, 58, 10,115, 99,104, 97,115, - 101,114, 97, 58, 10,115, 99,104, 97,115,101,114, 98, 58, 10,115, 99,104, - 97,115,101,114, 99, 58, 10, 48, 58, 50, 50, 52, 52, 58, 48, 97, 58, 49, - 98, 58, 49, 98, 10, 48, 58, 50, 51, 51,102, 58, 48, 51, 58, 48, 49, 58, - 48, 48, 10, 10,115, 99,104, 97,115,101,114, 99,118, 58, 10, 48, 58, 50, - 51, 51,100, 58, 48, 51, 58, 48, 49, 58, 48, 48, 10, 10,115,101, 97,119, - 111,108,102, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97, - 110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, - 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110, - 116,114,121, 93, 10, 48, 58, 50, 48, 48, 54, 58, 48, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 50, 48, 48, 49, 58, 48, 49, 58, 48, 57, 58, 48, 57, - 10, 10,115,112, 99,101,110, 99,116,114, 58, 10, 48, 58, 50, 54,102, 48, - 58, 50, 58, 48,101, 58, 48,101, 10, 48, 58, 50, 48, 50,101, 58, 50, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 50, 48, 50, 98, 58, 50, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97, 99,116,102, 97, - 110, 99,114, 46, 99, 32, 10, 97, 99,116,102, 97,110, 99,114, 58, 10, 97, - 99,116,102, 97,110, 99,114,106, 58, 10, 97, 99,116,102, 97,110, 99,114, - 49, 58, 10, 48, 58, 49,102, 48, 99,101, 54, 58, 49,101, 58, 48, 53, 58, - 52, 53, 10, 48, 58, 49,102, 48, 48, 98,101, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,101,114,111,102,103, - 116, 46, 99, 10, 97,101,114,111,102,103,116, 58, 10, 48, 58,102,102, 99, - 49, 97,102, 58, 57, 55, 58, 48, 98, 58, 54, 52, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 97,106, 97,120, 46, 99, 10, 97,106, 97,120, 58, 10, - 97,106, 97,120,106, 58, 10, 48, 58, 50, 49, 48, 48, 58, 53, 48, 58, 49, - 97, 58, 48, 48, 10, 48, 58, 50, 48, 53, 48, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10,116,117,114,116,108,101,115, 58, 10,116,117,114,112,105,110, - 58, 10,116,117,114,112,105,110,115, 58, 10, 54, 48, 48, 58, 10, 48, 58, - 56, 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, - 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 51, 52, 48, 58, - 49, 58, 48, 49, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 97,112,112,111,111,111,104, 46, 99, 10, 97,112,112,111,111,111,104, 58, - 10, 48, 58,101, 48, 50, 57, 58, 51, 58, 53, 51, 58, 52,100, 10, 48, 58, - 101, 48, 49, 55, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 49, - 56, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58,101, 52, 48, 48, 58,100, - 99, 58, 53, 51, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 97,114,103,117,115, 46, 99, 10, 97,114,103,117,115, 58, 10, 48, 58,102, - 98, 56, 48, 58, 52, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 51, - 57, 58, 55, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 51,100, 58, 49, - 58, 48, 55, 58, 48, 55, 10, 10,118, 97,108,116,114,105, 99, 58, 10, 48, - 58,102, 99, 97, 48, 58, 50, 56, 58, 48, 48, 58, 53, 51, 10, 48, 58,102, - 99, 51, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 97,114,107, 97,110, - 111,105,100, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97, - 110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, - 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110, - 116,114,121, 93, 10, 97,114,107, 49, 98, 97,108,108, 58, 32, 10, 97,114, - 107, 97,110,103, 99, 58, 32, 10, 97,114,107, 97,110,103, 99, 50, 58, 32, - 10, 97,114,107, 98,108,111, 99, 50, 58, 10, 97,114,107, 98,108,111, 99, - 107, 58, 10, 97,114,107,103, 99, 98,108, 58, 32, 10, 97,114,107,109, 99, - 117, 98,108, 58, 10, 97,114,107, 97,110,111,105,100,117, 58, 10, 97,114, - 107, 97,110,111,105,100,117,111, 58, 10, 97,114,107, 97,116, 97,121,116, - 58, 10,112, 97,100,100,108,101, 50, 58, 10, 97,114,107,103, 99, 98,108, - 97, 58, 10, 97,114,107, 98,108,111, 99, 51, 58, 10, 97,114,107, 97,110, - 111,105,100,106,111, 58, 10, 97,114,107, 97,110,111,105,100,106, 98, 58, - 10, 97,114,107, 97,110,111,105,100,106, 97, 58, 10, 97,114,107, 97,110, - 111,105,100,106, 98, 58, 10, 97,114,107, 97,110,111,105,100,106, 98,108, - 58, 10, 97,114,107, 97,110,111,105,100,106, 98, 50, 58, 10, 97,114,107, - 97,110,111,105,100,106, 98,108, 50, 58, 10, 97,114,107, 97,110,111,105, - 100,106, 58, 10, 48, 58,101,102, 55, 57, 58, 50, 51, 58, 48, 48, 58, 53, - 50, 10, 48, 58, 99, 52,100,102, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, - 10, 98,108,111, 99,107, 50, 58, 10, 48, 58,101,102, 55, 57, 58, 50, 51, - 58, 48, 48, 58, 52, 97, 10, 48, 58, 99, 52,100,102, 58, 48, 51, 58, 48, - 48, 58, 48, 48, 10, 10, 97,114,107,116, 97,121,116, 50, 58, 10, 48, 58, - 101,102, 55, 57, 58, 50, 51, 58, 48, 48, 58, 52, 50, 10, 48, 58, 99, 52, - 100,102, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10, 97,114,107, 97,116, - 111,117,114, 58, 10, 48, 58,101,102, 55, 99, 58, 50, 51, 58, 48, 48, 58, - 53, 50, 10, 48, 58, 99, 52,100,102, 58, 48, 51, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,114,109,101,100,102, 46, - 99, 10, 97,114,109,101,100,102, 58, 10, 97,114,109,101,100,102,102, 58, - 10, 48, 58, 54, 49, 49, 98, 54, 58, 52,102, 58, 48, 48, 58, 52, 97, 10, - 48, 58, 54, 49, 50, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 99, - 99,108,105,109, 98,114, 50, 58, 10, 48, 58, 54, 49, 50, 97, 55, 58, 52, - 57, 58, 49, 48, 58, 48, 48, 10, 48, 58, 54, 49, 50,102, 50, 58, 49, 58, - 53, 48, 58, 53, 48, 10, 10,116,101,114,114, 97,102, 58, 10,116,101,114, - 114, 97,102,117, 58, 10,116,101,114,114, 97,102, 97, 58, 10,116,101,114, - 114, 97,102, 98, 58, 10,116,101,114,114, 97,102,106, 98, 58, 10,116,101, - 114,114, 97,102,106, 58, 10, 48, 58, 54, 48, 54, 54,101, 58, 51, 99, 58, - 48, 48, 58, 52, 97, 10, 48, 58, 54, 48, 54, 98, 50, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 10, 97,115,116,101,114,111,105, 49, 58, 10, 48, 58, 48, - 48, 49, 99, 58, 51, 53, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 97,115,116,114,111, 99,100,101, 46, 99, 10,103,111, - 114,102, 58, 32, 59, 42, 32,114,101,115,101,116,116,105,110,103, 32,115, - 99,114,101,119,115, 32,117,112, 32, 50, 32,115, 99,111,114,101,115, 32, - 97,110,100, 32,116,111,112, 32,115, 99,111,114,101, 10,103,111,114,102, - 112,103,109, 49, 58, 10, 48, 58,100, 48, 49, 48, 58, 50, 50, 58, 48, 48, - 58, 48, 48, 10, 10,114,111, 98, 98,121, 58, 10, 48, 58,101, 49, 99, 55, - 58, 50, 49, 58, 52, 97, 58, 52, 98, 10, 48, 58,101, 49, 54, 49, 58, 49, - 101, 58, 53, 48, 58, 53, 56, 10, 48, 58,101, 49, 57,100, 58, 50, 97, 58, - 57,101, 58, 52, 55, 10, 48, 58,101, 49, 51, 98, 58, 50, 54, 58, 49, 48, - 58, 49, 55, 10, 48, 58,101, 51, 99, 55, 58, 50, 49, 58, 52, 97, 58, 52, - 98, 10, 48, 58,101, 51, 54, 49, 58, 49,101, 58, 53, 48, 58, 53, 56, 10, - 48, 58,101, 51, 57,100, 58, 50, 97, 58, 57,101, 58, 52, 55, 10, 48, 58, - 101, 51, 51, 98, 58, 50, 54, 58, 49, 48, 58, 49, 55, 10, 10,115,101, 97, + 114, 32,115, 99,111,114,101,115, 32, 33, 33, 13, 10,115,117,112,114,108, + 111, 99,111, 58, 13, 10,115,117,112,114,108,111, 99,111, 97, 58, 13, 10, + 115,117,112,114,108,111, 99,111,111, 58, 13, 10, 48, 58,102,100, 48, 48, + 58, 49,101, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58,102, 99, 97, 48, 58, + 49, 50, 58, 52, 49, 58, 52, 56, 13, 10, 48, 58,102, 99, 50, 99, 58, 51, + 58, 48, 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 32,108, 97,116,101,115,116, 32,117,110,111,102,102,105, + 99,105, 97,108, 32, 97,100,100,105,116,105,111,110,115, 32, 97, 98,111, + 118,101, 32,116,104,105,115, 32,108,105,110,101, 32, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 32,111,102,102,105, 99,105, 97,108, 32,104,105,115, 99,111,114,101, + 46,100, 97,116, 32,118, 55, 46, 48, 32,115,116, 97,114,116,115, 32,104, + 101,114,101, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 49, 57, 52, 51, 46, 99, 13, 10, 49, 57, 52, 51,117, 58, 13, 10, 49, 57, + 52, 51, 58, 13, 10, 49, 57, 52, 51,117, 97, 58, 13, 10, 48, 58,101, 54, + 48, 48, 58, 54, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 49, 49, + 48, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 49, 98,101, 58, + 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58,100, 49,100,101, 58, 49, 58, + 50, 52, 58, 50, 52, 13, 10, 48, 58,100, 49,102,101, 58, 49, 58, 48, 50, + 58, 48, 50, 13, 10, 48, 58,100, 50, 49,101, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58,100, 50, 51,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,100, 50, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,100, 50, 55,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 49, + 57, 52, 51,107, 97,105, 58, 13, 10, 49, 57, 52, 51,106, 58, 13, 10, 49, + 57, 52, 51, 98, 58, 13, 10, 49, 57, 52, 51,106, 97, 58, 13, 10, 49, 57, + 52, 51, 98,106, 58, 13, 10, 48, 58,101, 54, 48, 48, 58, 54, 48, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 49, 49, 48, 58, 56, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,100, 49, 98,101, 58, 49, 58, 50, 52, 58, 50, 52, + 13, 10, 48, 58,100, 49,100,101, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, + 48, 58,100, 49,102,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 100, 50, 49,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 50, + 51,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 50, 53,101, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 50, 55,101, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 56, 48, 56, 48, 98,119, 46, 99, 13, 10, 50, 56, 48,122,122,122, 97, + 112, 58, 13, 10, 48, 58, 50, 48, 51,100, 58, 50, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 50, 48, 50, 57, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 98, 97,108,108, 98,111,109, 98, 58, 13, 10, 48, 58, 50, 48,100, + 99, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 98,108,117,101, + 115,104,114,107, 58, 13, 10, 48, 58, 50, 48, 48, 97, 58, 48, 53, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 98,111,119,108,101,114, 58, 13, 10, 48, + 58, 50, 50, 97, 48, 58, 48, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 99,108,111,119,110,115, 58, 32, 32, 59, 42, 42, 42, 32,100,111,110,116, + 32,115,116, 97,114,116, 32,103, 97,109,101, 32,117,110,116,105,108,108, + 32, 97,116,116,114, 97, 99,116, 32,109,111,100,101, 32,115,116, 97,114, + 116,115, 46, 40,104,105,115, 99,111,114,101, 32, 97,108,115,111, 32,117, + 112,100, 97,116,101,100, 32,116,104,101,110, 41, 13, 10, 99,108,111,119, + 110,115, 49, 58, 32, 32, 59, 42, 42, 42, 32,100,111,110,116, 32,115,116, + 97,114,116, 32,103, 97,109,101, 32,117,110,116,105,108,108, 32, 97,116, + 116,114, 97, 99,116, 32,109,111,100,101, 32,115,116, 97,114,116,115, 46, + 40,104,105,115, 99,111,114,101, 32, 97,108,115,111, 32,117,112,100, 97, + 116,101,100, 32,116,104,101,110, 41, 13, 10, 48, 58, 50, 48, 49, 53, 58, + 48, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51,101, 97, 48, 58, 49, + 52, 48, 58, 48, 48, 58, 54, 54, 13, 10, 13, 10,100,101,115,101,114,116, + 103,117, 58, 13, 10, 48, 58, 50, 48, 48, 54, 58, 48, 50, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 50, 48, 48, 98, 58, 48, 50, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,103, 97,108,120,119, 97,114,115, 58, 13, 10,115,116, + 97,114,119, 58, 13, 10,103, 97,108,120,119, 97,114,115,116, 58, 13, 10, + 103, 97,108,120,119, 97,114,115, 50, 58, 13, 10,115,116, 97,114,119, 49, + 58, 13, 10, 48, 58, 50, 48, 48, 53, 58, 48, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 32,117,112,100, 97,116,101,100, 32,119,104,101,110, + 32,115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 13, 10,104,101,108, + 105,102,105,114,101, 58, 13, 10,104,101,108,105,102,105,114,101, 97, 58, + 13, 10, 48, 58, 54, 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,105,110,118, 97,100,112,116, 50, 58, 13, 10,105,110,118, 97,100, + 100,108,120, 58, 13, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, 58, + 48, 53, 13, 10, 48, 58, 50, 51, 52, 48, 58, 97, 58, 49, 98, 58, 49, 98, + 13, 10, 13, 10,109,111,111,110, 98, 97,115,101, 58, 13, 10,109,111,111, + 110, 98, 97,115,101, 97, 58, 13, 10, 48, 58, 50, 51, 52, 48, 58, 97, 58, + 48,100, 58, 49, 52, 13, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, + 58, 48, 53, 13, 10, 13, 10,105,110,118,114,118,110,103,101, 58, 13, 10, + 105,110,118,114,118,110,103,101, 97, 58, 13, 10,105,110,118,114,118,110, + 103,101, 98, 58, 13, 10,105,110,118,114,118,110,103,101,100,117, 58, 13, + 10,105,110,118,114,118,110,103,101,103,119, 58, 13, 10, 48, 58, 50, 48, + 49, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,108, 97,103,117, + 110, 97,114, 58, 13, 10, 48, 58, 50, 48, 49, 49, 58, 57, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 50, 48, 48, 53, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,108,114,101,115, 99,117,101, 58, 13, 10,119, 97,114,108, + 58, 13, 10,100,101,115,116,101,114,116,104, 58, 13, 10,108,114,101,115, + 99,117,101,109, 58, 13, 10,108,114,101,115, 99,117,101,109, 50, 58, 13, + 10, 59,117,112,100, 97,116,101,100, 32,119,104,101,110, 32,115,116, 97, + 114,116, 32, 97, 32,103, 97,109,101, 13, 10, 48, 58, 50, 48,100, 98, 58, + 49, 58, 48, 97, 58, 48, 97, 13, 10, 48, 58, 50, 48, 99,102, 58, 97, 58, + 49, 98, 58, 49, 98, 13, 10, 48, 58, 50, 48,102, 52, 58, 50, 58, 48, 48, + 58, 48, 53, 13, 10, 13, 10,108,117,112,105,110, 51, 58, 13, 10, 48, 58, + 50, 48,100, 99, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,111, + 122,109, 97,119, 97,114,115, 58, 13, 10,111,122,109, 97,119, 97,114,115, + 50, 58, 13, 10,115,111,108,102,105,103,104,116, 58, 13, 10,115,112, 97, + 99,101,112,104, 58, 13, 10, 48, 58, 50, 48, 52, 51, 58, 48, 50, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,112,111,108, 97,114,105,115, 58, 13, 10, + 48, 58, 50, 51, 49, 52, 58, 48, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,112,111,108, 97,114,105,115, 97, 58, 13, 10,112,111,108, 97,114,105, + 115, 98,114, 58, 13, 10, 48, 58, 50, 49, 53, 48, 58, 49, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 50, 49, 54, 53, 58, 49,101, 58, 50, 97, 58, + 50, 97, 13, 10, 48, 58, 50, 51, 49, 52, 58, 48, 50, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,114,111,108,108,105,110,103, 99, 58, 13, 10, 48, 58, + 50, 51, 48, 50, 58, 48,102, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115, + 99,104, 97,115,101,114, 58, 13, 10,115, 99,104, 97,115,101,114, 97, 58, + 13, 10,115, 99,104, 97,115,101,114, 98, 58, 13, 10,115, 99,104, 97,115, + 101,114, 99, 58, 13, 10, 48, 58, 50, 50, 52, 52, 58, 48, 97, 58, 49, 98, + 58, 49, 98, 13, 10, 48, 58, 50, 51, 51,102, 58, 48, 51, 58, 48, 49, 58, + 48, 48, 13, 10, 13, 10,115, 99,104, 97,115,101,114, 99,118, 58, 13, 10, + 48, 58, 50, 51, 51,100, 58, 48, 51, 58, 48, 49, 58, 48, 48, 13, 10, 13, + 10,115,101, 97,119,111,108,102, 58, 32, 59, 91, 83,112,101, 99,105, 97, + 108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97, + 115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104, + 105,115, 32,101,110,116,114,121, 93, 13, 10, 48, 58, 50, 48, 48, 54, 58, + 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 48, 48, 49, 58, 48, + 49, 58, 48, 57, 58, 48, 57, 13, 10, 13, 10,115,112, 99,101,110, 99,116, + 114, 58, 13, 10, 48, 58, 50, 54,102, 48, 58, 50, 58, 48,101, 58, 48,101, + 13, 10, 48, 58, 50, 48, 50,101, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 50, 48, 50, 98, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42, 97, 99,116,102, 97,110, 99,114, 46, + 99, 32, 13, 10, 97, 99,116,102, 97,110, 99,114, 58, 13, 10, 97, 99,116, + 102, 97,110, 99,114,106, 58, 13, 10, 97, 99,116,102, 97,110, 99,114, 49, + 58, 13, 10, 48, 58, 49,102, 48, 99,101, 54, 58, 49,101, 58, 48, 53, 58, + 52, 53, 13, 10, 48, 58, 49,102, 48, 48, 98,101, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,101,114, + 111,102,103,116, 46, 99, 13, 10, 97,101,114,111,102,103,116, 58, 13, 10, + 48, 58,102,102, 99, 49, 97,102, 58, 57, 55, 58, 48, 98, 58, 54, 52, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,106, 97,120, 46, 99, + 13, 10, 97,106, 97,120, 58, 13, 10, 97,106, 97,120,106, 58, 13, 10, 48, + 58, 50, 49, 48, 48, 58, 53, 48, 58, 49, 97, 58, 48, 48, 13, 10, 48, 58, + 50, 48, 53, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,117, + 114,116,108,101,115, 58, 13, 10,116,117,114,112,105,110, 58, 13, 10,116, + 117,114,112,105,110,115, 58, 13, 10, 54, 48, 48, 58, 13, 10, 48, 58, 56, + 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, + 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 51, 52, 48, + 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 97,112,112,111,111,111,104, 46, 99, 13, 10, 97,112,112,111, + 111,111,104, 58, 13, 10, 48, 58,101, 48, 50, 57, 58, 51, 58, 53, 51, 58, + 52,100, 13, 10, 48, 58,101, 48, 49, 55, 58, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58,101, 48, 49, 56, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, + 48, 58,101, 52, 48, 48, 58,100, 99, 58, 53, 51, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,114,103,117,115, 46, 99, 13, + 10, 97,114,103,117,115, 58, 13, 10, 48, 58,102, 98, 56, 48, 58, 52, 48, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 48, 51, 57, 58, 55, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 48, 51,100, 58, 49, 58, 48, 55, 58, + 48, 55, 13, 10, 13, 10,118, 97,108,116,114,105, 99, 58, 13, 10, 48, 58, + 102, 99, 97, 48, 58, 50, 56, 58, 48, 48, 58, 53, 51, 13, 10, 48, 58,102, + 99, 51, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,114,107, + 97,110,111,105,100, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116, + 104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102, + 111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32, + 101,110,116,114,121, 93, 13, 10, 97,114,107, 49, 98, 97,108,108, 58, 13, + 10, 97,114,107, 97,110,103, 99, 58, 13, 10, 97,114,107, 97,110,103, 99, + 50, 58, 13, 10, 97,114,107, 98,108,111, 99, 50, 58, 13, 10, 97,114,107, + 98,108,111, 99,107, 58, 13, 10, 97,114,107,103, 99, 98,108, 58, 13, 10, + 97,114,107,109, 99,117, 98,108, 58, 13, 10, 97,114,107, 97,110,111,105, + 100,117, 58, 13, 10, 97,114,107, 97,110,111,105,100,117,111, 58, 13, 10, + 97,114,107, 97,116, 97,121,116, 58, 13, 10,112, 97,100,100,108,101, 50, + 58, 13, 10, 97,114,107,103, 99, 98,108, 97, 58, 13, 10, 97,114,107, 98, + 108,111, 99, 51, 58, 13, 10, 97,114,107, 97,110,111,105,100,106,111, 58, + 13, 10, 97,114,107, 97,110,111,105,100,106, 98, 58, 13, 10, 97,114,107, + 97,110,111,105,100,106, 97, 58, 13, 10, 97,114,107, 97,110,111,105,100, + 106, 98, 58, 13, 10, 97,114,107, 97,110,111,105,100,106, 98,108, 58, 13, + 10, 97,114,107, 97,110,111,105,100,106, 98, 50, 58, 13, 10, 97,114,107, + 97,110,111,105,100,106, 98,108, 50, 58, 13, 10, 97,114,107, 97,110,111, + 105,100,106, 58, 13, 10, 48, 58,101,102, 55, 57, 58, 50, 51, 58, 48, 48, + 58, 53, 50, 13, 10, 48, 58, 99, 52,100,102, 58, 48, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 98,108,111, 99,107, 50, 58, 13, 10, 48, 58,101, + 102, 55, 57, 58, 50, 51, 58, 48, 48, 58, 52, 97, 13, 10, 48, 58, 99, 52, + 100,102, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,114,107, + 116, 97,121,116, 50, 58, 13, 10, 48, 58,101,102, 55, 57, 58, 50, 51, 58, + 48, 48, 58, 52, 50, 13, 10, 48, 58, 99, 52,100,102, 58, 48, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 97,114,107, 97,116,111,117,114, 58, 13, + 10, 48, 58,101,102, 55, 99, 58, 50, 51, 58, 48, 48, 58, 53, 50, 13, 10, + 48, 58, 99, 52,100,102, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,114,109,101,100,102, 46, 99, + 13, 10, 97,114,109,101,100,102, 58, 13, 10, 97,114,109,101,100,102,102, + 58, 13, 10, 48, 58, 54, 49, 49, 98, 54, 58, 52,102, 58, 48, 48, 58, 52, + 97, 13, 10, 48, 58, 54, 49, 50, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 99, 99,108,105,109, 98,114, 50, 58, 13, 10, 48, 58, 54, + 49, 50, 97, 55, 58, 52, 57, 58, 49, 48, 58, 48, 48, 13, 10, 48, 58, 54, + 49, 50,102, 50, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10,116,101, + 114,114, 97,102, 58, 13, 10,116,101,114,114, 97,102,117, 58, 13, 10,116, + 101,114,114, 97,102, 97, 58, 13, 10,116,101,114,114, 97,102, 98, 58, 13, + 10,116,101,114,114, 97,102,106, 98, 58, 13, 10,116,101,114,114, 97,102, + 106, 58, 13, 10, 48, 58, 54, 48, 54, 54,101, 58, 51, 99, 58, 48, 48, 58, + 52, 97, 13, 10, 48, 58, 54, 48, 54, 98, 50, 58, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 97,115,116,101,114,111,105, 49, 58, 13, 10, 48, 58, + 48, 48, 49, 99, 58, 51, 53, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 97,115,116,114,111, 99,100,101, 46, 99, + 13, 10,103,111,114,102, 58, 32, 59, 42, 32,114,101,115,101,116,116,105, + 110,103, 32,115, 99,114,101,119,115, 32,117,112, 32, 50, 32,115, 99,111, + 114,101,115, 32, 97,110,100, 32,116,111,112, 32,115, 99,111,114,101, 13, + 10,103,111,114,102,112,103,109, 49, 58, 13, 10, 48, 58,100, 48, 49, 48, + 58, 50, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,114,111, 98, 98,121, + 58, 13, 10, 48, 58,101, 49, 99, 55, 58, 50, 49, 58, 52, 97, 58, 52, 98, + 13, 10, 48, 58,101, 49, 54, 49, 58, 49,101, 58, 53, 48, 58, 53, 56, 13, + 10, 48, 58,101, 49, 57,100, 58, 50, 97, 58, 57,101, 58, 52, 55, 13, 10, + 48, 58,101, 49, 51, 98, 58, 50, 54, 58, 49, 48, 58, 49, 55, 13, 10, 48, + 58,101, 51, 99, 55, 58, 50, 49, 58, 52, 97, 58, 52, 98, 13, 10, 48, 58, + 101, 51, 54, 49, 58, 49,101, 58, 53, 48, 58, 53, 56, 13, 10, 48, 58,101, + 51, 57,100, 58, 50, 97, 58, 57,101, 58, 52, 55, 13, 10, 48, 58,101, 51, + 51, 98, 58, 50, 54, 58, 49, 48, 58, 49, 55, 13, 10, 13, 10,115,101, 97, 119,111,108,102, 50, 58, 59, 42,108,111, 97,100,105,110,103, 32,115, 99, 111,114,101, 32,115,101,101,109,115, 32,116,111, 32, 97,117,116,111, 32, - 115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 63, 10, 48, 58, 99, 50, - 48, 56, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10,119,111,119, 58, 32, 59, - 42,114,101,115,101,116,116,105,110,103, 32,115, 99,114,101,119,115, 32, - 117,112, 32,116,104,101, 32, 49,115,116, 32,115, 99,111,114,101, 10,119, - 111,119,103, 58, 10, 48, 58,100, 48, 48, 52, 58, 49, 52, 58, 48, 48, 58, - 48, 48, 10, 48, 58,100, 51, 48, 52, 58, 49, 52, 58, 48, 48, 58, 48, 48, - 10, 10,116,111,109, 97,104, 97,119,107, 58, 10,116,111,109, 97,104, 97, - 119,107, 49, 58, 10, 48, 58, 48, 48, 48,100, 58, 50, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 50, 53, 49, 58, 50, 53, 58, 51, 99, 58, 51, 99, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,115,117,107, 97, 46, 99, 10, - 97,115,117,107, 97, 58, 10, 97,115,117,107, 97,106, 58, 10, 48, 58, 49, - 48, 51, 52, 53, 56, 58, 54, 54, 58, 52, 49, 58, 48, 49, 10, 48, 58, 49, - 48, 51, 51, 99, 52, 58, 52, 58, 48, 48, 58, 50, 48, 10, 10,103, 97,108, - 109,101,100,101,115, 58, 10, 48, 58, 49, 48, 51, 49, 97, 48, 58, 52, 99, - 58, 48, 48, 58, 54, 52, 10, 10,109,111,102,102,108,111,116,116, 58, 10, - 48, 58, 49, 48, 48, 97, 97,100, 58, 55, 53, 58, 48, 48, 58, 51, 49, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97,116, 97,114,105,115,121, 50, - 46, 99, 10, 97,112, 98, 58, 10, 97,112, 98, 53, 58, 10, 97,112, 98, 54, - 58, 10, 48, 58,102, 52, 50, 58, 57, 98, 58, 48, 48, 58, 52,100, 10, 10, - 97,112, 98, 50, 58, 10, 97,112, 98,102, 58, 10, 97,112, 98,103, 58, 10, - 97,112, 98, 49, 58, 10, 97,112, 98, 51, 58, 10, 97,112, 98, 52, 58, 10, - 48, 58,102, 52, 50, 58, 57, 98, 58, 48, 48, 58, 53, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42, 98, 97,100,108, 97,110,100,115, 46, 99, 10, - 98, 97,100,108, 97,110,100,115, 58, 10, 48, 58,102,102,102,101, 57, 54, - 58, 52,102, 58, 48, 48, 58, 57, 97, 10, 10,112,105, 99,107,105,110, 58, - 10, 48, 58, 55, 49, 57, 97, 58, 53, 48, 58, 48, 48, 58, 49, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,110,107,112, 46, 99, 10, 98, - 97,110,107,112, 58, 10, 48, 58,101, 53, 57, 48, 58, 97, 48, 58, 48, 48, - 58, 48, 48, 10, 48, 58,101, 48, 49, 56, 58, 55, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,116,109, 97,110, 46, - 99, 10, 98, 97,116,109, 97,110, 58, 10, 48, 58, 49, 48,102, 50, 51,101, - 58, 53, 48, 58, 48, 48, 58, 51, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 98, 97,116,116,108, 97,110,101, 46, 99, 10, 98, 97,116,116,108, - 97,110,101, 58, 10, 98, 97,116,116,108, 97,110,101, 50, 58, 10, 98, 97, - 116,116,108, 97,110,101, 51, 58, 10, 48, 58, 48, 99, 97, 53, 58, 50, 56, - 58, 48, 48, 58, 49, 97, 10, 48, 58, 48, 48, 53,102, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 10,102,114,101,110,122,121, 58, 10, 48, 58, 52, 48, 54, - 101, 58, 51, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 53,101, 58, - 49, 58,102,102, 58,102,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 98,105,111,110,105, 99, 99, 46, 99, 10, 98,105,111,110,105, 99, 99, 58, - 10, 98,105,111,110,105, 99, 99, 50, 58, 10,116,111,112,115,101, 99,114, - 116, 58, 10, 98,105,111,110,105, 99, 99, 49, 58, 10, 98,105,111,110,105, - 99, 99, 98,108, 58, 10, 48, 58,102,102,102, 57,101, 50, 58, 52,102, 58, - 48, 48, 58, 52,100, 10, 48, 58,102,102, 99, 53, 55, 97, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58,102,101, 99, 48,100, 57, 58, 49, 58, 50, 48, - 58, 50, 48, 10, 48, 58,102,101, 99, 48,100, 98, 58, 49, 58, 50, 48, 58, - 50, 48, 10, 48, 58,102,101, 99, 48,100,100, 58, 49, 58, 50, 48, 58, 50, - 48, 10, 48, 58,102,101, 99, 48,100,102, 58, 49, 58, 48, 50, 58, 48, 50, - 10, 48, 58,102,101, 99, 48,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58,102,101, 99, 48,101, 51, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58,102,101, 99, 48,101, 53, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 102,101, 99, 48,101, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59,109, - 97, 99,114,111,115,115, 58, 32, 32, 42, 42, 42, 32,110,111,116, 32,119, - 111,114,107,105,110,103, 32, 42, 42, 42, 10, 59, 48, 58,102, 57, 49, 48, - 48, 58, 97, 48, 58, 48, 48, 58, 52, 53, 10, 59, 48, 58,102, 57, 48,102, - 54, 58, 49, 58, 48, 49, 58, 48, 49, 10, 10, 98,108,107,100,114,103,111, - 110, 58, 10, 98,108,107,100,114,103,110, 98, 58, 10, 48, 58,101, 50, 48, - 48, 58, 53, 48, 58, 48, 48, 58, 50, 54, 10, 48, 58,101, 49,101, 48, 58, - 56, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 98,108,111, 99,107,111,117,116, 46, 99, 10, 98,108,111, 99,107,111,117, - 116, 58, 10, 48, 58, 49,100, 53,102, 97, 52, 58, 55, 56, 58, 51, 50, 58, - 48, 53, 10, 48, 58, 49,100, 53,101, 99,101, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10, 98,108,111, 99,107,111,117,116, 50, 58, 10, 98,108,111, 99, - 107,111,117,116,106, 58, 10, 48, 58, 49,100, 53,102, 97, 50, 58, 55, 56, - 58, 51, 50, 58, 48, 53, 10, 48, 58, 49,100, 53,101, 99,101, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,108, - 115,116,114,111,105,100, 46, 99, 10, 98,108,115,116,114,111,105,100, 58, - 10, 98,108,115,116,114,111,105,100, 50, 58, 10, 98,108,115,116,114,111, - 105,100,104, 58, 10, 98,108,115,116,114,111,105,100,103, 58, 10, 98,108, - 115,116,114,111,105,100, 51, 58, 10, 48, 58,102,102,102,102, 52, 50, 58, - 51, 50, 58, 48, 54, 58, 49, 54, 10, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 98,108,117,101,112,114,110,116, 46, 99, 10, 98,108,117,101,112, - 114,110,116, 58, 10, 98,108,117,101,112,114,110,116,106, 58, 10, 48, 58, - 56, 49, 48, 48, 58, 51,101, 58, 48, 48, 58, 57, 48, 10, 10,115, 97,116, - 117,114,110,122,105, 58, 10, 48, 58, 56, 51, 56, 48, 58, 50, 56, 58, 48, - 48, 58, 50,100, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,111,109, - 98,106, 97, 99,107, 46, 99, 10, 98,111,109, 98,106, 97, 99,107, 58, 10, - 98,111,109, 98,106, 97, 99,107, 50, 58, 10, 98,111,109, 98,106, 97, 99, - 107,116, 58, 10, 48, 58, 57, 48, 53,102, 58, 49, 58, 51, 48, 58, 51, 48, - 10, 48, 58, 57, 48, 55,102, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, - 57, 48, 57,102, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 57, 48, 98, - 102, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 57, 48,100,101, 58, 51, - 58, 53, 51, 58, 50, 52, 10, 48, 58, 57, 48,102,101, 58, 51, 58, 50,100, - 58, 50, 52, 10, 48, 58, 57, 49, 49,102, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 57, 49, 51,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 56, 48,101, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 49, 48, - 48, 58, 57, 54, 58, 48, 48, 58,102,102, 10, 10,100, 97,114,119,105,110, - 58, 10, 48, 58, 49, 98, 57, 51, 58, 57, 58, 56, 98, 58, 56, 57, 10, 48, - 58, 49, 98, 54, 99, 58, 49, 48, 58, 48, 48, 58, 55, 48, 10, 10, 98,116, - 105,109,101, 58, 10, 98,116,105,109,101, 50, 58, 10, 98,116,105,109,101, - 109, 58, 10, 98,116,105,109,101, 51, 58, 10, 48, 58, 48, 48, 51, 51, 58, - 50, 55, 58, 48, 48, 58, 70, 70, 10, 10, 99,111,111,107,114, 97, 99,101, - 58, 10, 48, 58, 48, 48, 51, 50, 58, 50, 52, 58, 48, 48, 58, 49, 56, 10, - 10,114,105,110,103,107,105,110,103, 51, 58, 10, 49, 58, 56, 48, 52, 56, - 58, 56, 67, 58, 48, 48, 58, 49, 50, 10, 48, 58, 67, 50, 51, 52, 58, 48, - 52, 58, 48, 48, 58, 48, 53, 10, 10,108,110, 99, 58, 10, 48, 58, 48, 48, - 48, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 50, 57, 52, 58, - 102, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 50, 97, 54, 58,102, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 67, 52, 68, 58, 54, 58, 48, 48, 58, 48, - 49, 10, 10,109,109,111,110,107,101,121, 58, 10, 48, 58,100,102, 58,102, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 50, 58, 51, 58, 48, 48, 58, 48, - 50, 10, 48, 58, 51, 49, 48, 58,102, 58, 50,101, 58, 50,102, 10, 48, 58, - 51, 99, 52, 97, 58, 54, 58, 48, 48, 58, 48, 49, 10, 10,122,111, 97,114, - 58, 10, 48, 58, 48, 50,100,100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 48, 50,101, 53, 58,102, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 51, - 52, 98, 58, 51, 58, 50, 48, 58, 50, 48, 10, 48, 58, 48, 51, 53, 54, 58, - 51, 58, 50, 48, 58, 50, 48, 10, 48, 58, 48, 51, 54, 49, 58, 51, 58, 50, - 48, 58, 50, 48, 10, 48, 58, 48, 51, 54, 99, 58, 51, 58, 50, 48, 58, 50, - 48, 10, 48, 58, 48, 51, 55, 55, 58, 51, 58, 50, 48, 58, 50, 48, 10, 10, - 115,112, 97, 99,100,117,101,108, 58, 10,115,112, 97, 99,100,117,101,108, - 48, 58, 10,115,112, 97, 99,100,117,101,108, 49, 58, 10, 48, 58,100,100, - 58, 51, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 49, 57, 58, 52, 98, - 58, 48, 48, 58, 49, 99, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, - 122,111,110,101, 46, 99, 10, 98,122,111,110,101, 58, 10, 98,122,111,110, - 101, 97, 58, 10, 98,122,111,110,101, 50, 58, 10, 98,122,111,110,101, 99, - 58, 10, 48, 58, 48, 51, 48, 48, 58, 51, 99, 58, 48, 53, 58, 51, 56, 10, - 10, 59, 42,110,111,116,101, 32,116,111,112, 32,115, 99,111,114,101, 32, - 117,112,100, 97,116,101,115, 32, 97,102,116,101,114, 32, 97, 32,102,101, - 119, 32,115,101, 99,111,110,100,115, 10,114,101,100, 98, 97,114,111,110, - 58, 10,114,101,100, 98, 97,114,111,110, 97, 58, 10, 48, 58, 49, 53, 53, - 58, 50, 51, 58, 48, 58, 48, 10, 48, 58, 49, 55, 56, 58, 49, 58,100, 52, - 58,100, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 97,100, 97, - 115,104, 46, 99, 10, 99, 97,100, 97,115,104, 58, 10, 99, 97,100, 97,115, - 104,117, 58, 10, 99, 97,100, 97,115,104,105, 58, 10, 99, 97,100, 97,115, - 104,102, 58, 10, 99, 97,100, 97,115,104,103, 58, 10, 48, 58, 49, 48, 51, - 54, 52, 54, 58, 49, 56, 53, 58, 48, 48, 58, 52,100, 10, 10, 99, 97,100, - 97,115,104,106, 58, 10, 99, 97,100, 97,115,104,106, 49, 58, 10, 99, 97, - 100, 97,115,104,106,111, 58, 10, 48, 58, 49, 48, 51, 54, 52, 54, 58, 49, - 56, 97, 58, 48, 48, 58, 54, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42, 99, 97,110,121,111,110, 46, 99, 10, 99, 97,110,121,111,110, 58, 10, - 99, 97,110,121,111,110,112, 58, 10, 48, 58, 48, 48, 51, 55, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10,117,111,112,111,107,111, 58, 10,117,111,112, - 111,107,111,106, 58, 10, 48, 58, 49, 48, 48, 48, 51, 56, 58, 54,101, 58, - 48, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 99, - 104, 97,115,109, 46, 99, 10, 99, 99,104, 97,115,109, 58, 10, 99, 99,104, - 97,115,109, 49, 58, 10, 48, 58,102,102,102, 52, 98, 56, 58, 55, 56, 58, - 55, 50, 58, 49, 48, 10, 10, 99, 99,108,105,109, 98,101,114, 58, 32, 59, - 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, - 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, - 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10, 99, - 99,108,105,109, 98,101,114,106, 58, 10, 99, 99, 98,111,111,116, 58, 10, - 99, 99,108,105,109, 98,114,111,112,101,114, 58, 10, 99, 99,108,105,109, - 98,114,114,111,100, 58, 10, 48, 58, 56, 48, 56, 51, 58, 48, 51, 58, 48, - 50, 58, 48, 48, 10, 48, 58, 56, 48, 57, 53, 58, 48, 97, 58, 51, 48, 58, - 53, 50, 10, 48, 58, 56, 48, 56, 54, 58, 48, 51, 58, 48, 50, 58, 48, 48, - 10, 48, 58, 56, 48, 97, 51, 58, 48, 97, 58, 51, 48, 58, 53, 50, 10, 48, - 58, 56, 48, 56, 57, 58, 48, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, 56, - 48, 98, 49, 58, 48, 97, 58, 51, 48, 58, 53, 50, 10, 48, 58, 56, 48, 56, - 99, 58, 48, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, 56, 48, 98,102, 58, - 48, 97, 58, 51, 48, 58, 53, 50, 10, 48, 58, 56, 48, 56,102, 58, 48, 51, - 58, 48, 50, 58, 48, 48, 10, 48, 58, 56, 48, 99,100, 58, 48, 97, 58, 51, - 48, 58, 53, 50, 10, 10, 99, 99, 98,111,111,116, 50, 58, 10, 48, 58, 56, - 48, 56, 51, 58, 48, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, 56, 48, 57, - 53, 58, 48, 97, 58, 49, 53, 58, 53, 50, 10, 48, 58, 56, 48, 56, 54, 58, - 48, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, 56, 48, 97, 51, 58, 48, 97, - 58, 49, 53, 58, 53, 50, 10, 48, 58, 56, 48, 56, 57, 58, 48, 51, 58, 48, - 50, 58, 48, 48, 10, 48, 58, 56, 48, 98, 49, 58, 48, 97, 58, 49, 53, 58, - 53, 50, 10, 48, 58, 56, 48, 56, 99, 58, 48, 51, 58, 48, 50, 58, 48, 48, - 10, 48, 58, 56, 48, 98,102, 58, 48, 97, 58, 49, 53, 58, 53, 50, 10, 48, - 58, 56, 48, 56,102, 58, 48, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, 56, - 48, 99,100, 58, 48, 97, 58, 49, 53, 58, 53, 50, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 99,105,110,101,109, 97,116, 46, 99, 10, 97,114,109, - 111,114, 97, 58, 10, 97,114,109,111,114, 97,112, 58, 10, 97,114,109,111, - 114, 97,114, 58, 10, 48, 58, 97, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10, 59,115,116, 97,114, 99, 97,115, 58, 10, 59,115,116, 97,114, 99, 97, - 115, 49, 58, 10, 59,115,116, 97,114, 99, 97,115,101, 58, 10, 59,115,116, - 97,114, 99, 97,115,112, 58, 32, 10, 59,115,116,101,108,108, 99, 97,115, - 58, 32, 10, 59, 48, 58, 49, 97, 97, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10, 99,114, 97,115,104, 58, 10,115,109, 97,115,104, 58, 10, 48, 58, 48, - 48, 48,102, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 99,105,115, 99,104,101, 97,116, 46, 99, 32, 40, 99,105, - 115, 99,111, 32,104,101, 97,116, 41, 10, 99,105,115, 99,104,101, 97,116, - 58, 10, 48, 58,102, 48, 99, 48, 48, 58, 50, 52,102, 58, 48, 48, 58, 48, - 48, 10, 48, 58,102, 48,101, 52, 50, 58, 49, 58, 52, 57, 58, 52, 57, 10, - 48, 58,102, 48, 98, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 10, 10, - 102, 49,103,112,115,116, 97,114, 58, 10, 48, 58,102, 50, 56, 48, 51, 58, - 53,101, 51, 58, 48, 52, 58, 52,100, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42, 99,105,116,121, 99,111,110, 46, 99, 10, 99,105,116,121, 99,111, - 110, 58, 10, 99,105,116,121, 99,111,110, 97, 58, 32, 10, 99,114,117,105, - 115,105,110, 58, 10, 48, 58, 48, 48, 53, 53, 58, 51, 58, 48, 48, 58, 49, - 51, 10, 48, 58, 48, 48, 52, 51, 58, 51, 58, 48, 48, 58, 48, 50, 10, 48, - 58, 48, 57, 48, 48, 58,102, 48, 58, 53, 51, 58, 57, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 99,110,105,110,106, 97, 46, 99, 10, 99,110,105,110, - 106, 97, 58, 10, 99,110,105,110,106, 97,117, 58, 10,106,111,101,109, 97, - 99, 58, 10, 48, 58, 49, 56, 55, 55,102, 98, 58, 49, 58, 51, 48, 58, 51, - 48, 10, 48, 58, 49, 56, 55, 55,102, 97, 58, 97,101, 58, 48, 48, 58, 48, - 48, 10, 10, 99,110,105,110,106, 97, 49, 58, 10,115,116,111,110,101, 97, - 103,101, 58, 10, 99,110,105,110,106, 97, 98,108, 58, 10, 99,110,105,110, - 106, 97, 97, 58, 10, 48, 58, 49, 56, 55, 55,102, 55, 58, 49, 58, 51, 48, - 58, 51, 48, 10, 48, 58, 49, 56, 55, 55,102, 54, 58, 97,101, 58, 48, 48, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,111,109, 98, - 97,116,115, 99, 46, 99, 10, 99,111,109, 98, 97,116,115, 99, 58, 10, 99, - 111,109, 98, 97,116,115, 99, 98, 58, 10, 99,111,109, 98, 97,116,115, 99, - 106, 58, 10, 99,111,109, 98, 97,116,115, 99,116, 58, 10, 48, 58, 49, 51, - 50, 48, 58, 52, 54, 58, 48, 50, 58, 48, 55, 10, 48, 58, 56, 50, 54, 58, - 51, 58, 48, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 99,111,109,109, 97,110,100,111, 46, 99, 10, 99,111,109,109, 97,110,100, - 111, 58, 10, 99,111,109,109, 97,110,100,111,117, 58, 10, 99,111,109,109, - 97,110,100,111,106, 58, 10,115,105,110,118, 97,115,110, 58, 10,115,105, - 110,118, 97,115,110, 98, 58, 10, 99,111,109,109, 97,110,100,111, 98, 58, - 10, 99,111,109,109, 97,110,100,111, 98, 50, 58, 10, 99,111,109,109, 97, - 110,100,111,117, 50, 58, 10,109,101,114, 99,101,110, 97,114,105,111, 58, - 10, 48, 58,101,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50,101, 10, 48, - 58,101,101, 57, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 99,111,110,103,111, 46, 99, 10, 99,111,110,103, - 111, 58, 10,116,105,112,116,111,112, 58, 10, 99,111,110,103,111, 97, 58, - 10, 48, 58, 56, 48, 50, 48, 58, 55,101, 58, 57, 48, 58, 97, 49, 10, 48, - 58, 56, 48, 98,100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 99,111,110,116,114, 97, 46, 99, 10, 99,111,110, - 116,114, 97, 58, 10, 99,111,110,116,114, 97, 98, 58, 10, 99,111,110,116, - 114, 97,106, 58, 10, 99,111,110,116,114, 97,106, 98, 58, 10,103,114,121, - 122,111,114, 58, 10, 99,111,110,116,114, 97, 98,106, 49, 58, 10,103,114, - 121,122,111,114, 49, 58, 10,103,114,121,122,111,114, 97, 58, 10, 99,111, - 110,116,114, 97, 49, 58, 10, 99,111,110,116,114, 97, 98,106, 58, 10, 99, - 111,110,116,114, 97,106, 49, 58, 10, 99,111,110,116,114, 97,101, 58, 10, - 48, 58, 49, 49, 50, 48, 58, 52, 48, 58, 49, 98, 58, 48, 48, 10, 48, 58, - 49, 49, 49, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42, 99,111,112, 48, 49, 46, 99, 10, 99,111,112, 48, 49, - 58, 10, 48, 58, 99, 52, 54,100, 58, 50, 56, 58, 48, 48, 58, 48, 49, 10, - 10, 99,111,112, 48, 49, 97, 58, 10, 48, 58, 99, 52, 54,101, 58, 50, 56, - 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, - 111,115,109,105, 99, 46, 99, 10, 99,111,115,109,105, 99, 97, 58, 10, 99, - 111,115,109,105, 99, 97, 50, 58, 10, 99,111,115,109,105, 99, 97, 49, 58, - 10, 48, 58, 52, 48, 48,101, 58, 51, 58, 48, 48, 58, 48, 48, 32, 32, 10, - 10,112, 97,110,105, 99, 58, 10,112, 97,110,105, 99,104, 58, 10,112, 97, - 110,105, 99,103,101,114, 58, 10,112, 97,110,105, 99, 50, 58, 10,112, 97, - 110,105, 99, 51, 58, 10, 48, 58, 52, 48, 99, 49, 58, 53, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 53, 99, 48, 48, 58, 99, 58, 48, 57, 58, 49, 53, 10, - 48, 58, 52, 48, 48, 52, 58, 50, 58, 48, 48, 58, 48, 48, 32, 32, 32, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,112,115, 49, 46, 99, 10, 49, - 57, 52, 49, 58, 10, 49, 57, 52, 49,106, 58, 10, 49, 57, 52, 49,117, 58, - 10, 49, 57, 52, 49,114, 58, 10, 49, 57, 52, 49,114, 49, 58, 10, 48, 58, - 102,102, 57, 54, 56, 48, 58, 55, 56, 58,102,102, 58, 48, 48, 10, 48, 58, - 102,102, 48,100, 57, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, 99, - 119,111,114,108,100, 50,106, 58, 10, 48, 58,102,102, 48,102, 54, 56, 58, - 48, 52, 58, 48, 48, 58, 48, 49, 10, 48, 58,102,102, 48,102, 54, 99, 58, - 57, 99, 58, 48, 48, 58, 48, 48, 10, 10,100,105,110,111, 58, 10,100,105, - 110,111,106, 58, 32, 10,100,105,110,111,117, 58, 10,100,105,110,111,104, - 117,110,116, 58, 10, 48, 58,102,102,102, 48, 51,101, 58, 51, 49, 48, 58, - 48, 48, 58, 48, 48, 10, 48, 58,102,102,102, 51, 52,101, 58, 48, 49, 48, - 58, 57, 57, 58, 48, 48, 10, 10,103,104,111,117,108,115, 58, 10,103,104, - 111,117,108,115,117, 58, 32, 10,100, 97,105,109, 97,107, 97,105,114, 58, - 10,100, 97,105,109, 97,107, 97,105, 58, 32, 10, 48, 58,102,102, 98,102, - 52, 99, 58, 55, 56, 58, 52, 56, 58, 97, 56, 10, 48, 58,102,102, 48, 56, - 55, 97, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,109, 98,111,109, 98, - 114,100, 58, 32, 32, 10,109, 98,111,109, 98,114,100,106, 58, 32, 10, 48, - 58,102,102, 97, 48, 99, 99, 58, 48, 50, 58, 48, 48, 58, 49, 48, 10, 48, - 58,102,102, 97, 48, 99,101, 58, 97,101, 58, 48, 48, 58, 48, 48, 10, 10, - 109,101,103, 97,109, 97,110, 97, 58, 10,109,101,103, 97,109, 97,110, 58, - 10,114,111, 99,107,109, 97,110,106, 58, 10,109,109, 97,110, 99,112, 50, - 117, 58, 10,114,109, 97,110, 99,112, 50,106, 58, 10,109,109, 97,110, 99, - 112, 50,117,114, 49, 58, 10, 48, 58,102,102,101,101,100, 48, 58, 50, 56, - 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,101,102, 49, 48, 58, 50, 56, - 58, 48, 48, 58, 48, 50, 10, 10,109,101,114, 99,115, 58, 10,109,101,114, - 99,115,117,114, 49, 58, 32, 10,109,101,114, 99,115,106, 58, 32, 10,109, - 101,114, 99,115,117, 97, 58, 10, 48, 58,102,102, 48,102,100, 48, 58, 97, - 48, 58, 48, 48, 58, 50, 48, 10, 10,109,115,119,111,114,100, 58, 10,109, - 115,119,111,114,100,117, 58, 32, 10,109,115,119,111,114,100,106, 58, 32, - 10,109,115,119,111,114,100,114, 49, 58, 10, 48, 58,102,102,102,101, 51, - 50, 58, 57, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,102,101, 99, - 97, 58, 48, 50, 58, 48, 52, 58, 48, 48, 10, 48, 58,102,102, 97, 56, 57, - 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,110,101,109,111, 58, 10, - 110,101,109,111,106, 58, 32, 10,110,101,109,111,114, 49, 58, 10, 48, 58, - 102,102,102, 48, 48, 52, 58, 50, 56, 58, 48, 48, 58, 50, 48, 10, 48, 58, - 102,102,102, 48, 53, 52, 58, 49, 52, 58,102,102, 58, 50, 52, 10, 48, 58, - 102,102,102, 48, 55, 99, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10,112, - 97,110,103, 51, 58, 10,112, 97,110,103, 51,106, 58, 32, 10,112, 97,110, - 103, 51, 98, 58, 10,112, 97,110,103, 51,114, 49, 58, 10, 48, 58,102,102, - 57, 55, 50, 54, 58, 56, 99, 58, 48, 48, 58, 48, 57, 10, 10,112,110,105, - 99,107,106, 58, 10, 48, 58,102,102, 50, 53, 55, 52, 58, 50, 56, 58, 48, - 51, 58, 48, 48, 10, 48, 58,102,102, 50, 53, 57,101, 58, 53, 48, 58, 48, - 51, 58, 48, 48, 10, 48, 58,102,102, 56, 53, 51, 52, 58, 48, 52, 58, 48, - 48, 58, 48, 48, 10, 10,112,117,110,105,115,104,101,114, 58, 10,112,117, - 110,105,115,104,101,114,117, 58, 32, 10,112,117,110,105,115,104,101,114, - 106, 58, 32, 10,112,117,110,105,115,104,101,114, 98,122, 58, 10,112,117, - 110,105,115,104,101,114,104, 58, 10, 48, 58,102,102, 55, 56, 57, 54, 58, - 50, 53, 56, 58,102,102, 58, 48, 49, 10, 48, 58,102,102, 53, 98, 57, 50, - 58, 48, 48, 52, 58, 48, 49, 58, 48, 48, 10, 10,113, 97,100, 58, 10, 48, - 58,102,102,101, 57, 54,101, 58, 51, 99, 58, 48, 48, 58, 55, 48, 10, 10, - 113, 97,100,106,114, 58, 10, 48, 58,102,102, 52, 98, 97, 57, 58, 53,102, - 58,100, 99, 58, 48, 50, 10,113,116,111,110,111, 50,106, 58, 10, 48, 58, - 102,102, 53, 48,102,101, 58, 54, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 102,102, 53, 49, 57,101, 58, 54, 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 102,102, 53, 49,102,101, 58, 48, 52, 58, 48, 54, 58, 48, 48, 10, 10,115, - 102, 50, 58, 10,115,102, 50, 97, 58, 10,115,102, 50, 98, 58, 10,115,102, - 50,101, 58, 10,115,102, 50,106, 58, 10,115,102, 50,106, 98, 58, 10,115, - 102, 50,117, 97, 58, 10,115,102, 50,117, 98, 58, 10,115,102, 50,117,101, - 58, 10,115,102, 50,106, 97, 58, 10,115,102, 50,101, 98, 98,108, 58, 10, - 115,102, 50,106, 99, 58, 10,115,102, 50,113,112, 49, 58, 10,115,102, 50, - 117,102, 58, 10,115,102, 50,117,105, 58, 10,115,102, 50,117,107, 58, 10, - 115,102, 50,101, 98, 58, 10,115,102, 50,116,104,110,100,114, 58, 10,115, - 102, 50,101,101, 58, 10,115,102, 50,117, 99, 58, 10,115,102, 50,117,103, - 58, 10,115,102, 50,115,116,116, 58, 10,115,102, 50,114,107, 58, 10,115, - 102, 50,106,102, 58, 10,115,102, 50,106,104, 58, 10,115,102, 50,106,108, - 58, 10,115,102, 50,101,100, 58, 10,115,102, 50,101, 98, 98,108, 50, 58, - 10,115,102, 50,101, 98, 98,108, 51, 58, 10, 48, 58,102,102,100, 50, 56, - 97, 58, 51, 48, 58, 48, 48, 58, 50, 48, 32, 10, 48, 58,102,102,100, 51, - 48, 50, 58, 48, 52, 58, 48, 48, 58, 48, 48, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 10, 10,115,102, 50, 97, 99, 99,112, 50, 58, 10, 48, - 58,102,102,100, 50, 55, 54, 58, 50, 55, 58, 48, 48, 58, 52, 98, 10, 48, - 58,102,102,100, 50,101,101, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,115, - 102, 50,114,101,100, 58, 10, 48, 58,102,102,100, 50, 55, 54, 58, 50, 56, - 58, 48, 50, 58, 50, 48, 10, 48, 58,102,102,100, 50,101,101, 58, 48, 52, - 58, 48, 50, 58, 53, 51, 10, 10,115,108, 97,109,109, 97,115,116, 58, 32, - 10,109, 98,111,109, 98,101,114,106, 58, 32, 10, 48, 58,102,102, 97, 49, - 51, 56, 58, 48, 50, 58, 48, 48, 58, 49, 48, 10, 48, 58,102,102, 97, 49, - 51, 97, 58, 97,101, 58, 48, 48, 58, 48, 48, 10, 10,117,110,115,113,117, - 97,100, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,117, 46,110, 46, 32,115, - 113,117, 97,100,114,101,110, 10, 97,114,101, 97, 56, 56, 58, 10, 97,114, - 101, 97, 56, 56,114, 58, 32, 10, 48, 58,102,102, 49, 48, 49, 99, 58, 53, - 48, 58, 48, 48, 58, 50, 54, 10, 48, 58,102,102, 49, 48, 55, 99, 58, 48, - 56, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 99,114, 98, 97,108,111,111,110, 46, 99, 10, 99,114, 98, 97,108,111,111, - 110, 58, 32, 10, 99,114, 98, 97,108,111,111,110, 50, 58, 32, 10, 48, 58, - 52, 48, 49, 54, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 49, - 55,102, 58, 48, 97, 58, 49, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42, 99,114,105,109,102,103,104,116, 46, 99, 10, 99,114,105, - 109,102,103,104,116, 58, 10, 99,114,105,109,102,103,104,116,117, 58, 10, - 99,114,105,109,102,103,116,106, 58, 10, 99,114,105,109,102,103,104,116, - 50, 58, 10, 48, 58, 49, 97, 52, 48, 58, 52, 54, 58, 48, 48, 58, 49, 57, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,118,115, 46, 99, 10, 99, - 111,115,109,111,115, 58, 10, 48, 58, 51, 99, 48, 48, 58, 53, 50, 58, 48, - 48, 58, 48, 48, 10, 10,104,101,114,111, 58, 10, 48, 58, 51, 99, 48, 48, - 58, 50, 55, 58, 48, 48, 58, 51, 48, 10, 10,104,101,114,111,100,107,117, - 58, 10,104,101,114,111,100,107, 58, 10, 48, 58, 51, 99, 52, 52, 58, 53, - 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 99, 57, 52, 58, 49, 58, 50, - 51, 58, 50, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100, 97,114, - 105,117,115, 46, 99, 10,100, 97,114,105,117,115, 58, 10,100, 97,114,105, - 117,115,101, 58, 10,100, 97,114,105,117,115,117, 58, 10, 48, 58, 56, 50, - 50,102, 50, 58, 55, 50, 57, 58, 48, 48, 58, 50,101, 10, 10,100, 97,114, - 105,117,115,111, 58, 10,100, 97,114,105,117,115,106, 58, 10, 48, 58, 56, - 50, 50,101, 99, 58, 55, 50, 57, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, - 50, 54, 54, 54, 58, 49, 58, 52, 49, 58, 52, 49, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,100, 97,114,107,115,101, 97,108, 46, 99, 10,100, 97, - 114,107,115,101, 97,108, 58, 10,103, 97,116,101,100,111,111,109, 58, 10, - 103, 97,116,101,100,111,111,109, 49, 58, 10,100, 97,114,107,115,101, 97, - 108,106, 58, 10,100, 97,114,107,115,101, 97,108, 49, 58, 10, 48, 58, 49, - 48, 51,101, 48, 48, 58, 51, 55, 58, 48, 48, 58, 52,100, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,100,100, 97,121, 46, 99, 10,100,100, 97,121, - 58, 10,100,100, 97,121, 99, 58, 10, 48, 58, 54, 50, 51, 55, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 53, 51, 55, 57, 58, 53, 58, 50, 48, 58, - 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,100,114,105, 98, - 108,101, 46, 99, 10,100,100,114,105, 98, 98,108,101, 58, 10,100,100,114, - 105, 98, 98,108,101,112, 58, 10, 48, 58, 52, 56, 48, 48, 58, 55, 48, 58, - 49,100, 58, 48, 51, 10, 10, 98, 97,100,100,117,100,101,115, 58, 32, 59, - 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, - 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, - 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10, 48, - 58,102,102, 97, 56,102,101, 58, 97, 48, 58, 52,100, 58, 48, 49, 32, 10, - 48, 58,102,102, 56, 49,100, 52, 58, 48, 52, 58, 48, 48, 58, 48, 48, 32, - 10, 10,100,114,103,110,105,110,106, 97, 58, 32, 10,100,114,103,110,105, - 110,106, 97, 98, 58, 10, 48, 58,102,102, 97, 56,102, 56, 58, 97, 48, 58, - 52,100, 58, 48, 49, 32, 10, 48, 58,102,102, 56, 49,100, 52, 58, 48, 52, - 58, 48, 48, 58, 48, 48, 10, 10,100,114,103,110,105,110,106, 97, 98, 50, - 58, 10, 48, 58,102,102, 97, 56,102, 56, 58, 97, 56, 58, 52,100, 58, 48, - 49, 10, 48, 58,102,102, 56, 49,100, 52, 58, 48, 52, 58, 48, 48, 58, 48, - 48, 10, 10,104, 98, 97,114,114,101,108, 58, 10, 48, 58,102,102, 98,101, - 57, 99, 58, 53, 56, 58, 48, 48, 58, 50, 54, 10, 10,104, 98, 97,114,114, - 101,108,119, 58, 10, 48, 58,102,102, 98,101, 55, 56, 58, 53, 56, 58, 48, - 48, 58, 50, 54, 10, 10,104,105,112,112,111,100,114,109, 58, 10,102,102, - 97,110,116, 97,115,121, 58, 10,102,102, 97,110,116, 97,115,121, 97, 58, - 10, 48, 58,102,102, 98,101, 48, 48, 58, 53, 48, 58, 48, 56, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99, 56, 46, 99, 10, - 98,114,101,121,119,111,111,100, 58, 32, 10, 48, 58, 48, 49, 48, 56, 58, - 50, 56, 58, 51, 49, 58, 48, 48, 10, 48, 58, 48, 48, 54,100, 58, 51, 58, - 48, 52, 58, 48, 48, 10, 10, 99,111, 98,114, 97, 99,111,109, 58, 10, 99, - 111, 98,114, 97, 99,109,106, 58, 10, 48, 58, 48, 54, 99, 54, 58, 49,101, - 58, 48, 48, 58, 53, 52, 10, 48, 58, 48, 49, 51, 53, 58, 51, 58, 48, 48, - 58, 55, 54, 10, 10, 99,115,105,108,118,101,114, 58, 10, 99,115,105,108, - 118,101,114,106, 58, 10, 48, 58, 99, 55, 97, 58, 49, 58, 48,102, 58, 48, - 102, 10, 48, 58, 48,101, 51, 99, 58, 51, 99, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 48, 48, 48, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,103, 97, - 114,121,111,114,101,116, 58, 10, 48, 58, 49, 51, 53,102, 58, 50, 56, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 49, 51, 56, 98, 58, 49,101, 58, 49, 51, - 58, 49, 99, 10, 10,103,104,111,115,116, 98, 58, 10,103,104,111,115,116, - 98, 50, 97, 58, 10, 48, 58, 48, 49, 99, 48, 58, 55, 54, 58, 48, 49, 58, - 49, 48, 10, 10,103,104,111,115,116, 98, 51, 58, 10, 48, 58, 48,100, 97, - 48, 58, 55, 54, 58, 48, 49, 58, 49, 48, 10, 10,103,111,110,100,111, 58, - 10, 48, 58, 49, 53, 51, 50, 58, 52, 56, 58, 50, 49, 58, 48, 48, 10, 10, - 108, 97,115,116,109,105,115,110,106, 58, 10,108, 97,115,116,109,105,115, - 110, 58, 10,108, 97,115,116,109,105,115,110,111, 58, 10, 48, 58, 48, 57, - 97, 97, 58, 51, 99, 58, 48, 48, 58, 52, 52, 10, 48, 58, 48, 48, 48, 54, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,109, 97,107,121,111,115,101,110, - 58, 10, 48, 58, 49, 52,102, 57, 58, 52, 56, 58, 50, 49, 58, 48, 48, 10, - 10,111,115, 99, 97,114, 58, 10,111,115, 99, 97,114,106, 49, 58, 10,111, - 115, 99, 97,114,106, 50, 58, 10,111,115, 99, 97,114,117, 58, 10, 48, 58, - 48, 55, 53, 97, 58, 52, 54, 58, 48, 48, 58, 51, 51, 10, 48, 58, 48, 48, - 48, 54, 58, 51, 58, 48, 48, 58, 48, 57, 10, 10,115,104, 97, 99,107,108, - 101,100, 58, 32, 10, 48, 58, 48, 49, 48, 56, 58, 50, 56, 58, 51, 49, 58, - 48, 48, 10, 48, 58, 48, 48, 54, 98, 58, 51, 58, 48, 52, 58, 48, 48, 10, - 10,115,114,100, 97,114,119,105,110, 58, 10,115,114,100, 97,114,119,105, - 110,106, 58, 10, 48, 58, 49, 51, 52, 50, 58, 52, 54, 58, 48, 48, 58, 52, - 100, 10, 48, 58, 49, 51, 51, 50, 58, 51, 58, 48, 53, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,100,101,110,105, 97,109, 46, 99, 10, - 108,111,103,105, 99,112,114,111, 58, 10, 99,114,111,113,117,105,115, 58, - 10, 48, 58,102,102, 48, 54, 53, 56, 58, 50, 56, 58, 53, 51, 58, 48, 48, - 10, 10,108,111,103,105, 99,112,114, 50, 58, 10, 48, 58,102,102, 55, 48, - 101, 54, 58, 52, 54, 58, 48, 97, 58,100, 48, 10, 10,114, 97,100, 97,114, - 115, 99,112, 58, 32, 10,114, 97,100, 97,114,115, 99,112, 49, 58, 10, 48, - 58, 54, 51, 48, 55, 58, 97, 50, 58, 48, 48, 58,102, 99, 10, 48, 58, 54, - 48, 97, 56, 58, 51, 58, 53, 48, 58, 48, 48, 10, 48, 58, 55, 54, 52, 49, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 54, 50, 49, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 55, 54, 48, 49, 58, 49, 58, 48, 55, 58, - 48, 55, 10, 48, 58, 55, 53,101, 49, 58, 49, 58, 48, 54, 58, 48, 54, 10, - 48, 58, 55, 53, 99, 49, 58, 49, 58, 48, 53, 58, 48, 53, 10, 48, 58, 55, - 53, 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,100,111, 99, 97,115,116,108,101, 46, 99, 10, 98,108,117, - 101,104, 97,119,107, 58, 10, 98,108,117,101,104, 97,119,107,110, 58, 10, - 48, 58,102, 48, 98, 54, 58, 51, 50, 58, 48, 51, 58, 48, 54, 10, 10,100, - 111, 99, 97,115,116,108,101, 58, 10,100,111, 99, 97,115,116,108,101, 50, - 58, 10,100,111,117,110,105, 58, 10,100,111, 99, 97,115,116,108,101,111, - 58, 10, 48, 58, 56, 48, 50, 48, 58, 53, 48, 58, 48, 49, 58, 48, 48, 10, - 10,100,111,119,105,108,100, 58, 10,106,106, 97, 99,107, 58, 10,107,105, - 99,107,114,105,100,114, 58, 10, 48, 58, 50, 48, 50, 48, 58, 53, 48, 58, - 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,111, - 111,121,111,110,103, 46, 99, 10,108, 97,115,116,100, 97,121, 58, 10,108, - 97,115,116,100, 97,121, 97, 58, 10,100,100, 97,121,100,111,111, 58, 10, - 48, 58,100, 54, 99, 97, 58, 98, 58, 50, 48, 58, 51, 48, 10, 48, 58,101, - 48, 55,101, 58, 54,101, 58, 48, 48, 58, 49, 98, 10, 48, 58,101, 49, 51, - 56, 58, 55, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,100,111,119,105,108,100, 46, 99, 10,100,111,114,117,110,114,117, - 110, 58, 10,100,111,114,117,110,114,117,110, 50, 58, 10, 48, 58, 50, 48, - 49, 48, 58, 49, 57, 48, 58, 48, 48, 58, 53, 48, 10, 10,100,111,114,117, - 110,114,117,110, 99, 97, 58, 32, 59, 42, 42, 42, 42, 42, 42, 68,111, 33, - 32, 82,117,110, 32, 82,117,110, 32, 40, 68,111, 39,115, 32, 67, 97,115, - 116,108,101, 32,104, 97,114,100,119, 97,114,101, 44, 32,115,101,116, 32, - 50, 41, 10,100,111,114,117,110,114,117,110, 99, 58, 32, 59, 42, 42, 42, - 42, 42, 42, 68,111, 33, 32, 82,117,110, 32, 82,117,110, 32, 40, 68,111, - 39,115, 32, 67, 97,115,116,108,101, 32,104, 97,114,100,119, 97,114,101, - 44, 32,115,101,116, 32, 49, 41, 10, 48, 58, 56, 48, 49, 48, 58, 49, 57, - 48, 58, 48, 48, 58, 53, 48, 10, 10,115,112,105,101,114,111, 58, 10, 48, - 58, 50, 48, 49, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 50, 48, - 49, 49, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,101,112,114,111,109, 46, 99, 10,101,112,114,111,109, 58, 10, - 48, 58, 51,102, 55,100,101, 56, 58, 99, 56, 58, 48, 48, 58, 57, 56, 10, - 10,101,112,114,111,109, 50, 58, 10, 48, 58, 51,102, 55,100, 99, 48, 58, - 99, 56, 58, 48, 48, 58, 57, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,101,115,112,105, 97,108, 46, 99, 10,101,115,112,105, 97,108, 58, 10, - 101,115,112,105, 97,108,117, 58, 10, 48, 58, 53, 56, 52, 50, 58, 55, 56, - 58, 48, 48, 58, 50, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,101, - 120, 99,116,115, 99, 99,114, 46, 99, 10,101,120, 99,116,115, 99, 99,114, - 58, 10,101,120, 99,116,115, 99, 99,114,117, 58, 10,101,120, 99,116,115, - 99, 99,114, 97, 58, 10,101,120, 99,116,115, 99, 99,114,106, 58, 10,101, - 120, 99,116,115, 99, 99,114,106,111, 58, 10, 48, 58, 55, 99, 57, 48, 58, - 51, 48, 58, 52,100, 58, 48, 48, 10, 48, 58, 55, 99, 54, 48, 58, 51, 58, - 48, 50, 58, 48, 48, 10, 10,101,120, 99,116,115, 99, 99,114, 98, 58, 10, - 48, 58, 56, 99, 57, 48, 58, 51, 48, 58, 52,100, 58, 48, 48, 10, 48, 58, - 56, 99, 54, 48, 58, 51, 58, 48, 50, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,101,120,101,100,101,120,101,115, 46, 99, 10,101,120, - 101,100,101,120,101,115, 58, 10, 48, 58,101, 54, 56, 48, 58, 53, 48, 58, - 48, 48, 58, 49, 57, 10, 48, 58,101, 54, 48, 48, 58, 56, 58, 48, 48, 58, - 48, 48, 10, 10,115, 97,118,103, 98,101,101,115, 58, 10, 48, 58,101, 54, - 56, 48, 58, 53, 48, 58, 48, 48, 58, 50, 52, 10, 48, 58,101, 54, 48, 48, - 58, 56, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,101,120,101,114,105,111,110, 46, 99, 10,101,120,101,114,105,111,110, - 58, 10,101,120,101,114,105,111,110, 98, 58, 10,101,120,101,114,105,111, - 110,116, 58, 10, 48, 58, 54, 54, 48, 48, 58, 99, 56, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 54, 55, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,101,120,105,100,121, 46, 99, 10, - 109,116,114, 97,112, 58, 10,109,116,114, 97,112, 51, 58, 10,109,116,114, - 97,112, 52, 58, 10,109,116,114, 97,112, 98, 58, 10, 48, 58, 48, 51, 56, - 48, 58, 50, 51, 58, 48, 48, 58, 52, 56, 10, 10,118,101,110,116,117,114, - 101, 58, 10,118,101,110,116,117,114,101, 50, 58, 10,118,101,110,116,117, - 114,101, 52, 58, 10, 48, 58, 48, 51, 56, 48, 58, 50, 51, 58, 48, 48, 58, - 53, 51, 10, 10,112,101,112,112,101,114, 50, 58, 10,104, 97,114,100,104, - 97,116, 58, 10,112,101,112,112,101,114, 50, 55, 58, 10, 48, 58, 48, 51, - 54, 48, 58, 50, 51, 58, 48, 48, 58, 49, 49, 10, 10,116, 97,114,103, 58, - 10,115,112,101, 99,116, 97,114, 58, 10,115,112,101, 99,116, 97,114, 49, - 58, 10,112,104, 97,110,116,111,109, 97, 58, 10,114, 97,108,108,121,115, - 58, 10,112, 97,110,122,101,114, 58, 10,112,104, 97,110,116,111,109, 58, - 10,114, 97,108,108,121,115, 97, 58, 10, 48, 58, 48, 48, 97,101, 58, 50, - 58, 48, 48, 58, 49, 48, 10, 10,115,105,100,101,116,114, 97, 99, 58, 32, - 10, 48, 58, 48, 48, 48,102, 58, 50, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,102, 97,115,116,102,114,101,100, 46, 99, - 10,102, 97,115,116,102,114,101,100, 58, 10, 48, 58, 99, 48, 52, 98, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 52, 48, 48, 58, 51,102, 58, - 48, 48, 58, 49, 49, 10, 10,102,108,121, 98,111,121, 58, 32, 10,102,108, - 121, 98,111,121, 98, 58, 10, 48, 58, 99, 52, 48, 48, 58, 49,101, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 99, 52, 51, 48, 58, 54, 52, 58, 49, 98, 58, - 49, 48, 10, 48, 58, 99, 48, 52, 98, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,105,110, 97,108,105,122,114, - 46, 99, 10,102,105,110, 97,108,105,122,114, 58, 10, 48, 58, 51, 99, 48, - 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 99, 48, 57, 58, 49, - 58, 48, 51, 58, 48, 51, 10, 48, 58, 51, 99, 48, 97, 58, 50, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 51, 98, 99, 48, 58, 50, 55, 58, 48, 48, 58, 49, - 50, 10, 10,102,105,110, 97,108,105,122,114, 98, 58, 10, 48, 58, 51, 99, - 48, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 99, 48, 57, 58, - 49, 58, 48, 50, 58, 48, 50, 10, 48, 58, 51, 99, 48, 97, 58, 50, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 98, 99, 48, 58, 50, 55, 58, 48, 48, 58, - 49, 50, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,105,114,101,116, - 114, 97,112, 46, 99, 10,102,105,114,101,116,114, 97,112, 98,108, 58, 10, - 102,105,114,101,116,114, 97,112,106, 58, 10, 48, 58, 99, 97, 52, 55, 58, - 53,100, 58, 48, 50, 58, 49, 56, 10, 10,102,105,114,101,116,114, 97,112, - 58, 10,102,105,114,101,116,114, 97,112, 97, 58, 10, 48, 58, 99, 97, 52, - 55, 58, 53,100, 58, 48, 50, 58, 50, 53, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,102,108,115,116,111,114,121, 46, 99, 32, 40,102, 97,105,114, - 121,108, 97,110,100, 32,115,116,111,114,121, 41, 10,102,108,115,116,111, - 114,121, 58, 10,102,108,115,116,111,114,121,106, 58, 10, 48, 58,101, 55, - 52,101, 58, 50, 51, 58, 48, 48, 58, 52, 52, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,102,114,111,103,103,101,114, 46, 99, 10,102,114,111,103, - 103,101,114, 58, 10,102,114,111,103,103,101,114,115, 49, 58, 10,102,114, - 111,103,103,101,114,115, 50, 58, 10,102,114,111,103,103,101,114,109, 99, - 58, 10,113,117, 97, 97,107, 58, 10,102,114,111,103,103,101,114, 97,109, - 58, 10,102,114,111,103,103,101,114,115, 51, 58, 10, 48, 58, 56, 51,102, - 49, 58, 65, 58, 54, 51, 58, 48, 49, 10, 48, 58, 56, 51,101,102, 58, 50, - 58, 54, 51, 58, 48, 52, 10, 10,102,114,111,103,102, 58, 32, 32, 59, 42, - 42, 42, 42, 42, 42, 70,114,111,103,103,101,114, 32, 40, 70, 97,108, 99, - 111,110, 32, 98,111,111,116,108,101,103, 41, 10, 48, 58, 56, 51,102, 48, - 58, 99, 58, 48, 52, 58, 48, 53, 10, 10,102,114,111,103,103,101,114,115, - 58, 10,102,114,111,103,103, 58, 10,102,114,111,103,103,114,115, 58, 10, - 48, 58, 52, 51,102, 49, 58, 48, 65, 58, 54, 51, 58, 48, 49, 10, 48, 58, - 52, 51,101,102, 58, 48, 50, 58, 54, 51, 58, 48, 52, 10, 10,102,114,111, - 103,103,101,114,118, 58, 10, 48, 58, 56, 51,102, 49, 58, 48, 65, 58, 52, - 50, 58, 48, 49, 10, 48, 58, 56, 51,101,102, 58, 50, 58, 52, 50, 58, 48, - 52, 10, 10,110,101, 98,117,108, 98,101,101, 58, 10,103, 97,116,115, 98, - 101,101, 58, 10, 48, 58, 56, 97, 50, 48, 58, 50,100, 58, 48, 48, 58, 48, - 101, 10, 48, 58, 56, 51,101,100, 58, 54, 58, 48, 48, 58, 50, 52, 10, 10, - 99,104,101, 99,107,109, 97,110, 58, 10, 48, 58, 56, 48, 49, 99, 58, 52, - 56, 58, 48, 48, 58, 48, 48, 10, 10, 99,104,101, 99,107,109, 97,110,106, - 58, 10, 48, 58, 52, 48, 49, 98, 58, 52, 56, 58, 48, 48, 58, 48, 48, 10, - 10,100,101,118,105,108,102,115,103, 58, 10, 48, 58, 52, 48, 97, 56, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10,106,117,109,112, 98,117,103, 58, 10, - 106,117,109,112, 98,117,103, 98, 58, 10, 48, 58, 52, 50, 50, 50, 58, 49, - 53, 58, 48, 48, 58, 57, 55, 10, 48, 58, 52, 50, 48, 56, 58, 54, 58, 48, - 48, 58, 48, 48, 10, 10,107,105,110,103, 98, 97,108,108, 58, 10,107,105, - 110,103, 98, 97,108,108,106, 58, 10, 48, 58, 56, 51, 48, 53, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 48,100, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 56, 51, 48, 50, 58, 49, 58, 48, 49, 58, 48, 49, 10, - 10,108,101,118,101,114,115, 58, 10, 48, 58, 52, 49, 99,100, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10,109,111,111,110, 97,108, 50, 58, 10,109,111, - 111,110, 97,108, 50, 98, 58, 10, 48, 58, 56, 48, 97, 56, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 56, 51,102, 52, 58, 50, 58,102,102, 58,102, - 102, 10, 48, 58, 56, 51, 70, 68, 58, 49, 58,102,102, 58,102,102, 10, 10, - 109,111,111,110,113,115,114, 58, 10, 48, 58, 56, 48, 52,101, 58, 51, 48, - 58, 48, 48, 58, 57,102, 10, 10,111,114, 98,105,116,114,111,110, 58, 10, - 48, 58, 52, 48, 52, 97, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,112, 97, - 99,109, 97,110, 98,108, 58, 10,103,109,103, 97,108, 97,120, 58, 10,112, - 97, 99,109, 97,110, 98,108, 97, 58, 10, 48, 58, 52, 50, 56, 56, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 49, 56, 48, 58, 49, 58, 52, 48, - 58, 52, 48, 10, 48, 58, 53, 49, 97, 48, 58, 49, 58, 52, 48, 58, 52, 48, - 10, 48, 58, 53, 49, 99, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, - 53, 49,101, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 48, - 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 50, 48, 58, 49, - 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 50, 52, 48, 58, 49, 58, 52, 56, - 58, 52, 56, 10, 48, 58, 53, 50, 54, 48, 58, 49, 58, 52, 55, 58, 52, 55, - 10, 48, 58, 53, 50, 56, 48, 58, 49, 58, 52, 57, 58, 52, 57, 10, 48, 58, - 53, 50, 97, 48, 58, 49, 58, 52, 56, 58, 52, 56, 10, 10,112,105,115, 99, - 101,115, 58, 10,111,109,110,105, 58, 10,112,105,115, 99,101,115, 98, 58, - 10, 48, 58, 52, 48, 50, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42,117,112,100, 97,116,101,115, 32,115, 99,111,114,101, 32,111,110, 32, - 50,110,100, 32,103, 97,109,101, 32,115, 99,114,101,101,110, 10,115,116, - 114,101, 97,107,110,103, 58, 10,115,116,114,101, 97,107,110,103, 97, 58, - 10, 48, 58, 52, 50, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 53, 49, 56, 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 49, 97, - 48, 58, 49, 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 49, 99, 48, 58, 49, - 58, 52, 48, 58, 52, 48, 10, 48, 58, 53, 49,101, 48, 58, 49, 58, 52, 48, - 58, 52, 48, 10, 48, 58, 53, 50, 48, 48, 58, 49, 58, 52, 48, 58, 52, 48, - 10, 48, 58, 53, 50, 51, 48, 58, 49, 58, 49, 48, 58, 49, 48, 10, 10,119, - 97,114,111,102, 98,117,103, 58, 32, 32, 59, 42, 42, 42, 42, 32,116,104, - 101,115,101, 32, 50, 32,103, 97,109,101,115, 32,104, 97,118,101, 32,118, - 101,114,121, 32, 98,117,103,103,121, 32,104,105,115, 99,111,114,101, 32, - 33, 32, 32, 40,104,111, 32,104,111, 32,104,111, 41, 32, 42, 42, 42, 42, - 10,119, 97,114,111,102, 98,117,103,117, 58, 10, 48, 58, 52, 48, 51, 52, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 53, 50, 52, 49, 58, 49, 58, - 48, 58, 48, 10, 48, 58, 53, 50, 50, 49, 58, 49, 58, 48, 58, 48, 10, 48, - 58, 53, 50, 48, 49, 58, 49, 58, 48, 58, 48, 10, 48, 58, 53, 49,101, 49, - 58, 49, 58, 48, 58, 48, 10, 48, 58, 53, 49, 99, 49, 58, 49, 58, 48, 58, - 48, 10, 48, 58, 53, 49, 97, 49, 58, 49, 58, 48, 58, 48, 10, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108,105,118, 97,110, 46, 99, 10, - 103, 97,108,105,118, 97,110, 50, 58, 10,103, 97,108,105,118, 97,110, 51, - 58, 10,103, 97,108,105,118, 97,110, 58, 10, 48, 58,101, 49, 52,102, 58, - 56, 50, 58, 48, 48, 58, 50, 48, 10, 48, 58,101, 50, 56,101, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10,100, 97,110,103, 97,114, 58, 10,100, 97,110, - 103, 97,114, 50, 58, 10,100, 97,110,103, 97,114, 98, 58, 10, 48, 58,101, - 50, 48, 57, 58, 56, 50, 58, 48, 48, 58, 50, 48, 10, 48, 58,101, 51, 57, - 52, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,110,105,110,106,101,109, 97, - 107, 58, 10, 48, 58,101, 52, 54, 57, 58, 52, 49, 58, 48, 48, 58, 50, 48, - 10, 48, 58,101, 52, 97, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,121, - 111,117,109, 97, 58, 10,121,111,117,109, 97, 98, 58, 10,121,111,117,109, - 97, 98, 50, 58, 10,121,111,117,109, 97, 50, 58, 10, 48, 58,101, 52, 54, - 57, 58, 52, 49, 58, 48, 48, 58, 51,102, 10, 48, 58,101, 52, 97, 99, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 103, 97,108,112, 97,110,105, 99, 46, 99, 10,102, 97,110,116, 97,115,105, - 97, 58, 10,102, 97,110,116, 97,115,105, 97, 97, 58, 10,102, 97,110,116, - 97,115,105, 97, 98, 58, 10,102, 97,110,116, 97,115,105, 97,110, 58, 10, - 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 51, 58, 51, 48, 58, 50, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97,108,115,112,110, 98,108, - 46, 99, 10,103, 97,108,115,112,110, 98,108, 58, 10, 48, 58, 55, 48, 49, - 55, 56, 48, 58, 51, 50, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 48, 48, - 48, 48, 55, 58, 49, 58, 97, 51, 58, 97, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,103, 97,112,108,117,115, 46, 99, 10,103, 97,112,108,117, - 115, 58, 10,103, 97,112,108,117,115,111, 58, 10,103, 97,108, 97,103, 97, - 51,109, 58, 10,103, 97,112,108,117,115, 97, 58, 10,103, 97,108, 97,103, - 97, 51, 58, 10,103, 97,108, 97,103, 97, 51, 99, 58, 10,103, 97,112,108, - 117,115,100, 58, 10,103, 97,108, 97,103, 97, 51, 97, 58, 10,103, 97,108, - 97,103, 97, 51, 98, 58, 10,103, 97,112,108,117,115,116, 58, 10, 48, 58, - 48, 51, 69, 68, 58, 48, 56, 58, 51, 48, 58, 50, 48, 10, 48, 58, 48, 57, - 48, 48, 58, 65, 48, 58, 50, 48, 58, 48, 48, 10, 48, 58, 48, 57, 98, 54, - 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,103, 97,117,110,116,108,101,116, 46, 99, 10, 59, 32,110,111,116, - 101, 32,115, 97,118,101,115, 32,108, 97,115,116, 32,108,101,118,101,108, - 32, 99,111,109,112,108,101,116,101,100, 32, 97,110,100, 32,104,105,103, - 104, 32,115, 99,111,114,101,115, 10,103, 97,117,110,116,108,101,116, 58, - 10,103, 97,117,110,116,105,114, 49, 58, 10,103, 97,117,110,116,105,114, - 50, 58, 10,103, 97,117,110,116, 50,112, 58, 10,103, 97,117,110,116,108, - 101,116,114, 52, 58, 10,103, 97,117,110,116,108,101,116,114, 53, 58, 10, - 103, 97,117,110,116,108,101,116,114, 55, 58, 10,103, 97,117,110,116,108, - 101,116,114, 57, 58, 10,103, 97,117,110,116,108,101,116,115, 58, 10, 48, - 58, 57, 48, 52, 48, 49, 48, 58, 50, 58, 48, 58, 55, 10, 48, 58, 57, 48, - 52, 68, 69, 56, 58, 67, 56, 58, 48, 48, 58, 53, 48, 10, 10, 59, 32,110, - 111,116,101, 32,115, 97,118,101,115, 32,108, 97,115,116, 32,108,101,118, - 101,108, 32, 99,111,109,112,108,101,116,101,100, 32, 97,110,100, 32,104, - 105,103,104, 32,115, 99,111,114,101,115, 10,103, 97,117,110,116, 50, 58, - 10, 48, 58, 57, 48, 52, 48, 49, 48, 58, 50, 58, 48, 58, 53, 10, 48, 58, - 57, 48, 52, 68, 69, 56, 58, 67, 56, 58, 48, 48, 58, 69, 51, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,103, 98,101,114,101,116, 46, 99, 10,103, - 98,101,114,101,116, 58, 10,114,117,115,104, 97,116, 99,107, 58, 10,103, - 98,101,114,101,116, 98, 58, 10,109,114,103,111,101,109,111,110, 58, 10, - 48, 58,100, 57, 48, 48, 58, 51, 67, 58, 48, 51, 58, 49, 51, 10, 48, 58, - 100, 98, 48, 54, 58, 48, 51, 58, 48, 51, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,103, 98,117,115,116,101,114,115, 46, 99, 10,103, - 98,117,115,116,101,114,115, 58, 10, 99,114, 97,122,121, 99,111,112, 58, - 10,103, 98,117,115,116,101,114,115, 97, 58, 10, 48, 58, 52, 49, 48, 48, - 58, 51, 56, 58, 49, 57, 58, 48, 48, 10, 48, 58, 52, 48, 53, 48, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, - 101,101, 98,101,101, 46, 99, 10,103,101,101, 98,101,101, 58, 10,103,101, - 101, 98,101,101,103, 58, 10,103,101,101, 98,101,101, 98, 58, 10, 48, 58, - 52, 48, 52, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,103,114, 97,100,105,117,115, 51, 46, 99, 10,103,114, - 97,100,105,117,115, 51, 58, 10,103,114, 97,100,105,117,115, 51, 97, 58, - 10,103,114, 97,100,105,117,115, 51,101, 58, 10,103,114, 97,100,105,117, - 115, 51,106, 58, 10,103,114, 97,100,105,117,115, 51,106,115, 58, 10, 48, - 58, 52, 51,102, 48, 48, 58, 54, 52, 58, 48, 48, 58, 48, 56, 10, 48, 58, - 52, 48, 48, 53, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, - 48, 53, 97, 58, 49, 58, 55, 51, 58, 55, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,103,114,111, 98,100, 97, 46, 99, 10,103,114,111, 98,100, - 97, 58, 10,103,114,111, 98,100, 97, 50, 58, 10,103,114,111, 98,100, 97, - 51, 58, 10, 48, 58, 49, 98, 48, 48, 58, 97, 48, 58, 50, 48, 58, 48, 48, - 10, 48, 58, 48, 57, 53, 49, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,103,117,110,115,109,111,107,101, 46, - 99, 10,103,117,110,115,109,111,107,101, 58, 10,103,117,110,115,109,111, - 107,101,117, 58, 10,103,117,110,115,109,111,107,101,117, 98, 58, 10,103, - 117,110,115,109,111,107,101, 98, 58, 10,103,117,110,115,109,111,107,101, - 117, 97, 58, 10, 48, 58,101, 54, 56, 48, 58, 53, 48, 58, 48, 48, 58, 49, - 52, 10, 48, 58,101, 54, 48, 48, 58, 56, 58, 48, 48, 58, 48, 48, 10, 10, - 103,117,110,115,109,111,107,101,106, 58, 10, 48, 58,101, 54, 56, 48, 58, - 53, 48, 58, 48, 48, 58, 49, 56, 10, 48, 58,101, 54, 48, 48, 58, 56, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,104, 99, - 97,115,116,108,101, 46, 99, 32, 10,104, 99, 97,115,116,108,101, 58, 10, - 104, 99, 97,115,116,108,101,111, 58, 10,104, 99, 97,115,116,108,106,111, - 58, 10,104, 99, 97,115,116,108,101,106, 58, 10, 97,107,117,109, 97,106, - 111,117, 58, 10,104, 99, 97,115,116,108,101,107, 58, 10, 97,107,117,109, - 97,106,111,117,110, 58, 10,104, 99, 97,115,116,108,101,101, 58, 10, 48, - 58, 49, 57, 52, 48, 58, 51, 99, 58, 48, 53, 58, 49, 97, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,104,101,120, 97, 46, 99, 10,104,101,120, 97, - 58, 10,104,101,120, 97, 97, 58, 10, 48, 58, 99, 55, 48, 57, 58, 50, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,104,121, - 112,101,114,115,112,116, 46, 99, 32, 10,114,111, 97,100,102, 58, 10,114, - 111, 97,100,102, 50, 58, 32, 10, 48, 58, 51, 98,100, 48, 58, 49, 48, 97, - 58, 48, 49, 58, 48, 49, 10, 48, 58, 51, 48, 54, 54, 58, 51, 58, 48, 49, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,105,114,111,110, - 104,111,114,115, 46, 99, 10,105,114,111,110,104,111,114,115, 58, 10,100, - 97,105,114,101,115,121, 97, 58, 10,102, 97,114,119,101,115,116, 58, 32, - 10, 48, 58, 51, 50,102, 49, 58, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, - 51, 51, 48, 48, 58, 52, 48, 58, 50, 51, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,105,116,101, 99,104, 56, 46, 99, 10,110,105,110, - 99,108,111,119,110, 58, 10, 48, 58, 56,100, 58, 52,101, 58, 48, 48, 58, - 52, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,106, 97, 99,107, 46, - 99, 10,106, 97, 99,107, 58, 10,106, 97, 99,107, 50, 58, 10,106, 97, 99, - 107, 51, 58, 10,116,114,101, 97,104,117,110,116, 58, 10, 48, 58, 52, 53, - 48, 48, 58, 53, 97, 58, 48, 48, 58, 52, 49, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,106, 97,105,108, 98,114,101,107, 46, 99, 10,106, 97,105, - 108, 98,114,101,107, 58, 10,106, 97,105,108, 98,114,101,107, 98, 58, 10, - 109, 97,110,104, 97,116, 97,110, 58, 10, 48, 58, 49, 54, 50, 48, 58, 53, - 48, 58, 48, 48, 58, 49, 49, 10, 48, 58, 49, 53, 55,101, 58, 51, 58, 48, - 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,106,117,110, - 111,102,114,115,116, 46, 99, 10,106,117,110,111,102,114,115,116, 58, 10, - 106,117,110,111,102,114,115,116,103, 58, 32, 10, 48, 58, 56, 49, 48, 48, - 58, 97, 48, 58, 48, 49, 58, 51,102, 10, 10,100,105, 97,109,111,110,100, - 58, 10, 48, 58, 49, 50, 48, 48, 58, 56, 48, 58, 52, 98, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103,111,116,116,108,105,101, 98, - 46, 99, 10,114,101, 97, 99,116,111,114, 58, 10, 48, 58, 48, 52,100, 56, - 58, 56, 48, 58, 48, 97, 58, 48, 48, 10, 48, 58, 48, 53, 98, 99, 58, 56, - 48, 58, 49, 50, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 103,121,114,117,115,115, 46, 99, 10,103,121,114,117,115,115, 58, 10,103, - 121,114,117,115,115, 99,101, 58, 10,103,121,114,117,115,115, 98, 58, 10, - 48, 58, 57, 52, 56, 56, 58, 50, 56, 58, 48, 48, 58, 56, 51, 10, 48, 58, - 57, 52, 48, 98, 58, 48, 51, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,107, 97,110,101,107,111, 49, 54, 46, 99, 32, 10, - 98,101,114,108,119, 97,108,108, 58, 10, 98,101,114,108,119, 97,108,108, - 116, 58, 10, 98,101,114,108,119, 97,108,108,107, 58, 10, 48, 58, 50, 48, - 50, 56, 97, 48, 58, 57, 51, 58, 48, 48, 58, 52, 55, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,107, 99,104, 97,109,112, 46, 99, 10,107, 99,104, - 97,109,112, 58, 10,107, 97,114, 97,116,101,100,111, 58, 10,107, 99,104, - 97,109,112,118,115, 58, 10,107, 97,114, 97,116,101,118,115, 58, 10,107, - 99,104, 97,109,112,118,115, 50, 58, 10, 48, 58, 99, 48, 52, 48, 58, 54, - 99, 58, 48, 50, 58, 48, 49, 10, 48, 58, 99, 48, 99, 48, 58, 51, 58, 48, - 50, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,107,105,110, - 103,111, 98,111,120, 46, 99, 10,107,105,110,103,111,102, 98, 58, 10, 48, - 58, 67, 50, 50, 65, 58, 48, 52, 58, 48, 48, 58, 48, 53, 10, 49, 58, 56, - 48, 52, 56, 58, 56, 67, 58, 48, 48, 58, 49, 50, 10, 10,114,105,110,103, - 107,105,110,103, 58, 10,114,105,110,103,107,105,110,103, 50, 58, 10, 49, - 58, 56, 48, 52, 57, 58, 56, 67, 58, 48, 48, 58, 49, 50, 10, 48, 58, 67, - 50, 51, 66, 58, 48, 52, 58, 48, 48, 58, 48, 53, 10, 10, 99, 97,118,101, - 110,103,101,114, 58, 10, 48, 58, 54, 48, 50, 53, 58, 52, 49, 58, 48, 48, - 58, 50, 56, 10, 10,115,110, 97,112,106, 97, 99,107, 58, 10, 48, 58, 54, - 97, 57, 52, 58, 52, 49, 58, 48, 49, 58, 50, 52, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,108, 97,115,115,111, 46, 99, 10,108, 97,115,115,111, - 58, 10, 48, 58, 48, 50, 50, 48, 58, 55, 48, 58, 49, 49, 58, 51, 48, 10, - 48, 58, 48, 48, 49, 99, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,108, 97,115,116,100,117,101,108, 46, 99, 10, - 108, 97,115,116,100,117,101,108, 58, 10,108, 97,115,116,100,117,101,108, - 111, 58, 10,108, 97,115,116,100,117,101,108, 98, 58, 10, 48, 58,102,102, - 56, 55,101, 50, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 99, - 54,102, 50, 58, 54, 56, 58, 99, 55, 58, 48, 48, 10, 48, 58,102, 99, 99, - 55, 54,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58,102, 99, 99, 55, - 101,100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58,102, 99, 99, 56, 54, - 100, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58,102, 99, 99, 56,101,100, - 58, 49, 58, 48, 50, 58, 48, 50, 10, 48, 58,102, 99, 99, 57, 54,100, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 99, 99, 57,101,100, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58,102, 99, 99, 97, 54,100, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58,102, 99, 99, 97,101,100, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 10,109, 97,100,103,101, 97,114, 58, 10,109, 97,100, - 103,101, 97,114,106, 58, 10,108,101,100,115,116,111,114,109, 58, 10, 48, - 58,102,102, 56, 56, 57, 48, 58, 55, 56, 58, 48, 48, 58, 48, 48, 10, 48, - 58,102,102, 99, 98, 55, 54, 58, 50, 51, 58, 48, 50, 58, 48, 48, 10, 48, - 58,102,102, 56, 55, 99, 57, 58, 49, 58,100, 50, 58,100, 50, 10, 10,108, - 101,100,115,116,111,114,109, 50, 58, 10,108,101,100,115, 50, 48, 49, 49, - 117, 58, 10,108,101,100,115, 50, 48, 49, 49, 58, 10, 48, 58,102,102, 56, - 56, 57, 48, 58, 55, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 99, - 98, 55, 54, 58, 50, 51, 58, 52, 49, 58, 48, 49, 10, 48, 58,102,102, 56, - 55, 99, 57, 58, 49, 58,100, 50, 58,100, 50, 10, 10,106,117,110,103,108, - 101,114, 58, 10,106,117,110,103,108,101,114,115, 58, 10,115, 97,118, 97, - 110,110, 97, 58, 10,106, 97, 99,107,108,101,114, 58, 10, 48, 58, 57, 57, - 52, 48, 58, 97, 48, 58, 48, 48, 58, 53, 98, 10, 48, 58, 57, 57, 49, 99, - 58, 51, 58, 48, 48, 58, 48, 50, 10, 10, 99,111,109,109,115,101,103, 97, - 58, 10, 48, 58, 57, 99, 54,100, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,108,119,105,110,103,115, 46, 99, 10, - 97,118,101,110,103,101,114,115, 58, 10, 97,118,101,110,103,101,114,115, - 50, 58, 10, 48, 58, 99,101, 48, 48, 58, 53, 52, 58, 48, 48, 58, 52, 55, - 10, 48, 58, 99,101, 57, 55, 58, 51, 58, 48, 48, 58, 54, 48, 10, 10, 98, - 117,114, 97,105,107,101,110, 58, 10, 98,117,114, 97,105,107,101,110, 98, - 58, 10, 48, 58, 99,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50,101, 10, - 48, 58, 99,101, 57, 55, 58, 51, 58, 48, 48, 58, 54, 48, 10, 10,108,119, - 105,110,103,115, 58, 10,108,119,105,110,103,115, 50, 58, 10,108,119,105, - 110,103,115,106, 58, 10,108,119,105,110,103,115, 98, 58, 10, 48, 58, 99, - 101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50,101, 10, 48, 58, 99,101, 57, - 55, 58,100, 58, 48, 48, 58, 48, 48, 10, 10,116,114,111,106, 97,110,114, - 58, 10,116,114,111,106, 97,110, 58, 10,116,114,111,106, 97,110,106, 58, - 10,116,114,111,106, 97,110, 97, 58, 10,116,114,111,106, 97,110, 98, 58, - 10, 48, 58, 99,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50,101, 10, 48, - 58, 99,101, 57, 55, 58, 51, 58, 48, 48, 58, 54, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,109, 54, 50, 46, 99, 10,107,117,110,103,102,117, - 109, 58, 10,107,117,110,103,102,117,109,100, 58, 10,107,117,110,103,102, - 117, 98, 58, 10,107,117,110,103,102,117, 98, 50, 58, 10,115,112, 97,114, - 116, 97,110,120, 58, 10,115,112, 97,114,116, 97,110,120,116,101, 99, 58, - 10, 48, 58,101, 97, 48, 54, 58, 55, 56, 58, 48, 48, 58, 52, 49, 10, 48, - 58,101, 57, 56, 48, 58, 51, 58, 53, 50, 58, 48, 48, 10, 10, 98, 97,116, - 116,114,111, 97,100, 58, 10, 48, 58,101,100, 53, 48, 58, 98, 48, 58, 48, - 48, 58, 48, 56, 10, 10,115,112,101,108,117,110,107, 50, 58, 10, 48, 58, - 101, 48, 54, 54, 58, 54, 52, 58, 57, 57, 58, 51,102, 10, 48, 58,101, 48, - 52,102, 58, 50, 58, 57, 57, 58, 49, 49, 10, 10,108,111,116,108,111,116, - 58, 10, 48, 58,101, 57, 54, 98, 58, 50, 50, 54, 58, 48, 50, 58, 48, 48, - 10, 48, 58,101, 57, 53, 54, 58, 51, 58, 48, 50, 58, 49, 55, 10, 10,108, - 100,114,117,110, 58, 10,108,100,114,117,110, 97, 58, 10, 48, 58,101, 53, - 101, 53, 58, 99, 56, 58, 48, 49, 58, 48, 52, 10, 48, 58,101, 53, 57, 97, - 58, 51, 58, 48, 52, 58, 52, 48, 10, 10,108,100,114,117,110, 50, 58, 10, - 108,100,114,117,110, 51, 58, 10,108,100,114,117,110, 51,106, 58, 10, 48, - 58,101, 54, 98,100, 58, 99, 56, 58, 48, 48, 58, 48, 53, 10, 48, 58,101, - 54, 55, 50, 58, 51, 58, 48, 48, 58, 56, 48, 10, 10,108,100,114,117,110, - 52, 58, 10, 48, 58,101, 55, 51, 53, 58, 99, 56, 58, 48, 48, 58, 48, 54, - 10, 48, 58,101, 54,101, 97, 58, 51, 58, 48, 48, 58, 55, 48, 10, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 55, 50, 46, 99, 10, 97,105,114, - 100,117,101,108,109, 55, 50, 58, 10, 97,105,114,100,117,101,108, 58, 10, - 48, 58, 97, 51,100, 52,101, 58, 56, 50, 58, 49, 53, 58, 50, 48, 10, 10, - 114,105,112,111,102,102, 58, 10, 48, 58,101, 48, 58, 56, 58, 48, 48, 58, - 48, 48, 10, 10,104,104, 97,114,114,121, 58, 10, 48, 58, 97, 48, 57, 97, - 48, 58, 57,102, 58, 48, 48, 58, 50, 48, 10, 48, 58, 97, 48, 97, 52, 48, - 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10,104,104, 97,114,114,121,117, - 58, 10, 48, 58,101, 48, 57, 97, 48, 58, 57,102, 58, 48, 48, 58, 50, 48, - 10, 48, 58,101, 48, 97, 52, 48, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, - 10,100,107,103,101,110,115, 97,110, 58, 10, 48, 58,101, 48, 57, 97, 48, - 58, 57,102, 58, 52, 48, 58, 50, 48, 10, 48, 58,101, 48, 97, 52, 48, 58, - 51, 58, 52, 48, 58, 48, 50, 10, 10,105,109,103,102,105,103,104,116, 58, - 10,105,109,103,102,105,103,104,116,111, 58, 10,105,109,103,102,105,103, - 104,116,106, 58, 10, 48, 58, 97, 51, 51, 52,102, 58, 55, 56, 58, 48, 57, - 58, 50, 48, 10, 10,109, 97,106,116,105,116,108,101, 58, 10,109, 97,106, - 116,105,116,108,101,106, 58, 10, 48, 58,100, 50, 98, 97, 52, 58, 57, 98, - 58, 52, 98, 58, 49, 55, 10, 10,110,115,112,105,114,105,116, 58, 10,110, - 115,112,105,114,105,116,106, 58, 10, 48, 58, 97, 51, 57, 51, 48, 58, 55, - 56, 58, 52, 53, 58, 52,102, 10, 48, 58, 97, 51, 57, 98, 97, 58, 48, 51, - 58, 52, 53, 58, 48, 48, 10, 10,112,111,117,110,100,102,111,114, 58, 10, - 112,111,117,110,100,102,111,114,117, 58, 10,112,111,117,110,100,102,111, - 114,106, 58, 10, 48, 58,101, 50, 53, 48, 50, 58, 50, 56, 58, 49, 48, 58, - 48, 48, 10, 48, 58,101, 50, 53, 50, 97, 58, 50, 56, 58, 51, 53, 58, 48, - 48, 10, 48, 58,101, 50, 53, 53, 50, 58, 50, 56, 58, 52, 50, 58, 48, 48, - 10, 48, 58,101, 50, 53, 55, 97, 58, 50, 56, 58, 48, 48, 58, 48, 48, 10, - 48, 58,101, 50, 53, 97, 50, 58, 50, 56, 58, 49, 49, 58, 48, 48, 10, 48, - 58,101, 50, 53, 99, 97, 58, 50, 56, 58, 53, 57, 58, 48, 48, 10, 48, 58, - 101, 50, 53,102, 50, 58, 50, 56, 58, 54, 56, 58, 48, 48, 10, 48, 58,101, - 50, 54, 49, 97, 58, 50, 56, 58, 55, 48, 58, 48, 48, 10, 48, 58,101, 50, - 54, 52, 50, 58, 50, 56, 58, 53, 55, 58, 48, 48, 10, 48, 58,101, 50, 54, - 54, 97, 58, 50, 56, 58, 52, 49, 58, 48, 48, 10, 10,114,116,121,112,101, - 50, 58, 10,114,116,121,112,101, 50,106, 58, 10,114,116,121,112,101, 50, - 106, 99, 58, 10, 48, 58,101, 51, 56, 51, 52, 58, 56, 50, 58, 48, 48, 58, - 52, 49, 10, 48, 58,101, 51, 56, 99, 50, 58, 55, 58,102, 51, 58, 51, 48, - 10, 48, 58,100, 48, 49, 55, 56, 58, 49, 58,102, 51, 58,102, 51, 10, 48, - 58,100, 48, 49, 55, 99, 58, 49, 58, 51, 49, 58, 51, 49, 10, 48, 58,100, - 48, 49, 56, 48, 58, 49, 58, 51, 55, 58, 51, 55, 10, 48, 58,100, 48, 49, - 56, 52, 58, 49, 58, 51, 52, 58, 51, 52, 10, 48, 58,100, 48, 49, 56, 56, - 58, 49, 58, 51, 53, 58, 51, 53, 10, 48, 58,100, 48, 49, 56, 99, 58, 49, - 58, 51, 48, 58, 51, 48, 10, 48, 58,100, 48, 49, 57, 48, 58, 49, 58, 51, - 48, 58, 51, 48, 10, 10,114,116,121,112,101, 50,109, 56, 50, 98, 58, 10, - 48, 58,100, 51, 56, 52, 56, 58, 54,101, 58, 48, 48, 58, 52, 49, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 55, 57, 97,109, 98, 46, 99, 10, - 109, 55, 57, 97,109, 98, 58, 10, 48, 58, 52, 48, 48, 56, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 57, 48, - 46, 99, 10, 98,111,109, 98,114,109, 97,110, 58, 10, 48, 58, 97, 48, 98, - 49, 98, 58, 56, 99, 58, 48, 51, 58, 54, 51, 10, 48, 58, 97, 48, 98,102, - 101, 58, 51, 58, 52, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,109, 57, 50, 46, 99, 10,104,111,111,107,117, 58, 10,104,111,111, - 107, 58, 10, 48, 58,101, 97, 54, 97,100, 58,101, 99, 58, 48, 48, 58, 52, - 102, 10, 10,114,116,121,112,101,108,101,111, 58, 10,114,116,121,112,101, - 108,101,111,106, 58, 10, 48, 58,101, 50, 50, 49,101, 58, 51, 56, 58, 52, - 48, 58, 50, 48, 10, 48, 58,101, 50, 50, 53, 54, 58, 51, 58, 52, 48, 58, - 48, 49, 10, 48, 58,100, 99, 49, 52, 56, 58, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58,100, 99, 49, 52, 99, 58, 49, 58, 51, 49, 58, 51, 49, 10, 48, - 58,100, 99, 49, 53, 48, 58, 49, 58, 51, 50, 58, 51, 50, 10, 48, 58,100, - 99, 49, 53, 52, 58, 49, 58, 51, 56, 58, 51, 56, 10, 48, 58,100, 99, 49, - 53, 56, 58, 49, 58, 51, 52, 58, 51, 52, 10, 48, 58,100, 99, 49, 53, 99, - 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58,100, 99, 49, 54, 48, 58, 49, - 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 109,101,116,114,111, 46, 99, 32, 40,108, 97,115,116, 32,102,111,114,116, - 114,101,115,115, 32, 45, 32,116,111,114,105,100,101, 32, 47, 32,101,114, - 111,116,105, 99, 41, 10,108, 97,115,116,102,111,114,116, 58, 10,108, 97, - 115,116,102,111,114,116,101, 58, 10,108, 97,115,116,102,111,114,116,107, - 58, 10,108, 97,115,116,102,111,114,116,101, 97, 58, 10, 48, 58, 52, 48, - 100, 98, 49, 97, 58, 48, 97, 58, 48, 49, 58, 54, 52, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42, 76, 97,115,116, 32, 70,111,114,116,114,101,115, - 115, 32, 45, 32, 84,111,114,105,100,101, 32, 40, 71,101,114,109, 97,110, - 41, 10,108, 97,115,116,102,111,114,116,103, 58, 10, 48, 58, 99, 48,100, - 98, 49, 97, 58, 48, 97, 58, 48, 49, 58, 54, 52, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,109, 57, 55, 46, 99, 10, 98, 98,109, 97,110,119,106, - 58, 32, 59, 42, 42, 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32, - 110,111,116, 32,119,111,114,107,105,110,103, 32, 63, 63, 63, 63, 63, 32, - 10, 98, 98,109, 97,110,119, 58, 10, 98,111,109, 98,108,111,114,100, 58, - 10, 98, 98,109, 97,110,119,106, 97, 58, 10, 48, 58, 97, 48, 98, 51, 54, - 58, 54, 97, 58, 48, 50, 58, 50,101, 10, 10,100,121,110, 97, 98,108,115, - 116, 58, 10, 97,116,111,109,112,117,110,107, 58, 32, 32, 59, 42, 42, 42, - 42, 42, 42, 97,116,111,109,105, 99, 32,112,117,110,107, 32, 40,117,115, - 41, 10,100,121,110, 97, 98,108,115,116, 98, 58, 10, 48, 58, 97, 48, 98, - 50, 99, 58, 56,102, 58, 48, 51, 58, 48, 51, 10, 48, 58, 97, 48, 99, 48, - 102, 58, 51, 58, 52, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,109, 97,103,105,120, 46, 99, 10,109, 97,103,105,120, 58, 10, 48, - 58,102, 56, 48, 48, 58, 56, 48, 58, 48, 48, 58, 50,101, 10, 48, 58,102, - 56, 56, 56, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,109, 97,103,109, 97,120, 46, 99, 10,109, 97,103,109, 97, - 120, 58, 10, 48, 58, 49, 56, 99,101, 48, 58, 52, 54, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 49, 56,100, 50,101, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 49, 56,100, 50, 51, 58, 49, 58, 51, 53, 58, 51, 53, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,109, 97,105,110,101,118,116, 46, 99, 10, - 100,101,118,115,116,111,114,115, 58, 10, 48, 58, 52, 49, 99, 52, 58, 50, - 101, 58, 48, 49, 58, 48, 49, 10, 10,100,105,103,100,117,103, 50, 58, 10, - 100,105,103,100,117,103, 50,111, 58, 10, 48, 58, 49, 49, 98, 48, 58, 53, - 48, 58, 48, 48, 58, 48, 49, 10, 48, 58, 49, 48, 48, 98, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 55,101,100, 58, 55, 58, 51, 48, 58, 50, 48, - 10, 10,109,111,116,111,115, 58, 10, 48, 58, 50, 52, 48, 48, 58, 97, 48, - 58, 50, 48, 58, 48, 48, 10, 48, 58, 49, 56, 51, 49, 58, 52, 58, 48, 48, - 58, 48, 48, 10, 10,116,111,100,114,117, 97,103, 97, 58, 10,116,111,100, - 114,117, 97,103, 98, 58, 10,116,111,100,114,117, 97,103, 97,111, 58, 10, - 116,111,100,114,117, 97,103, 97,115, 58, 10, 48, 58, 49, 48, 50, 97, 58, - 51, 50, 58, 48, 48, 58, 52, 53, 10, 48, 58, 49, 48, 48, 98, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97, - 114,105,110,101, 98, 46, 99, 10,109, 97,114,105,110,101, 98, 58, 10, 48, - 58, 56, 57, 55, 57, 58, 54, 58, 50, 52, 58, 50, 52, 10, 48, 58, 56, 57, - 57, 57, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10,115,112,114,105,110,103, - 101,114, 58, 10, 48, 58, 56, 97,102, 97, 58, 53, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 56, 98, 49, 97, 58, 53, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 56, 98, 51, 97, 58, 53, 58, 48, 50, 58, 48, 50, 10, 48, 58, 56, 98, 53, - 97, 58, 53, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 98, 55, 97, 58, 53, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 98, 57, 97, 58, 53, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 56, 98, 98, 97, 58, 53, 58, 48, 48, 58, 48, 48, - 10, 10,104,111, 99, 99,101,114, 58, 10, 48, 58, 56, 53, 53, 48, 58, 51, - 50, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56, 53, 99, 97, 58, 54, 58, 48, - 48, 58, 48, 48, 10, 10,104,111, 99, 99,101,114, 50, 58, 10, 48, 58, 56, - 53, 53, 48, 58, 50,100, 58, 48, 48, 58, 50, 57, 10, 48, 58, 56, 53, 99, - 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10,104,111,112,112,114,111, 98, - 111, 58, 10, 48, 58, 56, 48, 53,102, 58, 49, 57, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 56, 48, 55, 56, 58, 49,101, 58, 49, 99, 58, 48,101, 10, 48, - 58, 56, 57, 98,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 57, - 100,101, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 56, 57,102,101, 58, - 49, 58, 48, 54, 58, 48, 54, 10, 48, 58, 56, 97, 49,101, 58, 49, 58, 48, - 55, 58, 48, 55, 10, 48, 58, 56, 97, 51,101, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 10,119, 97,110,116,101,100, 58, 32, 59, 42, 32,110,111,116, 32, - 115, 97,118,105,110,103, 32,119,104,111,108,101, 32,116, 97, 98,108,101, - 10, 48, 58, 56, 97, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 56, 97, 51,101, 58, 49, 58, 48, 51, 58, 48, 51, 10, 48, 58, 56, 97, 49, - 101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 57,102,101, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 57,100,101, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 56, 49, 98, 52, 58, 52, 99, 58, 48, 48, 58, 49, - 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,114,105,111, 46, - 99, 10,109, 97,114,105,111, 58, 10,109, 97,115, 97,111, 58, 10,109, 97, - 114,105,111,106, 58, 10,109, 97,114,105,111,111, 58, 10,109, 97,114,105, - 111,101, 58, 10,109, 97,114,105,111, 98,108, 58, 10, 48, 58, 54, 98, 48, - 48, 58, 97, 97, 58, 57, 55, 58, 55, 52, 10, 48, 58, 54, 99, 48, 48, 58, - 51, 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 56, 50, 51, 58, 51, 58, - 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97, - 116,109, 97,110,105, 97, 46, 99, 10,109, 97,116,109, 97,110,105, 97, 58, - 10,101,120, 99,116,104,111,117,114, 58, 10, 48, 58, 48, 55, 48, 48, 58, - 53, 48, 58, 48, 48, 58, 98, 48, 10, 48, 58, 48, 48, 50, 56, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10,109, 97,110,105, 97, 99,104, 58, 10,109, 97, - 110,105, 97, 99,104, 50, 58, 10, 48, 58, 48, 53, 50, 98, 58, 51, 99, 58, - 48, 48, 58, 99, 54, 10, 48, 58, 48, 48, 50, 56, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 99,114, 51, 46, - 99, 10,100,101,115,116,100,101,114, 98, 58, 10, 48, 58,101, 52,101, 52, - 58, 99,101, 58, 48, 49, 58, 48, 48, 10, 48, 58,101, 55,102, 55, 58, 49, - 58, 55, 54, 58, 55, 54, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, - 99,114, 54, 56, 46, 99, 10, 97,114, 99,104,114,105,118,108, 58, 10, 48, - 58, 54, 50, 99,102, 49, 58, 51, 49, 57, 58, 48, 57, 58, 48, 53, 10, 48, - 58, 54, 49,101,100, 53, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 97,114, - 99,104,114,105,118,108, 50, 58, 10, 97,114, 99,104,114,105,118,108, 97, - 58, 10, 97,114, 99,104,114,105,118,108, 98, 58, 10, 48, 58, 54, 50, 99, - 101, 51, 58, 51, 49, 57, 58, 48, 57, 58, 48, 53, 10, 48, 58, 54, 49,101, - 100, 53, 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 98,108, 97,115,116,101, - 100, 58, 10, 48, 58, 54, 49,100, 55,102, 58, 50,102, 58, 53, 52, 58, 55, - 53, 10, 10,122,119, 97, 99,107,101,114,121, 58, 10, 48, 58, 56, 52, 50, - 99, 50, 58, 52, 56, 58, 52, 50, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,109,101,103, 97,115,121,115, 49, 46, 99, 10, 54, 52,115, - 116,114,101,101,116, 58, 10, 54, 52,115,116,114,101,101,116,106, 58, 10, - 54, 52,115,116,114,101,101,116,106, 97, 58, 10, 48, 58,102,102, 56, 56, - 52, 51, 58, 55, 52, 58, 48, 48, 58, 52, 51, 10, 10, 97,118,115,112,105, - 114,105,116, 58, 10, 48, 58, 55, 57,100,102, 50, 58, 53, 51, 58, 48, 48, - 58, 53, 52, 10, 10, 99,104,105,109,101,114, 97, 98, 58, 10, 48, 58,102, - 102, 56, 56, 53, 48, 58, 97, 55, 58, 48, 48, 58, 48, 48, 10, 10,112, 52, - 55, 58, 10,112, 52, 55,106, 58, 10,112, 52, 55,106,101, 58, 10, 48, 58, - 102, 49, 56, 48, 48, 58, 55, 56, 58, 48, 48, 58, 52,102, 10, 10,112,104, - 97,110,116, 97,115,109, 58, 10, 48, 58,102,102, 57,100,101,101, 58, 53, - 51, 58, 48, 48, 58, 53, 52, 10, 10,112,108,117,115, 97,108,112,104, 58, - 10, 48, 58,102, 50,102, 51, 54, 58, 49, 54, 56, 58, 48, 48, 58, 52, 51, - 10, 10,114,111,100,108, 97,110,100, 58, 10, 48, 58,102, 54, 48,102, 99, - 58, 50, 50, 54, 58, 48, 48, 58, 48, 49, 10, 48, 58,102, 51, 48, 51, 48, - 58, 49, 52, 58, 48, 48, 58, 48, 48, 10, 10,114,111,100,108, 97,110,100, - 106, 58, 10,114,111,100,108, 97,110,100,106, 98, 58, 10, 48, 58,102, 54, - 48,102, 97, 58, 50, 50, 54, 58, 48, 48, 58, 48, 49, 10, 48, 58,102, 51, - 48, 50,101, 58, 49, 51, 58, 48, 48, 58, 48, 48, 10, 10,114,105,116,116, - 97,109, 58, 10, 48, 58,102, 54, 56,102, 99, 58, 50, 50, 54, 58, 48, 48, - 58, 48, 49, 10, 48, 58,102, 51,100, 51,101, 58, 49, 52, 58, 48, 48, 58, - 100,102, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, - 46, 99, 10,115,107,121, 97,108,101,114,116, 58, 10, 48, 58, 99, 48,101, - 51, 52, 48, 58, 53, 99, 58, 48, 48, 58, 48, 56, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,109,105,107,105,101, 46, 99, 10,109,105,107,105,101, - 58, 10,109,105,107,105,101,106, 58, 10,109,105,107,105,101,104,115, 58, - 10, 48, 58, 50, 97, 48, 48, 58, 48, 49, 58, 49,100, 58, 49,100, 32, 10, - 48, 58, 50, 97, 48, 49, 58, 48, 49, 58, 50, 99, 58, 50, 99, 32, 10, 48, - 58, 50, 97, 48, 50, 58, 48, 49, 58, 49,102, 58, 49,102, 32, 10, 48, 58, - 50, 97, 48, 51, 58, 48, 49, 58, 48, 48, 58, 48, 48, 32, 10, 48, 58, 50, - 97, 48, 52, 58, 48, 49, 58, 48, 49, 58, 48, 49, 32, 10, 48, 58, 50, 97, - 48, 53, 58, 50, 56, 58, 48, 48, 58, 48, 48, 32, 10, 48, 58, 50, 57,102, - 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 32, 10, 48, 58, 50, 57, 55, 99, - 58, 48, 52, 58, 48, 48, 58, 48, 48, 32, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,109,105,116, 99,104,101,108,108, 46, 99, 10, 98,108,111, 99, - 107, 58, 10, 98,108,111, 99,107,114, 50, 58, 10, 98,108,111, 99,107,114, - 49, 58, 10, 98,108,111, 99,107,106, 58, 10, 98,108,111, 99,107, 98,108, - 58, 10, 98,108,111, 99,107,106,111,121, 58, 10, 48, 58,101, 48,102, 48, - 58, 53, 48, 58, 53, 52, 58, 56, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,109,110,105,103,104,116, 46, 99, 10,109,110,105,103,104,116, 58, - 10, 48, 58, 99, 48, 57, 57, 58, 52, 49, 58, 48, 48, 58, 50, 48, 10, 48, - 58, 99, 48,101, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 97,114,107, - 97,114,101, 97, 58, 10, 48, 58,100, 52, 53, 99, 58, 52, 50, 58, 52, 54, - 58, 51, 48, 10, 48, 58, 99, 48, 52, 48, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,111,108,101, 46, 99, 10, - 109,111,108,101, 58, 10, 48, 48, 58, 48, 50, 69, 49, 58, 48, 65, 58, 48, - 48, 58, 48, 53, 10, 48, 48, 58, 48, 51, 55, 53, 58, 53, 48, 58, 49, 57, - 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,112, 97,116, - 114,111,108, 46, 99, 10,109,112, 97,116,114,111,108, 58, 32, 10,109,112, - 97,116,114,111,108,119, 58, 32, 10,109,114, 97,110,103,101,114, 58, 32, - 10, 48, 58,101, 48, 48, 56, 58, 50, 99, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,109,114,100,111, 46, 99, 10,109,114, - 100,111, 58, 32, 32, 10,109,114,100,111,116, 58, 10,109,114,100,111,102, - 105,120, 58, 10,109,114,108,111, 58, 10,109,114,100,117, 58, 10,109,114, - 100,111,121, 58, 10,121, 97,110,107,101,101,100,111, 58, 10, 48, 58,101, - 48, 49, 55, 58, 54, 52, 58, 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 49, 46, 99, 10, 98,108, 97, - 115,116,111,102,102, 58, 10, 48, 58, 52, 49, 54, 48, 58, 57, 49, 58, 48, - 48, 58, 52, 55, 10, 48, 58, 52, 48, 51, 48, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 52, 48, 48,101, 58, 49, 58,102,101, 58,102,101, 10, 10, - 100, 97,110,103,115,101,101,100, 58, 10, 48, 58, 48, 53, 51,102, 58, 97, - 48, 58, 48, 49, 58, 48, 49, 10, 48, 58, 48, 53, 50, 55, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10,100,115,112,105,114,105,116, 58, 10,100,115,112, - 105,114,105,116, 49, 58, 10,100,115,112,105,114,105,116, 50, 58, 10, 48, - 58, 52, 48, 57, 50, 58, 51, 50, 58, 48, 48, 58, 48, 49, 10, 48, 58, 52, - 48,100, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,103, 97,108, 97,103, - 97, 56, 56, 58, 10,103, 97,108, 97,103, 56, 56, 98, 58, 10,103, 97,108, - 97,103, 97, 56, 56,106, 58, 10,103, 97,108, 97,103, 97, 56, 56, 97, 58, - 10, 48, 58, 52, 97, 48,100, 58, 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 52, 98, 55, 53, 58, 54, 48, 58, 48, 48, 58, 48, 49, 10, 10,113,117,101, - 115,116,101,114, 58, 10, 48, 58, 51, 54, 48, 58, 53, 48, 58, 48, 48, 58, - 54, 48, 10, 48, 58, 49, 51, 48, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, - 114,111,109,112,101,114,115, 58, 10,114,111,109,112,101,114,115,111, 58, - 10, 48, 58, 52, 48, 49, 58, 52,102, 58, 48, 48, 58, 48, 49, 10, 48, 58, - 49, 52, 51, 58, 51, 58, 48, 48, 58, 56, 56, 10, 48, 58, 49, 51, 97, 58, - 56, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 110, 97,109, 99,111,115, 50, 46, 99, 10, 97,115,115, 97,117,108,116, 58, - 10, 97,115,115, 97,117,108,116,106, 58, 10, 97,115,115, 97,117,108,116, - 112, 58, 10, 48, 58, 49, 48, 49, 56, 48, 48, 58, 52,100, 58, 48, 48, 58, - 50, 48, 10, 48, 58, 49, 48, 48, 48, 53, 56, 58, 52, 58, 48, 48, 58, 48, - 48, 10, 10, 99,111,115,109,111,103,110,103, 58, 10, 99,111,115,109,111, - 103,110,103,106, 58, 10, 48, 58, 49, 48, 97, 48, 48, 51, 58,102, 55, 58, - 48, 49, 58, 48,100, 10, 48, 58, 49, 48, 48, 56, 48,101, 58, 51, 99, 58, - 48, 48, 58, 55, 48, 10, 10,114,116,104,117,110, 50, 58, 10,114,116,104, - 117,110, 50,106, 58, 10, 48, 58, 49, 48, 54, 54,101, 56, 58, 54, 52, 58, - 48, 48, 58, 52,102, 10, 48, 58, 49, 48, 48, 48, 50, 48, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, - 99,111,115, 56, 54, 46, 99, 10,104,111,112,109, 97,112,112,121, 58, 10, - 48, 58, 52, 99, 52, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, - 99, 97, 48, 58, 56, 49, 58, 48, 48, 58, 54, 50, 10, 48, 58, 50, 48, 57, - 101, 58, 49, 58, 50,101, 58, 50,101, 10, 48, 58, 50, 48, 97, 48, 58, 49, - 58, 50,101, 58, 50,101, 10, 48, 58, 50, 48, 97, 50, 58, 49, 58, 48, 56, - 58, 48, 56, 10, 48, 58, 50, 48, 97, 52, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 50, 48, 97, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 50, 48, 97, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10,114,116,104,117, - 110,100,101,114, 58, 10,114,116,104,117,110,100,101,114, 49, 58, 10,114, - 116,104,117,110,100,101,114, 50, 58, 10,114,116,104,117,110,100,101,114, - 48, 58, 10,114,116,104,117,110,100,101,114, 97, 58, 10, 48, 58, 53, 52, - 48, 48, 58, 50, 51, 58, 48, 48, 58, 49, 50, 10, 48, 58, 53, 52, 53, 48, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,110,101,109,101,115,105,115, 46, 99, 10, 99,105,116,121, 98,111,109, - 98, 58, 10, 99,105,116,121, 98,111,109, 98,106, 58, 10, 48, 58, 56, 48, - 55, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 50, 10, 48, 58, 56, 48, 48, - 53, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 49, 53, 54, - 58, 50,101, 58, 48, 49, 58, 53, 48, 10, 10,107,111,110, 97,109,105,103, - 116, 58, 10, 48, 58, 54, 48, 49, 48, 53, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 54, 48, 49, 48, 54, 58, 50, 58, 49, 48, 58, 48, 48, 10, 48, - 58, 54, 49, 52, 56, 48, 58, 51, 50, 56, 58, 52, 97, 58, 48, 49, 10, 10, - 103,114, 97,100,105,117,115, 58, 10, 48, 58, 49, 57, 53,102, 48, 58, 56, - 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 55, 48, 48, 57, 56, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 55, 48, 48, 57, 97, 58, 49, 58, 55, 51, - 58, 55, 51, 10, 10, 59, 42, 32,116,111,112, 32,115, 99,111,114,101, 32, - 110,111,116, 32,115, 97,118,101,100, 10,110,121, 97,110,112, 97,110,105, - 58, 10, 48, 58, 52, 50, 56, 48, 48, 58, 50, 56, 58, 48, 48, 58, 49, 48, - 10, 10,115, 97,108, 97,109, 97,110,100, 58, 10,115, 97,108, 97,109, 97, - 110,100,106, 58, 10,108,105,102,101,102,114, 99,101, 58, 10,108,105,102, - 101,102,114, 99,101,106, 58, 10, 48, 58, 48, 56, 53, 48, 48, 48, 58, 54, - 52, 58, 48, 48, 58, 49, 54, 10, 48, 58, 48, 56, 48, 48, 53, 97, 58, 52, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, - 105,110,106, 97,119, 46, 99, 10,100, 97,114,105,117,115, 50, 58, 10, 48, - 58, 99, 50, 49, 54,101, 58, 52, 52, 98, 58, 48, 48, 58, 50, 48, 10, 10, - 100, 97,114,105,117,115, 50,100, 58, 10,100, 97,114,105,117,115, 50,100, - 111, 58, 10,115, 97,103, 97,105, 97, 58, 10, 48, 58, 49, 48, 49, 48,102, - 97, 58, 52, 52, 98, 58, 48, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,110,111,118, 97, 50, 48, 48, 49, 46, 99, 32, 10, 59, 42, + 115,116, 97,114,116, 32, 97, 32,103, 97,109,101, 63, 13, 10, 48, 58, 99, + 50, 48, 56, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,119,111,119, + 58, 32, 59, 42,114,101,115,101,116,116,105,110,103, 32,115, 99,114,101, + 119,115, 32,117,112, 32,116,104,101, 32, 49,115,116, 32,115, 99,111,114, + 101, 13, 10,119,111,119,103, 58, 13, 10, 48, 58,100, 48, 48, 52, 58, 49, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, 51, 48, 52, 58, 49, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,111,109, 97,104, 97,119,107, + 58, 13, 10,116,111,109, 97,104, 97,119,107, 49, 58, 13, 10, 48, 58, 48, + 48, 48,100, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 50, 53, + 49, 58, 50, 53, 58, 51, 99, 58, 51, 99, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 97,115,117,107, 97, 46, 99, 13, 10, 97,115,117,107, + 97, 58, 13, 10, 97,115,117,107, 97,106, 58, 13, 10, 48, 58, 49, 48, 51, + 52, 53, 56, 58, 54, 54, 58, 52, 49, 58, 48, 49, 13, 10, 48, 58, 49, 48, + 51, 51, 99, 52, 58, 52, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10,103, 97, + 108,109,101,100,101,115, 58, 13, 10, 48, 58, 49, 48, 51, 49, 97, 48, 58, + 52, 99, 58, 48, 48, 58, 54, 52, 13, 10, 13, 10,109,111,102,102,108,111, + 116,116, 58, 13, 10, 48, 58, 49, 48, 48, 97, 97,100, 58, 55, 53, 58, 48, + 48, 58, 51, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 97, + 116, 97,114,105,115,121, 50, 46, 99, 13, 10, 97,112, 98, 58, 13, 10, 97, + 112, 98, 53, 58, 13, 10, 97,112, 98, 54, 58, 13, 10, 48, 58,102, 52, 50, + 58, 57, 98, 58, 48, 48, 58, 52,100, 13, 10, 13, 10, 97,112, 98, 50, 58, + 13, 10, 97,112, 98,102, 58, 13, 10, 97,112, 98,103, 58, 13, 10, 97,112, + 98, 49, 58, 13, 10, 97,112, 98, 51, 58, 13, 10, 97,112, 98, 52, 58, 13, + 10, 48, 58,102, 52, 50, 58, 57, 98, 58, 48, 48, 58, 53, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,100,108, 97,110,100,115, + 46, 99, 13, 10, 98, 97,100,108, 97,110,100,115, 58, 13, 10, 48, 58,102, + 102,102,101, 57, 54, 58, 52,102, 58, 48, 48, 58, 57, 97, 13, 10, 13, 10, + 112,105, 99,107,105,110, 58, 13, 10, 48, 58, 55, 49, 57, 97, 58, 53, 48, + 58, 48, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 98, 97,110,107,112, 46, 99, 13, 10, 98, 97,110,107,112, 58, 13, 10, + 48, 58,101, 53, 57, 48, 58, 97, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,101, 48, 49, 56, 58, 55, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 98, 97,116,109, 97,110, 46, 99, 13, 10, + 98, 97,116,109, 97,110, 58, 13, 10, 48, 58, 49, 48,102, 50, 51,101, 58, + 53, 48, 58, 48, 48, 58, 51, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42, 98, 97,116,116,108, 97,110,101, 46, 99, 13, 10, 98, 97,116, + 116,108, 97,110,101, 58, 13, 10, 98, 97,116,116,108, 97,110,101, 50, 58, + 13, 10, 98, 97,116,116,108, 97,110,101, 51, 58, 13, 10, 48, 58, 48, 99, + 97, 53, 58, 50, 56, 58, 48, 48, 58, 49, 97, 13, 10, 48, 58, 48, 48, 53, + 102, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,102,114,101,110,122, + 121, 58, 13, 10, 48, 58, 52, 48, 54,101, 58, 51, 99, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 52, 48, 53,101, 58, 49, 58,102,102, 58,102,102, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,105,111,110,105, 99, + 99, 46, 99, 13, 10, 98,105,111,110,105, 99, 99, 58, 13, 10, 98,105,111, + 110,105, 99, 99, 50, 58, 13, 10,116,111,112,115,101, 99,114,116, 58, 13, + 10, 98,105,111,110,105, 99, 99, 49, 58, 13, 10, 98,105,111,110,105, 99, + 99, 98,108, 58, 13, 10, 48, 58,102,102,102, 57,101, 50, 58, 52,102, 58, + 48, 48, 58, 52,100, 13, 10, 48, 58,102,102, 99, 53, 55, 97, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,101, 99, 48,100, 57, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58,102,101, 99, 48,100, 98, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58,102,101, 99, 48,100,100, 58, 49, 58, + 50, 48, 58, 50, 48, 13, 10, 48, 58,102,101, 99, 48,100,102, 58, 49, 58, + 48, 50, 58, 48, 50, 13, 10, 48, 58,102,101, 99, 48,101, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,101, 99, 48,101, 51, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,101, 99, 48,101, 53, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,101, 99, 48,101, 55, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59,109, 97, 99,114,111,115,115, 58, + 32, 32, 42, 42, 42, 32,110,111,116, 32,119,111,114,107,105,110,103, 32, + 42, 42, 42, 13, 10, 59, 48, 58,102, 57, 49, 48, 48, 58, 97, 48, 58, 48, + 48, 58, 52, 53, 13, 10, 59, 48, 58,102, 57, 48,102, 54, 58, 49, 58, 48, + 49, 58, 48, 49, 13, 10, 13, 10, 98,108,107,100,114,103,111,110, 58, 13, + 10, 98,108,107,100,114,103,110, 98, 58, 13, 10, 48, 58,101, 50, 48, 48, + 58, 53, 48, 58, 48, 48, 58, 50, 54, 13, 10, 48, 58,101, 49,101, 48, 58, + 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 98,108,111, 99,107,111,117,116, 46, 99, 13, 10, 98,108,111, 99, + 107,111,117,116, 58, 13, 10, 48, 58, 49,100, 53,102, 97, 52, 58, 55, 56, + 58, 51, 50, 58, 48, 53, 13, 10, 48, 58, 49,100, 53,101, 99,101, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 98,108,111, 99,107,111,117,116, + 50, 58, 13, 10, 98,108,111, 99,107,111,117,116,106, 58, 13, 10, 48, 58, + 49,100, 53,102, 97, 50, 58, 55, 56, 58, 51, 50, 58, 48, 53, 13, 10, 48, + 58, 49,100, 53,101, 99,101, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,108,115,116,114,111,105,100, + 46, 99, 13, 10, 98,108,115,116,114,111,105,100, 58, 13, 10, 98,108,115, + 116,114,111,105,100, 50, 58, 13, 10, 98,108,115,116,114,111,105,100,104, + 58, 13, 10, 98,108,115,116,114,111,105,100,103, 58, 13, 10, 98,108,115, + 116,114,111,105,100, 51, 58, 13, 10, 48, 58,102,102,102,102, 52, 50, 58, + 51, 50, 58, 48, 54, 58, 49, 54, 13, 10, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42, 98,108,117,101,112,114,110,116, 46, 99, 13, 10, 98, + 108,117,101,112,114,110,116, 58, 13, 10, 98,108,117,101,112,114,110,116, + 106, 58, 13, 10, 48, 58, 56, 49, 48, 48, 58, 51,101, 58, 48, 48, 58, 57, + 48, 13, 10, 13, 10,115, 97,116,117,114,110,122,105, 58, 13, 10, 48, 58, + 56, 51, 56, 48, 58, 50, 56, 58, 48, 48, 58, 50,100, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42, 98,111,109, 98,106, 97, 99,107, 46, 99, + 13, 10, 98,111,109, 98,106, 97, 99,107, 58, 13, 10, 98,111,109, 98,106, + 97, 99,107, 50, 58, 13, 10, 98,111,109, 98,106, 97, 99,107,116, 58, 13, + 10, 48, 58, 57, 48, 53,102, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, + 58, 57, 48, 55,102, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 57, + 48, 57,102, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 57, 48, 98, + 102, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 57, 48,100,101, 58, + 51, 58, 53, 51, 58, 50, 52, 13, 10, 48, 58, 57, 48,102,101, 58, 51, 58, + 50,100, 58, 50, 52, 13, 10, 48, 58, 57, 49, 49,102, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 57, 49, 51,102, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 56, 48,101, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 56, 49, 48, 48, 58, 57, 54, 58, 48, 48, 58,102,102, 13, 10, + 13, 10,100, 97,114,119,105,110, 58, 13, 10, 48, 58, 49, 98, 57, 51, 58, + 57, 58, 56, 98, 58, 56, 57, 13, 10, 48, 58, 49, 98, 54, 99, 58, 49, 48, + 58, 48, 48, 58, 55, 48, 13, 10, 13, 10, 98,116,105,109,101, 58, 13, 10, + 98,116,105,109,101, 50, 58, 13, 10, 98,116,105,109,101,109, 58, 13, 10, + 98,116,105,109,101, 51, 58, 13, 10, 48, 58, 48, 48, 51, 51, 58, 50, 55, + 58, 48, 48, 58, 70, 70, 13, 10, 13, 10, 99,111,111,107,114, 97, 99,101, + 58, 13, 10, 48, 58, 48, 48, 51, 50, 58, 50, 52, 58, 48, 48, 58, 49, 56, + 13, 10, 13, 10,114,105,110,103,107,105,110,103, 51, 58, 13, 10, 49, 58, + 56, 48, 52, 56, 58, 56, 67, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58, 67, + 50, 51, 52, 58, 48, 52, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10,108,110, + 99, 58, 13, 10, 48, 58, 48, 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 48, 50, 57, 52, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 48, 50, 97, 54, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 51, 67, 52, 68, 58, 54, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,109,109, + 111,110,107,101,121, 58, 13, 10, 48, 58,100,102, 58,102, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 51, 50, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, + 48, 58, 51, 49, 48, 58,102, 58, 50,101, 58, 50,102, 13, 10, 48, 58, 51, + 99, 52, 97, 58, 54, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10,122,111, 97, + 114, 58, 13, 10, 48, 58, 48, 50,100,100, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 48, 50,101, 53, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 48, 51, 52, 98, 58, 51, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, + 48, 51, 53, 54, 58, 51, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 48, 51, + 54, 49, 58, 51, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 48, 51, 54, 99, + 58, 51, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 48, 51, 55, 55, 58, 51, + 58, 50, 48, 58, 50, 48, 13, 10, 13, 10,115,112, 97, 99,100,117,101,108, + 58, 13, 10,115,112, 97, 99,100,117,101,108, 48, 58, 13, 10,115,112, 97, + 99,100,117,101,108, 49, 58, 13, 10, 48, 58,100,100, 58, 51, 99, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 49, 49, 57, 58, 52, 98, 58, 48, 48, 58, + 49, 99, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 98,122,111, + 110,101, 46, 99, 13, 10, 98,122,111,110,101, 58, 13, 10, 98,122,111,110, + 101, 97, 58, 13, 10, 98,122,111,110,101, 50, 58, 13, 10, 98,122,111,110, + 101, 99, 58, 13, 10, 48, 58, 48, 51, 48, 48, 58, 51, 99, 58, 48, 53, 58, + 51, 56, 13, 10, 13, 10, 59, 42,110,111,116,101, 32,116,111,112, 32,115, + 99,111,114,101, 32,117,112,100, 97,116,101,115, 32, 97,102,116,101,114, + 32, 97, 32,102,101,119, 32,115,101, 99,111,110,100,115, 13, 10,114,101, + 100, 98, 97,114,111,110, 58, 13, 10,114,101,100, 98, 97,114,111,110, 97, + 58, 13, 10, 48, 58, 49, 53, 53, 58, 50, 51, 58, 48, 58, 48, 13, 10, 48, + 58, 49, 55, 56, 58, 49, 58,100, 52, 58,100, 52, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 99, 97,100, 97,115,104, 46, 99, 13, 10, 99, + 97,100, 97,115,104, 58, 13, 10, 99, 97,100, 97,115,104,117, 58, 13, 10, + 99, 97,100, 97,115,104,105, 58, 13, 10, 99, 97,100, 97,115,104,102, 58, + 13, 10, 99, 97,100, 97,115,104,103, 58, 13, 10, 48, 58, 49, 48, 51, 54, + 52, 54, 58, 49, 56, 53, 58, 48, 48, 58, 52,100, 13, 10, 13, 10, 99, 97, + 100, 97,115,104,106, 58, 13, 10, 99, 97,100, 97,115,104,106, 49, 58, 13, + 10, 99, 97,100, 97,115,104,106,111, 58, 13, 10, 48, 58, 49, 48, 51, 54, + 52, 54, 58, 49, 56, 97, 58, 48, 48, 58, 54, 53, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42, 99, 97,110,121,111,110, 46, 99, 13, 10, 99, + 97,110,121,111,110, 58, 13, 10, 99, 97,110,121,111,110,112, 58, 13, 10, + 48, 58, 48, 48, 51, 55, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 117,111,112,111,107,111, 58, 13, 10,117,111,112,111,107,111,106, 58, 13, + 10, 48, 58, 49, 48, 48, 48, 51, 56, 58, 54,101, 58, 48, 48, 58, 50, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, 99,104, 97,115, + 109, 46, 99, 13, 10, 99, 99,104, 97,115,109, 58, 13, 10, 99, 99,104, 97, + 115,109, 49, 58, 13, 10, 48, 58,102,102,102, 52, 98, 56, 58, 55, 56, 58, + 55, 50, 58, 49, 48, 13, 10, 13, 10, 99, 99,108,105,109, 98,101,114, 58, + 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32, + 116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, + 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, + 13, 10, 99, 99,108,105,109, 98,101,114,106, 58, 13, 10, 99, 99, 98,111, + 111,116, 58, 13, 10, 99, 99,108,105,109, 98,114,111,112,101,114, 58, 13, + 10, 99, 99,108,105,109, 98,114,114,111,100, 58, 13, 10, 48, 58, 56, 48, + 56, 51, 58, 48, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 57, + 53, 58, 48, 97, 58, 51, 48, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56, 54, + 58, 48, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 97, 51, 58, + 48, 97, 58, 51, 48, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56, 57, 58, 48, + 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 98, 49, 58, 48, 97, + 58, 51, 48, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56, 99, 58, 48, 51, 58, + 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 98,102, 58, 48, 97, 58, 51, + 48, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56,102, 58, 48, 51, 58, 48, 50, + 58, 48, 48, 13, 10, 48, 58, 56, 48, 99,100, 58, 48, 97, 58, 51, 48, 58, + 53, 50, 13, 10, 13, 10, 99, 99, 98,111,111,116, 50, 58, 13, 10, 48, 58, + 56, 48, 56, 51, 58, 48, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, + 48, 57, 53, 58, 48, 97, 58, 49, 53, 58, 53, 50, 13, 10, 48, 58, 56, 48, + 56, 54, 58, 48, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 97, + 51, 58, 48, 97, 58, 49, 53, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56, 57, + 58, 48, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 98, 49, 58, + 48, 97, 58, 49, 53, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56, 99, 58, 48, + 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 98,102, 58, 48, 97, + 58, 49, 53, 58, 53, 50, 13, 10, 48, 58, 56, 48, 56,102, 58, 48, 51, 58, + 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 48, 99,100, 58, 48, 97, 58, 49, + 53, 58, 53, 50, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, + 105,110,101,109, 97,116, 46, 99, 13, 10, 97,114,109,111,114, 97, 58, 13, + 10, 97,114,109,111,114, 97,112, 58, 13, 10, 97,114,109,111,114, 97,114, + 58, 13, 10, 48, 58, 97, 50, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59,115,116, 97,114, 99, 97,115, 58, 13, 10, 59,115,116, 97,114, 99, + 97,115, 49, 58, 13, 10, 59,115,116, 97,114, 99, 97,115,101, 58, 13, 10, + 59,115,116, 97,114, 99, 97,115,112, 58, 13, 10, 59,115,116,101,108,108, + 99, 97,115, 58, 13, 10, 59, 48, 58, 49, 97, 97, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 99,114, 97,115,104, 58, 13, 10,115,109, 97,115, + 104, 58, 13, 10, 48, 58, 48, 48, 48,102, 58, 50, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,105,115, 99,104, + 101, 97,116, 46, 99, 32, 40, 99,105,115, 99,111, 32,104,101, 97,116, 41, + 13, 10, 99,105,115, 99,104,101, 97,116, 58, 13, 10, 48, 58,102, 48, 99, + 48, 48, 58, 50, 52,102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 48, + 101, 52, 50, 58, 49, 58, 52, 57, 58, 52, 57, 13, 10, 48, 58,102, 48, 98, + 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,102, 49,103, + 112,115,116, 97,114, 58, 13, 10, 48, 58,102, 50, 56, 48, 51, 58, 53,101, + 51, 58, 48, 52, 58, 52,100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 99,105,116,121, 99,111,110, 46, 99, 13, 10, 99,105,116,121, 99, + 111,110, 58, 13, 10, 99,105,116,121, 99,111,110, 97, 58, 13, 10, 99,114, + 117,105,115,105,110, 58, 13, 10, 48, 58, 48, 48, 53, 53, 58, 51, 58, 48, + 48, 58, 49, 51, 13, 10, 48, 58, 48, 48, 52, 51, 58, 51, 58, 48, 48, 58, + 48, 50, 13, 10, 48, 58, 48, 57, 48, 48, 58,102, 48, 58, 53, 51, 58, 57, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 99,110,105,110,106, 97, + 46, 99, 13, 10, 99,110,105,110,106, 97, 58, 13, 10, 99,110,105,110,106, + 97,117, 58, 13, 10,106,111,101,109, 97, 99, 58, 13, 10, 48, 58, 49, 56, + 55, 55,102, 98, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 49, 56, + 55, 55,102, 97, 58, 97,101, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 99, + 110,105,110,106, 97, 49, 58, 13, 10,115,116,111,110,101, 97,103,101, 58, + 13, 10, 99,110,105,110,106, 97, 98,108, 58, 13, 10, 99,110,105,110,106, + 97, 97, 58, 13, 10, 48, 58, 49, 56, 55, 55,102, 55, 58, 49, 58, 51, 48, + 58, 51, 48, 13, 10, 48, 58, 49, 56, 55, 55,102, 54, 58, 97,101, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, + 111,109, 98, 97,116,115, 99, 46, 99, 13, 10, 99,111,109, 98, 97,116,115, + 99, 58, 13, 10, 99,111,109, 98, 97,116,115, 99, 98, 58, 13, 10, 99,111, + 109, 98, 97,116,115, 99,106, 58, 13, 10, 99,111,109, 98, 97,116,115, 99, + 116, 58, 13, 10, 48, 58, 49, 51, 50, 48, 58, 52, 54, 58, 48, 50, 58, 48, + 55, 13, 10, 48, 58, 56, 50, 54, 58, 51, 58, 48, 48, 58, 49, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,111,109,109, 97,110,100, + 111, 46, 99, 13, 10, 99,111,109,109, 97,110,100,111, 58, 13, 10, 99,111, + 109,109, 97,110,100,111,117, 58, 13, 10, 99,111,109,109, 97,110,100,111, + 106, 58, 13, 10,115,105,110,118, 97,115,110, 58, 13, 10,115,105,110,118, + 97,115,110, 98, 58, 13, 10, 99,111,109,109, 97,110,100,111, 98, 58, 13, + 10, 99,111,109,109, 97,110,100,111, 98, 50, 58, 13, 10, 99,111,109,109, + 97,110,100,111,117, 50, 58, 13, 10,109,101,114, 99,101,110, 97,114,105, + 111, 58, 13, 10, 48, 58,101,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50, + 101, 13, 10, 48, 58,101,101, 57, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,111,110,103,111, 46, + 99, 13, 10, 99,111,110,103,111, 58, 13, 10,116,105,112,116,111,112, 58, + 13, 10, 99,111,110,103,111, 97, 58, 13, 10, 48, 58, 56, 48, 50, 48, 58, + 55,101, 58, 57, 48, 58, 97, 49, 13, 10, 48, 58, 56, 48, 98,100, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42, 99,111,110,116,114, 97, 46, 99, 13, 10, 99,111,110,116,114, 97, 58, + 13, 10, 99,111,110,116,114, 97, 98, 58, 13, 10, 99,111,110,116,114, 97, + 106, 58, 13, 10, 99,111,110,116,114, 97,106, 98, 58, 13, 10,103,114,121, + 122,111,114, 58, 13, 10, 99,111,110,116,114, 97, 98,106, 49, 58, 13, 10, + 103,114,121,122,111,114, 49, 58, 13, 10,103,114,121,122,111,114, 97, 58, + 13, 10, 99,111,110,116,114, 97, 49, 58, 13, 10, 99,111,110,116,114, 97, + 98,106, 58, 13, 10, 99,111,110,116,114, 97,106, 49, 58, 13, 10, 99,111, + 110,116,114, 97,101, 58, 13, 10, 48, 58, 49, 49, 50, 48, 58, 52, 48, 58, + 49, 98, 58, 48, 48, 13, 10, 48, 58, 49, 49, 49, 56, 58, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,111, + 112, 48, 49, 46, 99, 13, 10, 99,111,112, 48, 49, 58, 13, 10, 48, 58, 99, + 52, 54,100, 58, 50, 56, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, 99,111, + 112, 48, 49, 97, 58, 13, 10, 48, 58, 99, 52, 54,101, 58, 50, 56, 58, 48, + 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99, + 111,115,109,105, 99, 46, 99, 13, 10, 99,111,115,109,105, 99, 97, 58, 13, + 10, 99,111,115,109,105, 99, 97, 50, 58, 13, 10, 99,111,115,109,105, 99, + 97, 49, 58, 13, 10, 48, 58, 52, 48, 48,101, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,112, 97,110,105, 99, 58, 13, 10,112, 97,110,105, 99, + 104, 58, 13, 10,112, 97,110,105, 99,103,101,114, 58, 13, 10,112, 97,110, + 105, 99, 50, 58, 13, 10,112, 97,110,105, 99, 51, 58, 13, 10, 48, 58, 52, + 48, 99, 49, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 99, 48, + 48, 58, 99, 58, 48, 57, 58, 49, 53, 13, 10, 48, 58, 52, 48, 48, 52, 58, + 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42, 99,112,115, 49, 46, 99, 13, 10, 49, 57, 52, 49, 58, 13, 10, 49, + 57, 52, 49,106, 58, 13, 10, 49, 57, 52, 49,117, 58, 13, 10, 49, 57, 52, + 49,114, 58, 13, 10, 49, 57, 52, 49,114, 49, 58, 13, 10, 48, 58,102,102, + 57, 54, 56, 48, 58, 55, 56, 58,102,102, 58, 48, 48, 13, 10, 48, 58,102, + 102, 48,100, 57, 56, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 99,119,111,114,108,100, 50,106, 58, 13, 10, 48, 58,102,102, 48,102, 54, + 56, 58, 48, 52, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,102,102, 48,102, + 54, 99, 58, 57, 99, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100,105,110, + 111, 58, 13, 10,100,105,110,111,106, 58, 13, 10,100,105,110,111,117, 58, + 13, 10,100,105,110,111,104,117,110,116, 58, 13, 10, 48, 58,102,102,102, + 48, 51,101, 58, 51, 49, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, + 102,102, 51, 52,101, 58, 48, 49, 48, 58, 57, 57, 58, 48, 48, 13, 10, 13, + 10,103,104,111,117,108,115, 58, 13, 10,103,104,111,117,108,115,117, 58, + 13, 10,100, 97,105,109, 97,107, 97,105,114, 58, 13, 10,100, 97,105,109, + 97,107, 97,105, 58, 13, 10, 48, 58,102,102, 98,102, 52, 99, 58, 55, 56, + 58, 52, 56, 58, 97, 56, 13, 10, 48, 58,102,102, 48, 56, 55, 97, 58, 48, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109, 98,111,109, 98,114,100, + 58, 13, 10,109, 98,111,109, 98,114,100,106, 58, 13, 10, 48, 58,102,102, + 97, 48, 99, 99, 58, 48, 50, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58,102, + 102, 97, 48, 99,101, 58, 97,101, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 109,101,103, 97,109, 97,110, 97, 58, 13, 10,109,101,103, 97,109, 97,110, + 58, 13, 10,114,111, 99,107,109, 97,110,106, 58, 13, 10,109,109, 97,110, + 99,112, 50,117, 58, 13, 10,114,109, 97,110, 99,112, 50,106, 58, 13, 10, + 109,109, 97,110, 99,112, 50,117,114, 49, 58, 13, 10, 48, 58,102,102,101, + 101,100, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, + 101,102, 49, 48, 58, 50, 56, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10,109, + 101,114, 99,115, 58, 13, 10,109,101,114, 99,115,117,114, 49, 58, 13, 10, + 109,101,114, 99,115,106, 58, 13, 10,109,101,114, 99,115,117, 97, 58, 13, + 10, 48, 58,102,102, 48,102,100, 48, 58, 97, 48, 58, 48, 48, 58, 50, 48, + 13, 10, 13, 10,109,115,119,111,114,100, 58, 13, 10,109,115,119,111,114, + 100,117, 58, 13, 10,109,115,119,111,114,100,106, 58, 13, 10,109,115,119, + 111,114,100,114, 49, 58, 13, 10, 48, 58,102,102,102,101, 51, 50, 58, 57, + 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102,102,101, 99, 97, 58, + 48, 50, 58, 48, 52, 58, 48, 48, 13, 10, 48, 58,102,102, 97, 56, 57, 48, + 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,110,101,109,111, 58, + 13, 10,110,101,109,111,106, 58, 13, 10,110,101,109,111,114, 49, 58, 13, + 10, 48, 58,102,102,102, 48, 48, 52, 58, 50, 56, 58, 48, 48, 58, 50, 48, + 13, 10, 48, 58,102,102,102, 48, 53, 52, 58, 49, 52, 58,102,102, 58, 50, + 52, 13, 10, 48, 58,102,102,102, 48, 55, 99, 58, 48, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,112, 97,110,103, 51, 58, 13, 10,112, 97,110,103, + 51,106, 58, 13, 10,112, 97,110,103, 51, 98, 58, 13, 10,112, 97,110,103, + 51,114, 49, 58, 13, 10, 48, 58,102,102, 57, 55, 50, 54, 58, 56, 99, 58, + 48, 48, 58, 48, 57, 13, 10, 13, 10,112,110,105, 99,107,106, 58, 13, 10, + 48, 58,102,102, 50, 53, 55, 52, 58, 50, 56, 58, 48, 51, 58, 48, 48, 13, + 10, 48, 58,102,102, 50, 53, 57,101, 58, 53, 48, 58, 48, 51, 58, 48, 48, + 13, 10, 48, 58,102,102, 56, 53, 51, 52, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,112,117,110,105,115,104,101,114, 58, 13, 10,112,117, + 110,105,115,104,101,114,117, 58, 13, 10,112,117,110,105,115,104,101,114, + 106, 58, 13, 10,112,117,110,105,115,104,101,114, 98,122, 58, 13, 10,112, + 117,110,105,115,104,101,114,104, 58, 13, 10, 48, 58,102,102, 55, 56, 57, + 54, 58, 50, 53, 56, 58,102,102, 58, 48, 49, 13, 10, 48, 58,102,102, 53, + 98, 57, 50, 58, 48, 48, 52, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10,113, + 97,100, 58, 13, 10, 48, 58,102,102,101, 57, 54,101, 58, 51, 99, 58, 48, + 48, 58, 55, 48, 13, 10, 13, 10,113, 97,100,106,114, 58, 13, 10, 48, 58, + 102,102, 52, 98, 97, 57, 58, 53,102, 58,100, 99, 58, 48, 50, 13, 10,113, + 116,111,110,111, 50,106, 58, 13, 10, 48, 58,102,102, 53, 48,102,101, 58, + 54, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 53, 49, 57,101, + 58, 54, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 53, 49,102, + 101, 58, 48, 52, 58, 48, 54, 58, 48, 48, 13, 10, 13, 10,115,102, 50, 58, + 13, 10,115,102, 50, 97, 58, 13, 10,115,102, 50, 98, 58, 13, 10,115,102, + 50,101, 58, 13, 10,115,102, 50,106, 58, 13, 10,115,102, 50,106, 98, 58, + 13, 10,115,102, 50,117, 97, 58, 13, 10,115,102, 50,117, 98, 58, 13, 10, + 115,102, 50,117,101, 58, 13, 10,115,102, 50,106, 97, 58, 13, 10,115,102, + 50,101, 98, 98,108, 58, 13, 10,115,102, 50,106, 99, 58, 13, 10,115,102, + 50,113,112, 49, 58, 13, 10,115,102, 50,117,102, 58, 13, 10,115,102, 50, + 117,105, 58, 13, 10,115,102, 50,117,107, 58, 13, 10,115,102, 50,101, 98, + 58, 13, 10,115,102, 50,116,104,110,100,114, 58, 13, 10,115,102, 50,101, + 101, 58, 13, 10,115,102, 50,117, 99, 58, 13, 10,115,102, 50,117,103, 58, + 13, 10,115,102, 50,115,116,116, 58, 13, 10,115,102, 50,114,107, 58, 13, + 10,115,102, 50,106,102, 58, 13, 10,115,102, 50,106,104, 58, 13, 10,115, + 102, 50,106,108, 58, 13, 10,115,102, 50,101,100, 58, 13, 10,115,102, 50, + 101, 98, 98,108, 50, 58, 13, 10,115,102, 50,101, 98, 98,108, 51, 58, 13, + 10, 48, 58,102,102,100, 50, 56, 97, 58, 51, 48, 58, 48, 48, 58, 50, 48, + 13, 10, 48, 58,102,102,100, 51, 48, 50, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,115,102, 50, 97, 99, 99,112, 50, 58, 13, 10, 48, 58, + 102,102,100, 50, 55, 54, 58, 50, 55, 58, 48, 48, 58, 52, 98, 13, 10, 48, + 58,102,102,100, 50,101,101, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,115,102, 50,114,101,100, 58, 13, 10, 48, 58,102,102,100, 50, 55, 54, + 58, 50, 56, 58, 48, 50, 58, 50, 48, 13, 10, 48, 58,102,102,100, 50,101, + 101, 58, 48, 52, 58, 48, 50, 58, 53, 51, 13, 10, 13, 10,115,108, 97,109, + 109, 97,115,116, 58, 13, 10,109, 98,111,109, 98,101,114,106, 58, 13, 10, + 48, 58,102,102, 97, 49, 51, 56, 58, 48, 50, 58, 48, 48, 58, 49, 48, 13, + 10, 48, 58,102,102, 97, 49, 51, 97, 58, 97,101, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,117,110,115,113,117, 97,100, 58, 32, 32, 59, 42, 42, 42, + 42, 42, 42,117, 46,110, 46, 32,115,113,117, 97,100,114,101,110, 13, 10, + 97,114,101, 97, 56, 56, 58, 13, 10, 97,114,101, 97, 56, 56,114, 58, 13, + 10, 48, 58,102,102, 49, 48, 49, 99, 58, 53, 48, 58, 48, 48, 58, 50, 54, + 13, 10, 48, 58,102,102, 49, 48, 55, 99, 58, 48, 56, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 99,114, 98, 97, + 108,111,111,110, 46, 99, 13, 10, 99,114, 98, 97,108,111,111,110, 58, 13, + 10, 99,114, 98, 97,108,111,111,110, 50, 58, 13, 10, 48, 58, 52, 48, 49, + 54, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 49, 55,102, + 58, 48, 97, 58, 49, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42, 99,114,105,109,102,103,104,116, 46, 99, 13, 10, 99,114, + 105,109,102,103,104,116, 58, 13, 10, 99,114,105,109,102,103,104,116,117, + 58, 13, 10, 99,114,105,109,102,103,116,106, 58, 13, 10, 99,114,105,109, + 102,103,104,116, 50, 58, 13, 10, 48, 58, 49, 97, 52, 48, 58, 52, 54, 58, + 48, 48, 58, 49, 57, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 99,118,115, 46, 99, 13, 10, 99,111,115,109,111,115, 58, 13, 10, 48, 58, + 51, 99, 48, 48, 58, 53, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,104, + 101,114,111, 58, 13, 10, 48, 58, 51, 99, 48, 48, 58, 50, 55, 58, 48, 48, + 58, 51, 48, 13, 10, 13, 10,104,101,114,111,100,107,117, 58, 13, 10,104, + 101,114,111,100,107, 58, 13, 10, 48, 58, 51, 99, 52, 52, 58, 53, 48, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 99, 57, 52, 58, 49, 58, 50, 51, + 58, 50, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100, 97, + 114,105,117,115, 46, 99, 13, 10,100, 97,114,105,117,115, 58, 13, 10,100, + 97,114,105,117,115,101, 58, 13, 10,100, 97,114,105,117,115,117, 58, 13, + 10, 48, 58, 56, 50, 50,102, 50, 58, 55, 50, 57, 58, 48, 48, 58, 50,101, + 13, 10, 13, 10,100, 97,114,105,117,115,111, 58, 13, 10,100, 97,114,105, + 117,115,106, 58, 13, 10, 48, 58, 56, 50, 50,101, 99, 58, 55, 50, 57, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 50, 54, 54, 54, 58, 49, 58, 52, + 49, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100, + 97,114,107,115,101, 97,108, 46, 99, 13, 10,100, 97,114,107,115,101, 97, + 108, 58, 13, 10,103, 97,116,101,100,111,111,109, 58, 13, 10,103, 97,116, + 101,100,111,111,109, 49, 58, 13, 10,100, 97,114,107,115,101, 97,108,106, + 58, 13, 10,100, 97,114,107,115,101, 97,108, 49, 58, 13, 10, 48, 58, 49, + 48, 51,101, 48, 48, 58, 51, 55, 58, 48, 48, 58, 52,100, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,100,100, 97,121, 46, 99, 13, 10,100, + 100, 97,121, 58, 13, 10,100,100, 97,121, 99, 58, 13, 10, 48, 58, 54, 50, + 51, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 51, 55, 57, + 58, 53, 58, 50, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,100,100,114,105, 98,108,101, 46, 99, 13, 10,100,100,114,105, + 98, 98,108,101, 58, 13, 10,100,100,114,105, 98, 98,108,101,112, 58, 13, + 10, 48, 58, 52, 56, 48, 48, 58, 55, 48, 58, 49,100, 58, 48, 51, 13, 10, + 13, 10, 98, 97,100,100,117,100,101,115, 58, 32, 59, 91, 83,112,101, 99, + 105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97, + 110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32, + 116,104,105,115, 32,101,110,116,114,121, 93, 13, 10, 48, 58,102,102, 97, + 56,102,101, 58, 97, 48, 58, 52,100, 58, 48, 49, 13, 10, 48, 58,102,102, + 56, 49,100, 52, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100, + 114,103,110,105,110,106, 97, 58, 13, 10,100,114,103,110,105,110,106, 97, + 98, 58, 13, 10, 48, 58,102,102, 97, 56,102, 56, 58, 97, 48, 58, 52,100, + 58, 48, 49, 13, 10, 48, 58,102,102, 56, 49,100, 52, 58, 48, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,100,114,103,110,105,110,106, 97, 98, 50, + 58, 13, 10, 48, 58,102,102, 97, 56,102, 56, 58, 97, 56, 58, 52,100, 58, + 48, 49, 13, 10, 48, 58,102,102, 56, 49,100, 52, 58, 48, 52, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10,104, 98, 97,114,114,101,108, 58, 13, 10, 48, + 58,102,102, 98,101, 57, 99, 58, 53, 56, 58, 48, 48, 58, 50, 54, 13, 10, + 13, 10,104, 98, 97,114,114,101,108,119, 58, 13, 10, 48, 58,102,102, 98, + 101, 55, 56, 58, 53, 56, 58, 48, 48, 58, 50, 54, 13, 10, 13, 10,104,105, + 112,112,111,100,114,109, 58, 13, 10,102,102, 97,110,116, 97,115,121, 58, + 13, 10,102,102, 97,110,116, 97,115,121, 97, 58, 13, 10, 48, 58,102,102, + 98,101, 48, 48, 58, 53, 48, 58, 48, 56, 58, 48, 49, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,100,101, 99, 56, 46, 99, 13, 10, 98,114, + 101,121,119,111,111,100, 58, 13, 10, 48, 58, 48, 49, 48, 56, 58, 50, 56, + 58, 51, 49, 58, 48, 48, 13, 10, 48, 58, 48, 48, 54,100, 58, 51, 58, 48, + 52, 58, 48, 48, 13, 10, 13, 10, 99,111, 98,114, 97, 99,111,109, 58, 13, + 10, 99,111, 98,114, 97, 99,109,106, 58, 13, 10, 48, 58, 48, 54, 99, 54, + 58, 49,101, 58, 48, 48, 58, 53, 52, 13, 10, 48, 58, 48, 49, 51, 53, 58, + 51, 58, 48, 48, 58, 55, 54, 13, 10, 13, 10, 99,115,105,108,118,101,114, + 58, 13, 10, 99,115,105,108,118,101,114,106, 58, 13, 10, 48, 58, 99, 55, + 97, 58, 49, 58, 48,102, 58, 48,102, 13, 10, 48, 58, 48,101, 51, 99, 58, + 51, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 48, 48, 57, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103, 97,114,121,111,114,101,116, + 58, 13, 10, 48, 58, 49, 51, 53,102, 58, 50, 56, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 49, 51, 56, 98, 58, 49,101, 58, 49, 51, 58, 49, 99, 13, + 10, 13, 10,103,104,111,115,116, 98, 58, 13, 10,103,104,111,115,116, 98, + 50, 97, 58, 13, 10, 48, 58, 48, 49, 99, 48, 58, 55, 54, 58, 48, 49, 58, + 49, 48, 13, 10, 13, 10,103,104,111,115,116, 98, 51, 58, 13, 10, 48, 58, + 48,100, 97, 48, 58, 55, 54, 58, 48, 49, 58, 49, 48, 13, 10, 13, 10,103, + 111,110,100,111, 58, 13, 10, 48, 58, 49, 53, 51, 50, 58, 52, 56, 58, 50, + 49, 58, 48, 48, 13, 10, 13, 10,108, 97,115,116,109,105,115,110,106, 58, + 13, 10,108, 97,115,116,109,105,115,110, 58, 13, 10,108, 97,115,116,109, + 105,115,110,111, 58, 13, 10, 48, 58, 48, 57, 97, 97, 58, 51, 99, 58, 48, + 48, 58, 52, 52, 13, 10, 48, 58, 48, 48, 48, 54, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,109, 97,107,121,111,115,101,110, 58, 13, 10, 48, + 58, 49, 52,102, 57, 58, 52, 56, 58, 50, 49, 58, 48, 48, 13, 10, 13, 10, + 111,115, 99, 97,114, 58, 13, 10,111,115, 99, 97,114,106, 49, 58, 13, 10, + 111,115, 99, 97,114,106, 50, 58, 13, 10,111,115, 99, 97,114,117, 58, 13, + 10, 48, 58, 48, 55, 53, 97, 58, 52, 54, 58, 48, 48, 58, 51, 51, 13, 10, + 48, 58, 48, 48, 48, 54, 58, 51, 58, 48, 48, 58, 48, 57, 13, 10, 13, 10, + 115,104, 97, 99,107,108,101,100, 58, 13, 10, 48, 58, 48, 49, 48, 56, 58, + 50, 56, 58, 51, 49, 58, 48, 48, 13, 10, 48, 58, 48, 48, 54, 98, 58, 51, + 58, 48, 52, 58, 48, 48, 13, 10, 13, 10,115,114,100, 97,114,119,105,110, + 58, 13, 10,115,114,100, 97,114,119,105,110,106, 58, 13, 10, 48, 58, 49, + 51, 52, 50, 58, 52, 54, 58, 48, 48, 58, 52,100, 13, 10, 48, 58, 49, 51, + 51, 50, 58, 51, 58, 48, 53, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,100,101,110,105, 97,109, 46, 99, 13, 10,108,111,103, + 105, 99,112,114,111, 58, 13, 10, 99,114,111,113,117,105,115, 58, 13, 10, + 48, 58,102,102, 48, 54, 53, 56, 58, 50, 56, 58, 53, 51, 58, 48, 48, 13, + 10, 13, 10,108,111,103,105, 99,112,114, 50, 58, 13, 10, 48, 58,102,102, + 55, 48,101, 54, 58, 52, 54, 58, 48, 97, 58,100, 48, 13, 10, 13, 10,114, + 97,100, 97,114,115, 99,112, 58, 13, 10,114, 97,100, 97,114,115, 99,112, + 49, 58, 13, 10, 48, 58, 54, 51, 48, 55, 58, 97, 50, 58, 48, 48, 58,102, + 99, 13, 10, 48, 58, 54, 48, 97, 56, 58, 51, 58, 53, 48, 58, 48, 48, 13, + 10, 48, 58, 55, 54, 52, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 55, 54, 50, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55, + 54, 48, 49, 58, 49, 58, 48, 55, 58, 48, 55, 13, 10, 48, 58, 55, 53,101, + 49, 58, 49, 58, 48, 54, 58, 48, 54, 13, 10, 48, 58, 55, 53, 99, 49, 58, + 49, 58, 48, 53, 58, 48, 53, 13, 10, 48, 58, 55, 53, 97, 49, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 100,111, 99, 97,115,116,108,101, 46, 99, 13, 10, 98,108,117,101,104, 97, + 119,107, 58, 13, 10, 98,108,117,101,104, 97,119,107,110, 58, 13, 10, 48, + 58,102, 48, 98, 54, 58, 51, 50, 58, 48, 51, 58, 48, 54, 13, 10, 13, 10, + 100,111, 99, 97,115,116,108,101, 58, 13, 10,100,111, 99, 97,115,116,108, + 101, 50, 58, 13, 10,100,111,117,110,105, 58, 13, 10,100,111, 99, 97,115, + 116,108,101,111, 58, 13, 10, 48, 58, 56, 48, 50, 48, 58, 53, 48, 58, 48, + 49, 58, 48, 48, 13, 10, 13, 10,100,111,119,105,108,100, 58, 13, 10,106, + 106, 97, 99,107, 58, 13, 10,107,105, 99,107,114,105,100,114, 58, 13, 10, + 48, 58, 50, 48, 50, 48, 58, 53, 48, 58, 48, 49, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,100,111,111,121,111,110,103, 46, + 99, 13, 10,108, 97,115,116,100, 97,121, 58, 13, 10,108, 97,115,116,100, + 97,121, 97, 58, 13, 10,100,100, 97,121,100,111,111, 58, 13, 10, 48, 58, + 100, 54, 99, 97, 58, 98, 58, 50, 48, 58, 51, 48, 13, 10, 48, 58,101, 48, + 55,101, 58, 54,101, 58, 48, 48, 58, 49, 98, 13, 10, 48, 58,101, 49, 51, + 56, 58, 55, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,100,111,119,105,108,100, 46, 99, 13, 10,100,111,114,117, + 110,114,117,110, 58, 13, 10,100,111,114,117,110,114,117,110, 50, 58, 13, + 10, 48, 58, 50, 48, 49, 48, 58, 49, 57, 48, 58, 48, 48, 58, 53, 48, 13, + 10, 13, 10,100,111,114,117,110,114,117,110, 99, 97, 58, 32, 59, 42, 42, + 42, 42, 42, 42, 68,111, 33, 32, 82,117,110, 32, 82,117,110, 32, 40, 68, + 111, 39,115, 32, 67, 97,115,116,108,101, 32,104, 97,114,100,119, 97,114, + 101, 44, 32,115,101,116, 32, 50, 41, 13, 10,100,111,114,117,110,114,117, + 110, 99, 58, 32, 59, 42, 42, 42, 42, 42, 42, 68,111, 33, 32, 82,117,110, + 32, 82,117,110, 32, 40, 68,111, 39,115, 32, 67, 97,115,116,108,101, 32, + 104, 97,114,100,119, 97,114,101, 44, 32,115,101,116, 32, 49, 41, 13, 10, + 48, 58, 56, 48, 49, 48, 58, 49, 57, 48, 58, 48, 48, 58, 53, 48, 13, 10, + 13, 10,115,112,105,101,114,111, 58, 13, 10, 48, 58, 50, 48, 49, 48, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 48, 49, 49, 58, 49, 58, + 49, 48, 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 101,112,114,111,109, 46, 99, 13, 10,101,112,114,111,109, 58, 13, 10, 48, + 58, 51,102, 55,100,101, 56, 58, 99, 56, 58, 48, 48, 58, 57, 56, 13, 10, + 13, 10,101,112,114,111,109, 50, 58, 13, 10, 48, 58, 51,102, 55,100, 99, + 48, 58, 99, 56, 58, 48, 48, 58, 57, 56, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,101,115,112,105, 97,108, 46, 99, 13, 10,101,115,112, + 105, 97,108, 58, 13, 10,101,115,112,105, 97,108,117, 58, 13, 10, 48, 58, + 53, 56, 52, 50, 58, 55, 56, 58, 48, 48, 58, 50, 55, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,101,120, 99,116,115, 99, 99,114, 46, 99, + 13, 10,101,120, 99,116,115, 99, 99,114, 58, 13, 10,101,120, 99,116,115, + 99, 99,114,117, 58, 13, 10,101,120, 99,116,115, 99, 99,114, 97, 58, 13, + 10,101,120, 99,116,115, 99, 99,114,106, 58, 13, 10,101,120, 99,116,115, + 99, 99,114,106,111, 58, 13, 10, 48, 58, 55, 99, 57, 48, 58, 51, 48, 58, + 52,100, 58, 48, 48, 13, 10, 48, 58, 55, 99, 54, 48, 58, 51, 58, 48, 50, + 58, 48, 48, 13, 10, 13, 10,101,120, 99,116,115, 99, 99,114, 98, 58, 13, + 10, 48, 58, 56, 99, 57, 48, 58, 51, 48, 58, 52,100, 58, 48, 48, 13, 10, + 48, 58, 56, 99, 54, 48, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,101,120,101,100,101,120,101,115, 46, + 99, 13, 10,101,120,101,100,101,120,101,115, 58, 13, 10, 48, 58,101, 54, + 56, 48, 58, 53, 48, 58, 48, 48, 58, 49, 57, 13, 10, 48, 58,101, 54, 48, + 48, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115, 97,118,103, 98, + 101,101,115, 58, 13, 10, 48, 58,101, 54, 56, 48, 58, 53, 48, 58, 48, 48, + 58, 50, 52, 13, 10, 48, 58,101, 54, 48, 48, 58, 56, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,101,120,101,114, + 105,111,110, 46, 99, 13, 10,101,120,101,114,105,111,110, 58, 13, 10,101, + 120,101,114,105,111,110, 98, 58, 13, 10,101,120,101,114,105,111,110,116, + 58, 13, 10, 48, 58, 54, 54, 48, 48, 58, 99, 56, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 54, 55, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,101,120,105,100,121, 46, + 99, 13, 10,109,116,114, 97,112, 58, 13, 10,109,116,114, 97,112, 51, 58, + 13, 10,109,116,114, 97,112, 52, 58, 13, 10,109,116,114, 97,112, 98, 58, + 13, 10, 48, 58, 48, 51, 56, 48, 58, 50, 51, 58, 48, 48, 58, 52, 56, 13, + 10, 13, 10,118,101,110,116,117,114,101, 58, 13, 10,118,101,110,116,117, + 114,101, 50, 58, 13, 10,118,101,110,116,117,114,101, 52, 58, 13, 10, 48, + 58, 48, 51, 56, 48, 58, 50, 51, 58, 48, 48, 58, 53, 51, 13, 10, 13, 10, + 112,101,112,112,101,114, 50, 58, 13, 10,104, 97,114,100,104, 97,116, 58, + 13, 10,112,101,112,112,101,114, 50, 55, 58, 13, 10, 48, 58, 48, 51, 54, + 48, 58, 50, 51, 58, 48, 48, 58, 49, 49, 13, 10, 13, 10,116, 97,114,103, + 58, 13, 10,115,112,101, 99,116, 97,114, 58, 13, 10,115,112,101, 99,116, + 97,114, 49, 58, 13, 10,112,104, 97,110,116,111,109, 97, 58, 13, 10,114, + 97,108,108,121,115, 58, 13, 10,112, 97,110,122,101,114, 58, 13, 10,112, + 104, 97,110,116,111,109, 58, 13, 10,114, 97,108,108,121,115, 97, 58, 13, + 10, 48, 58, 48, 48, 97,101, 58, 50, 58, 48, 48, 58, 49, 48, 13, 10, 13, + 10,115,105,100,101,116,114, 97, 99, 58, 13, 10, 48, 58, 48, 48, 48,102, + 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,102, 97,115,116,102,114,101,100, 46, 99, 13, 10,102, 97,115, + 116,102,114,101,100, 58, 13, 10, 48, 58, 99, 48, 52, 98, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 99, 52, 48, 48, 58, 51,102, 58, 48, 48, + 58, 49, 49, 13, 10, 13, 10,102,108,121, 98,111,121, 58, 13, 10,102,108, + 121, 98,111,121, 98, 58, 13, 10, 48, 58, 99, 52, 48, 48, 58, 49,101, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 52, 51, 48, 58, 54, 52, 58, 49, + 98, 58, 49, 48, 13, 10, 48, 58, 99, 48, 52, 98, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,105,110, + 97,108,105,122,114, 46, 99, 13, 10,102,105,110, 97,108,105,122,114, 58, + 13, 10, 48, 58, 51, 99, 48, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 51, 99, 48, 57, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, + 51, 99, 48, 97, 58, 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 98, + 99, 48, 58, 50, 55, 58, 48, 48, 58, 49, 50, 13, 10, 13, 10,102,105,110, + 97,108,105,122,114, 98, 58, 13, 10, 48, 58, 51, 99, 48, 56, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 99, 48, 57, 58, 49, 58, 48, 50, + 58, 48, 50, 13, 10, 48, 58, 51, 99, 48, 97, 58, 50, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 51, 98, 99, 48, 58, 50, 55, 58, 48, 48, 58, 49, 50, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,105,114,101,116, + 114, 97,112, 46, 99, 13, 10,102,105,114,101,116,114, 97,112, 98,108, 58, + 13, 10,102,105,114,101,116,114, 97,112,106, 58, 13, 10, 48, 58, 99, 97, + 52, 55, 58, 53,100, 58, 48, 50, 58, 49, 56, 13, 10, 13, 10,102,105,114, + 101,116,114, 97,112, 58, 13, 10,102,105,114,101,116,114, 97,112, 97, 58, + 13, 10, 48, 58, 99, 97, 52, 55, 58, 53,100, 58, 48, 50, 58, 50, 53, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,102,108,115,116,111,114, + 121, 46, 99, 32, 40,102, 97,105,114,121,108, 97,110,100, 32,115,116,111, + 114,121, 41, 13, 10,102,108,115,116,111,114,121, 58, 13, 10,102,108,115, + 116,111,114,121,106, 58, 13, 10, 48, 58,101, 55, 52,101, 58, 50, 51, 58, + 48, 48, 58, 52, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 102,114,111,103,103,101,114, 46, 99, 13, 10,102,114,111,103,103,101,114, + 58, 13, 10,102,114,111,103,103,101,114,115, 49, 58, 13, 10,102,114,111, + 103,103,101,114,115, 50, 58, 13, 10,102,114,111,103,103,101,114,109, 99, + 58, 13, 10,113,117, 97, 97,107, 58, 13, 10,102,114,111,103,103,101,114, + 97,109, 58, 13, 10,102,114,111,103,103,101,114,115, 51, 58, 13, 10, 48, + 58, 56, 51,102, 49, 58, 65, 58, 54, 51, 58, 48, 49, 13, 10, 48, 58, 56, + 51,101,102, 58, 50, 58, 54, 51, 58, 48, 52, 13, 10, 13, 10,102,114,111, + 103,102, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 70,114,111,103,103,101, + 114, 32, 40, 70, 97,108, 99,111,110, 32, 98,111,111,116,108,101,103, 41, + 13, 10, 48, 58, 56, 51,102, 48, 58, 99, 58, 48, 52, 58, 48, 53, 13, 10, + 13, 10,102,114,111,103,103,101,114,115, 58, 13, 10,102,114,111,103,103, + 58, 13, 10,102,114,111,103,103,114,115, 58, 13, 10, 48, 58, 52, 51,102, + 49, 58, 48, 65, 58, 54, 51, 58, 48, 49, 13, 10, 48, 58, 52, 51,101,102, + 58, 48, 50, 58, 54, 51, 58, 48, 52, 13, 10, 13, 10,102,114,111,103,103, + 101,114,118, 58, 13, 10, 48, 58, 56, 51,102, 49, 58, 48, 65, 58, 52, 50, + 58, 48, 49, 13, 10, 48, 58, 56, 51,101,102, 58, 50, 58, 52, 50, 58, 48, + 52, 13, 10, 13, 10,110,101, 98,117,108, 98,101,101, 58, 13, 10,103, 97, + 116,115, 98,101,101, 58, 13, 10, 48, 58, 56, 97, 50, 48, 58, 50,100, 58, + 48, 48, 58, 48,101, 13, 10, 48, 58, 56, 51,101,100, 58, 54, 58, 48, 48, + 58, 50, 52, 13, 10, 13, 10, 99,104,101, 99,107,109, 97,110, 58, 13, 10, + 48, 58, 56, 48, 49, 99, 58, 52, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 99,104,101, 99,107,109, 97,110,106, 58, 13, 10, 48, 58, 52, 48, 49, + 98, 58, 52, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100,101,118,105, + 108,102,115,103, 58, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10,106,117,109,112, 98,117,103, 58, 13, 10,106, + 117,109,112, 98,117,103, 98, 58, 13, 10, 48, 58, 52, 50, 50, 50, 58, 49, + 53, 58, 48, 48, 58, 57, 55, 13, 10, 48, 58, 52, 50, 48, 56, 58, 54, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,107,105,110,103, 98, 97,108,108, 58, + 13, 10,107,105,110,103, 98, 97,108,108,106, 58, 13, 10, 48, 58, 56, 51, + 48, 53, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 48,100, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 51, 48, 50, 58, 49, + 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,108,101,118,101,114,115, 58, 13, + 10, 48, 58, 52, 49, 99,100, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,109,111,111,110, 97,108, 50, 58, 13, 10,109,111,111,110, 97,108, 50, + 98, 58, 13, 10, 48, 58, 56, 48, 97, 56, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 56, 51,102, 52, 58, 50, 58,102,102, 58,102,102, 13, 10, + 48, 58, 56, 51, 70, 68, 58, 49, 58,102,102, 58,102,102, 13, 10, 13, 10, + 109,111,111,110,113,115,114, 58, 13, 10, 48, 58, 56, 48, 52,101, 58, 51, + 48, 58, 48, 48, 58, 57,102, 13, 10, 13, 10,111,114, 98,105,116,114,111, + 110, 58, 13, 10, 48, 58, 52, 48, 52, 97, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10,112, 97, 99,109, 97,110, 98,108, 58, 13, 10,103,109,103, + 97,108, 97,120, 58, 13, 10,112, 97, 99,109, 97,110, 98,108, 97, 58, 13, + 10, 48, 58, 52, 50, 56, 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 53, 49, 56, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, + 49, 97, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 49, 99, + 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 49,101, 48, 58, + 49, 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 50, 48, 48, 58, 49, 58, + 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 50, 50, 48, 58, 49, 58, 52, 48, + 58, 52, 48, 13, 10, 48, 58, 53, 50, 52, 48, 58, 49, 58, 52, 56, 58, 52, + 56, 13, 10, 48, 58, 53, 50, 54, 48, 58, 49, 58, 52, 55, 58, 52, 55, 13, + 10, 48, 58, 53, 50, 56, 48, 58, 49, 58, 52, 57, 58, 52, 57, 13, 10, 48, + 58, 53, 50, 97, 48, 58, 49, 58, 52, 56, 58, 52, 56, 13, 10, 13, 10,112, + 105,115, 99,101,115, 58, 13, 10,111,109,110,105, 58, 13, 10,112,105,115, + 99,101,115, 98, 58, 13, 10, 48, 58, 52, 48, 50, 49, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42,117,112,100, 97,116,101,115, 32,115, + 99,111,114,101, 32,111,110, 32, 50,110,100, 32,103, 97,109,101, 32,115, + 99,114,101,101,110, 13, 10,115,116,114,101, 97,107,110,103, 58, 13, 10, + 115,116,114,101, 97,107,110,103, 97, 58, 13, 10, 48, 58, 52, 50, 56, 56, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 49, 56, 48, 58, 49, + 58, 52, 48, 58, 52, 48, 13, 10, 48, 58, 53, 49, 97, 48, 58, 49, 58, 52, + 48, 58, 52, 48, 13, 10, 48, 58, 53, 49, 99, 48, 58, 49, 58, 52, 48, 58, + 52, 48, 13, 10, 48, 58, 53, 49,101, 48, 58, 49, 58, 52, 48, 58, 52, 48, + 13, 10, 48, 58, 53, 50, 48, 48, 58, 49, 58, 52, 48, 58, 52, 48, 13, 10, + 48, 58, 53, 50, 51, 48, 58, 49, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10, + 119, 97,114,111,102, 98,117,103, 58, 32, 32, 59, 42, 42, 42, 42, 32,116, + 104,101,115,101, 32, 50, 32,103, 97,109,101,115, 32,104, 97,118,101, 32, + 118,101,114,121, 32, 98,117,103,103,121, 32,104,105,115, 99,111,114,101, + 32, 33, 32, 32, 40,104,111, 32,104,111, 32,104,111, 41, 32, 42, 42, 42, + 42, 13, 10,119, 97,114,111,102, 98,117,103,117, 58, 13, 10, 48, 58, 52, + 48, 51, 52, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 53, 50, 52, + 49, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 53, 50, 50, 49, 58, 49, 58, + 48, 58, 48, 13, 10, 48, 58, 53, 50, 48, 49, 58, 49, 58, 48, 58, 48, 13, + 10, 48, 58, 53, 49,101, 49, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 53, + 49, 99, 49, 58, 49, 58, 48, 58, 48, 13, 10, 48, 58, 53, 49, 97, 49, 58, + 49, 58, 48, 58, 48, 13, 10, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,103, 97,108,105,118, 97,110, 46, 99, 13, 10,103, 97,108,105,118, + 97,110, 50, 58, 13, 10,103, 97,108,105,118, 97,110, 51, 58, 13, 10,103, + 97,108,105,118, 97,110, 58, 13, 10, 48, 58,101, 49, 52,102, 58, 56, 50, + 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,101, 50, 56,101, 58, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,100, 97,110,103, 97,114, 58, 13, 10,100, + 97,110,103, 97,114, 50, 58, 13, 10,100, 97,110,103, 97,114, 98, 58, 13, + 10, 48, 58,101, 50, 48, 57, 58, 56, 50, 58, 48, 48, 58, 50, 48, 13, 10, + 48, 58,101, 51, 57, 52, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 110,105,110,106,101,109, 97,107, 58, 13, 10, 48, 58,101, 52, 54, 57, 58, + 52, 49, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,101, 52, 97, 99, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,121,111,117,109, 97, 58, 13, 10, + 121,111,117,109, 97, 98, 58, 13, 10,121,111,117,109, 97, 98, 50, 58, 13, + 10,121,111,117,109, 97, 50, 58, 13, 10, 48, 58,101, 52, 54, 57, 58, 52, + 49, 58, 48, 48, 58, 51,102, 13, 10, 48, 58,101, 52, 97, 99, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 103, 97,108,112, 97,110,105, 99, 46, 99, 13, 10,102, 97,110,116, 97,115, + 105, 97, 58, 13, 10,102, 97,110,116, 97,115,105, 97, 97, 58, 13, 10,102, + 97,110,116, 97,115,105, 97, 98, 58, 13, 10,102, 97,110,116, 97,115,105, + 97,110, 58, 13, 10, 48, 58, 99, 56, 50, 53, 98, 54, 58, 54, 51, 58, 51, + 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, + 97,108,115,112,110, 98,108, 46, 99, 13, 10,103, 97,108,115,112,110, 98, + 108, 58, 13, 10, 48, 58, 55, 48, 49, 55, 56, 48, 58, 51, 50, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 55, 48, 48, 48, 48, 55, 58, 49, 58, 97, 51, + 58, 97, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 97, + 112,108,117,115, 46, 99, 13, 10,103, 97,112,108,117,115, 58, 13, 10,103, + 97,112,108,117,115,111, 58, 13, 10,103, 97,108, 97,103, 97, 51,109, 58, + 13, 10,103, 97,112,108,117,115, 97, 58, 13, 10,103, 97,108, 97,103, 97, + 51, 58, 13, 10,103, 97,108, 97,103, 97, 51, 99, 58, 13, 10,103, 97,112, + 108,117,115,100, 58, 13, 10,103, 97,108, 97,103, 97, 51, 97, 58, 13, 10, + 103, 97,108, 97,103, 97, 51, 98, 58, 13, 10,103, 97,112,108,117,115,116, + 58, 13, 10, 48, 58, 48, 51, 69, 68, 58, 48, 56, 58, 51, 48, 58, 50, 48, + 13, 10, 48, 58, 48, 57, 48, 48, 58, 65, 48, 58, 50, 48, 58, 48, 48, 13, + 10, 48, 58, 48, 57, 98, 54, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, 98,101,114,101,116, 46, + 99, 13, 10,103, 98,101,114,101,116, 58, 13, 10,114,117,115,104, 97,116, + 99,107, 58, 13, 10,103, 98,101,114,101,116, 98, 58, 13, 10,109,114,103, + 111,101,109,111,110, 58, 13, 10, 48, 58,100, 57, 48, 48, 58, 51, 67, 58, + 48, 51, 58, 49, 51, 13, 10, 48, 58,100, 98, 48, 54, 58, 48, 51, 58, 48, + 51, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, + 98,117,115,116,101,114,115, 46, 99, 13, 10,103, 98,117,115,116,101,114, + 115, 58, 13, 10, 99,114, 97,122,121, 99,111,112, 58, 13, 10,103, 98,117, + 115,116,101,114,115, 97, 58, 13, 10, 48, 58, 52, 49, 48, 48, 58, 51, 56, + 58, 49, 57, 58, 48, 48, 13, 10, 48, 58, 52, 48, 53, 48, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103, + 101,101, 98,101,101, 46, 99, 13, 10,103,101,101, 98,101,101, 58, 13, 10, + 103,101,101, 98,101,101,103, 58, 13, 10,103,101,101, 98,101,101, 98, 58, + 13, 10, 48, 58, 52, 48, 52, 54, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103,114, 97,100,105,117,115, + 51, 46, 99, 13, 10,103,114, 97,100,105,117,115, 51, 58, 13, 10,103,114, + 97,100,105,117,115, 51, 97, 58, 13, 10,103,114, 97,100,105,117,115, 51, + 101, 58, 13, 10,103,114, 97,100,105,117,115, 51,106, 58, 13, 10,103,114, + 97,100,105,117,115, 51,106,115, 58, 13, 10, 48, 58, 52, 51,102, 48, 48, + 58, 54, 52, 58, 48, 48, 58, 48, 56, 13, 10, 48, 58, 52, 48, 48, 53, 56, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 48, 53, 97, 58, + 49, 58, 55, 51, 58, 55, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,103,114,111, 98,100, 97, 46, 99, 13, 10,103,114,111, 98,100, 97, + 58, 13, 10,103,114,111, 98,100, 97, 50, 58, 13, 10,103,114,111, 98,100, + 97, 51, 58, 13, 10, 48, 58, 49, 98, 48, 48, 58, 97, 48, 58, 50, 48, 58, + 48, 48, 13, 10, 48, 58, 48, 57, 53, 49, 58, 48, 52, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,103,117,110,115, + 109,111,107,101, 46, 99, 13, 10,103,117,110,115,109,111,107,101, 58, 13, + 10,103,117,110,115,109,111,107,101,117, 58, 13, 10,103,117,110,115,109, + 111,107,101,117, 98, 58, 13, 10,103,117,110,115,109,111,107,101, 98, 58, + 13, 10,103,117,110,115,109,111,107,101,117, 97, 58, 13, 10, 48, 58,101, + 54, 56, 48, 58, 53, 48, 58, 48, 48, 58, 49, 52, 13, 10, 48, 58,101, 54, + 48, 48, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103,117,110,115, + 109,111,107,101,106, 58, 13, 10, 48, 58,101, 54, 56, 48, 58, 53, 48, 58, + 48, 48, 58, 49, 56, 13, 10, 48, 58,101, 54, 48, 48, 58, 56, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,104, 99, + 97,115,116,108,101, 46, 99, 13, 10,104, 99, 97,115,116,108,101, 58, 13, + 10,104, 99, 97,115,116,108,101,111, 58, 13, 10,104, 99, 97,115,116,108, + 106,111, 58, 13, 10,104, 99, 97,115,116,108,101,106, 58, 13, 10, 97,107, + 117,109, 97,106,111,117, 58, 13, 10,104, 99, 97,115,116,108,101,107, 58, + 13, 10, 97,107,117,109, 97,106,111,117,110, 58, 13, 10,104, 99, 97,115, + 116,108,101,101, 58, 13, 10, 48, 58, 49, 57, 52, 48, 58, 51, 99, 58, 48, + 53, 58, 49, 97, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,104, + 101,120, 97, 46, 99, 13, 10,104,101,120, 97, 58, 13, 10,104,101,120, 97, + 97, 58, 13, 10, 48, 58, 99, 55, 48, 57, 58, 50, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,104,121,112,101,114, + 115,112,116, 46, 99, 13, 10,114,111, 97,100,102, 58, 13, 10,114,111, 97, + 100,102, 50, 58, 13, 10, 48, 58, 51, 98,100, 48, 58, 49, 48, 97, 58, 48, + 49, 58, 48, 49, 13, 10, 48, 58, 51, 48, 54, 54, 58, 51, 58, 48, 49, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,105,114,111, + 110,104,111,114,115, 46, 99, 13, 10,105,114,111,110,104,111,114,115, 58, + 13, 10,100, 97,105,114,101,115,121, 97, 58, 13, 10,102, 97,114,119,101, + 115,116, 58, 13, 10, 48, 58, 51, 50,102, 49, 58, 51, 58, 48, 50, 58, 48, + 48, 13, 10, 48, 58, 51, 51, 48, 48, 58, 52, 48, 58, 50, 51, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,105,116,101, 99,104, + 56, 46, 99, 13, 10,110,105,110, 99,108,111,119,110, 58, 13, 10, 48, 58, + 56,100, 58, 52,101, 58, 48, 48, 58, 52, 52, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,106, 97, 99,107, 46, 99, 13, 10,106, 97, 99,107, + 58, 13, 10,106, 97, 99,107, 50, 58, 13, 10,106, 97, 99,107, 51, 58, 13, + 10,116,114,101, 97,104,117,110,116, 58, 13, 10, 48, 58, 52, 53, 48, 48, + 58, 53, 97, 58, 48, 48, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,106, 97,105,108, 98,114,101,107, 46, 99, 13, 10,106, 97, + 105,108, 98,114,101,107, 58, 13, 10,106, 97,105,108, 98,114,101,107, 98, + 58, 13, 10,109, 97,110,104, 97,116, 97,110, 58, 13, 10, 48, 58, 49, 54, + 50, 48, 58, 53, 48, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, 49, 53, 55, + 101, 58, 51, 58, 48, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,106,117,110,111,102,114,115,116, 46, 99, 13, 10,106,117, + 110,111,102,114,115,116, 58, 13, 10,106,117,110,111,102,114,115,116,103, + 58, 13, 10, 48, 58, 56, 49, 48, 48, 58, 97, 48, 58, 48, 49, 58, 51,102, + 13, 10, 13, 10,100,105, 97,109,111,110,100, 58, 13, 10, 48, 58, 49, 50, + 48, 48, 58, 56, 48, 58, 52, 98, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,103,111,116,116,108,105,101, 98, 46, 99, 13, 10, + 114,101, 97, 99,116,111,114, 58, 13, 10, 48, 58, 48, 52,100, 56, 58, 56, + 48, 58, 48, 97, 58, 48, 48, 13, 10, 48, 58, 48, 53, 98, 99, 58, 56, 48, + 58, 49, 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,103,121,114,117,115,115, 46, 99, 13, 10,103,121,114,117,115,115, 58, + 13, 10,103,121,114,117,115,115, 99,101, 58, 13, 10,103,121,114,117,115, + 115, 98, 58, 13, 10, 48, 58, 57, 52, 56, 56, 58, 50, 56, 58, 48, 48, 58, + 56, 51, 13, 10, 48, 58, 57, 52, 48, 98, 58, 48, 51, 58, 48, 48, 58, 48, + 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,107, 97,110,101, + 107,111, 49, 54, 46, 99, 13, 10, 98,101,114,108,119, 97,108,108, 58, 13, + 10, 98,101,114,108,119, 97,108,108,116, 58, 13, 10, 98,101,114,108,119, + 97,108,108,107, 58, 13, 10, 48, 58, 50, 48, 50, 56, 97, 48, 58, 57, 51, + 58, 48, 48, 58, 52, 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,107, 99,104, 97,109,112, 46, 99, 13, 10,107, 99,104, 97,109,112, 58, + 13, 10,107, 97,114, 97,116,101,100,111, 58, 13, 10,107, 99,104, 97,109, + 112,118,115, 58, 13, 10,107, 97,114, 97,116,101,118,115, 58, 13, 10,107, + 99,104, 97,109,112,118,115, 50, 58, 13, 10, 48, 58, 99, 48, 52, 48, 58, + 54, 99, 58, 48, 50, 58, 48, 49, 13, 10, 48, 58, 99, 48, 99, 48, 58, 51, + 58, 48, 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,107,105,110,103,111, 98,111,120, 46, 99, 13, 10,107,105,110,103,111, + 102, 98, 58, 13, 10, 48, 58, 67, 50, 50, 65, 58, 48, 52, 58, 48, 48, 58, + 48, 53, 13, 10, 49, 58, 56, 48, 52, 56, 58, 56, 67, 58, 48, 48, 58, 49, + 50, 13, 10, 13, 10,114,105,110,103,107,105,110,103, 58, 13, 10,114,105, + 110,103,107,105,110,103, 50, 58, 13, 10, 49, 58, 56, 48, 52, 57, 58, 56, + 67, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58, 67, 50, 51, 66, 58, 48, 52, + 58, 48, 48, 58, 48, 53, 13, 10, 13, 10, 99, 97,118,101,110,103,101,114, + 58, 13, 10, 48, 58, 54, 48, 50, 53, 58, 52, 49, 58, 48, 48, 58, 50, 56, + 13, 10, 13, 10,115,110, 97,112,106, 97, 99,107, 58, 13, 10, 48, 58, 54, + 97, 57, 52, 58, 52, 49, 58, 48, 49, 58, 50, 52, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,108, 97,115,115,111, 46, 99, 13, 10,108, 97, + 115,115,111, 58, 13, 10, 48, 58, 48, 50, 50, 48, 58, 55, 48, 58, 49, 49, + 58, 51, 48, 13, 10, 48, 58, 48, 48, 49, 99, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,108, 97,115,116, + 100,117,101,108, 46, 99, 13, 10,108, 97,115,116,100,117,101,108, 58, 13, + 10,108, 97,115,116,100,117,101,108,111, 58, 13, 10,108, 97,115,116,100, + 117,101,108, 98, 58, 13, 10, 48, 58,102,102, 56, 55,101, 50, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 99, 54,102, 50, 58, 54, 56, + 58, 99, 55, 58, 48, 48, 13, 10, 48, 58,102, 99, 99, 55, 54,100, 58, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58,102, 99, 99, 55,101,100, 58, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58,102, 99, 99, 56, 54,100, 58, 49, + 58, 50, 48, 58, 50, 48, 13, 10, 48, 58,102, 99, 99, 56,101,100, 58, 49, + 58, 48, 50, 58, 48, 50, 13, 10, 48, 58,102, 99, 99, 57, 54,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 99, 99, 57,101,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 99, 99, 97, 54,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102, 99, 99, 97,101,100, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109, 97,100,103,101, 97,114, 58, + 13, 10,109, 97,100,103,101, 97,114,106, 58, 13, 10,108,101,100,115,116, + 111,114,109, 58, 13, 10, 48, 58,102,102, 56, 56, 57, 48, 58, 55, 56, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 99, 98, 55, 54, 58, 50, 51, + 58, 48, 50, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 55, 99, 57, 58, 49, + 58,100, 50, 58,100, 50, 13, 10, 13, 10,108,101,100,115,116,111,114,109, + 50, 58, 13, 10,108,101,100,115, 50, 48, 49, 49,117, 58, 13, 10,108,101, + 100,115, 50, 48, 49, 49, 58, 13, 10, 48, 58,102,102, 56, 56, 57, 48, 58, + 55, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 99, 98, 55, 54, + 58, 50, 51, 58, 52, 49, 58, 48, 49, 13, 10, 48, 58,102,102, 56, 55, 99, + 57, 58, 49, 58,100, 50, 58,100, 50, 13, 10, 13, 10,106,117,110,103,108, + 101,114, 58, 13, 10,106,117,110,103,108,101,114,115, 58, 13, 10,115, 97, + 118, 97,110,110, 97, 58, 13, 10,106, 97, 99,107,108,101,114, 58, 13, 10, + 48, 58, 57, 57, 52, 48, 58, 97, 48, 58, 48, 48, 58, 53, 98, 13, 10, 48, + 58, 57, 57, 49, 99, 58, 51, 58, 48, 48, 58, 48, 50, 13, 10, 13, 10, 99, + 111,109,109,115,101,103, 97, 58, 13, 10, 48, 58, 57, 99, 54,100, 58, 54, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,108,119,105,110,103,115, 46, 99, 13, 10, 97,118,101,110,103,101,114, + 115, 58, 13, 10, 97,118,101,110,103,101,114,115, 50, 58, 13, 10, 48, 58, + 99,101, 48, 48, 58, 53, 52, 58, 48, 48, 58, 52, 55, 13, 10, 48, 58, 99, + 101, 57, 55, 58, 51, 58, 48, 48, 58, 54, 48, 13, 10, 13, 10, 98,117,114, + 97,105,107,101,110, 58, 13, 10, 98,117,114, 97,105,107,101,110, 98, 58, + 13, 10, 48, 58, 99,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50,101, 13, + 10, 48, 58, 99,101, 57, 55, 58, 51, 58, 48, 48, 58, 54, 48, 13, 10, 13, + 10,108,119,105,110,103,115, 58, 13, 10,108,119,105,110,103,115, 50, 58, + 13, 10,108,119,105,110,103,115,106, 58, 13, 10,108,119,105,110,103,115, + 98, 58, 13, 10, 48, 58, 99,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50, + 101, 13, 10, 48, 58, 99,101, 57, 55, 58,100, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,116,114,111,106, 97,110,114, 58, 13, 10,116,114,111,106, 97, + 110, 58, 13, 10,116,114,111,106, 97,110,106, 58, 13, 10,116,114,111,106, + 97,110, 97, 58, 13, 10,116,114,111,106, 97,110, 98, 58, 13, 10, 48, 58, + 99,101, 48, 48, 58, 53, 98, 58, 48, 48, 58, 50,101, 13, 10, 48, 58, 99, + 101, 57, 55, 58, 51, 58, 48, 48, 58, 54, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,109, 54, 50, 46, 99, 13, 10,107,117,110,103,102, + 117,109, 58, 13, 10,107,117,110,103,102,117,109,100, 58, 13, 10,107,117, + 110,103,102,117, 98, 58, 13, 10,107,117,110,103,102,117, 98, 50, 58, 13, + 10,115,112, 97,114,116, 97,110,120, 58, 13, 10,115,112, 97,114,116, 97, + 110,120,116,101, 99, 58, 13, 10, 48, 58,101, 97, 48, 54, 58, 55, 56, 58, + 48, 48, 58, 52, 49, 13, 10, 48, 58,101, 57, 56, 48, 58, 51, 58, 53, 50, + 58, 48, 48, 13, 10, 13, 10, 98, 97,116,116,114,111, 97,100, 58, 13, 10, + 48, 58,101,100, 53, 48, 58, 98, 48, 58, 48, 48, 58, 48, 56, 13, 10, 13, + 10,115,112,101,108,117,110,107, 50, 58, 13, 10, 48, 58,101, 48, 54, 54, + 58, 54, 52, 58, 57, 57, 58, 51,102, 13, 10, 48, 58,101, 48, 52,102, 58, + 50, 58, 57, 57, 58, 49, 49, 13, 10, 13, 10,108,111,116,108,111,116, 58, + 13, 10, 48, 58,101, 57, 54, 98, 58, 50, 50, 54, 58, 48, 50, 58, 48, 48, + 13, 10, 48, 58,101, 57, 53, 54, 58, 51, 58, 48, 50, 58, 49, 55, 13, 10, + 13, 10,108,100,114,117,110, 58, 13, 10,108,100,114,117,110, 97, 58, 13, + 10, 48, 58,101, 53,101, 53, 58, 99, 56, 58, 48, 49, 58, 48, 52, 13, 10, + 48, 58,101, 53, 57, 97, 58, 51, 58, 48, 52, 58, 52, 48, 13, 10, 13, 10, + 108,100,114,117,110, 50, 58, 13, 10,108,100,114,117,110, 51, 58, 13, 10, + 108,100,114,117,110, 51,106, 58, 13, 10, 48, 58,101, 54, 98,100, 58, 99, + 56, 58, 48, 48, 58, 48, 53, 13, 10, 48, 58,101, 54, 55, 50, 58, 51, 58, + 48, 48, 58, 56, 48, 13, 10, 13, 10,108,100,114,117,110, 52, 58, 13, 10, + 48, 58,101, 55, 51, 53, 58, 99, 56, 58, 48, 48, 58, 48, 54, 13, 10, 48, + 58,101, 54,101, 97, 58, 51, 58, 48, 48, 58, 55, 48, 13, 10, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 55, 50, 46, 99, 13, 10, 97, + 105,114,100,117,101,108,109, 55, 50, 58, 13, 10, 97,105,114,100,117,101, + 108, 58, 13, 10, 48, 58, 97, 51,100, 52,101, 58, 56, 50, 58, 49, 53, 58, + 50, 48, 13, 10, 13, 10,114,105,112,111,102,102, 58, 13, 10, 48, 58,101, + 48, 58, 56, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,104,104, 97,114,114, + 121, 58, 13, 10, 48, 58, 97, 48, 57, 97, 48, 58, 57,102, 58, 48, 48, 58, + 50, 48, 13, 10, 48, 58, 97, 48, 97, 52, 48, 58, 48, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10,104,104, 97,114,114,121,117, 58, 13, 10, 48, 58, + 101, 48, 57, 97, 48, 58, 57,102, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, + 101, 48, 97, 52, 48, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 100,107,103,101,110,115, 97,110, 58, 13, 10, 48, 58,101, 48, 57, 97, 48, + 58, 57,102, 58, 52, 48, 58, 50, 48, 13, 10, 48, 58,101, 48, 97, 52, 48, + 58, 51, 58, 52, 48, 58, 48, 50, 13, 10, 13, 10,105,109,103,102,105,103, + 104,116, 58, 13, 10,105,109,103,102,105,103,104,116,111, 58, 13, 10,105, + 109,103,102,105,103,104,116,106, 58, 13, 10, 48, 58, 97, 51, 51, 52,102, + 58, 55, 56, 58, 48, 57, 58, 50, 48, 13, 10, 13, 10,109, 97,106,116,105, + 116,108,101, 58, 13, 10,109, 97,106,116,105,116,108,101,106, 58, 13, 10, + 48, 58,100, 50, 98, 97, 52, 58, 57, 98, 58, 52, 98, 58, 49, 55, 13, 10, + 13, 10,110,115,112,105,114,105,116, 58, 13, 10,110,115,112,105,114,105, + 116,106, 58, 13, 10, 48, 58, 97, 51, 57, 51, 48, 58, 55, 56, 58, 52, 53, + 58, 52,102, 13, 10, 48, 58, 97, 51, 57, 98, 97, 58, 48, 51, 58, 52, 53, + 58, 48, 48, 13, 10, 13, 10,112,111,117,110,100,102,111,114, 58, 13, 10, + 112,111,117,110,100,102,111,114,117, 58, 13, 10,112,111,117,110,100,102, + 111,114,106, 58, 13, 10, 48, 58,101, 50, 53, 48, 50, 58, 50, 56, 58, 49, + 48, 58, 48, 48, 13, 10, 48, 58,101, 50, 53, 50, 97, 58, 50, 56, 58, 51, + 53, 58, 48, 48, 13, 10, 48, 58,101, 50, 53, 53, 50, 58, 50, 56, 58, 52, + 50, 58, 48, 48, 13, 10, 48, 58,101, 50, 53, 55, 97, 58, 50, 56, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 50, 53, 97, 50, 58, 50, 56, 58, 49, + 49, 58, 48, 48, 13, 10, 48, 58,101, 50, 53, 99, 97, 58, 50, 56, 58, 53, + 57, 58, 48, 48, 13, 10, 48, 58,101, 50, 53,102, 50, 58, 50, 56, 58, 54, + 56, 58, 48, 48, 13, 10, 48, 58,101, 50, 54, 49, 97, 58, 50, 56, 58, 55, + 48, 58, 48, 48, 13, 10, 48, 58,101, 50, 54, 52, 50, 58, 50, 56, 58, 53, + 55, 58, 48, 48, 13, 10, 48, 58,101, 50, 54, 54, 97, 58, 50, 56, 58, 52, + 49, 58, 48, 48, 13, 10, 13, 10,114,116,121,112,101, 50, 58, 13, 10,114, + 116,121,112,101, 50,106, 58, 13, 10,114,116,121,112,101, 50,106, 99, 58, + 13, 10, 48, 58,101, 51, 56, 51, 52, 58, 56, 50, 58, 48, 48, 58, 52, 49, + 13, 10, 48, 58,101, 51, 56, 99, 50, 58, 55, 58,102, 51, 58, 51, 48, 13, + 10, 48, 58,100, 48, 49, 55, 56, 58, 49, 58,102, 51, 58,102, 51, 13, 10, + 48, 58,100, 48, 49, 55, 99, 58, 49, 58, 51, 49, 58, 51, 49, 13, 10, 48, + 58,100, 48, 49, 56, 48, 58, 49, 58, 51, 55, 58, 51, 55, 13, 10, 48, 58, + 100, 48, 49, 56, 52, 58, 49, 58, 51, 52, 58, 51, 52, 13, 10, 48, 58,100, + 48, 49, 56, 56, 58, 49, 58, 51, 53, 58, 51, 53, 13, 10, 48, 58,100, 48, + 49, 56, 99, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58,100, 48, 49, + 57, 48, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 13, 10,114,116,121,112, + 101, 50,109, 56, 50, 98, 58, 13, 10, 48, 58,100, 51, 56, 52, 56, 58, 54, + 101, 58, 48, 48, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,109, 55, 57, 97,109, 98, 46, 99, 13, 10,109, 55, 57, 97,109, 98, + 58, 13, 10, 48, 58, 52, 48, 48, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 57, 48, 46, 99, 13, + 10, 98,111,109, 98,114,109, 97,110, 58, 13, 10, 48, 58, 97, 48, 98, 49, + 98, 58, 56, 99, 58, 48, 51, 58, 54, 51, 13, 10, 48, 58, 97, 48, 98,102, + 101, 58, 51, 58, 52, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,109, 57, 50, 46, 99, 13, 10,104,111,111,107,117, 58, 13, + 10,104,111,111,107, 58, 13, 10, 48, 58,101, 97, 54, 97,100, 58,101, 99, + 58, 48, 48, 58, 52,102, 13, 10, 13, 10,114,116,121,112,101,108,101,111, + 58, 13, 10,114,116,121,112,101,108,101,111,106, 58, 13, 10, 48, 58,101, + 50, 50, 49,101, 58, 51, 56, 58, 52, 48, 58, 50, 48, 13, 10, 48, 58,101, + 50, 50, 53, 54, 58, 51, 58, 52, 48, 58, 48, 49, 13, 10, 48, 58,100, 99, + 49, 52, 56, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58,100, 99, 49, + 52, 99, 58, 49, 58, 51, 49, 58, 51, 49, 13, 10, 48, 58,100, 99, 49, 53, + 48, 58, 49, 58, 51, 50, 58, 51, 50, 13, 10, 48, 58,100, 99, 49, 53, 52, + 58, 49, 58, 51, 56, 58, 51, 56, 13, 10, 48, 58,100, 99, 49, 53, 56, 58, + 49, 58, 51, 52, 58, 51, 52, 13, 10, 48, 58,100, 99, 49, 53, 99, 58, 49, + 58, 51, 48, 58, 51, 48, 13, 10, 48, 58,100, 99, 49, 54, 48, 58, 49, 58, + 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 42,109,101,116,114,111, 46, 99, 32, 40,108, 97,115,116, 32,102,111,114, + 116,114,101,115,115, 32, 45, 32,116,111,114,105,100,101, 32, 47, 32,101, + 114,111,116,105, 99, 41, 13, 10,108, 97,115,116,102,111,114,116, 58, 13, + 10,108, 97,115,116,102,111,114,116,101, 58, 13, 10,108, 97,115,116,102, + 111,114,116,107, 58, 13, 10,108, 97,115,116,102,111,114,116,101, 97, 58, + 13, 10, 48, 58, 52, 48,100, 98, 49, 97, 58, 48, 97, 58, 48, 49, 58, 54, + 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, 76, 97,115,116, + 32, 70,111,114,116,114,101,115,115, 32, 45, 32, 84,111,114,105,100,101, + 32, 40, 71,101,114,109, 97,110, 41, 13, 10,108, 97,115,116,102,111,114, + 116,103, 58, 13, 10, 48, 58, 99, 48,100, 98, 49, 97, 58, 48, 97, 58, 48, + 49, 58, 54, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, + 57, 55, 46, 99, 13, 10, 98, 98,109, 97,110,119,106, 58, 32, 59, 42, 42, + 42, 42, 32,116,111,112, 32,115, 99,111,114,101, 32,110,111,116, 32,119, + 111,114,107,105,110,103, 32, 63, 63, 63, 63, 63, 13, 10, 98, 98,109, 97, + 110,119, 58, 13, 10, 98,111,109, 98,108,111,114,100, 58, 13, 10, 98, 98, + 109, 97,110,119,106, 97, 58, 13, 10, 48, 58, 97, 48, 98, 51, 54, 58, 54, + 97, 58, 48, 50, 58, 50,101, 13, 10, 13, 10,100,121,110, 97, 98,108,115, + 116, 58, 13, 10, 97,116,111,109,112,117,110,107, 58, 32, 32, 59, 42, 42, + 42, 42, 42, 42, 97,116,111,109,105, 99, 32,112,117,110,107, 32, 40,117, + 115, 41, 13, 10,100,121,110, 97, 98,108,115,116, 98, 58, 13, 10, 48, 58, + 97, 48, 98, 50, 99, 58, 56,102, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, + 97, 48, 99, 48,102, 58, 51, 58, 52, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,109, 97,103,105,120, 46, 99, 13, 10,109, + 97,103,105,120, 58, 13, 10, 48, 58,102, 56, 48, 48, 58, 56, 48, 58, 48, + 48, 58, 50,101, 13, 10, 48, 58,102, 56, 56, 56, 58, 51, 58, 48, 48, 58, + 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,103, + 109, 97,120, 46, 99, 13, 10,109, 97,103,109, 97,120, 58, 13, 10, 48, 58, + 49, 56, 99,101, 48, 58, 52, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 49, 56,100, 50,101, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, + 56,100, 50, 51, 58, 49, 58, 51, 53, 58, 51, 53, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,109, 97,105,110,101,118,116, 46, 99, 13, 10, + 100,101,118,115,116,111,114,115, 58, 13, 10, 48, 58, 52, 49, 99, 52, 58, + 50,101, 58, 48, 49, 58, 48, 49, 13, 10, 13, 10,100,105,103,100,117,103, + 50, 58, 13, 10,100,105,103,100,117,103, 50,111, 58, 13, 10, 48, 58, 49, + 49, 98, 48, 58, 53, 48, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 49, 48, + 48, 98, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 55,101,100, 58, + 55, 58, 51, 48, 58, 50, 48, 13, 10, 13, 10,109,111,116,111,115, 58, 13, + 10, 48, 58, 50, 52, 48, 48, 58, 97, 48, 58, 50, 48, 58, 48, 48, 13, 10, + 48, 58, 49, 56, 51, 49, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 116,111,100,114,117, 97,103, 97, 58, 13, 10,116,111,100,114,117, 97,103, + 98, 58, 13, 10,116,111,100,114,117, 97,103, 97,111, 58, 13, 10,116,111, + 100,114,117, 97,103, 97,115, 58, 13, 10, 48, 58, 49, 48, 50, 97, 58, 51, + 50, 58, 48, 48, 58, 52, 53, 13, 10, 48, 58, 49, 48, 48, 98, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 109, 97,114,105,110,101, 98, 46, 99, 13, 10,109, 97,114,105,110,101, 98, + 58, 13, 10, 48, 58, 56, 57, 55, 57, 58, 54, 58, 50, 52, 58, 50, 52, 13, + 10, 48, 58, 56, 57, 57, 57, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,115,112,114,105,110,103,101,114, 58, 13, 10, 48, 58, 56, 97,102, 97, + 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 98, 49, 97, 58, 53, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 98, 51, 97, 58, 53, 58, 48, + 50, 58, 48, 50, 13, 10, 48, 58, 56, 98, 53, 97, 58, 53, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 56, 98, 55, 97, 58, 53, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 56, 98, 57, 97, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 56, 98, 98, 97, 58, 53, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 104,111, 99, 99,101,114, 58, 13, 10, 48, 58, 56, 53, 53, 48, 58, 51, 50, + 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 56, 53, 99, 97, 58, 54, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,104,111, 99, 99,101,114, 50, 58, 13, 10, + 48, 58, 56, 53, 53, 48, 58, 50,100, 58, 48, 48, 58, 50, 57, 13, 10, 48, + 58, 56, 53, 99, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,104, + 111,112,112,114,111, 98,111, 58, 13, 10, 48, 58, 56, 48, 53,102, 58, 49, + 57, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 55, 56, 58, 49,101, + 58, 49, 99, 58, 48,101, 13, 10, 48, 58, 56, 57, 98,101, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 56, 57,100,101, 58, 49, 58, 48, 49, 58, + 48, 49, 13, 10, 48, 58, 56, 57,102,101, 58, 49, 58, 48, 54, 58, 48, 54, + 13, 10, 48, 58, 56, 97, 49,101, 58, 49, 58, 48, 55, 58, 48, 55, 13, 10, + 48, 58, 56, 97, 51,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 119, 97,110,116,101,100, 58, 32, 59, 42, 32,110,111,116, 32,115, 97,118, + 105,110,103, 32,119,104,111,108,101, 32,116, 97, 98,108,101, 13, 10, 48, + 58, 56, 97, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, + 97, 51,101, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 56, 97, 49, + 101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57,102,101, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 57,100,101, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 49, 98, 52, 58, 52, 99, 58, 48, + 48, 58, 49, 54, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, + 97,114,105,111, 46, 99, 13, 10,109, 97,114,105,111, 58, 13, 10,109, 97, + 115, 97,111, 58, 13, 10,109, 97,114,105,111,106, 58, 13, 10,109, 97,114, + 105,111,111, 58, 13, 10,109, 97,114,105,111,101, 58, 13, 10,109, 97,114, + 105,111, 98,108, 58, 13, 10, 48, 58, 54, 98, 48, 48, 58, 97, 97, 58, 57, + 55, 58, 55, 52, 13, 10, 48, 58, 54, 99, 48, 48, 58, 51, 99, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 54, 56, 50, 51, 58, 51, 58, 48, 49, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 97,116,109, + 97,110,105, 97, 46, 99, 13, 10,109, 97,116,109, 97,110,105, 97, 58, 13, + 10,101,120, 99,116,104,111,117,114, 58, 13, 10, 48, 58, 48, 55, 48, 48, + 58, 53, 48, 58, 48, 48, 58, 98, 48, 13, 10, 48, 58, 48, 48, 50, 56, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109, 97,110,105, 97, 99,104, + 58, 13, 10,109, 97,110,105, 97, 99,104, 50, 58, 13, 10, 48, 58, 48, 53, + 50, 98, 58, 51, 99, 58, 48, 48, 58, 99, 54, 13, 10, 48, 58, 48, 48, 50, + 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,109, 99,114, 51, 46, 99, 13, 10,100,101,115,116,100,101, + 114, 98, 58, 13, 10, 48, 58,101, 52,101, 52, 58, 99,101, 58, 48, 49, 58, + 48, 48, 13, 10, 48, 58,101, 55,102, 55, 58, 49, 58, 55, 54, 58, 55, 54, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, 99,114, 54, 56, + 46, 99, 13, 10, 97,114, 99,104,114,105,118,108, 58, 13, 10, 48, 58, 54, + 50, 99,102, 49, 58, 51, 49, 57, 58, 48, 57, 58, 48, 53, 13, 10, 48, 58, + 54, 49,101,100, 53, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, 10, 97, + 114, 99,104,114,105,118,108, 50, 58, 13, 10, 97,114, 99,104,114,105,118, + 108, 97, 58, 13, 10, 97,114, 99,104,114,105,118,108, 98, 58, 13, 10, 48, + 58, 54, 50, 99,101, 51, 58, 51, 49, 57, 58, 48, 57, 58, 48, 53, 13, 10, + 48, 58, 54, 49,101,100, 53, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 13, + 10, 98,108, 97,115,116,101,100, 58, 13, 10, 48, 58, 54, 49,100, 55,102, + 58, 50,102, 58, 53, 52, 58, 55, 53, 13, 10, 13, 10,122,119, 97, 99,107, + 101,114,121, 58, 13, 10, 48, 58, 56, 52, 50, 99, 50, 58, 52, 56, 58, 52, + 50, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109, + 101,103, 97,115,121,115, 49, 46, 99, 13, 10, 54, 52,115,116,114,101,101, + 116, 58, 13, 10, 54, 52,115,116,114,101,101,116,106, 58, 13, 10, 54, 52, + 115,116,114,101,101,116,106, 97, 58, 13, 10, 48, 58,102,102, 56, 56, 52, + 51, 58, 55, 52, 58, 48, 48, 58, 52, 51, 13, 10, 13, 10, 97,118,115,112, + 105,114,105,116, 58, 13, 10, 48, 58, 55, 57,100,102, 50, 58, 53, 51, 58, + 48, 48, 58, 53, 52, 13, 10, 13, 10, 99,104,105,109,101,114, 97, 98, 58, + 13, 10, 48, 58,102,102, 56, 56, 53, 48, 58, 97, 55, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,112, 52, 55, 58, 13, 10,112, 52, 55,106, 58, 13, 10, + 112, 52, 55,106,101, 58, 13, 10, 48, 58,102, 49, 56, 48, 48, 58, 55, 56, + 58, 48, 48, 58, 52,102, 13, 10, 13, 10,112,104, 97,110,116, 97,115,109, + 58, 13, 10, 48, 58,102,102, 57,100,101,101, 58, 53, 51, 58, 48, 48, 58, + 53, 52, 13, 10, 13, 10,112,108,117,115, 97,108,112,104, 58, 13, 10, 48, + 58,102, 50,102, 51, 54, 58, 49, 54, 56, 58, 48, 48, 58, 52, 51, 13, 10, + 13, 10,114,111,100,108, 97,110,100, 58, 13, 10, 48, 58,102, 54, 48,102, + 99, 58, 50, 50, 54, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,102, 51, 48, + 51, 48, 58, 49, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,114,111,100, + 108, 97,110,100,106, 58, 13, 10,114,111,100,108, 97,110,100,106, 98, 58, + 13, 10, 48, 58,102, 54, 48,102, 97, 58, 50, 50, 54, 58, 48, 48, 58, 48, + 49, 13, 10, 48, 58,102, 51, 48, 50,101, 58, 49, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,114,105,116,116, 97,109, 58, 13, 10, 48, 58,102, 54, + 56,102, 99, 58, 50, 50, 54, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58,102, + 51,100, 51,101, 58, 49, 52, 58, 48, 48, 58,100,102, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,109,101,116,114,111, 46, 99, 13, 10,115, + 107,121, 97,108,101,114,116, 58, 13, 10, 48, 58, 99, 48,101, 51, 52, 48, + 58, 53, 99, 58, 48, 48, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,109,105,107,105,101, 46, 99, 13, 10,109,105,107,105,101, + 58, 13, 10,109,105,107,105,101,106, 58, 13, 10,109,105,107,105,101,104, + 115, 58, 13, 10, 48, 58, 50, 97, 48, 48, 58, 48, 49, 58, 49,100, 58, 49, + 100, 13, 10, 48, 58, 50, 97, 48, 49, 58, 48, 49, 58, 50, 99, 58, 50, 99, + 13, 10, 48, 58, 50, 97, 48, 50, 58, 48, 49, 58, 49,102, 58, 49,102, 13, + 10, 48, 58, 50, 97, 48, 51, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 50, 97, 48, 52, 58, 48, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, + 58, 50, 97, 48, 53, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 50, 57,102, 48, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, + 57, 55, 99, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,109,105,116, 99,104,101,108,108, 46, 99, 13, + 10, 98,108,111, 99,107, 58, 13, 10, 98,108,111, 99,107,114, 50, 58, 13, + 10, 98,108,111, 99,107,114, 49, 58, 13, 10, 98,108,111, 99,107,106, 58, + 13, 10, 98,108,111, 99,107, 98,108, 58, 13, 10, 98,108,111, 99,107,106, + 111,121, 58, 13, 10, 48, 58,101, 48,102, 48, 58, 53, 48, 58, 53, 52, 58, + 56, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,110,105, + 103,104,116, 46, 99, 13, 10,109,110,105,103,104,116, 58, 13, 10, 48, 58, + 99, 48, 57, 57, 58, 52, 49, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, + 48,101, 54, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,114,107, + 97,114,101, 97, 58, 13, 10, 48, 58,100, 52, 53, 99, 58, 52, 50, 58, 52, + 54, 58, 51, 48, 13, 10, 48, 58, 99, 48, 52, 48, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,109,111,108, + 101, 46, 99, 13, 10,109,111,108,101, 58, 13, 10, 48, 48, 58, 48, 50, 69, + 49, 58, 48, 65, 58, 48, 48, 58, 48, 53, 13, 10, 48, 48, 58, 48, 51, 55, + 53, 58, 53, 48, 58, 49, 57, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,109,112, 97,116,114,111,108, 46, 99, 13, 10,109,112, + 97,116,114,111,108, 58, 13, 10,109,112, 97,116,114,111,108,119, 58, 13, + 10,109,114, 97,110,103,101,114, 58, 13, 10, 48, 58,101, 48, 48, 56, 58, + 50, 99, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,109,114,100,111, 46, 99, 13, 10,109,114,100,111, 58, 13, 10, + 109,114,100,111,116, 58, 13, 10,109,114,100,111,102,105,120, 58, 13, 10, + 109,114,108,111, 58, 13, 10,109,114,100,117, 58, 13, 10,109,114,100,111, + 121, 58, 13, 10,121, 97,110,107,101,101,100,111, 58, 13, 10, 48, 58,101, + 48, 49, 55, 58, 54, 52, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111,115, 49, 46, 99, 13, 10, + 98,108, 97,115,116,111,102,102, 58, 13, 10, 48, 58, 52, 49, 54, 48, 58, + 57, 49, 58, 48, 48, 58, 52, 55, 13, 10, 48, 58, 52, 48, 51, 48, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, 48,101, 58, 49, 58,102, + 101, 58,102,101, 13, 10, 13, 10,100, 97,110,103,115,101,101,100, 58, 13, + 10, 48, 58, 48, 53, 51,102, 58, 97, 48, 58, 48, 49, 58, 48, 49, 13, 10, + 48, 58, 48, 53, 50, 55, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 100,115,112,105,114,105,116, 58, 13, 10,100,115,112,105,114,105,116, 49, + 58, 13, 10,100,115,112,105,114,105,116, 50, 58, 13, 10, 48, 58, 52, 48, + 57, 50, 58, 51, 50, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 48,100, + 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103, 97,108, 97,103, + 97, 56, 56, 58, 13, 10,103, 97,108, 97,103, 56, 56, 98, 58, 13, 10,103, + 97,108, 97,103, 97, 56, 56,106, 58, 13, 10,103, 97,108, 97,103, 97, 56, + 56, 97, 58, 13, 10, 48, 58, 52, 97, 48,100, 58, 54, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 52, 98, 55, 53, 58, 54, 48, 58, 48, 48, 58, 48, 49, + 13, 10, 13, 10,113,117,101,115,116,101,114, 58, 13, 10, 48, 58, 51, 54, + 48, 58, 53, 48, 58, 48, 48, 58, 54, 48, 13, 10, 48, 58, 49, 51, 48, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,114,111,109,112,101,114,115, + 58, 13, 10,114,111,109,112,101,114,115,111, 58, 13, 10, 48, 58, 52, 48, + 49, 58, 52,102, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 49, 52, 51, 58, + 51, 58, 48, 48, 58, 56, 56, 13, 10, 48, 58, 49, 51, 97, 58, 56, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, + 97,109, 99,111,115, 50, 46, 99, 13, 10, 97,115,115, 97,117,108,116, 58, + 13, 10, 97,115,115, 97,117,108,116,106, 58, 13, 10, 97,115,115, 97,117, + 108,116,112, 58, 13, 10, 48, 58, 49, 48, 49, 56, 48, 48, 58, 52,100, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58, 49, 48, 48, 48, 53, 56, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 99,111,115,109,111,103,110,103, 58, + 13, 10, 99,111,115,109,111,103,110,103,106, 58, 13, 10, 48, 58, 49, 48, + 97, 48, 48, 51, 58,102, 55, 58, 48, 49, 58, 48,100, 13, 10, 48, 58, 49, + 48, 48, 56, 48,101, 58, 51, 99, 58, 48, 48, 58, 55, 48, 13, 10, 13, 10, + 114,116,104,117,110, 50, 58, 13, 10,114,116,104,117,110, 50,106, 58, 13, + 10, 48, 58, 49, 48, 54, 54,101, 56, 58, 54, 52, 58, 48, 48, 58, 52,102, + 13, 10, 48, 58, 49, 48, 48, 48, 50, 48, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,110, 97,109, 99,111, + 115, 56, 54, 46, 99, 13, 10,104,111,112,109, 97,112,112,121, 58, 13, 10, + 48, 58, 52, 99, 52, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 52, 99, 97, 48, 58, 56, 49, 58, 48, 48, 58, 54, 50, 13, 10, 48, 58, 50, + 48, 57,101, 58, 49, 58, 50,101, 58, 50,101, 13, 10, 48, 58, 50, 48, 97, + 48, 58, 49, 58, 50,101, 58, 50,101, 13, 10, 48, 58, 50, 48, 97, 50, 58, + 49, 58, 48, 56, 58, 48, 56, 13, 10, 48, 58, 50, 48, 97, 52, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 48, 97, 54, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 50, 48, 97, 56, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,114,116,104,117,110,100,101,114, 58, 13, 10,114,116, + 104,117,110,100,101,114, 49, 58, 13, 10,114,116,104,117,110,100,101,114, + 50, 58, 13, 10,114,116,104,117,110,100,101,114, 48, 58, 13, 10,114,116, + 104,117,110,100,101,114, 97, 58, 13, 10, 48, 58, 53, 52, 48, 48, 58, 50, + 51, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58, 53, 52, 53, 48, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 110,101,109,101,115,105,115, 46, 99, 13, 10, 99,105,116,121, 98,111,109, + 98, 58, 13, 10, 99,105,116,121, 98,111,109, 98,106, 58, 13, 10, 48, 58, + 56, 48, 55, 48, 48, 58, 53, 48, 58, 48, 48, 58, 50, 50, 13, 10, 48, 58, + 56, 48, 48, 53, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, + 48, 49, 53, 54, 58, 50,101, 58, 48, 49, 58, 53, 48, 13, 10, 13, 10,107, + 111,110, 97,109,105,103,116, 58, 13, 10, 48, 58, 54, 48, 49, 48, 53, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 49, 48, 54, 58, 50, + 58, 49, 48, 58, 48, 48, 13, 10, 48, 58, 54, 49, 52, 56, 48, 58, 51, 50, + 56, 58, 52, 97, 58, 48, 49, 13, 10, 13, 10,103,114, 97,100,105,117,115, + 58, 13, 10, 48, 58, 49, 57, 53,102, 48, 58, 56, 99, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 55, 48, 48, 57, 56, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 55, 48, 48, 57, 97, 58, 49, 58, 55, 51, 58, 55, 51, 13, + 10, 13, 10, 59, 42, 32,116,111,112, 32,115, 99,111,114,101, 32,110,111, + 116, 32,115, 97,118,101,100, 13, 10,110,121, 97,110,112, 97,110,105, 58, + 13, 10, 48, 58, 52, 50, 56, 48, 48, 58, 50, 56, 58, 48, 48, 58, 49, 48, + 13, 10, 13, 10,115, 97,108, 97,109, 97,110,100, 58, 13, 10,115, 97,108, + 97,109, 97,110,100,106, 58, 13, 10,108,105,102,101,102,114, 99,101, 58, + 13, 10,108,105,102,101,102,114, 99,101,106, 58, 13, 10, 48, 58, 48, 56, + 53, 48, 48, 48, 58, 54, 52, 58, 48, 48, 58, 49, 54, 13, 10, 48, 58, 48, + 56, 48, 48, 53, 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,110,105,110,106, 97,119, 46, 99, 13, 10, + 100, 97,114,105,117,115, 50, 58, 13, 10, 48, 58, 99, 50, 49, 54,101, 58, + 52, 52, 98, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10,100, 97,114,105,117, + 115, 50,100, 58, 13, 10,100, 97,114,105,117,115, 50,100,111, 58, 13, 10, + 115, 97,103, 97,105, 97, 58, 13, 10, 48, 58, 49, 48, 49, 48,102, 97, 58, + 52, 52, 98, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,110,111,118, 97, 50, 48, 48, 49, 46, 99, 13, 10, 59, 42, 42, 42, 42,110,111,116,101, 32,100,111,101,115,110,116, 32,115, 97,118, - 101, 32,116,111,112, 32,115, 99,111,114,101,115, 10,110,111,118, 97, 50, - 48, 48, 49,117, 58, 10,110,111,118, 97, 50, 48, 48, 49, 58, 10,110,111, - 118, 97, 50, 48, 48, 49,104, 58, 10, 48, 58, 97, 48, 97, 99, 58, 55, 58, - 50, 50, 58, 49, 52, 10, 48, 58,101, 48, 55,100, 58, 51, 55, 58, 48, 48, - 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,111,104,109,121, - 103,111,100, 46, 99, 10,110, 97,110, 97,109,101, 58, 10, 48, 58, 55, 48, - 101, 56, 49, 48, 58, 52,102, 58, 52,101, 58, 48, 48, 10, 10,111,104,109, - 121,103,111,100, 58, 10, 48, 58, 55, 48, 52, 52, 52, 48, 58,101, 56, 58, - 48, 49, 58, 48, 48, 10, 48, 58, 55, 48, 53, 57, 48, 48, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 10,114,111, 98,111,107,105,100, 58, 10, 48, 58,101, - 48, 97, 52, 58,102, 58, 48, 48, 58, 48, 48, 10, 48, 58,101, 48, 98, 51, - 58,102, 58, 52, 54, 58, 52, 57, 10, 48, 58,101, 48,100, 48, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10,114,111, 98,111,107,105,100,106, 58, 10,114, - 111, 98,111,107,105,100,106, 50, 58, 10,114,111, 98,111,107,105,100,106, - 51, 58, 10, 48, 58,101, 48, 97, 52, 58, 52, 49, 58, 48, 48, 58, 50, 48, - 10, 48, 58,101, 48,102, 51, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,111,109,101,103,114, 97, 99,101, 10,111, - 109,101,103,114, 97, 99,101, 58, 10,100,101,108,116,114, 97, 99,101, 58, - 10, 48, 58, 52, 51, 97, 57, 58, 55,101, 58, 53, 48, 58, 52, 56, 10, 48, - 58, 52, 98,101, 56, 58, 49, 58, 48, 56, 58, 48, 56, 10, 10, 99,114,117, - 115,104, 58, 10,109, 97,107,101,116,114, 97,120, 58, 10,109, 97,107,101, - 116,114,120, 98, 58, 10,107,111,114,111,115,117,107,101, 58, 10, 48, 58, - 52, 67, 56, 48, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 69, - 52, 48, 58, 49, 69, 58, 52, 66, 58, 48, 48, 10, 10, 99,114,117,115,104, - 50, 58, 10, 99,114,117,115,104, 51, 58, 10,109, 98,114,117,115,104, 58, - 10,112, 97,105,110,116,114,108,114, 58, 10, 99,114,117,115,104, 98,108, - 50, 58, 10, 99,114,117,115,104,115, 58, 10, 99,114,117,115,104, 98,108, - 51, 58, 10, 48, 58, 52, 51, 68, 50, 58, 48, 50, 58, 52, 57, 58, 52, 56, - 10, 48, 58, 52, 67, 56, 48, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 67,114,117,115,104, 32, 82,111,108,108,101, - 114, 32, 40, 75,117,114, 97,108, 32, 84, 87, 84, 41, 10, 99,114,117,115, - 104, 52, 58, 10, 48, 58, 52, 99, 56, 48, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 52, 99, 56, 51, 58, 49, 58, 48, 52, 58, 48, 52, 10, 10, 99, + 101, 32,116,111,112, 32,115, 99,111,114,101,115, 13, 10,110,111,118, 97, + 50, 48, 48, 49,117, 58, 13, 10,110,111,118, 97, 50, 48, 48, 49, 58, 13, + 10,110,111,118, 97, 50, 48, 48, 49,104, 58, 13, 10, 48, 58, 97, 48, 97, + 99, 58, 55, 58, 50, 50, 58, 49, 52, 13, 10, 48, 58,101, 48, 55,100, 58, + 51, 55, 58, 48, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,111,104,109,121,103,111,100, 46, 99, 13, 10,110, 97,110, 97, + 109,101, 58, 13, 10, 48, 58, 55, 48,101, 56, 49, 48, 58, 52,102, 58, 52, + 101, 58, 48, 48, 13, 10, 13, 10,111,104,109,121,103,111,100, 58, 13, 10, + 48, 58, 55, 48, 52, 52, 52, 48, 58,101, 56, 58, 48, 49, 58, 48, 48, 13, + 10, 48, 58, 55, 48, 53, 57, 48, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,114,111, 98,111,107,105,100, 58, 13, 10, 48, 58,101, 48, 97, + 52, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,101, 48, 98, 51, 58, + 102, 58, 52, 54, 58, 52, 57, 13, 10, 48, 58,101, 48,100, 48, 58, 52, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,114,111, 98,111,107,105,100,106, 58, + 13, 10,114,111, 98,111,107,105,100,106, 50, 58, 13, 10,114,111, 98,111, + 107,105,100,106, 51, 58, 13, 10, 48, 58,101, 48, 97, 52, 58, 52, 49, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58,101, 48,102, 51, 58, 51, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,111,109, + 101,103,114, 97, 99,101, 13, 10,111,109,101,103,114, 97, 99,101, 58, 13, + 10,100,101,108,116,114, 97, 99,101, 58, 13, 10, 48, 58, 52, 51, 97, 57, + 58, 55,101, 58, 53, 48, 58, 52, 56, 13, 10, 48, 58, 52, 98,101, 56, 58, + 49, 58, 48, 56, 58, 48, 56, 13, 10, 13, 10, 99,114,117,115,104, 58, 13, + 10,109, 97,107,101,116,114, 97,120, 58, 13, 10,109, 97,107,101,116,114, + 120, 98, 58, 13, 10,107,111,114,111,115,117,107,101, 58, 13, 10, 48, 58, + 52, 67, 56, 48, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, + 69, 52, 48, 58, 49, 69, 58, 52, 66, 58, 48, 48, 13, 10, 13, 10, 99,114, + 117,115,104, 50, 58, 13, 10, 99,114,117,115,104, 51, 58, 13, 10,109, 98, + 114,117,115,104, 58, 13, 10,112, 97,105,110,116,114,108,114, 58, 13, 10, + 99,114,117,115,104, 98,108, 50, 58, 13, 10, 99,114,117,115,104,115, 58, + 13, 10, 99,114,117,115,104, 98,108, 51, 58, 13, 10, 48, 58, 52, 51, 68, + 50, 58, 48, 50, 58, 52, 57, 58, 52, 56, 13, 10, 48, 58, 52, 67, 56, 48, + 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 67,114,117,115,104, 32, 82,111,108,108,101,114, 32, 40, 75,117, + 114, 97,108, 32, 84, 87, 84, 41, 13, 10, 99,114,117,115,104, 52, 58, 13, + 10, 48, 58, 52, 99, 56, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 52, 99, 56, 51, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, 13, 10, 99, 114,117,115,104, 98,108, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 67,114, 117,115,104, 32, 82,111,108,108,101,114, 32, 40, 98,111,111,116,108,101, - 103, 41, 10, 48, 58, 52,101, 52, 48, 58, 50,101, 58, 52, 56, 58, 48, 48, - 10, 48, 58, 52, 99, 56, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,109, - 114,116,110,116, 58, 10,103,111,114,107, 97,110,115, 58, 10, 48, 58, 52, - 99, 98, 51, 58, 51, 99, 58, 52, 99, 58, 48, 49, 10, 48, 58, 52, 51,101, - 100, 58, 54, 58, 48, 48, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,112,105,110,103,112,111,110,103, 46, 99, 10,112,105,110,103,112, - 111,110,103, 58, 10, 48, 58, 57, 52, 98, 49, 58, 51, 99, 58, 48, 50, 58, - 50, 51, 10, 48, 58, 57, 52, 57,101, 58, 51, 58, 48, 50, 58, 48, 48, 10, - 48, 58, 56, 52, 54,100, 58, 54, 58, 49, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,112,104,111,122,111,110, 46, 99, 10,112,104, - 111,122,111,110, 58, 10,112,104,111,122,111,110,115, 58, 10, 48, 58, 49, - 52, 48, 57, 58, 51, 48, 58, 48, 48, 58, 53, 57, 10, 48, 58, 49, 48, 53, - 100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 51,101,101, 58, 55, - 58, 51, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112, - 107,117,110,119, 97,114, 46, 99, 10,112,107,117,110,119, 97,114, 58, 10, - 112,107,117,110,119, 97,114,106, 58, 10, 48, 58, 99, 49, 56, 55, 58, 51, - 99, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49,100, 54, 58, 50, 58, 48, - 48, 58, 50, 48, 10, 48, 58, 99, 49,100, 56, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,111,121, 97,110, - 46, 99, 10,112,111,111,121, 97,110, 58, 10,112,111,111,121, 97,110,115, - 58, 10,112,111,111,116, 97,110, 58, 10, 48, 58, 56, 57, 99, 48, 58, 49, - 101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 97, 48, 48, 58, 49,101, 58, - 48, 48, 58, 48, 49, 10, 48, 58, 56,101, 48, 48, 58, 49,101, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 56, 56, 97, 56, 58, 51, 58, 48, 48, 58, 48, 49, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,119, 46, 99, 10,112, - 111,119, 58, 10,112,111,119,106, 58, 10, 48, 58, 52, 51,101, 56,101, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 49, 57, 49, 48, 58, 50, 58, - 48, 48, 58, 48, 49, 10, 48, 58, 52, 49, 57, 49, 50, 58, 52, 69, 58, 48, - 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,115,105, - 107,121,111, 46, 99, 10,103,117,110, 98,105,114,100, 58, 10,103,117,110, - 98,105,114,100,106, 58, 10,103,117,110, 98,105,114,100,107, 58, 10, 48, - 58,102,101, 51,100,100, 48, 58, 55, 53, 58, 48, 48, 58, 50,100, 10, 10, - 115,110,103,107, 97, 99,101, 58, 10,115,110,103,107, 97, 99,101, 97, 58, - 10, 48, 58,102,101, 55,100, 56, 56, 58, 57,101, 58, 48, 48, 58, 48, 52, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,115,121, 99,104,105, 99, - 53, 46, 99, 10,112,115,121, 99,104,105, 99, 53, 58, 10,112,115,121, 99, - 104,105, 99, 53, 97, 58, 10,112,115,121, 99,104,105, 99, 53,106, 58, 10, - 48, 58,102,100, 48, 48, 58, 51, 48, 58, 48, 48, 58, 53, 57, 10, 48, 58, - 102, 99, 56, 52, 58, 51, 58, 48, 48, 58, 53, 51, 10, 10,112,117,110, 99, - 104,111,117,116, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, - 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102,111, - 114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101, - 110,116,114,121, 93, 10,112,117,110, 99,104,105,116, 97, 58, 10,112,117, - 110, 99,104,111,117,116,106, 58, 10,112,117,110, 99,104,111,117,116, 97, - 58, 10, 48, 58,100, 54, 54, 48, 58, 53, 48, 58, 52, 49, 58, 48, 52, 10, - 10,115,112,110, 99,104,111,117,116, 58, 32, 59, 91, 83,112,101, 99,105, - 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, - 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116, - 104,105,115, 32,101,110,116,114,121, 93, 10,115,112,110, 99,104,111,117, - 116,106, 58, 10, 48, 58,100, 53, 99, 48, 58,102, 48, 58, 50, 49, 58, 48, - 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,113,119, 97,107,112,114, - 111,116, 46, 99, 10,113,119, 97,107,112,114,111,116, 58, 10,113,119, 97, - 107, 58, 10, 48, 58, 48, 48, 52, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 48, 49, 48, 56, 58, 51, 58, 52,100, 58, 52, 51, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,114, 97,105,100,101,110, 46, 99, 10,114, 97, - 105,100,101,110, 98, 58, 10, 48, 58, 48, 48, 48, 99, 50, 55, 58, 98, 51, - 58, 53, 48, 58, 50,101, 10, 10,114, 97,105,100,101,110,117, 97, 58, 10, - 48, 58, 48, 48, 48, 99, 52, 55, 58, 98, 51, 58, 53, 48, 58, 50,101, 10, - 10,114, 97,105,100,101,110, 97, 58, 10,114, 97,105,100,101,110,116, 58, - 10,114, 97,105,100,101,110, 58, 10,114, 97,105,100,101,110,107, 58, 10, - 114, 97,105,100,101,110,117, 58, 10, 48, 58, 48, 48, 48, 98,100, 55, 58, - 98, 52, 58, 53, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,114, 97,108,108,121,120, 46, 99, 10,114, 97,108,108,121,120, 58, 10, - 114, 97,108,108,121,120, 97, 58, 10,114, 97,108,108,121,120,109, 58, 10, - 110,114, 97,108,108,121,120, 58, 10,110,114, 97,108,108,121,120, 98, 58, - 10,114, 97,108,108,121,120,109,114, 58, 10, 48, 58, 56, 48, 54, 48, 58, - 56, 58, 48, 48, 58, 48, 50, 32, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,114,101,110,101,103, 97,100,101, 46, 99, 10,114,101,110,101,103, 97, - 100,101, 58, 10, 48, 58, 49, 48, 49, 98, 58, 50, 56, 58, 48, 48, 58, 52, - 99, 10, 48, 58, 50,101, 58, 51, 58, 48, 48, 58, 48, 53, 10, 10,102, 97, - 110,116, 97,115,121, 58, 10,102, 97,110,116, 97,115,121,106, 58, 10, 48, - 58, 48, 48, 50, 53, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 50, - 50, 48, 58, 51, 48, 58, 49, 49, 58, 51, 48, 10, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,114,111, 99,110,114,111,112,101, 46, 99, 10,114,111, - 99,110,114,111,112,101, 58, 10,114,111, 99,110,114,111,112,101,107, 58, - 10,114,111,112,101,109, 97,110, 58, 10, 48, 58, 53, 49, 54, 48, 58, 52, - 48, 58, 48, 49, 58, 48, 48, 10, 48, 58, 53, 48, 65, 54, 58, 48, 51, 58, - 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,111, - 108,108,114, 97, 99,101, 46, 99, 10,102,105,103,104,116,114,111,108, 58, - 10,114,111,108,108,114, 97, 99,101, 58, 10,114,111,108,108, 97, 99,101, - 58, 10, 48, 58, 99, 48, 54, 48, 58, 51,101, 58, 48, 48, 58, 49, 49, 10, - 48, 58, 99, 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,114,112,117,110, 99,104, 46, 99, 10,114,112, - 117,110, 99,104, 58, 10, 48, 58,102,102,101, 48, 49, 58, 55, 51, 58, 48, - 48, 58, 49, 55, 10, 10,114, 97, 98,105,111,108,101,112, 58, 10, 48, 58, - 102,102,101, 48, 49, 58, 55, 55, 58, 48, 48, 58, 56, 48, 10, 10, 97,114, - 109,111,114, 99, 97,114, 58, 10, 97,114,109,111,114, 99, 97,114, 50, 58, - 10, 48, 58, 56, 49, 49, 51, 58, 51, 99, 58, 48, 50, 58, 53, 48, 10, 10, - 114,101,115, 99,117,101, 58, 10, 97,112,111,110,111,119, 58, 10, 48, 58, - 56, 48,102, 51, 58, 51, 99, 58, 48, 49, 58, 52,100, 10, 10,114,101,115, - 99,117,101,102,101, 58, 10, 48, 58, 48, 54,102, 51, 58, 51, 99, 58, 48, - 49, 58, 52,100, 10, 10,115, 99,111, 98,114, 97, 58, 10,115, 99,111, 98, - 114, 97,115, 58, 10,115, 99,111, 98,114, 97, 98, 58, 10,115, 99,111, 98, - 114, 97,115,101, 58, 10,115, 99,111, 98,114, 97,101, 58, 10, 48, 58, 56, - 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 10, 48, 58, 56, 48, 97, - 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 10, 10,115,112,100, 99,111,105, - 110, 58, 10, 48, 58, 56, 48, 99,101, 58, 54, 56, 55, 58, 50, 53, 58, 48, - 48, 10, 48, 58, 56, 97, 52, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 56, 97, 54, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 97, - 56, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 97, 97, 50, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 97, 99, 50, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 56, 97,101, 50, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 56, 98, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, - 115,116,114, 97,116,103,121,120, 58, 10,115,116,114, 97,116,103,121,115, - 58, 10,115,116,114,111,110,103,120, 58, 10, 48, 58, 56, 48, 97, 56, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 49, 99, 48, 58, 49,101, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 56, 49,100, 99, 58, 49, 58, 49, 51, 58, - 49, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42,115, 99,114, 97,109, 98,108, - 101, 46, 99, 10, 97,116,108, 97,110,116,105,115, 58, 10, 97,116,108, 97, - 110,116,105,115, 50, 58, 10, 97,116,108, 97,110,116,105,115, 98, 58, 10, - 48, 58, 52, 48, 51,100, 58, 50, 99, 58, 48, 48, 58, 48, 48, 10, 10, 99, - 97,118,101,108,111,110, 58, 10, 48, 58, 52, 50,102,102, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 52, 51, 48, 52, 58, 48,100, 58, 48, 48, 58, - 49, 53, 10, 10,115, 99,114, 97,109, 98,108,101, 58, 32, 59, 91, 83,112, + 103, 41, 13, 10, 48, 58, 52,101, 52, 48, 58, 50,101, 58, 52, 56, 58, 48, + 48, 13, 10, 48, 58, 52, 99, 56, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,109,114,116,110,116, 58, 13, 10,103,111,114,107, 97,110,115, + 58, 13, 10, 48, 58, 52, 99, 98, 51, 58, 51, 99, 58, 52, 99, 58, 48, 49, + 13, 10, 48, 58, 52, 51,101,100, 58, 54, 58, 48, 48, 58, 52, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,105,110,103,112,111,110, + 103, 46, 99, 13, 10,112,105,110,103,112,111,110,103, 58, 13, 10, 48, 58, + 57, 52, 98, 49, 58, 51, 99, 58, 48, 50, 58, 50, 51, 13, 10, 48, 58, 57, + 52, 57,101, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, 58, 56, 52, 54, + 100, 58, 54, 58, 49, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, + 42, 42, 42, 42,112,104,111,122,111,110, 46, 99, 13, 10,112,104,111,122, + 111,110, 58, 13, 10,112,104,111,122,111,110,115, 58, 13, 10, 48, 58, 49, + 52, 48, 57, 58, 51, 48, 58, 48, 48, 58, 53, 57, 13, 10, 48, 58, 49, 48, + 53,100, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 51,101,101, + 58, 55, 58, 51, 48, 58, 50, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,112,107,117,110,119, 97,114, 46, 99, 13, 10,112,107,117,110, + 119, 97,114, 58, 13, 10,112,107,117,110,119, 97,114,106, 58, 13, 10, 48, + 58, 99, 49, 56, 55, 58, 51, 99, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 99, 49,100, 54, 58, 50, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, 49, + 100, 56, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,112,111,111,121, 97,110, 46, 99, 13, 10,112,111,111, + 121, 97,110, 58, 13, 10,112,111,111,121, 97,110,115, 58, 13, 10,112,111, + 111,116, 97,110, 58, 13, 10, 48, 58, 56, 57, 99, 48, 58, 49,101, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 48, 48, 58, 49,101, 58, 48, 48, + 58, 48, 49, 13, 10, 48, 58, 56,101, 48, 48, 58, 49,101, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 56, 56, 97, 56, 58, 51, 58, 48, 48, 58, 48, 49, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,111,119, 46, 99, + 13, 10,112,111,119, 58, 13, 10,112,111,119,106, 58, 13, 10, 48, 58, 52, + 51,101, 56,101, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 49, + 57, 49, 48, 58, 50, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 49, 57, + 49, 50, 58, 52, 69, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,112,115,105,107,121,111, 46, 99, 13, 10,103,117, + 110, 98,105,114,100, 58, 13, 10,103,117,110, 98,105,114,100,106, 58, 13, + 10,103,117,110, 98,105,114,100,107, 58, 13, 10, 48, 58,102,101, 51,100, + 100, 48, 58, 55, 53, 58, 48, 48, 58, 50,100, 13, 10, 13, 10,115,110,103, + 107, 97, 99,101, 58, 13, 10,115,110,103,107, 97, 99,101, 97, 58, 13, 10, + 48, 58,102,101, 55,100, 56, 56, 58, 57,101, 58, 48, 48, 58, 48, 52, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,112,115,121, 99,104,105, + 99, 53, 46, 99, 13, 10,112,115,121, 99,104,105, 99, 53, 58, 13, 10,112, + 115,121, 99,104,105, 99, 53, 97, 58, 13, 10,112,115,121, 99,104,105, 99, + 53,106, 58, 13, 10, 48, 58,102,100, 48, 48, 58, 51, 48, 58, 48, 48, 58, + 53, 57, 13, 10, 48, 58,102, 99, 56, 52, 58, 51, 58, 48, 48, 58, 53, 51, + 13, 10, 13, 10,112,117,110, 99,104,111,117,116, 58, 32, 59, 91, 83,112, 101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97, 110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110, - 103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10,115, 99,114, 97, - 109, 98,108,115, 58, 10,115, 99,114, 97,109, 98,108, 98, 58, 10,115, 99, - 114, 97,109, 98,108,101, 98,102, 58, 10,115, 99,114, 97,109, 98,108,101, - 98, 98, 58, 10, 98,111,109, 98,101,114, 58, 10,115, 99,114, 97,109, 98, - 108,101,115, 50, 58, 10,115, 99,114, 97,109, 98,108,101,114, 58, 10,115, - 99,114, 97,109, 98,112, 58, 10,115, 99,114, 97,109,112,116, 58, 10,115, - 99,114, 97,109,114,102, 58, 10,115, 99,114, 97,109, 99,101, 58, 10, 48, - 58, 52, 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 10, 48, 58, 52, - 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 10, 10,101,120,112,108, - 111,114,101,114, 58, 32, 10, 48, 58, 52, 50, 48, 48, 58, 49,101, 58, 52, - 57, 58, 48, 49, 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, - 48, 49, 10, 10,109, 97,114,115, 58, 10, 48, 58, 52, 50, 48, 48, 58, 49, - 50, 58, 48, 48, 58, 48, 49, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, - 48, 58, 48, 49, 10, 48, 58, 52, 97, 52, 49, 58, 49, 58, 49, 48, 58, 49, - 48, 10, 48, 58, 52, 97, 50, 49, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, - 58, 52, 97, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 57, - 101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 57, 99, 49, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 57, 97, 49, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 10,116,104,101,101,110,100, 58, 10,116,104,101,101, - 110,100,115, 58, 10, 48, 58, 52, 51, 99, 48, 58, 48,102, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 48, - 10, 10,115,112, 97, 99,102,117,114,121, 58, 10,115,112, 97, 99,102,117, - 114,121, 97, 58, 10, 48, 58, 99, 57, 50, 52, 58, 51,100, 58, 57, 48, 58, - 48, 48, 10, 48, 58, 99,102,100, 50, 58, 49,101, 58, 48, 48, 58, 48, 57, - 10, 10,115,116, 97,114,116,114,101,107, 58, 10, 48, 58, 99, 57, 49, 48, - 58, 55, 50, 58, 50, 53, 58, 51, 49, 10, 48, 58, 99, 57, 56, 98, 58, 49, - 98, 58, 53, 51, 58, 53, 48, 10, 10,116, 97, 99,115, 99, 97,110, 58, 10, - 48, 58, 99, 98, 52, 52, 58, 48,102, 58, 52,100, 58, 52, 56, 10, 48, 58, - 99, 98, 57, 53, 58, 48,102, 58, 48, 50, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,115,101,103, 97, 99, 50, 46, 99, 32, 10, 98,111, - 114,101,110, 99,104, 58, 10, 98,111,114,101,110, 99,104, 97, 58, 10, 48, - 58,102,102,102, 52, 49, 48, 58, 52, 52, 58, 52,100, 58, 48, 53, 10, 10, - 112,117,121,111,112,117,121,111, 58, 10,112,117,121,111, 58, 10,112,117, - 121,111,106, 58, 10,112,117,121,111,106, 97, 58, 10,112,117,121,111, 98, - 108, 58, 10,112,117,121,111,112,117,121, 97, 58, 10,112,117,121,111,112, - 117,121, 98, 58, 10, 48, 58,102,102,102, 99,101, 50, 58, 52, 99, 58, 49, - 51, 58, 57, 56, 10, 10,112,117,121,111,112,117,121, 50, 58, 10, 48, 58, - 102,102, 52, 56, 51, 48, 58, 52, 99, 58, 53, 51, 58, 57, 56, 10, 10,116, - 102,114, 99,101, 97, 99, 58, 10,116,102,114, 99,101, 97, 99, 98, 58, 10, - 116,102,114, 99,101, 97, 99,106, 58, 10, 48, 58,102,102, 56, 49, 48, 48, - 58,101, 52, 58, 48, 48, 58, 48, 57, 10, 48, 58,102,102,102, 49, 97, 99, - 58, 52, 58, 48, 48, 58, 49, 48, 10, 10,112,105,103,110,101,119,116, 58, - 10, 48, 58, 99,102,100, 50, 58, 49,101, 58, 53, 55, 58, 52,101, 10, 48, - 58, 99,101, 48, 99, 58, 54, 49, 58, 49, 50, 58, 54, 48, 10, 10,112,105, - 103,110,101,119,116, 97, 58, 10, 48, 58, 99,102,100, 50, 58, 49,101, 58, - 53, 55, 58, 52,101, 10, 48, 58, 99,101, 48, 99, 58, 54, 49, 58, 48, 50, - 58, 54, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,105, 99, - 114,111,115,115, 46, 99, 10,114, 97,100,114, 97,100, 58, 10, 48, 58, 55, - 56, 48, 50, 58, 51, 58, 48, 50, 58, 48, 48, 10, 48, 58, 57, 49, 98, 97, - 58, 54, 58, 50, 52, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,115,101,110,106,121,111, 46, 99, 10,115,101,110,106,121,111, 58, 10, - 48, 58, 56, 48, 54, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, - 48, 56, 48, 58, 51, 56, 58, 48, 48, 58, 48, 54, 10, 48, 58, 57, 50, 54, - 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 50, 52, 49, 58, 49, - 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, - 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, - 57, 49, 99, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 49, 97, - 49, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 49, 56, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 101,116, 97, 46, 99, 10, 97,114, 98, 97,108,101,115,116, 58, 10, 48, 58, - 102, 48, 49, 56, 99,100, 58, 56, 98, 58, 48, 48, 58, 49, 52, 10, 10,101, - 105,103,104,116,102,114, 99, 58, 10, 48, 58, 50, 48, 99, 53, 50, 54, 58, - 53,102, 58, 48, 48, 58, 52, 51, 10, 48, 58, 50, 48, 99, 53, 98,102, 58, - 49, 58, 55, 97, 58, 55, 97, 10, 10,111,105,115,105,112,117,122,108, 58, - 10, 48, 58, 50, 48,100, 50, 53,102, 58, 52,101, 58, 48, 48, 58, 49, 54, - 10, 10,109,101,116, 97,102,111,120, 58, 10, 48, 58,102, 48, 49, 52,101, - 54, 58, 56, 99, 58, 48, 48, 58, 49, 52, 10, 10,116,110,100,114, 99, 97, - 100,101, 58, 10,116,110,100,114, 99, 97,100,101,106, 58, 10, 48, 58,101, - 48, 48, 51, 48, 49, 58, 57, 54, 58, 48, 48, 58, 50,101, 10, 10,116,104, - 117,110,100,101,114,108, 58, 10,116,104,117,110,100,101,114,108, 98,108, - 58, 10, 48, 58,102,102,101, 49, 48, 56, 58, 99, 99, 58, 48, 48, 58, 52, - 49, 10, 10,116,119,105,110,101, 97,103,108, 58, 10, 48, 58,102,102, 99, - 48, 57, 99, 58, 51, 98, 58, 48, 48, 58, 50,101, 10, 10,119,114,111,102, - 97,101,114,111, 58, 10, 48, 58, 51, 48, 48, 54, 97, 52, 58, 55, 49, 58, - 48, 48, 58, 51,102, 10, 10,122,105,110,103,122,105,112, 58, 10, 48, 58, - 50, 48, 50, 56,102,100, 58, 54, 57, 58, 48, 48, 58, 97, 50, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97,111,108,105,110,115, 46, 99, - 10,107,105, 99,107,101,114, 58, 10,115,104, 97,111,108,105,110,115, 58, - 10,115,104, 97,111,108,105,110, 98, 58, 10, 48, 58, 50, 97,102, 49, 58, - 50, 58, 48, 50, 58, 53, 56, 10, 48, 58, 50, 97,102, 51, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 50, 98, 48, 48, 58, 51,101, 58, 49,100, 58, - 48, 49, 10, 48, 58, 50, 98, 51,101, 58, 50, 58, 48, 48, 58, 48, 48, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, 97,114,107, 97,116,116, - 46, 99, 10,115,104, 97,114,107, 97,116,116, 58, 10, 48, 58, 56, 48, 54, - 101, 58, 53, 48, 58, 51, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,115,105,100,101, 97,114,109,115, 46, 99, 32, 10,100,121,103, - 101,114, 58, 10,100,121,103,101,114, 97, 58, 10, 48, 58, 99, 48,100, 48, - 58, 50, 51, 58, 51, 55, 58, 48, 54, 10, 48, 58, 99, 48, 56, 54, 58, 50, - 58, 51, 55, 58, 51, 55, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 105,100,101,112, 99,107,116, 46, 99, 10,115,105,100,101,112, 99,107,116, - 58, 10,115,105,100,101,112, 99,107,116, 98, 58, 10,115,105,100,101,112, - 99,107,116,106, 58, 10, 48, 58, 97, 48,101, 58, 51, 50, 58, 49, 49, 58, - 53, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,107,121,102,111, - 120, 46, 99, 10,115,107,121,102,111,120, 58, 10, 48, 58,100,101, 48, 48, - 58, 97, 58, 48, 48, 58, 48, 48, 10, 48, 58,100,102, 48, 48, 58, 50, 51, - 58, 48, 48, 58, 48, 48, 10, 10,101,120,101,114,105,122,101,114, 98, 58, - 10,101,120,101,114,105,122,101,114, 58, 10, 48, 58,100,101, 48, 48, 58, - 97, 58, 48, 48, 58, 48, 48, 10, 48, 58,100,102, 48, 48, 58, 50, 56, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 68, 51, 53, 54, 58, 49, 58, 65, 48, 58, - 65, 48, 10, 48, 58, 68, 51, 53, 65, 58, 49, 58, 65, 48, 58, 65, 48, 10, - 48, 58, 68, 51, 53, 69, 58, 49, 58, 65, 48, 58, 65, 48, 10, 48, 58, 68, - 51, 54, 50, 58, 49, 58, 65, 48, 58, 65, 48, 10, 48, 58, 68, 51, 54, 54, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 68, 51, 54, 65, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,110, - 107, 46, 99, 10, 97,115,111, 58, 10, 48, 58,100, 56, 51, 98, 58, 56, 50, - 58, 48, 48, 58, 50, 48, 10, 48, 58,101, 55, 55, 55, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 10, 97,114,105, 97,110, 58, 10, 48, 58,100, 56, 51, 98, - 58, 56, 50, 58, 48, 48, 58, 50, 48, 10, 48, 58,101,101, 55, 55, 97, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10,102,105,116,101,103,111,108,102, 58, - 10,102,105,116,101,103,111,108,102, 50, 58, 10,102,105,116,101,103,111, - 108,102,117, 58, 10, 48, 58,102,102, 55, 48, 58, 53, 48, 58, 53, 51, 58, - 49, 52, 10, 10,116,110,107, 51, 58, 10,116,110,107, 51,106, 58, 10, 48, - 58,102,101,100, 49, 58, 56, 50, 58, 49, 51, 58, 50, 48, 10, 48, 58,102, - 99, 53, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,118,105, 99,116,114, - 111, 97,100, 58, 10,100,111,103,111,115,111,107,101, 58, 10,100,111,103, - 111,115,111,107, 98, 58, 10, 48, 58,102,102, 50, 99, 58, 53, 48, 58, 48, - 48, 58, 53, 53, 10, 48, 58,102, 99, 53,102, 58, 51, 58, 48, 48, 58, 48, - 48, 10, 10,103,119, 97,114, 58, 10,103,119, 97,114,106, 58, 10,103,119, - 97,114, 97, 58, 10,103,119, 97,114, 98, 58, 10, 48, 58,101, 52, 98, 57, - 58, 53, 48, 58, 48, 48, 58, 53, 50, 10, 48, 58,101, 51, 97,101, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 10, 98,101,114,109,117,100, 97,116, 58, 10, - 98,101,114,109,117,100, 97,116,106, 58, 10, 48, 58,102,101, 98,101, 58, - 53, 48, 58, 48, 48, 58, 52,102, 10, 48, 58,101, 51, 99,101, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 10, 98,101,114,109,117,100, 97,116, 97, 58, 10, - 48, 58,102,101, 99, 50, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, 48, 58, - 101, 51, 99,101, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,119,111,114,108, - 100,119, 97,114, 58, 10, 48, 58,102,101, 99, 50, 58, 53, 48, 58, 48, 48, - 58, 52, 52, 10, 48, 58,101, 51, 99,101, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 10,112,115,121, 99,104,111,115, 58, 10,112,115,121, 99,104,111,115, - 106, 58, 10, 48, 58,100,100, 48, 53, 58,102, 53, 58, 51, 49, 58,102,102, - 10, 48, 58,102,101, 54, 54, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 99, - 104,111,112,112,101,114, 58, 10,108,101,103,111,102, 97,105,114, 58, 10, - 99,104,111,112,112,101,114, 97, 58, 10, 99,104,111,112,112,101,114, 98, - 58, 10, 48, 58,101, 52, 99, 53, 58, 51, 99, 58, 48, 48, 58, 52, 98, 10, - 48, 58,101, 52, 54, 50, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,116,100, - 102,101,118,101,114, 58, 10,116,100,102,101,118,101,114,106, 58, 10,116, - 100,102,101,118,101,114, 50, 58, 10, 48, 58,100,102, 50, 56, 58, 50, 56, - 58, 99, 53, 58, 48, 48, 10, 10,102,115,111, 99, 99,101,114, 58, 10, 48, - 58,101, 51, 52, 57, 58, 49, 52, 58, 52, 56, 58, 48, 49, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,115,111,110,115,111,110, 46, 99, 10,115,111, - 110,115,111,110, 58, 10,115,111,110,115,111,110,106, 58, 10, 48, 58,100, - 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 48, 48, 58, 54, 52, - 58, 48, 48, 58, 49,100, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 111,108,111,109,111,110, 46, 99, 10,115,111,108,111,109,111,110, 58, 10, - 115,111,108,111,109,111,110,106, 58, 10, 48, 58, 99, 97, 52, 99, 58, 53, - 97, 58, 53, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 115,114,117,109, 98,108,101,114, 46, 99, 10,115,114,117,109, 98,108,101, - 114, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116,104, 97,110,107, - 115, 32,116,111, 32, 87,111, 98, 32,102,111,114, 32,101,110,104, 97,110, - 99,105,110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10,115, - 114,117,109, 98,108,101,114, 50, 58, 10,114,117,115,104, 99,114,115,104, - 58, 10,115,114,117,109, 98,108,101,114, 51, 58, 10, 48, 58, 49, 99, 57, - 52, 58, 55, 48, 58, 53, 52, 58,102, 50, 10, 48, 58, 97, 97, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,116, - 97,114,119, 97,114,115, 46, 99, 10,101,115, 98, 58, 10, 48, 58, 52, 98, - 51,102, 58, 97,102, 58, 48,102, 58, 57, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,115,112,100,111,100,103,101, 98, 46, 99, 10,115,112,100, - 111,100,103,101, 98, 58, 10,110,107,100,111,100,103,101, 58, 10,110,107, - 100,111,100,103,101, 98, 58, 10, 48, 58, 56, 51, 58, 51, 58, 48, 48, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,112,101,114, - 109, 97,110, 46, 99, 10, 98, 97,108,108, 98,114,111,115, 58, 10, 48, 58, - 102, 48, 48,101, 98,101, 58, 54, 51, 58, 48, 48, 58, 50, 48, 10, 10,116, - 119,105,110,104, 97,119,107, 58, 32, 32, 59, 42, 42, 42, 42, 42, 32,116, - 111,112, 32,115, 99,111,114, 32,117,112,100, 97,116,101,115, 32,111,110, - 32,103, 97,109,101, 32,115,116, 97,114,116, 32, 42, 42, 42, 42, 42, 10, - 116,119,105,110,104, 97,119,107,117, 58, 10,100, 97,105,115,101,110,112, - 117, 58, 10, 48, 58,102, 48, 48, 49, 51, 50, 58, 52, 48, 58, 48, 48, 58, - 97, 97, 10, 10,103,105,103, 97,110,100,101,115, 58, 10, 48, 58,102, 48, - 48, 97, 56, 54, 58, 53, 55, 58, 48, 48, 58, 52,101, 10, 48, 58,102, 48, - 48, 57, 54, 52, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,103,105,103, 97, - 110,100,101,115, 97, 58, 10, 48, 58,102, 48, 48, 97, 56, 54, 58, 53, 51, - 58, 48, 48, 58, 53, 50, 10, 48, 58,102, 48, 48, 57, 54, 52, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117, - 112,101,114,112, 97, 99, 46, 99, 10,115,117,112,101,114,112, 97, 99, 58, - 10,115,117,112,101,114,112, 97, 99,109, 58, 10, 48, 58, 49, 49, 51, 56, - 58, 50, 56, 58, 48, 48, 58, 50, 48, 10, 48, 58, 49, 48, 56, 55, 58, 51, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 51,101,101, 58, 55, 58, 51, 48, 58, - 50, 48, 10, 10,112, 97, 99,110,112, 97,108, 58, 10,112, 97, 99,110, 99, - 104,109,112, 58, 10,112, 97, 99,110,112, 97,108, 50, 58, 32, 10, 48, 58, - 49, 48, 52, 99, 58, 50, 56, 58, 48, 48, 58, 50, 51, 10, 48, 58, 49, 49, - 54,100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51,101,100, 58, 55, - 58, 48, 48, 58, 50, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, - 117,112,101,114,113,105,120, 46, 99, 10,115,113,105,120, 98,108, 58, 10, - 48, 58,102, 52, 99, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 10, 48, 58, - 102, 56,102, 49, 58, 52, 58, 55, 53, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,115,117,114,112,114, 97,116,107, 46, 99, 10, 59, 42, - 32,121,111,117, 32,109,117,115,116, 32,101,120,105,116, 32,116,104,105, - 115, 32,103, 97,109,101, 32,119,104,105,108,101, 32,105,110, 45,103, 97, - 109,101, 32,116,111,112, 32,115, 99,111,114,101, 32,105,115, 32,100,105, - 115,112,108, 97,121,105,110,103, 32, 40,110,111,116, 32,104,105,103,104, - 115, 99,111,114,101, 32,116, 97, 98,108,101, 41, 42, 10, 59, 42, 32,102, - 111,114, 32,105,110, 45,103, 97,109,101, 32,116,111,112, 32,115, 99,111, - 114,101, 32,116,111, 32,115, 97,118,101, 32, 99,111,114,114,101, 99,116, - 108,121, 40, 98,101, 99, 97,117,115,101, 32,111,102, 32,119, 97,121, 32, - 103, 97,109,101, 32,117,115,101,115, 32,118,105,100,101,111,114, 97,109, - 41, 10,115,117,114,112,114, 97,116,107, 58, 10, 48, 58, 98, 48, 48, 58, - 53, 97, 58, 49, 49, 58, 51, 49, 10, 48, 58, 53, 57, 56, 48, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 57,101, 58, 54, 58, 48, 49, 58, - 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101, - 109, 49, 46, 99, 10, 52,100,119, 97,114,114,105,111, 58, 32, 59, 91, 83, - 112,101, 99,105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, - 97,110, 97,110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105, - 110,103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 10, 48, 58,100, - 51, 48, 48, 58, 97, 48, 58, 48, 48, 58, 50, 48, 10, 48, 58, 99, 48, 49, - 55, 58, 51, 58, 48, 48, 58, 48, 50, 10, 10, 99,104,111,112,108,105,102, - 116,117, 58, 10, 99,104,112,108,102,116, 98,108, 58, 10, 99,104,111,112, - 108,105,102,116, 58, 10, 99,104,111,112,108,105,102,116, 98,108, 58, 10, - 48, 58,101,102, 48, 48, 58, 51, 49, 58, 48, 48, 58, 52, 98, 10, 48, 58, - 101,102, 55, 49, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,104,118,121,109, - 101,116, 97,108, 58, 10, 48, 58,100, 51, 48, 48, 58, 51, 56, 58, 48, 48, - 58, 53, 57, 10, 48, 58, 99, 48, 48, 99, 58, 51, 58, 48, 48, 58, 48, 48, - 10, 10,109,121,104,101,114,111, 58, 10, 48, 58,100, 51, 48, 48, 58, 51, - 99, 58, 48, 48, 58, 52, 57, 10, 48, 58, 99, 48, 49, 55, 58, 51, 58, 48, - 48, 58, 48, 48, 10, 10,109,121,104,101,114,111,107, 58, 10,115,115, 99, - 97,110,100, 97,108, 58, 10,109,121,104,101,114,111, 98,108, 58, 10, 48, - 58,100, 51, 48, 48, 58, 97, 48, 58, 48, 48, 58, 50, 48, 10, 48, 58, 99, - 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,115,119, 97,116, 58, - 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 52, 57, 10, 48, - 58, 99, 48, 49, 52, 58, 51, 58, 48, 48, 58, 48, 50, 10, 10,119, 98,111, - 121, 58, 10,119, 98,111,121, 50, 58, 10,119, 98,111,121, 51, 58, 10,119, - 98,111,121, 52, 58, 10,119, 98,111,121, 52,117, 58, 10,119, 98,111,121, - 117, 58, 32, 59, 42,110,111,116,101, 42, 32,111,110,108,121, 32, 49, 47, - 50, 32,119,111,114,107,115, 46, 46, 46, 32, 10,119, 98,100,101,108,117, - 120,101, 58, 10,119, 98,111,121,111, 58, 10,119, 98,111,121, 50,117, 58, - 10,119, 98,111,121, 53, 58, 10, 48, 58, 99, 49, 48, 48, 58, 49, 52, 48, - 58, 50, 48, 58, 50, 48, 10, 48, 58,101, 56, 53, 54, 58,102, 58, 48, 49, - 58, 49, 48, 10, 10,119, 98,111,121,115,121,115, 50, 58, 32, 32, 59, 42, + 103, 32,116,104,105,115, 32,101,110,116,114,121, 93, 13, 10,112,117,110, + 99,104,105,116, 97, 58, 13, 10,112,117,110, 99,104,111,117,116,106, 58, + 13, 10,112,117,110, 99,104,111,117,116, 97, 58, 13, 10, 48, 58,100, 54, + 54, 48, 58, 53, 48, 58, 52, 49, 58, 48, 52, 13, 10, 13, 10,115,112,110, + 99,104,111,117,116, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, 32,116, + 104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97,115, 32,102, + 111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32, + 101,110,116,114,121, 93, 13, 10,115,112,110, 99,104,111,117,116,106, 58, + 13, 10, 48, 58,100, 53, 99, 48, 58,102, 48, 58, 50, 49, 58, 48, 52, 13, + 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,113,119, 97,107,112,114, + 111,116, 46, 99, 13, 10,113,119, 97,107,112,114,111,116, 58, 13, 10,113, + 119, 97,107, 58, 13, 10, 48, 58, 48, 48, 52, 53, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 48, 49, 48, 56, 58, 51, 58, 52,100, 58, 52, 51, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114, 97,105,100,101, + 110, 46, 99, 13, 10,114, 97,105,100,101,110, 98, 58, 13, 10, 48, 58, 48, + 48, 48, 99, 50, 55, 58, 98, 51, 58, 53, 48, 58, 50,101, 13, 10, 13, 10, + 114, 97,105,100,101,110,117, 97, 58, 13, 10, 48, 58, 48, 48, 48, 99, 52, + 55, 58, 98, 51, 58, 53, 48, 58, 50,101, 13, 10, 13, 10,114, 97,105,100, + 101,110, 97, 58, 13, 10,114, 97,105,100,101,110,116, 58, 13, 10,114, 97, + 105,100,101,110, 58, 13, 10,114, 97,105,100,101,110,107, 58, 13, 10,114, + 97,105,100,101,110,117, 58, 13, 10, 48, 58, 48, 48, 48, 98,100, 55, 58, + 98, 52, 58, 53, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,114, 97,108,108,121,120, 46, 99, 13, 10,114, 97,108,108,121, + 120, 58, 13, 10,114, 97,108,108,121,120, 97, 58, 13, 10,114, 97,108,108, + 121,120,109, 58, 13, 10,110,114, 97,108,108,121,120, 58, 13, 10,110,114, + 97,108,108,121,120, 98, 58, 13, 10,114, 97,108,108,121,120,109,114, 58, + 13, 10, 48, 58, 56, 48, 54, 48, 58, 56, 58, 48, 48, 58, 48, 50, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,114,101,110,101,103, 97,100, + 101, 46, 99, 13, 10,114,101,110,101,103, 97,100,101, 58, 13, 10, 48, 58, + 49, 48, 49, 98, 58, 50, 56, 58, 48, 48, 58, 52, 99, 13, 10, 48, 58, 50, + 101, 58, 51, 58, 48, 48, 58, 48, 53, 13, 10, 13, 10,102, 97,110,116, 97, + 115,121, 58, 13, 10,102, 97,110,116, 97,115,121,106, 58, 13, 10, 48, 58, + 48, 48, 50, 53, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 50, + 50, 48, 58, 51, 48, 58, 49, 49, 58, 51, 48, 13, 10, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,114,111, 99,110,114,111,112,101, 46, 99, + 13, 10,114,111, 99,110,114,111,112,101, 58, 13, 10,114,111, 99,110,114, + 111,112,101,107, 58, 13, 10,114,111,112,101,109, 97,110, 58, 13, 10, 48, + 58, 53, 49, 54, 48, 58, 52, 48, 58, 48, 49, 58, 48, 48, 13, 10, 48, 58, + 53, 48, 65, 54, 58, 48, 51, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,114,111,108,108,114, 97, 99,101, 46, 99, + 13, 10,102,105,103,104,116,114,111,108, 58, 13, 10,114,111,108,108,114, + 97, 99,101, 58, 13, 10,114,111,108,108, 97, 99,101, 58, 13, 10, 48, 58, + 99, 48, 54, 48, 58, 51,101, 58, 48, 48, 58, 49, 49, 13, 10, 48, 58, 99, + 48, 50, 54, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,114,112,117,110, 99,104, 46, 99, 13, 10,114,112, + 117,110, 99,104, 58, 13, 10, 48, 58,102,102,101, 48, 49, 58, 55, 51, 58, + 48, 48, 58, 49, 55, 13, 10, 13, 10,114, 97, 98,105,111,108,101,112, 58, + 13, 10, 48, 58,102,102,101, 48, 49, 58, 55, 55, 58, 48, 48, 58, 56, 48, + 13, 10, 13, 10, 97,114,109,111,114, 99, 97,114, 58, 13, 10, 97,114,109, + 111,114, 99, 97,114, 50, 58, 13, 10, 48, 58, 56, 49, 49, 51, 58, 51, 99, + 58, 48, 50, 58, 53, 48, 13, 10, 13, 10,114,101,115, 99,117,101, 58, 13, + 10, 97,112,111,110,111,119, 58, 13, 10, 48, 58, 56, 48,102, 51, 58, 51, + 99, 58, 48, 49, 58, 52,100, 13, 10, 13, 10,114,101,115, 99,117,101,102, + 101, 58, 13, 10, 48, 58, 48, 54,102, 51, 58, 51, 99, 58, 48, 49, 58, 52, + 100, 13, 10, 13, 10,115, 99,111, 98,114, 97, 58, 13, 10,115, 99,111, 98, + 114, 97,115, 58, 13, 10,115, 99,111, 98,114, 97, 98, 58, 13, 10,115, 99, + 111, 98,114, 97,115,101, 58, 13, 10,115, 99,111, 98,114, 97,101, 58, 13, + 10, 48, 58, 56, 50, 48, 48, 58, 49,101, 58, 48, 48, 58, 48, 49, 13, 10, + 48, 58, 56, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 13, 10, 13, + 10,115,112,100, 99,111,105,110, 58, 13, 10, 48, 58, 56, 48, 99,101, 58, + 54, 56, 55, 58, 50, 53, 58, 48, 48, 13, 10, 48, 58, 56, 97, 52, 50, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 54, 50, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 97, 56, 50, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 56, 97, 97, 50, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 56, 97, 99, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 56, 97,101, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 56, 98, 48, 50, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115, + 116,114, 97,116,103,121,120, 58, 13, 10,115,116,114, 97,116,103,121,115, + 58, 13, 10,115,116,114,111,110,103,120, 58, 13, 10, 48, 58, 56, 48, 97, + 56, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 49, 99, 48, 58, + 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 49,100, 99, 58, 49, + 58, 49, 51, 58, 49, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,115, + 99,114, 97,109, 98,108,101, 46, 99, 13, 10, 97,116,108, 97,110,116,105, + 115, 58, 13, 10, 97,116,108, 97,110,116,105,115, 50, 58, 13, 10, 97,116, + 108, 97,110,116,105,115, 98, 58, 13, 10, 48, 58, 52, 48, 51,100, 58, 50, + 99, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 99, 97,118,101,108,111,110, + 58, 13, 10, 48, 58, 52, 50,102,102, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 52, 51, 48, 52, 58, 48,100, 58, 48, 48, 58, 49, 53, 13, 10, + 13, 10,115, 99,114, 97,109, 98,108,101, 58, 32, 59, 91, 83,112,101, 99, + 105, 97,108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97, + 110, 97,115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32, + 116,104,105,115, 32,101,110,116,114,121, 93, 13, 10,115, 99,114, 97,109, + 98,108,115, 58, 13, 10,115, 99,114, 97,109, 98,108, 98, 58, 13, 10,115, + 99,114, 97,109, 98,108,101, 98,102, 58, 13, 10,115, 99,114, 97,109, 98, + 108,101, 98, 98, 58, 13, 10, 98,111,109, 98,101,114, 58, 13, 10,115, 99, + 114, 97,109, 98,108,101,115, 50, 58, 13, 10,115, 99,114, 97,109, 98,108, + 101,114, 58, 13, 10,115, 99,114, 97,109, 98,112, 58, 13, 10,115, 99,114, + 97,109,112,116, 58, 13, 10,115, 99,114, 97,109,114,102, 58, 13, 10,115, + 99,114, 97,109, 99,101, 58, 13, 10, 48, 58, 52, 50, 48, 48, 58, 49,101, + 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, + 48, 48, 58, 48, 49, 13, 10, 13, 10,101,120,112,108,111,114,101,114, 58, + 13, 10, 48, 58, 52, 50, 48, 48, 58, 49,101, 58, 52, 57, 58, 48, 49, 13, + 10, 48, 58, 52, 48, 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 49, 13, 10, + 13, 10,109, 97,114,115, 58, 13, 10, 48, 58, 52, 50, 48, 48, 58, 49, 50, + 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 52, 48, 97, 56, 58, 51, 58, 48, + 48, 58, 48, 49, 13, 10, 48, 58, 52, 97, 52, 49, 58, 49, 58, 49, 48, 58, + 49, 48, 13, 10, 48, 58, 52, 97, 50, 49, 58, 49, 58, 48, 49, 58, 48, 49, + 13, 10, 48, 58, 52, 97, 48, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 52, 57,101, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 52, 57, 99, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 57, + 97, 49, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,104,101,101, + 110,100, 58, 13, 10,116,104,101,101,110,100,115, 58, 13, 10, 48, 58, 52, + 51, 99, 48, 58, 48,102, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 52, 48, + 97, 56, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,112, 97, + 99,102,117,114,121, 58, 13, 10,115,112, 97, 99,102,117,114,121, 97, 58, + 13, 10, 48, 58, 99, 57, 50, 52, 58, 51,100, 58, 57, 48, 58, 48, 48, 13, + 10, 48, 58, 99,102,100, 50, 58, 49,101, 58, 48, 48, 58, 48, 57, 13, 10, + 13, 10,115,116, 97,114,116,114,101,107, 58, 13, 10, 48, 58, 99, 57, 49, + 48, 58, 55, 50, 58, 50, 53, 58, 51, 49, 13, 10, 48, 58, 99, 57, 56, 98, + 58, 49, 98, 58, 53, 51, 58, 53, 48, 13, 10, 13, 10,116, 97, 99,115, 99, + 97,110, 58, 13, 10, 48, 58, 99, 98, 52, 52, 58, 48,102, 58, 52,100, 58, + 52, 56, 13, 10, 48, 58, 99, 98, 57, 53, 58, 48,102, 58, 48, 50, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101,103, 97, + 99, 50, 46, 99, 13, 10, 98,111,114,101,110, 99,104, 58, 13, 10, 98,111, + 114,101,110, 99,104, 97, 58, 13, 10, 48, 58,102,102,102, 52, 49, 48, 58, + 52, 52, 58, 52,100, 58, 48, 53, 13, 10, 13, 10,112,117,121,111,112,117, + 121,111, 58, 13, 10,112,117,121,111, 58, 13, 10,112,117,121,111,106, 58, + 13, 10,112,117,121,111,106, 97, 58, 13, 10,112,117,121,111, 98,108, 58, + 13, 10,112,117,121,111,112,117,121, 97, 58, 13, 10,112,117,121,111,112, + 117,121, 98, 58, 13, 10, 48, 58,102,102,102, 99,101, 50, 58, 52, 99, 58, + 49, 51, 58, 57, 56, 13, 10, 13, 10,112,117,121,111,112,117,121, 50, 58, + 13, 10, 48, 58,102,102, 52, 56, 51, 48, 58, 52, 99, 58, 53, 51, 58, 57, + 56, 13, 10, 13, 10,116,102,114, 99,101, 97, 99, 58, 13, 10,116,102,114, + 99,101, 97, 99, 98, 58, 13, 10,116,102,114, 99,101, 97, 99,106, 58, 13, + 10, 48, 58,102,102, 56, 49, 48, 48, 58,101, 52, 58, 48, 48, 58, 48, 57, + 13, 10, 48, 58,102,102,102, 49, 97, 99, 58, 52, 58, 48, 48, 58, 49, 48, + 13, 10, 13, 10,112,105,103,110,101,119,116, 58, 13, 10, 48, 58, 99,102, + 100, 50, 58, 49,101, 58, 53, 55, 58, 52,101, 13, 10, 48, 58, 99,101, 48, + 99, 58, 54, 49, 58, 49, 50, 58, 54, 48, 13, 10, 13, 10,112,105,103,110, + 101,119,116, 97, 58, 13, 10, 48, 58, 99,102,100, 50, 58, 49,101, 58, 53, + 55, 58, 52,101, 13, 10, 48, 58, 99,101, 48, 99, 58, 54, 49, 58, 48, 50, + 58, 54, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,101, + 105, 99,114,111,115,115, 46, 99, 13, 10,114, 97,100,114, 97,100, 58, 13, + 10, 48, 58, 55, 56, 48, 50, 58, 51, 58, 48, 50, 58, 48, 48, 13, 10, 48, + 58, 57, 49, 98, 97, 58, 54, 58, 50, 52, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,115,101,110,106,121,111, 46, 99, 13, 10, + 115,101,110,106,121,111, 58, 13, 10, 48, 58, 56, 48, 54, 48, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 56, 48, 58, 51, 56, 58, 48, + 48, 58, 48, 54, 13, 10, 48, 58, 57, 50, 54, 49, 58, 49, 58, 50, 52, 58, + 50, 52, 13, 10, 48, 58, 57, 50, 52, 49, 58, 49, 58, 50, 52, 58, 50, 52, + 13, 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, + 48, 58, 57, 50, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, + 57, 49,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, + 99, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 97, 49, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 49, 56, 49, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,115,101,116, 97, 46, 99, 13, 10, 97,114, 98, 97,108,101,115,116, 58, + 13, 10, 48, 58,102, 48, 49, 56, 99,100, 58, 56, 98, 58, 48, 48, 58, 49, + 52, 13, 10, 13, 10,101,105,103,104,116,102,114, 99, 58, 13, 10, 48, 58, + 50, 48, 99, 53, 50, 54, 58, 53,102, 58, 48, 48, 58, 52, 51, 13, 10, 48, + 58, 50, 48, 99, 53, 98,102, 58, 49, 58, 55, 97, 58, 55, 97, 13, 10, 13, + 10,111,105,115,105,112,117,122,108, 58, 13, 10, 48, 58, 50, 48,100, 50, + 53,102, 58, 52,101, 58, 48, 48, 58, 49, 54, 13, 10, 13, 10,109,101,116, + 97,102,111,120, 58, 13, 10, 48, 58,102, 48, 49, 52,101, 54, 58, 56, 99, + 58, 48, 48, 58, 49, 52, 13, 10, 13, 10,116,110,100,114, 99, 97,100,101, + 58, 13, 10,116,110,100,114, 99, 97,100,101,106, 58, 13, 10, 48, 58,101, + 48, 48, 51, 48, 49, 58, 57, 54, 58, 48, 48, 58, 50,101, 13, 10, 13, 10, + 116,104,117,110,100,101,114,108, 58, 13, 10,116,104,117,110,100,101,114, + 108, 98,108, 58, 13, 10, 48, 58,102,102,101, 49, 48, 56, 58, 99, 99, 58, + 48, 48, 58, 52, 49, 13, 10, 13, 10,116,119,105,110,101, 97,103,108, 58, + 13, 10, 48, 58,102,102, 99, 48, 57, 99, 58, 51, 98, 58, 48, 48, 58, 50, + 101, 13, 10, 13, 10,119,114,111,102, 97,101,114,111, 58, 13, 10, 48, 58, + 51, 48, 48, 54, 97, 52, 58, 55, 49, 58, 48, 48, 58, 51,102, 13, 10, 13, + 10,122,105,110,103,122,105,112, 58, 13, 10, 48, 58, 50, 48, 50, 56,102, + 100, 58, 54, 57, 58, 48, 48, 58, 97, 50, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,115,104, 97,111,108,105,110,115, 46, 99, 13, 10,107, + 105, 99,107,101,114, 58, 13, 10,115,104, 97,111,108,105,110,115, 58, 13, + 10,115,104, 97,111,108,105,110, 98, 58, 13, 10, 48, 58, 50, 97,102, 49, + 58, 50, 58, 48, 50, 58, 53, 56, 13, 10, 48, 58, 50, 97,102, 51, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 50, 98, 48, 48, 58, 51,101, 58, + 49,100, 58, 48, 49, 13, 10, 48, 58, 50, 98, 51,101, 58, 50, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,104, + 97,114,107, 97,116,116, 46, 99, 13, 10,115,104, 97,114,107, 97,116,116, + 58, 13, 10, 48, 58, 56, 48, 54,101, 58, 53, 48, 58, 51, 48, 58, 50, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,105,100,101, 97, + 114,109,115, 46, 99, 13, 10,100,121,103,101,114, 58, 13, 10,100,121,103, + 101,114, 97, 58, 13, 10, 48, 58, 99, 48,100, 48, 58, 50, 51, 58, 51, 55, + 58, 48, 54, 13, 10, 48, 58, 99, 48, 56, 54, 58, 50, 58, 51, 55, 58, 51, + 55, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,105,100,101, + 112, 99,107,116, 46, 99, 13, 10,115,105,100,101,112, 99,107,116, 58, 13, + 10,115,105,100,101,112, 99,107,116, 98, 58, 13, 10,115,105,100,101,112, + 99,107,116,106, 58, 13, 10, 48, 58, 97, 48,101, 58, 51, 50, 58, 49, 49, + 58, 53, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,107, + 121,102,111,120, 46, 99, 13, 10,115,107,121,102,111,120, 58, 13, 10, 48, + 58,100,101, 48, 48, 58, 97, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,100, + 102, 48, 48, 58, 50, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,101,120, + 101,114,105,122,101,114, 98, 58, 13, 10,101,120,101,114,105,122,101,114, + 58, 13, 10, 48, 58,100,101, 48, 48, 58, 97, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58,100,102, 48, 48, 58, 50, 56, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 68, 51, 53, 54, 58, 49, 58, 65, 48, 58, 65, 48, 13, 10, 48, 58, + 68, 51, 53, 65, 58, 49, 58, 65, 48, 58, 65, 48, 13, 10, 48, 58, 68, 51, + 53, 69, 58, 49, 58, 65, 48, 58, 65, 48, 13, 10, 48, 58, 68, 51, 54, 50, + 58, 49, 58, 65, 48, 58, 65, 48, 13, 10, 48, 58, 68, 51, 54, 54, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 68, 51, 54, 65, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, + 110,107, 46, 99, 13, 10, 97,115,111, 58, 13, 10, 48, 58,100, 56, 51, 98, + 58, 56, 50, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58,101, 55, 55, 55, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,114,105, 97,110, 58, 13, + 10, 48, 58,100, 56, 51, 98, 58, 56, 50, 58, 48, 48, 58, 50, 48, 13, 10, + 48, 58,101,101, 55, 55, 97, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,102,105,116,101,103,111,108,102, 58, 13, 10,102,105,116,101,103,111, + 108,102, 50, 58, 13, 10,102,105,116,101,103,111,108,102,117, 58, 13, 10, + 48, 58,102,102, 55, 48, 58, 53, 48, 58, 53, 51, 58, 49, 52, 13, 10, 13, + 10,116,110,107, 51, 58, 13, 10,116,110,107, 51,106, 58, 13, 10, 48, 58, + 102,101,100, 49, 58, 56, 50, 58, 49, 51, 58, 50, 48, 13, 10, 48, 58,102, + 99, 53, 57, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,118,105, 99, + 116,114,111, 97,100, 58, 13, 10,100,111,103,111,115,111,107,101, 58, 13, + 10,100,111,103,111,115,111,107, 98, 58, 13, 10, 48, 58,102,102, 50, 99, + 58, 53, 48, 58, 48, 48, 58, 53, 53, 13, 10, 48, 58,102, 99, 53,102, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103,119, 97,114, 58, 13, 10, + 103,119, 97,114,106, 58, 13, 10,103,119, 97,114, 97, 58, 13, 10,103,119, + 97,114, 98, 58, 13, 10, 48, 58,101, 52, 98, 57, 58, 53, 48, 58, 48, 48, + 58, 53, 50, 13, 10, 48, 58,101, 51, 97,101, 58, 51, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 98,101,114,109,117,100, 97,116, 58, 13, 10, 98,101, + 114,109,117,100, 97,116,106, 58, 13, 10, 48, 58,102,101, 98,101, 58, 53, + 48, 58, 48, 48, 58, 52,102, 13, 10, 48, 58,101, 51, 99,101, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 98,101,114,109,117,100, 97,116, 97, + 58, 13, 10, 48, 58,102,101, 99, 50, 58, 53, 48, 58, 48, 48, 58, 50, 48, + 13, 10, 48, 58,101, 51, 99,101, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,119,111,114,108,100,119, 97,114, 58, 13, 10, 48, 58,102,101, 99, + 50, 58, 53, 48, 58, 48, 48, 58, 52, 52, 13, 10, 48, 58,101, 51, 99,101, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,112,115,121, 99,104,111, + 115, 58, 13, 10,112,115,121, 99,104,111,115,106, 58, 13, 10, 48, 58,100, + 100, 48, 53, 58,102, 53, 58, 51, 49, 58,102,102, 13, 10, 48, 58,102,101, + 54, 54, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 99,104,111,112, + 112,101,114, 58, 13, 10,108,101,103,111,102, 97,105,114, 58, 13, 10, 99, + 104,111,112,112,101,114, 97, 58, 13, 10, 99,104,111,112,112,101,114, 98, + 58, 13, 10, 48, 58,101, 52, 99, 53, 58, 51, 99, 58, 48, 48, 58, 52, 98, + 13, 10, 48, 58,101, 52, 54, 50, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,116,100,102,101,118,101,114, 58, 13, 10,116,100,102,101,118,101, + 114,106, 58, 13, 10,116,100,102,101,118,101,114, 50, 58, 13, 10, 48, 58, + 100,102, 50, 56, 58, 50, 56, 58, 99, 53, 58, 48, 48, 13, 10, 13, 10,102, + 115,111, 99, 99,101,114, 58, 13, 10, 48, 58,101, 51, 52, 57, 58, 49, 52, + 58, 52, 56, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,115,111,110,115,111,110, 46, 99, 13, 10,115,111,110,115,111,110, 58, + 13, 10,115,111,110,115,111,110,106, 58, 13, 10, 48, 58,100, 56, 58, 52, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 48, 58, 54, 52, 58, 48, + 48, 58, 49,100, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115, + 111,108,111,109,111,110, 46, 99, 13, 10,115,111,108,111,109,111,110, 58, + 13, 10,115,111,108,111,109,111,110,106, 58, 13, 10, 48, 58, 99, 97, 52, + 99, 58, 53, 97, 58, 53, 48, 58, 48, 49, 13, 10, 13, 10, 59, 42, 42, 42, + 42, 42, 42, 42, 42,115,114,117,109, 98,108,101,114, 46, 99, 13, 10,115, + 114,117,109, 98,108,101,114, 58, 32, 59, 91, 83,112,101, 99,105, 97,108, + 32,116,104, 97,110,107,115, 32,116,111, 32, 87,111, 98, 32,102,111,114, + 32,101,110,104, 97,110, 99,105,110,103, 32,116,104,105,115, 32,101,110, + 116,114,121, 93, 13, 10,115,114,117,109, 98,108,101,114, 50, 58, 13, 10, + 114,117,115,104, 99,114,115,104, 58, 13, 10,115,114,117,109, 98,108,101, + 114, 51, 58, 13, 10, 48, 58, 49, 99, 57, 52, 58, 55, 48, 58, 53, 52, 58, + 102, 50, 13, 10, 48, 58, 97, 97, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,116, 97,114,119, 97,114, + 115, 46, 99, 13, 10,101,115, 98, 58, 13, 10, 48, 58, 52, 98, 51,102, 58, + 97,102, 58, 48,102, 58, 57, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,115,112,100,111,100,103,101, 98, 46, 99, 13, 10,115,112,100, + 111,100,103,101, 98, 58, 13, 10,110,107,100,111,100,103,101, 58, 13, 10, + 110,107,100,111,100,103,101, 98, 58, 13, 10, 48, 58, 56, 51, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 115,117,112,101,114,109, 97,110, 46, 99, 13, 10, 98, 97,108,108, 98,114, + 111,115, 58, 13, 10, 48, 58,102, 48, 48,101, 98,101, 58, 54, 51, 58, 48, + 48, 58, 50, 48, 13, 10, 13, 10,116,119,105,110,104, 97,119,107, 58, 32, + 32, 59, 42, 42, 42, 42, 42, 32,116,111,112, 32,115, 99,111,114, 32,117, + 112,100, 97,116,101,115, 32,111,110, 32,103, 97,109,101, 32,115,116, 97, + 114,116, 32, 42, 42, 42, 42, 42, 13, 10,116,119,105,110,104, 97,119,107, + 117, 58, 13, 10,100, 97,105,115,101,110,112,117, 58, 13, 10, 48, 58,102, + 48, 48, 49, 51, 50, 58, 52, 48, 58, 48, 48, 58, 97, 97, 13, 10, 13, 10, + 103,105,103, 97,110,100,101,115, 58, 13, 10, 48, 58,102, 48, 48, 97, 56, + 54, 58, 53, 55, 58, 48, 48, 58, 52,101, 13, 10, 48, 58,102, 48, 48, 57, + 54, 52, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103,105,103, 97, + 110,100,101,115, 97, 58, 13, 10, 48, 58,102, 48, 48, 97, 56, 54, 58, 53, + 51, 58, 48, 48, 58, 53, 50, 13, 10, 48, 58,102, 48, 48, 57, 54, 52, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,115,117,112,101,114,112, 97, 99, 46, 99, 13, 10,115,117,112,101, + 114,112, 97, 99, 58, 13, 10,115,117,112,101,114,112, 97, 99,109, 58, 13, + 10, 48, 58, 49, 49, 51, 56, 58, 50, 56, 58, 48, 48, 58, 50, 48, 13, 10, + 48, 58, 49, 48, 56, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 51,101,101, 58, 55, 58, 51, 48, 58, 50, 48, 13, 10, 13, 10,112, 97, 99, + 110,112, 97,108, 58, 13, 10,112, 97, 99,110, 99,104,109,112, 58, 13, 10, + 112, 97, 99,110,112, 97,108, 50, 58, 13, 10, 48, 58, 49, 48, 52, 99, 58, + 50, 56, 58, 48, 48, 58, 50, 51, 13, 10, 48, 58, 49, 49, 54,100, 58, 51, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51,101,100, 58, 55, 58, 48, 48, + 58, 50, 52, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117, + 112,101,114,113,105,120, 46, 99, 13, 10,115,113,105,120, 98,108, 58, 13, + 10, 48, 58,102, 52, 99, 48, 58, 50, 56, 58, 48, 48, 58, 48, 51, 13, 10, + 48, 58,102, 56,102, 49, 58, 52, 58, 55, 53, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,115,117,114,112,114, 97,116,107, 46, + 99, 13, 10, 59, 42, 32,121,111,117, 32,109,117,115,116, 32,101,120,105, + 116, 32,116,104,105,115, 32,103, 97,109,101, 32,119,104,105,108,101, 32, + 105,110, 45,103, 97,109,101, 32,116,111,112, 32,115, 99,111,114,101, 32, + 105,115, 32,100,105,115,112,108, 97,121,105,110,103, 32, 40,110,111,116, + 32,104,105,103,104,115, 99,111,114,101, 32,116, 97, 98,108,101, 41, 42, + 13, 10, 59, 42, 32,102,111,114, 32,105,110, 45,103, 97,109,101, 32,116, + 111,112, 32,115, 99,111,114,101, 32,116,111, 32,115, 97,118,101, 32, 99, + 111,114,114,101, 99,116,108,121, 40, 98,101, 99, 97,117,115,101, 32,111, + 102, 32,119, 97,121, 32,103, 97,109,101, 32,117,115,101,115, 32,118,105, + 100,101,111,114, 97,109, 41, 13, 10,115,117,114,112,114, 97,116,107, 58, + 13, 10, 48, 58, 98, 48, 48, 58, 53, 97, 58, 49, 49, 58, 51, 49, 13, 10, + 48, 58, 53, 57, 56, 48, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 54, 48, 57,101, 58, 54, 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, + 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 46, 99, 13, 10, + 52,100,119, 97,114,114,105,111, 58, 32, 59, 91, 83,112,101, 99,105, 97, + 108, 32,116,104, 97,110,107,115, 32,116,111, 32, 67, 97,110, 97,110, 97, + 115, 32,102,111,114, 32,101,110,104, 97,110, 99,105,110,103, 32,116,104, + 105,115, 32,101,110,116,114,121, 93, 13, 10, 48, 58,100, 51, 48, 48, 58, + 97, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, 48, 49, 55, 58, 51, + 58, 48, 48, 58, 48, 50, 13, 10, 13, 10, 99,104,111,112,108,105,102,116, + 117, 58, 13, 10, 99,104,112,108,102,116, 98,108, 58, 13, 10, 99,104,111, + 112,108,105,102,116, 58, 13, 10, 99,104,111,112,108,105,102,116, 98,108, + 58, 13, 10, 48, 58,101,102, 48, 48, 58, 51, 49, 58, 48, 48, 58, 52, 98, + 13, 10, 48, 58,101,102, 55, 49, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,104,118,121,109,101,116, 97,108, 58, 13, 10, 48, 58,100, 51, 48, + 48, 58, 51, 56, 58, 48, 48, 58, 53, 57, 13, 10, 48, 58, 99, 48, 48, 99, + 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109,121,104,101,114,111, + 58, 13, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 52, 57, + 13, 10, 48, 58, 99, 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, + 13, 10,109,121,104,101,114,111,107, 58, 13, 10,115,115, 99, 97,110,100, + 97,108, 58, 13, 10,109,121,104,101,114,111, 98,108, 58, 13, 10, 48, 58, + 100, 51, 48, 48, 58, 97, 48, 58, 48, 48, 58, 50, 48, 13, 10, 48, 58, 99, + 48, 49, 55, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115,119, 97, + 116, 58, 13, 10, 48, 58,100, 51, 48, 48, 58, 51, 99, 58, 48, 48, 58, 52, + 57, 13, 10, 48, 58, 99, 48, 49, 52, 58, 51, 58, 48, 48, 58, 48, 50, 13, + 10, 13, 10,119, 98,111,121, 58, 13, 10,119, 98,111,121, 50, 58, 13, 10, + 119, 98,111,121, 51, 58, 13, 10,119, 98,111,121, 52, 58, 13, 10,119, 98, + 111,121, 52,117, 58, 13, 10,119, 98,111,121,117, 58, 32, 59, 42,110,111, + 116,101, 42, 32,111,110,108,121, 32, 49, 47, 50, 32,119,111,114,107,115, + 46, 46, 46, 13, 10,119, 98,100,101,108,117,120,101, 58, 13, 10,119, 98, + 111,121,111, 58, 13, 10,119, 98,111,121, 50,117, 58, 13, 10,119, 98,111, + 121, 53, 58, 13, 10, 48, 58, 99, 49, 48, 48, 58, 49, 52, 48, 58, 50, 48, + 58, 50, 48, 13, 10, 48, 58,101, 56, 53, 54, 58,102, 58, 48, 49, 58, 49, + 48, 13, 10, 13, 10,119, 98,111,121,115,121,115, 50, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42, 87,111,110,100,101,114, 32, 66,111,121, 32, 40,115, - 121,115,116,101,109, 32, 50, 41, 10, 48, 58, 99, 49, 48, 48, 58, 49, 52, - 48, 58, 50, 48, 58, 50, 48, 10, 48, 58,101, 48, 53, 54, 58,102, 58, 48, - 49, 58, 49, 48, 10, 10,119, 98,109,108,106,111, 58, 10,119, 98,109,108, - 106, 98, 58, 10,119, 98,109,108, 58, 10,119, 98,109,108, 98,103, 58, 32, - 10,119, 98,109,108, 98,103,101, 58, 10,119, 98,109,108,118, 99, 58, 10, - 119, 98,109,108,100, 58, 10,119, 98,109,108,106,111,100, 58, 10,119, 98, - 109,108,118, 99,100, 58, 10, 48, 58, 99, 49, 48, 49, 58, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58, 48, 55, 50,102, 58, 49, 58, 48, 51, 58, 48, 51, - 10, 48, 58, 99, 49, 55, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 99, 49, 55, 97, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49, 55, - 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49, 55, 99, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49, 55,100, 58, 49, 58, 48, 51, - 58, 48, 51, 10, 48, 58, 99, 49, 55,101, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 99, 49, 55,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 99, 49, 56, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 46, 99, 32, 40,119,111, - 110,100,101,114, 32, 98,111,121, 32,105,110, 32,109,111,110,115,116,101, - 114, 32,108, 97,110,100, 32, 40, 98,111,111,116,108,101,103, 41, 42, 42, - 102,105,120, 42, 42, 41, 41, 10,119, 98,109,108, 98, 58, 10, 48, 58, 99, - 49, 55, 57, 58, 56, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 49, 55,100, - 58, 49, 58, 48, 51, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,115,121,115,116,101,109, 49, 54, 46, 99, 10, 97, 98,117,114,110,101, - 114, 58, 10, 48, 58,102,102, 56, 52, 54,101, 58, 49, 49, 55, 58, 48, 48, - 58, 48, 48, 10, 48, 58,102,102, 56, 53, 55,102, 58, 49, 58, 52,102, 58, - 52,102, 10, 10, 97, 98,117,114,110,101,114, 50, 58, 10, 97, 98,117,114, - 110,101,114, 50,103, 58, 10, 48, 58,102,102, 56, 52, 54,101, 58, 49, 49, - 55, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102, 56, 52, 54,102, 58, 49, - 58, 55, 48, 58, 55, 48, 10, 10,102, 97,110,116,122,111,110,101, 58, 10, - 102, 97,110,116,122,111,110,101,116, 97, 58, 10, 48, 58,102,102,102, 99, - 48, 48, 58, 51, 56, 58, 48, 48, 58, 53, 50, 10, 48, 58,102,102, 99, 50, - 50, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,102, 97,110,116,122,111, - 110,111, 58, 10,102, 97,110,116,122,111,110,101,112, 58, 10,102, 97,110, - 116,122,111,110,101,112,114, 58, 10,102, 97,110,116,122,111,110,101, 49, - 58, 10, 48, 58,102,102,102, 99, 48, 48, 58, 51, 56, 58, 48, 48, 58, 57, - 53, 10, 48, 58,102,102, 99, 50, 50, 99, 58, 52, 58, 48, 48, 58, 48, 48, - 10, 10,104,119, 99,104, 97,109,112, 58, 10,104,119, 99,104, 97,109,112, - 106, 58, 10,104,119, 99,104, 97,109,112,106,100, 58, 10, 48, 58,102,102, - 102, 52, 48, 48, 58, 51, 49, 56, 58, 49, 48, 58, 48, 48, 10, 10,116,101, - 116,114,105,115, 98,108, 58, 10, 48, 58,102,102,101, 56, 48, 48, 58, 54, - 52, 58, 52, 53, 58, 48, 56, 10, 10,116,101,116,114,105,115,116, 58, 10, - 48, 58, 56, 48, 52, 53, 97, 99, 58, 54, 52, 58, 52, 53, 58, 48, 56, 10, - 10, 59, 42, 42, 42, 42, 42, 42, 84,101,116,114,105,115, 32, 40, 74, 97, - 112, 97,110, 44, 32, 66, 45, 83,121,115,116,101,109, 44, 32, 89, 77, 50, - 50, 48, 51, 41, 10,116,101,116,114,105,115,116, 97, 58, 10, 48, 58, 56, - 48, 50, 51, 97, 99, 58, 54, 52, 58, 52, 53, 58, 48, 56, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 84,101,116,114,105,115, 32, 40, 74, 97,112, 97,110, - 44, 32, 83,121,115,116,101,109, 32, 49, 54, 65, 44, 32, 70, 68, 49, 48, - 57, 52, 32, 51, 49, 55, 45, 48, 48, 57, 51, 97, 41, 10,116,101,116,114, - 105,115, 50, 58, 10,116,101,116,114,105,115, 51, 58, 32, 32, 59, 42, 42, - 42, 42, 42, 42,116,101,116,114,105,115, 32, 40, 74, 97,112, 97,110, 44, - 32, 83,121,115,116,101,109, 32, 49, 54, 65, 44, 32, 70, 68, 49, 48, 57, - 52, 32, 51, 49, 55, 45, 48, 48, 57, 51, 41, 10,116,101,116,114,105,115, - 58, 10,116,101,116,114,105,115, 49, 58, 10,116,101,116,114,105,115, 49, - 100, 58, 10,116,101,116,114,105,115, 50,100, 58, 10,116,101,116,114,105, - 115, 51,100, 58, 10,116,101,116,114,105,115,100, 58, 10, 48, 58,102,102, - 101, 56, 48, 48, 58, 54, 52, 58, 52, 53, 58, 48, 56, 10, 10,116,105,109, - 115, 99, 97,110,114, 58, 10,116,105,109,101,115, 99,110, 58, 10, 48, 58, - 102,102, 99, 48, 51, 54, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102, - 102, 99, 48, 51, 55, 58, 50, 58, 48, 49, 58, 50, 48, 10, 48, 58,102,102, - 99, 48, 51, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58,102,102,102, - 55, 53, 48, 58, 52, 54, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,116, 97,105,108, 50,110,111,115, 46, 99, 10,116, 97, - 105,108, 50,110,111,115, 58, 10,115,102,111,114,109,117,108, 97, 58, 10, - 115,102,111,114,109,117,108, 97, 97, 58, 10, 48, 58,102,102, 56, 57, 99, - 52, 58, 49, 51, 48, 58, 48, 97, 58, 48, 48, 10, 48, 58,102,102, 56, 98, - 48, 53, 58,102, 58, 52, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42, 42,116, 97,105,116,111,115,106, 46, 99, 10, 97,108,112,105,110, - 101, 58, 10, 97,108,112,105,110,101, 97, 58, 10, 48, 58, 56, 48, 56, 50, - 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 53, 98,101, 58, 49, 58, - 50, 53, 58, 50, 53, 10, 48, 58, 99, 53,100,101, 58, 49, 58, 50, 53, 58, - 50, 53, 10, 48, 58, 99, 53,102,101, 58, 49, 58, 48, 53, 58, 48, 53, 10, - 48, 58, 99, 54, 49,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, - 54, 51,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 54, 53,101, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 10,101,108,101,118, 97,116,111,114, - 58, 10,101,108,101,118, 97,116,111,114, 98, 58, 10, 48, 58, 56, 51, 53, - 48, 58, 51, 58, 48, 48, 58, 48, 49, 10, 10,102,114,111,110,116,108,105, - 110, 58, 10, 48, 58, 56, 54, 52, 48, 58, 51, 58, 48, 49, 58, 48, 48, 10, - 48, 58, 99, 53, 98,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, - 53,100,101, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 99, 53,102,101, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 54, 49,101, 58, 49, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 99, 54, 51,101, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 99, 54, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 10,104,119,114, 97, 99,101, 58, 10, 48, 58, 56, 48, 99, 48, 58, 51, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 99, 49, 58, 49, 58, 53, 48, 58, - 53, 48, 10, 10,106,117,110,103,108,101,107, 58, 10,106,117,110,103,108, - 101,104, 58, 10,106,117,110,103,108,101,104, 98,114, 58, 10,106,117,110, - 103,108,101,107,106, 50, 58, 10,106,117,110,103,108,101, 98,121, 58, 10, - 106,117,110,103,108,101,107, 97,115, 58, 10, 48, 58, 56, 49, 54, 98, 58, - 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 49, 54, 99, 58, 49, 58, 53, - 48, 58, 53, 48, 10, 48, 58, 56, 49, 54,100, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 10,112,105,114, 97,116,112,101,116, 58, 10, 48, 58, 56, 49, 54, - 99, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 49, 54,100, 58, 49, - 58, 53, 48, 58, 53, 48, 10, 48, 58, 56, 49, 54,101, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 10,116,105,110,115,116, 97,114, 58, 10,116,105,110,115, - 116, 97,114, 50, 58, 10, 48, 58, 56, 51, 53,100, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 56, 51, 53,101, 58, 49, 58, 48, 49, 58, 48, 49, 10, - 48, 58, 56, 51, 53,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10,119,119, - 101,115,116,101,114,110, 58, 10,119,119,101,115,116,101,114,110, 49, 58, - 10, 48, 58, 56, 54, 51, 48, 58, 53, 99, 58, 48, 49, 58, 98, 97, 10, 48, - 58, 99, 53, 98,101, 58, 50, 58, 48, 48, 58, 49,100, 10, 48, 58, 99, 53, - 100,101, 58, 50, 58, 48, 49, 58, 48, 97, 10, 48, 58, 99, 53,102,101, 58, - 50, 58, 48, 48, 58, 49, 50, 10, 48, 58, 99, 54, 49,101, 58, 50, 58, 48, - 48, 58, 49,100, 10, 48, 58, 99, 54, 51,101, 58, 50, 58, 48, 48, 58, 49, - 56, 10, 48, 58, 99, 54, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, 95, 98, 46, 99, - 10, 97,115,104,117,114, 97, 58, 10, 97,115,104,117,114, 97,106, 58, 10, - 48, 58, 54, 48, 49, 57,102, 52, 58, 54, 52, 58, 48, 48, 58, 49, 57, 10, - 48, 58, 54, 48, 49, 50, 97, 50, 58, 50, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 54, 48, 49, 50, 97, 52, 58, 50, 58, 49, 48, 58, 48, 48, 10, 10, 99, - 114,105,109,101, 99, 58, 10, 99,114,105,109,101, 99,106, 58, 10, 99,114, - 105,109,101, 99,117, 58, 10, 48, 58, 97, 48, 50,102, 98, 97, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 97, 48,101, 48, 48, 53, 58, 52, 97,102, - 58, 53, 52, 58, 48, 48, 10, 10,115,101,108,102,101,101,110, 97, 58, 10, - 48, 58, 49, 48, 51, 51, 56,101, 58, 51, 97, 58, 52, 49, 58, 48, 48, 10, - 48, 58, 49, 48, 50, 52, 56, 49, 58, 49, 58, 49, 57, 58, 49, 57, 10, 48, - 58, 49, 48, 50, 52, 56, 51, 58, 49, 58, 48, 99, 58, 48, 99, 10, 10,115, - 112, 97, 99,101,100,120, 58, 10,115,112, 97, 99,101,100,120,106, 58, 10, - 48, 58, 57, 48, 50, 55, 48, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 57, 48,102,102, 57, 98, 58, 49, 58, 51, 55, 58, 51, 55, 10, 10,115, - 112, 99,105,110,118,100,106, 58, 10, 48, 58, 52, 48, 52,102, 55, 51, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 116, 97,105,116,111, 95,102, 50, 46, 99, 10, 99, 97,109,101,108,116,114, - 121, 58, 10, 59, 42,110,111,116,101, 32, 99, 97,110,116, 32,115,101,101, - 32,104,105,103,104,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,105, - 110, 32, 99, 97,109,101,108,116,114,121, 32,115,111, 32,105,116,115, 32, - 99,111,109,109,101,110,116,101,100, 32,111,117,116, 10, 59, 99, 97,109, - 101,108,116,114,117, 58, 32, 10, 48, 58, 49, 48, 54, 99, 57,101, 58, 50, - 52, 52, 58, 51, 53, 58, 52, 52, 10, 48, 58, 49, 48, 54, 54, 98, 48, 58, - 51,101, 58, 48, 54, 58, 48, 48, 10, 48, 58, 49, 48, 53, 52, 51, 48, 58, - 52, 58, 48, 48, 58, 48, 48, 10, 10,100,101, 97,100, 99,111,110,120, 58, - 10,100,101, 97,100, 99,111,110,120,106, 58, 10, 48, 58, 49, 48, 51, 51, - 53, 97, 58, 53, 57, 58, 48, 48, 58, 52, 55, 10, 10,100,111,110,100,111, - 107,111,100, 58, 10,100,111,110,100,111,107,111,100,117, 58, 10,100,111, - 110,100,111,107,111,100,106, 58, 10, 48, 58, 49, 48, 50, 56,101, 56, 58, - 50, 56, 58, 48, 48, 58, 53, 53, 10, 32, 10,103,117,110,102,114,111,110, - 116, 58, 10,103,117,110,102,114,111,110,116,106, 58, 10, 48, 58, 49, 48, - 57, 50, 50, 99, 58, 53, 52, 58, 48, 48, 58, 51, 48, 10, 48, 58, 49, 48, - 57, 50, 50,101, 58, 49, 58, 99, 51, 58, 99, 51, 10, 32, 10,108,105,113, - 117,105,100,107, 58, 10,108,105,113,117,105,100,107,117, 58, 10,109,105, - 122,117, 98, 97,107,117, 58, 10, 48, 58, 49, 48, 66, 48, 70, 69, 58, 50, - 56, 58, 48, 48, 58, 53, 53, 10, 10,109,101,116, 97,108, 98, 58, 10,109, - 101,116, 97,108, 98,106, 58, 10, 48, 58, 49, 48,101, 51, 97, 97, 58, 50, - 56, 58, 48, 48, 58, 48, 52, 10, 48, 58, 49, 48,100, 48, 98, 48, 58, 52, - 58, 48, 48, 58, 53, 48, 10, 10,115,115,105, 58, 10,115,115,105, 97, 58, - 10, 48, 58, 50, 48, 53, 56, 49, 52, 58, 51, 49, 58, 48, 48, 58, 53, 97, - 10, 48, 58, 50, 48, 51, 54, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, - 10,109, 97,106,101,115,116, 49, 50, 58, 10,109, 97,106,101,115,116, 49, - 50,106, 58, 10,109, 97,106,101,115,116, 49, 50,117, 58, 10, 48, 58, 50, - 48, 53, 56, 49, 50, 58, 51, 49, 58, 48, 48, 58, 53, 97, 10, 48, 58, 50, - 48, 51, 54, 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 97,114,107, - 114,101,116,114,110, 58, 10, 97,114,107,114,101,116,114,110,106, 58, 10, - 97,114,107,114,101,116,114,110,117, 58, 10, 48, 58, 52, 48, 49, 97, 49, - 97, 58, 50, 55, 58, 48, 48, 58, 49, 55, 10, 10, 98,117, 98, 98,108,101, - 109, 58, 10, 98,117, 98, 98,108,101,109,106, 58, 10, 48, 58, 52, 48,102, - 50,101, 99, 58, 49, 48,101, 58, 48, 48, 58, 48, 56, 10, 48, 58, 52, 48, - 55, 49, 51, 53, 58, 51, 58, 50, 55, 58, 49, 51, 10, 48, 58, 52, 48,101, - 98, 48, 52, 58, 53, 48, 58, 48, 48, 58, 48, 48, 10, 10, 10, 98,117, 98, - 108, 98,111, 98, 50,111, 58, 10, 98,117, 98,115,121,109,112,104,106, 58, - 10, 98,117, 98,115,121,109,112,104,117, 58, 10, 98,117, 98,115,121,109, - 112,104,101, 58, 10, 98,117, 98,115,121,109,112,104, 98, 58, 10, 98,117, - 98,108, 98,111, 98, 50, 58, 10, 48, 58, 52, 48,101,100, 54, 99, 58, 57, - 54, 58, 48, 48, 58, 48, 55, 10, 48, 58, 52, 48,101,100, 56,100, 58, 49, - 58, 48, 54, 58, 48, 54, 10, 48, 58, 52, 48,101, 97, 50, 48, 58, 56, 52, - 58, 48, 48, 58, 48, 48, 10, 10,103,115,101,101,107,101,114, 58, 10,103, - 115,101,101,107,101,114,106, 58, 10,103,115,101,101,107,101,114,117, 58, - 10, 48, 58, 52, 49, 48, 55, 98, 97, 58, 53, 48, 58, 48, 48, 58,102, 56, - 10, 48, 58, 52, 48,100, 49, 55, 54, 58, 52, 58, 48, 48, 58, 53, 48, 10, - 10,103,117,110,108,111, 99,107, 58, 10,114, 97,121,102,111,114, 99,101, - 58, 10,114, 97,121,102,111,114, 99,101,106, 58, 10, 48, 58, 52, 48,101, - 102,102, 52, 58, 52, 48, 58, 52, 49, 58, 48, 48, 10, 48, 58, 52, 48, 50, - 50,102, 97, 58, 52, 58, 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,116, 97,105,116,111, 95,108, 46, 99, 10,102,104, 97,119, - 107, 58, 10,102,104, 97,119,107,106, 58, 10, 48, 58, 97, 50,102,101, 58, - 53, 48, 58, 53, 48, 58, 50,101, 10, 48, 58, 97, 50, 52,101, 58, 51, 58, - 53, 48, 58, 48, 48, 10, 10,112, 97,108, 97,109,101,100, 58, 10, 48, 58, - 56, 50, 48, 54, 58, 50,101, 58, 50, 48, 58, 53, 50, 10, 10,112,108,103, - 105,114,108,115, 50, 58, 10,112,108,103,105,114,108,115, 50, 98, 58, 10, - 48, 58, 56, 49,101, 48, 58, 51, 53, 58, 48, 48, 58, 48, 53, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,116, 97,110,107, 98, 97,116,116, 46, 99, - 10,116, 97,110,107, 98, 97,116,116, 58, 10,116, 97,110,107, 98, 97,116, - 116, 98, 58, 10, 48, 58, 48, 48, 99, 51, 58, 48, 50, 58, 48, 48, 58, 48, - 48, 10, 10,114,121,103, 97,114, 58, 10,114,121,103, 97,114, 50, 58, 10, - 114,121,103, 97,114,106, 58, 10,114,121,103, 97,114, 51, 58, 10, 48, 58, - 99, 57, 56, 51, 58, 49, 99, 52, 58, 52, 49, 58, 48, 10, 48, 58, 99, 48, - 50, 51, 58, 50, 58, 48, 58, 48, 10, 48, 58, 99, 48, 50, 53, 58, 49, 58, - 48, 51, 58, 48, 51, 10, 48, 58, 99, 48, 50, 54, 58, 49, 58, 48, 58, 48, - 10, 48, 58,100, 48, 54, 99, 58, 56, 58, 49, 58, 54, 48, 10, 10,115,105, - 108,107,119,111,114,109, 58, 10,115,105,108,107,119,111,114,109,106, 58, - 10, 48, 58,100, 50, 54, 50, 58, 54, 52, 58, 48, 48, 58, 49, 48, 10, 48, - 58, 99, 56, 52, 56, 58, 49, 56, 58, 50, 48, 58, 51, 48, 10, 48, 58,100, - 53, 52,101, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58,100, 53, 55, 50, - 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, - 42,116,101,114,114, 97, 99,114,101, 46, 99, 10,116,101,114,114, 97, 99, - 114,101,110, 58, 10,116,101,114,114, 97, 99,114,101, 58, 10,116,101,114, - 114, 97, 99,114,101, 97, 58, 10,116,101,114,114, 97, 99,114,101,111, 58, - 10, 48, 58, 50, 48, 50, 52, 54, 58, 52, 54, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 50, 48, 50, 56, 99, 58, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 50, 48, 50, 52, 56, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,116,104,101,112,105,116, 46, 99, 10,102,105,116, - 116,101,114, 58, 10,114,111,117,110,100,117,112, 58, 10,102,105,116,116, - 101,114, 98,108, 58, 10,116,116,102,105,116,116,101,114, 58, 10, 48, 58, - 56, 48, 53, 48, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 54, - 50, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 54, 48, 49, - 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 53, 69, 49, 58, 48, - 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 53, 67, 49, 58, 48, 49, 58, - 50, 52, 58, 50, 52, 10, 48, 58, 57, 53, 65, 49, 58, 48, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58, 57, 53, 56, 49, 58, 48, 49, 58, 48, 48, 58, 48, - 48, 10, 10,109, 97, 99,104,111,109,111,117, 58, 10, 48, 58, 56, 48, 52, - 97, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 49, 56, 49, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 57, 49, 97, 49, 58, 49, 58, 50, 52, - 58, 50, 52, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 50, 52, 58, 50, 52, - 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, - 57, 50, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 50, 50, - 49, 58, 49, 58, 50, 52, 58, 50, 52, 10, 10,115,117,112,114,109,111,117, - 115, 58, 10, 48, 58, 56, 48, 52, 65, 58, 48, 51, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 57, 50, 50, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, - 58, 57, 50, 48, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, - 49, 69, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 49, 67, - 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 49, 65, 49, 58, - 48, 49, 58, 50, 52, 58, 50, 52, 10, 48, 58, 57, 49, 56, 49, 58, 48, 49, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, - 104,105,101,102, 46, 99, 10,116,104,105,101,102, 58, 10, 48, 58, 56, 97, - 98, 99, 58, 52, 57, 58, 51, 48, 58, 50, 48, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,116,104,117,110,100,101,114,120, 46, 99, 10,115, 99,111, - 110,116,114, 97, 58, 10,115, 99,111,110,116,114, 97,106, 58, 10, 48, 58, - 52, 49, 48, 48, 58, 53, 48, 58, 49, 49, 58, 48, 48, 10, 48, 58, 52, 48, - 53, 48, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 52, 48, 53, 49, 58, - 51, 58, 48, 49, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 116,110,122,115, 46, 99, 10, 99,104,117,107, 97,116, 97,105, 58, 10, 99, - 104,117,107, 97,116, 97,105,106, 58, 10, 99,104,117,107, 97,116, 97,105, - 117, 58, 10, 48, 58,101,100, 56, 99, 58, 52, 54, 58, 48, 48, 58, 52, 50, - 10, 48, 58,101, 50, 49, 48, 58, 51, 58, 48, 48, 58, 55, 53, 10, 10,100, - 114,116,111,112,112,101,108, 58, 10,100,114,116,111,112,112,101,108,117, - 58, 10,100,114,116,111,112,112,101,108,106, 58, 10, 48, 58,101, 48, 53, - 55, 58, 50, 51, 58, 48, 48, 58, 50, 53, 10, 48, 58,101, 48, 50, 51, 58, - 51, 58, 48, 48, 58, 48, 48, 10, 10,105,110,115,101, 99,116,120, 58, 10, - 105,110,115,101, 99,116,120,106, 58, 10, 48, 58, 99, 54, 48, 48, 58, 53, - 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 54,101, 97, 58, 51, 58, 48, - 48, 58, 50, 49, 10, 10,112,108,117,109,112,112,111,112, 58, 10, 48, 58, - 99, 54, 50, 53, 58, 50, 55, 58, 48, 48, 58, 53, 50, 10, 48, 58,101, 52, - 55, 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,116,110,122,115, 50, 58, - 10, 48, 58,101, 99, 48, 97, 58, 50, 51, 58, 48, 48, 58, 53, 53, 10, 10, - 104,101,108,108,102,105,114,101, 49, 58, 10,104,101,108,108,102,105,114, - 101, 51, 58, 10,104,101,108,108,102,105,114,101, 49, 97, 58, 10, 48, 58, - 52, 50, 49, 51, 48, 58, 99, 50, 58, 48, 48, 58, 48, 56, 10, 48, 58, 52, - 50, 49,101, 57, 58, 49, 58, 49, 52, 58, 49, 52, 10, 48, 58, 52, 50, 51, - 53, 55, 58, 50, 49, 58, 50,101, 58, 51, 48, 10, 10,104,101,108,108,102, - 105,114,101, 58, 10,104,101,108,108,102,105,114,101, 50, 58, 10,104,101, - 108,108,102,105,114,101, 50, 97, 58, 10, 48, 58, 52, 50, 51, 48, 48, 58, - 99, 50, 58, 48, 48, 58, 48, 56, 10, 48, 58, 52, 50, 51, 98, 57, 58, 49, - 58, 49, 52, 58, 49, 52, 10, 48, 58, 52, 50, 53, 50, 57, 58, 50, 49, 58, - 50,101, 58, 51, 48, 10, 10,114, 97,108,108,121, 98,105,107, 58, 10, 48, - 58, 56, 48, 49, 97, 99, 58, 51, 50, 52, 58, 48, 48, 58, 52, 48, 10, 48, - 58, 56, 48, 53, 51,100, 58, 49, 58, 49, 55, 58, 49, 55, 10, 48, 58, 56, - 48, 53, 53, 53, 58, 49, 58, 48, 52, 58, 48, 52, 10, 48, 58, 56, 48, 53, - 54,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 53, 56, 53, - 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 53, 57,100, 58, 49, - 58, 48, 48, 58, 48, 48, 10, 48, 58, 56, 48, 53, 98, 53, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 10,116,114,117,120,116,111,110, 58, 10, 48, 58, 48, - 56, 49, 57,100,101, 58, 49, 54, 99, 58, 48, 48, 58, 48, 98, 10, 48, 58, - 56, 49, 99, 53, 51, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 56, 49, - 99, 53, 55, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 56, 49, 99, 53, - 98, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 56, 49, 99, 53,102, 58, - 49, 58, 50,100, 58, 50,100, 10, 48, 58, 56, 49, 99, 54, 51, 58, 49, 58, - 48, 53, 58, 48, 53, 10, 48, 58, 56, 49, 99, 54, 55, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 56, 49, 99, 54, 98, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 56, 49, 99, 54,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 56, 49, 99, 55, 51, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10,115, - 97,109,101,115, 97,109,101, 58, 10, 48, 58, 99, 49, 55, 55, 56, 58, 49, - 57, 52, 58, 48, 48, 58, 48, 49, 10, 48, 58, 99, 49, 56, 98, 57, 58, 49, - 58, 50, 54, 58, 50, 54, 10, 48, 58, 99, 49, 97, 52,102, 58, 50, 49, 58, - 50,100, 58, 48, 48, 10, 10,115, 97,109,101,115, 97,109,101, 50, 58, 10, - 48, 58, 99, 49, 97,100, 97, 58, 49, 57, 52, 58, 48, 48, 58, 48, 49, 10, - 48, 58, 99, 49, 99, 50, 53, 58, 49, 58, 50, 54, 58, 50, 54, 10, 48, 58, - 99, 49,100, 99, 49, 58, 50, 49, 58, 50,100, 58, 48, 48, 10, 10, 59, 42, - 110,111,116,101, 42, 32,116,111,112, 32,115, 99,111,114,101, 32,100,111, - 101,115, 32,110,111,116, 32,100,105,115,112,108, 97,121, 10,118,105,109, - 97,110, 97, 58, 10,118,105,109, 97,110, 97,110, 58, 10,118,105,109, 97, - 110, 97, 49, 58, 10,118,105,109, 97,110, 97,106, 58, 10, 48, 58, 52, 56, - 48, 49, 57, 56, 58,102, 52, 58, 48, 48, 58, 52, 49, 10, 10, 59, 42, 42, - 32,111,110,108,121, 32,115, 97,118,101,115, 32,104,105,103,104, 32,116, - 97, 98,108,101, 32, 40,110,111, 32,116,111,112, 32,115, 99,111,114,101, - 41, 10, 59, 42, 42, 32, 97,110,100, 32,104,105,103,104,115, 99,111,114, - 101, 32, 99,111,117,110,116,101,114, 32, 40,110,111,116, 32,100,105,115, - 112,108, 97,121, 41, 10,122,101,114,111,119,105,110,103, 49, 58, 10, 48, - 58, 56, 49, 55, 55, 54, 58, 54, 56, 58, 48, 48, 58, 49, 48, 10, 48, 58, - 56, 49, 55, 55, 56, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10,122,101,114, - 111,119,105,110,103,119, 58, 10,122,101,114,111,119,105,110,103, 58, 10, - 48, 58, 56, 49, 97, 49,101, 58, 54, 56, 58, 48, 48, 58, 49, 48, 10, 48, - 58, 56, 49, 97, 50, 48, 58, 49, 58, 53, 48, 58, 53, 48, 10, 10,103,114, - 105,110,100,115,116,109, 58, 10, 48, 58, 49, 48, 48, 53, 48, 48, 58, 57, - 48, 58, 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 48, 53, 55,102, 58, 49, - 58, 50,100, 58, 50,100, 10, 48, 58, 49, 48, 48, 52, 51, 99, 58, 52, 58, - 48, 48, 58, 48, 48, 10, 10,103,114,105,110,100,115,116,109, 97, 58, 10, - 48, 58, 49, 48, 48, 52,102, 99, 58, 57, 48, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 49, 48, 48, 53, 55, 98, 58, 49, 58, 50,100, 58, 50,100, 10, 48, - 58, 49, 48, 48, 52, 51, 56, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10,118, - 102,105,118,101, 58, 10, 48, 58, 49, 48, 48, 52,102, 97, 58, 57, 48, 58, - 48, 48, 58, 48, 48, 10, 48, 58, 49, 48, 48, 52, 51, 54, 58, 52, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 49, 48, 48, 53, 55, 57, 58, 49, 58, 50,100, - 58, 50,100, 10, 10,112,105,112,105, 98,105, 98,115, 58, 10,112,105,112, - 105, 98,105, 98,115, 98,108, 58, 10,112,105,112,105, 98,105, 98,115, 97, - 58, 10,112,105,112,105, 98,105, 98,115,112, 58, 10, 48, 58, 48, 56, 48, - 53,100, 56, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 56, 48, 53, - 100, 57, 58, 51, 58, 48, 53, 58, 48, 48, 10, 48, 58, 48, 56, 48, 53,101, - 52, 58, 52, 54, 58, 48, 48, 58, 70, 70, 10, 10,119,104,111,111,112,101, - 101, 58, 10, 48, 58, 48, 56, 48, 53,100, 97, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 48, 56, 48, 53,100, 98, 58, 51, 58, 48, 53, 58, 48, 48, - 10, 48, 58, 48, 56, 48, 53,101, 54, 58, 52, 54, 58, 48, 48, 58, 70, 70, - 10, 10,115,110,111,119, 98,114,111, 50, 58, 10,115,110,111,119, 98,114, - 111, 50, 98, 58, 10, 48, 58, 49, 48, 48, 48, 97, 48, 58, 50, 56, 58, 48, - 48, 58, 52, 53, 10, 10,116,114,117,120,116,111,110, 50, 58, 10,116, 97, - 116,115,117,106,110, 50, 58, 10, 48, 58, 49, 48, 48, 51, 48, 48, 58, 55, - 99, 58, 48, 48, 58, 48, 49, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, - 116,111,112,115,112,101,101,100, 46, 99, 32, 10,116,111,112,115,112,101, - 101,100, 58, 10,116,111,112,115,112,101,101,100,117, 58, 10,102,117,108, - 108,116,104,114,108, 58, 10, 48, 58, 52, 48, 48, 48, 56, 48, 58, 54, 98, - 58, 48, 48, 58, 57, 57, 10, 48, 58, 52, 48, 48, 48, 56, 49, 58, 49, 58, - 52, 53, 58, 52, 53, 10, 10, 59, 42, 42, 42, 42, 42, 42,116,111,121,112, - 111,112, 46, 99, 10,108,105, 98,108,114, 97, 98,108, 58, 10, 48, 58, 48, - 56, 54, 55, 58, 48, 52, 58, 48, 48, 58, 48, 48, 10, 48, 58, 48, 56, 55, - 52, 58, 51, 66, 58, 48, 48, 58, 49, 55, 10, 10,116,111,121,112,111,112, - 58, 10, 48, 58, 48, 57, 98, 50, 58, 53, 48, 58, 48, 48, 58, 50, 48, 10, - 48, 58, 48, 56, 52, 57, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, - 42, 42, 42, 42, 42, 42, 42,116,115, 97,109,117,114, 97,105, 46, 99, 10, - 97,108,112,104, 97,120,122, 58, 10, 48, 58, 99, 50, 54,101, 58, 55, 98, - 58, 48, 48, 58, 50,100, 10, 48, 58, 99, 50, 50, 48, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 69, 50, 52, 49, 58, 49, 58, 50, 48, 58, 50, 48, - 10, 48, 58, 69, 50, 50, 49, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, - 69, 50, 48, 49, 58, 49, 58, 51, 57, 58, 51, 57, 10, 48, 58, 69, 49, 69, - 49, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, 58, 69, 49, 67, 49, 58, 49, - 58, 51, 48, 58, 51, 48, 10, 48, 58, 69, 49, 65, 49, 58, 49, 58, 51, 48, - 58, 51, 48, 10, 48, 58, 69, 49, 56, 49, 58, 49, 58, 51, 48, 58, 51, 48, - 10, 10,109, 54, 54, 48, 58, 10,109, 54, 54, 48, 98, 58, 10,109, 54, 54, - 48,106, 58, 10, 48, 58, 99, 50, 55, 48, 58, 55, 98, 58, 48, 48, 58, 50, - 100, 10, 48, 58, 99, 50, 50, 48, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 69, 50, 52, 49, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 69, 50, - 50, 49, 58, 49, 58, 50, 48, 58, 50, 48, 10, 48, 58, 69, 50, 48, 49, 58, - 49, 58, 51, 57, 58, 51, 57, 10, 48, 58, 69, 49, 69, 49, 58, 49, 58, 51, - 48, 58, 51, 48, 10, 48, 58, 69, 49, 67, 49, 58, 49, 58, 51, 48, 58, 51, - 48, 10, 48, 58, 69, 49, 65, 49, 58, 49, 58, 51, 48, 58, 51, 48, 10, 48, - 58, 69, 49, 56, 49, 58, 49, 58, 51, 48, 58, 51, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,116,117,109, 98,108,101,112, 46, 99, 10,116,117, - 109, 98,108,101,112, 58, 10,116,117,109, 98,108,101, 98, 58, 10,116,117, - 109, 98,108,101, 98, 50, 58, 10,116,117,109, 98,108,101,112,106, 58, 10, - 116,117,109, 98,108,101,112, 98, 97, 58, 10, 48, 58, 49, 50, 51, 99, 49, - 48, 58, 97, 48, 58, 52, 52, 58, 53, 48, 10, 48, 58, 49, 50, 51, 99, 48, - 49, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,116,117,116, 97,110,107,104,109, 46, 99, 10,116,117,116, 97,110, - 107,104,109, 58, 10,116,117,116, 97,110,107,104,109,115, 58, 10, 48, 58, - 56, 56, 97, 57, 58, 51, 49, 58, 48, 51, 58, 48, 49, 10, 48, 58, 56, 56, - 97, 54, 58, 51, 58, 48, 51, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, - 42, 42,116,119,105,110, 49, 54, 46, 99, 10,102,114,111,117,110,100, 58, - 10,104,112,117,110, 99,104,101,114, 58, 10,102,114,111,117,110,100,108, - 58, 10, 49, 58, 52, 48, 48, 55, 48, 58, 52, 58, 48, 49, 58, 48, 48, 10, - 49, 58, 52, 48, 51, 48, 48, 58, 53, 48, 58, 52, 97, 58, 48, 48, 10, 10, - 118,117,108, 99, 97,110, 58, 10,103,114, 97,100,105,117,115, 50, 58, 10, - 103,114, 97,100,105,117,115, 50, 97, 58, 10,103,114, 97,100,105,117,115, - 50, 98, 58, 10,118,117,108, 99, 97,110, 97, 58, 10,118,117,108, 99, 97, - 110, 98, 58, 10, 48, 58, 54, 48, 48, 97, 49, 58, 54, 51, 58, 50, 50, 58, - 51, 48, 10, 48, 58, 54, 48, 48, 53, 56, 58, 52, 58, 48, 48, 58, 51, 48, - 10, 48, 58, 54, 48, 48, 48, 56, 58, 49, 58, 49,100, 58, 49,100, 10, 10, - 102,115,104, 97,114,107, 58, 10,102,115,104, 97,114,107, 98,116, 58, 10, - 115,107,121,115,104, 97,114,107, 58, 10,104,105,115,104,111,117,122, 97, - 58, 10,102,115,104, 97,114,107, 98,108, 97, 58, 10,102,110,115,104, 97, - 114,107, 58, 10,115,107,121,115,104, 97,114,107, 97, 58, 10, 48, 58, 51, - 48, 49, 54, 97, 58, 49, 54, 99, 58, 48, 48, 58, 48, 49, 10, 48, 58, 51, - 48, 51, 56,100, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 51, 48, 51, - 56,102, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 51, 48, 51, 57, 49, - 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 51, 48, 51, 57, 51, 58, 49, - 58, 48, 51, 58, 48, 51, 10, 48, 58, 51, 48, 51, 57, 53, 58, 49, 58, 48, - 48, 58, 48, 48, 10, 48, 58, 51, 48, 51, 57, 55, 58, 49, 58, 48, 48, 58, - 48, 48, 10, 48, 58, 51, 48, 51, 57, 57, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 51, 48, 51, 57, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, - 107,116,105,103,101,114, 58, 10, 48, 58, 51, 49, 50, 56, 48, 58, 49, 54, - 99, 58, 48, 48, 58, 48, 49, 10, 48, 58, 51, 49, 52, 56,102, 58, 49, 58, - 50,100, 58, 50,100, 10, 48, 58, 51, 49, 52, 57, 49, 58, 49, 58, 50,100, - 58, 50,100, 10, 48, 58, 51, 49, 52, 57, 51, 58, 49, 58, 50,100, 58, 50, - 100, 10, 48, 58, 51, 49, 52, 57, 53, 58, 49, 58, 48, 51, 58, 48, 51, 10, - 48, 58, 51, 49, 52, 57, 55, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 51, 49, 52, 57, 57, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, - 52, 57, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 51, 49, 52, 57, - 100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10,116,119,105,110, 99,111, 98, - 114, 58, 10,116,119,105,110, 99,111, 98,114,117, 58, 10, 48, 58, 51, 49, - 53, 97, 50, 58, 49, 54, 99, 58, 48, 48, 58, 48, 49, 10, 48, 58, 51, 49, - 55, 97,102, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 51, 49, 55, 98, - 49, 58, 49, 58, 50,100, 58, 50,100, 10, 48, 58, 51, 49, 55, 98, 51, 58, - 49, 58, 50,100, 58, 50,100, 10, 48, 58, 51, 49, 55, 98, 53, 58, 49, 58, - 48, 51, 58, 48, 51, 10, 48, 58, 51, 49, 55, 98, 55, 58, 49, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 51, 49, 55, 98, 57, 58, 49, 58, 48, 48, 58, 48, - 48, 10, 48, 58, 51, 49, 55, 98, 98, 58, 49, 58, 48, 48, 58, 48, 48, 10, - 48, 58, 51, 49, 55, 98,100, 58, 49, 58, 48, 48, 58, 48, 48, 10, 10, 59, - 42, 42, 42, 42, 42, 42, 42, 42,117,108,116,114, 97,109, 97,110, 46, 99, - 10,117,108,116,114, 97,109, 97,110, 58, 10, 48, 58, 56,102,102, 48, 48, - 58, 54, 52, 58, 48, 49, 58, 48, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,118, 97,112,111,114,116,114, 97, 46, 99, 10,118, 97,112,111,114, - 116,114, 97, 58, 10,118, 97,112,111,114,116,114,117, 58, 10,107,117,104, - 103, 97, 58, 10,118, 97,112,111,114,116,114, 97, 51, 58, 10, 48, 58,102, - 102,102, 53,100, 52, 58, 55, 56, 58, 50,101, 58, 48, 48, 10, 48, 58,102, - 102, 99, 48, 50, 52, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, - 42, 42, 42, 42, 42, 42,118,101,110,100,101,116,116, 97, 46, 99, 10,118, - 101,110,100,101,116,116, 97, 58, 10,118,101,110,100,101,116,116, 97,114, - 58, 10,118,101,110,100,101,116,116, 97, 50,112, 58, 10,118,101,110,100, - 101,116,116, 97, 50,112,117, 58, 10,118,101,110,100,101,116,116, 97, 50, - 112,100, 58, 10,118,101,110,100,101,116,116, 97,106, 58, 10,118,101,110, - 100,101,116,116, 97, 50,112,101, 98, 97, 58, 10,118,101,110,100,101,116, - 116, 97,122, 58, 10, 48, 58, 50, 57, 56, 48, 58, 50, 56, 58, 48, 48, 58, - 52, 56, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42,118,105, 99,100,117, 97, - 108, 46, 99, 10, 99, 97,114,110,105,118, 97,108, 58, 32, 59, 42,110,111, - 116,101, 42, 32,114,101,115,101,116,116,105,110,103, 32, 99,111,114,114, - 117,112,116,115, 32,116,104,101, 32,115, 99,114,101,101,110, 32,110,111, - 116, 32,116,104,101, 32,102,105,108,101, 10, 99, 97,114,110,105,118, 97, - 108, 99, 58, 10, 48, 58,101, 51, 57, 55, 58, 51, 99, 58, 48, 48, 58, 48, - 48, 10, 48, 58,101, 53, 97, 50, 58, 57, 58, 50, 48, 58, 50, 48, 10, 10, - 100,105,103,103,101,114, 58, 10, 48, 58, 56, 51, 56, 54, 58, 98, 58, 53, - 51, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,117,108, - 103,117,115, 46, 99, 10,118,117,108,103,117,115, 97, 58, 10, 48, 58, 69, - 69, 48, 48, 58, 52, 49, 58, 48, 48, 58, 50, 48, 10, 48, 58, 69, 69, 52, - 55, 58, 48, 51, 58, 48, 48, 58, 48, 48, 10, 10,118,117,108,103,117,115, - 58, 10,118,117,108,103,117,115,106, 58, 10, 48, 58, 69, 69, 48, 48, 58, - 52, 49, 58, 48, 48, 58, 50, 69, 10, 48, 58, 69, 69, 52, 55, 58, 48, 51, - 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119, - 101, 99,108,101,109, 97,110, 46, 99, 10,104,111,116, 99,104, 97,115,101, - 58, 10,104,111,116, 99,104, 97,115,101, 97, 58, 10, 48, 58, 54, 49, 48, - 98, 48, 58, 53, 48, 58, 48, 48, 58, 48,100, 10, 48, 58, 54, 48, 48, 51, - 52, 58, 52, 58, 48, 48, 58, 48, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, - 42, 42,119,105,112,105,110,103, 46, 99, 10,119,105,112,105,110,103, 58, - 10, 48, 58, 57, 48, 54,102, 58, 56, 50, 58, 48, 51, 58, 53, 52, 10, 10, - 114,117,103,114, 97,116,115, 58, 10, 48, 58, 57, 48, 54,102, 58, 56, 50, - 58, 49, 48, 58, 53, 52, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119, - 105,122, 46, 99, 10,115, 99,105,111,110, 58, 10, 48, 58, 99, 48, 55, 48, - 58, 53, 48, 58, 48, 48, 58, 49,101, 10, 48, 58,100, 48, 54, 50, 58, 55, - 58, 49, 48, 58, 48, 48, 10, 10,115, 99,105,111,110, 99, 58, 10, 48, 58, - 99, 48, 55, 48, 58, 53, 48, 58, 48, 48, 58, 49, 48, 10, 48, 58,100, 48, - 54, 50, 58, 55, 58, 49, 48, 58, 49, 48, 10, 10,115,116,105,110,103,101, - 114, 58, 10,115,116,105,110,103,101,114, 50, 58, 10, 48, 58, 99, 48, 51, - 49, 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 48, 55, 57, 58, - 54, 58, 48, 48, 58, 48, 48, 10, 48, 58, 99, 50, 48, 48, 58, 49, 51, 58, - 49,100, 58, 50, 51, 10, 10,119,105,122, 58, 10,119,105,122,116, 58, 10, - 119,105,122,116, 97, 58, 10, 48, 58, 99, 48, 49,101, 58, 51, 50, 58, 48, - 48, 58, 52, 51, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120,101,120, - 101,120, 46, 99, 10,120,101,120,101,120, 97, 58, 10,120,101,120,101,120, - 58, 10,120,101,120,101,120,106, 58, 10,111,114,105,117,115, 58, 10, 48, - 58, 56, 53, 48, 48, 48, 58, 54, 51, 58, 48, 48, 58, 49, 99, 10, 48, 58, - 56, 48, 48, 53, 55, 58, 51, 58, 48, 48, 58, 51, 48, 10, 10,120,109,101, - 110, 58, 10,120,109,101,110, 50,112, 58, 10,120,109,101,110,106, 58, 10, - 120,109,101,110, 50,112,106, 58, 10,120,109,101,110, 54,112,117, 58, 10, - 120,109,101,110, 54,112, 58, 10,120,109,101,110, 50,112, 97, 58, 10,120, - 109,101,110, 50,112,101, 58, 10,120,109,101,110,101, 58, 10,120,109,101, - 110, 97, 58, 10,120,109,101,110, 97, 97, 58, 10,120,109,101,110, 50,112, - 117, 58, 10, 48, 58, 49, 49, 51, 51, 48, 48, 58, 49, 54, 56, 58, 48, 48, - 58, 49, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120,121, 98,111, - 116,115, 46, 99, 10,120,121, 98,111,116,115, 58, 10, 48, 58,102,102, 97, - 99, 50, 50, 58, 99, 97, 58, 48, 48, 58, 97, 52, 10, 10, 59, 42, 42, 42, - 42, 42, 42, 42, 42,121, 97,114,100, 46, 99, 10, 49, 48,121, 97,114,100, - 58, 10, 49, 48,121, 97,114,100,106, 58, 10,118,115, 49, 48,121, 97,114, - 100, 58, 10,118,115, 49, 48,121, 97,114,100,106, 58, 10, 49, 48,121, 97, - 114,100, 56, 53, 58, 10,118,115, 49, 48,121, 97,114,100,117, 58, 10, 48, - 58,101, 54, 48, 48, 58, 56, 97, 58, 48, 48, 58, 52, 97, 10, 48, 58,101, - 48, 48, 56, 58, 51, 58, 48, 48, 58, 48, 51, 10, 10, 59, 42, 42, 42, 42, - 42, 42, 42, 42,121,105,101, 97,114, 46, 99, 10,121,105,101, 97,114, 58, - 10, 48, 58, 53, 53, 50, 48, 58, 56, 99, 58, 48, 48, 58, 49, 48, 10, 48, - 58, 53, 50, 49, 99, 58, 51, 58, 48, 48, 58, 52, 48, 10, 10,121,105,101, - 97,114, 50, 58, 10, 48, 58, 53, 53, 50, 48, 58, 56, 99, 58, 48, 48, 58, - 49, 48, 10, 48, 58, 53, 50, 49, 99, 58, 51, 58, 48, 48, 58, 55, 48, 10, - 10,121,105,101, 97,114,116,102, 58, 10, 48, 58, 50,100, 50, 48, 58, 56, - 99, 58, 48, 48, 58, 49, 48, 10, 48, 58, 50, 97, 49, 99, 58, 51, 58, 48, - 48, 58, 52, 48, 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120, 97, 99, - 99, 97,114,105, 97, 46, 99, 10,106, 97, 99,107,114, 97, 98,116, 58, 10, - 106, 97, 99,107,114, 97, 98,116, 50, 58, 10,106, 97, 99,107,114, 97, 98, - 116,115, 58, 10, 48, 58, 55, 51, 98, 97, 58, 52, 56, 58, 48, 97, 58, 48, - 48, 10, 48, 58, 55, 50, 55,100, 58, 51, 58, 48, 48, 58, 48, 48, 10, 48, - 58, 54, 48, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, - 55,101, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 48, 57,101, 58, - 49, 58,102,102, 58,102,102, 10, 48, 58, 54, 48, 98,101, 58, 49, 58,102, - 102, 58,102,102, 10, 48, 58, 54, 48,100,101, 58, 49, 58,102,102, 58,102, - 102, 10, 48, 58, 54, 48,102,101, 58, 49, 58,102,102, 58,102,102, 10, 10, - 59, 42, 42, 42, 42, 42, 42, 42, 42,122, 97,120,120,111,110, 46, 99, 10, - 122, 97,120,120,111,110, 58, 10,122, 97,120,120,111,110, 50, 58, 10,122, - 97,120,120,111,110, 98, 58, 10,115,122, 97,120,120,111,110, 58, 10,122, - 97,120,120,111,110,106, 58, 10,122, 97,120,120,111,110, 51, 58, 10, 48, - 58, 54, 49, 48, 48, 58, 55,101, 58, 57, 48, 58, 56, 49, 10, 48, 58, 54, - 48, 51, 56, 58, 51, 58, 48, 48, 58, 48, 48, 10, 10,102,117,116,115,112, - 121, 58, 10, 48, 58, 54, 52, 49, 57, 58, 51, 99, 58, 48, 48, 58, 52, 49, - 10, 10,114, 97,122,109, 97,116, 97,122, 58, 10, 48, 58, 54, 54, 97, 52, - 58, 49,101, 58, 48, 48, 58, 48, 48, 10, 48, 58, 54, 55, 51, 57, 58, 51, - 99, 58, 50, 53, 58, 51,101, 10, 10, 59, 83,112,105,100,101,114,115, 32, - 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98,121, 32, 71,101,111, - 77, 97,110, 41, 10,115,112,105,100,101,114,115, 58, 10,115,112,105,100, - 101,114,115, 50, 58, 10, 48, 58, 49, 99, 49, 51, 58, 51, 58, 48, 58, 48, - 10, 48, 58, 49,101, 52, 50, 58,102, 58, 48, 58, 48, 10, 10,115,112,105, - 100,101,114,115, 51, 58, 10, 48, 58, 49, 99, 49, 50, 58, 51, 58, 48, 48, - 58, 48, 48, 10, 48, 58, 49,101, 52, 49, 58,102, 58, 48, 48, 58, 48, 48, - 10, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,122,101,114,111,122,111,110, - 101, 46, 99, 10,122,101,114,111,122,111,110,101, 58, 10, 48, 58, 99, 49, - 55, 99,100, 58, 55, 55, 58, 53, 51, 58, 48, 48, 10, 48, 58, 99, 50, 51, - 100, 97, 58, 54, 58, 48, 48, 58, 48, 48, 10, 10,122,111,100,105, 97, 99, - 107, 58, 10, 48, 58, 53, 56, 53, 55, 58, 51, 55, 58, 48, 48, 58, 50, 52, - 10, 48, 58, 98, 50,100,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, - 98, 50,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, 48, 58, 98, 51, 49, - 102, 58, 49, 58, 48, 49, 58, 48, 49, 10, 48, 58, 98, 51, 51,102, 58, 49, - 58, 48, 50, 58, 48, 50, 10, 48, 58, 98, 51, 53,102, 58, 49, 58, 48, 56, - 58, 48, 56, 10, 48, 58, 98, 51, 55,102, 58, 49, 58, 48, 48, 58, 48, 48, - 10, 48, 58, 98, 51, 57,102, 58, 49, 58, 48, 48, 58, 48, 48, 10, + 121,115,116,101,109, 32, 50, 41, 13, 10, 48, 58, 99, 49, 48, 48, 58, 49, + 52, 48, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58,101, 48, 53, 54, 58,102, + 58, 48, 49, 58, 49, 48, 13, 10, 13, 10,119, 98,109,108,106,111, 58, 13, + 10,119, 98,109,108,106, 98, 58, 13, 10,119, 98,109,108, 58, 13, 10,119, + 98,109,108, 98,103, 58, 13, 10,119, 98,109,108, 98,103,101, 58, 13, 10, + 119, 98,109,108,118, 99, 58, 13, 10,119, 98,109,108,100, 58, 13, 10,119, + 98,109,108,106,111,100, 58, 13, 10,119, 98,109,108,118, 99,100, 58, 13, + 10, 48, 58, 99, 49, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, + 58, 48, 55, 50,102, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 99, + 49, 55, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 49, 55, + 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 49, 55, 98, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 49, 55, 99, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 49, 55,100, 58, 49, 58, 48, 51, + 58, 48, 51, 13, 10, 48, 58, 99, 49, 55,101, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 99, 49, 55,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 99, 49, 56, 48, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, 46, + 99, 32, 40,119,111,110,100,101,114, 32, 98,111,121, 32,105,110, 32,109, + 111,110,115,116,101,114, 32,108, 97,110,100, 32, 40, 98,111,111,116,108, + 101,103, 41, 42, 42,102,105,120, 42, 42, 41, 41, 13, 10,119, 98,109,108, + 98, 58, 13, 10, 48, 58, 99, 49, 55, 57, 58, 56, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 99, 49, 55,100, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,115,121,115,116,101,109, 49, + 54, 46, 99, 13, 10, 97, 98,117,114,110,101,114, 58, 13, 10, 48, 58,102, + 102, 56, 52, 54,101, 58, 49, 49, 55, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58,102,102, 56, 53, 55,102, 58, 49, 58, 52,102, 58, 52,102, 13, 10, 13, + 10, 97, 98,117,114,110,101,114, 50, 58, 13, 10, 97, 98,117,114,110,101, + 114, 50,103, 58, 13, 10, 48, 58,102,102, 56, 52, 54,101, 58, 49, 49, 55, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 52, 54,102, 58, 49, + 58, 55, 48, 58, 55, 48, 13, 10, 13, 10,102, 97,110,116,122,111,110,101, + 58, 13, 10,102, 97,110,116,122,111,110,101,116, 97, 58, 13, 10, 48, 58, + 102,102,102, 99, 48, 48, 58, 51, 56, 58, 48, 48, 58, 53, 50, 13, 10, 48, + 58,102,102, 99, 50, 50, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, + 10,102, 97,110,116,122,111,110,111, 58, 13, 10,102, 97,110,116,122,111, + 110,101,112, 58, 13, 10,102, 97,110,116,122,111,110,101,112,114, 58, 13, + 10,102, 97,110,116,122,111,110,101, 49, 58, 13, 10, 48, 58,102,102,102, + 99, 48, 48, 58, 51, 56, 58, 48, 48, 58, 57, 53, 13, 10, 48, 58,102,102, + 99, 50, 50, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,104,119, + 99,104, 97,109,112, 58, 13, 10,104,119, 99,104, 97,109,112,106, 58, 13, + 10,104,119, 99,104, 97,109,112,106,100, 58, 13, 10, 48, 58,102,102,102, + 52, 48, 48, 58, 51, 49, 56, 58, 49, 48, 58, 48, 48, 13, 10, 13, 10,116, + 101,116,114,105,115, 98,108, 58, 13, 10, 48, 58,102,102,101, 56, 48, 48, + 58, 54, 52, 58, 52, 53, 58, 48, 56, 13, 10, 13, 10,116,101,116,114,105, + 115,116, 58, 13, 10, 48, 58, 56, 48, 52, 53, 97, 99, 58, 54, 52, 58, 52, + 53, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 84,101,116, + 114,105,115, 32, 40, 74, 97,112, 97,110, 44, 32, 66, 45, 83,121,115,116, + 101,109, 44, 32, 89, 77, 50, 50, 48, 51, 41, 13, 10,116,101,116,114,105, + 115,116, 97, 58, 13, 10, 48, 58, 56, 48, 50, 51, 97, 99, 58, 54, 52, 58, + 52, 53, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 84,101, + 116,114,105,115, 32, 40, 74, 97,112, 97,110, 44, 32, 83,121,115,116,101, + 109, 32, 49, 54, 65, 44, 32, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, 45, + 48, 48, 57, 51, 97, 41, 13, 10,116,101,116,114,105,115, 50, 58, 13, 10, + 116,101,116,114,105,115, 51, 58, 32, 32, 59, 42, 42, 42, 42, 42, 42,116, + 101,116,114,105,115, 32, 40, 74, 97,112, 97,110, 44, 32, 83,121,115,116, + 101,109, 32, 49, 54, 65, 44, 32, 70, 68, 49, 48, 57, 52, 32, 51, 49, 55, + 45, 48, 48, 57, 51, 41, 13, 10,116,101,116,114,105,115, 58, 13, 10,116, + 101,116,114,105,115, 49, 58, 13, 10,116,101,116,114,105,115, 49,100, 58, + 13, 10,116,101,116,114,105,115, 50,100, 58, 13, 10,116,101,116,114,105, + 115, 51,100, 58, 13, 10,116,101,116,114,105,115,100, 58, 13, 10, 48, 58, + 102,102,101, 56, 48, 48, 58, 54, 52, 58, 52, 53, 58, 48, 56, 13, 10, 13, + 10,116,105,109,115, 99, 97,110,114, 58, 13, 10,116,105,109,101,115, 99, + 110, 58, 13, 10, 48, 58,102,102, 99, 48, 51, 54, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,102,102, 99, 48, 51, 55, 58, 50, 58, 48, 49, 58, + 50, 48, 13, 10, 48, 58,102,102, 99, 48, 51, 57, 58, 49, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58,102,102,102, 55, 53, 48, 58, 52, 54, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97, + 105,108, 50,110,111,115, 46, 99, 13, 10,116, 97,105,108, 50,110,111,115, + 58, 13, 10,115,102,111,114,109,117,108, 97, 58, 13, 10,115,102,111,114, + 109,117,108, 97, 97, 58, 13, 10, 48, 58,102,102, 56, 57, 99, 52, 58, 49, + 51, 48, 58, 48, 97, 58, 48, 48, 13, 10, 48, 58,102,102, 56, 98, 48, 53, + 58,102, 58, 52, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,116, 97,105,116,111,115,106, 46, 99, 13, 10, 97,108,112,105, + 110,101, 58, 13, 10, 97,108,112,105,110,101, 97, 58, 13, 10, 48, 58, 56, + 48, 56, 50, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 53, 98, + 101, 58, 49, 58, 50, 53, 58, 50, 53, 13, 10, 48, 58, 99, 53,100,101, 58, + 49, 58, 50, 53, 58, 50, 53, 13, 10, 48, 58, 99, 53,102,101, 58, 49, 58, + 48, 53, 58, 48, 53, 13, 10, 48, 58, 99, 54, 49,101, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 99, 54, 51,101, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 99, 54, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,101,108,101,118, 97,116,111,114, 58, 13, 10,101,108,101,118, + 97,116,111,114, 98, 58, 13, 10, 48, 58, 56, 51, 53, 48, 58, 51, 58, 48, + 48, 58, 48, 49, 13, 10, 13, 10,102,114,111,110,116,108,105,110, 58, 13, + 10, 48, 58, 56, 54, 52, 48, 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, 48, + 58, 99, 53, 98,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, + 53,100,101, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 99, 53,102, + 101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 54, 49,101, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 54, 51,101, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 99, 54, 53,101, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 13, 10,104,119,114, 97, 99,101, 58, 13, 10, 48, 58, + 56, 48, 99, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, + 99, 49, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, 10,106,117,110,103, + 108,101,107, 58, 13, 10,106,117,110,103,108,101,104, 58, 13, 10,106,117, + 110,103,108,101,104, 98,114, 58, 13, 10,106,117,110,103,108,101,107,106, + 50, 58, 13, 10,106,117,110,103,108,101, 98,121, 58, 13, 10,106,117,110, + 103,108,101,107, 97,115, 58, 13, 10, 48, 58, 56, 49, 54, 98, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 49, 54, 99, 58, 49, 58, 53, 48, + 58, 53, 48, 13, 10, 48, 58, 56, 49, 54,100, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10,112,105,114, 97,116,112,101,116, 58, 13, 10, 48, 58, + 56, 49, 54, 99, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 49, + 54,100, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 48, 58, 56, 49, 54,101, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,105,110,115,116, 97, + 114, 58, 13, 10,116,105,110,115,116, 97,114, 50, 58, 13, 10, 48, 58, 56, + 51, 53,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 51, 53, + 101, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, 58, 56, 51, 53,102, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,119,119,101,115,116,101,114, + 110, 58, 13, 10,119,119,101,115,116,101,114,110, 49, 58, 13, 10, 48, 58, + 56, 54, 51, 48, 58, 53, 99, 58, 48, 49, 58, 98, 97, 13, 10, 48, 58, 99, + 53, 98,101, 58, 50, 58, 48, 48, 58, 49,100, 13, 10, 48, 58, 99, 53,100, + 101, 58, 50, 58, 48, 49, 58, 48, 97, 13, 10, 48, 58, 99, 53,102,101, 58, + 50, 58, 48, 48, 58, 49, 50, 13, 10, 48, 58, 99, 54, 49,101, 58, 50, 58, + 48, 48, 58, 49,100, 13, 10, 48, 58, 99, 54, 51,101, 58, 50, 58, 48, 48, + 58, 49, 56, 13, 10, 48, 58, 99, 54, 53,101, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116, + 111, 95, 98, 46, 99, 13, 10, 97,115,104,117,114, 97, 58, 13, 10, 97,115, + 104,117,114, 97,106, 58, 13, 10, 48, 58, 54, 48, 49, 57,102, 52, 58, 54, + 52, 58, 48, 48, 58, 49, 57, 13, 10, 48, 58, 54, 48, 49, 50, 97, 50, 58, + 50, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 49, 50, 97, 52, 58, + 50, 58, 49, 48, 58, 48, 48, 13, 10, 13, 10, 99,114,105,109,101, 99, 58, + 13, 10, 99,114,105,109,101, 99,106, 58, 13, 10, 99,114,105,109,101, 99, + 117, 58, 13, 10, 48, 58, 97, 48, 50,102, 98, 97, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 97, 48,101, 48, 48, 53, 58, 52, 97,102, 58, 53, + 52, 58, 48, 48, 13, 10, 13, 10,115,101,108,102,101,101,110, 97, 58, 13, + 10, 48, 58, 49, 48, 51, 51, 56,101, 58, 51, 97, 58, 52, 49, 58, 48, 48, + 13, 10, 48, 58, 49, 48, 50, 52, 56, 49, 58, 49, 58, 49, 57, 58, 49, 57, + 13, 10, 48, 58, 49, 48, 50, 52, 56, 51, 58, 49, 58, 48, 99, 58, 48, 99, + 13, 10, 13, 10,115,112, 97, 99,101,100,120, 58, 13, 10,115,112, 97, 99, + 101,100,120,106, 58, 13, 10, 48, 58, 57, 48, 50, 55, 48, 49, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 48,102,102, 57, 98, 58, 49, 58, + 51, 55, 58, 51, 55, 13, 10, 13, 10,115,112, 99,105,110,118,100,106, 58, + 13, 10, 48, 58, 52, 48, 52,102, 55, 51, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, 97,105,116,111, + 95,102, 50, 46, 99, 13, 10, 99, 97,109,101,108,116,114,121, 58, 13, 10, + 59, 42,110,111,116,101, 32, 99, 97,110,116, 32,115,101,101, 32,104,105, + 103,104,115, 99,111,114,101, 32,116, 97, 98,108,101, 32,105,110, 32, 99, + 97,109,101,108,116,114,121, 32,115,111, 32,105,116,115, 32, 99,111,109, + 109,101,110,116,101,100, 32,111,117,116, 13, 10, 59, 99, 97,109,101,108, + 116,114,117, 58, 13, 10, 48, 58, 49, 48, 54, 99, 57,101, 58, 50, 52, 52, + 58, 51, 53, 58, 52, 52, 13, 10, 48, 58, 49, 48, 54, 54, 98, 48, 58, 51, + 101, 58, 48, 54, 58, 48, 48, 13, 10, 48, 58, 49, 48, 53, 52, 51, 48, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,100,101, 97,100, 99,111,110, + 120, 58, 13, 10,100,101, 97,100, 99,111,110,120,106, 58, 13, 10, 48, 58, + 49, 48, 51, 51, 53, 97, 58, 53, 57, 58, 48, 48, 58, 52, 55, 13, 10, 13, + 10,100,111,110,100,111,107,111,100, 58, 13, 10,100,111,110,100,111,107, + 111,100,117, 58, 13, 10,100,111,110,100,111,107,111,100,106, 58, 13, 10, + 48, 58, 49, 48, 50, 56,101, 56, 58, 50, 56, 58, 48, 48, 58, 53, 53, 13, + 10, 13, 10,103,117,110,102,114,111,110,116, 58, 13, 10,103,117,110,102, + 114,111,110,116,106, 58, 13, 10, 48, 58, 49, 48, 57, 50, 50, 99, 58, 53, + 52, 58, 48, 48, 58, 51, 48, 13, 10, 48, 58, 49, 48, 57, 50, 50,101, 58, + 49, 58, 99, 51, 58, 99, 51, 13, 10, 13, 10,108,105,113,117,105,100,107, + 58, 13, 10,108,105,113,117,105,100,107,117, 58, 13, 10,109,105,122,117, + 98, 97,107,117, 58, 13, 10, 48, 58, 49, 48, 66, 48, 70, 69, 58, 50, 56, + 58, 48, 48, 58, 53, 53, 13, 10, 13, 10,109,101,116, 97,108, 98, 58, 13, + 10,109,101,116, 97,108, 98,106, 58, 13, 10, 48, 58, 49, 48,101, 51, 97, + 97, 58, 50, 56, 58, 48, 48, 58, 48, 52, 13, 10, 48, 58, 49, 48,100, 48, + 98, 48, 58, 52, 58, 48, 48, 58, 53, 48, 13, 10, 13, 10,115,115,105, 58, + 13, 10,115,115,105, 97, 58, 13, 10, 48, 58, 50, 48, 53, 56, 49, 52, 58, + 51, 49, 58, 48, 48, 58, 53, 97, 13, 10, 48, 58, 50, 48, 51, 54, 48, 54, + 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,109, 97,106,101,115,116, + 49, 50, 58, 13, 10,109, 97,106,101,115,116, 49, 50,106, 58, 13, 10,109, + 97,106,101,115,116, 49, 50,117, 58, 13, 10, 48, 58, 50, 48, 53, 56, 49, + 50, 58, 51, 49, 58, 48, 48, 58, 53, 97, 13, 10, 48, 58, 50, 48, 51, 54, + 48, 54, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 97,114,107,114, + 101,116,114,110, 58, 13, 10, 97,114,107,114,101,116,114,110,106, 58, 13, + 10, 97,114,107,114,101,116,114,110,117, 58, 13, 10, 48, 58, 52, 48, 49, + 97, 49, 97, 58, 50, 55, 58, 48, 48, 58, 49, 55, 13, 10, 13, 10, 98,117, + 98, 98,108,101,109, 58, 13, 10, 98,117, 98, 98,108,101,109,106, 58, 13, + 10, 48, 58, 52, 48,102, 50,101, 99, 58, 49, 48,101, 58, 48, 48, 58, 48, + 56, 13, 10, 48, 58, 52, 48, 55, 49, 51, 53, 58, 51, 58, 50, 55, 58, 49, + 51, 13, 10, 48, 58, 52, 48,101, 98, 48, 52, 58, 53, 48, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 13, 10, 98,117, 98,108, 98,111, 98, 50,111, 58, + 13, 10, 98,117, 98,115,121,109,112,104,106, 58, 13, 10, 98,117, 98,115, + 121,109,112,104,117, 58, 13, 10, 98,117, 98,115,121,109,112,104,101, 58, + 13, 10, 98,117, 98,115,121,109,112,104, 98, 58, 13, 10, 98,117, 98,108, + 98,111, 98, 50, 58, 13, 10, 48, 58, 52, 48,101,100, 54, 99, 58, 57, 54, + 58, 48, 48, 58, 48, 55, 13, 10, 48, 58, 52, 48,101,100, 56,100, 58, 49, + 58, 48, 54, 58, 48, 54, 13, 10, 48, 58, 52, 48,101, 97, 50, 48, 58, 56, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,103,115,101,101,107,101,114, + 58, 13, 10,103,115,101,101,107,101,114,106, 58, 13, 10,103,115,101,101, + 107,101,114,117, 58, 13, 10, 48, 58, 52, 49, 48, 55, 98, 97, 58, 53, 48, + 58, 48, 48, 58,102, 56, 13, 10, 48, 58, 52, 48,100, 49, 55, 54, 58, 52, + 58, 48, 48, 58, 53, 48, 13, 10, 13, 10,103,117,110,108,111, 99,107, 58, + 13, 10,114, 97,121,102,111,114, 99,101, 58, 13, 10,114, 97,121,102,111, + 114, 99,101,106, 58, 13, 10, 48, 58, 52, 48,101,102,102, 52, 58, 52, 48, + 58, 52, 49, 58, 48, 48, 13, 10, 48, 58, 52, 48, 50, 50,102, 97, 58, 52, + 58, 48, 49, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,116, 97,105,116,111, 95,108, 46, 99, 13, 10,102,104, 97,119,107, 58, + 13, 10,102,104, 97,119,107,106, 58, 13, 10, 48, 58, 97, 50,102,101, 58, + 53, 48, 58, 53, 48, 58, 50,101, 13, 10, 48, 58, 97, 50, 52,101, 58, 51, + 58, 53, 48, 58, 48, 48, 13, 10, 13, 10,112, 97,108, 97,109,101,100, 58, + 13, 10, 48, 58, 56, 50, 48, 54, 58, 50,101, 58, 50, 48, 58, 53, 50, 13, + 10, 13, 10,112,108,103,105,114,108,115, 50, 58, 13, 10,112,108,103,105, + 114,108,115, 50, 98, 58, 13, 10, 48, 58, 56, 49,101, 48, 58, 51, 53, 58, + 48, 48, 58, 48, 53, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 116, 97,110,107, 98, 97,116,116, 46, 99, 13, 10,116, 97,110,107, 98, 97, + 116,116, 58, 13, 10,116, 97,110,107, 98, 97,116,116, 98, 58, 13, 10, 48, + 58, 48, 48, 99, 51, 58, 48, 50, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 114,121,103, 97,114, 58, 13, 10,114,121,103, 97,114, 50, 58, 13, 10,114, + 121,103, 97,114,106, 58, 13, 10,114,121,103, 97,114, 51, 58, 13, 10, 48, + 58, 99, 57, 56, 51, 58, 49, 99, 52, 58, 52, 49, 58, 48, 13, 10, 48, 58, + 99, 48, 50, 51, 58, 50, 58, 48, 58, 48, 13, 10, 48, 58, 99, 48, 50, 53, + 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 99, 48, 50, 54, 58, 49, + 58, 48, 58, 48, 13, 10, 48, 58,100, 48, 54, 99, 58, 56, 58, 49, 58, 54, + 48, 13, 10, 13, 10,115,105,108,107,119,111,114,109, 58, 13, 10,115,105, + 108,107,119,111,114,109,106, 58, 13, 10, 48, 58,100, 50, 54, 50, 58, 54, + 52, 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, 99, 56, 52, 56, 58, 49, 56, + 58, 50, 48, 58, 51, 48, 13, 10, 48, 58,100, 53, 52,101, 58, 52, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,100, 53, 55, 50, 58, 52, 58, 48, 48, 58, + 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,101,114, + 114, 97, 99,114,101, 46, 99, 13, 10,116,101,114,114, 97, 99,114,101,110, + 58, 13, 10,116,101,114,114, 97, 99,114,101, 58, 13, 10,116,101,114,114, + 97, 99,114,101, 97, 58, 13, 10,116,101,114,114, 97, 99,114,101,111, 58, + 13, 10, 48, 58, 50, 48, 50, 52, 54, 58, 52, 54, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 50, 48, 50, 56, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 50, 48, 50, 52, 56, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,104,101,112,105,116, 46, + 99, 13, 10,102,105,116,116,101,114, 58, 13, 10,114,111,117,110,100,117, + 112, 58, 13, 10,102,105,116,116,101,114, 98,108, 58, 13, 10,116,116,102, + 105,116,116,101,114, 58, 13, 10, 48, 58, 56, 48, 53, 48, 58, 48, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 54, 50, 49, 58, 48, 49, 58, 50, + 52, 58, 50, 52, 13, 10, 48, 58, 57, 54, 48, 49, 58, 48, 49, 58, 50, 52, + 58, 50, 52, 13, 10, 48, 58, 57, 53, 69, 49, 58, 48, 49, 58, 50, 52, 58, + 50, 52, 13, 10, 48, 58, 57, 53, 67, 49, 58, 48, 49, 58, 50, 52, 58, 50, + 52, 13, 10, 48, 58, 57, 53, 65, 49, 58, 48, 49, 58, 50, 52, 58, 50, 52, + 13, 10, 48, 58, 57, 53, 56, 49, 58, 48, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,109, 97, 99,104,111,109,111,117, 58, 13, 10, 48, 58, 56, 48, + 52, 97, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 49, 56, 49, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 49, 97, 49, 58, 49, + 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 99, 49, 58, 49, 58, 50, + 52, 58, 50, 52, 13, 10, 48, 58, 57, 49,101, 49, 58, 49, 58, 50, 52, 58, + 50, 52, 13, 10, 48, 58, 57, 50, 48, 49, 58, 49, 58, 50, 52, 58, 50, 52, + 13, 10, 48, 58, 57, 50, 50, 49, 58, 49, 58, 50, 52, 58, 50, 52, 13, 10, + 13, 10,115,117,112,114,109,111,117,115, 58, 13, 10, 48, 58, 56, 48, 52, + 65, 58, 48, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 57, 50, 50, 49, + 58, 48, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 50, 48, 49, 58, + 48, 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 69, 49, 58, 48, + 49, 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 67, 49, 58, 48, 49, + 58, 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 65, 49, 58, 48, 49, 58, + 50, 52, 58, 50, 52, 13, 10, 48, 58, 57, 49, 56, 49, 58, 48, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116, + 104,105,101,102, 46, 99, 13, 10,116,104,105,101,102, 58, 13, 10, 48, 58, + 56, 97, 98, 99, 58, 52, 57, 58, 51, 48, 58, 50, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,116,104,117,110,100,101,114,120, 46, 99, + 13, 10,115, 99,111,110,116,114, 97, 58, 13, 10,115, 99,111,110,116,114, + 97,106, 58, 13, 10, 48, 58, 52, 49, 48, 48, 58, 53, 48, 58, 49, 49, 58, + 48, 48, 13, 10, 48, 58, 52, 48, 53, 48, 58, 49, 58, 48, 48, 58, 48, 48, + 13, 10, 48, 58, 52, 48, 53, 49, 58, 51, 58, 48, 49, 58, 48, 48, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,110,122,115, 46, 99, 13, + 10, 99,104,117,107, 97,116, 97,105, 58, 13, 10, 99,104,117,107, 97,116, + 97,105,106, 58, 13, 10, 99,104,117,107, 97,116, 97,105,117, 58, 13, 10, + 48, 58,101,100, 56, 99, 58, 52, 54, 58, 48, 48, 58, 52, 50, 13, 10, 48, + 58,101, 50, 49, 48, 58, 51, 58, 48, 48, 58, 55, 53, 13, 10, 13, 10,100, + 114,116,111,112,112,101,108, 58, 13, 10,100,114,116,111,112,112,101,108, + 117, 58, 13, 10,100,114,116,111,112,112,101,108,106, 58, 13, 10, 48, 58, + 101, 48, 53, 55, 58, 50, 51, 58, 48, 48, 58, 50, 53, 13, 10, 48, 58,101, + 48, 50, 51, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,105,110,115, + 101, 99,116,120, 58, 13, 10,105,110,115,101, 99,116,120,106, 58, 13, 10, + 48, 58, 99, 54, 48, 48, 58, 53, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 99, 54,101, 97, 58, 51, 58, 48, 48, 58, 50, 49, 13, 10, 13, 10,112, + 108,117,109,112,112,111,112, 58, 13, 10, 48, 58, 99, 54, 50, 53, 58, 50, + 55, 58, 48, 48, 58, 53, 50, 13, 10, 48, 58,101, 52, 55, 49, 58, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10,116,110,122,115, 50, 58, 13, 10, 48, + 58,101, 99, 48, 97, 58, 50, 51, 58, 48, 48, 58, 53, 53, 13, 10, 13, 10, + 104,101,108,108,102,105,114,101, 49, 58, 13, 10,104,101,108,108,102,105, + 114,101, 51, 58, 13, 10,104,101,108,108,102,105,114,101, 49, 97, 58, 13, + 10, 48, 58, 52, 50, 49, 51, 48, 58, 99, 50, 58, 48, 48, 58, 48, 56, 13, + 10, 48, 58, 52, 50, 49,101, 57, 58, 49, 58, 49, 52, 58, 49, 52, 13, 10, + 48, 58, 52, 50, 51, 53, 55, 58, 50, 49, 58, 50,101, 58, 51, 48, 13, 10, + 13, 10,104,101,108,108,102,105,114,101, 58, 13, 10,104,101,108,108,102, + 105,114,101, 50, 58, 13, 10,104,101,108,108,102,105,114,101, 50, 97, 58, + 13, 10, 48, 58, 52, 50, 51, 48, 48, 58, 99, 50, 58, 48, 48, 58, 48, 56, + 13, 10, 48, 58, 52, 50, 51, 98, 57, 58, 49, 58, 49, 52, 58, 49, 52, 13, + 10, 48, 58, 52, 50, 53, 50, 57, 58, 50, 49, 58, 50,101, 58, 51, 48, 13, + 10, 13, 10,114, 97,108,108,121, 98,105,107, 58, 13, 10, 48, 58, 56, 48, + 49, 97, 99, 58, 51, 50, 52, 58, 48, 48, 58, 52, 48, 13, 10, 48, 58, 56, + 48, 53, 51,100, 58, 49, 58, 49, 55, 58, 49, 55, 13, 10, 48, 58, 56, 48, + 53, 53, 53, 58, 49, 58, 48, 52, 58, 48, 52, 13, 10, 48, 58, 56, 48, 53, + 54,100, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 53, 56, + 53, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 53, 57,100, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, 48, 53, 98, 53, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,114,117,120,116,111,110, + 58, 13, 10, 48, 58, 48, 56, 49, 57,100,101, 58, 49, 54, 99, 58, 48, 48, + 58, 48, 98, 13, 10, 48, 58, 56, 49, 99, 53, 51, 58, 49, 58, 50,100, 58, + 50,100, 13, 10, 48, 58, 56, 49, 99, 53, 55, 58, 49, 58, 50,100, 58, 50, + 100, 13, 10, 48, 58, 56, 49, 99, 53, 98, 58, 49, 58, 50,100, 58, 50,100, + 13, 10, 48, 58, 56, 49, 99, 53,102, 58, 49, 58, 50,100, 58, 50,100, 13, + 10, 48, 58, 56, 49, 99, 54, 51, 58, 49, 58, 48, 53, 58, 48, 53, 13, 10, + 48, 58, 56, 49, 99, 54, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 56, 49, 99, 54, 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 56, 49, 99, 54,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 56, + 49, 99, 55, 51, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,115, 97, + 109,101,115, 97,109,101, 58, 13, 10, 48, 58, 99, 49, 55, 55, 56, 58, 49, + 57, 52, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 99, 49, 56, 98, 57, 58, + 49, 58, 50, 54, 58, 50, 54, 13, 10, 48, 58, 99, 49, 97, 52,102, 58, 50, + 49, 58, 50,100, 58, 48, 48, 13, 10, 13, 10,115, 97,109,101,115, 97,109, + 101, 50, 58, 13, 10, 48, 58, 99, 49, 97,100, 97, 58, 49, 57, 52, 58, 48, + 48, 58, 48, 49, 13, 10, 48, 58, 99, 49, 99, 50, 53, 58, 49, 58, 50, 54, + 58, 50, 54, 13, 10, 48, 58, 99, 49,100, 99, 49, 58, 50, 49, 58, 50,100, + 58, 48, 48, 13, 10, 13, 10, 59, 42,110,111,116,101, 42, 32,116,111,112, + 32,115, 99,111,114,101, 32,100,111,101,115, 32,110,111,116, 32,100,105, + 115,112,108, 97,121, 13, 10,118,105,109, 97,110, 97, 58, 13, 10,118,105, + 109, 97,110, 97,110, 58, 13, 10,118,105,109, 97,110, 97, 49, 58, 13, 10, + 118,105,109, 97,110, 97,106, 58, 13, 10, 48, 58, 52, 56, 48, 49, 57, 56, + 58,102, 52, 58, 48, 48, 58, 52, 49, 13, 10, 13, 10, 59, 42, 42, 32,111, + 110,108,121, 32,115, 97,118,101,115, 32,104,105,103,104, 32,116, 97, 98, + 108,101, 32, 40,110,111, 32,116,111,112, 32,115, 99,111,114,101, 41, 13, + 10, 59, 42, 42, 32, 97,110,100, 32,104,105,103,104,115, 99,111,114,101, + 32, 99,111,117,110,116,101,114, 32, 40,110,111,116, 32,100,105,115,112, + 108, 97,121, 41, 13, 10,122,101,114,111,119,105,110,103, 49, 58, 13, 10, + 48, 58, 56, 49, 55, 55, 54, 58, 54, 56, 58, 48, 48, 58, 49, 48, 13, 10, + 48, 58, 56, 49, 55, 55, 56, 58, 49, 58, 53, 48, 58, 53, 48, 13, 10, 13, + 10,122,101,114,111,119,105,110,103,119, 58, 13, 10,122,101,114,111,119, + 105,110,103, 58, 13, 10, 48, 58, 56, 49, 97, 49,101, 58, 54, 56, 58, 48, + 48, 58, 49, 48, 13, 10, 48, 58, 56, 49, 97, 50, 48, 58, 49, 58, 53, 48, + 58, 53, 48, 13, 10, 13, 10,103,114,105,110,100,115,116,109, 58, 13, 10, + 48, 58, 49, 48, 48, 53, 48, 48, 58, 57, 48, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 49, 48, 48, 53, 55,102, 58, 49, 58, 50,100, 58, 50,100, 13, + 10, 48, 58, 49, 48, 48, 52, 51, 99, 58, 52, 58, 48, 48, 58, 48, 48, 13, + 10, 13, 10,103,114,105,110,100,115,116,109, 97, 58, 13, 10, 48, 58, 49, + 48, 48, 52,102, 99, 58, 57, 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 49, 48, 48, 53, 55, 98, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, + 49, 48, 48, 52, 51, 56, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 118,102,105,118,101, 58, 13, 10, 48, 58, 49, 48, 48, 52,102, 97, 58, 57, + 48, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 52, 51, 54, 58, + 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 49, 48, 48, 53, 55, 57, 58, + 49, 58, 50,100, 58, 50,100, 13, 10, 13, 10,112,105,112,105, 98,105, 98, + 115, 58, 13, 10,112,105,112,105, 98,105, 98,115, 98,108, 58, 13, 10,112, + 105,112,105, 98,105, 98,115, 97, 58, 13, 10,112,105,112,105, 98,105, 98, + 115,112, 58, 13, 10, 48, 58, 48, 56, 48, 53,100, 56, 58, 49, 58, 48, 48, + 58, 48, 48, 13, 10, 48, 58, 48, 56, 48, 53,100, 57, 58, 51, 58, 48, 53, + 58, 48, 48, 13, 10, 48, 58, 48, 56, 48, 53,101, 52, 58, 52, 54, 58, 48, + 48, 58, 70, 70, 13, 10, 13, 10,119,104,111,111,112,101,101, 58, 13, 10, + 48, 58, 48, 56, 48, 53,100, 97, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, + 48, 58, 48, 56, 48, 53,100, 98, 58, 51, 58, 48, 53, 58, 48, 48, 13, 10, + 48, 58, 48, 56, 48, 53,101, 54, 58, 52, 54, 58, 48, 48, 58, 70, 70, 13, + 10, 13, 10,115,110,111,119, 98,114,111, 50, 58, 13, 10,115,110,111,119, + 98,114,111, 50, 98, 58, 13, 10, 48, 58, 49, 48, 48, 48, 97, 48, 58, 50, + 56, 58, 48, 48, 58, 52, 53, 13, 10, 13, 10,116,114,117,120,116,111,110, + 50, 58, 13, 10,116, 97,116,115,117,106,110, 50, 58, 13, 10, 48, 58, 49, + 48, 48, 51, 48, 48, 58, 55, 99, 58, 48, 48, 58, 48, 49, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,116,111,112,115,112,101,101,100, 46, + 99, 13, 10,116,111,112,115,112,101,101,100, 58, 13, 10,116,111,112,115, + 112,101,101,100,117, 58, 13, 10,102,117,108,108,116,104,114,108, 58, 13, + 10, 48, 58, 52, 48, 48, 48, 56, 48, 58, 54, 98, 58, 48, 48, 58, 57, 57, + 13, 10, 48, 58, 52, 48, 48, 48, 56, 49, 58, 49, 58, 52, 53, 58, 52, 53, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42,116,111,121,112,111,112, 46, + 99, 13, 10,108,105, 98,108,114, 97, 98,108, 58, 13, 10, 48, 58, 48, 56, + 54, 55, 58, 48, 52, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 48, 56, 55, + 52, 58, 51, 66, 58, 48, 48, 58, 49, 55, 13, 10, 13, 10,116,111,121,112, + 111,112, 58, 13, 10, 48, 58, 48, 57, 98, 50, 58, 53, 48, 58, 48, 48, 58, + 50, 48, 13, 10, 48, 58, 48, 56, 52, 57, 58, 51, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,116,115, 97,109,117, + 114, 97,105, 46, 99, 13, 10, 97,108,112,104, 97,120,122, 58, 13, 10, 48, + 58, 99, 50, 54,101, 58, 55, 98, 58, 48, 48, 58, 50,100, 13, 10, 48, 58, + 99, 50, 50, 48, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 69, 50, + 52, 49, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 69, 50, 50, 49, + 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, 48, 58, 69, 50, 48, 49, 58, 49, + 58, 51, 57, 58, 51, 57, 13, 10, 48, 58, 69, 49, 69, 49, 58, 49, 58, 51, + 48, 58, 51, 48, 13, 10, 48, 58, 69, 49, 67, 49, 58, 49, 58, 51, 48, 58, + 51, 48, 13, 10, 48, 58, 69, 49, 65, 49, 58, 49, 58, 51, 48, 58, 51, 48, + 13, 10, 48, 58, 69, 49, 56, 49, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, + 13, 10,109, 54, 54, 48, 58, 13, 10,109, 54, 54, 48, 98, 58, 13, 10,109, + 54, 54, 48,106, 58, 13, 10, 48, 58, 99, 50, 55, 48, 58, 55, 98, 58, 48, + 48, 58, 50,100, 13, 10, 48, 58, 99, 50, 50, 48, 58, 51, 58, 48, 48, 58, + 48, 48, 13, 10, 48, 58, 69, 50, 52, 49, 58, 49, 58, 50, 48, 58, 50, 48, + 13, 10, 48, 58, 69, 50, 50, 49, 58, 49, 58, 50, 48, 58, 50, 48, 13, 10, + 48, 58, 69, 50, 48, 49, 58, 49, 58, 51, 57, 58, 51, 57, 13, 10, 48, 58, + 69, 49, 69, 49, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 69, 49, + 67, 49, 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 69, 49, 65, 49, + 58, 49, 58, 51, 48, 58, 51, 48, 13, 10, 48, 58, 69, 49, 56, 49, 58, 49, + 58, 51, 48, 58, 51, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,116,117,109, 98,108,101,112, 46, 99, 13, 10,116,117,109, 98,108,101, + 112, 58, 13, 10,116,117,109, 98,108,101, 98, 58, 13, 10,116,117,109, 98, + 108,101, 98, 50, 58, 13, 10,116,117,109, 98,108,101,112,106, 58, 13, 10, + 116,117,109, 98,108,101,112, 98, 97, 58, 13, 10, 48, 58, 49, 50, 51, 99, + 49, 48, 58, 97, 48, 58, 52, 52, 58, 53, 48, 13, 10, 48, 58, 49, 50, 51, + 99, 48, 49, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,116,117,116, 97,110,107,104,109, 46, 99, 13, 10, + 116,117,116, 97,110,107,104,109, 58, 13, 10,116,117,116, 97,110,107,104, + 109,115, 58, 13, 10, 48, 58, 56, 56, 97, 57, 58, 51, 49, 58, 48, 51, 58, + 48, 49, 13, 10, 48, 58, 56, 56, 97, 54, 58, 51, 58, 48, 51, 58, 52, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,116,119,105,110, 49, 54, + 46, 99, 13, 10,102,114,111,117,110,100, 58, 13, 10,104,112,117,110, 99, + 104,101,114, 58, 13, 10,102,114,111,117,110,100,108, 58, 13, 10, 49, 58, + 52, 48, 48, 55, 48, 58, 52, 58, 48, 49, 58, 48, 48, 13, 10, 49, 58, 52, + 48, 51, 48, 48, 58, 53, 48, 58, 52, 97, 58, 48, 48, 13, 10, 13, 10,118, + 117,108, 99, 97,110, 58, 13, 10,103,114, 97,100,105,117,115, 50, 58, 13, + 10,103,114, 97,100,105,117,115, 50, 97, 58, 13, 10,103,114, 97,100,105, + 117,115, 50, 98, 58, 13, 10,118,117,108, 99, 97,110, 97, 58, 13, 10,118, + 117,108, 99, 97,110, 98, 58, 13, 10, 48, 58, 54, 48, 48, 97, 49, 58, 54, + 51, 58, 50, 50, 58, 51, 48, 13, 10, 48, 58, 54, 48, 48, 53, 56, 58, 52, + 58, 48, 48, 58, 51, 48, 13, 10, 48, 58, 54, 48, 48, 48, 56, 58, 49, 58, + 49,100, 58, 49,100, 13, 10, 13, 10,102,115,104, 97,114,107, 58, 13, 10, + 102,115,104, 97,114,107, 98,116, 58, 13, 10,115,107,121,115,104, 97,114, + 107, 58, 13, 10,104,105,115,104,111,117,122, 97, 58, 13, 10,102,115,104, + 97,114,107, 98,108, 97, 58, 13, 10,102,110,115,104, 97,114,107, 58, 13, + 10,115,107,121,115,104, 97,114,107, 97, 58, 13, 10, 48, 58, 51, 48, 49, + 54, 97, 58, 49, 54, 99, 58, 48, 48, 58, 48, 49, 13, 10, 48, 58, 51, 48, + 51, 56,100, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, 51, 48, 51, + 56,102, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, 51, 48, 51, 57, + 49, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, 51, 48, 51, 57, 51, + 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 51, 48, 51, 57, 53, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 51, 57, 55, 58, 49, + 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 51, 57, 57, 58, 49, 58, + 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 48, 51, 57, 98, 58, 49, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,107,116,105,103,101,114, 58, 13, 10, 48, + 58, 51, 49, 50, 56, 48, 58, 49, 54, 99, 58, 48, 48, 58, 48, 49, 13, 10, + 48, 58, 51, 49, 52, 56,102, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, + 58, 51, 49, 52, 57, 49, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, + 51, 49, 52, 57, 51, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, 51, + 49, 52, 57, 53, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 51, 49, + 52, 57, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 52, + 57, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 52, 57, + 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 52, 57,100, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,116,119,105,110, 99,111, + 98,114, 58, 13, 10,116,119,105,110, 99,111, 98,114,117, 58, 13, 10, 48, + 58, 51, 49, 53, 97, 50, 58, 49, 54, 99, 58, 48, 48, 58, 48, 49, 13, 10, + 48, 58, 51, 49, 55, 97,102, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, + 58, 51, 49, 55, 98, 49, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, + 51, 49, 55, 98, 51, 58, 49, 58, 50,100, 58, 50,100, 13, 10, 48, 58, 51, + 49, 55, 98, 53, 58, 49, 58, 48, 51, 58, 48, 51, 13, 10, 48, 58, 51, 49, + 55, 98, 55, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 55, + 98, 57, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 55, 98, + 98, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 51, 49, 55, 98,100, + 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, + 42, 42, 42,117,108,116,114, 97,109, 97,110, 46, 99, 13, 10,117,108,116, + 114, 97,109, 97,110, 58, 13, 10, 48, 58, 56,102,102, 48, 48, 58, 54, 52, + 58, 48, 49, 58, 48, 56, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, + 42,118, 97,112,111,114,116,114, 97, 46, 99, 13, 10,118, 97,112,111,114, + 116,114, 97, 58, 13, 10,118, 97,112,111,114,116,114,117, 58, 13, 10,107, + 117,104,103, 97, 58, 13, 10,118, 97,112,111,114,116,114, 97, 51, 58, 13, + 10, 48, 58,102,102,102, 53,100, 52, 58, 55, 56, 58, 50,101, 58, 48, 48, + 13, 10, 48, 58,102,102, 99, 48, 50, 52, 58, 52, 58, 48, 48, 58, 48, 48, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,118,101,110,100,101, + 116,116, 97, 46, 99, 13, 10,118,101,110,100,101,116,116, 97, 58, 13, 10, + 118,101,110,100,101,116,116, 97,114, 58, 13, 10,118,101,110,100,101,116, + 116, 97, 50,112, 58, 13, 10,118,101,110,100,101,116,116, 97, 50,112,117, + 58, 13, 10,118,101,110,100,101,116,116, 97, 50,112,100, 58, 13, 10,118, + 101,110,100,101,116,116, 97,106, 58, 13, 10,118,101,110,100,101,116,116, + 97, 50,112,101, 98, 97, 58, 13, 10,118,101,110,100,101,116,116, 97,122, + 58, 13, 10, 48, 58, 50, 57, 56, 48, 58, 50, 56, 58, 48, 48, 58, 52, 56, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42,118,105, 99,100,117, 97, + 108, 46, 99, 13, 10, 99, 97,114,110,105,118, 97,108, 58, 32, 59, 42,110, + 111,116,101, 42, 32,114,101,115,101,116,116,105,110,103, 32, 99,111,114, + 114,117,112,116,115, 32,116,104,101, 32,115, 99,114,101,101,110, 32,110, + 111,116, 32,116,104,101, 32,102,105,108,101, 13, 10, 99, 97,114,110,105, + 118, 97,108, 99, 58, 13, 10, 48, 58,101, 51, 57, 55, 58, 51, 99, 58, 48, + 48, 58, 48, 48, 13, 10, 48, 58,101, 53, 97, 50, 58, 57, 58, 50, 48, 58, + 50, 48, 13, 10, 13, 10,100,105,103,103,101,114, 58, 13, 10, 48, 58, 56, + 51, 56, 54, 58, 98, 58, 53, 51, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, + 42, 42, 42, 42, 42, 42,118,117,108,103,117,115, 46, 99, 13, 10,118,117, + 108,103,117,115, 97, 58, 13, 10, 48, 58, 69, 69, 48, 48, 58, 52, 49, 58, + 48, 48, 58, 50, 48, 13, 10, 48, 58, 69, 69, 52, 55, 58, 48, 51, 58, 48, + 48, 58, 48, 48, 13, 10, 13, 10,118,117,108,103,117,115, 58, 13, 10,118, + 117,108,103,117,115,106, 58, 13, 10, 48, 58, 69, 69, 48, 48, 58, 52, 49, + 58, 48, 48, 58, 50, 69, 13, 10, 48, 58, 69, 69, 52, 55, 58, 48, 51, 58, + 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42, + 119,101, 99,108,101,109, 97,110, 46, 99, 13, 10,104,111,116, 99,104, 97, + 115,101, 58, 13, 10,104,111,116, 99,104, 97,115,101, 97, 58, 13, 10, 48, + 58, 54, 49, 48, 98, 48, 58, 53, 48, 58, 48, 48, 58, 48,100, 13, 10, 48, + 58, 54, 48, 48, 51, 52, 58, 52, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, + 59, 42, 42, 42, 42, 42, 42, 42, 42,119,105,112,105,110,103, 46, 99, 13, + 10,119,105,112,105,110,103, 58, 13, 10, 48, 58, 57, 48, 54,102, 58, 56, + 50, 58, 48, 51, 58, 53, 52, 13, 10, 13, 10,114,117,103,114, 97,116,115, + 58, 13, 10, 48, 58, 57, 48, 54,102, 58, 56, 50, 58, 49, 48, 58, 53, 52, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,119,105,122, 46, 99, + 13, 10,115, 99,105,111,110, 58, 13, 10, 48, 58, 99, 48, 55, 48, 58, 53, + 48, 58, 48, 48, 58, 49,101, 13, 10, 48, 58,100, 48, 54, 50, 58, 55, 58, + 49, 48, 58, 48, 48, 13, 10, 13, 10,115, 99,105,111,110, 99, 58, 13, 10, + 48, 58, 99, 48, 55, 48, 58, 53, 48, 58, 48, 48, 58, 49, 48, 13, 10, 48, + 58,100, 48, 54, 50, 58, 55, 58, 49, 48, 58, 49, 48, 13, 10, 13, 10,115, + 116,105,110,103,101,114, 58, 13, 10,115,116,105,110,103,101,114, 50, 58, + 13, 10, 48, 58, 99, 48, 51, 49, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 99, 48, 55, 57, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 99, 50, 48, 48, 58, 49, 51, 58, 49,100, 58, 50, 51, 13, 10, 13, 10, + 119,105,122, 58, 13, 10,119,105,122,116, 58, 13, 10,119,105,122,116, 97, + 58, 13, 10, 48, 58, 99, 48, 49,101, 58, 51, 50, 58, 48, 48, 58, 52, 51, + 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120,101,120,101,120, + 46, 99, 13, 10,120,101,120,101,120, 97, 58, 13, 10,120,101,120,101,120, + 58, 13, 10,120,101,120,101,120,106, 58, 13, 10,111,114,105,117,115, 58, + 13, 10, 48, 58, 56, 53, 48, 48, 48, 58, 54, 51, 58, 48, 48, 58, 49, 99, + 13, 10, 48, 58, 56, 48, 48, 53, 55, 58, 51, 58, 48, 48, 58, 51, 48, 13, + 10, 13, 10,120,109,101,110, 58, 13, 10,120,109,101,110, 50,112, 58, 13, + 10,120,109,101,110,106, 58, 13, 10,120,109,101,110, 50,112,106, 58, 13, + 10,120,109,101,110, 54,112,117, 58, 13, 10,120,109,101,110, 54,112, 58, + 13, 10,120,109,101,110, 50,112, 97, 58, 13, 10,120,109,101,110, 50,112, + 101, 58, 13, 10,120,109,101,110,101, 58, 13, 10,120,109,101,110, 97, 58, + 13, 10,120,109,101,110, 97, 97, 58, 13, 10,120,109,101,110, 50,112,117, + 58, 13, 10, 48, 58, 49, 49, 51, 51, 48, 48, 58, 49, 54, 56, 58, 48, 48, + 58, 49, 48, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,120,121, + 98,111,116,115, 46, 99, 13, 10,120,121, 98,111,116,115, 58, 13, 10, 48, + 58,102,102, 97, 99, 50, 50, 58, 99, 97, 58, 48, 48, 58, 97, 52, 13, 10, + 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,121, 97,114,100, 46, 99, 13, + 10, 49, 48,121, 97,114,100, 58, 13, 10, 49, 48,121, 97,114,100,106, 58, + 13, 10,118,115, 49, 48,121, 97,114,100, 58, 13, 10,118,115, 49, 48,121, + 97,114,100,106, 58, 13, 10, 49, 48,121, 97,114,100, 56, 53, 58, 13, 10, + 118,115, 49, 48,121, 97,114,100,117, 58, 13, 10, 48, 58,101, 54, 48, 48, + 58, 56, 97, 58, 48, 48, 58, 52, 97, 13, 10, 48, 58,101, 48, 48, 56, 58, + 51, 58, 48, 48, 58, 48, 51, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, + 42, 42,121,105,101, 97,114, 46, 99, 13, 10,121,105,101, 97,114, 58, 13, + 10, 48, 58, 53, 53, 50, 48, 58, 56, 99, 58, 48, 48, 58, 49, 48, 13, 10, + 48, 58, 53, 50, 49, 99, 58, 51, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, + 121,105,101, 97,114, 50, 58, 13, 10, 48, 58, 53, 53, 50, 48, 58, 56, 99, + 58, 48, 48, 58, 49, 48, 13, 10, 48, 58, 53, 50, 49, 99, 58, 51, 58, 48, + 48, 58, 55, 48, 13, 10, 13, 10,121,105,101, 97,114,116,102, 58, 13, 10, + 48, 58, 50,100, 50, 48, 58, 56, 99, 58, 48, 48, 58, 49, 48, 13, 10, 48, + 58, 50, 97, 49, 99, 58, 51, 58, 48, 48, 58, 52, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,120, 97, 99, 99, 97,114,105, 97, 46, 99, + 13, 10,106, 97, 99,107,114, 97, 98,116, 58, 13, 10,106, 97, 99,107,114, + 97, 98,116, 50, 58, 13, 10,106, 97, 99,107,114, 97, 98,116,115, 58, 13, + 10, 48, 58, 55, 51, 98, 97, 58, 52, 56, 58, 48, 97, 58, 48, 48, 13, 10, + 48, 58, 55, 50, 55,100, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, + 54, 48, 53,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, + 55,101, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 48, 57,101, + 58, 49, 58,102,102, 58,102,102, 13, 10, 48, 58, 54, 48, 98,101, 58, 49, + 58,102,102, 58,102,102, 13, 10, 48, 58, 54, 48,100,101, 58, 49, 58,102, + 102, 58,102,102, 13, 10, 48, 58, 54, 48,102,101, 58, 49, 58,102,102, 58, + 102,102, 13, 10, 13, 10, 59, 42, 42, 42, 42, 42, 42, 42, 42,122, 97,120, + 120,111,110, 46, 99, 13, 10,122, 97,120,120,111,110, 58, 13, 10,122, 97, + 120,120,111,110, 50, 58, 13, 10,122, 97,120,120,111,110, 98, 58, 13, 10, + 115,122, 97,120,120,111,110, 58, 13, 10,122, 97,120,120,111,110,106, 58, + 13, 10,122, 97,120,120,111,110, 51, 58, 13, 10, 48, 58, 54, 49, 48, 48, + 58, 55,101, 58, 57, 48, 58, 56, 49, 13, 10, 48, 58, 54, 48, 51, 56, 58, + 51, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,102,117,116,115,112,121, 58, + 13, 10, 48, 58, 54, 52, 49, 57, 58, 51, 99, 58, 48, 48, 58, 52, 49, 13, + 10, 13, 10,114, 97,122,109, 97,116, 97,122, 58, 13, 10, 48, 58, 54, 54, + 97, 52, 58, 49,101, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 54, 55, 51, + 57, 58, 51, 99, 58, 50, 53, 58, 51,101, 13, 10, 13, 10, 59, 83,112,105, + 100,101,114,115, 32, 97,110,100, 32, 99,108,111,110,101,115, 32, 40, 98, + 121, 32, 71,101,111, 77, 97,110, 41, 13, 10,115,112,105,100,101,114,115, + 58, 13, 10,115,112,105,100,101,114,115, 50, 58, 13, 10, 48, 58, 49, 99, + 49, 51, 58, 51, 58, 48, 58, 48, 13, 10, 48, 58, 49,101, 52, 50, 58,102, + 58, 48, 58, 48, 13, 10, 13, 10,115,112,105,100,101,114,115, 51, 58, 13, + 10, 48, 58, 49, 99, 49, 50, 58, 51, 58, 48, 48, 58, 48, 48, 13, 10, 48, + 58, 49,101, 52, 49, 58,102, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10, 59, + 42, 42, 42, 42, 42, 42, 42, 42,122,101,114,111,122,111,110,101, 46, 99, + 13, 10,122,101,114,111,122,111,110,101, 58, 13, 10, 48, 58, 99, 49, 55, + 99,100, 58, 55, 55, 58, 53, 51, 58, 48, 48, 13, 10, 48, 58, 99, 50, 51, + 100, 97, 58, 54, 58, 48, 48, 58, 48, 48, 13, 10, 13, 10,122,111,100,105, + 97, 99,107, 58, 13, 10, 48, 58, 53, 56, 53, 55, 58, 51, 55, 58, 48, 48, + 58, 50, 52, 13, 10, 48, 58, 98, 50,100,102, 58, 49, 58, 48, 48, 58, 48, + 48, 13, 10, 48, 58, 98, 50,102,102, 58, 49, 58, 48, 48, 58, 48, 48, 13, + 10, 48, 58, 98, 51, 49,102, 58, 49, 58, 48, 49, 58, 48, 49, 13, 10, 48, + 58, 98, 51, 51,102, 58, 49, 58, 48, 50, 58, 48, 50, 13, 10, 48, 58, 98, + 51, 53,102, 58, 49, 58, 48, 56, 58, 48, 56, 13, 10, 48, 58, 98, 51, 55, + 102, 58, 49, 58, 48, 48, 58, 48, 48, 13, 10, 48, 58, 98, 51, 57,102, 58, + 49, 58, 48, 48, 58, 48, 48, 13, 10, }; -const unsigned int hiscoredat_length = 216250; \ No newline at end of file +static const unsigned int hiscoredat_length = 229779;
View file
libretro-mame2003-0~git20200805.tar.xz/src/bootstrap.c -> libretro-mame2003-0~git20210529.tar.xz/src/bootstrap.c
Changed
@@ -38,9 +38,423 @@ } }; -const struct bin2cFILE charlien_bootstrap = { - 128, +const struct bin2cFILE carnevil_bootstrap = { + 131072, { + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 0, 0, 70, 0, 0, 0,225, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 70, 0, 0, 0,225, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 0, 0, 0,136, 0, 0, 0,158, 0, 0, 0, + 239, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,162, 0, 0, 0,224, 0, 0, 0, 36, 0, 0, 0, 38, 0, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 0, + 0, 0, 98, 0, 0, 0,181, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,174, 0, 0, 0,238, 0, 0, 0,246, 0, 0, 0,165, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,174, 0, 0, 0,238, 0, 0, 0,246, 0, 0, 0,165, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 174, 0, 0, 0,238, 0, 0, 0,246, 0, 0, 0,165, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,174, 0, 0, 0,238, 0, 0, 0, + 246, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,162, 0, 0, 0,224, 0, 0, 0, 36, 0, 0, 0, 38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0,100, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 8, 0, 0, 0,160, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, + 0, 0,233, 0, 0, 0, 31, 0, 0, 0,228, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 70, 0, + 0, 0,225, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, + 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, + 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0, + 251, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0,137, 0, 0, 0,251, 0, 0, 0,236, 0, 0, 0, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0,100, 0, + 0, 0, 33, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 32, 0, 0, 0, 67, 0, 0, 0, 82, 0, 0, 0, 69, 0, + 0, 0, 68, 0, 0, 0, 73, 0, 0, 0, 84, 0, 0, 0, 32, 0, 0, 0, + 47, 0, 0, 0, 32, 0, 0, 0, 49, 0, 0, 0, 32, 0, 0, 0, 67, 0, + 0, 0, 79, 0, 0, 0, 73, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 50, 0, 0, 0, 53, 0, + 0, 0, 9, 0, 0, 0, 36, 0, 0, 0, 49, 0, 0, 0, 46, 0, 0, 0, + 48, 0, 0, 0, 48, 0, 0, 0, 9, 0, 0, 0, 45, 0, 0, 0, 9, 0, + 0, 0, 45, 0, 0, 0, 9, 0, 0, 0, 36, 0, 0, 0, 49, 0, 0, 0, + 46, 0, 0, 0, 48, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 49, 0, + 0, 0, 32, 0, 0, 0, 67, 0, 0, 0, 82, 0, 0, 0, 69, 0, 0, 0, + 68, 0, 0, 0, 73, 0, 0, 0, 84, 0, 0, 0, 32, 0, 0, 0, 47, 0, + 0, 0, 32, 0, 0, 0, 50, 0, 0, 0, 32, 0, 0, 0,120, 0, 0, 0, + 32, 0, 0, 0, 50, 0, 0, 0, 53, 0, 0, 0, 32, 0, 0, 0, 67, 0, + 0, 0, 69, 0, 0, 0, 78, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, + 10, 0, 0, 0, 51, 0, 0, 0, 32, 0, 0, 0, 67, 0, 0, 0, 82, 0, + 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 73, 0, 0, 0, 84, 0, 0, 0, + 83, 0, 0, 0, 32, 0, 0, 0, 47, 0, 0, 0, 32, 0, 0, 0, 36, 0, + 0, 0, 49, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 0, + 0, 0,147, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,176, 0, 0, 0, + 30, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,169, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 52, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,191, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0,240, 0, 0, 0, 73, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0,192, 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0,144, 0, 0, 0, 95, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, + 67, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 65, 0, + 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 73, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 76, 0, 0, 0, 83, 0, + 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 82, 0, 0, 0, 77, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 0, 82, 0, 0, 0, 77, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 79, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, + 83, 0, 0, 0, 65, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 86, 0, + 0, 0, 69, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, + 74, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 71, 0, + 0, 0, 58, 0, 0, 0, 2, 0, 0, 0, 80, 0, 0, 0,250, 0, 0, 0, + 36, 0, 0, 0, 65, 0, 0, 0, 80, 0, 0, 0,250, 0, 0, 0, 36, 0, + 0, 0, 65, 0, 0, 0, 80, 0, 0, 0,250, 0, 0, 0, 36, 0, 0, 0, + 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 64, 0, 0, 0, 60, 0, + 0, 0,142, 0, 0, 0, 99, 0, 0, 0,193, 0, 0, 0, 60, 0, 0, 0, + 142, 0, 0, 0, 99, 0, 0, 0,193, 0, 0, 0, 60, 0, 0, 0,142, 0, + 0, 0, 99, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, + 64, 0, 0, 0, 80, 0, 0, 0,250, 0, 0, 0, 36, 0, 0, 0, 65, 0, + 0, 0, 80, 0, 0, 0,250, 0, 0, 0, 36, 0, 0, 0, 65, 0, 0, 0, + 80, 0, 0, 0,250, 0, 0, 0, 36, 0, 0, 0, 65, 0, 0, 0,152, 0, + 0, 0,208, 0, 0, 0,126, 0, 0, 0, 64, 0, 0, 0,152, 0, 0, 0, + 208, 0, 0, 0,126, 0, 0, 0, 64, 0, 0, 0,152, 0, 0, 0,208, 0, + 0, 0,126, 0, 0, 0, 64, 0, 0, 0, 60, 0, 0, 0,142, 0, 0, 0, + 99, 0, 0, 0,193, 0, 0, 0,124, 0, 0, 0, 4, 0, 0, 0,166, 0, + 0, 0,159, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, @@ -48,102 +462,74853 @@ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255, - }, -}; - -const struct bin2cFILE defcmnd_bootstrap = { - 256, - { + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255, + } +}; + +const struct bin2cFILE charlien_bootstrap = { + 128, + { + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, + }, +}; + +const struct bin2cFILE crusnu21_bootstrap = { + 32768, + { + 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, + 0,252, 0, 0, 0, 0,252, 0, 0, 0, 0,252, 15, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 15,237, 0, 0, 0, 0,237, 0, 0, + 0, 0,237, 0, 0, 0, 0,237,127, 0, 0, 0, 0,127, 0, 0, 0, 0, + 127, 0, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, + 0,255,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 20, 0, 0, 0, + 0, 20, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1,100, 0, 0, 0, 0,100, 0, 0, 0, 0, + 100, 0, 0, 0, 0,100,160, 15, 0, 0, 0,160, 15, 0, 0, 0,160, 15, + 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 5, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5,136, 19, 0, 0, 0,136, + 19, 0, 0, 0,136, 19, 0, 0, 0,136, 50, 0, 0, 0, 0, 50, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 30, 0, 0, 0, 0, 30, 0, 0, 0, 0, 30, 0, 0, 0, 0, 30,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1,164, 40, 0, 0, 0,164, 40, 0, 0, 0,164, 40, 0, 0, 0,164, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, + 0, 0, 0, 46, 0, 0, 0, 0, 46, 0, 0, 0, 0, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 31, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 31,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, 0, 0, 0,122,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,120, 26, + 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, + 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, + 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, + 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0, + 232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, + 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, + 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, + 144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, + 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, + 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, + 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, + 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, + 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, + 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, + 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, + 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, + 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, + 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, + 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0, + 176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, + 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, + 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, + 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, + 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, + 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, + 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, + 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, + 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, + 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, + 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, + 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, + 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, + 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, + 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0, + 120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, + 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, + 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3, + 232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, + 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, + 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, + 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, + 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, + 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, + 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, + 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, + 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, + 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, + 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, + 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0, + 192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, + 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, + 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3, + 176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, + 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, + 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, + 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, + 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, + 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, + 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, + 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, + 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, + 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, + 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, + 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, + 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, + 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, + 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3, + 120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, + 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, + 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, + 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, + 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, + 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, + 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, + 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, + 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, + 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, + 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, + 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0, + 224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, + 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, + 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3, + 192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, + 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, + 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, + 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, + 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, + 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, + 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, + 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, + 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, + 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, + 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0, + 112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, + 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, + 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, + 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, + 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, + 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, + 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, + 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, + 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, + 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, + 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, + 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, + 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, + 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, + 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, + 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, + 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, + 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3, + 224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, + 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, + 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, + 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, + 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, + 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, + 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, + 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, + 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, + 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, + 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, + 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, + 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0, + 144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, + 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3, + 112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, + 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, + 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, + 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, + 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, + 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, + 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, + 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, + 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, + 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, + 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, + 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, + 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, + 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, + 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, + 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, + 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, + 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, + 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, + 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, + 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, + 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, + 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, + 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, + 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, + 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, + 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, + 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0, + 232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, + 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, + 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, + 144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, + 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, + 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, + 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, + 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, + 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, + 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, + 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, + 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, + 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, + 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, + 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0, + 176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, + 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, + 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, + 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, + 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, + 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, + 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, + 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, + 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, + 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, + 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, + 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, + 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, + 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, + 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0, + 120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, + 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, + 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3, + 232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, + 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, + 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, + 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, + 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, + 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, + 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, + 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, + 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, + 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, + 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, + 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0, + 192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, + 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, + 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3, + 176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, + 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, + 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, + 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, + 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, + 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, + 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, + 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, + 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, + 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, + 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, + 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, + 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, + 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, + 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3, + 120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, + 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, + 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, + 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, + 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, + 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, + 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, + 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, + 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, + 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, + 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, + 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0, + 224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, + 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, + 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3, + 192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, + 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,128,111, 1, 0, + 0,128,111, 1, 0, 0,128,111, 0, 0, 0,128, 0, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176,113, 1, 0, 0,176,113, 1, + 0, 0,176,113, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, + 0, 80, 0, 0, 0, 3,224,115, 1, 0, 0,224,115, 1, 0, 0,224,115, + 0, 0, 0,224, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, + 0, 3, 16,118, 1, 0, 0, 16,118, 1, 0, 0, 16,118, 0, 0, 0, 16, + 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, 64,120, + 1, 0, 0, 64,120, 1, 0, 0, 64,120, 0, 0, 0, 64, 0, 0, 0, 71, + 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3,112,122, 1, 0, 0,112, + 122, 1, 0, 0,112,122, 0, 0, 0,112, 0, 0, 0, 83, 0, 0, 0, 88, + 0, 0, 0, 67, 0, 0, 0, 3,192,137, 1, 0, 0,192,137, 1, 0, 0, + 192,137, 0, 0, 0,192, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, + 0, 0, 0, 3, 16,153, 1, 0, 0, 16,153, 1, 0, 0, 16,153, 0, 0, + 0, 16, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, + 96,168, 1, 0, 0, 96,168, 1, 0, 0, 96,168, 0, 0, 0, 96, 0, 0, + 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,208,196, 1, 0, + 0,208,196, 1, 0, 0,208,196, 0, 0, 0,208, 0, 0, 0, 66, 0, 0, + 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,255,255,255,255, 0,255,255,255, + 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0, + 255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, + 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255, + 255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255, + 255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, + 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255, + 255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, + 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0, + 255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, + 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255, + 255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + } +}; + +const struct bin2cFILE crusnu40_bootstrap = { + 32768, + { + 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, + 0,252, 0, 0, 0, 0,252, 0, 0, 0, 0,252, 15, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 15,237, 0, 0, 0, 0,237, 0, 0, + 0, 0,237, 0, 0, 0, 0,237,127, 0, 0, 0, 0,127, 0, 0, 0, 0, + 127, 0, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, + 0,255,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 20, 0, 0, 0, + 0, 20, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1,100, 0, 0, 0, 0,100, 0, 0, 0, 0, + 100, 0, 0, 0, 0,100,160, 15, 0, 0, 0,160, 15, 0, 0, 0,160, 15, + 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 5, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5,136, 19, 0, 0, 0,136, + 19, 0, 0, 0,136, 19, 0, 0, 0,136, 50, 0, 0, 0, 0, 50, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 30, 0, 0, 0, 0, 30, 0, 0, 0, 0, 30, 0, 0, 0, 0, 30,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1,164, 40, 0, 0, 0,164, 40, 0, 0, 0,164, 40, 0, 0, 0,164, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 23, 0, 0, 0, 0, 23, 0, 0, 0, 0, 23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 0, 0, 0,122,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,120, 26, 0, 0, + 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, + 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, + 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, + 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, + 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, + 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, + 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, + 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, + 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0, + 112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, + 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, + 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, + 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, + 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, + 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, + 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, + 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, + 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, + 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, + 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, + 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, + 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, + 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, + 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, + 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, + 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, + 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3, + 224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, + 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, + 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, + 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, + 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, + 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, + 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, + 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, + 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, + 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, + 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, + 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, + 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0, + 144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, + 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3, + 112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, + 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, + 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, + 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, + 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, + 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, + 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, + 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, + 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, + 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, + 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, + 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, + 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, + 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, + 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, + 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, + 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, + 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, + 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, + 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, + 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, + 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, + 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, + 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, + 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, + 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, + 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, + 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0, + 232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, + 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, + 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, + 144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, + 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, + 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, + 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, + 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, + 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, + 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, + 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, + 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, + 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, + 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, + 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0, + 176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, + 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, + 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, + 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, + 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, + 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, + 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, + 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, + 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, + 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, + 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, + 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, + 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, + 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, + 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0, + 120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, + 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, + 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3, + 232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, + 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, + 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, + 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, + 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, + 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, + 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, + 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, + 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, + 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, + 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, + 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0, + 192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, + 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, + 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3, + 176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, + 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, + 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, + 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, + 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, + 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, + 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, + 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, + 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, + 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, + 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, + 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, + 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, + 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, + 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3, + 120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, + 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, + 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, + 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, + 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, + 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, + 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, + 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, + 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, + 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, + 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, + 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0, + 224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, + 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, + 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3, + 192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, + 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, + 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, + 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, + 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, + 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, + 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, + 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, + 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, + 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, + 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0, + 112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, + 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, + 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, + 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, + 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, + 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, + 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, + 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, + 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, + 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, + 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, + 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, + 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, + 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, + 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, + 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, + 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, + 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3, + 224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, + 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, + 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, + 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, + 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, + 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, + 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, + 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, + 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, + 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, + 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, + 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, + 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0, + 144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, + 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3, + 112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, + 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, + 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, + 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, + 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, + 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, + 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, + 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, + 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, + 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, + 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, + 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, + 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, + 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, + 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, + 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, + 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, + 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, + 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, + 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, + 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, + 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, + 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, + 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, + 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, + 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, + 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, + 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0, + 232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, + 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, + 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, + 144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, + 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, + 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, + 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, + 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, + 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, + 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, + 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, + 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, + 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,128,111, 1, 0, 0,128, + 111, 1, 0, 0,128,111, 0, 0, 0,128, 0, 0, 0, 84, 0, 0, 0, 86, + 0, 0, 0, 71, 0, 0, 0, 3,176,113, 1, 0, 0,176,113, 1, 0, 0, + 176,113, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, + 0, 0, 0, 3,224,115, 1, 0, 0,224,115, 1, 0, 0,224,115, 0, 0, + 0,224, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, + 16,118, 1, 0, 0, 16,118, 1, 0, 0, 16,118, 0, 0, 0, 16, 0, 0, + 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, 64,120, 1, 0, + 0, 64,120, 1, 0, 0, 64,120, 0, 0, 0, 64, 0, 0, 0, 71, 0, 0, + 0, 87, 0, 0, 0, 83, 0, 0, 0, 3,112,122, 1, 0, 0,112,122, 1, + 0, 0,112,122, 0, 0, 0,112, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, + 0, 67, 0, 0, 0, 3,192,137, 1, 0, 0,192,137, 1, 0, 0,192,137, + 0, 0, 0,192, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, + 0, 3, 16,153, 1, 0, 0, 16,153, 1, 0, 0, 16,153, 0, 0, 0, 16, + 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 96,168, + 1, 0, 0, 96,168, 1, 0, 0, 96,168, 0, 0, 0, 96, 0, 0, 0, 77, + 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,208,196, 1, 0, 0,208, + 196, 1, 0, 0,208,196, 0, 0, 0,208, 0, 0, 0, 66, 0, 0, 0, 68, + 0, 0, 0, 80, 0, 0, 0, 3,255,255,255,255, 0,255,255,255, 0, 0, + 255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, + 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255, + 255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255, + 255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, + 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255, + 255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, + 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0, + 255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, + 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255, + 255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255, + 255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + } +}; + +const struct bin2cFILE crusnusa_bootstrap = { + 32768, + { + 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, + 0,252, 0, 0, 0, 0,252, 0, 0, 0, 0,252, 15, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 15,237, 0, 0, 0, 0,237, 0, 0, + 0, 0,237, 0, 0, 0, 0,237,127, 0, 0, 0, 0,127, 0, 0, 0, 0, + 127, 0, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, + 0,255,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, 0, 0, 0, 0,255, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 20, 0, 0, 0, + 0, 20, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1,100, 0, 0, 0, 0,100, 0, 0, 0, 0, + 100, 0, 0, 0, 0,100,157, 15, 0, 0, 0,157, 15, 0, 0, 0,157, 15, + 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 5, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5,136, 19, 0, 0, 0,136, + 19, 0, 0, 0,136, 19, 0, 0, 0,136, 50, 0, 0, 0, 0, 50, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 30, 0, 0, 0, 0, 30, 0, 0, 0, 0, 30, 0, 0, 0, 0, 30,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1,163, 40, 0, 0, 0,163, 40, 0, 0, 0,163, 40, 0, 0, 0,163, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 10, 9, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3,204, 0, 0, 0, 0,204, 0, 0, 0, 0,204, 0, 0, 0, + 0,204, 68, 0, 0, 0, 0, 68, 0, 0, 0, 0, 68, 0, 0, 0, 0, 68, + 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 54, 2, + 0, 0, 0, 54, 2, 0, 0, 0, 54, 2, 0, 0, 0, 54,235, 0, 0, 0, + 0,235, 0, 0, 0, 0,235, 0, 0, 0, 0,235, 4, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158, 0, 0, 0, + 0,158, 0, 0, 0, 0,158, 0, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 0, 0, 0,122,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,120, 26, 0, 0, + 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, + 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, + 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, + 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, + 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, + 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, + 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, + 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, + 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0, + 112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, + 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, + 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, + 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, + 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, + 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, + 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, + 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, + 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, + 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, + 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, + 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, + 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, + 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, + 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, + 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, + 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, + 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3, + 224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, + 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, + 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, + 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, + 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, + 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, + 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, + 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, + 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, + 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, + 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, + 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, + 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0, + 144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, + 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3, + 112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, + 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, + 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, + 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, + 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, + 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, + 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, + 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, + 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, + 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, + 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, + 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, + 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, + 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, + 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, + 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, + 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, + 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, + 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, + 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, + 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, + 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, + 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, + 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, + 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, + 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, + 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, + 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0, + 232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, + 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, + 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, + 144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, + 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, + 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, + 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, + 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, + 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, + 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, + 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, + 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, + 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, + 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, + 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0, + 176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, + 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, + 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, + 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, + 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, + 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, + 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, + 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, + 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, + 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, + 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, + 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, + 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, + 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, + 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0, + 120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, + 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, + 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3, + 232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, + 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, + 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, + 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, + 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, + 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, + 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, + 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, + 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, + 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, + 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, + 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0, + 192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, + 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, + 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3, + 176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, + 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, + 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, + 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, + 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, + 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, + 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, + 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, + 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, + 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, + 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, + 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, + 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, + 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, + 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3, + 120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, + 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, + 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, + 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, + 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, + 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, + 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, + 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, + 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, + 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, + 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, + 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, + 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0, + 224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, + 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, + 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3, + 192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, + 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, + 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, + 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, + 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, + 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, + 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, + 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, + 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, + 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, + 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, + 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, + 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0, + 112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, + 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, + 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, + 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, + 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, + 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, + 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, + 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, + 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, + 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, + 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, + 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, + 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, + 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, + 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, + 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, + 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, + 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3, + 224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, + 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, + 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, + 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, + 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, + 0, 80, 0, 0, 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, + 0, 0, 0,120, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, + 0, 3,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, + 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, + 0, 0, 0,232, 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, + 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, + 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, + 0, 0, 0, 32, 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0, + 144, 27, 0, 0, 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, + 0, 0, 0, 3, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3, + 112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, + 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, + 0,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, + 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, + 0, 0, 80, 29, 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, + 0, 86, 0, 0, 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, + 0, 0, 0,192, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, + 0, 3,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, + 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, + 0, 0, 0,176, 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, + 0, 0, 0, 76, 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, + 26, 0, 0, 0,232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, + 0, 0, 0, 74, 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, + 32, 27, 0, 0, 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, + 0, 0, 0, 3,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, + 0,144, 0, 0, 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, + 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 83, 0, 0, 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, + 0,112, 28, 0, 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, + 0, 69, 0, 0, 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, + 0, 0,224, 28, 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, + 0, 89, 0, 0, 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, + 0, 0, 0, 80, 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, + 0, 3,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, + 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,120, 26, + 0, 0, 0,120, 26, 0, 0, 0,120, 26, 0, 0, 0,120, 0, 0, 0, 84, + 0, 0, 0, 86, 0, 0, 0, 71, 0, 0, 0, 3,176, 26, 0, 0, 0,176, + 26, 0, 0, 0,176, 26, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, + 0, 0, 0, 80, 0, 0, 0, 3,232, 26, 0, 0, 0,232, 26, 0, 0, 0, + 232, 26, 0, 0, 0,232, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, + 0, 0, 0, 3, 32, 27, 0, 0, 0, 32, 27, 0, 0, 0, 32, 27, 0, 0, + 0, 32, 0, 0, 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, + 144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 27, 0, 0, 0,144, 0, 0, + 0, 71, 0, 0, 0, 87, 0, 0, 0, 83, 0, 0, 0, 3, 0, 28, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, + 0, 88, 0, 0, 0, 67, 0, 0, 0, 3,112, 28, 0, 0, 0,112, 28, 0, + 0, 0,112, 28, 0, 0, 0,112, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, + 0, 68, 0, 0, 0, 3,224, 28, 0, 0, 0,224, 28, 0, 0, 0,224, 28, + 0, 0, 0,224, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, + 0, 3, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, 29, 0, 0, 0, 80, + 0, 0, 0, 77, 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,192, 29, + 0, 0, 0,192, 29, 0, 0, 0,192, 29, 0, 0, 0,192, 0, 0, 0, 66, + 0, 0, 0, 68, 0, 0, 0, 80, 0, 0, 0, 3,128,111, 1, 0, 0,128, + 111, 1, 0, 0,128,111, 0, 0, 0,128, 0, 0, 0, 84, 0, 0, 0, 86, + 0, 0, 0, 71, 0, 0, 0, 3,176,113, 1, 0, 0,176,113, 1, 0, 0, + 176,113, 0, 0, 0,176, 0, 0, 0, 69, 0, 0, 0, 76, 0, 0, 0, 80, + 0, 0, 0, 3,224,115, 1, 0, 0,224,115, 1, 0, 0,224,115, 0, 0, + 0,224, 0, 0, 0, 69, 0, 0, 0, 80, 0, 0, 0, 74, 0, 0, 0, 3, + 16,118, 1, 0, 0, 16,118, 1, 0, 0, 16,118, 0, 0, 0, 16, 0, 0, + 0, 77, 0, 0, 0, 76, 0, 0, 0, 32, 0, 0, 0, 3, 64,120, 1, 0, + 0, 64,120, 1, 0, 0, 64,120, 0, 0, 0, 64, 0, 0, 0, 71, 0, 0, + 0, 87, 0, 0, 0, 83, 0, 0, 0, 3,112,122, 1, 0, 0,112,122, 1, + 0, 0,112,122, 0, 0, 0,112, 0, 0, 0, 83, 0, 0, 0, 88, 0, 0, + 0, 67, 0, 0, 0, 3,192,137, 1, 0, 0,192,137, 1, 0, 0,192,137, + 0, 0, 0,192, 0, 0, 0, 84, 0, 0, 0, 69, 0, 0, 0, 68, 0, 0, + 0, 3, 16,153, 1, 0, 0, 16,153, 1, 0, 0, 16,153, 0, 0, 0, 16, + 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0, 89, 0, 0, 0, 3, 96,168, + 1, 0, 0, 96,168, 1, 0, 0, 96,168, 0, 0, 0, 96, 0, 0, 0, 77, + 0, 0, 0, 77, 0, 0, 0, 86, 0, 0, 0, 3,208,196, 1, 0, 0,208, + 196, 1, 0, 0,208,196, 0, 0, 0,208, 0, 0, 0, 66, 0, 0, 0, 68, + 0, 0, 0, 80, 0, 0, 0, 3,255,255,255,255, 0,255,255,255, 0, 0, + 255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, + 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255, + 255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255, + 255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, + 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255, + 255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, + 0, 0,255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0, + 255,255, 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, + 0, 0, 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, + 0,255,255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255, + 255,255,255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255, + 255,255, 0,255,255,255, 0, 0,255,255, 0, 0, 0,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + } +}; + +const struct bin2cFILE ddsom_bootstrap = { + 128, + { + 0, 11, 1, 0, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 8, + 0, 0, 0, 0, 68, 38, 68, 50, 32, 69, 85, 82, 0, 11, 1, 0, 1, 1, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 8, 0, 0, 0, 0, 68, 38, + 68, 50, 32, 69, 85, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE ddsoma_bootstrap = { + 128, + { + 0, 11, 1, 0, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 6, + 0, 0, 0, 0, 68, 38, 68, 50, 32, 65, 83, 73, 0, 11, 1, 0, 1, 1, + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 6, 0, 0, 0, 0, 68, 38, + 68, 50, 32, 65, 83, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE ddsomj_bootstrap = { + 128, + { + 0, 11, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 0, + 0, 0, 0, 0, 68, 38, 68, 50, 32, 74, 80, 78, 0, 11, 1, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 0, 0, 0, 0, 0, 68, 38, + 68, 50, 32, 74, 80, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE ddsomu_bootstrap = { + 128, + { + 0, 11, 1, 0, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 2, + 0, 0, 0, 0, 68, 38, 68, 50, 32, 85, 83, 65, 0, 11, 1, 0, 1, 1, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,150, 2, 1, 2, 0, 0, 0, 0, 68, 38, + 68, 50, 32, 85, 83, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE defcmnd_bootstrap = { + 256, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, + 68, 5, 82, 4, 74, 0, 1, 8,128, 0, 0, 5, 83, 4, 67, 4, 68, 0, + 1, 6, 96, 0, 0, 4, 76, 4, 69, 4, 68, 0, 1, 4, 64, 0, 0, 5, + 80, 4, 71, 4, 68, 0, 1, 2, 32, 0, 0, 4, 67, 5, 82, 4, 66, 0, + 1, 0, 0, 0, 0, 4, 77, 5, 82, 5, 83, 0, 0, 8,128, 0, 0, 4, + 75, 4, 74, 4, 70, 0, 0, 6, 96, 0, 0, 5, 84, 4, 77, 4, 72, 0, + 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE defence_bootstrap = { + 256, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 7,112, 4, + 68, 5, 82, 4, 74, 0, 1, 8,131, 1, 21, 5, 83, 4, 65, 4, 77, 0, + 1, 5, 89, 2, 32, 4, 76, 4, 69, 4, 68, 0, 1, 4, 66, 8,133, 5, + 80, 4, 71, 4, 68, 0, 1, 2, 37, 2, 32, 4, 67, 5, 82, 4, 66, 0, + 1, 1, 16, 3, 53, 4, 77, 5, 82, 5, 83, 0, 0, 8,130, 6,101, 5, + 83, 5, 83, 5, 82, 0, 0, 6, 96, 1, 16, 5, 84, 4, 77, 4, 72, 0, + 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE defender_bootstrap = { + 256, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 7,112, 4, + 68, 5, 82, 4, 74, 0, 1, 8,131, 1, 21, 5, 83, 4, 65, 4, 77, 0, + 1, 5, 89, 2, 32, 4, 76, 4, 69, 4, 68, 0, 1, 4, 66, 8,133, 5, + 80, 4, 71, 4, 68, 0, 1, 2, 37, 2, 32, 4, 67, 5, 82, 4, 66, 0, + 1, 1, 16, 3, 53, 4, 77, 5, 82, 5, 83, 0, 0, 8,130, 6,101, 5, + 83, 5, 83, 5, 82, 0, 0, 6, 96, 1, 16, 5, 84, 4, 77, 4, 72, 0, + 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 5, 1, 21, 0, 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }, +}; + +/* used for defendg and defendw */ +const struct bin2cFILE defendg_bootstrap = { + 256, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 7,112, 4, + 68, 5, 82, 4, 74, 0, 1, 8,131, 1, 21, 5, 83, 4, 65, 4, 77, 0, + 1, 5, 89, 2, 32, 4, 76, 4, 69, 4, 68, 0, 1, 4, 65, 8,133, 5, + 80, 4, 71, 4, 68, 0, 1, 2, 37, 2, 32, 4, 67, 5, 82, 4, 66, 0, + 1, 1, 16, 3, 53, 4, 77, 5, 82, 5, 83, 0, 0, 8,130, 6,101, 5, + 83, 5, 83, 5, 82, 0, 0, 6, 96, 1, 16, 5, 84, 4, 77, 4, 72, 0, + 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }, +}; + +/* used for foodf and foodf2 */ +const struct bin2cFILE foodf_bootstrap = { + 512, + { + 7, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 15, 0, + 1, 0, 0, 0, 0, 0, 11, 0, 10, 0, 12, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 15, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 1, 0, 0, 0, 1, 0, 4, 0, + 10, 0, 4, 0, 4, 0, 9, 0, 1, 0, 0, 0, 0, 0, 2, 0, 7, 0, + 5, 0, 4, 0, 5, 0, 8, 0, 4, 0, 15, 0, 15, 0, 10, 0, 4, 0, + 2, 0, 4, 0, 2, 0, 5, 0, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 0, 0, + 0, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 15, 0, 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE foodfc_bootstrap = { + 512, + { + 7, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 11, 0, 10, 0, 12, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 15, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 1, 0, 0, 0, 1, 0, 4, 0, + 10, 0, 4, 0, 4, 0, 9, 0, 1, 0, 0, 0, 0, 0, 2, 0, 7, 0, + 5, 0, 4, 0, 5, 0, 8, 0, 4, 0, 15, 0, 15, 0, 10, 0, 4, 0, + 2, 0, 4, 0, 2, 0, 5, 0, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 0, 0, + 0, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 15, 0, 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE gaiapols_bootstrap = { + 128, + { + 1,190,254, 65,147, 35, 74, 65, 70, 0, 0, 46, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE hiimpact_bootstrap = { + 32768, + { + 37, 0, 18, 0, 33, 0, 64, 0, 0, 0, 0, 0, 66, 0, 85, 0, 78, 0, + 130, 0, 1, 0, 16, 0, 8, 0, 96, 0, 0, 0, 0, 0, 66, 0, 85, 0, + 78, 0,161, 0, 1, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 74, 0, + 82, 0, 78, 0, 3, 0, 1, 0, 9, 0, 65, 0, 80, 0, 0, 0, 0, 0, + 68, 0, 82, 0, 74, 0,132, 0, 1, 0, 8, 0,114, 0, 0, 0, 0, 0, + 0, 0, 84, 0, 73, 0, 77, 0,154, 0, 0, 0,151, 0, 25, 0, 32, 0, + 0, 0, 0, 0, 74, 0, 80, 0, 71, 0, 78, 0, 0, 0,134, 0, 25, 0, + 16, 0, 0, 0, 0, 0, 68, 0, 87, 0, 70, 0,111, 0, 0, 0,117, 0, + 17, 0, 16, 0, 0, 0, 0, 0, 68, 0, 84, 0, 87, 0,122, 0, 0, 0, + 116, 0,118, 0, 48, 0, 0, 0, 0, 0, 83, 0, 78, 0, 79, 0,245, 0, + 0, 0, 99, 0,144, 0, 32, 0, 0, 0, 0, 0, 76, 0, 79, 0, 70, 0, + 11, 0, 0, 0, 83, 0, 32, 0, 16, 0, 0, 0, 0, 0, 77, 0, 74, 0, + 84, 0,145, 0, 0, 0, 81, 0, 33, 0, 32, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0,136, 0, 0, 0, 81, 0, 33, 0, 32, 0, 0, 0, 0, 0, + 84, 0, 79, 0, 68, 0,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 30, 0,255, 0,225, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 3, 0,255, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 47, 0, 82, 0, 69, 0, + 86, 0, 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, + 32, 0, 51, 0, 32, 0, 45, 0, 32, 0, 49, 0, 50, 0, 47, 0, 50, 0, + 55, 0, 47, 0, 57, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0,125, 0, 2, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 74, 0, 82, 0, 78, 0, 14, 0, 2, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 69, 0, 74, 0, 66, 0, 28, 0, 1, 0,144, 0, 52, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 73, 0, 77, 0, 80, 0, 1, 0,137, 0, 98, 0, + 64, 0, 0, 0, 0, 0, 69, 0, 80, 0, 74, 0,244, 0, 1, 0,105, 0, + 98, 0, 16, 0, 0, 0, 0, 0, 74, 0, 73, 0, 77, 0, 67, 0, 1, 0, + 64, 0, 1, 0,112, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0,104, 0, + 1, 0, 32, 0, 1, 0,112, 0, 0, 0, 0, 0, 84, 0, 82, 0, 65, 0, + 134, 0, 1, 0, 25, 0, 16, 0, 0, 0, 0, 0, 0, 0, 84, 0, 77, 0, + 77, 0,231, 0, 1, 0, 6, 0, 16, 0, 0, 0, 0, 0, 0, 0, 77, 0, + 68, 0, 80, 0, 7, 0, 1, 0, 0, 0,137, 0, 80, 0, 0, 0, 0, 0, + 83, 0, 83, 0, 82, 0, 45, 0, 1, 0, 0, 0, 9, 0, 48, 0, 0, 0, + 0, 0, 76, 0, 69, 0, 68, 0,240, 0, 1, 0, 0, 0, 1, 0, 16, 0, + 0, 0, 0, 0, 74, 0, 69, 0, 72, 0, 22, 0, 1, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 65, 0, 76, 0, 73, 0, 24, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 73, 0, 75, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for joust, joustr, and joustwr */ +const struct bin2cFILE joust_bootstrap = +{ + 1024, + { + 2, 32, 0, 5, 0, 1, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 1, 26, 1, 28, + 0, 15, 1, 29, 0, 15, 1, 24, 1, 30, 0, 15, 0, 14, 0, 10, 0, 12, + 2, 35, 3, 50, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 2, 33, 1, 19, + 1, 22, 1, 22, 1, 19, 0, 11, 1, 23, 1, 29, 0, 10, 0, 15, 1, 22, + 0, 15, 0, 13, 1, 30, 1, 28, 1, 25, 1, 24, 1, 19, 0, 13, 1, 29, + 0, 10, 1, 19, 1, 24, 0, 13, 2, 46, 2, 37, 2, 41, 5, 81, 5, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 0, 10, + 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 0, 10, 42, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 1, 20, 1, 28, + 1, 24, 0, 0, 0, 2, 3, 51, 1, 16, 1, 26, 1, 16, 2, 36, 0, 0, + 0, 2, 2, 41, 1, 23, 1, 21, 1, 16, 1, 22, 0, 0, 0, 2, 2, 37, + 5, 82, 0, 13, 2, 33, 1, 21, 0, 0, 0, 2, 0, 5, 2, 34, 1, 20, + 0, 11, 1, 24, 0, 0, 0, 1, 7,118, 3, 53, 1, 23, 1, 28, 1, 29, + 0, 0, 0, 1, 6,101, 3, 53, 0, 0, 0, 0, 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE joust2_bootstrap = +{ + 1024, + { + 2, 37, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 1, 26, + 1, 28, 0, 15, 1, 29, 0, 15, 1, 24, 1, 30, 0, 15, 0, 14, 0, 10, + 0, 12, 2, 35, 3, 50, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 2, 33, + 1, 19, 1, 22, 1, 22, 1, 19, 0, 11, 1, 23, 1, 29, 0, 10, 0, 15, + 1, 22, 0, 15, 0, 13, 1, 30, 1, 28, 1, 25, 1, 24, 1, 19, 0, 13, + 1, 29, 0, 10, 1, 19, 1, 24, 0, 13, 2, 46, 2, 37, 2, 41, 5, 87, + 5, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, + 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 42, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, + 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, + 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, + 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, + 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, + 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, + 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, + 0, 0, 1, 20, 1, 28, 1, 24, 0, 0, 0, 4, 4, 66, 1, 16, 1, 20, + 1, 25, 0, 15, 0, 0, 0, 4, 3, 50, 1, 23, 1, 21, 2, 32, 0, 14, + 0, 0, 0, 4, 2, 41, 9,153, 2, 33, 0, 12, 0, 14, 0, 0, 0, 4, + 1, 16, 1, 17, 1, 23, 1, 22, 0, 10, 0, 0, 0, 4, 0, 5, 2, 35, + 0, 13, 0, 10, 1, 17, 0, 0, 0, 3, 9,153, 0, 9, 0, 0, + }, +}; + +const struct bin2cFILE luckywld_bootstrap = { + 16384, + { + 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,255,255,128, 0, 0, 0,106, 0, + 14, 0, 7, 14, 0, 0,106, 0, 14, 0, 31, 14, 0, 0, 7, 0, 0, 0, + 55, 0, 0, 0, 7, 0, 0, 0, 55, 0,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, 12,255,139,255, 78, 0, 73, 0, 83, 0, 32, 0, 0, 0, 3, 0, + 12,255,155,255, 65, 0, 77, 0, 85, 0, 32, 0, 1, 0, 0, 0, 12,255, + 163,255, 73, 0, 90, 0, 65, 0, 32, 0, 2, 0, 1, 0, 12,255,171,255, + 73, 0, 83, 0, 73, 0, 32, 0, 3, 0, 2, 0, 12,255,184,255, 84, 0, + 65, 0, 84, 0, 32, 0, 4, 0, 3, 0, 12,255,198,255, 73, 0, 87, 0, + 65, 0, 32, 0, 5, 0, 0, 0, 12,255,208,255, 82, 0, 86, 0, 70, 0, + 32, 0, 6, 0, 1, 0, 12,255,235,255, 89, 0, 90, 0, 70, 0, 32, 0, + 7, 0, 2, 0, 12,255,253,255, 71, 0, 83, 0, 88, 0, 32, 0, 0, 0, + 3, 0, 13,255, 20,255, 90, 0, 88, 0, 82, 0, 32, 0, 1, 0, 0, 0, + 13,255, 17,255, 71, 0, 64, 0, 68, 0, 32, 0, 2, 0, 1, 0, 13,255, + 51,255, 77, 0, 64, 0, 67, 0, 32, 0, 3, 0, 2, 0, 13,255, 67,255, + 65, 0, 64, 0, 75, 0, 32, 0, 4, 0, 3, 0, 13,255, 73,255, 75, 0, + 64, 0, 84, 0, 32, 0, 5, 0, 0, 0, 13,255,122,255, 78, 0, 64, 0, + 79, 0, 32, 0, 6, 0, 1, 0, 84,255,171,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 84,255,176,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 84,255,181,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 84,255,186,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 84,255,191,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255, + 196,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255,201,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255,206,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255,211,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 84,255,216,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 84,255,221,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 84,255,226,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 84,255,231,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 84,255,236,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255, + 241,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255,246,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 84,255,251,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 0,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 5,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 85,255, 10,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 85,255, 15,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 85,255, 20,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 85,255, 25,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, + 30,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 35,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 40,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 45,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 50,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 85,255, 55,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 85,255, 60,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 85,255, 65,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 85,255, 70,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, + 75,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 80,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 85,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 90,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 85,255, 95,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 85,255,100,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 85,255,105,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 85,255,110,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 85,255,115,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, + 120,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,125,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,130,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,135,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 85,255,140,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 85,255,145,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 85,255,150,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 85,255,155,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 85,255,160,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, + 165,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,170,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,175,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,180,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 85,255,185,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 85,255,190,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 85,255,195,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 85,255,200,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 85,255,205,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, + 210,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,215,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,220,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255,225,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 85,255,230,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 85,255,235,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 85,255,240,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 85,255,245,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 85,255,250,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 85,255, + 255,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 4,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 9,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 14,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 19,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 86,255, 24,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 86,255, 29,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 86,255, 34,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 86,255, 39,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, + 44,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 49,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 54,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 59,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 64,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 86,255, 69,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 86,255, 74,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 86,255, 79,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 86,255, 84,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, + 89,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 94,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, 99,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,104,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 86,255,109,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 86,255,114,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 86,255,119,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 86,255,124,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 86,255,129,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, + 134,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,139,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,144,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,149,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 86,255,154,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 86,255,159,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 86,255,164,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 86,255,169,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 86,255,174,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, + 179,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,184,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,189,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,194,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 86,255,199,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 86,255,204,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 86,255,209,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 86,255,214,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 86,255,219,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255, + 224,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,229,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,234,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 86,255,239,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 86,255,244,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 86,255,249,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 86,255,254,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 87,255, 3,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 87,255, 8,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, + 13,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 18,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 23,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 28,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 33,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 87,255, 38,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 87,255, 43,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 87,255, 48,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 87,255, 53,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, + 58,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 63,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 68,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 73,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 87,255, 78,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 87,255, 83,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 87,255, 88,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 87,255, 93,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 87,255, 98,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, + 103,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,108,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,113,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,118,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 87,255,123,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 87,255,128,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 87,255,133,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 87,255,138,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 87,255,143,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, + 148,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,153,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,158,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,163,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 87,255,168,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 87,255,173,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 87,255,178,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 87,255,183,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 87,255,188,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, + 193,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,198,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,203,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,208,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 87,255,213,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 87,255,218,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 87,255,223,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 87,255,228,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 87,255,233,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255, + 238,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,243,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,248,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 87,255,253,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 2,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 88,255, 7,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 88,255, 12,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 88,255, 17,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 88,255, 22,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, + 27,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 32,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 37,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 42,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 47,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 88,255, 52,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 88,255, 57,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 88,255, 62,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 88,255, 67,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, + 72,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 77,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 82,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 87,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 88,255, 92,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 88,255, 97,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 88,255,102,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 88,255,107,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 88,255,112,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, + 117,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,122,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,127,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,132,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 88,255,137,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 88,255,142,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 88,255,147,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 88,255,152,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 88,255,157,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, + 162,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,167,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,172,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,177,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 88,255,182,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 88,255,187,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 88,255,192,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 88,255,197,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 88,255,202,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, + 207,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,212,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,217,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255,222,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 88,255,227,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 88,255,232,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 88,255,237,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 88,255,242,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 88,255,247,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 88,255, + 252,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 1,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 6,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 11,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 16,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 89,255, 21,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 89,255, 26,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 89,255, 31,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 89,255, 36,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, + 41,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 46,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 51,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 56,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 61,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 89,255, 66,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 89,255, 71,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 89,255, 76,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 89,255, 81,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, + 86,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 91,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, 96,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,101,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 89,255,106,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 89,255,111,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 89,255,116,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 89,255,121,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 89,255,126,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, + 131,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,136,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,141,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,146,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 89,255,151,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 89,255,156,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 89,255,161,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 89,255,166,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 89,255,171,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, + 176,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,181,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,186,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,191,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 89,255,196,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 89,255,201,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 89,255,206,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 89,255,211,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 89,255,216,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255, + 221,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,226,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,231,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 89,255,236,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 89,255,241,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 89,255,246,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 89,255,251,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 90,255, 0,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 90,255, 5,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, + 10,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 15,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 20,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 25,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 30,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 90,255, 35,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 90,255, 40,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 90,255, 45,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 90,255, 50,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, + 55,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 60,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 65,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 70,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 90,255, 75,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 90,255, 80,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 90,255, 85,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 90,255, 90,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 90,255, 95,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, + 100,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,105,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,110,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,115,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 90,255,120,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 90,255,125,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 90,255,130,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 90,255,135,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 90,255,140,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, + 145,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,150,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,155,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,160,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 90,255,165,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 90,255,170,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 90,255,175,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 90,255,180,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 90,255,185,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, + 190,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,195,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,200,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,205,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 90,255,210,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 90,255,215,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 90,255,220,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 90,255,225,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 90,255,230,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255, + 235,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,240,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,245,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 90,255,250,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 90,255,255,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 91,255, 4,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 91,255, 9,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 91,255, 14,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 91,255, 19,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, + 24,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 29,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 34,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 39,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 44,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 91,255, 49,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 91,255, 54,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 91,255, 59,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 91,255, 64,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, + 69,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 74,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 79,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 84,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 91,255, 89,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 91,255, 94,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 91,255, 99,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 91,255,104,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 91,255,109,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, + 114,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,119,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,124,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,129,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 91,255,134,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 91,255,139,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 91,255,144,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 91,255,149,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 91,255,154,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, + 159,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,164,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,169,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,174,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 91,255,179,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 91,255,184,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 91,255,189,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 91,255,194,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 91,255,199,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, + 204,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,209,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,214,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,219,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 91,255,224,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 91,255,229,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 91,255,234,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 91,255,239,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 91,255,244,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255, + 249,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 91,255,254,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 3,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 8,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 13,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 92,255, 18,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 92,255, 23,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 92,255, 28,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 92,255, 33,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, + 38,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 43,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 48,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 53,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 58,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 92,255, 63,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 92,255, 68,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 92,255, 73,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 92,255, 78,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, + 83,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 88,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 93,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, 98,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 92,255,103,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 92,255,108,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 92,255,113,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 92,255,118,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 92,255,123,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, + 128,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,133,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,138,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,143,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 92,255,148,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 92,255,153,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 92,255,158,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 92,255,163,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 92,255,168,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, + 173,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,178,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,183,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,188,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 92,255,193,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 92,255,198,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 92,255,203,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 92,255,208,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 92,255,213,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255, + 218,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,223,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,228,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92,255,233,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 92,255,238,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 92,255,243,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 92,255,248,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 92,255,253,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 93,255, 2,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, + 7,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 12,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 17,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 22,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 27,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 93,255, 32,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 93,255, 37,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 93,255, 42,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 93,255, 47,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, + 52,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 57,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 62,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 67,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 93,255, 72,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 93,255, 77,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 93,255, 82,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 93,255, 87,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 93,255, 92,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, + 97,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,102,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,107,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,112,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 93,255,117,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 93,255,122,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 93,255,127,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 93,255,132,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 93,255,137,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, + 142,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,147,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,152,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,157,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 93,255,162,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 93,255,167,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 93,255,172,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 93,255,177,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 93,255,182,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, + 187,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,192,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,197,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,202,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 93,255,207,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 93,255,212,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 93,255,217,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 93,255,222,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 93,255,227,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255, + 232,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,237,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,242,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 93,255,247,255, 64, 0, 64, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 93,255,252,255, 64, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 94,255, 1,255, 64, 0, 64, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 94,255, 6,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 94,255, 11,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 94,255, 16,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 94,255, + 21,255, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 94,255, 26,255, + 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 94,255, 31,255, 64, 0, + 64, 0, 64, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, 16, 0,210,214, 0, 0,101,134, 0, 0,121, 74, 0, 0,139, 14, + 0, 0,159,210,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255, + } +}; + +const struct bin2cFILE mk2_bootstrap = { + 16384, +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 34, 0,255, 0,221, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 175, 0,255, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,216, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 51, 0, 46, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2chal_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 25, 0,255, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,224, 0, 67, 0, 72, 0, 65, 0, 76, 0, 76, 0, + 69, 0, 78, 0, 71, 0, 69, 0, 82, 0, 46, 0, 46, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 3, 0, 0, 0, 19, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,120, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2p_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 31, 0,255, 0,224, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 36, 0,255, 0,219, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0,231, 0, + 77, 0, 79, 0, 82, 0, 84, 0, 65, 0, 76, 0, 75, 0, 79, 0, 77, 0, + 66, 0, 65, 0, 84, 0, 80, 0, 76, 0, 85, 0, 83, 0, 46, 0, 67, 0, + 79, 0, 77, 0, 32, 0, 66, 0, 69, 0, 84, 0, 65, 0, 32, 0, 73, 0, + 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, 15, 0, 5, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 0, 0, 1, 0, 24, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 15, 0, 11, 0, 23, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 17, 0, 14, 0, 1, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,169, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 15, 0, + 5, 0, 0, 0, 6, 0,118, 0, 56, 0, 51, 0, 0, 0, 0, 0, 1, 0, + 24, 0,128, 0, 6, 0, 0, 0,156, 0, 49, 0, 0, 0, 15, 0, 11, 0, + 23, 0, 0, 0, 7, 0,144, 0, 38, 0, 48, 0, 0, 0, 17, 0, 14, 0, + 1, 0,128, 0, 7, 0,162, 0,102, 0, 46, 0, 0, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 8, 0, 72, 0,168, 0, 45, 0, 0, 0, 5, 0, 4, 0, + 11, 0,128, 0, 8, 0, 0, 0, 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, + 13, 0, 0, 0, 9, 0, 96, 0,174, 0, 10, 0, 0, 0, 7, 0, 0, 0, + 8, 0,128, 0, 9, 0,192, 0, 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, + 19, 0, 0, 0, 10, 0, 32, 0,161, 0, 7, 0, 0, 0, 1, 0, 1, 0, + 3, 0,128, 0, 10, 0,128, 0, 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, + 19, 0, 0, 0, 11, 0,224, 0,147, 0, 4, 0, 0, 0, 7, 0, 14, 0, + 20, 0,128, 0, 11, 0, 64, 0, 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, + 19, 0, 0, 0, 12, 0,160, 0,134, 0, 1, 0, 0, 0, 17, 0, 24, 0, + 20, 0,128, 0, 12, 0,144, 0, 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, + 6, 0, 0, 0, 13, 0,128, 0, 56, 0, 1, 0, 0, 0, 68, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2r14_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 26, 0,255, 0,229, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,218, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 49, 0, 46, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2r21_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 18, 0,255, 0,237, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,222, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 50, 0, 46, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2r32_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 19, 0,255, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,212, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 51, 0, 46, 0, 50, 0, 32, 0, 40, 0, + 69, 0, 85, 0, 82, 0, 79, 0, 80, 0, 69, 0, 65, 0, 78, 0, 41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2r42_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 22, 0,255, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,213, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 52, 0, 46, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE mk2r91_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 24, 0,255, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,253, 0,227, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 57, 0, 46, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, + 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, + 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, + 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, + 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, + 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, + 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, + 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, + 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, + 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, + 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, + 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, + 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, + 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, + 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, + 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE narc_bootstrap = { + 32768, + { + 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,166, 0, 0, 0, + 32, 0, 1, 0, 39, 0, 68, 0, 82, 0, 74, 0,215, 0, 0, 0, 16, 0, + 8, 0,101, 0, 71, 0, 78, 0, 80, 0,157, 0, 0, 0, 8, 0, 33, 0, + 100, 0, 84, 0, 82, 0, 65, 0,139, 0, 0, 0, 5, 0,114, 0, 24, 0, + 76, 0, 69, 0, 68, 0,155, 0, 0, 0, 5, 0, 18, 0, 85, 0, 77, 0, + 76, 0, 32, 0,218, 0, 0, 0, 4, 0, 18, 0, 80, 0, 76, 0, 69, 0, + 68, 0,196, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0, + 223, 0, 0, 0, 3, 0, 25, 0, 25, 0, 66, 0, 65, 0, 82, 0,245, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 1, 0,255, 0, + 254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,135, 0,255, 0, + 255, 0,236, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 19, 0, + 136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 29, 0, 78, 0, 65, 0, 82, 0, 67, 0, 32, 0, 82, 0, 69, 0, 86, 0, + 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 55, 0, 46, 0, 48, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 166, 0, 1, 0, 0, 0, 0, 0, 1, 0, 74, 0, 69, 0, 72, 0, 38, 0, + 0, 0,146, 0, 82, 0, 33, 0, 74, 0, 82, 0, 78, 0, 16, 0, 0, 0, + 136, 0,136, 0,136, 0, 84, 0, 74, 0, 69, 0,132, 0, 0, 0,121, 0, + 130, 0, 24, 0, 76, 0, 73, 0, 78, 0, 9, 0, 0, 0,119, 0,119, 0, + 119, 0, 77, 0, 76, 0, 32, 0,225, 0, 0, 0,105, 0,105, 0,150, 0, + 71, 0, 87, 0, 83, 0,166, 0, 0, 0,102, 0,102, 0,102, 0, 65, 0, + 76, 0, 32, 0, 32, 0, 0, 0,101, 0, 16, 0, 8, 0, 66, 0, 76, 0, + 83, 0,161, 0, 0, 0, 87, 0, 2, 0, 24, 0, 74, 0, 82, 0, 72, 0, + 170, 0, 0, 0, 85, 0, 85, 0, 85, 0, 74, 0, 32, 0, 80, 0, 70, 0, + 0, 0, 85, 0, 1, 0, 39, 0, 68, 0, 84, 0, 87, 0,147, 0, 0, 0, + 81, 0, 17, 0, 21, 0, 68, 0, 32, 0, 80, 0,212, 0, 0, 0, 72, 0, + 72, 0, 71, 0, 82, 0, 65, 0, 89, 0, 60, 0, 0, 0, 68, 0, 68, 0, + 68, 0, 87, 0, 66, 0, 68, 0, 86, 0, 0, 0, 65, 0,130, 0,128, 0, + 75, 0, 74, 0, 70, 0,225, 0, 0, 0, 57, 0, 32, 0, 53, 0, 78, 0, + 68, 0, 78, 0,145, 0, 0, 0, 56, 0, 16, 0,144, 0, 74, 0, 32, 0, + 66, 0,123, 0, 0, 0, 54, 0, 2, 0, 19, 0, 83, 0, 83, 0, 82, 0, + 188, 0, 0, 0, 51, 0, 9, 0, 96, 0, 77, 0, 82, 0, 32, 0,164, 0, + 0, 0, 50, 0,102, 0,102, 0, 66, 0, 73, 0, 71, 0, 47, 0, 0, 0, + 49, 0, 0, 0, 85, 0, 76, 0, 69, 0, 80, 0,152, 0, 0, 0, 48, 0, + 117, 0,101, 0, 77, 0, 68, 0, 82, 0, 18, 0, 0, 0, 41, 0,114, 0, + 86, 0, 66, 0, 65, 0, 67, 0, 72, 0, 0, 0, 40, 0,112, 0,112, 0, + 87, 0, 32, 0, 82, 0, 46, 0, 0, 0, 39, 0, 96, 0, 96, 0, 77, 0, + 80, 0, 84, 0, 39, 0, 0, 0, 38, 0, 85, 0, 32, 0, 83, 0, 85, 0, + 69, 0,119, 0, 0, 0, 37, 0, 68, 0,128, 0, 77, 0, 79, 0, 77, 0, + 45, 0, 0, 0, 36, 0, 68, 0,121, 0, 68, 0, 65, 0, 68, 0, 85, 0, + 0, 0, 35, 0, 68, 0,120, 0, 83, 0, 70, 0, 68, 0, 67, 0, 0, 0, + 34, 0, 68, 0,119, 0, 65, 0, 75, 0, 68, 0, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE narc3_bootstrap = { + 32768, + { + 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,166, 0, 0, 0, + 32, 0, 1, 0, 39, 0, 68, 0, 82, 0, 74, 0,215, 0, 0, 0, 16, 0, + 8, 0,101, 0, 71, 0, 78, 0, 80, 0,157, 0, 0, 0, 8, 0, 33, 0, + 100, 0, 84, 0, 82, 0, 65, 0,139, 0, 0, 0, 5, 0,114, 0, 24, 0, + 76, 0, 69, 0, 68, 0,155, 0, 0, 0, 5, 0, 18, 0, 85, 0, 77, 0, + 76, 0, 32, 0,218, 0, 0, 0, 4, 0, 18, 0, 80, 0, 76, 0, 69, 0, + 68, 0,196, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0, + 223, 0, 0, 0, 3, 0, 25, 0, 25, 0, 66, 0, 65, 0, 82, 0,245, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 19, 0, + 136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 29, 0, 78, 0, 65, 0, 82, 0, 67, 0, 32, 0, 82, 0, 69, 0, 86, 0, + 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 51, 0, 46, 0, 50, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 166, 0, 1, 0, 0, 0, 0, 0, 1, 0, 74, 0, 69, 0, 72, 0, 38, 0, + 0, 0,146, 0, 82, 0, 33, 0, 74, 0, 82, 0, 78, 0, 16, 0, 0, 0, + 136, 0,136, 0,136, 0, 84, 0, 74, 0, 69, 0,132, 0, 0, 0,121, 0, + 130, 0, 24, 0, 76, 0, 73, 0, 78, 0, 9, 0, 0, 0,119, 0,119, 0, + 119, 0, 77, 0, 76, 0, 32, 0,225, 0, 0, 0,105, 0,105, 0,150, 0, + 71, 0, 87, 0, 83, 0,166, 0, 0, 0,102, 0,102, 0,102, 0, 65, 0, + 76, 0, 32, 0, 32, 0, 0, 0,101, 0, 16, 0, 8, 0, 66, 0, 76, 0, + 83, 0,161, 0, 0, 0, 87, 0, 2, 0, 24, 0, 74, 0, 82, 0, 72, 0, + 170, 0, 0, 0, 85, 0, 85, 0, 85, 0, 74, 0, 32, 0, 80, 0, 70, 0, + 0, 0, 85, 0, 1, 0, 39, 0, 68, 0, 84, 0, 87, 0,147, 0, 0, 0, + 81, 0, 17, 0, 21, 0, 68, 0, 32, 0, 80, 0,212, 0, 0, 0, 72, 0, + 72, 0, 71, 0, 82, 0, 65, 0, 89, 0, 60, 0, 0, 0, 68, 0, 68, 0, + 68, 0, 87, 0, 66, 0, 68, 0, 86, 0, 0, 0, 65, 0,130, 0,128, 0, + 75, 0, 74, 0, 70, 0,225, 0, 0, 0, 57, 0, 32, 0, 53, 0, 78, 0, + 68, 0, 78, 0,145, 0, 0, 0, 56, 0, 16, 0,144, 0, 74, 0, 32, 0, + 66, 0,123, 0, 0, 0, 54, 0, 2, 0, 19, 0, 83, 0, 83, 0, 82, 0, + 188, 0, 0, 0, 51, 0, 9, 0, 96, 0, 77, 0, 82, 0, 32, 0,164, 0, + 0, 0, 50, 0,102, 0,102, 0, 66, 0, 73, 0, 71, 0, 47, 0, 0, 0, + 49, 0, 0, 0, 85, 0, 76, 0, 69, 0, 80, 0,152, 0, 0, 0, 48, 0, + 117, 0,101, 0, 77, 0, 68, 0, 82, 0, 18, 0, 0, 0, 41, 0,114, 0, + 86, 0, 66, 0, 65, 0, 67, 0, 72, 0, 0, 0, 40, 0,112, 0,112, 0, + 87, 0, 32, 0, 82, 0, 46, 0, 0, 0, 39, 0, 96, 0, 96, 0, 77, 0, + 80, 0, 84, 0, 39, 0, 0, 0, 38, 0, 85, 0, 32, 0, 83, 0, 85, 0, + 69, 0,119, 0, 0, 0, 37, 0, 68, 0,128, 0, 77, 0, 79, 0, 77, 0, + 45, 0, 0, 0, 36, 0, 68, 0,121, 0, 68, 0, 65, 0, 68, 0, 85, 0, + 0, 0, 35, 0, 68, 0,120, 0, 83, 0, 70, 0, 68, 0, 67, 0, 0, 0, + 34, 0, 68, 0,119, 0, 65, 0, 75, 0, 68, 0, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbahangt_bootstrap = { + 49152, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 45, 0,255, 0,210, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 254, 0,161, 0, 78, 0, 66, 0, 65, 0, 32, 0, 72, 0, 65, 0, 78, 0, + 71, 0, 84, 0, 73, 0, 77, 0, 69, 0, 32, 0, 45, 0, 32, 0, 86, 0, + 69, 0, 82, 0, 32, 0, 76, 0, 49, 0, 46, 0, 49, 0, 32, 0, 52, 0, + 47, 0, 49, 0, 54, 0, 47, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 16, 0,240, 0, 63, 0, + 90, 0,101, 0, 43, 0, 12, 0, 0, 0, 0, 0, 0, 0,136, 0, 64, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, + 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 5, 0, + 16, 0,240, 0, 63, 0, 21, 0, 32, 0,100, 0, 5, 0, 0, 0, 0, 0, + 0, 0,128, 0,144, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 242, 0, 0, 0, 5, 0, 4, 0,240, 0, 63, 0,146, 0,108, 0,162, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 5, 0, 12, 0,240, 0,191, 0, + 82, 0, 79, 0,113, 0, 5, 0, 0, 0, 0, 0, 0, 0,128, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, + 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 5, 0, + 12, 0,240, 0, 63, 0, 85, 0, 92, 0, 50, 0, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0,130, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 216, 0, 0, 0, 5, 0, 8, 0,240, 0, 63, 0, 18, 0, 92, 0, 42, 0, + 12, 0, 0, 0, 0, 0, 0, 0,128, 0, 18, 0, 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, + 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 5, 0, 8, 0,240, 0,191, 0, + 17, 0, 36, 0,163, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, + 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 5, 0, + 8, 0,240, 0,191, 0, 17, 0, 36, 0,123, 0, 19, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0,217, 0, 68, 0, 3, 0, 0, 0, 0, 0, 8, 0,208, 0, 42, 0, + 91, 0, 97, 0, 0, 0, 0, 0,160, 0, 64, 0,130, 0, 75, 0,133, 0, + 1, 0, 0, 0,192, 0, 64, 0,169, 0,167, 0,184, 0, 2, 0, 0, 0, + 0, 0, 4, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbajam_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 15, 0,255, 0,240, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,168, 0, 78, 0, 66, 0, 65, 0, 32, 0, 74, 0, 65, 0, + 77, 0, 32, 0, 32, 0, 82, 0, 69, 0, 86, 0, 32, 0, 51, 0, 46, 0, + 48, 0, 49, 0, 32, 0, 32, 0, 52, 0, 47, 0, 48, 0, 55, 0, 47, 0, + 57, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 64, 0,224, 0,255, 0, + 108, 0, 60, 0, 96, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 0, 0, 9, 0, 0, 0, 4, 0,225, 0, 16, 0, + 72, 0,224, 0,255, 0,195, 0,229, 0,245, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 0, 0, 2, 0, + 6, 0,230, 0, 9, 0, 32, 0,224, 0,255, 0, 73, 0,212, 0,210, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 0, 0, 8, 0, 8, 0,228, 0, 16, 0, 48, 0,224, 0,255, 0, + 137, 0,201, 0,168, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 0, 0, 2, 0, 2, 0, 4, 0,231, 0, 15, 0, + 56, 0,224, 0,255, 0,169, 0,172, 0,121, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 4, 0, 8, 0, + 4, 0,230, 0, 21, 0, 56, 0,224, 0,255, 0, 41, 0,182, 0,138, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 32, 0, 0, 0, 4, 0, 4, 0,168, 0, 20, 0, 72, 0,224, 0,255, 0, + 134, 0,204, 0,148, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 66, 0,132, 0, 10, 0,201, 0, 15, 0, + 72, 0,224, 0,255, 0, 51, 0,137, 0, 92, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 32, 0, 0, 0, + 16, 0,231, 0, 14, 0, 64, 0,224, 0,255, 0,166, 0,189, 0, 60, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 136, 0, 16, 0,129, 0, 8, 0,229, 0, 13, 0, 72, 0,224, 0,255, 0, + 201, 0, 30, 0,156, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 24, 0, 32, 0, 4, 0, 4, 0,198, 0, 11, 0, + 40, 0,224, 0,255, 0,130, 0, 49, 0, 11, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 8, 0, + 6, 0,160, 0, 28, 0,136, 0,224, 0,255, 0, 44, 0, 77, 0,169, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 166, 0,221, 0,187, 0, 6, 0,193, 0, 14, 0, 96, 0,224, 0,255, 0, + 49, 0, 69, 0,128, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 36, 0, 17, 0, 6, 0,230, 0, 13, 0, + 80, 0,224, 0,255, 0, 18, 0,172, 0, 0, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 64, 0, 16, 0, 19, 0, + 4, 0, 71, 0, 12, 0, 72, 0,224, 0,255, 0,211, 0,154, 0, 53, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 2, 0, 3, 0, 6, 0,243, 0, 19, 0, 96, 0,224, 0,255, 0, + 137, 0,137, 0, 35, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0,146, 0,132, 0, 12, 0,169, 0, 25, 0, + 120, 0,224, 0,255, 0,114, 0,233, 0,186, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0,147, 0,230, 0, 38, 0, + 1, 0,155, 0, 15, 0, 64, 0,224, 0,255, 0,150, 0, 53, 0, 85, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0,144, 0,132, 0, 16, 0,162, 0, 12, 0, 16, 0,224, 0,255, 0, + 3, 0,145, 0,176, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 4, 0, 4, 0,169, 0, 19, 0, + 64, 0,224, 0,255, 0, 36, 0,133, 0,176, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 34, 0, 68, 0, + 9, 0, 62, 0, 5, 0, 40, 0,224, 0,255, 0, 34, 0, 46, 0, 0, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0, 68, 0, 4, 0, 20, 0,172, 0, 5, 0, 40, 0,224, 0,255, 0, + 18, 0, 52, 0, 0, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, 8, 0,171, 0, 11, 0, + 40, 0,224, 0,255, 0,178, 0, 57, 0, 16, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, + 12, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbajamr2_bootstrap = { + 16384, + { + 110, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 15, 0,255, 0,240, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,168, 0, 78, 0, + 66, 0, 65, 0, 32, 0, 74, 0, 65, 0, 77, 0, 32, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 32, 0, 50, 0, 46, 0, 48, 0, 48, 0, 32, 0, 32, 0, + 50, 0, 47, 0, 49, 0, 48, 0, 47, 0, 57, 0, 51, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 64, 0,192, 0,255, 0, + 217, 0,120, 0,192, 0,196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 0, 0, 18, 0, 0, 0, 8, 0,193, 0, 16, 0, + 72, 0,192, 0,255, 0,135, 0,203, 0,235, 0,197, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 0, 0, 0, 0, 4, 0, + 12, 0,198, 0, 9, 0, 32, 0,192, 0,255, 0,147, 0,168, 0,165, 0, + 197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 0, 0, 0, 0, 16, 0, 16, 0,196, 0, 16, 0, 48, 0,192, 0,255, 0, + 19, 0,147, 0, 81, 0,197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 1, 0, 4, 0, 4, 0, 8, 0,199, 0, 15, 0, + 56, 0,192, 0,255, 0, 83, 0, 89, 0,243, 0,196, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 0, 0, 8, 0, 16, 0, + 8, 0,198, 0, 21, 0, 56, 0,192, 0,255, 0, 83, 0,108, 0, 21, 0, + 197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 64, 0, 0, 0, 8, 0, 8, 0,136, 0, 20, 0, 72, 0,192, 0,255, 0, + 13, 0,153, 0, 41, 0,197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 32, 0,132, 0, 8, 0, 21, 0,233, 0, 15, 0, + 72, 0,192, 0,255, 0,103, 0, 18, 0,185, 0,196, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 0, 0, 64, 0, 0, 0, + 32, 0,199, 0, 14, 0, 64, 0,192, 0,255, 0, 77, 0,123, 0,121, 0, + 196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 16, 0, 33, 0, 2, 0, 17, 0,197, 0, 13, 0, 72, 0,192, 0,255, 0, + 147, 0, 61, 0, 56, 0,197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 48, 0, 64, 0, 8, 0, 8, 0,230, 0, 11, 0, + 40, 0,192, 0,255, 0, 5, 0, 99, 0, 22, 0,196, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 64, 0, 0, 0, 16, 0, + 12, 0,128, 0, 28, 0,136, 0,192, 0,255, 0, 89, 0,154, 0, 82, 0, + 197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 76, 0,187, 0,119, 0, 13, 0,225, 0, 14, 0, 96, 0,192, 0,255, 0, + 99, 0,138, 0, 0, 0,197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 32, 0, 72, 0, 34, 0, 12, 0,198, 0, 13, 0, + 80, 0,192, 0,255, 0, 37, 0, 88, 0, 1, 0,196, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0,128, 0, 32, 0, 38, 0, + 8, 0,103, 0, 12, 0, 72, 0,192, 0,255, 0,167, 0, 53, 0,107, 0, + 196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 0, 0, 4, 0, 6, 0, 12, 0,211, 0, 19, 0, 96, 0,192, 0,255, 0, + 19, 0, 19, 0, 71, 0,196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 65, 0, 36, 0, 9, 0, 25, 0,137, 0, 25, 0, + 120, 0,192, 0,255, 0,229, 0,210, 0,117, 0,197, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 38, 0,205, 0, 77, 0, + 2, 0,187, 0, 15, 0, 64, 0,192, 0,255, 0, 45, 0,107, 0,170, 0, + 196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 65, 0, 32, 0, 9, 0, 33, 0,130, 0, 12, 0, 16, 0,192, 0,255, 0, + 7, 0, 34, 0, 97, 0,197, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 64, 0, 0, 0, 8, 0, 8, 0,137, 0, 19, 0, + 64, 0,192, 0,255, 0, 73, 0, 10, 0, 97, 0,197, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 64, 0, 68, 0,136, 0, + 18, 0, 30, 0, 5, 0, 40, 0,192, 0,255, 0, 69, 0, 92, 0, 0, 0, + 196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, + 65, 0,136, 0, 8, 0, 40, 0,140, 0, 5, 0, 40, 0,192, 0,255, 0, + 37, 0,104, 0, 0, 0,196, 0,163, 0,226, 0, 81, 0,241, 0,232, 0, + 56, 0, 86, 0,137, 0, 65, 0,136, 0, 8, 0, 16, 0,139, 0, 11, 0, + 40, 0,192, 0,255, 0,101, 0,115, 0, 32, 0,196, 0,163, 0,226, 0, + 81, 0,241, 0,232, 0, 56, 0, 86, 0,137, 0, 65, 0,136, 0, 8, 0, + 24, 0,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbajamt1_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,166, 0, 84, 0, 79, 0, + 85, 0, 82, 0, 78, 0, 65, 0, 77, 0, 69, 0, 78, 0, 84, 0, 32, 0, + 69, 0, 68, 0, 73, 0, 84, 0, 73, 0, 79, 0, 78, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 32, 0, 49, 0, 46, 0, 48, 0, 48, 0, 32, 0, 49, 0, + 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 64, 0,224, 0,255, 0, + 108, 0, 60, 0, 96, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 0, 0, 9, 0, 0, 0, 4, 0,225, 0, 16, 0, + 72, 0,224, 0,255, 0,195, 0,229, 0,245, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 0, 0, 2, 0, + 6, 0,230, 0, 9, 0, 32, 0,224, 0,255, 0, 73, 0,212, 0,210, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 0, 0, 8, 0, 8, 0,228, 0, 16, 0, 48, 0,224, 0,255, 0, + 137, 0,201, 0,168, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 0, 0, 2, 0, 2, 0, 4, 0,231, 0, 15, 0, + 56, 0,224, 0,255, 0,169, 0,172, 0,121, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 4, 0, 8, 0, + 4, 0,230, 0, 21, 0, 56, 0,224, 0,255, 0, 41, 0,182, 0,138, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 32, 0, 0, 0, 4, 0, 4, 0,168, 0, 20, 0, 72, 0,224, 0,255, 0, + 134, 0,204, 0,148, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 66, 0,132, 0, 10, 0,201, 0, 15, 0, + 72, 0,224, 0,255, 0, 51, 0,137, 0, 92, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 32, 0, 0, 0, + 16, 0,231, 0, 14, 0, 64, 0,224, 0,255, 0,166, 0,189, 0, 60, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 136, 0, 16, 0,129, 0, 8, 0,229, 0, 13, 0, 72, 0,224, 0,255, 0, + 201, 0, 30, 0,156, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 24, 0, 32, 0, 4, 0, 4, 0,198, 0, 11, 0, + 40, 0,224, 0,255, 0,130, 0, 49, 0, 11, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 8, 0, + 6, 0,160, 0, 28, 0,136, 0,224, 0,255, 0, 44, 0, 77, 0,169, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 4, 0, 81, 0, 18, 0, 4, 0,214, 0, 14, 0, 96, 0,224, 0,255, 0, + 49, 0, 69, 0,128, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 36, 0, 17, 0, 6, 0,230, 0, 13, 0, + 80, 0,224, 0,255, 0, 18, 0,172, 0, 0, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 64, 0, 16, 0, 19, 0, + 4, 0, 71, 0, 12, 0, 72, 0,224, 0,255, 0,211, 0,154, 0, 53, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 2, 0, 3, 0, 6, 0,243, 0, 19, 0, 96, 0,224, 0,255, 0, + 137, 0,137, 0, 35, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0,146, 0,132, 0, 12, 0,169, 0, 25, 0, + 120, 0,224, 0,255, 0,114, 0,233, 0,186, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0,147, 0,230, 0, 38, 0, + 1, 0,155, 0, 15, 0, 64, 0,224, 0,255, 0,150, 0, 53, 0, 85, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0,144, 0,132, 0, 16, 0,162, 0, 12, 0, 16, 0,224, 0,255, 0, + 3, 0,145, 0,176, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 4, 0, 4, 0,169, 0, 19, 0, + 64, 0,224, 0,255, 0, 36, 0,133, 0,176, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 34, 0, 68, 0, + 9, 0, 62, 0, 5, 0, 40, 0,224, 0,255, 0, 34, 0, 46, 0, 0, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0, 68, 0, 4, 0, 20, 0,172, 0, 5, 0, 40, 0,224, 0,255, 0, + 18, 0, 52, 0, 0, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, 8, 0,171, 0, 11, 0, + 40, 0,224, 0,255, 0,178, 0, 57, 0, 16, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, + 12, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbajamt2_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 8, 0,255, 0,247, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,166, 0, 84, 0, 79, 0, + 85, 0, 82, 0, 78, 0, 65, 0, 77, 0, 69, 0, 78, 0, 84, 0, 32, 0, + 69, 0, 68, 0, 73, 0, 84, 0, 73, 0, 79, 0, 78, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 32, 0, 50, 0, 46, 0, 48, 0, 32, 0, 49, 0, 47, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 64, 0,224, 0,255, 0, + 108, 0, 60, 0, 96, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 0, 0, 9, 0, 0, 0, 4, 0,225, 0, 16, 0, + 72, 0,224, 0,255, 0,195, 0,229, 0,245, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 0, 0, 2, 0, + 6, 0,230, 0, 9, 0, 32, 0,224, 0,255, 0, 73, 0,212, 0,210, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 0, 0, 8, 0, 8, 0,228, 0, 16, 0, 48, 0,224, 0,255, 0, + 137, 0,201, 0,168, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 0, 0, 2, 0, 2, 0, 4, 0,231, 0, 15, 0, + 56, 0,224, 0,255, 0,169, 0,172, 0,121, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 4, 0, 8, 0, + 4, 0,230, 0, 21, 0, 56, 0,224, 0,255, 0, 41, 0,182, 0,138, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 32, 0, 0, 0, 4, 0, 4, 0,168, 0, 20, 0, 72, 0,224, 0,255, 0, + 134, 0,204, 0,148, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 66, 0,132, 0, 10, 0,201, 0, 15, 0, + 72, 0,224, 0,255, 0, 51, 0,137, 0, 92, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 32, 0, 0, 0, + 16, 0,231, 0, 14, 0, 64, 0,224, 0,255, 0,166, 0,189, 0, 60, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 136, 0, 16, 0,129, 0, 8, 0,229, 0, 13, 0, 72, 0,224, 0,255, 0, + 201, 0, 30, 0,156, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 24, 0, 32, 0, 4, 0, 4, 0,198, 0, 11, 0, + 40, 0,224, 0,255, 0,130, 0, 49, 0, 11, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 8, 0, + 6, 0,160, 0, 28, 0,136, 0,224, 0,255, 0, 44, 0, 77, 0,169, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 4, 0, 81, 0, 18, 0, 4, 0,214, 0, 14, 0, 96, 0,224, 0,255, 0, + 49, 0, 69, 0,128, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 36, 0, 17, 0, 6, 0,230, 0, 13, 0, + 80, 0,224, 0,255, 0, 18, 0,172, 0, 0, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 64, 0, 16, 0, 19, 0, + 4, 0, 71, 0, 12, 0, 72, 0,224, 0,255, 0,211, 0,154, 0, 53, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 2, 0, 3, 0, 6, 0,243, 0, 19, 0, 96, 0,224, 0,255, 0, + 137, 0,137, 0, 35, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0,146, 0,132, 0, 12, 0,169, 0, 25, 0, + 120, 0,224, 0,255, 0,114, 0,233, 0,186, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0,147, 0,230, 0, 38, 0, + 1, 0,155, 0, 15, 0, 64, 0,224, 0,255, 0,150, 0, 53, 0, 85, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0,144, 0,132, 0, 16, 0,162, 0, 12, 0, 16, 0,224, 0,255, 0, + 3, 0,145, 0,176, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 4, 0, 4, 0,169, 0, 19, 0, + 64, 0,224, 0,255, 0, 36, 0,133, 0,176, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 34, 0, 68, 0, + 9, 0, 62, 0, 5, 0, 40, 0,224, 0,255, 0, 34, 0, 46, 0, 0, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0, 68, 0, 4, 0, 20, 0,172, 0, 5, 0, 40, 0,224, 0,255, 0, + 18, 0, 52, 0, 0, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, 8, 0,171, 0, 11, 0, + 40, 0,224, 0,255, 0,178, 0, 57, 0, 16, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, + 12, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbajamt3_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,166, 0, 84, 0, 79, 0, + 85, 0, 82, 0, 78, 0, 65, 0, 77, 0, 69, 0, 78, 0, 84, 0, 32, 0, + 69, 0, 68, 0, 73, 0, 84, 0, 73, 0, 79, 0, 78, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 32, 0, 51, 0, 46, 0, 48, 0, 32, 0, 51, 0, 47, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 64, 0,224, 0,255, 0, + 108, 0, 60, 0, 96, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 0, 0, 9, 0, 0, 0, 4, 0,225, 0, 16, 0, + 72, 0,224, 0,255, 0,195, 0,229, 0,245, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 0, 0, 2, 0, + 6, 0,230, 0, 9, 0, 32, 0,224, 0,255, 0, 73, 0,212, 0,210, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 0, 0, 8, 0, 8, 0,228, 0, 16, 0, 48, 0,224, 0,255, 0, + 137, 0,201, 0,168, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 0, 0, 2, 0, 2, 0, 4, 0,231, 0, 15, 0, + 56, 0,224, 0,255, 0,169, 0,172, 0,121, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 4, 0, 8, 0, + 4, 0,230, 0, 21, 0, 56, 0,224, 0,255, 0, 41, 0,182, 0,138, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 32, 0, 0, 0, 4, 0, 4, 0,168, 0, 20, 0, 72, 0,224, 0,255, 0, + 134, 0,204, 0,148, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 66, 0,132, 0, 10, 0,201, 0, 15, 0, + 72, 0,224, 0,255, 0, 51, 0,137, 0, 92, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 32, 0, 0, 0, + 16, 0,231, 0, 14, 0, 64, 0,224, 0,255, 0,166, 0,189, 0, 60, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 136, 0, 16, 0,129, 0, 8, 0,229, 0, 13, 0, 72, 0,224, 0,255, 0, + 201, 0, 30, 0,156, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 24, 0, 32, 0, 4, 0, 4, 0,198, 0, 11, 0, + 40, 0,224, 0,255, 0,130, 0, 49, 0, 11, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 8, 0, + 6, 0,160, 0, 28, 0,136, 0,224, 0,255, 0, 44, 0, 77, 0,169, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 4, 0, 81, 0, 18, 0, 4, 0,214, 0, 14, 0, 96, 0,224, 0,255, 0, + 49, 0, 69, 0,128, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 36, 0, 17, 0, 6, 0,230, 0, 13, 0, + 80, 0,224, 0,255, 0, 18, 0,172, 0, 0, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 64, 0, 16, 0, 19, 0, + 4, 0, 71, 0, 12, 0, 72, 0,224, 0,255, 0,211, 0,154, 0, 53, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 2, 0, 3, 0, 6, 0,243, 0, 19, 0, 96, 0,224, 0,255, 0, + 137, 0,137, 0, 35, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0,146, 0,132, 0, 12, 0,169, 0, 25, 0, + 120, 0,224, 0,255, 0,114, 0,233, 0,186, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0,147, 0,230, 0, 38, 0, + 1, 0,155, 0, 15, 0, 64, 0,224, 0,255, 0,150, 0, 53, 0, 85, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0,144, 0,132, 0, 16, 0,162, 0, 12, 0, 16, 0,224, 0,255, 0, + 3, 0,145, 0,176, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 4, 0, 4, 0,169, 0, 19, 0, + 64, 0,224, 0,255, 0, 36, 0,133, 0,176, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 34, 0, 68, 0, + 9, 0, 62, 0, 5, 0, 40, 0,224, 0,255, 0, 34, 0, 46, 0, 0, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0, 68, 0, 4, 0, 20, 0,172, 0, 5, 0, 40, 0,224, 0,255, 0, + 18, 0, 52, 0, 0, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, 8, 0,171, 0, 11, 0, + 40, 0,224, 0,255, 0,178, 0, 57, 0, 16, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, + 12, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbajamte_bootstrap = { + 16384, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 13, 0,255, 0,242, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,166, 0, 84, 0, 79, 0, + 85, 0, 82, 0, 78, 0, 65, 0, 77, 0, 69, 0, 78, 0, 84, 0, 32, 0, + 69, 0, 68, 0, 73, 0, 84, 0, 73, 0, 79, 0, 78, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 32, 0, 52, 0, 46, 0, 48, 0, 32, 0, 51, 0, 47, 0, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 64, 0,224, 0,255, 0, + 108, 0, 60, 0, 96, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 0, 0, 9, 0, 0, 0, 4, 0,225, 0, 16, 0, + 72, 0,224, 0,255, 0,195, 0,229, 0,245, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 0, 0, 2, 0, + 6, 0,230, 0, 9, 0, 32, 0,224, 0,255, 0, 73, 0,212, 0,210, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 0, 0, 8, 0, 8, 0,228, 0, 16, 0, 48, 0,224, 0,255, 0, + 137, 0,201, 0,168, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 0, 0, 2, 0, 2, 0, 4, 0,231, 0, 15, 0, + 56, 0,224, 0,255, 0,169, 0,172, 0,121, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 4, 0, 8, 0, + 4, 0,230, 0, 21, 0, 56, 0,224, 0,255, 0, 41, 0,182, 0,138, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 32, 0, 0, 0, 4, 0, 4, 0,168, 0, 20, 0, 72, 0,224, 0,255, 0, + 134, 0,204, 0,148, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 66, 0,132, 0, 10, 0,201, 0, 15, 0, + 72, 0,224, 0,255, 0, 51, 0,137, 0, 92, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 0, 0, 32, 0, 0, 0, + 16, 0,231, 0, 14, 0, 64, 0,224, 0,255, 0,166, 0,189, 0, 60, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 136, 0, 16, 0,129, 0, 8, 0,229, 0, 13, 0, 72, 0,224, 0,255, 0, + 201, 0, 30, 0,156, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 24, 0, 32, 0, 4, 0, 4, 0,198, 0, 11, 0, + 40, 0,224, 0,255, 0,130, 0, 49, 0, 11, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 8, 0, + 6, 0,160, 0, 28, 0,136, 0,224, 0,255, 0, 44, 0, 77, 0,169, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 4, 0, 81, 0, 18, 0, 4, 0,214, 0, 14, 0, 96, 0,224, 0,255, 0, + 49, 0, 69, 0,128, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 16, 0, 36, 0, 17, 0, 6, 0,230, 0, 13, 0, + 80, 0,224, 0,255, 0, 18, 0,172, 0, 0, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 64, 0, 16, 0, 19, 0, + 4, 0, 71, 0, 12, 0, 72, 0,224, 0,255, 0,211, 0,154, 0, 53, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, + 0, 0, 2, 0, 3, 0, 6, 0,243, 0, 19, 0, 96, 0,224, 0,255, 0, + 137, 0,137, 0, 35, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0,146, 0,132, 0, 12, 0,169, 0, 25, 0, + 120, 0,224, 0,255, 0,114, 0,233, 0,186, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0,147, 0,230, 0, 38, 0, + 1, 0,155, 0, 15, 0, 64, 0,224, 0,255, 0,150, 0, 53, 0, 85, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0,144, 0,132, 0, 16, 0,162, 0, 12, 0, 16, 0,224, 0,255, 0, + 3, 0,145, 0,176, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0, 68, 0, 32, 0, 0, 0, 4, 0, 4, 0,169, 0, 19, 0, + 64, 0,224, 0,255, 0, 36, 0,133, 0,176, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0, 68, 0, 32, 0, 34, 0, 68, 0, + 9, 0, 62, 0, 5, 0, 40, 0,224, 0,255, 0, 34, 0, 46, 0, 0, 0, + 226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, + 32, 0, 68, 0, 4, 0, 20, 0,172, 0, 5, 0, 40, 0,224, 0,255, 0, + 18, 0, 52, 0, 0, 0,226, 0, 81, 0,241, 0,168, 0,120, 0,116, 0, + 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, 8, 0,171, 0, 11, 0, + 40, 0,224, 0,255, 0,178, 0, 57, 0, 16, 0,226, 0, 81, 0,241, 0, + 168, 0,120, 0,116, 0, 28, 0,171, 0,196, 0, 32, 0, 68, 0, 4, 0, + 12, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nbamaxht_bootstrap = { + 49152, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 36, 0,255, 0,219, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 254, 0,162, 0, 77, 0, 65, 0, 88, 0, 32, 0, 72, 0, 65, 0, 78, 0, + 71, 0, 84, 0, 73, 0, 77, 0, 69, 0, 32, 0, 45, 0, 32, 0, 86, 0, + 69, 0, 82, 0, 32, 0, 76, 0, 49, 0, 46, 0, 48, 0, 32, 0, 49, 0, + 49, 0, 47, 0, 48, 0, 56, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 16, 0,240, 0, 63, 0, + 90, 0,101, 0, 43, 0, 12, 0, 0, 0, 0, 0, 0, 0,136, 0, 64, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, + 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 5, 0, + 16, 0,240, 0, 63, 0, 21, 0, 32, 0,100, 0, 5, 0, 0, 0, 0, 0, + 0, 0,128, 0,144, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 242, 0, 0, 0, 5, 0, 4, 0,240, 0, 63, 0,146, 0,108, 0,162, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 5, 0, 12, 0,240, 0,191, 0, + 82, 0, 79, 0,113, 0, 5, 0, 0, 0, 0, 0, 0, 0,128, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, + 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 5, 0, + 12, 0,240, 0, 63, 0, 85, 0, 92, 0, 50, 0, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0,130, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 216, 0, 0, 0, 5, 0, 8, 0,240, 0, 63, 0, 18, 0, 92, 0, 42, 0, + 12, 0, 0, 0, 0, 0, 0, 0,128, 0, 18, 0, 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, + 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 5, 0, 8, 0,240, 0,191, 0, + 17, 0, 36, 0,163, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, + 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 5, 0, + 8, 0,240, 0,191, 0, 17, 0, 36, 0,123, 0, 19, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,176, 0, 4, 0,240, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0,217, 0, 68, 0, 3, 0, 0, 0, 0, 0, 8, 0,208, 0, 42, 0, + 91, 0, 97, 0, 0, 0, 0, 0,160, 0, 64, 0,130, 0, 75, 0,133, 0, + 1, 0, 0, 0,192, 0, 64, 0,169, 0,167, 0,184, 0, 2, 0, 0, 0, + 0, 0, 4, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE nslashers_bootstrap = { + 128, + { + 196, 2, 0, 3, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 50, 88, 77, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 4,251,224,196, 2, 0, 3, 0, 0, 0, 0, + 80, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 50, 88, 77, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 4, + 251,224, + } +}; + +const struct bin2cFILE offroadc_bootstrap = { + 32768, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 0, + 0, 0,255, 0, 0, 0,255,255, 0, 0,255,255,255, 0,255,255,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255,255, 0, 0,255,255,255, 0, + 255,255,255,255,255, 0, 0, 0,255,255, 0, 0,255,255,255, 0,255,255, + 255,255,255, 0, 0, 0,255,255, 0, 0,255,255,255, 0,255,255,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0,194, 0, 0, 0,168,194, 0, 0,221,168,194, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255, 0, 0, 0, 0,194, 0, 0, 0,173,194, 0, 0, 22,173,194, 0, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 122, 0, 0, 0, 0,122, 0, 0, 0, 0,122, 0, 0, 0, 0,122, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 0, 0, 0, 15, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + } +}; + +const struct bin2cFILE openice_bootstrap = { + 49152, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 1, 0, 46, 0,255, 0,208, 0, 0, 0, 0, 0, 0, 0, + 11, 0,255, 0,244, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 1, 0,255, 0,254, 0, + 0, 0, 0, 0, 3, 0,131, 0,255, 0,121, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 0,153, 0, 79, 0, 80, 0, 69, 0, 78, 0, 32, 0, + 73, 0, 67, 0, 69, 0, 32, 0, 45, 0, 32, 0, 82, 0, 69, 0, 86, 0, + 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 49, 0, 46, 0, 50, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 94, 0, 19, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 19, 0,175, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 94, 0, 3, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 11, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 93, 0, 1, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 1, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,131, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 91, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 90, 0,177, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0,177, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 88, 0, 3, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 11, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,129, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,128, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 85, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 84, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 82, 0, 1, 0, 66, 0, 65, 0, 87, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 1, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,120, 0, 6, 0, 2, 0, 8, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,119, 0,118, 0, 94, 0,118, 0,118, 0, 0, 0, 0, 0, + 0, 0, 79, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,118, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 78, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,118, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 76, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 1, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 1, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,115, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 255, 0,243, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,114, 0, 47, 0, 9, 0, 8, 0, 4, 0, 0, 0, 0, 0, + 255, 0,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,195, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,113, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 255, 0,173, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,150, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,126, 0, 3, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,101, 0, 1, 0, 83, 0,127, 0,255, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 1, 0, 83, 0,127, 0,255, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 76, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,103, 0,118, 0, 94, 0,118, 0,118, 0, 0, 0, 0, 0, + 255, 0, 50, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,102, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 255, 0, 23, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,102, 0,118, 0, 94, 0,118, 0,118, 0, 0, 0, 0, 0, + 255, 0, 5, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 6, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0,100, 0, 15, 0,235, 0,235, 0,215, 0, 0, 0, 0, 0, + 255, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 9, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 0, 0,187, 0,231, 0, 2, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 12, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 14, 0, 1, 0,125, 0,223, 0,194, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 1, 0,125, 0,223, 0,194, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 15, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 17, 0, 0, 0,194, 0, 50, 0,224, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 1, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 18, 0, 3, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 88, 0,118, 0, 94, 0,118, 0,118, 0, 0, 0, 0, 0, + 255, 0, 20, 0, 1, 0,179, 0,168, 0, 67, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 21, 0, 0, 0,179, 0,204, 0,238, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 0, 0,179, 0,204, 0,239, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 23, 0, 19, 0,175, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 19, 0,175, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 24, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 26, 0, 1, 0, 83, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 1, 0,125, 0,223, 0,194, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 85, 0,122, 0,115, 0,153, 0,115, 0, 0, 0, 0, 0, + 255, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 84, 0,118, 0, 94, 0,118, 0,118, 0, 0, 0, 0, 0, + 255, 0, 29, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 3, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 83, 0,255, 0,255, 0,235, 0,190, 0, 0, 0, 0, 0, + 255, 0, 30, 0, 1, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 1, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 32, 0, 11, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 157, 0, 11, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 33, 0, 1, 0, 83, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 1, 0, 83, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 35, 0, 1, 0,182, 0,188, 0,160, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 1, 0,182, 0,188, 0,160, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 80, 0,118, 0,118, 0,118, 0,238, 0, 0, 0, 0, 0, + 255, 0, 36, 0, 3, 0,231, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 3, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 38, 0, 1, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 1, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 59, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 11, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 82, 0, 20, 0, 22, 0,141, 0, 20, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 20, 0, 22, 0,141, 0, 20, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,105, 0, 1, 0,187, 0,230, 0,223, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 1, 0,187, 0,230, 0,223, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0,130, 0, 0, 0,178, 0,116, 0,176, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 0, 0,178, 0,116, 0,177, 0, 0, 0, 0, 0, 0, 0, 48, 0, + 255, 0,128, 0, 62, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 37, 0, 70, 0,118, 0,118, 0,238, 0, 94, 0, 0, 0, 0, 0, + 255, 0,155, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 158, 0, 3, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0,205, 0,162, 0,226, 0, 68, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 224, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211, 0, 26, 0, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 96, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,116, 0,134, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 0, 1, 0, 5, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,112, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0,174, 0, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 1, 0, 3, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 96, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 0,180, 0, 44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 49, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 96, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, + 46, 0,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 96, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,104, 0,150, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0,104, 0, 0, 0, 3, 0, 72, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,192, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0,180, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 0, 0, 0, + 10, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0,112, 0, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0,190, 0, 35, 0, 0, 0, + 0, 0, 0, 0, 0, 0,153, 0, 0, 0, 10, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 224, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,133, 0,172, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 0, + 0, 0, 9, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,192, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 68, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, 24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0,128, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, + 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 0, 1, 0, 2, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 1, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,112, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for qix, qix2, qixa, qixb */ +const struct bin2cFILE qix_bootstrap = { + 1024, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 254, 0, 0, 0, 0, 80,130, 38,128, 64,211, 47,200,167, 0, 85,170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, + 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, + 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, + 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, 50, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 4, 1, 1, 0, 0, 1, 4, 1, 2, 4, + 0, 1, 4, 1, 2, 0, 0, 6, 0, 1, 1, 0, 0, 1, 22, 6, 2, 0, + 0, 1, 0, 4, 1, 0, 0, 1, 0, 2, 1, 0, 0, 1, 0, 2, 2, 0, + 0, 0, 4, 1, 4, 0, 0, 1, 0, 6, 2, 0, 0, 1, 1, 4, 1, 1, + 0, 0, 3, 16, 3,117, 55, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for revx */ +const struct bin2cFILE revx_bootstrap = { + 32768, + { + 0, 0, 0, 0, 49, 0, 0, 0, 8, 0, 0, 0,101, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 78, 0, 0, 0, 80, 0, 0, 0, + 124, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 8, 0, 0, 0,101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 78, 0, 0, 0, + 80, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, + 69, 0, 0, 0, 72, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 0, 0, 79, 0, 0, 0, 90, 0, 0, 0,234, 0, 0, 0, 0, 0, + 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0,252, 0, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 65, 0, 0, 0, 66, 0, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 65, 0, + 0, 0, 77, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, + 0, 0, 67, 0, 0, 0, 86, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 0, 0, 77, 0, 0, 0, 83, 0, 0, 0,253, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 80, 0, 0, 0, 71, 0, 0, 0, + 15, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 82, 0, 0, 0, + 78, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, + 0, 0, 78, 0, 0, 0, 80, 0, 0, 0,201, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 0, 0, 0, 86, 0, 0, 0, 84, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 74, 0, 0, 0, 80, 0, 0, 0, + 143, 0, 0, 0, 0, 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 69, 0, 0, 0, + 87, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0,133, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, + 87, 0, 0, 0, 72, 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0,128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74, 0, 0, 0, 77, 0, 0, 0, 75, 0, 0, 0,157, 0, 0, 0, 0, 0, + 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 0, 0, 74, 0, 0, 0, 67, 0, 0, 0,169, 0, + 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 65, 0, 0, 0, 71, 0, + 0, 0,188, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 65, 0, + 0, 0, 70, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 0, 0, 65, 0, 0, 0, 83, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, + 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 0, 0, 0, 68, 0, 0, 0, 77, 0, 0, 0,212, 0, 0, 0, + 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 71, 0, 0, 0, 70, 0, 0, 0, + 225, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 74, 0, 0, 0, + 66, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, + 75, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 76, 0, 0, 0, 69, 0, 0, 0, 66, 0, 0, 0,220, 0, 0, 0, 0, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 67, 0, 0, 0, 76, 0, 0, 0, 66, 0, 0, 0,222, 0, + 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 85, 0, 0, 0, 88, 0, + 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 68, 0, + 0, 0, 78, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 0, 0, 83, 0, 0, 0, 82, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 77, 0, 0, 0, 82, 0, 0, 0, 32, 0, 0, 0,240, 0, 0, 0, + 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 73, 0, 0, 0, 71, 0, 0, 0, + 221, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 69, 0, 0, 0, + 80, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 68, 0, 0, 0, 82, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 0, 0, 0, 65, 0, 0, 0, 67, 0, 0, 0,233, 0, 0, 0, 0, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 87, 0, 0, 0, 32, 0, 0, 0, 82, 0, 0, 0,230, 0, + 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 80, 0, 0, 0, 84, 0, + 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 85, 0, + 0, 0, 69, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, + 0, 0, 79, 0, 0, 0, 77, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 68, 0, 0, 0, 65, 0, 0, 0, 68, 0, 0, 0,230, 0, 0, 0, + 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 70, 0, 0, 0, 68, 0, 0, 0, + 210, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 75, 0, 0, 0, + 68, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, + 255, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0,255, 0, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,255, 0, 0, 0,251, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 255, 0, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, + 255, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0,255, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, + 255, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0,255, 0, 0, 0,212, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, + 255, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0,255, 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,129, 0, 0, 0,255, 0, 0, 0,126, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 86, 0, 0, 0,255, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0,255, 0, 0, 0,200, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 255, 0, 0, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 255, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0,255, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,255, 0, 0, 0,253, 0, + 0, 0, 0, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0,253, 0, 0, 0, + 254, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0,255, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, + 253, 0, 0, 0, 0, 0, 0, 0,253, 0, 0, 0,254, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 255, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0,253, 0, 0, 0, 0, 0, + 0, 0,253, 0, 0, 0,254, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0,124, 0, 0, 0,255, 0, 0, 0,255, 0, + 0, 0,236, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,161, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,252, 0, 0, 0, 82, 0, 0, 0, 82, 0, 0, 0, 69, 0, + 0, 0, 86, 0, 0, 0, 79, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, + 84, 0, 0, 0, 73, 0, 0, 0, 79, 0, 0, 0, 78, 0, 0, 0, 32, 0, + 0, 0, 88, 0, 0, 0, 32, 0, 0, 0, 45, 0, 0, 0, 32, 0, 0, 0, + 82, 0, 0, 0, 69, 0, 0, 0, 86, 0, 0, 0, 73, 0, 0, 0, 83, 0, + 0, 0, 73, 0, 0, 0, 79, 0, 0, 0, 78, 0, 0, 0, 32, 0, 0, 0, + 49, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 32, 0, 0, 0, 45, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 36, 0, 0, 0,194, 0, 0, 0,255, 0, 0, 0,211, 0, + 0, 0, 6, 0, 0, 0,127, 0, 0, 0,255, 0, 0, 0, 78, 0, 0, 0, + 32, 0, 0, 0,128, 0, 0, 0, 54, 0, 0, 0,128, 0, 0, 0, 42, 0, + 0, 0, 73, 0, 0, 0,144, 0, 0, 0,225, 0, 0, 0,253, 0, 0, 0, + 136, 0, 0, 0,126, 0, 0, 0,175, 0, 0, 0, 40, 0, 0, 0,240, 0, + 0, 0, 47, 0, 0, 0,109, 0, 0, 0, 81, 0, 0, 0,224, 0, 0, 0, + 94, 0, 0, 0,218, 0, 0, 0,163, 0, 0, 0,192, 0, 0, 0,189, 0, + 0, 0,180, 0, 0, 0,254, 0, 0, 0, 72, 0, 0, 0,148, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,226, 1, + 0, 0, 64,226, 1, 0, 21,184, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, + 163, 1, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for mmaulers */ +const struct bin2cFILE mmaulers_bootstrap = { + 128, + { + 4, 13,251,242,145,112, 69, 65, 65, 0, 0, 0, 0, 0, 0, 0, 2, 3, + 0, 0, 40, 0, 0, 0, 0, 0, 17, 2, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +/* used for rmpgwt11 */ +const struct bin2cFILE rmpgwt11_bootstrap = { + 49152, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 83, 0,255, 0,172, 0, 0, 0, 0, 0, 0, 0, + 17, 0,255, 0,238, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 0,148, 0, 82, 0, 65, 0, 77, 0, 80, 0, 65, 0, + 71, 0, 69, 0, 32, 0, 87, 0, 79, 0, 82, 0, 76, 0, 68, 0, 32, 0, + 84, 0, 79, 0, 85, 0, 82, 0, 32, 0, 45, 0, 32, 0, 82, 0, 69, 0, + 86, 0, 32, 0, 49, 0, 46, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 255, 0,148, 0, 25, 0,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0,229, 0, 52, 0, + 82, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,239, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 13, 0, 4, 0,232, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 14, 0, 0, 0, 1, 0, 26, 0,206, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 14, 0, 0, 0, 12, 0, 30, 0,245, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 29, 0, 43, 0, + 38, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 2, 0, + 1, 0,208, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 19, 0, 0, 0, + 31, 0, 3, 0,214, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 14, 0, + 0, 0, 4, 0, 5, 0,106, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, + 25, 0, 0, 0, 29, 0, 19, 0,103, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 1, 0, 0, 0, 2, 0, 34, 0,230, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 27, 0, 1, 0, 73, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 17, 0, 0, 0, 8, 0, 12, 0,224, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 13, 0, 29, 0,160, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 35, 0, 37, 0, + 57, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 13, 0, + 39, 0,247, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for rmpgwt */ +const struct bin2cFILE rmpgwt_bootstrap = { + 49152, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0,255, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 5, 0,255, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 36, 0,255, 0,219, 0, + 0, 0, 0, 0, 0, 0,237, 0,255, 0, 18, 0, 0, 0, 0, 0, 0, 0, + 19, 0,255, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 3, 0,255, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 3, 0,255, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 0,148, 0, 82, 0, 65, 0, 77, 0, 80, 0, 65, 0, + 71, 0, 69, 0, 32, 0, 87, 0, 79, 0, 82, 0, 76, 0, 68, 0, 32, 0, + 84, 0, 79, 0, 85, 0, 82, 0, 32, 0, 45, 0, 32, 0, 82, 0, 69, 0, + 86, 0, 32, 0, 49, 0, 46, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 255, 0,148, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 255, 0,148, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0,229, 0, 52, 0, + 82, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,227, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 1, 0, 0, 0, 2, 0, 8, 0,208, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 14, 0, 0, 0, 1, 0, 18, 0,254, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 14, 0, 0, 0, 12, 0, 27, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 18, 0, 0, 0, 27, 0, 27, 0, + 134, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 2, 0, + 4, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 13, 0, 8, 0,134, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, + 0, 0, 41, 0, 17, 0, 34, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, + 25, 0, 0, 0, 29, 0, 23, 0, 79, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 0, 0, 11, 0, 0, 0, 13, 0, 29, 0, 10, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 14, 0, 0, 0, 4, 0, 3, 0,255, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 4, 0, 0, 0, 24, 0, 5, 0, 49, 0, 0, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 32, 0, 0, 0, 2, 0, 12, 0,188, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 13, 0, 23, 0, + 41, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 13, 0, + 29, 0,160, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE robotron_bootstrap = +{ + 1024, + { + 2, 37, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 80, 5, 82, 4, 69, 5, 83, + 4, 69, 4, 78, 5, 84, 4, 69, 4, 68, 2, 32, 4, 66, 5, 89, 2, 32, + 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 87, 4, 73, + 4, 76, 4, 76, 4, 73, 4, 65, 4, 77, 5, 83, 2, 32, 4, 69, 4, 76, + 4, 69, 4, 67, 5, 84, 5, 82, 4, 79, 4, 78, 4, 73, 4, 67, 5, 83, + 2, 32, 4, 73, 4, 78, 4, 67, 3, 61, 2, 47, 2, 40, 5, 82, 14,236, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58,124, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 4, 68, 5, 82, + 4, 74, 0, 0, 0, 5, 2, 33, 2, 39, 4, 76, 4, 69, 4, 68, 0, 0, + 0, 5, 0, 2, 1, 24, 4, 69, 5, 80, 4, 74, 0, 0, 0, 4, 1, 18, + 5, 85, 4, 74, 4, 69, 5, 82, 0, 0, 0, 4, 1, 18, 5, 80, 4, 75, + 4, 73, 4, 68, 0, 0, 0, 3, 1, 25, 2, 32, 4, 77, 4, 76, 4, 71, + 0, 0, 0, 3, 1, 25, 1, 25, 5, 83, 5, 83, 5, 82, 0, 0, 0, 2, + 6,102, 4, 69, 5, 85, 4, 78, 4, 65, 0, 0, 0, 2, 6,102, 3, 53, + 4, 74, 5, 82, 5, 83, 0, 0, 0, 2, 5, 82, 5, 80, 4, 67, 4, 74, + 4, 77, 0, 0, 0, 2, 4, 65, 1, 16, 0, 0, 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE robotryo_bootstrap = +{ + 1024, +{ + 2, 37, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 80, 5, 82, 4, 69, 5, 83, + 4, 69, 4, 78, 5, 84, 4, 69, 4, 68, 2, 32, 4, 66, 5, 89, 2, 32, + 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 87, 4, 73, + 4, 76, 4, 76, 4, 73, 4, 65, 4, 77, 5, 83, 2, 32, 4, 69, 4, 76, + 4, 69, 4, 67, 5, 84, 5, 82, 4, 79, 4, 78, 4, 73, 4, 67, 5, 83, + 2, 32, 4, 73, 4, 78, 4, 67, 3, 61, 2, 47, 2, 40, 5, 84, 14,236, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, + 3, 58, 3, 58, 3, 58, 3, 58, 3, 58,124, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, + 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, + 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, + 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, + 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, + 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, + 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, + 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 4, 68, 5, 82, + 4, 74, 0, 0, 0, 5, 2, 33, 2, 39, 4, 76, 4, 69, 4, 68, 0, 0, + 0, 5, 0, 2, 1, 24, 4, 69, 5, 80, 4, 74, 0, 0, 0, 4, 1, 18, + 5, 85, 4, 74, 4, 69, 5, 82, 0, 0, 0, 4, 1, 18, 5, 80, 4, 75, + 4, 73, 4, 68, 0, 0, 0, 3, 1, 25, 2, 32, 4, 77, 4, 76, 4, 71, + 0, 0, 0, 3, 1, 25, 1, 25, 5, 83, 5, 83, 5, 82, 0, 0, 0, 2, + 6,102, 4, 69, 5, 85, 4, 78, 4, 65, 0, 0, 0, 2, 6,102, 3, 53, + 4, 74, 5, 82, 5, 83, 0, 0, 0, 2, 5, 82, 5, 80, 4, 67, 4, 74, + 4, 77, 0, 0, 0, 2, 4, 65, 1, 16, 0, 0, 0, 0, 0, 0, + }, +}; + +const struct bin2cFILE rungun_bootstrap = { + 128, + { + 4, 20,251,235,146, 71, 69, 65, 65, 0, 21, 3, 7, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 30, 0, 21, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE rungunu_bootstrap = { + 128, + { + 4, 38,251,217,146, 71, 85, 65, 66, 0, 16, 3, 7, 3, 0, 0, 0, 0, + 0, 7, 7, 0, 7, 26, 1, 16, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE shimpacp_bootstrap = { + 32768, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 13, 0,255, 0, + 242, 0, 0, 0, 0, 0, 0, 0, 13, 0,255, 0,242, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 19, 0, + 136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, + 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0, 8, 0, 80, 0, 82, 0, + 79, 0, 84, 0, 79, 0, 32, 0, 53, 0, 46, 0, 48, 0, 32, 0, 45, 0, + 32, 0, 57, 0, 47, 0, 49, 0, 53, 0, 47, 0, 57, 0, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 9, 0, 85, 0,247, 0, 16, 0, 0, 0, + 5, 0, 2, 0, 0, 0, 67, 0, 74, 0,186, 0, 76, 0,207, 0, 16, 0, + 0, 0, 5, 0, 2, 0, 0, 0, 32, 0,228, 0, 26, 0, 68, 0,164, 0, + 16, 0, 0, 0, 4, 0, 2, 0, 0, 0,142, 0,244, 0,158, 0, 59, 0, + 104, 0, 16, 0, 0, 0, 4, 0, 2, 0, 0, 0, 98, 0, 5, 0, 42, 0, + 51, 0,210, 0, 15, 0, 0, 0, 4, 0, 3, 0, 0, 0,222, 0, 52, 0, + 181, 0, 42, 0, 16, 0, 14, 0, 0, 0, 4, 0, 3, 0, 0, 0, 75, 0, + 51, 0, 19, 0, 34, 0,172, 0, 13, 0, 0, 0, 4, 0, 3, 0, 0, 0, + 230, 0,199, 0,193, 0, 25, 0, 72, 0, 13, 0, 0, 0, 4, 0, 3, 0, + 0, 0, 22, 0,138, 0, 80, 0, 17, 0,228, 0, 12, 0, 0, 0, 4, 0, + 3, 0, 0, 0,117, 0, 77, 0,209, 0, 8, 0,218, 0, 12, 0, 0, 0, + 4, 0, 3, 0, 0, 0, 46, 0,168, 0,228, 0, 25, 0,208, 0, 12, 0, + 0, 0, 3, 0, 2, 0, 0, 0,125, 0,141, 0, 64, 0, 85, 0,208, 0, + 12, 0, 0, 0, 3, 0, 2, 0, 0, 0, 98, 0,246, 0,157, 0, 76, 0, + 198, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0,193, 0,172, 0, 16, 0, + 68, 0,188, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0,109, 0, 45, 0, + 136, 0, 59, 0,178, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0,228, 0, + 208, 0,104, 0, 51, 0,173, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0, + 130, 0,141, 0,200, 0, 42, 0,158, 0, 12, 0, 0, 0, 3, 0, 2, 0, + 0, 0, 48, 0,115, 0, 74, 0, 34, 0,148, 0, 12, 0, 0, 0, 3, 0, + 2, 0, 0, 0, 12, 0, 76, 0, 29, 0, 34, 0,128, 0, 12, 0, 0, 0, + 2, 0, 1, 0, 0, 0,207, 0,129, 0,196, 0, 25, 0, 18, 0, 12, 0, + 0, 0, 2, 0, 1, 0, 0, 0,150, 0,166, 0, 8, 0, 85, 0,242, 0, + 8, 0, 0, 0, 3, 0, 2, 0, 0, 0,157, 0,180, 0,181, 0, 76, 0, + 232, 0, 8, 0, 0, 0, 3, 0, 1, 0, 0, 0,160, 0,179, 0, 9, 0, + 68, 0,222, 0, 8, 0, 0, 0, 3, 0, 1, 0, 0, 0,149, 0,176, 0, + 177, 0, 59, 0,160, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 84, 0, + 151, 0, 65, 0, 51, 0,150, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, + 49, 0,237, 0,181, 0, 42, 0,140, 0, 0, 0, 0, 0, 2, 0, 1, 0, + 0, 0,124, 0,100, 0, 49, 0, 17, 0,130, 0, 0, 0, 0, 0, 3, 0, + 2, 0, 0, 0,235, 0,164, 0,184, 0, 8, 0,120, 0, 0, 0, 0, 0, + 3, 0, 2, 0, 0, 0, 33, 0, 48, 0, 80, 0, 17, 0,100, 0, 0, 0, + 0, 0, 2, 0, 1, 0, 0, 0,151, 0,130, 0,149, 0, 8, 0, 80, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE shimpact_bootstrap = { + 32768, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 20, 0,255, 0, + 235, 0, 0, 0, 0, 0, 0, 0, 20, 0,255, 0,235, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 74, 0, 66, 0, 20, 0, 0, 0, + 229, 0, 74, 0, 82, 0, 78, 0, 18, 0, 0, 0,252, 0, 68, 0, 87, 0, + 70, 0, 25, 0, 0, 0,250, 0, 84, 0, 87, 0, 71, 0, 20, 0, 0, 0, + 6, 0, 74, 0, 69, 0, 72, 0, 2, 0, 0, 0,217, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 19, 0, + 136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, + 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0, 6, 0, 82, 0, 69, 0, + 86, 0, 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, + 45, 0, 49, 0, 32, 0, 32, 0, 32, 0, 57, 0, 47, 0, 51, 0, 48, 0, + 47, 0, 57, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 9, 0, 85, 0,247, 0, 16, 0, 0, 0, + 5, 0, 2, 0, 0, 0, 67, 0, 74, 0,186, 0, 76, 0,207, 0, 16, 0, + 0, 0, 5, 0, 2, 0, 0, 0, 32, 0,228, 0, 26, 0, 68, 0,164, 0, + 16, 0, 0, 0, 4, 0, 2, 0, 0, 0,142, 0,244, 0,158, 0, 59, 0, + 104, 0, 16, 0, 0, 0, 4, 0, 2, 0, 0, 0, 98, 0, 5, 0, 42, 0, + 51, 0,210, 0, 15, 0, 0, 0, 4, 0, 3, 0, 0, 0,222, 0, 52, 0, + 181, 0, 42, 0, 16, 0, 14, 0, 0, 0, 4, 0, 3, 0, 0, 0, 75, 0, + 51, 0, 19, 0, 34, 0,172, 0, 13, 0, 0, 0, 4, 0, 3, 0, 0, 0, + 230, 0,199, 0,193, 0, 25, 0, 72, 0, 13, 0, 0, 0, 4, 0, 3, 0, + 0, 0, 22, 0,138, 0, 80, 0, 17, 0,228, 0, 12, 0, 0, 0, 4, 0, + 3, 0, 0, 0,117, 0, 77, 0,209, 0, 8, 0,218, 0, 12, 0, 0, 0, + 4, 0, 3, 0, 0, 0, 46, 0,168, 0,228, 0, 25, 0,208, 0, 12, 0, + 0, 0, 3, 0, 2, 0, 0, 0,125, 0,141, 0, 64, 0, 85, 0,208, 0, + 12, 0, 0, 0, 3, 0, 2, 0, 0, 0, 98, 0,246, 0,157, 0, 76, 0, + 198, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0,193, 0,172, 0, 16, 0, + 68, 0,188, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0,109, 0, 45, 0, + 136, 0, 59, 0,178, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0,228, 0, + 208, 0,104, 0, 51, 0,173, 0, 12, 0, 0, 0, 3, 0, 2, 0, 0, 0, + 130, 0,141, 0,200, 0, 42, 0,158, 0, 12, 0, 0, 0, 3, 0, 2, 0, + 0, 0, 48, 0,115, 0, 74, 0, 34, 0,148, 0, 12, 0, 0, 0, 3, 0, + 2, 0, 0, 0, 12, 0, 76, 0, 29, 0, 34, 0,128, 0, 12, 0, 0, 0, + 2, 0, 1, 0, 0, 0,207, 0,129, 0,196, 0, 25, 0, 18, 0, 12, 0, + 0, 0, 2, 0, 1, 0, 0, 0,150, 0,166, 0, 8, 0, 85, 0,242, 0, + 8, 0, 0, 0, 3, 0, 2, 0, 0, 0,157, 0,180, 0,181, 0, 76, 0, + 232, 0, 8, 0, 0, 0, 3, 0, 1, 0, 0, 0,160, 0,179, 0, 9, 0, + 68, 0,222, 0, 8, 0, 0, 0, 3, 0, 1, 0, 0, 0,149, 0,176, 0, + 177, 0, 59, 0,160, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 84, 0, + 151, 0, 65, 0, 51, 0,150, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, + 49, 0,237, 0,181, 0, 42, 0,140, 0, 0, 0, 0, 0, 2, 0, 1, 0, + 0, 0,124, 0,100, 0, 49, 0, 17, 0,130, 0, 0, 0, 0, 0, 3, 0, + 2, 0, 0, 0,235, 0,164, 0,184, 0, 8, 0,120, 0, 0, 0, 0, 0, + 3, 0, 2, 0, 0, 0, 33, 0, 48, 0, 80, 0, 17, 0,100, 0, 0, 0, + 0, 0, 2, 0, 1, 0, 0, 0,151, 0,130, 0,149, 0, 8, 0, 80, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE sinistar_bootstrap = { + 1024, + { + 3, 48, 3, 48, 0, 3, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE sinista1_bootstrap = { + 1024, + { + 3, 48, 3, 48, 0, 3, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 81, 5, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE sinista2_bootstrap = { + 1024, + { + 3, 48, 3, 48, 0, 3, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE smashtv_bootstrap = { + 32768, + { + 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,134, 0, 0, 0, + 32, 0, 1, 0, 39, 0, 77, 0, 74, 0, 84, 0,204, 0, 0, 0, 25, 0, + 1, 0,105, 0, 68, 0, 82, 0, 74, 0,156, 0, 0, 0, 16, 0, 8, 0, + 101, 0, 68, 0, 74, 0, 84, 0,160, 0, 0, 0, 8, 0, 33, 0,100, 0, + 78, 0, 76, 0, 78, 0,138, 0, 0, 0, 5, 0,114, 0, 24, 0, 77, 0, + 84, 0, 78, 0,129, 0, 0, 0, 5, 0, 18, 0, 85, 0, 84, 0, 76, 0, + 67, 0,176, 0, 0, 0, 4, 0, 18, 0, 80, 0, 70, 0, 65, 0, 87, 0, + 187, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0,223, 0, + 0, 0, 2, 0,153, 0, 68, 0, 66, 0, 65, 0, 84, 0, 73, 0, 0, 0, + 2, 0, 87, 0, 56, 0, 77, 0, 65, 0, 78, 0,146, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 16, 0, 83, 0, 77, 0, 65, 0, 83, 0, 72, 0, 32, 0, + 84, 0, 86, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 56, 0, 46, 0, 48, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 134, 0, 3, 0, 5, 0, 16, 0, 72, 0, 74, 0, 79, 0, 78, 0,184, 0, + 1, 0,132, 0,128, 0, 0, 0, 84, 0, 73, 0, 77, 0, 16, 0, 1, 0, + 121, 0,130, 0, 24, 0, 84, 0, 74, 0, 69, 0, 8, 0, 1, 0,117, 0, + 0, 0,114, 0, 76, 0, 73, 0, 80, 0, 50, 0, 1, 0,105, 0, 17, 0, + 150, 0, 77, 0, 76, 0, 90, 0,251, 0, 1, 0,101, 0, 16, 0, 8, 0, + 71, 0, 87, 0, 83, 0,144, 0, 1, 0, 96, 0, 98, 0, 51, 0, 65, 0, + 76, 0, 84, 0, 40, 0, 0, 0, 87, 0, 2, 0, 24, 0, 66, 0, 76, 0, + 83, 0,173, 0, 0, 0, 80, 0, 0, 0, 1, 0, 74, 0, 79, 0, 78, 0, + 199, 0, 0, 0, 69, 0,101, 0,113, 0, 72, 0, 69, 0, 89, 0,254, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,180,105,105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE smashtv4_bootstrap = { + 32768, + { + 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,134, 0, 0, 0, + 32, 0, 1, 0, 39, 0, 77, 0, 74, 0, 84, 0,204, 0, 0, 0, 25, 0, + 1, 0,105, 0, 68, 0, 82, 0, 74, 0,156, 0, 0, 0, 16, 0, 8, 0, + 101, 0, 68, 0, 74, 0, 84, 0,160, 0, 0, 0, 8, 0, 33, 0,100, 0, + 78, 0, 76, 0, 78, 0,138, 0, 0, 0, 5, 0,114, 0, 24, 0, 77, 0, + 84, 0, 78, 0,129, 0, 0, 0, 5, 0, 18, 0, 85, 0, 84, 0, 76, 0, + 67, 0,176, 0, 0, 0, 4, 0, 18, 0, 80, 0, 70, 0, 65, 0, 87, 0, + 187, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0,223, 0, + 0, 0, 2, 0,153, 0, 68, 0, 66, 0, 65, 0, 84, 0, 73, 0, 0, 0, + 2, 0, 87, 0, 56, 0, 77, 0, 65, 0, 78, 0,146, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 18, 0, 83, 0, 77, 0, 65, 0, 83, 0, 72, 0, 32, 0, + 84, 0, 86, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 52, 0, 46, 0, 48, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 134, 0, 3, 0, 5, 0, 16, 0, 72, 0, 74, 0, 79, 0, 78, 0,184, 0, + 1, 0,132, 0,128, 0, 0, 0, 84, 0, 73, 0, 77, 0, 16, 0, 1, 0, + 121, 0,130, 0, 24, 0, 84, 0, 74, 0, 69, 0, 8, 0, 1, 0,117, 0, + 0, 0,114, 0, 76, 0, 73, 0, 80, 0, 50, 0, 1, 0,105, 0, 17, 0, + 150, 0, 77, 0, 76, 0, 90, 0,251, 0, 1, 0,101, 0, 16, 0, 8, 0, + 71, 0, 87, 0, 83, 0,144, 0, 1, 0, 96, 0, 98, 0, 51, 0, 65, 0, + 76, 0, 84, 0, 40, 0, 0, 0, 87, 0, 2, 0, 24, 0, 66, 0, 76, 0, + 83, 0,173, 0, 0, 0, 80, 0, 0, 0, 1, 0, 74, 0, 79, 0, 78, 0, + 199, 0, 0, 0, 69, 0,101, 0,113, 0, 72, 0, 69, 0, 89, 0,254, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,180,105,105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE smashtv5_bootstrap = { + 32768, + { + 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,134, 0, 0, 0, + 32, 0, 1, 0, 39, 0, 77, 0, 74, 0, 84, 0,204, 0, 0, 0, 25, 0, + 1, 0,105, 0, 68, 0, 82, 0, 74, 0,156, 0, 0, 0, 16, 0, 8, 0, + 101, 0, 68, 0, 74, 0, 84, 0,160, 0, 0, 0, 8, 0, 33, 0,100, 0, + 78, 0, 76, 0, 78, 0,138, 0, 0, 0, 5, 0,114, 0, 24, 0, 77, 0, + 84, 0, 78, 0,129, 0, 0, 0, 5, 0, 18, 0, 85, 0, 84, 0, 76, 0, + 67, 0,176, 0, 0, 0, 4, 0, 18, 0, 80, 0, 70, 0, 65, 0, 87, 0, + 187, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0,223, 0, + 0, 0, 2, 0,153, 0, 68, 0, 66, 0, 65, 0, 84, 0, 73, 0, 0, 0, + 2, 0, 87, 0, 56, 0, 77, 0, 65, 0, 78, 0,146, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 16, 0, 83, 0, 77, 0, 65, 0, 83, 0, 72, 0, 32, 0, + 84, 0, 86, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 53, 0, 46, 0, 48, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 134, 0, 3, 0, 5, 0, 16, 0, 72, 0, 74, 0, 79, 0, 78, 0,184, 0, + 1, 0,132, 0,128, 0, 0, 0, 84, 0, 73, 0, 77, 0, 16, 0, 1, 0, + 121, 0,130, 0, 24, 0, 84, 0, 74, 0, 69, 0, 8, 0, 1, 0,117, 0, + 0, 0,114, 0, 76, 0, 73, 0, 80, 0, 50, 0, 1, 0,105, 0, 17, 0, + 150, 0, 77, 0, 76, 0, 90, 0,251, 0, 1, 0,101, 0, 16, 0, 8, 0, + 71, 0, 87, 0, 83, 0,144, 0, 1, 0, 96, 0, 98, 0, 51, 0, 65, 0, + 76, 0, 84, 0, 40, 0, 0, 0, 87, 0, 2, 0, 24, 0, 66, 0, 76, 0, + 83, 0,173, 0, 0, 0, 80, 0, 0, 0, 1, 0, 74, 0, 79, 0, 78, 0, + 199, 0, 0, 0, 69, 0,101, 0,113, 0, 72, 0, 69, 0, 89, 0,254, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,180,105,105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE smashtv6_bootstrap = { + 32768, + { + 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,134, 0, 0, 0, + 32, 0, 1, 0, 39, 0, 77, 0, 74, 0, 84, 0,204, 0, 0, 0, 25, 0, + 1, 0,105, 0, 68, 0, 82, 0, 74, 0,156, 0, 0, 0, 16, 0, 8, 0, + 101, 0, 68, 0, 74, 0, 84, 0,160, 0, 0, 0, 8, 0, 33, 0,100, 0, + 78, 0, 76, 0, 78, 0,138, 0, 0, 0, 5, 0,114, 0, 24, 0, 77, 0, + 84, 0, 78, 0,129, 0, 0, 0, 5, 0, 18, 0, 85, 0, 84, 0, 76, 0, + 67, 0,176, 0, 0, 0, 4, 0, 18, 0, 80, 0, 70, 0, 65, 0, 87, 0, + 187, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0,223, 0, + 0, 0, 2, 0,153, 0, 68, 0, 66, 0, 65, 0, 84, 0, 73, 0, 0, 0, + 2, 0, 87, 0, 56, 0, 77, 0, 65, 0, 78, 0,146, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 16, 0, 83, 0, 77, 0, 65, 0, 83, 0, 72, 0, 32, 0, + 84, 0, 86, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 54, 0, 46, 0, 48, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 134, 0, 3, 0, 5, 0, 16, 0, 72, 0, 74, 0, 79, 0, 78, 0,184, 0, + 1, 0,132, 0,128, 0, 0, 0, 84, 0, 73, 0, 77, 0, 16, 0, 1, 0, + 121, 0,130, 0, 24, 0, 84, 0, 74, 0, 69, 0, 8, 0, 1, 0,117, 0, + 0, 0,114, 0, 76, 0, 73, 0, 80, 0, 50, 0, 1, 0,105, 0, 17, 0, + 150, 0, 77, 0, 76, 0, 90, 0,251, 0, 1, 0,101, 0, 16, 0, 8, 0, + 71, 0, 87, 0, 83, 0,144, 0, 1, 0, 96, 0, 98, 0, 51, 0, 65, 0, + 76, 0, 84, 0, 40, 0, 0, 0, 87, 0, 2, 0, 24, 0, 66, 0, 76, 0, + 83, 0,173, 0, 0, 0, 80, 0, 0, 0, 1, 0, 74, 0, 79, 0, 78, 0, + 199, 0, 0, 0, 69, 0,101, 0,113, 0, 72, 0, 69, 0, 89, 0,254, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,180,105,105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for term2 */ +const struct bin2cFILE term2_bootstrap = { + 32768, + { + 0, 0, 49, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 124, 0, 0, 0, 49, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,124, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0,248, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 0, 66, 0, 68, 0,250, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 67, 0, 86, 0,246, 0, 0, 0, 36, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 74, 0, 67, 0,250, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 0, 80, 0, 71, 0, 3, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 79, 0, 90, 0,242, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0, 10, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 10, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 32, 0, + 67, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0,255, 0,235, 0, 0, 0, 0, 0, + 0, 0, 3, 0,255, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 3, 0,255, 0,252, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 6, 0,255, 0,249, 0, 0, 0, 0, 0, + 0, 0, 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, 0, 0, 0, 0, + 0, 0, 5, 0,255, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 28, 0,255, 0,227, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 1, 0,135, 0,255, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 26, 0,255, 0,229, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 2, 0, 0, 0, 2, 0,255, 0, + 251, 0, 0, 0, 94, 0, 0, 0, 28, 0,255, 0,133, 0, 0, 0,255, 0, + 0, 0,255, 0,254, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0,255, 0, + 251, 0, 0, 0, 94, 0, 0, 0, 28, 0,255, 0,133, 0, 0, 0,255, 0, + 0, 0,255, 0,254, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,130, 0,255, 0, + 255, 0,236, 0,125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0,100, 0, + 0, 0, 7, 0,161, 0, 32, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 0,189, 0, 84, 0, 69, 0, + 82, 0, 77, 0, 73, 0, 78, 0, 65, 0, 84, 0, 79, 0, 82, 0, 32, 0, + 50, 0, 32, 0, 45, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, 51, 0, 32, 0, 45, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0,201, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74, 0, 82, 0, 67, 0, 31, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 76, 0, 83, 0,138, 0, 0, 0,144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 69, 0, 80, 0,136, 0, 0, 0,133, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 90, 0, 70, 0,149, 0, 0, 0,128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 73, 0, 76, 0,148, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 78, 0, 79, 0,154, 0, + 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 65, 0, 89, 0, + 163, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 79, 0, + 71, 0,178, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 65, 0, 83, 0,199, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 0, 68, 0, 77, 0,212, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 71, 0, 70, 0,225, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,222, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,213, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,220, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0,222, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 190, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0,207, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,183, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0,240, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0,221, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0,206, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0,204, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0,233, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0,230, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 190, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0,194, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0,198, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0,230, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0,210, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0,223, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for term2la1 */ +const struct bin2cFILE term2la1_bootstrap = { + 32768, + { + 0, 0, 49, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 124, 0, 0, 0, 49, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,124, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0,248, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 0, 66, 0, 68, 0,250, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 67, 0, 86, 0,246, 0, 0, 0, 36, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 74, 0, 67, 0,250, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 0, 80, 0, 71, 0, 3, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 79, 0, 90, 0,242, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0, 10, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 10, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 32, 0, + 67, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,255, 0,250, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 42, 0,255, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 42, 0,255, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 2, 0, 0, 0, 2, 0,255, 0, + 251, 0, 0, 0, 94, 0, 0, 0, 28, 0,255, 0,133, 0, 0, 0,255, 0, + 0, 0,255, 0,254, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0,255, 0, + 251, 0, 0, 0, 94, 0, 0, 0, 28, 0,255, 0,133, 0, 0, 0,255, 0, + 0, 0,255, 0,254, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0,100, 0, + 0, 0, 7, 0,161, 0, 32, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 0,189, 0, 84, 0, 69, 0, + 82, 0, 77, 0, 73, 0, 78, 0, 65, 0, 84, 0, 79, 0, 82, 0, 32, 0, + 50, 0, 32, 0, 45, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, 49, 0, 32, 0, 45, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0,201, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74, 0, 82, 0, 67, 0, 31, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 76, 0, 83, 0,138, 0, 0, 0,144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 69, 0, 80, 0,136, 0, 0, 0,133, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 90, 0, 70, 0,149, 0, 0, 0,128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 73, 0, 76, 0,148, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 78, 0, 79, 0,154, 0, + 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 65, 0, 89, 0, + 163, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 79, 0, + 71, 0,178, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 65, 0, 83, 0,199, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 0, 68, 0, 77, 0,212, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 71, 0, 70, 0,225, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,222, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,213, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,220, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0,222, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 190, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0,207, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,183, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0,240, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0,221, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0,206, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0,204, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0,233, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0,230, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 190, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0,194, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0,198, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0,230, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0,210, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0,223, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +/* used for term2la2 */ +const struct bin2cFILE term2la2_bootstrap = { + 32768, + { + 0, 0, 49, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 124, 0, 0, 0, 49, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,124, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0,248, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 0, 66, 0, 68, 0,250, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 67, 0, 86, 0,246, 0, 0, 0, 36, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 84, 0, 74, 0, 67, 0,250, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 0, 80, 0, 71, 0, 3, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 79, 0, 90, 0,242, 0, 0, 0, + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0, 10, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 10, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 32, 0, + 67, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,255, 0,250, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 22, 0,255, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 22, 0,255, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 2, 0, 0, 0, 2, 0,255, 0, + 251, 0, 0, 0, 94, 0, 0, 0, 28, 0,255, 0,133, 0, 0, 0,255, 0, + 0, 0,255, 0,254, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0,255, 0, + 251, 0, 0, 0, 94, 0, 0, 0, 28, 0,255, 0,133, 0, 0, 0,255, 0, + 0, 0,255, 0,254, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0,100, 0, + 0, 0, 7, 0,161, 0, 32, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 0,189, 0, 84, 0, 69, 0, + 82, 0, 77, 0, 73, 0, 78, 0, 65, 0, 84, 0, 79, 0, 82, 0, 32, 0, + 50, 0, 32, 0, 45, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, + 73, 0, 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, 50, 0, 32, 0, 45, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0,201, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74, 0, 82, 0, 67, 0, 31, 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 76, 0, 83, 0,138, 0, 0, 0,144, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 69, 0, 80, 0,136, 0, 0, 0,133, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 90, 0, 70, 0,149, 0, 0, 0,128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, 73, 0, 76, 0,148, 0, 0, 0, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 78, 0, 79, 0,154, 0, + 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 65, 0, 89, 0, + 163, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 79, 0, + 71, 0,178, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, + 65, 0, 83, 0,199, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 69, 0, 68, 0, 77, 0,212, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 71, 0, 70, 0,225, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,222, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,213, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,220, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0,222, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 190, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0,207, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,183, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0,240, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0,221, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0,206, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0,204, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0,233, 0, 0, 0, + 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0,230, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 190, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0,194, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0,198, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0,230, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0,210, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0,223, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE totcarn_bootstrap = { + 32768, + { + 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,134, 0, 0, 0, + 16, 0, 4, 0, 16, 0, 83, 0, 76, 0, 33, 0, 27, 0, 0, 0, 9, 0, + 68, 0,119, 0, 69, 0, 80, 0, 74, 0, 92, 0, 0, 0, 8, 0, 4, 0, + 134, 0, 76, 0, 69, 0, 68, 0,152, 0, 0, 0, 7, 0, 8, 0,130, 0, + 68, 0, 65, 0, 78, 0,155, 0, 0, 0, 6, 0,128, 0, 64, 0, 68, 0, + 74, 0, 84, 0, 87, 0, 0, 0, 5, 0,145, 0, 4, 0, 74, 0, 80, 0, + 87, 0,116, 0, 0, 0, 4, 0, 4, 0, 80, 0, 78, 0, 69, 0, 68, 0, + 208, 0, 0, 0, 3, 0,135, 0,128, 0, 77, 0, 74, 0, 84, 0, 10, 0, + 0, 0, 2, 0,128, 0,136, 0, 66, 0, 85, 0, 89, 0, 5, 0, 0, 0, + 1, 0,101, 0, 2, 0, 87, 0, 77, 0, 83, 0,160, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0,255, 0,236, 0,119, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 46, 0, 84, 0, 79, 0, 84, 0, 65, 0, 76, 0, 32, 0, + 67, 0, 65, 0, 82, 0, 78, 0, 65, 0, 71, 0, 69, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 76, 0, + 65, 0, 49, 0, 32, 0, 45, 0, 32, 0, 51, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 134, 0, 0, 0, 72, 0, 70, 0,146, 0, 77, 0, 74, 0, 84, 0,244, 0, + 0, 0, 67, 0, 64, 0, 16, 0, 83, 0, 76, 0, 33, 0,172, 0, 0, 0, + 65, 0,137, 0, 19, 0, 82, 0, 74, 0, 82, 0, 52, 0, 0, 0, 54, 0, + 104, 0,146, 0, 74, 0, 79, 0, 78, 0,232, 0, 0, 0, 41, 0, 96, 0, + 150, 0, 83, 0, 89, 0, 68, 0,240, 0, 0, 0, 38, 0, 82, 0, 55, 0, + 72, 0, 69, 0, 89, 0,106, 0, 0, 0, 33, 0, 87, 0,130, 0, 69, 0, + 74, 0, 66, 0, 52, 0, 0, 0, 24, 0, 32, 0,116, 0, 68, 0, 82, 0, + 74, 0,115, 0, 0, 0, 20, 0,104, 0,146, 0, 80, 0, 74, 0, 83, 0, + 4, 0, 0, 0, 16, 0, 8, 0,101, 0, 71, 0, 78, 0, 80, 0,157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0,255, 0, + 194, 0, 19, 0, 80, 0, 0, 0, 0, 0,158, 0,158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 61, 0, 61, 0, 61, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,180,105,105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE totcarnp_bootstrap = { + 32768, + { + 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,134, 0, 0, 0, + 17, 0, 17, 0, 17, 0, 83, 0, 76, 0, 33, 0, 12, 0, 0, 0, 9, 0, + 68, 0,119, 0, 69, 0, 80, 0, 74, 0, 92, 0, 0, 0, 8, 0, 4, 0, + 134, 0, 76, 0, 69, 0, 68, 0,152, 0, 0, 0, 7, 0, 8, 0,130, 0, + 68, 0, 65, 0, 78, 0,155, 0, 0, 0, 6, 0,128, 0, 64, 0, 68, 0, + 74, 0, 84, 0, 87, 0, 0, 0, 5, 0,145, 0, 4, 0, 74, 0, 80, 0, + 87, 0,116, 0, 0, 0, 4, 0, 4, 0, 80, 0, 78, 0, 69, 0, 68, 0, + 208, 0, 0, 0, 3, 0,135, 0,128, 0, 77, 0, 74, 0, 84, 0, 10, 0, + 0, 0, 2, 0,128, 0,136, 0, 66, 0, 85, 0, 89, 0, 5, 0, 0, 0, + 1, 0,101, 0, 2, 0, 87, 0, 77, 0, 83, 0,160, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0,255, 0,236, 0,119, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 46, 0, 84, 0, 79, 0, 84, 0, 65, 0, 76, 0, 32, 0, + 67, 0, 65, 0, 82, 0, 78, 0, 65, 0, 71, 0, 69, 0, 32, 0, 80, 0, + 82, 0, 79, 0, 84, 0, 79, 0, 32, 0, 86, 0, 32, 0, 49, 0, 46, 0, + 48, 0, 32, 0, 49, 0, 47, 0, 50, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, + 134, 0, 0, 0, 72, 0, 70, 0,146, 0, 77, 0, 74, 0, 84, 0,244, 0, + 0, 0, 67, 0, 64, 0, 16, 0, 83, 0, 76, 0, 33, 0,172, 0, 0, 0, + 54, 0,104, 0,146, 0, 74, 0, 79, 0, 78, 0,232, 0, 0, 0, 41, 0, + 96, 0,150, 0, 83, 0, 89, 0, 68, 0,240, 0, 0, 0, 38, 0, 82, 0, + 55, 0, 72, 0, 69, 0, 89, 0,106, 0, 0, 0, 33, 0, 87, 0,130, 0, + 69, 0, 74, 0, 66, 0, 52, 0, 0, 0, 24, 0, 32, 0,116, 0, 68, 0, + 82, 0, 74, 0,115, 0, 0, 0, 20, 0,104, 0,146, 0, 80, 0, 74, 0, + 83, 0, 4, 0, 0, 0, 19, 0, 5, 0, 35, 0, 71, 0, 78, 0, 80, 0, + 223, 0, 0, 0, 17, 0,137, 0, 19, 0, 84, 0, 73, 0, 77, 0,104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0,255, 0, + 194, 0, 19, 0, 80, 0, 0, 0, 0, 0,158, 0,158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 61, 0, 61, 0, 61, 0, 61, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,180,105,105, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE trog_bootstrap = { + 32768, + { + 149, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 13, 0, 1, 0, 16, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,156, 0, 1, 0, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0, 17, 0, 1, 0, 9, 0, 65, 0, 82, 0, 0, 0, 0, 0, + 74, 0, 75, 0, 77, 0,128, 0, 1, 0, 8, 0,114, 0, 24, 0, 0, 0, + 0, 0, 67, 0, 80, 0, 71, 0,146, 0, 1, 0, 7, 0, 25, 0, 32, 0, + 0, 0, 0, 0, 76, 0, 84, 0, 68, 0,218, 0, 1, 0, 6, 0, 25, 0, + 25, 0, 0, 0, 0, 0, 71, 0, 87, 0, 83, 0,213, 0, 1, 0, 5, 0, + 17, 0, 25, 0, 0, 0, 0, 0, 77, 0, 32, 0, 76, 0, 22, 0, 1, 0, + 4, 0,118, 0, 48, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0,119, 0, + 1, 0, 3, 0,144, 0, 32, 0, 0, 0, 0, 0, 65, 0, 76, 0, 32, 0, + 158, 0, 1, 0, 3, 0, 32, 0, 16, 0, 0, 0, 0, 0, 76, 0, 74, 0, + 82, 0,227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 10, 0,255, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 10, 0,255, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0,184, 0,255, 0, + 255, 0,244, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 11, 0,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0,174, 0, 84, 0, 82, 0, + 79, 0, 71, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, 52, 0, 32, 0, 45, 0, 32, 0, + 51, 0, 47, 0, 49, 0, 49, 0, 47, 0, 57, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,149, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0, 13, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 74, 0, 69, 0, 72, 0, 37, 0, 1, 0,151, 0,131, 0, 33, 0, 0, 0, + 0, 0, 71, 0, 78, 0, 80, 0,222, 0, 1, 0,146, 0, 21, 0, 36, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 82, 0, 1, 0,137, 0, 98, 0, + 23, 0, 0, 0, 0, 0, 67, 0, 83, 0, 68, 0, 34, 0, 1, 0,131, 0, + 112, 0,119, 0, 0, 0, 0, 0, 74, 0, 65, 0, 72, 0,193, 0, 1, 0, + 128, 0, 1, 0,118, 0, 0, 0, 0, 0, 71, 0, 71, 0, 70, 0, 51, 0, + 1, 0,117, 0, 88, 0, 33, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 49, 0, 1, 0,105, 0, 16, 0, 2, 0, 0, 0, 0, 0, 82, 0, 65, 0, + 89, 0,151, 0, 1, 0, 97, 0,114, 0, 22, 0, 0, 0, 0, 0, 69, 0, + 80, 0, 74, 0, 54, 0, 1, 0, 82, 0,137, 0, 89, 0, 0, 0, 0, 0, + 76, 0, 69, 0, 68, 0,245, 0, 1, 0, 68, 0, 33, 0, 39, 0, 0, 0, + 0, 0, 77, 0, 68, 0, 82, 0,143, 0, 1, 0, 53, 0,113, 0, 17, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,118, 0, 1, 0, 36, 0, 8, 0, + 71, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,177, 0, 1, 0, 23, 0, + 66, 0, 33, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,177, 0, 1, 0, + 18, 0, 50, 0,137, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0, 96, 0, + 1, 0, 17, 0, 17, 0, 17, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 218, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0, 14, 0, 1, 0, 9, 0, 2, 0, 19, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,232, 0, 1, 0, 9, 0, 2, 0, 18, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0, 34, 0, 1, 0, 9, 0, 2, 0, 17, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0, 16, 0, 1, 0, 9, 0, 2, 0, 16, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 2, 0, 1, 0, 9, 0, 2, 0, + 9, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0, 7, 0, 1, 0, 9, 0, + 2, 0, 8, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0, 37, 0, 1, 0, + 9, 0, 2, 0, 7, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0, 35, 0, + 1, 0, 9, 0, 2, 0, 6, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 252, 0, 1, 0, 9, 0, 2, 0, 5, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0, 1, 0, 1, 0, 9, 0, 2, 0, 4, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0, 6, 0, 1, 0, 9, 0, 2, 0, 3, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0, 39, 0, 1, 0, 9, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0, 20, 0, 1, 0, 9, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE trog3_bootstrap = { + 32768, + { + 149, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 13, 0, 1, 0, 16, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,156, 0, 1, 0, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0, 17, 0, 1, 0, 9, 0, 65, 0, 82, 0, 0, 0, 0, 0, + 74, 0, 75, 0, 77, 0,128, 0, 1, 0, 8, 0,114, 0, 24, 0, 0, 0, + 0, 0, 67, 0, 80, 0, 71, 0,146, 0, 1, 0, 7, 0, 25, 0, 32, 0, + 0, 0, 0, 0, 76, 0, 84, 0, 68, 0,218, 0, 1, 0, 6, 0, 25, 0, + 25, 0, 0, 0, 0, 0, 71, 0, 87, 0, 83, 0,213, 0, 1, 0, 5, 0, + 17, 0, 25, 0, 0, 0, 0, 0, 77, 0, 32, 0, 76, 0, 22, 0, 1, 0, + 4, 0,118, 0, 48, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0,119, 0, + 1, 0, 3, 0,144, 0, 32, 0, 0, 0, 0, 0, 65, 0, 76, 0, 32, 0, + 158, 0, 1, 0, 3, 0, 32, 0, 16, 0, 0, 0, 0, 0, 76, 0, 74, 0, + 82, 0,227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 17, 0,255, 0,238, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 17, 0,255, 0,238, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0,184, 0,255, 0, + 255, 0,244, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 11, 0,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0,169, 0, 84, 0, 82, 0, + 79, 0, 71, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 76, 0, 65, 0, 51, 0, 32, 0, 45, 0, 32, 0, + 50, 0, 47, 0, 49, 0, 52, 0, 47, 0, 57, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,149, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0, 13, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 74, 0, 69, 0, 72, 0, 37, 0, 1, 0,151, 0,131, 0, 33, 0, 0, 0, + 0, 0, 71, 0, 78, 0, 80, 0,222, 0, 1, 0,146, 0, 21, 0, 36, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 82, 0, 1, 0,137, 0, 98, 0, + 23, 0, 0, 0, 0, 0, 67, 0, 83, 0, 68, 0, 34, 0, 1, 0,131, 0, + 112, 0,119, 0, 0, 0, 0, 0, 74, 0, 65, 0, 72, 0,193, 0, 1, 0, + 128, 0, 1, 0,118, 0, 0, 0, 0, 0, 71, 0, 71, 0, 70, 0, 51, 0, + 1, 0,117, 0, 88, 0, 33, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 49, 0, 1, 0,105, 0, 16, 0, 2, 0, 0, 0, 0, 0, 82, 0, 65, 0, + 89, 0,151, 0, 1, 0, 97, 0,114, 0, 22, 0, 0, 0, 0, 0, 69, 0, + 80, 0, 74, 0, 54, 0, 1, 0, 82, 0,137, 0, 89, 0, 0, 0, 0, 0, + 76, 0, 69, 0, 68, 0,245, 0, 1, 0, 68, 0, 33, 0, 39, 0, 0, 0, + 0, 0, 77, 0, 68, 0, 82, 0,143, 0, 1, 0, 53, 0,113, 0, 17, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,118, 0, 1, 0, 36, 0, 8, 0, + 71, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,177, 0, 1, 0, 23, 0, + 66, 0, 33, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,177, 0, 1, 0, + 18, 0, 50, 0,137, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0, 96, 0, + 1, 0, 17, 0, 17, 0, 17, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 218, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0, 14, 0, 1, 0, 9, 0, 2, 0, 19, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,232, 0, 1, 0, 9, 0, 2, 0, 18, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0, 34, 0, 1, 0, 9, 0, 2, 0, 17, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0, 16, 0, 1, 0, 9, 0, 2, 0, 16, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 2, 0, 1, 0, 9, 0, 2, 0, + 9, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0, 7, 0, 1, 0, 9, 0, + 2, 0, 8, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0, 37, 0, 1, 0, + 9, 0, 2, 0, 7, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0, 35, 0, + 1, 0, 9, 0, 2, 0, 6, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 252, 0, 1, 0, 9, 0, 2, 0, 5, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0, 1, 0, 1, 0, 9, 0, 2, 0, 4, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0, 6, 0, 1, 0, 9, 0, 2, 0, 3, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0, 39, 0, 1, 0, 9, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0, 20, 0, 1, 0, 9, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } +}; + +const struct bin2cFILE trogp_bootstrap = { + 32768, + { + 37, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 125, 0, 0, 0, 16, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,157, 0, 0, 0, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0, 18, 0, 0, 0, 9, 0, 65, 0, 82, 0, 0, 0, 0, 0, + 74, 0, 75, 0, 77, 0,129, 0, 0, 0, 8, 0,114, 0, 24, 0, 0, 0, + 0, 0, 67, 0, 80, 0, 71, 0,147, 0, 0, 0, 7, 0, 25, 0, 32, 0, + 0, 0, 0, 0, 76, 0, 84, 0, 68, 0,219, 0, 0, 0, 6, 0, 25, 0, + 25, 0, 0, 0, 0, 0, 71, 0, 87, 0, 83, 0,214, 0, 0, 0, 5, 0, + 17, 0, 25, 0, 0, 0, 0, 0, 77, 0, 32, 0, 76, 0, 23, 0, 0, 0, + 4, 0,118, 0, 48, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0,120, 0, + 0, 0, 3, 0,144, 0, 32, 0, 0, 0, 0, 0, 65, 0, 76, 0, 32, 0, + 159, 0, 0, 0, 3, 0, 32, 0, 16, 0, 0, 0, 0, 0, 76, 0, 74, 0, + 82, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 8, 0,255, 0,247, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 8, 0,255, 0,247, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 1, 0, 84, 0, 82, 0, + 79, 0, 71, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 52, 0, 46, 0, 48, 0, 48, 0, 32, 0, 45, 0, + 32, 0, 55, 0, 47, 0, 50, 0, 55, 0, 47, 0, 57, 0, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 37, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0,125, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 74, 0, 69, 0, 72, 0, 38, 0, 0, 0,151, 0,131, 0, 33, 0, 0, 0, + 0, 0, 71, 0, 78, 0, 80, 0,223, 0, 0, 0,146, 0, 21, 0, 36, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 83, 0, 0, 0,137, 0, 98, 0, + 23, 0, 0, 0, 0, 0, 67, 0, 83, 0, 68, 0, 35, 0, 0, 0,131, 0, + 112, 0,119, 0, 0, 0, 0, 0, 74, 0, 65, 0, 72, 0,194, 0, 0, 0, + 128, 0, 1, 0,118, 0, 0, 0, 0, 0, 71, 0, 71, 0, 70, 0, 52, 0, + 0, 0,117, 0, 88, 0, 33, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 50, 0, 0, 0,105, 0, 16, 0, 2, 0, 0, 0, 0, 0, 82, 0, 65, 0, + 89, 0,152, 0, 0, 0, 97, 0,114, 0, 22, 0, 0, 0, 0, 0, 69, 0, + 80, 0, 74, 0, 55, 0, 0, 0, 82, 0,137, 0, 89, 0, 0, 0, 0, 0, + 76, 0, 69, 0, 68, 0,246, 0, 0, 0, 68, 0, 33, 0, 39, 0, 0, 0, + 0, 0, 77, 0, 68, 0, 82, 0,144, 0, 0, 0, 53, 0,113, 0, 17, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,119, 0, 0, 0, 36, 0, 8, 0, + 71, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,178, 0, 0, 0, 23, 0, + 66, 0, 33, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,178, 0, 0, 0, + 18, 0, 50, 0,137, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0, 97, 0, + 0, 0, 17, 0, 17, 0, 17, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 219, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0, 15, 0, 0, 0, 9, 0, 2, 0, 19, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,233, 0, 0, 0, 9, 0, 2, 0, 18, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0, 35, 0, 0, 0, 9, 0, 2, 0, 17, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0, 17, 0, 0, 0, 9, 0, 2, 0, 16, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 3, 0, 0, 0, 9, 0, 2, 0, + 9, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0, 8, 0, 0, 0, 9, 0, + 2, 0, 8, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0, 38, 0, 0, 0, + 9, 0, 2, 0, 7, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0, 36, 0, + 0, 0, 9, 0, 2, 0, 6, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 253, 0, 0, 0, 9, 0, 2, 0, 5, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0, 2, 0, 0, 0, 9, 0, 2, 0, 4, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0, 7, 0, 0, 0, 9, 0, 2, 0, 3, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0, 40, 0, 0, 0, 9, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0, 21, 0, 0, 0, 9, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0, 35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, - 68, 5, 82, 4, 74, 0, 1, 8,128, 0, 0, 5, 83, 4, 67, 4, 68, 0, - 1, 6, 96, 0, 0, 4, 76, 4, 69, 4, 68, 0, 1, 4, 64, 0, 0, 5, - 80, 4, 71, 4, 68, 0, 1, 2, 32, 0, 0, 4, 67, 5, 82, 4, 66, 0, - 1, 0, 0, 0, 0, 4, 77, 5, 82, 5, 83, 0, 0, 8,128, 0, 0, 4, - 75, 4, 74, 4, 70, 0, 0, 6, 96, 0, 0, 5, 84, 4, 77, 4, 72, 0, - 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - }, -}; - -const struct bin2cFILE defence_bootstrap = { - 256, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 7,112, 4, - 68, 5, 82, 4, 74, 0, 1, 8,131, 1, 21, 5, 83, 4, 65, 4, 77, 0, - 1, 5, 89, 2, 32, 4, 76, 4, 69, 4, 68, 0, 1, 4, 66, 8,133, 5, - 80, 4, 71, 4, 68, 0, 1, 2, 37, 2, 32, 4, 67, 5, 82, 4, 66, 0, - 1, 1, 16, 3, 53, 4, 77, 5, 82, 5, 83, 0, 0, 8,130, 6,101, 5, - 83, 5, 83, 5, 82, 0, 0, 6, 96, 1, 16, 5, 84, 4, 77, 4, 72, 0, - 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - }, -}; - -const struct bin2cFILE defender_bootstrap = { - 256, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 7,112, 4, - 68, 5, 82, 4, 74, 0, 1, 8,131, 1, 21, 5, 83, 4, 65, 4, 77, 0, - 1, 5, 89, 2, 32, 4, 76, 4, 69, 4, 68, 0, 1, 4, 66, 8,133, 5, - 80, 4, 71, 4, 68, 0, 1, 2, 37, 2, 32, 4, 67, 5, 82, 4, 66, 0, - 1, 1, 16, 3, 53, 4, 77, 5, 82, 5, 83, 0, 0, 8,130, 6,101, 5, - 83, 5, 83, 5, 82, 0, 0, 6, 96, 1, 16, 5, 84, 4, 77, 4, 72, 0, - 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 5, 1, 21, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - }, -}; - -/* used for defendg and defendw */ -const struct bin2cFILE defendg_bootstrap = { - 256, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 18, 7,112, 4, - 68, 5, 82, 4, 74, 0, 1, 8,131, 1, 21, 5, 83, 4, 65, 4, 77, 0, - 1, 5, 89, 2, 32, 4, 76, 4, 69, 4, 68, 0, 1, 4, 65, 8,133, 5, - 80, 4, 71, 4, 68, 0, 1, 2, 37, 2, 32, 4, 67, 5, 82, 4, 66, 0, - 1, 1, 16, 3, 53, 4, 77, 5, 82, 5, 83, 0, 0, 8,130, 6,101, 5, - 83, 5, 83, 5, 82, 0, 0, 6, 96, 1, 16, 5, 84, 4, 77, 4, 72, 0, - 0, 5, 90, 0, 1, 0, 0, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - }, -}; - -/* used for foodf and foodf2 */ -const struct bin2cFILE foodf_bootstrap = { - 512, - { - 7, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 15, 0, - 1, 0, 0, 0, 0, 0, 11, 0, 10, 0, 12, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 15, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -154,31 +75319,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 1, 0, 0, 0, 1, 0, 4, 0, - 10, 0, 4, 0, 4, 0, 9, 0, 1, 0, 0, 0, 0, 0, 2, 0, 7, 0, - 5, 0, 4, 0, 5, 0, 8, 0, 4, 0, 15, 0, 15, 0, 10, 0, 4, 0, - 2, 0, 4, 0, 2, 0, 5, 0, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 0, 0, - 0, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 15, 0, 0, 0, 0, 0, - }, -}; - -const struct bin2cFILE foodfc_bootstrap = { - 512, - { - 7, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 11, 0, 10, 0, 12, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 13, 0, 15, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -189,38 +75330,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 13, 0, 1, 0, 0, 0, 1, 0, 4, 0, - 10, 0, 4, 0, 4, 0, 9, 0, 1, 0, 0, 0, 0, 0, 2, 0, 7, 0, - 5, 0, 4, 0, 5, 0, 8, 0, 4, 0, 15, 0, 15, 0, 10, 0, 4, 0, - 2, 0, 4, 0, 2, 0, 5, 0, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 0, 0, - 0, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 15, 0, 0, 0, 0, 0, - }, -}; - -/* used for joust, joustr, and joustwr */ -const struct bin2cFILE joust_bootstrap = -{ - 1024, - { - 2, 32, 0, 5, 0, 1, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, 0, 0, - 0, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 1, 26, 1, 28, - 0, 15, 1, 29, 0, 15, 1, 24, 1, 30, 0, 15, 0, 14, 0, 10, 0, 12, - 2, 35, 3, 50, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 2, 33, 1, 19, - 1, 22, 1, 22, 1, 19, 0, 11, 1, 23, 1, 29, 0, 10, 0, 15, 1, 22, - 0, 15, 0, 13, 1, 30, 1, 28, 1, 25, 1, 24, 1, 19, 0, 13, 1, 29, - 0, 10, 1, 19, 1, 24, 0, 13, 2, 46, 2, 37, 2, 41, 5, 81, 5, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -230,62 +75340,455 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 10, 0, 10, - 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, - 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, - 0, 10, 0, 10, 42, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 1, 20, 1, 28, - 1, 24, 0, 0, 0, 2, 3, 51, 1, 16, 1, 26, 1, 16, 2, 36, 0, 0, - 0, 2, 2, 41, 1, 23, 1, 21, 1, 16, 1, 22, 0, 0, 0, 2, 2, 37, - 5, 82, 0, 13, 2, 33, 1, 21, 0, 0, 0, 2, 0, 5, 2, 34, 1, 20, - 0, 11, 1, 24, 0, 0, 0, 1, 7,118, 3, 53, 1, 23, 1, 28, 1, 29, - 0, 0, 0, 1, 6,101, 3, 53, 0, 0, 0, 0, 0, 0, 0, 0, - }, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + } }; -const struct bin2cFILE joust2_bootstrap = -{ - 1024, +const struct bin2cFILE trogpa6_bootstrap = { + 32768, { - 2, 37, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 1, 26, - 1, 28, 0, 15, 1, 29, 0, 15, 1, 24, 1, 30, 0, 15, 0, 14, 0, 10, - 0, 12, 2, 35, 3, 50, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 2, 33, - 1, 19, 1, 22, 1, 22, 1, 19, 0, 11, 1, 23, 1, 29, 0, 10, 0, 15, - 1, 22, 0, 15, 0, 13, 1, 30, 1, 28, 1, 25, 1, 24, 1, 19, 0, 13, - 1, 29, 0, 10, 1, 19, 1, 24, 0, 13, 2, 46, 2, 37, 2, 41, 5, 87, - 5, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 149, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, 78, 0, 80, 0, + 13, 0, 1, 0, 16, 0, 8, 0,101, 0, 0, 0, 0, 0, 71, 0, 78, 0, + 80, 0,156, 0, 1, 0, 16, 0, 1, 0, 5, 0, 0, 0, 0, 0, 74, 0, + 69, 0, 72, 0, 17, 0, 1, 0, 9, 0, 65, 0, 82, 0, 0, 0, 0, 0, + 74, 0, 75, 0, 77, 0,128, 0, 1, 0, 8, 0,114, 0, 24, 0, 0, 0, + 0, 0, 67, 0, 80, 0, 71, 0,146, 0, 1, 0, 7, 0, 25, 0, 32, 0, + 0, 0, 0, 0, 76, 0, 84, 0, 68, 0,218, 0, 1, 0, 6, 0, 25, 0, + 25, 0, 0, 0, 0, 0, 71, 0, 87, 0, 83, 0,213, 0, 1, 0, 5, 0, + 17, 0, 25, 0, 0, 0, 0, 0, 77, 0, 32, 0, 76, 0, 22, 0, 1, 0, + 4, 0,118, 0, 48, 0, 0, 0, 0, 0, 67, 0, 77, 0, 77, 0,119, 0, + 1, 0, 3, 0,144, 0, 32, 0, 0, 0, 0, 0, 65, 0, 76, 0, 32, 0, + 158, 0, 1, 0, 3, 0, 32, 0, 16, 0, 0, 0, 0, 0, 76, 0, 74, 0, + 82, 0,227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -295,84 +75798,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, - 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, - 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 42, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, - 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, - 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, - 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, - 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, - 0, 10, 98, 0, 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, - 0, 0, 4, 64, 0, 0, 0, 10, 0, 10, 0, 10, 98, 0, 0, 0, 4, 64, - 0, 0, 1, 20, 1, 28, 1, 24, 0, 0, 0, 4, 4, 66, 1, 16, 1, 20, - 1, 25, 0, 15, 0, 0, 0, 4, 3, 50, 1, 23, 1, 21, 2, 32, 0, 14, - 0, 0, 0, 4, 2, 41, 9,153, 2, 33, 0, 12, 0, 14, 0, 0, 0, 4, - 1, 16, 1, 17, 1, 23, 1, 22, 0, 10, 0, 0, 0, 4, 0, 5, 2, 35, - 0, 13, 0, 10, 1, 17, 0, 0, 0, 3, 9,153, 0, 9, 0, 0, - }, -}; - - - -const struct bin2cFILE mk2_bootstrap = { - 16384, -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 34, 0,255, 0,221, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 175, 0,255, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 4, 0,255, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -570,26 +75996,379 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 14, 0,255, 0,241, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 14, 0,255, 0,241, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, + 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 19, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 0,241, 0, 84, 0, 82, 0, + 79, 0, 71, 0, 32, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 80, 0, 65, 0, 54, 0, 45, 0, 80, 0, 65, 0, + 67, 0, 32, 0, 45, 0, 32, 0, 57, 0, 47, 0, 57, 0, 47, 0, 57, 0, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,216, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, - 73, 0, 79, 0, 78, 0, 32, 0, 51, 0, 46, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -683,22 +76462,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -923,6 +76686,41 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,149, 0, 18, 0, 33, 0, 69, 0, 0, 0, 0, 0, 71, 0, + 78, 0, 80, 0, 13, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 74, 0, 69, 0, 72, 0, 37, 0, 1, 0,151, 0,131, 0, 33, 0, 0, 0, + 0, 0, 71, 0, 78, 0, 80, 0,222, 0, 1, 0,146, 0, 21, 0, 36, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 82, 0, 1, 0,137, 0, 98, 0, + 23, 0, 0, 0, 0, 0, 67, 0, 83, 0, 68, 0, 34, 0, 1, 0,131, 0, + 112, 0,119, 0, 0, 0, 0, 0, 74, 0, 65, 0, 72, 0,193, 0, 1, 0, + 128, 0, 1, 0,118, 0, 0, 0, 0, 0, 71, 0, 71, 0, 70, 0, 51, 0, + 1, 0,117, 0, 88, 0, 33, 0, 0, 0, 0, 0, 82, 0, 74, 0, 67, 0, + 49, 0, 1, 0,105, 0, 16, 0, 2, 0, 0, 0, 0, 0, 82, 0, 65, 0, + 89, 0,151, 0, 1, 0, 97, 0,114, 0, 22, 0, 0, 0, 0, 0, 69, 0, + 80, 0, 74, 0, 54, 0, 1, 0, 82, 0,137, 0, 89, 0, 0, 0, 0, 0, + 76, 0, 69, 0, 68, 0,245, 0, 1, 0, 68, 0, 33, 0, 39, 0, 0, 0, + 0, 0, 77, 0, 68, 0, 82, 0,143, 0, 1, 0, 53, 0,113, 0, 17, 0, + 0, 0, 0, 0, 69, 0, 74, 0, 66, 0,118, 0, 1, 0, 36, 0, 8, 0, + 71, 0, 0, 0, 0, 0, 65, 0, 75, 0, 78, 0,177, 0, 1, 0, 23, 0, + 66, 0, 33, 0, 0, 0, 0, 0, 76, 0, 69, 0, 66, 0,177, 0, 1, 0, + 18, 0, 50, 0,137, 0, 0, 0, 0, 0, 67, 0, 76, 0, 66, 0, 96, 0, + 1, 0, 17, 0, 17, 0, 17, 0, 0, 0, 0, 0, 68, 0, 85, 0, 88, 0, + 218, 0, 1, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 68, 0, + 78, 0, 14, 0, 1, 0, 9, 0, 2, 0, 19, 0, 0, 0, 0, 0, 83, 0, + 83, 0, 82, 0,232, 0, 1, 0, 9, 0, 2, 0, 18, 0, 0, 0, 0, 0, + 77, 0, 82, 0, 32, 0, 34, 0, 1, 0, 9, 0, 2, 0, 17, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 71, 0, 16, 0, 1, 0, 9, 0, 2, 0, 16, 0, + 0, 0, 0, 0, 76, 0, 69, 0, 80, 0, 2, 0, 1, 0, 9, 0, 2, 0, + 9, 0, 0, 0, 0, 0, 77, 0, 68, 0, 82, 0, 7, 0, 1, 0, 9, 0, + 2, 0, 8, 0, 0, 0, 0, 0, 66, 0, 65, 0, 67, 0, 37, 0, 1, 0, + 9, 0, 2, 0, 7, 0, 0, 0, 0, 0, 87, 0, 32, 0, 82, 0, 35, 0, + 1, 0, 9, 0, 2, 0, 6, 0, 0, 0, 0, 0, 77, 0, 80, 0, 84, 0, + 252, 0, 1, 0, 9, 0, 2, 0, 5, 0, 0, 0, 0, 0, 83, 0, 85, 0, + 69, 0, 1, 0, 1, 0, 9, 0, 2, 0, 4, 0, 0, 0, 0, 0, 77, 0, + 79, 0, 77, 0, 6, 0, 1, 0, 9, 0, 2, 0, 3, 0, 0, 0, 0, 0, + 68, 0, 65, 0, 68, 0, 39, 0, 1, 0, 9, 0, 2, 0, 2, 0, 0, 0, + 0, 0, 83, 0, 70, 0, 68, 0, 20, 0, 1, 0, 9, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 65, 0, 75, 0, 68, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1252,12 +77050,558 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, } }; -const struct bin2cFILE mk2chal_bootstrap = { - 16384, +const struct bin2cFILE umk3_bootstrap = { + 49152, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, @@ -1280,16 +77624,34 @@ 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 25, 0,255, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 65, 0,255, 0,190, 0, 0, 0, 0, 0, 0, 0, + 65, 0,255, 0,190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1469,10 +77831,27 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0,237, 0,176, 0, 0, 0, 0, 0, + 237, 0,176, 0, 0, 0, 0, 0,237, 0,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,250, 0, 18, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 49, 0, 46, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1487,26 +77866,13 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,224, 0, 67, 0, 72, 0, 65, 0, 76, 0, 76, 0, - 69, 0, 78, 0, 71, 0, 69, 0, 82, 0, 46, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1578,6 +77944,22 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,243, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 22, 0, 5, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 15, 0, 13, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 4, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,242, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,241, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,240, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 20, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, 8, 0, 13, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 22, 0, 14, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 22, 0, 14, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 8, 0,241, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 19, 0, 1, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1600,22 +77982,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 0, 3, 0, 0, 0, 19, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,120, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2169,44 +78535,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - } -}; - -const struct bin2cFILE mk2r14_bootstrap = { - 16384, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 2, 0,255, 0,253, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 26, 0,255, 0,229, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2404,26 +78733,13 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,218, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, - 73, 0, 79, 0, 78, 0, 32, 0, 49, 0, 46, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2517,22 +78833,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3086,44 +79386,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - } -}; - -const struct bin2cFILE mk2r21_bootstrap = { - 16384, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 18, 0,255, 0,237, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3321,26 +79584,13 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,222, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, - 73, 0, 79, 0, 78, 0, 32, 0, 50, 0, 46, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3434,22 +79684,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4003,12 +80237,108 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; -const struct bin2cFILE mk2r32_bootstrap = { - 16384, +const struct bin2cFILE umk3p_bootstrap = { + 49152, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, @@ -4031,16 +80361,34 @@ 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 19, 0,255, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 1, 0,255, 0,254, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0,105, 0,255, 0,150, 0, 0, 0, 0, 0, 0, 0, + 105, 0,255, 0,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4220,45 +80568,52 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,254, 0,218, 0, 32, 0, 77, 0, 79, 0, 82, 0, 84, 0, 65, 0, + 76, 0, 75, 0, 79, 0, 77, 0, 66, 0, 65, 0, 84, 0, 80, 0, 76, 0, + 85, 0, 83, 0, 46, 0, 67, 0, 79, 0, 77, 0, 32, 0, 66, 0, 69, 0, + 84, 0, 65, 0, 32, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,212, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, - 73, 0, 79, 0, 78, 0, 32, 0, 51, 0, 46, 0, 50, 0, 32, 0, 40, 0, - 69, 0, 85, 0, 82, 0, 79, 0, 80, 0, 69, 0, 65, 0, 78, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4326,6 +80681,22 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,243, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 18, 0, 19, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 19, 0, 12, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 0, 11, 0, 23, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 17, 0, 4, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, 15, 0,241, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 20, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, 8, 0, 13, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 22, 0, 14, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 22, 0, 14, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 8, 0,241, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 19, 0, 1, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 73, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4351,22 +80722,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4920,44 +81275,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - } -}; - -const struct bin2cFILE mk2r42_bootstrap = { - 16384, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 22, 0,255, 0,233, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5155,26 +81473,13 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,213, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, - 73, 0, 79, 0, 78, 0, 32, 0, 52, 0, 46, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5268,22 +81573,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5837,12 +82126,956 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; -const struct bin2cFILE mk2r91_bootstrap = { - 16384, +const struct bin2cFILE umk3r11_bootstrap = { + 49152, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, @@ -5865,16 +83098,34 @@ 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 24, 0,255, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, - 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 41, 0,255, 0,214, 0, 0, 0, 0, 0, 0, 0, + 41, 0,255, 0,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6054,10 +83305,27 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0,237, 0,176, 0, 0, 0, 0, 0, + 237, 0,176, 0, 0, 0, 0, 0,237, 0,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,250, 0, 20, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, 73, 0, + 79, 0, 78, 0, 32, 0, 49, 0, 46, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6072,26 +83340,13 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10, 0,103, 0, 57, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,253, 0,227, 0, 82, 0, 69, 0, 86, 0, 73, 0, 83, 0, - 73, 0, 79, 0, 78, 0, 32, 0, 57, 0, 46, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6163,6 +83418,22 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,243, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 22, 0, 5, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 15, 0, 13, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 4, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,242, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,241, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 0, 10, 0,240, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 20, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 0, 8, 0, 13, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 22, 0, 14, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 22, 0, 14, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 8, 0,241, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 19, 0, 1, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6185,22 +83456,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 17, 0, 11, 0, 10, 0, 0, 0,118, 0, - 56, 0, 51, 0, 0, 0, 12, 0, 3, 0, 15, 0, 9, 0, 0, 0, 0, 0, - 156, 0, 49, 0, 0, 0, 6, 0, 13, 0, 15, 0, 9, 0, 0, 0,144, 0, - 38, 0, 48, 0, 0, 0, 1, 0, 24, 0, 11, 0, 8, 0, 0, 0,162, 0, - 102, 0, 46, 0, 0, 0, 1, 0, 1, 0, 1, 0, 8, 0, 0, 0, 72, 0, - 168, 0, 45, 0, 0, 0, 5, 0, 4, 0, 11, 0, 8, 0, 0, 0, 0, 0, - 53, 0, 12, 0, 0, 0, 18, 0, 0, 0, 13, 0, 8, 0, 0, 0, 96, 0, - 174, 0, 10, 0, 0, 0, 7, 0, 0, 0, 8, 0, 7, 0, 0, 0,192, 0, - 39, 0, 9, 0, 0, 0, 18, 0, 5, 0, 19, 0, 7, 0, 0, 0, 32, 0, - 161, 0, 7, 0, 0, 0, 1, 0, 1, 0, 3, 0, 7, 0, 0, 0,128, 0, - 26, 0, 6, 0, 0, 0, 22, 0, 8, 0, 19, 0, 7, 0, 0, 0,224, 0, - 147, 0, 4, 0, 0, 0, 7, 0, 14, 0, 20, 0, 6, 0, 0, 0, 64, 0, - 13, 0, 3, 0, 0, 0, 19, 0, 19, 0, 19, 0, 6, 0, 0, 0,160, 0, - 134, 0, 1, 0, 0, 0, 17, 0, 24, 0, 20, 0, 6, 0, 0, 0,144, 0, - 95, 0, 1, 0, 0, 0, 19, 0, 22, 0, 6, 0, 6, 0, 0, 0,128, 0, - 56, 0, 1, 0, 0, 0,148, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6754,21 +84009,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - } -}; - -const struct bin2cFILE narc_bootstrap = { - 32768, - { - 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,166, 0, 0, 0, - 32, 0, 1, 0, 39, 0, 68, 0, 82, 0, 74, 0,215, 0, 0, 0, 16, 0, - 8, 0,101, 0, 71, 0, 78, 0, 80, 0,157, 0, 0, 0, 8, 0, 33, 0, - 100, 0, 84, 0, 82, 0, 65, 0,139, 0, 0, 0, 5, 0,114, 0, 24, 0, - 76, 0, 69, 0, 68, 0,155, 0, 0, 0, 5, 0, 18, 0, 85, 0, 77, 0, - 76, 0, 32, 0,218, 0, 0, 0, 4, 0, 18, 0, 80, 0, 76, 0, 69, 0, - 68, 0,196, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0, - 223, 0, 0, 0, 3, 0, 25, 0, 25, 0, 66, 0, 65, 0, 82, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7217,38 +84457,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 1, 0,255, 0, - 254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,135, 0,255, 0, - 255, 0,236, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7330,18 +84538,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 19, 0, - 136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7350,10 +84546,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 29, 0, 78, 0, 65, 0, 82, 0, 67, 0, 32, 0, 82, 0, 69, 0, 86, 0, - 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 55, 0, 46, 0, 48, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7671,34 +84863,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, - 166, 0, 1, 0, 0, 0, 0, 0, 1, 0, 74, 0, 69, 0, 72, 0, 38, 0, - 0, 0,146, 0, 82, 0, 33, 0, 74, 0, 82, 0, 78, 0, 16, 0, 0, 0, - 136, 0,136, 0,136, 0, 84, 0, 74, 0, 69, 0,132, 0, 0, 0,121, 0, - 130, 0, 24, 0, 76, 0, 73, 0, 78, 0, 9, 0, 0, 0,119, 0,119, 0, - 119, 0, 77, 0, 76, 0, 32, 0,225, 0, 0, 0,105, 0,105, 0,150, 0, - 71, 0, 87, 0, 83, 0,166, 0, 0, 0,102, 0,102, 0,102, 0, 65, 0, - 76, 0, 32, 0, 32, 0, 0, 0,101, 0, 16, 0, 8, 0, 66, 0, 76, 0, - 83, 0,161, 0, 0, 0, 87, 0, 2, 0, 24, 0, 74, 0, 82, 0, 72, 0, - 170, 0, 0, 0, 85, 0, 85, 0, 85, 0, 74, 0, 32, 0, 80, 0, 70, 0, - 0, 0, 85, 0, 1, 0, 39, 0, 68, 0, 84, 0, 87, 0,147, 0, 0, 0, - 81, 0, 17, 0, 21, 0, 68, 0, 32, 0, 80, 0,212, 0, 0, 0, 72, 0, - 72, 0, 71, 0, 82, 0, 65, 0, 89, 0, 60, 0, 0, 0, 68, 0, 68, 0, - 68, 0, 87, 0, 66, 0, 68, 0, 86, 0, 0, 0, 65, 0,130, 0,128, 0, - 75, 0, 74, 0, 70, 0,225, 0, 0, 0, 57, 0, 32, 0, 53, 0, 78, 0, - 68, 0, 78, 0,145, 0, 0, 0, 56, 0, 16, 0,144, 0, 74, 0, 32, 0, - 66, 0,123, 0, 0, 0, 54, 0, 2, 0, 19, 0, 83, 0, 83, 0, 82, 0, - 188, 0, 0, 0, 51, 0, 9, 0, 96, 0, 77, 0, 82, 0, 32, 0,164, 0, - 0, 0, 50, 0,102, 0,102, 0, 66, 0, 73, 0, 71, 0, 47, 0, 0, 0, - 49, 0, 0, 0, 85, 0, 76, 0, 69, 0, 80, 0,152, 0, 0, 0, 48, 0, - 117, 0,101, 0, 77, 0, 68, 0, 82, 0, 18, 0, 0, 0, 41, 0,114, 0, - 86, 0, 66, 0, 65, 0, 67, 0, 72, 0, 0, 0, 40, 0,112, 0,112, 0, - 87, 0, 32, 0, 82, 0, 46, 0, 0, 0, 39, 0, 96, 0, 96, 0, 77, 0, - 80, 0, 84, 0, 39, 0, 0, 0, 38, 0, 85, 0, 32, 0, 83, 0, 85, 0, - 69, 0,119, 0, 0, 0, 37, 0, 68, 0,128, 0, 77, 0, 79, 0, 77, 0, - 45, 0, 0, 0, 36, 0, 68, 0,121, 0, 68, 0, 65, 0, 68, 0, 85, 0, - 0, 0, 35, 0, 68, 0,120, 0, 83, 0, 70, 0, 68, 0, 67, 0, 0, 0, - 34, 0, 68, 0,119, 0, 65, 0, 75, 0, 68, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8581,34 +85745,193 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; -const struct bin2cFILE narc3_bootstrap = { - 32768, +const struct bin2cFILE viostorm_bootstrap = { + 128, { - 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0,166, 0, 0, 0, - 32, 0, 1, 0, 39, 0, 68, 0, 82, 0, 74, 0,215, 0, 0, 0, 16, 0, - 8, 0,101, 0, 71, 0, 78, 0, 80, 0,157, 0, 0, 0, 8, 0, 33, 0, - 100, 0, 84, 0, 82, 0, 65, 0,139, 0, 0, 0, 5, 0,114, 0, 24, 0, - 76, 0, 69, 0, 68, 0,155, 0, 0, 0, 5, 0, 18, 0, 85, 0, 77, 0, - 76, 0, 32, 0,218, 0, 0, 0, 4, 0, 18, 0, 80, 0, 76, 0, 69, 0, - 68, 0,196, 0, 0, 0, 3, 0, 25, 0, 32, 0, 70, 0, 79, 0, 79, 0, - 223, 0, 0, 0, 3, 0, 25, 0, 25, 0, 66, 0, 65, 0, 82, 0,245, 0, + 3,254,252, 1,145,104, 69, 65, 66, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 0, 1, 0, 2, 0, 0, 3, 0, 0, 0, 44, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE viostrma_bootstrap = { + 128, + { + 3,251,252, 4,145,104, 65, 65, 67, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 0, 1, 0, 2, 0, 0, 3, 0, 0, 0, 44, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE viostrmj_bootstrap = { + 128, + { + 4, 9,251,246,145,104, 74, 65, 67, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 0, 1, 0, 2, 3, 4, 3, 0, 0, 0, 44, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, + } +}; + +const struct bin2cFILE wwfmania_bootstrap = { + 49152, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0,255, 0,246, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 9, 0,255, 0,246, 0, 0, 0, 0, 0, 0, 0, 9, 0,255, 0,246, 0, + 0, 0, 0, 0, 0, 0, 9, 0,255, 0,246, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 7, 0,255, 0,248, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0,174, 0,255, 0, 81, 0, + 0, 0, 0, 0, 0, 0, 80, 0,255, 0,175, 0, 0, 0, 0, 0, 0, 0, + 82, 0,255, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 9, 0,255, 0,246, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 1, 0,255, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 9, 0,255, 0,246, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,255, 0,255, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8647,6 +85970,22 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8655,6 +85994,11 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,254, 0,218, 0, 87, 0, 82, 0, 69, 0, 83, 0, 84, 0, + 76, 0, 69, 0, 77, 0, 65, 0, 78, 0, 73, 0, 65, 0, 32, 0, 82, 0, + 69, 0, 86, 0, 32, 0, 49, 0, 46, 0, 51, 0, 48, 0, 32, 0, 56, 0, + 47, 0, 49, 0, 48, 0, 47, 0, 57, 0, 53, 0, 0, 0, 32, 0, 69, 0, + 143, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -8743,20 +86087,146 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, 65, 0, + 46, 0, 23, 0, 0, 0, 0, 0, 0, 0, 17, 0, 77, 0, 74, 0, 84, 0, + 65, 0, 46, 0,148, 0, 0, 0, 0, 0, 0, 0, 16, 0, 83, 0, 65, 0, + 76, 0, 66, 0, 46, 0,159, 0, 0, 0, 0, 0, 0, 0, 9, 0, 74, 0, + 77, 0, 83, 0, 67, 0, 46, 0,155, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 74, 0, 89, 0, 84, 0, 68, 0, 46, 0,141, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 77, 0, 74, 0, 76, 0, 69, 0, 46, 0,161, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 74, 0, 65, 0, 75, 0, 70, 0, 46, 0,173, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 79, 0, 69, 0, 71, 0, 65, 0, 46, 0,174, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 83, 0, 76, 0, 32, 0, 65, 0, 46, 0, + 202, 0, 0, 0, 0, 0, 0, 0, 7, 0, 77, 0, 68, 0, 80, 0, 65, 0, + 46, 0,168, 0, 0, 0, 0, 0, 0, 0, 6, 0, 71, 0, 66, 0, 83, 0, + 65, 0, 46, 0,174, 0, 0, 0, 0, 0, 0, 0, 6, 0, 68, 0, 74, 0, + 84, 0, 65, 0, 46, 0,168, 0, 0, 0, 0, 0, 0, 0, 6, 0, 69, 0, + 80, 0, 74, 0, 65, 0, 46, 0,171, 0, 0, 0, 0, 0, 0, 0, 5, 0, + 66, 0, 73, 0, 70, 0, 65, 0, 46, 0,186, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 85, 0, 78, 0, 75, 0, 65, 0, 46, 0,157, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 85, 0, 84, 0, 66, 0, 65, 0, 46, 0,160, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 67, 0, 82, 0, 76, 0, 65, 0, 46, 0,171, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 84, 0, 68, 0, 71, 0, 65, 0, 46, 0, + 173, 0, 0, 0, 0, 0, 0, 0, 4, 0, 65, 0, 83, 0, 66, 0, 65, 0, + 46, 0,182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,112, 0, 0, 0, 69, 0, 80, 0, 74, 0, 65, 0, 46, 0, 65, 0, + 0, 0, 0, 0, 96, 0, 0, 0, 77, 0, 74, 0, 84, 0, 73, 0, 46, 0, + 61, 0, 0, 0, 0, 0, 97, 0, 0, 0, 83, 0, 65, 0, 76, 0, 73, 0, + 46, 0, 71, 0, 0, 0, 0, 0, 98, 0, 0, 0, 74, 0, 77, 0, 83, 0, + 71, 0, 46, 0, 62, 0, 0, 0, 0, 0, 99, 0, 0, 0, 74, 0, 89, 0, + 84, 0, 70, 0, 46, 0, 49, 0, 0, 0, 0, 0,100, 0, 0, 0, 74, 0, + 65, 0, 75, 0, 69, 0, 46, 0, 82, 0, 0, 0, 0, 0,101, 0, 0, 0, + 79, 0, 69, 0, 71, 0, 68, 0, 46, 0, 77, 0, 0, 0, 0, 0,102, 0, + 0, 0, 77, 0, 74, 0, 76, 0, 67, 0, 46, 0, 69, 0, 0, 0, 0, 0, + 103, 0, 0, 0, 85, 0, 84, 0, 66, 0, 66, 0, 46, 0, 61, 0, 0, 0, + 0, 0,104, 0, 0, 0, 65, 0, 83, 0, 66, 0, 65, 0, 46, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, 69, 0, + 69, 0, 80, 0, 74, 0, 65, 0, 66, 0, 3, 0, 0, 0, 1, 0, 17, 0, + 1, 0, 77, 0, 73, 0, 75, 0, 69, 0, 32, 0,166, 0, 0, 0, 0, 0, + 16, 0, 1, 0, 74, 0, 65, 0, 77, 0, 73, 0, 84, 0,121, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 84, 0, 69, 0, 65, 0, 76, 0, 32, 0,184, 0, + 0, 0, 0, 0, 16, 0, 0, 0, 68, 0, 73, 0, 78, 0, 75, 0, 32, 0, + 169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 74, 0, 65, 0, 75, 0, 69, 0, + 32, 0,195, 0, 0, 0, 16, 0, 0, 0, 0, 0, 68, 0, 82, 0, 74, 0, + 32, 0, 32, 0,207, 0, 1, 0, 0, 0, 0, 0, 0, 0, 67, 0, 72, 0, + 73, 0, 67, 0, 75, 0,156, 0, 16, 0, 0, 0, 0, 0, 0, 0, 83, 0, + 72, 0, 65, 0, 87, 0, 78, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 18, 0, 33, 0, + 69, 0, 69, 0, 80, 0, 74, 0, 65, 0, 66, 0, 3, 0, 0, 0, 0, 0, + 1, 0, 17, 0, 77, 0, 65, 0, 82, 0, 75, 0, 32, 0,162, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 83, 0, 65, 0, 76, 0, 32, 0, 32, 0,221, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 74, 0, 65, 0, 83, 0, 79, 0, 78, 0, + 131, 0, 0, 0, 0, 0, 16, 0, 0, 0, 76, 0, 73, 0, 67, 0, 75, 0, + 32, 0,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 74, 0, 65, 0, 75, 0, + 69, 0, 32, 0,195, 0, 0, 0, 16, 0, 0, 0, 0, 0, 68, 0, 73, 0, + 69, 0, 83, 0, 76, 0,126, 0, 1, 0, 0, 0, 0, 0, 0, 0, 70, 0, + 85, 0, 74, 0, 73, 0, 32, 0,176, 0, 16, 0, 0, 0, 0, 0, 0, 0, + 83, 0, 72, 0, 65, 0, 87, 0, 78, 0,110, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 66, 0, 73, 0, 70, 0, 70, 0, 32, 0,199, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 18, 0, + 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, 65, 0, 66, 0, 3, 0, 0, 0, + 0, 0,144, 0, 0, 0, 66, 0, 79, 0, 79, 0, 78, 0, 32, 0, 33, 0, + 0, 0, 0, 0,144, 0, 0, 0, 83, 0, 65, 0, 76, 0, 32, 0, 32, 0, + 79, 0, 0, 0, 0, 0,149, 0, 0, 0, 69, 0, 82, 0, 77, 0, 65, 0, + 67, 0, 2, 0, 0, 0, 0, 0,149, 0, 0, 0, 75, 0, 65, 0, 78, 0, + 79, 0, 32, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0, 0, 83, 0, 79, 0, + 78, 0, 89, 0, 65, 0,116, 0, 0, 0, 1, 0, 0, 0, 0, 0, 71, 0, + 69, 0, 78, 0, 69, 0, 32, 0,191, 0, 0, 0, 1, 0, 5, 0, 0, 0, + 77, 0, 73, 0, 75, 0, 69, 0, 32, 0,179, 0, 0, 0, 1, 0, 5, 0, + 0, 0, 83, 0, 72, 0, 65, 0, 87, 0, 78, 0,120, 0, 0, 0, 1, 0, + 16, 0, 0, 0, 74, 0, 65, 0, 83, 0, 79, 0, 78, 0,115, 0, 0, 0, + 1, 0, 16, 0, 0, 0, 74, 0, 79, 0, 83, 0, 72, 0, 32, 0,154, 0, + 0, 0, 1, 0, 21, 0, 0, 0, 74, 0, 79, 0, 72, 0, 78, 0, 32, 0, + 154, 0, 0, 0, 1, 0, 21, 0, 0, 0, 74, 0, 65, 0, 75, 0, 69, 0, + 32, 0,174, 0, 0, 0, 1, 0, 32, 0, 0, 0, 74, 0, 79, 0, 69, 0, + 32, 0, 32, 0,192, 0, 0, 0, 1, 0, 32, 0, 0, 0, 69, 0, 68, 0, + 87, 0, 73, 0, 78, 0,103, 0, 0, 0, 1, 0, 37, 0, 0, 0, 66, 0, + 73, 0, 76, 0, 76, 0, 32, 0,150, 0, 0, 0, 1, 0, 37, 0, 0, 0, + 77, 0, 65, 0, 82, 0, 75, 0, 80, 0, 94, 0, 0, 0, 1, 0, 48, 0, + 0, 0, 83, 0, 84, 0, 69, 0, 86, 0, 69, 0, 71, 0, 0, 0, 1, 0, + 48, 0, 0, 0, 84, 0, 79, 0, 78, 0, 89, 0, 32, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -9044,38 +86514,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, - 0, 0, 0, 0,255, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,136, 0,255, 0, - 255, 0,236, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -9157,18 +86595,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 19, 0, - 136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, - 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -9177,10 +86603,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, - 29, 0, 78, 0, 65, 0, 82, 0, 67, 0, 32, 0, 82, 0, 69, 0, 86, 0, - 73, 0, 83, 0, 73, 0, 79, 0, 78, 0, 32, 0, 51, 0, 46, 0, 50, 0, - 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -9498,34 +86920,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 18, 0, 33, 0, 69, 0, 69, 0, 80, 0, 74, 0, - 166, 0, 1, 0, 0, 0, 0, 0, 1, 0, 74, 0, 69, 0, 72, 0, 38, 0, - 0, 0,146, 0, 82, 0, 33, 0, 74, 0, 82, 0, 78, 0, 16, 0, 0, 0, - 136, 0,136, 0,136, 0, 84, 0, 74, 0, 69, 0,132, 0, 0, 0,121, 0, - 130, 0, 24, 0, 76, 0, 73, 0, 78, 0, 9, 0, 0, 0,119, 0,119, 0, - 119, 0, 77, 0, 76, 0, 32, 0,225, 0, 0, 0,105, 0,105, 0,150, 0, - 71, 0, 87, 0, 83, 0,166, 0, 0, 0,102, 0,102, 0,102, 0, 65, 0, - 76, 0, 32, 0, 32, 0, 0, 0,101, 0, 16, 0, 8, 0, 66, 0, 76, 0, - 83, 0,161, 0, 0, 0, 87, 0, 2, 0, 24, 0, 74, 0, 82, 0, 72, 0, - 170, 0, 0, 0, 85, 0, 85, 0, 85, 0, 74, 0, 32, 0, 80, 0, 70, 0, - 0, 0, 85, 0, 1, 0, 39, 0, 68, 0, 84, 0, 87, 0,147, 0, 0, 0, - 81, 0, 17, 0, 21, 0, 68, 0, 32, 0, 80, 0,212, 0, 0, 0, 72, 0, - 72, 0, 71, 0, 82, 0, 65, 0, 89, 0, 60, 0, 0, 0, 68, 0, 68, 0, - 68, 0, 87, 0, 66, 0, 68, 0, 86, 0, 0, 0, 65, 0,130, 0,128, 0, - 75, 0, 74, 0, 70, 0,225, 0, 0, 0, 57, 0, 32, 0, 53, 0, 78, 0, - 68, 0, 78, 0,145, 0, 0, 0, 56, 0, 16, 0,144, 0, 74, 0, 32, 0, - 66, 0,123, 0, 0, 0, 54, 0, 2, 0, 19, 0, 83, 0, 83, 0, 82, 0, - 188, 0, 0, 0, 51, 0, 9, 0, 96, 0, 77, 0, 82, 0, 32, 0,164, 0, - 0, 0, 50, 0,102, 0,102, 0, 66, 0, 73, 0, 71, 0, 47, 0, 0, 0, - 49, 0, 0, 0, 85, 0, 76, 0, 69, 0, 80, 0,152, 0, 0, 0, 48, 0, - 117, 0,101, 0, 77, 0, 68, 0, 82, 0, 18, 0, 0, 0, 41, 0,114, 0, - 86, 0, 66, 0, 65, 0, 67, 0, 72, 0, 0, 0, 40, 0,112, 0,112, 0, - 87, 0, 32, 0, 82, 0, 46, 0, 0, 0, 39, 0, 96, 0, 96, 0, 77, 0, - 80, 0, 84, 0, 39, 0, 0, 0, 38, 0, 85, 0, 32, 0, 83, 0, 85, 0, - 69, 0,119, 0, 0, 0, 37, 0, 68, 0,128, 0, 77, 0, 79, 0, 77, 0, - 45, 0, 0, 0, 36, 0, 68, 0,121, 0, 68, 0, 65, 0, 68, 0, 85, 0, - 0, 0, 35, 0, 68, 0,120, 0, 83, 0, 70, 0, 68, 0, 67, 0, 0, 0, - 34, 0, 68, 0,119, 0, 65, 0, 75, 0, 68, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10408,15 +87802,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - } -}; - - -/* used for qix, qix2, qixa, qixb */ -const struct bin2cFILE qix_bootstrap = { - 1024, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10454,12 +87839,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 254, 0, 0, 0, 0, 80,130, 38,128, 64,211, 47,200,167, 0, 85,170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, - 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, - 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, - 3, 0, 0, 81, 73, 88, 3, 0, 0, 81, 73, 88, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10468,28 +87848,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 4, 1, 1, 0, 0, 1, 4, 1, 2, 4, - 0, 1, 4, 1, 2, 0, 0, 6, 0, 1, 1, 0, 0, 1, 22, 6, 2, 0, - 0, 1, 0, 4, 1, 0, 0, 1, 0, 2, 1, 0, 0, 1, 0, 2, 2, 0, - 0, 0, 4, 1, 4, 0, 0, 1, 0, 6, 2, 0, 0, 1, 1, 4, 1, 1, - 0, 0, 3, 16, 3,117, 55, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - } -}; - - -const struct bin2cFILE robotron_bootstrap = -{ - 1024, - { - 2, 37, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 80, 5, 82, 4, 69, 5, 83, - 4, 69, 4, 78, 5, 84, 4, 69, 4, 68, 2, 32, 4, 66, 5, 89, 2, 32, - 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 87, 4, 73, - 4, 76, 4, 76, 4, 73, 4, 65, 4, 77, 5, 83, 2, 32, 4, 69, 4, 76, - 4, 69, 4, 67, 5, 84, 5, 82, 4, 79, 4, 78, 4, 73, 4, 67, 5, 83, - 2, 32, 4, 73, 4, 78, 4, 67, 3, 61, 2, 47, 2, 40, 5, 82, 14,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10499,61 +87857,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, - 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, - 3, 58, 3, 58, 3, 58, 3, 58, 3, 58,124, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 4, 68, 5, 82, - 4, 74, 0, 0, 0, 5, 2, 33, 2, 39, 4, 76, 4, 69, 4, 68, 0, 0, - 0, 5, 0, 2, 1, 24, 4, 69, 5, 80, 4, 74, 0, 0, 0, 4, 1, 18, - 5, 85, 4, 74, 4, 69, 5, 82, 0, 0, 0, 4, 1, 18, 5, 80, 4, 75, - 4, 73, 4, 68, 0, 0, 0, 3, 1, 25, 2, 32, 4, 77, 4, 76, 4, 71, - 0, 0, 0, 3, 1, 25, 1, 25, 5, 83, 5, 83, 5, 82, 0, 0, 0, 2, - 6,102, 4, 69, 5, 85, 4, 78, 4, 65, 0, 0, 0, 2, 6,102, 3, 53, - 4, 74, 5, 82, 5, 83, 0, 0, 0, 2, 5, 82, 5, 80, 4, 67, 4, 74, - 4, 77, 0, 0, 0, 2, 4, 65, 1, 16, 0, 0, 0, 0, 0, 0, - }, -}; - -const struct bin2cFILE robotryo_bootstrap = -{ - 1024, -{ - 2, 37, 0, 3, 0, 3, 0, 1, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, - 0, 1, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 80, 5, 82, 4, 69, 5, 83, - 4, 69, 4, 78, 5, 84, 4, 69, 4, 68, 2, 32, 4, 66, 5, 89, 2, 32, - 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 2, 32, 5, 87, 4, 73, - 4, 76, 4, 76, 4, 73, 4, 65, 4, 77, 5, 83, 2, 32, 4, 69, 4, 76, - 4, 69, 4, 67, 5, 84, 5, 82, 4, 79, 4, 78, 4, 73, 4, 67, 5, 83, - 2, 32, 4, 73, 4, 78, 4, 67, 3, 61, 2, 47, 2, 40, 5, 84, 14,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10563,83 +87866,16 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, - 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, - 3, 58, 3, 58, 3, 58, 3, 58, 3, 58,124, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, - 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, - 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, - 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, - 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58, - 184, 0, 0, 1, 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, - 0, 0, 0, 0, 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, - 3, 58, 3, 58, 3, 58,184, 0, 0, 1, 0, 0, 0, 0, 4, 68, 5, 82, - 4, 74, 0, 0, 0, 5, 2, 33, 2, 39, 4, 76, 4, 69, 4, 68, 0, 0, - 0, 5, 0, 2, 1, 24, 4, 69, 5, 80, 4, 74, 0, 0, 0, 4, 1, 18, - 5, 85, 4, 74, 4, 69, 5, 82, 0, 0, 0, 4, 1, 18, 5, 80, 4, 75, - 4, 73, 4, 68, 0, 0, 0, 3, 1, 25, 2, 32, 4, 77, 4, 76, 4, 71, - 0, 0, 0, 3, 1, 25, 1, 25, 5, 83, 5, 83, 5, 82, 0, 0, 0, 2, - 6,102, 4, 69, 5, 85, 4, 78, 4, 65, 0, 0, 0, 2, 6,102, 3, 53, - 4, 74, 5, 82, 5, 83, 0, 0, 0, 2, 5, 82, 5, 80, 4, 67, 4, 74, - 4, 77, 0, 0, 0, 2, 4, 65, 1, 16, 0, 0, 0, 0, 0, 0, - }, -}; - -const struct bin2cFILE rungun_bootstrap = { - 128, - { - 4, 20,251,235,146, 71, 69, 65, 65, 0, 21, 3, 7, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 0, 21, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, - } -}; - -const struct bin2cFILE rungunu_bootstrap = { - 128, - { - 4, 38,251,217,146, 71, 85, 65, 66, 0, 16, 3, 7, 3, 0, 0, 0, 0, - 0, 7, 7, 0, 7, 26, 1, 16, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, - } -}; - -const struct bin2cFILE sinistar_bootstrap = { - 1024, - { - 3, 48, 3, 48, 0, 3, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10683,7 +87919,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10693,16 +87928,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - } -}; - -const struct bin2cFILE sinista1_bootstrap = { - 1024, - { - 3, 48, 3, 48, 0, 3, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 81, 5, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10746,7 +87971,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10756,16 +87980,6 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - } -}; - -const struct bin2cFILE sinista2_bootstrap = { - 1024, - { - 3, 48, 3, 48, 0, 3, 0, 5, 0, 1, 0, 1, 0, 3, 0, 1, 0, 4, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -10819,7 +88033,560 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } };
View file
libretro-mame2003-0~git20200805.tar.xz/src/bootstrap.h -> libretro-mame2003-0~git20210529.tar.xz/src/bootstrap.h
Changed
@@ -13,66 +13,82 @@ #include "fileio.h" extern const struct bin2cFILE avengrgs_bootstrap; - extern const struct bin2cFILE bubblem_bootstrap; - +extern const struct bin2cFILE carnevil_bootstrap; extern const struct bin2cFILE charlien_bootstrap; - +extern const struct bin2cFILE crusnu21_bootstrap; +extern const struct bin2cFILE crusnu40_bootstrap; +extern const struct bin2cFILE crusnusa_bootstrap; +extern const struct bin2cFILE ddsom_bootstrap; +extern const struct bin2cFILE ddsoma_bootstrap; +extern const struct bin2cFILE ddsomj_bootstrap; +extern const struct bin2cFILE ddsomu_bootstrap; extern const struct bin2cFILE defcmnd_bootstrap; - extern const struct bin2cFILE defence_bootstrap; - extern const struct bin2cFILE defender_bootstrap; - -/* used for defendg and defendw */ extern const struct bin2cFILE defendg_bootstrap; - -/* used for foodf and foodf2 */ extern const struct bin2cFILE foodf_bootstrap; - extern const struct bin2cFILE foodfc_bootstrap; - -/* used for joust, joustr, and joustwr */ +extern const struct bin2cFILE gaiapols_bootstrap; +extern const struct bin2cFILE hiimpact_bootstrap; extern const struct bin2cFILE joust_bootstrap; - extern const struct bin2cFILE joust2_bootstrap; - +extern const struct bin2cFILE luckywld_bootstrap; extern const struct bin2cFILE mk2_bootstrap; - extern const struct bin2cFILE mk2chal_bootstrap; - +extern const struct bin2cFILE mk2p_bootstrap; extern const struct bin2cFILE mk2r14_bootstrap; - extern const struct bin2cFILE mk2r21_bootstrap; - extern const struct bin2cFILE mk2r32_bootstrap; - extern const struct bin2cFILE mk2r42_bootstrap; - extern const struct bin2cFILE mk2r91_bootstrap; - +extern const struct bin2cFILE mmaulers_bootstrap; extern const struct bin2cFILE narc_bootstrap; - extern const struct bin2cFILE narc3_bootstrap; - -/* used for qix, qix2, qixa, qixb */ +extern const struct bin2cFILE nbahangt_bootstrap; +extern const struct bin2cFILE nbajam_bootstrap; +extern const struct bin2cFILE nbajamr2_bootstrap; +extern const struct bin2cFILE nbajamt1_bootstrap; +extern const struct bin2cFILE nbajamt2_bootstrap; +extern const struct bin2cFILE nbajamt3_bootstrap; +extern const struct bin2cFILE nbajamte_bootstrap; +extern const struct bin2cFILE nbamaxht_bootstrap; +extern const struct bin2cFILE nslashers_bootstrap; +extern const struct bin2cFILE offroadc_bootstrap; +extern const struct bin2cFILE openice_bootstrap; extern const struct bin2cFILE qix_bootstrap; - +extern const struct bin2cFILE revx_bootstrap; +extern const struct bin2cFILE rmpgwt11_bootstrap; +extern const struct bin2cFILE rmpgwt_bootstrap; extern const struct bin2cFILE robotron_bootstrap; - extern const struct bin2cFILE robotryo_bootstrap; - extern const struct bin2cFILE rungun_bootstrap; - extern const struct bin2cFILE rungunu_bootstrap; - +extern const struct bin2cFILE shimpacp_bootstrap; +extern const struct bin2cFILE shimpact_bootstrap; extern const struct bin2cFILE sinistar_bootstrap; - extern const struct bin2cFILE sinista1_bootstrap; - extern const struct bin2cFILE sinista2_bootstrap; - -/* used for zookeep, zookeep2, and zookeep3 */ +extern const struct bin2cFILE smashtv_bootstrap; +extern const struct bin2cFILE smashtv4_bootstrap; +extern const struct bin2cFILE smashtv5_bootstrap; +extern const struct bin2cFILE smashtv6_bootstrap; +extern const struct bin2cFILE term2_bootstrap; +extern const struct bin2cFILE term2la1_bootstrap; +extern const struct bin2cFILE term2la2_bootstrap; +extern const struct bin2cFILE totcarn_bootstrap; +extern const struct bin2cFILE totcarnp_bootstrap; +extern const struct bin2cFILE trog_bootstrap; +extern const struct bin2cFILE trog3_bootstrap; +extern const struct bin2cFILE trogp_bootstrap; +extern const struct bin2cFILE trogpa6_bootstrap; +extern const struct bin2cFILE umk3_bootstrap; +extern const struct bin2cFILE umk3p_bootstrap; +extern const struct bin2cFILE umk3r11_bootstrap; +extern const struct bin2cFILE viostorm_bootstrap; +extern const struct bin2cFILE viostrma_bootstrap; +extern const struct bin2cFILE viostrmj_bootstrap; +extern const struct bin2cFILE wwfmania_bootstrap; extern const struct bin2cFILE zookeep_bootstrap; -#endif /* BOOTSTRAP_H */ \ No newline at end of file +#endif /* BOOTSTRAP_H */
View file
libretro-mame2003-0~git20200805.tar.xz/src/common.c -> libretro-mame2003-0~git20210529.tar.xz/src/common.c
Changed
@@ -15,14 +15,32 @@ #include "log.h" //#define LOG_LOAD - const char* ost_drivers[] = { "outrun", "outruna", "outrunb","toutrun","toutruna", \ - "mk", "mkr4", "mkprot9", "mkla1", "mkla2", "mkla3", "mkla4", \ - "nbajam", "nbajamr2", "nbajamte", "nbajamt12", "nbajamt2", "nbajamt3", \ - "ffight", "ffightu", "ffightj", "ffightj1", \ - "ddragon", "ddragonu", "ddragonw", "ddragonb", \ - "moonwalk", "moonwlka", "moonwlkb", 0 - }; +char *chd_error_text[] = +{ + "CHDERR_NONE", + "CHDERR_NO_INTERFACE", + "CHDERR_OUT_OF_MEMORY", + "CHDERR_INVALID_FILE", + "CHDERR_INVALID_PARAMETER", + "CHDERR_INVALID_DATA", + "CHDERR_FILE_NOT_FOUND", + "CHDERR_REQUIRES_PARENT", + "CHDERR_FILE_NOT_WRITEABLE", + "CHDERR_READ_ERROR", + "CHDERR_WRITE_ERROR", + "CHDERR_CODEC_ERROR", + "CHDERR_INVALID_PARENT", + "CHDERR_HUNK_OUT_OF_RANGE", + "CHDERR_DECOMPRESSION_ERROR", + "CHDERR_COMPRESSION_ERROR", + "CHDERR_CANT_CREATE_FILE", + "CHDERR_CANT_VERIFY", + "CHDERR_NOT_SUPPORTED", + "CHDERR_METADATA_NOT_FOUND", + "CHDERR_INVALID_METADATA_SIZE", + "CHDERR_UNSUPPORTED_VERSION" +}; /*************************************************************************** Constants ***************************************************************************/ @@ -214,7 +232,7 @@ /* read the core header and make sure it's a proper file */ offset += mame_fread(f, buf, 4); - + if (offset < 4) return NULL; @@ -301,13 +319,13 @@ // For small samples, lets force them to pre load into memory. if(length <= GAME_SAMPLE_LARGE) b_data = 1; - + /* allocate the game sample */ if(b_data == 1) result = auto_malloc(sizeof(struct GameSample) + length); else result = malloc(sizeof(struct GameSample)); - + if (result == NULL) return NULL; @@ -355,10 +373,10 @@ // For small samples, lets force them to pre load into memory. if (f_length <= GAME_SAMPLE_LARGE) b_data = 1; - + flac_file.length = f_length; flac_file.position = 0; - flac_file.decoded_size = 0; + flac_file.decoded_size = 0; // Allocate space for the data. flac_file.rawdata = malloc(f_length); @@ -390,7 +408,7 @@ } // only Mono supported - if (flac_file.channels != 1) { + if (flac_file.channels != 1) { free(flac_file.rawdata); FLAC__stream_decoder_delete(decoder); return NULL; @@ -411,7 +429,7 @@ strcpy(result->gamename, gamename); strcpy(result->filename, filename); result->filetype = filetype; - + result->smpfreq = flac_file.sample_rate; result->length = flac_file.total_samples * (flac_file.bits_per_sample / 8); result->resolution = flac_file.bits_per_sample; @@ -419,7 +437,7 @@ if (b_data == 1) { flac_file.write_data = result->data; - + if (FLAC__stream_decoder_process_until_end_of_stream (decoder) != FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM) { free(flac_file.rawdata); FLAC__stream_decoder_delete(decoder); @@ -447,7 +465,8 @@ return NULL; } -// Handles freeing previous played sample from memory. Helps with the low memory devices which load large sample files. +/* Handles freeing previous played sample from memory. Helps with the low memory devices which load large sample files. */ + void readsample(struct GameSample *SampleInfo, int channel, struct GameSamples *SamplesData, int load) { mame_file *f; @@ -475,8 +494,8 @@ } /*------------------------------------------------- - readsamples - load all samples --------------------------------------------------*/ + readsamples() load all samples + -------------------------------------------------*/ struct GameSamples *readsamples(const char **samplenames,const char *basename) /* V.V - avoids samples duplication */ @@ -512,7 +531,7 @@ mame_file *f; int f_type = 0; int f_skip = 0; - + if (samplenames[i+skipfirst][0]) { // Try opening FLAC samples first. @@ -528,7 +547,7 @@ { f_type = 1; f_skip = 0; - + if ((f = mame_fopen(basename,samplenames[i+skipfirst],FILETYPE_SAMPLE,0)) == 0) if (skipfirst) { f = mame_fopen(samplenames[0]+1,samplenames[i+skipfirst],FILETYPE_SAMPLE,0); @@ -542,7 +561,7 @@ { // Open FLAC. if(f_type == 0) { - if (f_skip == 1) + if (f_skip == 1) samples->sample[i] = read_wav_sample(f, samplenames[0]+1, samplenames[i+skipfirst], FILETYPE_SAMPLE_FLAC, 0); else samples->sample[i] = read_wav_sample(f, basename, samplenames[i+skipfirst], FILETYPE_SAMPLE_FLAC, 0); @@ -553,7 +572,7 @@ else samples->sample[i] = read_wav_sample(f, basename, samplenames[i+skipfirst], FILETYPE_SAMPLE, 0); } - + mame_fclose(f); } else if (samples->sample[i] == NULL) @@ -1149,7 +1168,7 @@ while(!BIOSENTRY_ISEND(bios)) { char bios_number[3]; - + if(!strcmp(bios_number, options.bios)) bios_no = bios->value; @@ -1171,8 +1190,8 @@ bios++; } if(string_is_empty(options.bios)) - log_cb(RETRO_LOG_INFO, LOGPRE "No matching BIOS found. Using default system BIOS."); - + log_cb(RETRO_LOG_INFO, LOGPRE "No matching BIOS found. Using default system BIOS."); + } return bios_no; @@ -1874,7 +1893,7 @@ if (chd_get_last_error() == CHDERR_UNSUPPORTED_VERSION) log_cb(RETRO_LOG_ERROR, LOGPRE "%-12s UNSUPPORTED CHD VERSION\n", filename); else - log_cb(RETRO_LOG_ERROR, LOGPRE "%-12s: CAN'T CREATE DIFF FILE\n", filename); + log_cb(RETRO_LOG_ERROR, LOGPRE "%-12s: CAN'T CREATE DIFF FILE Error code %s\n", filename, chd_error_text[err]); romdata->errors++; romp++; continue; @@ -1888,7 +1907,7 @@ if (chd_get_last_error() == CHDERR_UNSUPPORTED_VERSION) log_cb(RETRO_LOG_ERROR, LOGPRE "%-12s UNSUPPORTED CHD VERSION\n", filename); else - log_cb(RETRO_LOG_ERROR, LOGPRE "%-12s: CAN'T OPEN DIFF FILE\n", filename); + log_cb(RETRO_LOG_ERROR, LOGPRE "%-12s: CAN'T OPEN DIFF FILE Error code %s\n", filename, chd_error_text[err]); romdata->errors++; romp++; continue;
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/arm/arm.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/arm/arm.c
Changed
@@ -240,19 +240,19 @@ /***************************************************************************/ -static INLINE void cpu_write32( int addr, data32_t data ) +INLINE void cpu_write32( int addr, data32_t data ) { /* Unaligned writes are treated as normal writes */ cpu_writemem26ledw_dword(addr&ADDRESS_MASK,data); if (ARM_DEBUG_CORE && addr&3) logerror("%08x: Unaligned write %08x\n",R15,addr); } -static INLINE void cpu_write8( int addr, data8_t data ) +INLINE void cpu_write8( int addr, data8_t data ) { cpu_writemem26ledw(addr,data); } -static INLINE data32_t cpu_read32( int addr ) +INLINE data32_t cpu_read32( int addr ) { data32_t result = cpu_readmem26ledw_dword(addr&ADDRESS_MASK); @@ -261,28 +261,28 @@ if (ARM_DEBUG_CORE && addr&1) logerror("%08x: Unaligned byte read %08x\n",R15,addr); - if ((addr&3)==3) + if ((addr&3)==1) return ((result&0x000000ff)<<24)|((result&0xffffff00)>> 8); if ((addr&3)==2) return ((result&0x0000ffff)<<16)|((result&0xffff0000)>>16); - if ((addr&3)==1) + if ((addr&3)==3) return ((result&0x00ffffff)<< 8)|((result&0xff000000)>>24); } return result; } -static INLINE data8_t cpu_read8( int addr ) +INLINE data8_t cpu_read8( int addr ) { return cpu_readmem26ledw(addr); } -static INLINE data32_t GetRegister( int rIndex ) +INLINE data32_t GetRegister( int rIndex ) { return arm.sArmRegister[sRegisterTable[MODE][rIndex]]; } -static INLINE void SetRegister( int rIndex, data32_t value ) +INLINE void SetRegister( int rIndex, data32_t value ) { arm.sArmRegister[sRegisterTable[MODE][rIndex]] = value; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/mips/dismips.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/mips/dismips.c
Changed
@@ -206,7 +206,7 @@ fclose( f ); return 3; } - printf( "_start = $%08x\n\n", m_psxexe_header.pc0 ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "_start = $%08x\n\n", m_psxexe_header.pc0 ); if( offset == 0 ) { offset = m_psxexe_header.t_addr; @@ -244,18 +244,18 @@ { i = DasmMIPS( buf, pc + offset ); - printf( "%08x: ", pc + offset ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: ", pc + offset ); for( j = 0; j < i ;j++ ) { - printf( "%02x ", filebuf[ ( pc & ~3 ) + order[ pc & 3 ] ] ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%02x ", filebuf[ ( pc & ~3 ) + order[ pc & 3 ] ] ); pc++; } while( j < 10 ) { - printf( " " ); + log_cb(RETRO_LOG_DEBUG, LOGPRE " " ); j++; } - printf( "%s\n", buf ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%s\n", buf ); } free (filebuf); return 0;
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/mips/mips3.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/mips/mips3.c
Changed
@@ -160,6 +160,8 @@ #define SR mips3.cpr[0][COP0_Status] #define CAUSE mips3.cpr[0][COP0_Cause] +#define GET_FCC(n) ((mips3.ccr[1][31] >> fcc_shift[n]) & 1) +#define SET_FCC(n,v) (mips3.ccr[1][31] = (mips3.ccr[1][31] & ~(1 << fcc_shift[n])) | ((v) << fcc_shift[n])) /*################################################################################################### @@ -192,7 +194,7 @@ /* COP registers */ UINT64 cpr[4][32]; UINT64 ccr[4][32]; - UINT8 cf[4][8]; + UINT8 cf[4]; /* internal stuff */ UINT32 ppc; @@ -257,6 +259,8 @@ static void writemem32bedw_double(offs_t offset, UINT64 data); static void writemem32ledw_double(offs_t offset, UINT64 data); +static UINT8 fcc_shift[8] = { 23, 25, 26, 27, 28, 29, 30, 31 }; + /*################################################################################################### @@ -351,7 +355,7 @@ useful for tracking interrupts if ((CAUSE & 0x7f) == 0) - logerror("Took interrupt -- Cause = %08X, PC = %08X\n", (UINT32)CAUSE, mips3.pc); + log_cb(RETRO_LOG_DEBUG, LOGPRE "Took interrupt -- Cause = %08X, PC = %08X\n", (UINT32)CAUSE, mips3.pc); */ /* swap to the new space */ @@ -375,7 +379,7 @@ static void check_irqs(void) { - if ((CAUSE & SR & 0xff00) && (SR & SR_IE) && !(SR & SR_EXL) && !(SR & SR_ERL)) + if ((CAUSE & SR & 0xfc00) && (SR & SR_IE) && !(SR & SR_EXL) && !(SR & SR_ERL)) generate_exception(EXCEPTION_INTERRUPT, 0); } @@ -553,38 +557,44 @@ ** COP0 (SYSTEM) EXECUTION HANDLING **#################################################################################################*/ -static UINT32 update_cycle_counting(void) +static void update_cycle_counting(void) { - UINT32 count = (activecpu_gettotalcycles64() - mips3.count_zero_time) / 2; - UINT32 compare = mips3.cpr[0][COP0_Compare]; - UINT32 cyclesleft = compare - count; - double newtime; - -//printf("Update: count=%08X compare=%08X delta=%08X SR=%08X time=%f\n", count, compare, cyclesleft, (UINT32)SR, TIME_IN_CYCLES(((UINT64)cyclesleft * 2), cpu_getactivecpu())); - /* modify the timer to go off */ - newtime = TIME_IN_CYCLES(((UINT64)cyclesleft * 2), cpu_getactivecpu()); - if (SR & 0x8000) - timer_adjust(mips3.compare_int_timer, newtime, cpu_getactivecpu(), 0); + if ((SR & 0x8000) && mips3.cpr[0][COP0_Compare] != 0xffffffff) + { + UINT32 count = (activecpu_gettotalcycles64() - mips3.count_zero_time) / 2; + UINT32 compare = mips3.cpr[0][COP0_Compare]; + UINT32 cyclesleft = compare - count; + double newtime = TIME_IN_CYCLES(((UINT64)cyclesleft * 2), cpu_getactivecpu()); + + /* due to accuracy issues, don't bother setting timers unless they're for less than 100msec */ + if (newtime < TIME_IN_MSEC(100)) + timer_adjust(mips3.compare_int_timer, newtime, cpu_getactivecpu(), 0); + } else timer_adjust(mips3.compare_int_timer, TIME_NEVER, cpu_getactivecpu(), 0); - return count; } static INLINE UINT64 get_cop0_reg(int idx) { if (idx == COP0_Count) { - /* it doesn't really take 100 cycles to read this register, but it helps speed */ + /* it doesn't really take 25 cycles to read this register, but it helps speed */ /* up loops that hammer on it */ - mips3_icount -= 100; + if (mips3_icount >= 25) + mips3_icount -= 25; + else + mips3_icount = 0; return (UINT32)((activecpu_gettotalcycles64() - mips3.count_zero_time) / 2); } else if (idx == COP0_Cause) { - /* it doesn't really take 100 cycles to read this register, but it helps speed */ + /* it doesn't really take 25 cycles to read this register, but it helps speed */ /* up loops that hammer on it */ - mips3_icount -= 100; + if (mips3_icount >= 25) + mips3_icount -= 25; + else + mips3_icount = 0; } return mips3.cpr[0][idx]; } @@ -595,8 +605,16 @@ { case COP0_Cause: CAUSE = (CAUSE & 0xfc00) | (val & ~0xfc00); - /* update interrupts -- software ints can occur this way */ - check_irqs(); + if (CAUSE & 0x300) + { + /* if we're in a delay slot, propogate the target PC before generating the exception */ + if (mips3.nextpc != ~0) + { + mips3.pc = mips3.nextpc; + mips3.nextpc = ~0; + } + generate_exception(EXCEPTION_INTERRUPT, 0); + } break; case COP0_Status: @@ -680,8 +698,8 @@ case 0x08: /* BC */ switch (RTREG) { - case 0x00: /* BCzF */ if (!mips3.cf[0][0]) ADDPC(SIMMVAL); break; - case 0x01: /* BCzF */ if (mips3.cf[0][0]) ADDPC(SIMMVAL); break; + case 0x00: /* BCzF */ if (!mips3.cf[0]) ADDPC(SIMMVAL); break; + case 0x01: /* BCzF */ if (mips3.cf[0]) ADDPC(SIMMVAL); break; case 0x02: /* BCzFL */ invalid_instruction(op); break; case 0x03: /* BCzTL */ invalid_instruction(op); break; default: invalid_instruction(op); break; @@ -710,7 +728,7 @@ case 0x06: /* TLBWR */ logtlbentry(); break; case 0x08: /* TLBP */ break; case 0x10: /* RFE */ invalid_instruction(op); break; - case 0x18: /* ERET */ logerror("ERET\n"); mips3.pc = mips3.cpr[0][COP0_EPC]; SR &= ~SR_EXL; check_irqs(); break; + case 0x18: /* ERET */ log_cb(RETRO_LOG_DEBUG, LOGPRE "ERET\n"); mips3.pc = mips3.cpr[0][COP0_EPC]; SR &= ~SR_EXL; check_irqs(); break; default: invalid_instruction(op); break; } break; @@ -764,10 +782,10 @@ case 0x08: /* BC */ switch ((op >> 16) & 3) { - case 0x00: /* BCzF */ if (!mips3.cf[1][(op >> 18) & 7]) ADDPC(SIMMVAL); break; - case 0x01: /* BCzT */ if (mips3.cf[1][(op >> 18) & 7]) ADDPC(SIMMVAL); break; - case 0x02: /* BCzFL */ if (!mips3.cf[1][(op >> 18) & 7]) ADDPC(SIMMVAL); else mips3.pc += 4; break; - case 0x03: /* BCzTL */ if (mips3.cf[1][(op >> 18) & 7]) ADDPC(SIMMVAL); else mips3.pc += 4; break; + case 0x00: /* BCzF */ if (!GET_FCC((op >> 18) & 7)) ADDPC(SIMMVAL); break; + case 0x01: /* BCzT */ if (GET_FCC((op >> 18) & 7)) ADDPC(SIMMVAL); break; + case 0x02: /* BCzFL */ if (!GET_FCC((op >> 18) & 7)) ADDPC(SIMMVAL); else mips3.pc += 4; break; + case 0x03: /* BCzTL */ if (GET_FCC((op >> 18) & 7)) ADDPC(SIMMVAL); else mips3.pc += 4; break; } break; default: @@ -946,7 +964,7 @@ break; case 0x11: /* R5000 */ - if (mips3.cf[1][(op >> 18) & 7] == ((op >> 16) & 1)) + if (GET_FCC((op >> 18) & 7) == ((op >> 16) & 1)) { if (IS_SINGLE(op)) /* MOVT/F.S */ FDVALS = FSVALS; @@ -1030,65 +1048,65 @@ case 0x30: case 0x38: if (IS_SINGLE(op)) /* C.F.S */ - mips3.cf[1][(op >> 8) & 7] = 0; + SET_FCC((op >> 8) & 7, 0); else /* C.F.D */ - mips3.cf[1][(op >> 8) & 7] = 0; + SET_FCC((op >> 8) & 7, 0); break; case 0x31: case 0x39: if (IS_SINGLE(op)) /* C.UN.S */ - mips3.cf[1][(op >> 8) & 7] = 0; + SET_FCC((op >> 8) & 7, 0); else /* C.UN.D */ - mips3.cf[1][(op >> 8) & 7] = 0; + SET_FCC((op >> 8) & 7, 0); break; case 0x32: case 0x3a: if (IS_SINGLE(op)) /* C.EQ.S */ - mips3.cf[1][(op >> 8) & 7] = (FSVALS == FTVALS); + SET_FCC((op >> 8) & 7, (FSVALS == FTVALS)); else /* C.EQ.D */ - mips3.cf[1][(op >> 8) & 7] = (FSVALD == FTVALD); + SET_FCC((op >> 8) & 7, (FSVALD == FTVALD)); break; case 0x33: case 0x3b: if (IS_SINGLE(op)) /* C.UEQ.S */ - mips3.cf[1][(op >> 8) & 7] = (FSVALS == FTVALS); + SET_FCC((op >> 8) & 7, (FSVALS == FTVALS)); else /* C.UEQ.D */ - mips3.cf[1][(op >> 8) & 7] = (FSVALD == FTVALD); + SET_FCC((op >> 8) & 7, (FSVALD == FTVALD)); break; case 0x34: case 0x3c: if (IS_SINGLE(op)) /* C.OLT.S */ - mips3.cf[1][(op >> 8) & 7] = (FSVALS < FTVALS); + SET_FCC((op >> 8) & 7, (FSVALS < FTVALS)); else /* C.OLT.D */ - mips3.cf[1][(op >> 8) & 7] = (FSVALD < FTVALD); + SET_FCC((op >> 8) & 7, (FSVALD < FTVALD)); break; case 0x35: case 0x3d: if (IS_SINGLE(op)) /* C.ULT.S */ - mips3.cf[1][(op >> 8) & 7] = (FSVALS < FTVALS); + SET_FCC((op >> 8) & 7, (FSVALS < FTVALS)); else /* C.ULT.D */ - mips3.cf[1][(op >> 8) & 7] = (FSVALD < FTVALD); + SET_FCC((op >> 8) & 7, (FSVALD < FTVALD)); break; case 0x36: case 0x3e: if (IS_SINGLE(op)) /* C.OLE.S */ - mips3.cf[1][(op >> 8) & 7] = (FSVALS <= FTVALS); + SET_FCC((op >> 8) & 7, (FSVALS <= FTVALS)); else /* C.OLE.D */ - mips3.cf[1][(op >> 8) & 7] = (FSVALD <= FTVALD); + SET_FCC((op >> 8) & 7, (FSVALD <= FTVALD)); break; case 0x37: case 0x3f: if (IS_SINGLE(op)) /* C.ULE.S */ - mips3.cf[1][(op >> 8) & 7] = (FSVALS <= FTVALS); + SET_FCC((op >> 8) & 7, (FSVALS <= FTVALS)); else /* C.ULE.D */ - mips3.cf[1][(op >> 8) & 7] = (FSVALD <= FTVALD); + SET_FCC((op >> 8) & 7, (FSVALD <= FTVALD)); break; default: @@ -1254,8 +1272,6 @@ int mips3_execute(int cycles) { -//printf("mips3_execute (PC=%08X)\n", mips3.pc); - /* count cycles and interrupt cycles */ mips3_icount = cycles; mips3_icount -= mips3.interrupt_cycles; @@ -1266,6 +1282,7 @@ else change_pc32bedw(mips3.pc); + /* check for IRQs */ check_irqs(); @@ -1303,7 +1320,7 @@ switch (op & 63) { case 0x00: /* SLL */ if (RDREG) RDVAL64 = (INT32)(RTVAL32 << SHIFT); break; - case 0x01: /* MOVF - R5000*/if (RDREG && mips3.cf[1][(op >> 18) & 7] == ((op >> 16) & 1)) RDVAL64 = RSVAL64; break; + case 0x01: /* MOVF - R5000*/if (RDREG && GET_FCC((op >> 18) & 7) == ((op >> 16) & 1)) RDVAL64 = RSVAL64; break; case 0x02: /* SRL */ if (RDREG) RDVAL64 = (INT32)(RTVAL32 >> SHIFT); break; case 0x03: /* SRA */ if (RDREG) RDVAL64 = (INT32)RTVAL32 >> SHIFT; break; case 0x04: /* SLLV */ if (RDREG) RDVAL64 = (INT32)(RTVAL32 << (RSVAL32 & 31)); break; @@ -1327,11 +1344,13 @@ temp64 = (INT64)(INT32)RSVAL32 * (INT64)(INT32)RTVAL32; LOVAL64 = (INT32)temp64; HIVAL64 = (INT32)(temp64 >> 32); + mips3_icount -= 3; break; case 0x19: /* MULTU */ temp64 = (UINT64)RSVAL32 * (UINT64)RTVAL32; LOVAL64 = (INT32)temp64; HIVAL64 = (INT32)(temp64 >> 32); + mips3_icount -= 3; break; case 0x1a: /* DIV */ if (RTVAL32) @@ -1339,6 +1358,7 @@ LOVAL64 = (INT32)((INT32)RSVAL32 / (INT32)RTVAL32); HIVAL64 = (INT32)((INT32)RSVAL32 % (INT32)RTVAL32); } + mips3_icount -= 35; break; case 0x1b: /* DIVU */ if (RTVAL32) @@ -1346,16 +1366,19 @@ LOVAL64 = (INT32)(RSVAL32 / RTVAL32); HIVAL64 = (INT32)(RSVAL32 % RTVAL32); } + mips3_icount -= 35; break; case 0x1c: /* DMULT */ temp64 = (INT64)RSVAL64 * (INT64)RTVAL64; LOVAL64 = temp64; HIVAL64 = (INT64)temp64 >> 63; + mips3_icount -= 7; break; case 0x1d: /* DMULTU */ temp64 = (UINT64)RSVAL64 * (UINT64)RTVAL64; LOVAL64 = temp64; HIVAL64 = 0; + mips3_icount -= 7; break; case 0x1e: /* DDIV */ if (RTVAL64) @@ -1363,6 +1386,7 @@ LOVAL64 = (INT64)RSVAL64 / (INT64)RTVAL64; HIVAL64 = (INT64)RSVAL64 % (INT64)RTVAL64; } + mips3_icount -= 67; break; case 0x1f: /* DDIVU */ if (RTVAL64) @@ -1370,6 +1394,7 @@ LOVAL64 = RSVAL64 / RTVAL64; HIVAL64 = RSVAL64 % RTVAL64; } + mips3_icount -= 67; break; case 0x20: /* ADD */ if (ENABLE_OVERFLOWS && RSVAL32 > ~RTVAL32) generate_exception(EXCEPTION_OVERFLOW, 1); @@ -1482,19 +1507,19 @@ case 0x2d: /* SDR */ (*mips3.sdr)(op); break; case 0x2e: /* SWR */ (*mips3.swr)(op); break; case 0x2f: /* CACHE */ /* effective no-op */ break; - case 0x30: /* LL */ logerror("mips3 Unhandled op: LL\n"); break; + case 0x30: /* LL */ log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: LL\n"); break; case 0x31: /* LWC1 */ set_cop1_reg(RTREG, RLONG(SIMMVAL+RSVAL32)); break; case 0x32: /* LWC2 */ set_cop2_reg(RTREG, RLONG(SIMMVAL+RSVAL32)); break; case 0x33: /* PREF */ /* effective no-op */ break; - case 0x34: /* LLD */ logerror("mips3 Unhandled op: LLD\n"); break; + case 0x34: /* LLD */ log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: LLD\n"); break; case 0x35: /* LDC1 */ set_cop1_reg(RTREG, RDOUBLE(SIMMVAL+RSVAL32)); break; case 0x36: /* LDC2 */ set_cop2_reg(RTREG, RDOUBLE(SIMMVAL+RSVAL32)); break; case 0x37: /* LD */ temp64 = RDOUBLE(SIMMVAL+RSVAL32); if (RTREG) RTVAL64 = temp64; break; - case 0x38: /* SC */ logerror("mips3 Unhandled op: SC\n"); break; + case 0x38: /* SC */ log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: SC\n"); break; case 0x39: /* SWC1 */ WLONG(SIMMVAL+RSVAL32, get_cop1_reg(RTREG)); break; case 0x3a: /* SWC2 */ WLONG(SIMMVAL+RSVAL32, get_cop2_reg(RTREG)); break; case 0x3b: /* SWC3 */ invalid_instruction(op); break; - case 0x3c: /* SCD */ logerror("mips3 Unhandled op: SCD\n"); break; + case 0x3c: /* SCD */ log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: SCD\n"); break; case 0x3d: /* SDC1 */ WDOUBLE(SIMMVAL+RSVAL32, get_cop1_reg(RTREG)); break; case 0x3e: /* SDC2 */ WDOUBLE(SIMMVAL+RSVAL32, get_cop2_reg(RTREG)); break; case 0x3f: /* SD */ WDOUBLE(SIMMVAL+RSVAL32, RTVAL64); break; @@ -1504,8 +1529,6 @@ } while (mips3_icount > 0 || mips3.nextpc != ~0); -//printf("mips3_execute done (PC=%08X)\n", mips3.pc); - mips3_icount -= mips3.interrupt_cycles; mips3.interrupt_cycles = 0; return cycles - mips3_icount; @@ -1526,7 +1549,7 @@ case MIPS3_SR: return SR; case MIPS3_EPC: return mips3.cpr[0][COP0_EPC]; case MIPS3_CAUSE: return mips3.cpr[0][COP0_Cause]; - case MIPS3_COUNT: return mips3.cpr[0][COP0_Count]; + case MIPS3_COUNT: return ((activecpu_gettotalcycles64() - mips3.count_zero_time) / 2); case MIPS3_COMPARE: return mips3.cpr[0][COP0_Compare]; case MIPS3_R0: return (UINT32)mips3.r[0]; @@ -1640,9 +1663,9 @@ default: if (regnum <= REG_SP_CONTENTS) { -// unsigned offset = REG_SP_CONTENTS - regnum; -// if (offset < PC_STACK_DEPTH) -// return mips3.pc_stack[offset]; +/* unsigned offset = REG_SP_CONTENTS - regnum;*/ +/* if (offset < PC_STACK_DEPTH)*/ +/* return mips3.pc_stack[offset];*/ } } return 0; @@ -1775,9 +1798,9 @@ default: if (regnum <= REG_SP_CONTENTS) { -// unsigned offset = REG_SP_CONTENTS - regnum; -// if (offset < PC_STACK_DEPTH) -// mips3.pc_stack[offset] = val; +/* unsigned offset = REG_SP_CONTENTS - regnum;*/ +/* if (offset < PC_STACK_DEPTH)*/ +/* mips3.pc_stack[offset] = val;*/ } } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/mips/mips3drc.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/mips/mips3drc.c
Changed
@@ -579,7 +579,7 @@ int remaining = MAX_INSTRUCTIONS; UINT32 pc = mips3.pc; -// printf("recompile_callback @ PC=%08X\n", mips3.pc); + log_cb(RETRO_LOG_DEBUG, LOGPRE "recompile_callback @ PC=%08X\n", mips3.pc); /* if (!ram_read_table) { @@ -694,7 +694,7 @@ /* handle the results */ if (!(result & RECOMPILE_SUCCESSFUL)) { - printf("Unimplemented op %08X (%02X,%02X)\n", *opptr, *opptr >> 26, *opptr & 0x3f); + log_cb(RETRO_LOG_DEBUG, LOGPRE "Unimplemented op %08X (%02X,%02X)\n", *opptr, *opptr >> 26, *opptr & 0x3f); mips3_exit(); exit(1); } @@ -740,27 +740,27 @@ UINT32 offset = (exception >= EXCEPTION_TLBMOD && exception <= EXCEPTION_TLBSTORE) ? 0x80 : 0x180; struct linkdata link1, link2; - _mov_m32abs_r32(&mips3.cpr[0][COP0_EPC], REG_EDI); // mov [mips3.cpr[0][COP0_EPC]],edi - _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Cause]); // mov eax,[mips3.cpr[0][COP0_Cause]] - _and_r32_imm(REG_EAX, ~0x800000ff); // and eax,~0x800000ff + _mov_m32abs_r32(&mips3.cpr[0][COP0_EPC], REG_EDI); /* mov [mips3.cpr[0][COP0_EPC]],edi*/ + _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Cause]); /* mov eax,[mips3.cpr[0][COP0_Cause]]*/ + _and_r32_imm(REG_EAX, ~0x800000ff); /* and eax,~0x800000ff*/ if (exception) - _or_r32_imm(REG_EAX, exception << 2); // or eax,exception << 2 - _cmp_m32abs_imm(&mips3.nextpc, ~0); // cmp [mips3.nextpc],~0 - _jcc_short_link(COND_E, &link1); // je skip - _mov_m32abs_imm(&mips3.nextpc, ~0); // mov [mips3.nextpc],~0 - _sub_m32abs_imm(&mips3.cpr[0][COP0_EPC], 4); // sub [mips3.cpr[0][COP0_EPC]],4 - _or_r32_imm(REG_EAX, 0x80000000); // or eax,0x80000000 - _resolve_link(&link1); // skip: - _mov_m32abs_r32(&mips3.cpr[0][COP0_Cause], REG_EAX); // mov [mips3.cpr[0][COP0_Cause]],eax - _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Status]); // mov eax,[[mips3.cpr[0][COP0_Status]] - _or_r32_imm(REG_EAX, SR_EXL); // or eax,SR_EXL - _test_r32_imm(REG_EAX, SR_BEV); // test eax,SR_BEV - _mov_m32abs_r32(&mips3.cpr[0][COP0_Status], REG_EAX); // mov [[mips3.cpr[0][COP0_Status]],eax - _mov_r32_imm(REG_EDI, 0xbfc00200 + offset); // mov edi,0xbfc00200+offset - _jcc_short_link(COND_NZ, &link2); // jnz skip2 - _mov_r32_imm(REG_EDI, 0x80000000 + offset); // mov edi,0x80000000+offset - _resolve_link(&link2); // skip2: - drc_append_dispatcher(drc); // dispatch + _or_r32_imm(REG_EAX, exception << 2); /* or eax,exception << 2*/ + _cmp_m32abs_imm(&mips3.nextpc, ~0); /* cmp [mips3.nextpc],~0*/ + _jcc_short_link(COND_E, &link1); /* je skip*/ + _mov_m32abs_imm(&mips3.nextpc, ~0); /* mov [mips3.nextpc],~0*/ + _sub_m32abs_imm(&mips3.cpr[0][COP0_EPC], 4); /* sub [mips3.cpr[0][COP0_EPC]],4*/ + _or_r32_imm(REG_EAX, 0x80000000); /* or eax,0x80000000*/ + _resolve_link(&link1); /* skip:*/ + _mov_m32abs_r32(&mips3.cpr[0][COP0_Cause], REG_EAX); /* mov [mips3.cpr[0][COP0_Cause]],eax*/ + _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Status]); /* mov eax,[[mips3.cpr[0][COP0_Status]]*/ + _or_r32_imm(REG_EAX, SR_EXL); /* or eax,SR_EXL*/ + _test_r32_imm(REG_EAX, SR_BEV); /* test eax,SR_BEV*/ + _mov_m32abs_r32(&mips3.cpr[0][COP0_Status], REG_EAX); /* mov [[mips3.cpr[0][COP0_Status]],eax*/ + _mov_r32_imm(REG_EDI, 0xbfc00200 + offset); /* mov edi,0xbfc00200+offset*/ + _jcc_short_link(COND_NZ, &link2); /* jnz skip2*/ + _mov_r32_imm(REG_EDI, 0x80000000 + offset); /* mov edi,0x80000000+offset*/ + _resolve_link(&link2); /* skip2:*/ + drc_append_dispatcher(drc); /* dispatch*/ } @@ -770,9 +770,9 @@ static void append_update_cycle_counting(struct drccore *drc) { - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _call((void *)update_cycle_counting); // call update_cycle_counting - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _call((void *)update_cycle_counting); /* call update_cycle_counting*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ } @@ -783,28 +783,28 @@ static void append_check_interrupts(struct drccore *drc, int inline_generate) { struct linkdata link1, link2, link3; - _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Cause]); // mov eax,[mips3.cpr[0][COP0_Cause]] - _and_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Status]); // and eax,[mips3.cpr[0][COP0_Status]] - _and_r32_imm(REG_EAX, 0xff00); // and eax,0xff00 + _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Cause]); /* mov eax,[mips3.cpr[0][COP0_Cause]]*/ + _and_r32_m32abs(REG_EAX, &mips3.cpr[0][COP0_Status]); /* and eax,[mips3.cpr[0][COP0_Status]]*/ + _and_r32_imm(REG_EAX, 0xff00); /* and eax,0xff00*/ if (!inline_generate) - _jcc_short_link(COND_Z, &link1); // jz skip + _jcc_short_link(COND_Z, &link1); /* jz skip*/ else - _jcc_near_link(COND_Z, &link1); // jz skip - _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_IE); // test [mips3.cpr[0][COP0_Status],SR_IE + _jcc_near_link(COND_Z, &link1); /* jz skip*/ + _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_IE); /* test [mips3.cpr[0][COP0_Status],SR_IE*/ if (!inline_generate) - _jcc_short_link(COND_Z, &link2); // jz skip + _jcc_short_link(COND_Z, &link2); /* jz skip*/ else - _jcc_near_link(COND_Z, &link2); // jz skip - _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_EXL | SR_ERL); // test [mips3.cpr[0][COP0_Status],SR_EXL | SR_ERL + _jcc_near_link(COND_Z, &link2); /* jz skip*/ + _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_EXL | SR_ERL); /* test [mips3.cpr[0][COP0_Status],SR_EXL | SR_ERL*/ if (!inline_generate) - _jcc(COND_Z, mips3.generate_interrupt_exception); // jz generate_interrupt_exception + _jcc(COND_Z, mips3.generate_interrupt_exception); /* jz generate_interrupt_exception*/ else { - _jcc_near_link(COND_NZ, &link3); // jnz skip - append_generate_exception(drc, EXCEPTION_INTERRUPT); // <generate exception> - _resolve_link(&link3); // skip: + _jcc_near_link(COND_NZ, &link3); /* jnz skip*/ + append_generate_exception(drc, EXCEPTION_INTERRUPT); /* <generate exception>*/ + _resolve_link(&link3); /* skip:*/ } - _resolve_link(&link1); // skip: + _resolve_link(&link1); /* skip:*/ _resolve_link(&link2); } @@ -891,16 +891,16 @@ /* recompile the instruction as-is */ in_delay_slot = 1; - result = recompile_instruction(drc, pc); // <next instruction> + result = recompile_instruction(drc, pc); /* <next instruction>*/ in_delay_slot = 0; /* if the instruction can cause an exception, recompile setting nextpc */ if (result & RECOMPILE_MAY_CAUSE_EXCEPTION) { drc->cache_top = saved_top; - _mov_m32abs_imm(&mips3.nextpc, 0); // bogus nextpc for exceptions - result = recompile_instruction(drc, pc); // <next instruction> - _mov_m32abs_imm(&mips3.nextpc, ~0); // reset nextpc + _mov_m32abs_imm(&mips3.nextpc, 0); /* bogus nextpc for exceptions*/ + result = recompile_instruction(drc, pc); /* <next instruction>*/ + _mov_m32abs_imm(&mips3.nextpc, ~0); /* reset nextpc*/ } return (INT8)(result >> 16); @@ -929,13 +929,13 @@ case 0x09: /* addiu */ if (nextrsreg != targetreg || nextrtreg != targetreg) break; - _mov_m64abs_imm32(&mips3.r[targetreg], address + nextsimm); // mov [targetreg],const + _mov_m64abs_imm32(&mips3.r[targetreg], address + nextsimm); /* mov [targetreg],const*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x0d: /* ori */ if (nextrsreg != targetreg || nextrtreg != targetreg) break; - _mov_m64abs_imm32(&mips3.r[targetreg], address | (UINT16)nextsimm); // mov [targetreg],const + _mov_m64abs_imm32(&mips3.r[targetreg], address | (UINT16)nextsimm); /* mov [targetreg],const*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x20: /* lb */ @@ -952,10 +952,10 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _movsx_r32_m8abs(REG_EAX, memory); // movsx eax,byte [memory] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); // mov [nextrtreg],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _movsx_r32_m8abs(REG_EAX, memory); /* movsx eax,byte [memory]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); /* mov [nextrtreg],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x21: /* lh */ @@ -972,10 +972,10 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _movsx_r32_m16abs(REG_EAX, memory); // movsx eax,word [memory] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); // mov [nextrtreg],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _movsx_r32_m16abs(REG_EAX, memory); /* movsx eax,word [memory]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); /* mov [nextrtreg],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x23: /* lw */ @@ -989,10 +989,10 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r32_m32abs(REG_EAX, memory); // mov eax,[memory] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); // mov [nextrtreg],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r32_m32abs(REG_EAX, memory); /* mov eax,[memory]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); /* mov [nextrtreg],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x24: /* lbu */ @@ -1009,10 +1009,10 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _movzx_r32_m8abs(REG_EAX, memory); // movzx eax,byte [memory] - _mov_m32abs_imm(HI(&mips3.r[nextrtreg]), 0); // mov [nextrtreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[nextrtreg]), REG_EAX); // mov [nextrtreg].lo,eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _movzx_r32_m8abs(REG_EAX, memory); /* movzx eax,byte [memory]*/ + _mov_m32abs_imm(HI(&mips3.r[nextrtreg]), 0); /* mov [nextrtreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[nextrtreg]), REG_EAX); /* mov [nextrtreg].lo,eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x25: /* lhu */ @@ -1029,10 +1029,10 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _movzx_r32_m16abs(REG_EAX, memory); // movzx eax,word [memory] - _mov_m32abs_imm(HI(&mips3.r[nextrtreg]), 0); // mov [nextrtreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[nextrtreg]), REG_EAX); // mov [nextrtreg].lo,eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _movzx_r32_m16abs(REG_EAX, memory); /* movzx eax,word [memory]*/ + _mov_m32abs_imm(HI(&mips3.r[nextrtreg]), 0); /* mov [nextrtreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[nextrtreg]), REG_EAX); /* mov [nextrtreg].lo,eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x27: /* lwu */ @@ -1046,10 +1046,10 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r32_m32abs(REG_EAX, memory); // mov eax,[memory] - _mov_m32abs_imm(HI(&mips3.r[nextrtreg]), 0); // mov [nextrtreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[nextrtreg]), REG_EAX); // mov [nextrtreg].lo,eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r32_m32abs(REG_EAX, memory); /* mov eax,[memory]*/ + _mov_m32abs_imm(HI(&mips3.r[nextrtreg]), 0); /* mov [nextrtreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[nextrtreg]), REG_EAX); /* mov [nextrtreg].lo,eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x31: /* lwc1 */ @@ -1062,9 +1062,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r32_m32abs(REG_EAX, memory); // mov eax,[memory] - _mov_m32abs_r32(LO(&mips3.cpr[1][nextrtreg]), REG_EAX); // mov cpr[1][nextrtreg].lo,eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r32_m32abs(REG_EAX, memory); /* mov eax,[memory]*/ + _mov_m32abs_r32(LO(&mips3.cpr[1][nextrtreg]), REG_EAX); /* mov cpr[1][nextrtreg].lo,eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x32: /* lwc2 */ @@ -1077,9 +1077,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r32_m32abs(REG_EAX, memory); // mov eax,[memory] - _mov_m32abs_r32(LO(&mips3.cpr[2][nextrtreg]), REG_EAX); // mov cpr[2][nextrtreg].lo,eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r32_m32abs(REG_EAX, memory); /* mov eax,[memory]*/ + _mov_m32abs_r32(LO(&mips3.cpr[2][nextrtreg]), REG_EAX); /* mov cpr[2][nextrtreg].lo,eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x35: /* ldc1 */ @@ -1092,9 +1092,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r64_m64abs(REG_EDX, REG_EAX, memory); // mov edx:eax,[memory] - _mov_m64abs_r64(&mips3.cpr[1][nextrtreg], REG_EDX, REG_EAX);// mov cpr[1][nextrtreg],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r64_m64abs(REG_EDX, REG_EAX, memory); /* mov edx:eax,[memory]*/ + _mov_m64abs_r64(&mips3.cpr[1][nextrtreg], REG_EDX, REG_EAX);/* mov cpr[1][nextrtreg],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x36: /* ldc2 */ @@ -1107,9 +1107,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r64_m64abs(REG_EDX, REG_EAX, memory); // mov edx:eax,[memory] - _mov_m64abs_r64(&mips3.cpr[2][nextrtreg], REG_EDX, REG_EAX);// mov cpr[2][nextrtreg],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r64_m64abs(REG_EDX, REG_EAX, memory); /* mov edx:eax,[memory]*/ + _mov_m64abs_r64(&mips3.cpr[2][nextrtreg], REG_EDX, REG_EAX);/* mov cpr[2][nextrtreg],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x37: /* ld */ @@ -1123,9 +1123,9 @@ /* do the LUI anyway if we're not reading to the same register */ if (nextrtreg != targetreg) - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r64_m64abs(REG_EDX, REG_EAX, memory); // mov eax,[memory] - _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); // mov [nextrtreg],eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r64_m64abs(REG_EDX, REG_EAX, memory); /* mov eax,[memory]*/ + _mov_m64abs_r64(&mips3.r[nextrtreg], REG_EDX, REG_EAX); /* mov [nextrtreg],eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x28: /* sb */ @@ -1141,14 +1141,14 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ if (nextrtreg != 0) { - _mov_r8_m8abs(REG_AL, &mips3.r[nextrtreg]); // mov ax,[nextrtreg] - _mov_m8abs_r8(memory, REG_AL); // mov [memory],ax + _mov_r8_m8abs(REG_AL, &mips3.r[nextrtreg]); /* mov ax,[nextrtreg]*/ + _mov_m8abs_r8(memory, REG_AL); /* mov [memory],ax*/ } else - _mov_m8abs_imm(memory, 0); // mov [memory],0 + _mov_m8abs_imm(memory, 0); /* mov [memory],0*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x29: /* sh */ @@ -1164,14 +1164,14 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ if (nextrtreg != 0) { - _mov_r16_m16abs(REG_AX, &mips3.r[nextrtreg]); // mov ax,[nextrtreg] - _mov_m16abs_r16(memory, REG_AX); // mov [memory],ax + _mov_r16_m16abs(REG_AX, &mips3.r[nextrtreg]); /* mov ax,[nextrtreg]*/ + _mov_m16abs_r16(memory, REG_AX); /* mov [memory],ax*/ } else - _mov_m16abs_imm(memory, 0); // mov [memory],0 + _mov_m16abs_imm(memory, 0); /* mov [memory],0*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x2b: /* sw */ @@ -1184,14 +1184,14 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ if (nextrtreg != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[nextrtreg]); // mov eax,[nextrtreg] - _mov_m32abs_r32(memory, REG_EAX); // mov [memory],eax + _mov_r32_m32abs(REG_EAX, &mips3.r[nextrtreg]); /* mov eax,[nextrtreg]*/ + _mov_m32abs_r32(memory, REG_EAX); /* mov [memory],eax*/ } else - _mov_m32abs_imm(memory, 0); // mov [memory],0 + _mov_m32abs_imm(memory, 0); /* mov [memory],0*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x39: /* swc1 */ @@ -1204,9 +1204,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][nextrtreg]); // mov eax,cpr[1][nextrtreg] - _mov_m32abs_r32(memory, REG_EAX); // mov [memory],eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][nextrtreg]); /* mov eax,cpr[1][nextrtreg]*/ + _mov_m32abs_r32(memory, REG_EAX); /* mov [memory],eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x3a: /* swc2 */ @@ -1219,9 +1219,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r32_m32abs(REG_EAX, &mips3.cpr[2][nextrtreg]); // mov eax,cpr[2][nextrtreg] - _mov_m32abs_r32(memory, REG_EAX); // mov [memory],eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r32_m32abs(REG_EAX, &mips3.cpr[2][nextrtreg]); /* mov eax,cpr[2][nextrtreg]*/ + _mov_m32abs_r32(memory, REG_EAX); /* mov [memory],eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x3d: /* sdc1 */ @@ -1234,9 +1234,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.cpr[1][nextrtreg]);// mov edx:eax,cpr[1][nextrtreg] - _mov_m64abs_r64(memory, REG_EDX, REG_EAX); // mov [memory],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.cpr[1][nextrtreg]);/* mov edx:eax,cpr[1][nextrtreg]*/ + _mov_m64abs_r64(memory, REG_EDX, REG_EAX); /* mov [memory],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x3e: /* sdc2 */ @@ -1249,9 +1249,9 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.cpr[2][nextrtreg]);// mov edx:eax,cpr[2][nextrtreg] - _mov_m64abs_r64(memory, REG_EDX, REG_EAX); // mov [memory],edx:eax + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.cpr[2][nextrtreg]);/* mov edx:eax,cpr[2][nextrtreg]*/ + _mov_m64abs_r64(memory, REG_EDX, REG_EAX); /* mov [memory],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(2,8); case 0x3f: /* sd */ @@ -1264,19 +1264,19 @@ break; /* do the LUI anyway */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [targetreg],const << 16 + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [targetreg],const << 16*/ if (nextrtreg != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[nextrtreg]); // mov edx:eax,[nextrtreg] - _mov_m64abs_r64(memory, REG_EDX, REG_EAX); // mov [memory],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[nextrtreg]); /* mov edx:eax,[nextrtreg]*/ + _mov_m64abs_r64(memory, REG_EDX, REG_EAX); /* mov [memory],edx:eax*/ } else - _mov_m64abs_imm32(memory, 0); // mov [memory],0 + _mov_m64abs_imm32(memory, 0); /* mov [memory],0*/ return RECOMPILE_SUCCESSFUL_CP(2,8); } /* default case: standard LUI */ - _mov_m64abs_imm32(&mips3.r[targetreg], address); // mov [rtreg],const << 16 + _mov_m64abs_imm32(&mips3.r[targetreg], address); /* mov [rtreg],const << 16*/ return RECOMPILE_SUCCESSFUL_CP(1,4); } @@ -1288,36 +1288,36 @@ static UINT32 recompile_ldlr_le(struct drccore *drc, UINT8 rtreg, UINT8 rsreg, INT16 simmval) { struct linkdata link1, link2; - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[rsreg]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[rsreg]); /* mov eax,[rsreg]*/ if (simmval) - _add_r32_imm(REG_EAX, simmval); // add eax,simmval - _mov_m32abs_r32(&scratchspace[0], REG_EAX); // mov [scratchspace[0]],eax - _and_r32_imm(REG_EAX, ~3); // and eax,~3 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _mov_m32abs_r32(&scratchspace[1], REG_EAX); // mov [scratchspace[1]],eax - _add_m32bd_imm(REG_ESP, 0, 4); // add [esp],4 - _call((void *)mips3.memory.readlong); // call readlong - _test_m32abs_imm(&scratchspace[0], 3); // test [scratchspace[0]],3 - _jcc_short_link(COND_Z, &link1); // jz link1 - _mov_m32abs_r32(&scratchspace[2], REG_EAX); // mov [scratchspace[2]],eax - _add_m32bd_imm(REG_ESP, 0, 4); // add [esp],4 - _call((void *)mips3.memory.readlong); // call readlong - _mov_r32_m32abs(REG_ECX, &scratchspace[0]); // mov ecx,[scratchspace[0]] - _mov_r32_m32abs(REG_EBX, &scratchspace[1]); // mov ebx,[scratchspace[1]] - _mov_r32_m32abs(REG_EDX, &scratchspace[2]); // mov edx,[scratchspace[2]] - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 - _shrd_r32_r32_cl(REG_EBX, REG_EDX); // shrd ebx,edx,cl - _shrd_r32_r32_cl(REG_EDX, REG_EAX); // shrd edx,eax,cl - _mov_m64abs_r64(&mips3.r[rtreg], REG_EDX, REG_EBX); // mov [rtreg],edx:ebx - _jmp_short_link(&link2); // jmp done - _resolve_link(&link1); // link1: - _mov_r32_m32abs(REG_EDX, &scratchspace[1]); // mov edx,[scratchspace[1]] - _mov_m64abs_r64(&mips3.r[rtreg], REG_EAX, REG_EDX); // mov [rtreg],eax:edx - _resolve_link(&link2); // link2: - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_EAX, simmval); /* add eax,simmval*/ + _mov_m32abs_r32(&scratchspace[0], REG_EAX); /* mov [scratchspace[0]],eax*/ + _and_r32_imm(REG_EAX, ~3); /* and eax,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(&scratchspace[1], REG_EAX); /* mov [scratchspace[1]],eax*/ + _add_m32bd_imm(REG_ESP, 0, 4); /* add [esp],4*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _test_m32abs_imm(&scratchspace[0], 3); /* test [scratchspace[0]],3*/ + _jcc_short_link(COND_Z, &link1); /* jz link1*/ + _mov_m32abs_r32(&scratchspace[2], REG_EAX); /* mov [scratchspace[2]],eax*/ + _add_m32bd_imm(REG_ESP, 0, 4); /* add [esp],4*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_r32_m32abs(REG_ECX, &scratchspace[0]); /* mov ecx,[scratchspace[0]]*/ + _mov_r32_m32abs(REG_EBX, &scratchspace[1]); /* mov ebx,[scratchspace[1]]*/ + _mov_r32_m32abs(REG_EDX, &scratchspace[2]); /* mov edx,[scratchspace[2]]*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ + _shrd_r32_r32_cl(REG_EBX, REG_EDX); /* shrd ebx,edx,cl*/ + _shrd_r32_r32_cl(REG_EDX, REG_EAX); /* shrd edx,eax,cl*/ + _mov_m64abs_r64(&mips3.r[rtreg], REG_EDX, REG_EBX); /* mov [rtreg],edx:ebx*/ + _jmp_short_link(&link2); /* jmp done*/ + _resolve_link(&link1); /* link1:*/ + _mov_r32_m32abs(REG_EDX, &scratchspace[1]); /* mov edx,[scratchspace[1]]*/ + _mov_m64abs_r64(&mips3.r[rtreg], REG_EAX, REG_EDX); /* mov [rtreg],eax:edx*/ + _resolve_link(&link2); /* link2:*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(2,8); } @@ -1329,29 +1329,29 @@ static UINT32 recompile_lwlr_le(struct drccore *drc, UINT8 rtreg, UINT8 rsreg, INT16 simmval) { struct linkdata link1; - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[rsreg]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[rsreg]); /* mov eax,[rsreg]*/ if (simmval) - _add_r32_imm(REG_EAX, simmval); // add eax,simmval - _mov_m32abs_r32(&scratchspace[0], REG_EAX); // mov [scratchspace[0]],eax - _and_r32_imm(REG_EAX, ~3); // and eax,~3 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _test_m32abs_imm(&scratchspace[0], 3); // test [scratchspace[0]],3 - _jcc_short_link(COND_Z, &link1); // jz link1 - _mov_m32abs_r32(&scratchspace[1], REG_EAX); // mov [scratchspace[1]],eax - _add_m32bd_imm(REG_ESP, 0, 4); // add [esp],4 - _call((void *)mips3.memory.readlong); // call readlong - _mov_r32_m32abs(REG_ECX, &scratchspace[0]); // mov ecx,[scratchspace[0]] - _mov_r32_m32abs(REG_EDX, &scratchspace[1]); // mov edx,[scratchspace[1]] - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 - _shrd_r32_r32_cl(REG_EDX, REG_EAX); // shrd edx,eax,cl - _mov_r32_r32(REG_EAX, REG_EDX); // mov eax,edx - _resolve_link(&link1); // link1: - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[rtreg], REG_EDX, REG_EAX); // mov [rtreg],edx:eax - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_EAX, simmval); /* add eax,simmval*/ + _mov_m32abs_r32(&scratchspace[0], REG_EAX); /* mov [scratchspace[0]],eax*/ + _and_r32_imm(REG_EAX, ~3); /* and eax,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _test_m32abs_imm(&scratchspace[0], 3); /* test [scratchspace[0]],3*/ + _jcc_short_link(COND_Z, &link1); /* jz link1*/ + _mov_m32abs_r32(&scratchspace[1], REG_EAX); /* mov [scratchspace[1]],eax*/ + _add_m32bd_imm(REG_ESP, 0, 4); /* add [esp],4*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_r32_m32abs(REG_ECX, &scratchspace[0]); /* mov ecx,[scratchspace[0]]*/ + _mov_r32_m32abs(REG_EDX, &scratchspace[1]); /* mov edx,[scratchspace[1]]*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ + _shrd_r32_r32_cl(REG_EDX, REG_EAX); /* shrd edx,eax,cl*/ + _mov_r32_r32(REG_EAX, REG_EDX); /* mov eax,edx*/ + _resolve_link(&link1); /* link1:*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[rtreg], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(2,8); } @@ -1419,102 +1419,102 @@ return recompile_regimm(drc, pc, op); case 0x02: /* J */ - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, (pc & 0xf0000000) | (LIMMVAL << 2), 1+cycles);// <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, (pc & 0xf0000000) | (LIMMVAL << 2), 1+cycles);/* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; case 0x03: /* JAL */ - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, (pc & 0xf0000000) | (LIMMVAL << 2), 1+cycles);// <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, (pc & 0xf0000000) | (LIMMVAL << 2), 1+cycles);/* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; case 0x04: /* BEQ */ if (RSREG == RTREG) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else if (RSREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_near_link(COND_NZ, &link1); // jnz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_near_link(COND_NZ, &link1); /* jnz skip*/ } else if (RTREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // or eax,[rsreg].hi - _jcc_near_link(COND_NZ, &link1); // jnz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* or eax,[rsreg].hi*/ + _jcc_near_link(COND_NZ, &link1); /* jnz skip*/ } else { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc_near_link(COND_NE, &link1); // jne skip - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_near_link(COND_NE, &link2); // jne skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc_near_link(COND_NE, &link1); /* jne skip*/ + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_near_link(COND_NE, &link2); /* jne skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ if (RSREG != 0 && RTREG != 0) - _resolve_link(&link2); // skip: + _resolve_link(&link2); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x05: /* BNE */ if (RSREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_near_link(COND_Z, &link1); // jz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_near_link(COND_Z, &link1); /* jz skip*/ } else if (RTREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // or eax,[rsreg].hi - _jcc_near_link(COND_Z, &link1); // jz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* or eax,[rsreg].hi*/ + _jcc_near_link(COND_Z, &link1); /* jz skip*/ } else { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc_short_link(COND_NE, &link2); // jne takeit - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_near_link(COND_E, &link1); // je skip - _resolve_link(&link2); // takeit: + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc_short_link(COND_NE, &link2); /* jne takeit*/ + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_near_link(COND_E, &link1); /* je skip*/ + _resolve_link(&link2); /* takeit:*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x06: /* BLEZ */ if (RSREG == 0) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_G, &link1); // jg skip - _jcc_short_link(COND_L, &link2); // jl takeit - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); // cmp [rsreg].lo,0 - _jcc_near_link(COND_NE, &link3); // jne skip - _resolve_link(&link2); // takeit: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_G, &link1); /* jg skip*/ + _jcc_short_link(COND_L, &link2); /* jl takeit*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); /* cmp [rsreg].lo,0*/ + _jcc_near_link(COND_NE, &link3); /* jne skip*/ + _resolve_link(&link2); /* takeit:*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: - _resolve_link(&link3); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ + _resolve_link(&link3); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x07: /* BGTZ */ @@ -1522,34 +1522,34 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_L, &link1); // jl skip - _jcc_short_link(COND_G, &link2); // jg takeit - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); // cmp [rsreg].lo,0 - _jcc_near_link(COND_E, &link3); // je skip - _resolve_link(&link2); // takeit: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_L, &link1); /* jl skip*/ + _jcc_short_link(COND_G, &link2); /* jg takeit*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); /* cmp [rsreg].lo,0*/ + _jcc_near_link(COND_E, &link3); /* je skip*/ + _resolve_link(&link2); /* takeit:*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: - _resolve_link(&link3); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ + _resolve_link(&link3); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x08: /* ADDI */ if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _jcc(COND_O, mips3.generate_overflow_exception); // jo generate_overflow_exception + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _jcc(COND_O, mips3.generate_overflow_exception); /* jo generate_overflow_exception*/ if (RTREG != 0) { - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } } else if (RTREG != 0) - _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); // mov [rtreg],const + _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); /* mov [rtreg],const*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x09: /* ADDIU */ @@ -1557,13 +1557,13 @@ { if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } else - _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); // mov [rtreg],const + _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); /* mov [rtreg],const*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1572,17 +1572,17 @@ { if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _sub_r32_imm(REG_EAX, SIMMVAL); // sub eax,[rtreg].lo - _sbb_r32_imm(REG_EDX, ((INT32)SIMMVAL >> 31)); // sbb edx,[rtreg].lo - _shr_r32_imm(REG_EDX, 31); // shr edx,31 - _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EDX); // mov [rdreg].lo,edx - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rdreg].hi,0 + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _sub_r32_imm(REG_EAX, SIMMVAL); /* sub eax,[rtreg].lo*/ + _sbb_r32_imm(REG_EDX, ((INT32)SIMMVAL >> 31)); /* sbb edx,[rtreg].lo*/ + _shr_r32_imm(REG_EDX, 31); /* shr edx,31*/ + _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EDX); /* mov [rdreg].lo,edx*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rdreg].hi,0*/ } else { - _mov_m32abs_imm(LO(&mips3.r[RTREG]), (0 < SIMMVAL)); // mov [rtreg].lo,const - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,sign-extend(const) + _mov_m32abs_imm(LO(&mips3.r[RTREG]), (0 < SIMMVAL)); /* mov [rtreg].lo,const*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,sign-extend(const)*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1592,23 +1592,23 @@ { if (RSREG != 0) { - _xor_r32_r32(REG_ECX, REG_ECX); // xor ecx,ecx - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); // cmp [rsreg].hi,upper - _jcc_short_link(COND_B, &link1); // jb takeit - _jcc_short_link(COND_A, &link2); // ja skip - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); // cmp [rsreg].lo,lower - _jcc_short_link(COND_AE, &link3); // jae skip - _resolve_link(&link1); // takeit: - _add_r32_imm(REG_ECX, 1); // add ecx,1 - _resolve_link(&link2); // skip: - _resolve_link(&link3); // skip: - _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_ECX); // mov [rtreg].lo,ecx - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,sign-extend(const) + _xor_r32_r32(REG_ECX, REG_ECX); /* xor ecx,ecx*/ + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); /* cmp [rsreg].hi,upper*/ + _jcc_short_link(COND_B, &link1); /* jb takeit*/ + _jcc_short_link(COND_A, &link2); /* ja skip*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); /* cmp [rsreg].lo,lower*/ + _jcc_short_link(COND_AE, &link3); /* jae skip*/ + _resolve_link(&link1); /* takeit:*/ + _add_r32_imm(REG_ECX, 1); /* add ecx,1*/ + _resolve_link(&link2); /* skip:*/ + _resolve_link(&link3); /* skip:*/ + _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_ECX); /* mov [rtreg].lo,ecx*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,sign-extend(const)*/ } else { - _mov_m32abs_imm(LO(&mips3.r[RTREG]), (0 < SIMMVAL)); // mov [rtreg].lo,const - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,sign-extend(const) + _mov_m32abs_imm(LO(&mips3.r[RTREG]), (0 < SIMMVAL)); /* mov [rtreg].lo,const*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,sign-extend(const)*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1618,18 +1618,18 @@ { if (RSREG == RTREG) { - _and_m32abs_imm(&mips3.r[RTREG], UIMMVAL); // and [rtreg],UIMMVAL - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,0 + _and_m32abs_imm(&mips3.r[RTREG], UIMMVAL); /* and [rtreg],UIMMVAL*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,0*/ } else if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg].lo - _and_r32_imm(REG_EAX, UIMMVAL); // and eax,UIMMVAL - _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); // mov [rtreg].lo,eax - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,0 + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg].lo*/ + _and_r32_imm(REG_EAX, UIMMVAL); /* and eax,UIMMVAL*/ + _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); /* mov [rtreg].lo,eax*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,0*/ } else - _mov_m64abs_imm32(&mips3.r[RTREG], 0); // mov [rtreg],0 + _mov_m64abs_imm32(&mips3.r[RTREG], 0); /* mov [rtreg],0*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1637,15 +1637,15 @@ if (RTREG != 0) { if (RSREG == RTREG) - _or_m32abs_imm(&mips3.r[RTREG], UIMMVAL); // or [rtreg],UIMMVAL + _or_m32abs_imm(&mips3.r[RTREG], UIMMVAL); /* or [rtreg],UIMMVAL*/ else if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _or_r32_imm(REG_EAX, UIMMVAL); // or eax,UIMMVAL - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _or_r32_imm(REG_EAX, UIMMVAL); /* or eax,UIMMVAL*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } else - _mov_m64abs_imm32(&mips3.r[RTREG], UIMMVAL); // mov [rtreg],const + _mov_m64abs_imm32(&mips3.r[RTREG], UIMMVAL); /* mov [rtreg],const*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1653,15 +1653,15 @@ if (RTREG != 0) { if (RSREG == RTREG) - _xor_m32abs_imm(&mips3.r[RTREG], UIMMVAL); // xor [rtreg],UIMMVAL + _xor_m32abs_imm(&mips3.r[RTREG], UIMMVAL); /* xor [rtreg],UIMMVAL*/ else if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _xor_r32_imm(REG_EAX, UIMMVAL); // xor eax,UIMMVAL - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _xor_r32_imm(REG_EAX, UIMMVAL); /* xor eax,UIMMVAL*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } else - _mov_m64abs_imm32(&mips3.r[RTREG], UIMMVAL); // mov [rtreg],const + _mov_m64abs_imm32(&mips3.r[RTREG], UIMMVAL); /* mov [rtreg],const*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1677,13 +1677,13 @@ return recompile_cop1(drc, pc, op) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x12: /* COP2 */ - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; case 0x13: /* COP1X - R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; } return recompile_cop1x(drc, pc, op) | RECOMPILE_MAY_CAUSE_EXCEPTION; @@ -1691,89 +1691,89 @@ case 0x14: /* BEQL */ if (RSREG == RTREG) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else if (RSREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_near_link(COND_NZ, &link1); // jnz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_near_link(COND_NZ, &link1); /* jnz skip*/ } else if (RTREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // or eax,[rsreg].hi - _jcc_near_link(COND_NZ, &link1); // jnz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* or eax,[rsreg].hi*/ + _jcc_near_link(COND_NZ, &link1); /* jnz skip*/ } else { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc_near_link(COND_NE, &link1); // jne skip - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_near_link(COND_NE, &link2); // jne skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc_near_link(COND_NE, &link1); /* jne skip*/ + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_near_link(COND_NE, &link2); /* jne skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ if (RSREG != 0 && RTREG != 0) - _resolve_link(&link2); // skip: + _resolve_link(&link2); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x15: /* BNEL */ if (RSREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_near_link(COND_Z, &link1); // jz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_near_link(COND_Z, &link1); /* jz skip*/ } else if (RTREG == 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // or eax,[rsreg].hi - _jcc_near_link(COND_Z, &link1); // jz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* or eax,[rsreg].hi*/ + _jcc_near_link(COND_Z, &link1); /* jz skip*/ } else { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc_short_link(COND_NE, &link2); // jne takeit - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_near_link(COND_E, &link1); // je skip - _resolve_link(&link2); // takeit: + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc_short_link(COND_NE, &link2); /* jne takeit*/ + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_near_link(COND_E, &link1); /* je skip*/ + _resolve_link(&link2); /* takeit:*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x16: /* BLEZL */ if (RSREG == 0) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_G, &link1); // jg skip - _jcc_short_link(COND_L, &link2); // jl takeit - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); // cmp [rsreg].lo,0 - _jcc_near_link(COND_NE, &link3); // jne skip - _resolve_link(&link2); // takeit: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_G, &link1); /* jg skip*/ + _jcc_short_link(COND_L, &link2); /* jl takeit*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); /* cmp [rsreg].lo,0*/ + _jcc_near_link(COND_NE, &link3); /* jne skip*/ + _resolve_link(&link2); /* takeit:*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: - _resolve_link(&link3); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ + _resolve_link(&link3); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x17: /* BGTZL */ @@ -1781,32 +1781,32 @@ return RECOMPILE_SUCCESSFUL_CP(1,8); else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_L, &link1); // jl skip - _jcc_short_link(COND_G, &link2); // jg takeit - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); // cmp [rsreg].lo,0 - _jcc_near_link(COND_E, &link3); // je skip - _resolve_link(&link2); // takeit: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_L, &link1); /* jl skip*/ + _jcc_short_link(COND_G, &link2); /* jg takeit*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), 0); /* cmp [rsreg].lo,0*/ + _jcc_near_link(COND_E, &link3); /* je skip*/ + _resolve_link(&link2); /* takeit:*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: - _resolve_link(&link3); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ + _resolve_link(&link3); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x18: /* DADDI */ if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _adc_r32_imm(REG_EDX, (SIMMVAL < 0) ? -1 : 0); // adc edx,signext(SIMMVAL) - _jcc(COND_O, mips3.generate_overflow_exception); // jo generate_overflow_exception + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _adc_r32_imm(REG_EDX, (SIMMVAL < 0) ? -1 : 0); /* adc edx,signext(SIMMVAL)*/ + _jcc(COND_O, mips3.generate_overflow_exception); /* jo generate_overflow_exception*/ if (RTREG != 0) - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } else if (RTREG != 0) - _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); // mov [rtreg],const + _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); /* mov [rtreg],const*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x19: /* DADDIU */ @@ -1814,13 +1814,13 @@ { if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _adc_r32_imm(REG_EDX, (SIMMVAL < 0) ? -1 : 0); // adc edx,signext(SIMMVAL) - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _adc_r32_imm(REG_EDX, (SIMMVAL < 0) ? -1 : 0); /* adc edx,signext(SIMMVAL)*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } else - _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); // mov [rtreg],const + _mov_m64abs_imm32(&mips3.r[RTREG], SIMMVAL); /* mov [rtreg],const*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -1833,52 +1833,52 @@ (INT16)nextop == SIMMVAL - 7) return recompile_ldlr_le(drc, RTREG, RSREG, SIMMVAL - 7); } - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~7); // and eax,~7 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _push_r32(REG_EAX); // push eax - _mov_r32_m32bd(REG_EAX, REG_ESP, 4); // mov eax,[esp+4] - _add_r32_imm(REG_EAX, 4); // add eax,4 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~7); /* and eax,~7*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _push_r32(REG_EAX); /* push eax*/ + _mov_r32_m32bd(REG_EAX, REG_ESP, 4); /* mov eax,[esp+4]*/ + _add_r32_imm(REG_EAX, 4); /* add eax,4*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (mips3.bigendian) - _pop_r32(REG_EDX); // pop edx + _pop_r32(REG_EDX); /* pop edx*/ else { - _mov_r32_r32(REG_EDX, REG_EAX); // mov edx,eax - _pop_r32(REG_EAX); // pop eax + _mov_r32_r32(REG_EDX, REG_EAX); /* mov edx,eax*/ + _pop_r32(REG_EAX); /* pop eax*/ } - _add_r32_imm(REG_ESP, 4); // add esp,4 - _pop_r32(REG_ECX); // pop ecx + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _pop_r32(REG_ECX); /* pop ecx*/ if (RTREG != 0) { - _and_r32_imm(REG_ECX, 7); // and ecx,7 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 7); /* and ecx,7*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (!mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x38); // xor ecx,0x38 - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_EDX, REG_EAX); // mov edx,eax - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - _resolve_link(&link1); // skip: - _shld_r32_r32_cl(REG_EDX, REG_EAX); // shld edx,eax,cl - _shl_r32_cl(REG_EAX); // shl eax,cl - _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); // mov ebx,[rtreg].lo - _and_r32_m32bd(REG_EBX, REG_ECX, ldl_mask + 1); // and ebx,[ldl_mask + ecx + 4] - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _mov_r32_m32abs(REG_EBX, HI(&mips3.r[RTREG])); // mov ebx,[rtreg].hi - _and_r32_m32bd(REG_EBX, REG_ECX, ldl_mask); // and ebx,[ldl_mask + ecx] - _or_r32_r32(REG_EDX, REG_EBX); // or edx,ebx - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _xor_r32_imm(REG_ECX, 0x38); /* xor ecx,0x38*/ + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_EDX, REG_EAX); /* mov edx,eax*/ + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + _resolve_link(&link1); /* skip:*/ + _shld_r32_r32_cl(REG_EDX, REG_EAX); /* shld edx,eax,cl*/ + _shl_r32_cl(REG_EAX); /* shl eax,cl*/ + _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); /* mov ebx,[rtreg].lo*/ + _and_r32_m32bd(REG_EBX, REG_ECX, ldl_mask + 1); /* and ebx,[ldl_mask + ecx + 4]*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _mov_r32_m32abs(REG_EBX, HI(&mips3.r[RTREG])); /* mov ebx,[rtreg].hi*/ + _and_r32_m32bd(REG_EBX, REG_ECX, ldl_mask); /* and ebx,[ldl_mask + ecx]*/ + _or_r32_r32(REG_EDX, REG_EBX); /* or edx,ebx*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x1b: /* LDR */ @@ -1890,98 +1890,98 @@ (INT16)nextop == SIMMVAL + 7) return recompile_ldlr_le(drc, RTREG, RSREG, SIMMVAL); } - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~7); // and eax,~7 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _push_r32(REG_EAX); // push eax - _mov_r32_m32bd(REG_EAX, REG_ESP, 4); // mov eax,[esp+4] - _add_r32_imm(REG_EAX, 4); // add eax,4 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~7); /* and eax,~7*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _push_r32(REG_EAX); /* push eax*/ + _mov_r32_m32bd(REG_EAX, REG_ESP, 4); /* mov eax,[esp+4]*/ + _add_r32_imm(REG_EAX, 4); /* add eax,4*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (mips3.bigendian) - _pop_r32(REG_EDX); // pop edx + _pop_r32(REG_EDX); /* pop edx*/ else { - _mov_r32_r32(REG_EDX, REG_EAX); // mov edx,eax - _pop_r32(REG_EAX); // pop eax + _mov_r32_r32(REG_EDX, REG_EAX); /* mov edx,eax*/ + _pop_r32(REG_EAX); /* pop eax*/ } - _add_r32_imm(REG_ESP, 4); // add esp,4 - _pop_r32(REG_ECX); // pop ecx + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _pop_r32(REG_ECX); /* pop ecx*/ if (RTREG != 0) { - _and_r32_imm(REG_ECX, 7); // and ecx,7 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 7); /* and ecx,7*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x38); // xor ecx,0x38 - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_EAX, REG_EDX); // mov eax,edx - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _resolve_link(&link1); // skip: - _shrd_r32_r32_cl(REG_EAX, REG_EDX); // shrd eax,edx,cl - _shr_r32_cl(REG_EDX); // shr edx,cl - _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); // mov ebx,[rtreg].lo - _and_r32_m32bd(REG_EBX, REG_ECX, ldr_mask + 1); // and ebx,[ldr_mask + ecx + 4] - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _mov_r32_m32abs(REG_EBX, HI(&mips3.r[RTREG])); // mov ebx,[rtreg].hi - _and_r32_m32bd(REG_EBX, REG_ECX, ldr_mask); // and ebx,[ldr_mask + ecx] - _or_r32_r32(REG_EDX, REG_EBX); // or edx,ebx - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _xor_r32_imm(REG_ECX, 0x38); /* xor ecx,0x38*/ + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_EAX, REG_EDX); /* mov eax,edx*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _resolve_link(&link1); /* skip:*/ + _shrd_r32_r32_cl(REG_EAX, REG_EDX); /* shrd eax,edx,cl*/ + _shr_r32_cl(REG_EDX); /* shr edx,cl*/ + _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); /* mov ebx,[rtreg].lo*/ + _and_r32_m32bd(REG_EBX, REG_ECX, ldr_mask + 1); /* and ebx,[ldr_mask + ecx + 4]*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _mov_r32_m32abs(REG_EBX, HI(&mips3.r[RTREG])); /* mov ebx,[rtreg].hi*/ + _and_r32_m32bd(REG_EBX, REG_ECX, ldr_mask); /* and ebx,[ldr_mask + ecx]*/ + _or_r32_r32(REG_EDX, REG_EBX); /* or edx,ebx*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x20: /* LB */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readbyte); // call readbyte - _add_r32_imm(REG_ESP, 4); // add esp,4 + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readbyte); /* call readbyte*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (RTREG != 0) { - _movsx_r32_r8(REG_EAX, REG_AL); // movsx eax,al - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _movsx_r32_r8(REG_EAX, REG_AL); /* movsx eax,al*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x21: /* LH */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readword); // call readword - _add_r32_imm(REG_ESP, 4); // add esp,4 + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readword); /* call readword*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (RTREG != 0) { - _movsx_r32_r16(REG_EAX, REG_AX); // movsx eax,ax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _movsx_r32_r16(REG_EAX, REG_AX); /* movsx eax,ax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x22: /* LWL */ @@ -1993,99 +1993,99 @@ (INT16)nextop == SIMMVAL - 3) return recompile_lwlr_le(drc, RTREG, RSREG, SIMMVAL - 3); } - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~3); // and eax,~3 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _pop_r32(REG_ECX); // pop ecx + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~3); /* and eax,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _pop_r32(REG_ECX); /* pop ecx*/ if (RTREG != 0) { - _and_r32_imm(REG_ECX, 3); // and ecx,3 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 3); /* and ecx,3*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (!mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x18); // xor ecx,0x18 - _shl_r32_cl(REG_EAX); // shl eax,cl - _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); // mov ebx,[rtreg].lo - _and_r32_m32bd(REG_EBX, REG_ECX, ldl_mask + 1); // and ebx,[ldl_mask + ecx + 4] - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _xor_r32_imm(REG_ECX, 0x18); /* xor ecx,0x18*/ + _shl_r32_cl(REG_EAX); /* shl eax,cl*/ + _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); /* mov ebx,[rtreg].lo*/ + _and_r32_m32bd(REG_EBX, REG_ECX, ldl_mask + 1); /* and ebx,[ldl_mask + ecx + 4]*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x23: /* LW */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (RTREG != 0) { - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x24: /* LBU */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readbyte); // call readbyte - _add_r32_imm(REG_ESP, 4); // add esp,4 + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readbyte); /* call readbyte*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (RTREG != 0) { - _and_r32_imm(REG_EAX, 0xff); // and eax,0xff - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); // mov [rtreg].lo,eax + _and_r32_imm(REG_EAX, 0xff); /* and eax,0xff*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); /* mov [rtreg].lo,eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x25: /* LHU */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readword); // call readword - _add_r32_imm(REG_ESP, 4); // add esp,4 + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readword); /* call readword*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (RTREG != 0) { - _and_r32_imm(REG_EAX, 0xffff); // and eax,0xffff - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); // mov [rtreg].lo,eax + _and_r32_imm(REG_EAX, 0xffff); /* and eax,0xffff*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); /* mov [rtreg].lo,eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x26: /* LWR */ @@ -2097,95 +2097,95 @@ (INT16)nextop == SIMMVAL + 3) return recompile_lwlr_le(drc, RTREG, RSREG, SIMMVAL); } - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~3); // and eax,~3 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _pop_r32(REG_ECX); // pop ecx + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~3); /* and eax,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _pop_r32(REG_ECX); /* pop ecx*/ if (RTREG != 0) { - _and_r32_imm(REG_ECX, 3); // and ecx,3 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 3); /* and ecx,3*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x18); // xor ecx,0x18 - _shr_r32_cl(REG_EAX); // shr eax,cl - _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); // mov ebx,[rtreg].lo - _and_r32_m32bd(REG_EBX, REG_ECX, ldr_mask); // and ebx,[ldr_mask + ecx] - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _xor_r32_imm(REG_ECX, 0x18); /* xor ecx,0x18*/ + _shr_r32_cl(REG_EAX); /* shr eax,cl*/ + _mov_r32_m32abs(REG_EBX, LO(&mips3.r[RTREG])); /* mov ebx,[rtreg].lo*/ + _and_r32_m32bd(REG_EBX, REG_ECX, ldr_mask); /* and ebx,[ldr_mask + ecx]*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x27: /* LWU */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (RTREG != 0) { - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); // mov [rtreg].lo,eax + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[RTREG]), REG_EAX); /* mov [rtreg].lo,eax*/ } - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x28: /* SB */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RTREG != 0) - _push_m32abs(&mips3.r[RTREG]); // push dword [rtreg] + _push_m32abs(&mips3.r[RTREG]); /* push dword [rtreg]*/ else - _push_imm(0); // push 0 + _push_imm(0); /* push 0*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.writebyte); // call writebyte - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.writebyte); /* call writebyte*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x29: /* SH */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RTREG != 0) - _push_m32abs(&mips3.r[RTREG]); // push dword [rtreg] + _push_m32abs(&mips3.r[RTREG]); /* push dword [rtreg]*/ else - _push_imm(0); // push 0 + _push_imm(0); /* push 0*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.writeword); // call writeword - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.writeword); /* call writeword*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2a: /* SWL */ @@ -2196,54 +2196,54 @@ (INT16)nextop == SIMMVAL - 3) _add_m32abs_imm(&swlr_hits, 1); }*/ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~3); // and eax,~3 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32bd(REG_ECX, REG_ESP, 0); // mov ecx,[esp] + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~3); /* and eax,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32bd(REG_ECX, REG_ESP, 0); /* mov ecx,[esp]*/ - _and_r32_imm(REG_ECX, 3); // and ecx,3 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 3); /* and ecx,3*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (!mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x18); // xor ecx,0x18 + _xor_r32_imm(REG_ECX, 0x18); /* xor ecx,0x18*/ - _and_r32_m32bd(REG_EAX, REG_ECX, sdl_mask); // and eax,[sdl_mask + ecx] + _and_r32_m32bd(REG_EAX, REG_ECX, sdl_mask); /* and eax,[sdl_mask + ecx]*/ if (RTREG != 0) { - _mov_r32_m32abs(REG_EBX, &mips3.r[RTREG]); // mov ebx,[rtreg] - _shr_r32_cl(REG_EBX); // shr ebx,cl - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx + _mov_r32_m32abs(REG_EBX, &mips3.r[RTREG]); /* mov ebx,[rtreg]*/ + _shr_r32_cl(REG_EBX); /* shr ebx,cl*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ } - _pop_r32(REG_EBX); // pop ebx - _and_r32_imm(REG_EBX, ~3); // and ebx,~3 - _push_r32(REG_EAX); // push eax - _push_r32(REG_EBX); // push ebx - _call((void *)mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 + _pop_r32(REG_EBX); /* pop ebx*/ + _and_r32_imm(REG_EBX, ~3); /* and ebx,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _push_r32(REG_EBX); /* push ebx*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2b: /* SW */ /* _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] if (SIMMVAL != 0) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL + _add_r32_imm(REG_EAX, SIMMVAL); //add eax,SIMMVAL _mov_r32_r32(REG_EBX, REG_EAX); // mov ebx,eax _shr_r32_imm(REG_EBX, 16); // shr ebx,16 _mov_r32_m32isd(REG_EBX, REG_EBX, 4, ram_write_table); // mov ebx,[ebx*4 + ram_write_table] _cmp_r32_imm(REG_EBX, 0); // cmp ebx,0 _jcc_short_link(COND_NE, &link1); // jne fast if (RTREG != 0) - _push_m32abs(&mips3.r[RTREG]); // push dword [rtreg] + _push_m32abs(&mips3.r[RTREG]); //push dword [rtreg] else - _push_imm(0); // push 0 + _push_imm(0); //push 0 _push_r32(REG_EAX); // push eax drc_append_save_call_restore(drc, (void *)mips3.memory.writelong, 8); // call writelong _jmp_short_link(&link2); // jmp done @@ -2258,24 +2258,24 @@ _resolve_link(&link2); // fast: */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RTREG != 0) - _push_m32abs(&mips3.r[RTREG]); // push dword [rtreg] + _push_m32abs(&mips3.r[RTREG]); /* push dword [rtreg]*/ else - _push_imm(0); // push 0 + _push_imm(0); /* push 0*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2c: /* SDL */ @@ -2286,65 +2286,65 @@ (INT16)nextop == SIMMVAL - 7) _add_m32abs_imm(&sdlr_hits, 1); }*/ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~7); // and eax,~7 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _push_r32(REG_EAX); // push eax - _mov_r32_m32bd(REG_EAX, REG_ESP, 4); // mov eax,[esp+4] - _add_r32_imm(REG_EAX, 4); // add eax,4 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~7); /* and eax,~7*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _push_r32(REG_EAX); /* push eax*/ + _mov_r32_m32bd(REG_EAX, REG_ESP, 4); /* mov eax,[esp+4]*/ + _add_r32_imm(REG_EAX, 4); /* add eax,4*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (mips3.bigendian) - _pop_r32(REG_EDX); // pop edx + _pop_r32(REG_EDX); /* pop edx*/ else { - _mov_r32_r32(REG_EDX, REG_EAX); // mov edx,eax - _pop_r32(REG_EAX); // pop eax + _mov_r32_r32(REG_EDX, REG_EAX); /* mov edx,eax*/ + _pop_r32(REG_EAX); /* pop eax*/ } - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32bd(REG_ECX, REG_ESP, 0); // mov ecx,[esp] + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32bd(REG_ECX, REG_ESP, 0); /* mov ecx,[esp]*/ - _and_r32_imm(REG_ECX, 7); // and ecx,7 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 7); /* and ecx,7*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (!mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x38); // xor ecx,0x38 + _xor_r32_imm(REG_ECX, 0x38); /* xor ecx,0x38*/ - _and_r32_m32bd(REG_EAX, REG_ECX, sdl_mask + 1); // and eax,[sdl_mask + ecx + 4] - _and_r32_m32bd(REG_EDX, REG_ECX, sdl_mask); // and eax,[sdl_mask + ecx] + _and_r32_m32bd(REG_EAX, REG_ECX, sdl_mask + 1); /* and eax,[sdl_mask + ecx + 4]*/ + _and_r32_m32bd(REG_EDX, REG_ECX, sdl_mask); /* and eax,[sdl_mask + ecx]*/ if (RTREG != 0) { - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _mov_r64_m64abs(REG_ESI, REG_EBX, &mips3.r[RTREG]); // mov esi:ebx,[rtreg] - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_EBX, REG_ESI); // mov ebx,esi - _xor_r32_r32(REG_ESI, REG_ESI); // xor esi,esi - _resolve_link(&link1); // skip: - _shrd_r32_r32_cl(REG_EBX, REG_ESI); // shrd ebx,esi,cl - _shr_r32_cl(REG_ESI); // shr esi,cl - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _or_r32_r32(REG_EDX, REG_ESI); // or edx,esi - } - - _pop_r32(REG_EBX); // pop ebx - _and_r32_imm(REG_EBX, ~7); // and ebx,~7 - _lea_r32_m32bd(REG_ECX, REG_EBX, 4); // lea ecx,[ebx+4] - _push_r32(mips3.bigendian ? REG_EAX : REG_EDX); // push eax/edx - _push_r32(REG_ECX); // push ecx - _push_r32(mips3.bigendian ? REG_EDX : REG_EAX); // push edx/eax - _push_r32(REG_EBX); // push ebx - _call((void *)mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 - _call((void *)mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _mov_r64_m64abs(REG_ESI, REG_EBX, &mips3.r[RTREG]); /* mov esi:ebx,[rtreg]*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_EBX, REG_ESI); /* mov ebx,esi*/ + _xor_r32_r32(REG_ESI, REG_ESI); /* xor esi,esi*/ + _resolve_link(&link1); /* skip:*/ + _shrd_r32_r32_cl(REG_EBX, REG_ESI); /* shrd ebx,esi,cl*/ + _shr_r32_cl(REG_ESI); /* shr esi,cl*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _or_r32_r32(REG_EDX, REG_ESI); /* or edx,esi*/ + } + + _pop_r32(REG_EBX); /* pop ebx*/ + _and_r32_imm(REG_EBX, ~7); /* and ebx,~7*/ + _lea_r32_m32bd(REG_ECX, REG_EBX, 4); /* lea ecx,[ebx+4]*/ + _push_r32(mips3.bigendian ? REG_EAX : REG_EDX); /* push eax/edx*/ + _push_r32(REG_ECX); /* push ecx*/ + _push_r32(mips3.bigendian ? REG_EDX : REG_EAX); /* push edx/eax*/ + _push_r32(REG_EBX); /* push ebx*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2d: /* SDR */ @@ -2355,65 +2355,65 @@ (INT16)nextop == SIMMVAL + 7) _add_m32abs_imm(&sdlr_hits, 1); }*/ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~7); // and eax,~7 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _push_r32(REG_EAX); // push eax - _mov_r32_m32bd(REG_EAX, REG_ESP, 4); // mov eax,[esp+4] - _add_r32_imm(REG_EAX, 4); // add eax,4 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~7); /* and eax,~7*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _push_r32(REG_EAX); /* push eax*/ + _mov_r32_m32bd(REG_EAX, REG_ESP, 4); /* mov eax,[esp+4]*/ + _add_r32_imm(REG_EAX, 4); /* add eax,4*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ if (mips3.bigendian) - _pop_r32(REG_EDX); // pop edx + _pop_r32(REG_EDX); /* pop edx*/ else { - _mov_r32_r32(REG_EDX, REG_EAX); // mov edx,eax - _pop_r32(REG_EAX); // pop eax + _mov_r32_r32(REG_EDX, REG_EAX); /* mov edx,eax*/ + _pop_r32(REG_EAX); /* pop eax*/ } - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32bd(REG_ECX, REG_ESP, 0); // mov ecx,[esp] + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32bd(REG_ECX, REG_ESP, 0); /* mov ecx,[esp]*/ - _and_r32_imm(REG_ECX, 7); // and ecx,7 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 7); /* and ecx,7*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x38); // xor ecx,0x38 + _xor_r32_imm(REG_ECX, 0x38); /* xor ecx,0x38*/ - _and_r32_m32bd(REG_EAX, REG_ECX, sdr_mask + 1); // and eax,[sdr_mask + ecx + 4] - _and_r32_m32bd(REG_EDX, REG_ECX, sdr_mask); // and eax,[sdr_mask + ecx] + _and_r32_m32bd(REG_EAX, REG_ECX, sdr_mask + 1); /* and eax,[sdr_mask + ecx + 4]*/ + _and_r32_m32bd(REG_EDX, REG_ECX, sdr_mask); /* and eax,[sdr_mask + ecx]*/ if (RTREG != 0) { - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _mov_r64_m64abs(REG_ESI, REG_EBX, &mips3.r[RTREG]); // mov esi:ebx,[rtreg] - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_ESI, REG_EBX); // mov esi,ebx - _xor_r32_r32(REG_EBX, REG_EBX); // xor ebx,ebx - _resolve_link(&link1); // skip: - _shld_r32_r32_cl(REG_ESI, REG_EBX); // shld esi,ebx,cl - _shl_r32_cl(REG_EBX); // shl ebx,cl - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _or_r32_r32(REG_EDX, REG_ESI); // or edx,esi - } - - _pop_r32(REG_EBX); // pop ebx - _and_r32_imm(REG_EBX, ~7); // and ebx,~7 - _lea_r32_m32bd(REG_ECX, REG_EBX, 4); // lea ecx,[ebx+4] - _push_r32(mips3.bigendian ? REG_EAX : REG_EDX); // push eax/edx - _push_r32(REG_ECX); // push ecx - _push_r32(mips3.bigendian ? REG_EDX : REG_EAX); // push edx/eax - _push_r32(REG_EBX); // push ebx - _call((void *)mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 - _call((void *)mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _mov_r64_m64abs(REG_ESI, REG_EBX, &mips3.r[RTREG]); /* mov esi:ebx,[rtreg]*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_ESI, REG_EBX); /* mov esi,ebx*/ + _xor_r32_r32(REG_EBX, REG_EBX); /* xor ebx,ebx*/ + _resolve_link(&link1); /* skip:*/ + _shld_r32_r32_cl(REG_ESI, REG_EBX); /* shld esi,ebx,cl*/ + _shl_r32_cl(REG_EBX); /* shl ebx,cl*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _or_r32_r32(REG_EDX, REG_ESI); /* or edx,esi*/ + } + + _pop_r32(REG_EBX); /* pop ebx*/ + _and_r32_imm(REG_EBX, ~7); /* and ebx,~7*/ + _lea_r32_m32bd(REG_ECX, REG_EBX, 4); /* lea ecx,[ebx+4]*/ + _push_r32(mips3.bigendian ? REG_EAX : REG_EDX); /* push eax/edx*/ + _push_r32(REG_ECX); /* push ecx*/ + _push_r32(mips3.bigendian ? REG_EDX : REG_EAX); /* push edx/eax*/ + _push_r32(REG_EBX); /* push ebx*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2e: /* SWR */ @@ -2424,80 +2424,83 @@ (INT16)nextop == SIMMVAL + 3) _add_m32abs_imm(&swlr_hits, 1); }*/ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ if (SIMMVAL) - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax - _and_r32_imm(REG_EAX, ~3); // and eax,~3 - _push_r32(REG_EAX); // push eax - _call((void *)mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32bd(REG_ECX, REG_ESP, 0); // mov ecx,[esp] + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ + _and_r32_imm(REG_EAX, ~3); /* and eax,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32bd(REG_ECX, REG_ESP, 0); /* mov ecx,[esp]*/ - _and_r32_imm(REG_ECX, 3); // and ecx,3 - _shl_r32_imm(REG_ECX, 3); // shl ecx,3 + _and_r32_imm(REG_ECX, 3); /* and ecx,3*/ + _shl_r32_imm(REG_ECX, 3); /* shl ecx,3*/ if (mips3.bigendian) - _xor_r32_imm(REG_ECX, 0x18); // xor ecx,0x18 + _xor_r32_imm(REG_ECX, 0x18); /* xor ecx,0x18*/ - _and_r32_m32bd(REG_EAX, REG_ECX, sdr_mask + 1); // and eax,[sdr_mask + ecx + 4] + _and_r32_m32bd(REG_EAX, REG_ECX, sdr_mask + 1); /* and eax,[sdr_mask + ecx + 4]*/ if (RTREG != 0) { - _mov_r32_m32abs(REG_EBX, &mips3.r[RTREG]); // mov ebx,[rtreg] - _shl_r32_cl(REG_EBX); // shl ebx,cl - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx + _mov_r32_m32abs(REG_EBX, &mips3.r[RTREG]); /* mov ebx,[rtreg]*/ + _shl_r32_cl(REG_EBX); /* shl ebx,cl*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ } - _pop_r32(REG_EBX); // pop ebx - _and_r32_imm(REG_EBX, ~3); // and ebx,~3 - _push_r32(REG_EAX); // push eax - _push_r32(REG_EBX); // push ebx - _call((void *)mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 + _pop_r32(REG_EBX); /* pop ebx*/ + _and_r32_imm(REG_EBX, ~3); /* and ebx,~3*/ + _push_r32(REG_EAX); /* push eax*/ + _push_r32(REG_EBX); /* push ebx*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2f: /* CACHE */ return RECOMPILE_SUCCESSFUL_CP(1,4); +#if 0 -// case 0x30: /* LL */ logerror("mips3 Unhandled op: LL\n"); break; + case 0x30: /* LL */ log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: LL\n"); break; + +#endif case 0x31: /* LWC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_m32abs_r32(&mips3.cpr[1][RTREG], REG_EAX); // mov [rtreg],eax - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_m32abs_r32(&mips3.cpr[1][RTREG], REG_EAX); /* mov [rtreg],eax*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x32: /* LWC2 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_m32abs_r32(&mips3.cpr[2][RTREG], REG_EAX); // mov [rtreg],eax - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_m32abs_r32(&mips3.cpr[2][RTREG], REG_EAX); /* mov [rtreg],eax*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x33: /* PREF */ @@ -2505,254 +2508,254 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); else { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; } -// case 0x34: /* LLD */ logerror("mips3 Unhandled op: LLD\n"); break; +/* case 0x34: // LLD log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: LLD\n"); break; */ case 0x35: /* LDC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call((void *)mips3.memory.readlong); // call readlong - _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.cpr[1][RTREG]) : LO(&mips3.cpr[1][RTREG]), REG_EAX);// mov [rtreg].hi/lo,eax + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.cpr[1][RTREG]) : LO(&mips3.cpr[1][RTREG]), REG_EAX);/* mov [rtreg].hi/lo,eax*/ if (RSREG != 0 && (SIMMVAL+4) != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL+4); // add eax,SIMMVAL+4 - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL+4); /* add eax,SIMMVAL+4*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if ((SIMMVAL+4) != 0) - _push_imm(SIMMVAL+4); // push SIMMVAL+4 - _call((void *)mips3.memory.readlong); // call readlong - _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.cpr[1][RTREG]) : HI(&mips3.cpr[1][RTREG]), REG_EAX);// mov [rtreg].lo/hi,eax + _push_imm(SIMMVAL+4); /* push SIMMVAL+4*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.cpr[1][RTREG]) : HI(&mips3.cpr[1][RTREG]), REG_EAX);/* mov [rtreg].lo/hi,eax*/ - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x36: /* LDC2 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call((void *)mips3.memory.readlong); // call readlong - _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.cpr[2][RTREG]) : LO(&mips3.cpr[2][RTREG]), REG_EAX);// mov [rtreg].hi/lo,eax + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.cpr[2][RTREG]) : LO(&mips3.cpr[2][RTREG]), REG_EAX);/* mov [rtreg].hi/lo,eax*/ if (RSREG != 0 && (SIMMVAL+4) != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL+4); // add eax,SIMMVAL+4 - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL+4); /* add eax,SIMMVAL+4*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if ((SIMMVAL+4) != 0) - _push_imm(SIMMVAL+4); // push SIMMVAL+4 - _call((void *)mips3.memory.readlong); // call readlong - _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.cpr[2][RTREG]) : HI(&mips3.cpr[2][RTREG]), REG_EAX);// mov [rtreg].lo/hi,eax + _push_imm(SIMMVAL+4); /* push SIMMVAL+4*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.cpr[2][RTREG]) : HI(&mips3.cpr[2][RTREG]), REG_EAX);/* mov [rtreg].lo/hi,eax*/ - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x37: /* LD */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call((void *)mips3.memory.readlong); // call readlong + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ if (RTREG != 0) - _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.r[RTREG]) : LO(&mips3.r[RTREG]), REG_EAX); // mov [rtreg].hi/lo,eax + _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.r[RTREG]) : LO(&mips3.r[RTREG]), REG_EAX); /* mov [rtreg].hi/lo,eax*/ if (RSREG != 0 && (SIMMVAL+4) != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL+4); // add eax,SIMMVAL+4 - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL+4); /* add eax,SIMMVAL+4*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if ((SIMMVAL+4) != 0) - _push_imm(SIMMVAL+4); // push SIMMVAL+4 - _call((void *)mips3.memory.readlong); // call readlong + _push_imm(SIMMVAL+4); /* push SIMMVAL+4*/ + _call((void *)mips3.memory.readlong); /* call readlong*/ if (RTREG != 0) - _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.r[RTREG]) : HI(&mips3.r[RTREG]), REG_EAX); // mov [rtreg].lo/hi,eax + _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.r[RTREG]) : HI(&mips3.r[RTREG]), REG_EAX); /* mov [rtreg].lo/hi,eax*/ - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); -// case 0x38: /* SC */ logerror("mips3 Unhandled op: SC\n"); break; +/* case 0x38: // SC log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: SC\n"); break;*/ case 0x39: /* SWC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_m32abs(&mips3.cpr[1][RTREG]); // push dword [rtreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_m32abs(&mips3.cpr[1][RTREG]); /* push dword [rtreg]*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x3a: /* SWC2 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_m32abs(&mips3.cpr[2][RTREG]); // push dword [rtreg] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_m32abs(&mips3.cpr[2][RTREG]); /* push dword [rtreg]*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call(mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call(mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); -// case 0x3b: /* SWC3 */ invalid_instruction(op); break; -// case 0x3c: /* SCD */ logerror("mips3 Unhandled op: SCD\n"); break; +/* case 0x3b: // SWC3 invalid_instruction(op); break;*/ +/* case 0x3c: // SCD log_cb(RETRO_LOG_DEBUG, LOGPRE "mips3 Unhandled op: SCD\n"); break;*/ case 0x3d: /* SDC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_m32abs(mips3.bigendian ? HI(&mips3.cpr[1][RTREG]) : LO(&mips3.cpr[1][RTREG]));// push dword [rtreg].lo/hi + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_m32abs(mips3.bigendian ? HI(&mips3.cpr[1][RTREG]) : LO(&mips3.cpr[1][RTREG]));/* push dword [rtreg].lo/hi*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call((void *)mips3.memory.writelong); // call writelong + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ - _push_m32abs(mips3.bigendian ? LO(&mips3.cpr[1][RTREG]) : HI(&mips3.cpr[1][RTREG]));// push dword [rtreg].hi/lo + _push_m32abs(mips3.bigendian ? LO(&mips3.cpr[1][RTREG]) : HI(&mips3.cpr[1][RTREG]));/* push dword [rtreg].hi/lo*/ if (RSREG != 0 && (SIMMVAL+4) != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL+4); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL+4); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if ((SIMMVAL+4) != 0) - _push_imm(SIMMVAL+4); // push SIMMVAL - _call((void *)mips3.memory.writelong); // call writelong + _push_imm(SIMMVAL+4); /* push SIMMVAL*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ - _add_r32_imm(REG_ESP, 16); // add esp,16 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_ESP, 16); /* add esp,16*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x3e: /* SDC2 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_m32abs(mips3.bigendian ? HI(&mips3.cpr[2][RTREG]) : LO(&mips3.cpr[2][RTREG]));// push dword [rtreg].lo/hi + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_m32abs(mips3.bigendian ? HI(&mips3.cpr[2][RTREG]) : LO(&mips3.cpr[2][RTREG]));/* push dword [rtreg].lo/hi*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call((void *)mips3.memory.writelong); // call writelong + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ - _push_m32abs(mips3.bigendian ? LO(&mips3.cpr[2][RTREG]) : HI(&mips3.cpr[2][RTREG]));// push dword [rtreg].hi/lo + _push_m32abs(mips3.bigendian ? LO(&mips3.cpr[2][RTREG]) : HI(&mips3.cpr[2][RTREG]));/* push dword [rtreg].hi/lo*/ if (RSREG != 0 && (SIMMVAL+4) != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL+4); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL+4); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if ((SIMMVAL+4) != 0) - _push_imm(SIMMVAL+4); // push SIMMVAL - _call((void *)mips3.memory.writelong); // call writelong + _push_imm(SIMMVAL+4); /* push SIMMVAL*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ - _add_r32_imm(REG_ESP, 16); // add esp,16 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_ESP, 16); /* add esp,16*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x3f: /* SD */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ if (RTREG != 0) - _push_m32abs(mips3.bigendian ? HI(&mips3.r[RTREG]) : LO(&mips3.r[RTREG]));// push dword [rtreg].lo/hi + _push_m32abs(mips3.bigendian ? HI(&mips3.r[RTREG]) : LO(&mips3.r[RTREG]));/* push dword [rtreg].lo/hi*/ else - _push_imm(0); // push 0 + _push_imm(0); /* push 0*/ if (RSREG != 0 && SIMMVAL != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if (SIMMVAL != 0) - _push_imm(SIMMVAL); // push SIMMVAL - _call((void *)mips3.memory.writelong); // call writelong + _push_imm(SIMMVAL); /* push SIMMVAL*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ if (RTREG != 0) - _push_m32abs(mips3.bigendian ? LO(&mips3.r[RTREG]) : HI(&mips3.r[RTREG]));// push dword [rtreg].hi/lo + _push_m32abs(mips3.bigendian ? LO(&mips3.r[RTREG]) : HI(&mips3.r[RTREG]));/* push dword [rtreg].hi/lo*/ else - _push_imm(0); // push 0 + _push_imm(0); /* push 0*/ if (RSREG != 0 && (SIMMVAL+4) != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_imm(REG_EAX, SIMMVAL+4); // add eax,SIMMVAL - _push_r32(REG_EAX); // push eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_imm(REG_EAX, SIMMVAL+4); /* add eax,SIMMVAL*/ + _push_r32(REG_EAX); /* push eax*/ } else if (RSREG != 0) - _push_m32abs(&mips3.r[RSREG]); // push [rsreg] + _push_m32abs(&mips3.r[RSREG]); /* push [rsreg]*/ else if ((SIMMVAL+4) != 0) - _push_imm(SIMMVAL+4); // push SIMMVAL - _call((void *)mips3.memory.writelong); // call writelong + _push_imm(SIMMVAL+4); /* push SIMMVAL*/ + _call((void *)mips3.memory.writelong); /* call writelong*/ - _add_r32_imm(REG_ESP, 16); // add esp,16 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _add_r32_imm(REG_ESP, 16); /* add esp,16*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); -// default: /* ??? */ invalid_instruction(op); break; +/* default: */ /*invalid_instruction(op); break;*/ } return RECOMPILE_UNIMPLEMENTED; } @@ -2774,11 +2777,11 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ if (SHIFT != 0) - _shl_r32_imm(REG_EAX, SHIFT); // shl eax,SHIFT - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _shl_r32_imm(REG_EAX, SHIFT); /* shl eax,SHIFT*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2788,14 +2791,14 @@ case 0x01: /* MOVF - R5000*/ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; } - _cmp_m8abs_imm(&mips3.cf[1][(op >> 18) & 7], 0); // cmp [cf[x]],0 - _jcc_short_link(((op >> 16) & 1) ? COND_Z : COND_NZ, &link1); // jz/nz skip - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax - _resolve_link(&link1); // skip: + _cmp_m8abs_imm(&mips3.cf[1][(op >> 18) & 7], 0); /* cmp [cf[x]],0*/ + _jcc_short_link(((op >> 16) & 1) ? COND_Z : COND_NZ, &link1); /* jz/nz skip*/ + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x02: /* SRL */ @@ -2803,11 +2806,11 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ if (SHIFT != 0) - _shr_r32_imm(REG_EAX, SHIFT); // shr eax,SHIFT - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _shr_r32_imm(REG_EAX, SHIFT); /* shr eax,SHIFT*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2819,11 +2822,11 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ if (SHIFT != 0) - _sar_r32_imm(REG_EAX, SHIFT); // sar eax,SHIFT - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _sar_r32_imm(REG_EAX, SHIFT); /* sar eax,SHIFT*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2835,14 +2838,14 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ if (RSREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); // mov ecx,[rsreg] - _shl_r32_cl(REG_EAX); // shl eax,cl + _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); /* mov ecx,[rsreg]*/ + _shl_r32_cl(REG_EAX); /* shl eax,cl*/ } - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2854,14 +2857,14 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ if (RSREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); // mov ecx,[rsreg] - _shr_r32_cl(REG_EAX); // shr eax,cl + _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); /* mov ecx,[rsreg]*/ + _shr_r32_cl(REG_EAX); /* shr eax,cl*/ } - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2873,14 +2876,14 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ if (RSREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); // mov ecx,[rsreg] - _sar_r32_cl(REG_EAX); // sar eax,cl + _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); /* mov ecx,[rsreg]*/ + _sar_r32_cl(REG_EAX); /* sar eax,cl*/ } - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2888,55 +2891,55 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x08: /* JR */ - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_r32_m32abs(REG_EDI, &mips3.r[RSREG]); // mov edi,[rsreg] + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_r32_m32abs(REG_EDI, &mips3.r[RSREG]); /* mov edi,[rsreg]*/ return RECOMPILE_SUCCESSFUL_CP(1+cycles,0) | RECOMPILE_END_OF_STRING | RECOMPILE_ADD_DISPATCH; case 0x09: /* JALR */ - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ if (RDREG != 0) - _mov_m64abs_imm32(&mips3.r[RDREG], pc + 8); // mov [rdreg],pc + 8 - _mov_r32_m32abs(REG_EDI, &mips3.r[RSREG]); // mov edi,[rsreg] + _mov_m64abs_imm32(&mips3.r[RDREG], pc + 8); /* mov [rdreg],pc + 8*/ + _mov_r32_m32abs(REG_EDI, &mips3.r[RSREG]); /* mov edi,[rsreg]*/ return RECOMPILE_SUCCESSFUL_CP(1+cycles,0) | RECOMPILE_END_OF_STRING | RECOMPILE_ADD_DISPATCH; case 0x0a: /* MOVZ - R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; } if (RDREG != 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_short_link(COND_NZ, &link1); // jnz skip - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] - _resolve_link(&link1); // skip: + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_short_link(COND_NZ, &link1); /* jnz skip*/ + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ + _resolve_link(&link1); /* skip:*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0b: /* MOVN - R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; } if (RDREG != 0) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] - _resolve_link(&link1); // skip: + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ + _resolve_link(&link1); /* skip:*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0c: /* SYSCALL */ - _jmp((void *)mips3.generate_syscall_exception); // jmp generate_syscall_exception + _jmp((void *)mips3.generate_syscall_exception); /* jmp generate_syscall_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; case 0x0d: /* BREAK */ - _jmp((void *)mips3.generate_break_exception); // jmp generate_break_exception + _jmp((void *)mips3.generate_break_exception); /* jmp generate_break_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_MAY_CAUSE_EXCEPTION | RECOMPILE_END_OF_STRING; case 0x0f: /* SYNC */ @@ -2944,20 +2947,20 @@ case 0x10: /* MFHI */ if (RDREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.hi); // mov [rdreg],[hi] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.hi); /* mov [rdreg],[hi]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x11: /* MTHI */ - _mov_m64abs_m64abs(&mips3.hi, &mips3.r[RSREG]); // mov [hi],[rsreg] + _mov_m64abs_m64abs(&mips3.hi, &mips3.r[RSREG]); /* mov [hi],[rsreg]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x12: /* MFLO */ if (RDREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.lo); // mov [rdreg],[lo] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.lo); /* mov [rdreg],[lo]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x13: /* MTLO */ - _mov_m64abs_m64abs(&mips3.lo, &mips3.r[RSREG]); // mov [lo],[rsreg] + _mov_m64abs_m64abs(&mips3.lo, &mips3.r[RSREG]); /* mov [lo],[rsreg]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x14: /* DSLLV */ @@ -2965,19 +2968,19 @@ { if (RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ if (RSREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); // mov ecx,[rsreg] - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_EDX, REG_EAX); // mov edx,eax - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - _resolve_link(&link1); // skip: - _shld_r32_r32_cl(REG_EDX, REG_EAX); // shld edx,eax,cl - _shl_r32_cl(REG_EAX); // shl eax,cl + _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); /* mov ecx,[rsreg]*/ + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_EDX, REG_EAX); /* mov edx,eax*/ + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + _resolve_link(&link1); /* skip:*/ + _shld_r32_r32_cl(REG_EDX, REG_EAX); /* shld edx,eax,cl*/ + _shl_r32_cl(REG_EAX); /* shl eax,cl*/ } - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -2989,19 +2992,19 @@ { if (RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ if (RSREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); // mov ecx,[rsreg] - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_EAX, REG_EDX); // mov eax,edx - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _resolve_link(&link1); // skip: - _shrd_r32_r32_cl(REG_EAX, REG_EDX); // shrd eax,edx,cl - _shr_r32_cl(REG_EDX); // shr edx,cl + _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); /* mov ecx,[rsreg]*/ + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_EAX, REG_EDX); /* mov eax,edx*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _resolve_link(&link1); /* skip:*/ + _shrd_r32_r32_cl(REG_EAX, REG_EDX); /* shrd eax,edx,cl*/ + _shr_r32_cl(REG_EDX); /* shr edx,cl*/ } - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3013,19 +3016,19 @@ { if (RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ if (RSREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); // mov ecx,[rsreg] - _test_r32_imm(REG_ECX, 0x20); // test ecx,0x20 - _jcc_short_link(COND_Z, &link1); // jz skip - _mov_r32_r32(REG_EAX, REG_EDX); // mov eax,edx - _cdq(); // cdq - _resolve_link(&link1); // skip: - _shrd_r32_r32_cl(REG_EAX, REG_EDX); // shrd eax,edx,cl - _sar_r32_cl(REG_EDX); // sar edx,cl + _mov_r32_m32abs(REG_ECX, &mips3.r[RSREG]); /* mov ecx,[rsreg]*/ + _test_r32_imm(REG_ECX, 0x20); /* test ecx,0x20*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + _mov_r32_r32(REG_EAX, REG_EDX); /* mov eax,edx*/ + _cdq(); /* cdq*/ + _resolve_link(&link1); /* skip:*/ + _shrd_r32_r32_cl(REG_EAX, REG_EDX); /* shrd eax,edx,cl*/ + _sar_r32_cl(REG_EDX); /* sar edx,cl*/ } - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3033,193 +3036,193 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x18: /* MULT */ - _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); // mov ecx,[rtreg].lo - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg].lo - _imul_r32(REG_ECX); // imul ecx - _push_r32(REG_EDX); // push edx - _cdq(); // cdq - _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); // mov [lo],edx:eax - _pop_r32(REG_EAX); // pop eax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); // mov [hi],edx:eax + _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); /* mov ecx,[rtreg].lo*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg].lo*/ + _imul_r32(REG_ECX); /* imul ecx*/ + _push_r32(REG_EDX); /* push edx*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); /* mov [lo],edx:eax*/ + _pop_r32(REG_EAX); /* pop eax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); /* mov [hi],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(4,4); case 0x19: /* MULTU */ - _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); // mov ecx,[rtreg].lo - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg].lo - _mul_r32(REG_ECX); // mul ecx - _push_r32(REG_EDX); // push edx - _cdq(); // cdq - _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); // mov [lo],edx:eax - _pop_r32(REG_EAX); // pop eax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); // mov [hi],edx:eax + _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); /* mov ecx,[rtreg].lo*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg].lo*/ + _mul_r32(REG_ECX); /* mul ecx*/ + _push_r32(REG_EDX); /* push edx*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); /* mov [lo],edx:eax*/ + _pop_r32(REG_EAX); /* pop eax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); /* mov [hi],edx:eax*/ return RECOMPILE_SUCCESSFUL_CP(4,4); case 0x1a: /* DIV */ if (RTREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); // mov ecx,[rtreg].lo - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg].lo - _cdq(); // cdq - _cmp_r32_imm(REG_ECX, 0); // cmp ecx,0 - _jcc_short_link(COND_E, &link1); // je skip - _idiv_r32(REG_ECX); // idiv ecx - _push_r32(REG_EDX); // push edx - _cdq(); // cdq - _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); // mov [lo],edx:eax - _pop_r32(REG_EAX); // pop eax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); // mov [hi],edx:eax - _resolve_link(&link1); // skip: + _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); /* mov ecx,[rtreg].lo*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg].lo*/ + _cdq(); /* cdq*/ + _cmp_r32_imm(REG_ECX, 0); /* cmp ecx,0*/ + _jcc_short_link(COND_E, &link1); /* je skip*/ + _idiv_r32(REG_ECX); /* idiv ecx*/ + _push_r32(REG_EDX); /* push edx*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); /* mov [lo],edx:eax*/ + _pop_r32(REG_EAX); /* pop eax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); /* mov [hi],edx:eax*/ + _resolve_link(&link1); /* skip:*/ } return RECOMPILE_SUCCESSFUL_CP(36,4); case 0x1b: /* DIVU */ if (RTREG != 0) { - _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); // mov ecx,[rtreg].lo - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg].lo - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _cmp_r32_imm(REG_ECX, 0); // cmp ecx,0 - _jcc_short_link(COND_E, &link1); // je skip - _div_r32(REG_ECX); // div ecx - _push_r32(REG_EDX); // push edx - _cdq(); // cdq - _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); // mov [lo],edx:eax - _pop_r32(REG_EAX); // pop eax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); // mov [hi],edx:eax - _resolve_link(&link1); // skip: + _mov_r32_m32abs(REG_ECX, &mips3.r[RTREG]); /* mov ecx,[rtreg].lo*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg].lo*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _cmp_r32_imm(REG_ECX, 0); /* cmp ecx,0*/ + _jcc_short_link(COND_E, &link1); /* je skip*/ + _div_r32(REG_ECX); /* div ecx*/ + _push_r32(REG_EDX); /* push edx*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.lo, REG_EDX, REG_EAX); /* mov [lo],edx:eax*/ + _pop_r32(REG_EAX); /* pop eax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_EAX); /* mov [hi],edx:eax*/ + _resolve_link(&link1); /* skip:*/ } return RECOMPILE_SUCCESSFUL_CP(36,4); case 0x1c: /* DMULT */ - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _cmp_r32_imm(REG_EDX, 0); // cmp edx,0 - _jcc_short_link(COND_GE, &link1); // jge skip1 - _mov_r32_r32(REG_ECX, REG_EDX); // mov ecx,edx - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _neg_r32(REG_EAX); // neg eax - _sbb_r32_r32(REG_EDX, REG_ECX); // sbb edx,ecx - _resolve_link(&link1); // skip1: - _mov_m64abs_r64(&dmult_temp1, REG_EDX, REG_EAX); // mov [dmult_temp1],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _cmp_r32_imm(REG_EDX, 0); /* cmp edx,0*/ + _jcc_short_link(COND_GE, &link1); /* jge skip1*/ + _mov_r32_r32(REG_ECX, REG_EDX); /* mov ecx,edx*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _neg_r32(REG_EAX); /* neg eax*/ + _sbb_r32_r32(REG_EDX, REG_ECX); /* sbb edx,ecx*/ + _resolve_link(&link1); /* skip1:*/ + _mov_m64abs_r64(&dmult_temp1, REG_EDX, REG_EAX); /* mov [dmult_temp1],edx:eax*/ - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] - _cmp_r32_imm(REG_EDX, 0); // cmp edx,0 - _jcc_short_link(COND_GE, &link2); // jge skip2 - _mov_r32_r32(REG_ECX, REG_EDX); // mov ecx,edx - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _neg_r32(REG_EAX); // neg eax - _sbb_r32_r32(REG_EDX, REG_ECX); // sbb edx,ecx - _resolve_link(&link2); // skip2: - _mov_m64abs_r64(&dmult_temp2, REG_EDX, REG_EAX); // mov [dmult_temp2],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ + _cmp_r32_imm(REG_EDX, 0); /* cmp edx,0*/ + _jcc_short_link(COND_GE, &link2); /* jge skip2*/ + _mov_r32_r32(REG_ECX, REG_EDX); /* mov ecx,edx*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _neg_r32(REG_EAX); /* neg eax*/ + _sbb_r32_r32(REG_EDX, REG_ECX); /* sbb edx,ecx*/ + _resolve_link(&link2); /* skip2:*/ + _mov_m64abs_r64(&dmult_temp2, REG_EDX, REG_EAX); /* mov [dmult_temp2],edx:eax*/ - _mov_r32_m32abs(REG_EAX, LO(&dmult_temp1)); // mov eax,[dmult_temp1].lo - _mul_m32abs(LO(&dmult_temp2)); // mul [dmult_temp2].lo - _mov_r32_r32(REG_ECX, REG_EDX); // mov ecx,edx - _xor_r32_r32(REG_EBX, REG_EBX); // xor ebx,ebx - _mov_m32abs_r32(LO(&mips3.lo), REG_EAX); // mov [lo].lo,eax - - _mov_r32_m32abs(REG_EAX, HI(&dmult_temp1)); // mov eax,[dmult_temp1].hi - _mul_m32abs(LO(&dmult_temp2)); // mul [dmult_temp2].lo - _add_r32_r32(REG_ECX, REG_EAX); // add ecx,eax - _adc_r32_r32(REG_EBX, REG_EDX); // adc ebx,edx - - _mov_r32_m32abs(REG_EAX, LO(&dmult_temp1)); // mov eax,[dmult_temp1].lo - _mul_m32abs(HI(&dmult_temp2)); // mul [dmult_temp2].hi - _add_r32_r32(REG_ECX, REG_EAX); // add ecx,eax - _adc_r32_r32(REG_EBX, REG_EDX); // adc ebx,edx - _mov_m32abs_r32(HI(&mips3.lo), REG_ECX); // mov [lo].hi,ecx - - _mov_r32_m32abs(REG_EAX, HI(&dmult_temp1)); // mov eax,[dmult_temp1].hi - _mul_m32abs(HI(&dmult_temp2)); // mul [dmult_temp2].hi - _add_r32_r32(REG_EBX, REG_EAX); // add ebx,eax - _adc_r32_imm(REG_EDX, 0); // adc edx,0 - _mov_m32abs_r32(LO(&mips3.hi), REG_EBX); // mov [hi].lo,ebx - _mov_m32abs_r32(HI(&mips3.hi), REG_EDX); // mov [hi].hi,edx - - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _xor_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // xor eax,[rtreg].hi - _jcc_short_link(COND_NS, &link3); // jns noflip - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - _xor_r32_r32(REG_EBX, REG_EBX); // xor ebx,ebx - _xor_r32_r32(REG_ECX, REG_ECX); // xor ecx,ecx - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _sub_r32_m32abs(REG_EAX, LO(&mips3.lo)); // sub eax,[lo].lo - _sbb_r32_m32abs(REG_EBX, HI(&mips3.lo)); // sbb ebx,[lo].hi - _sbb_r32_m32abs(REG_ECX, LO(&mips3.hi)); // sbb ecx,[hi].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.hi)); // sbb edx,[hi].hi - _mov_m64abs_r64(&mips3.lo, REG_EBX, REG_EAX); // mov [lo],ebx:eax - _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_ECX); // mov [lo],edx:ecx - _resolve_link(&link3); // noflip: + _mov_r32_m32abs(REG_EAX, LO(&dmult_temp1)); /* mov eax,[dmult_temp1].lo*/ + _mul_m32abs(LO(&dmult_temp2)); /* mul [dmult_temp2].lo*/ + _mov_r32_r32(REG_ECX, REG_EDX); /* mov ecx,edx*/ + _xor_r32_r32(REG_EBX, REG_EBX); /* xor ebx,ebx*/ + _mov_m32abs_r32(LO(&mips3.lo), REG_EAX); /* mov [lo].lo,eax*/ + + _mov_r32_m32abs(REG_EAX, HI(&dmult_temp1)); /* mov eax,[dmult_temp1].hi*/ + _mul_m32abs(LO(&dmult_temp2)); /* mul [dmult_temp2].lo*/ + _add_r32_r32(REG_ECX, REG_EAX); /* add ecx,eax*/ + _adc_r32_r32(REG_EBX, REG_EDX); /* adc ebx,edx*/ + + _mov_r32_m32abs(REG_EAX, LO(&dmult_temp1)); /* mov eax,[dmult_temp1].lo*/ + _mul_m32abs(HI(&dmult_temp2)); /* mul [dmult_temp2].hi*/ + _add_r32_r32(REG_ECX, REG_EAX); /* add ecx,eax*/ + _adc_r32_r32(REG_EBX, REG_EDX); /* adc ebx,edx*/ + _mov_m32abs_r32(HI(&mips3.lo), REG_ECX); /* mov [lo].hi,ecx*/ + + _mov_r32_m32abs(REG_EAX, HI(&dmult_temp1)); /* mov eax,[dmult_temp1].hi*/ + _mul_m32abs(HI(&dmult_temp2)); /* mul [dmult_temp2].hi*/ + _add_r32_r32(REG_EBX, REG_EAX); /* add ebx,eax*/ + _adc_r32_imm(REG_EDX, 0); /* adc edx,0*/ + _mov_m32abs_r32(LO(&mips3.hi), REG_EBX); /* mov [hi].lo,ebx*/ + _mov_m32abs_r32(HI(&mips3.hi), REG_EDX); /* mov [hi].hi,edx*/ + + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _xor_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* xor eax,[rtreg].hi*/ + _jcc_short_link(COND_NS, &link3); /* jns noflip*/ + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + _xor_r32_r32(REG_EBX, REG_EBX); /* xor ebx,ebx*/ + _xor_r32_r32(REG_ECX, REG_ECX); /* xor ecx,ecx*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _sub_r32_m32abs(REG_EAX, LO(&mips3.lo)); /* sub eax,[lo].lo*/ + _sbb_r32_m32abs(REG_EBX, HI(&mips3.lo)); /* sbb ebx,[lo].hi*/ + _sbb_r32_m32abs(REG_ECX, LO(&mips3.hi)); /* sbb ecx,[hi].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.hi)); /* sbb edx,[hi].hi*/ + _mov_m64abs_r64(&mips3.lo, REG_EBX, REG_EAX); /* mov [lo],ebx:eax*/ + _mov_m64abs_r64(&mips3.hi, REG_EDX, REG_ECX); /* mov [lo],edx:ecx*/ + _resolve_link(&link3); /* noflip:*/ return RECOMPILE_SUCCESSFUL_CP(8,4); case 0x1d: /* DMULTU */ - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _mul_m32abs(LO(&mips3.r[RTREG])); // mul [rtreg].lo - _mov_r32_r32(REG_ECX, REG_EDX); // mov ecx,edx - _xor_r32_r32(REG_EBX, REG_EBX); // xor ebx,ebx - _mov_m32abs_r32(LO(&mips3.lo), REG_EAX); // mov [lo].lo,eax - - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _mul_m32abs(LO(&mips3.r[RTREG])); // mul [rtreg].lo - _add_r32_r32(REG_ECX, REG_EAX); // add ecx,eax - _adc_r32_r32(REG_EBX, REG_EDX); // adc ebx,edx - - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _mul_m32abs(HI(&mips3.r[RTREG])); // mul [rtreg].hi - _add_r32_r32(REG_ECX, REG_EAX); // add ecx,eax - _adc_r32_r32(REG_EBX, REG_EDX); // adc ebx,edx - _mov_m32abs_r32(HI(&mips3.lo), REG_ECX); // mov [lo].hi,ecx - - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _mul_m32abs(HI(&mips3.r[RTREG])); // mul [rtreg].hi - _add_r32_r32(REG_EBX, REG_EAX); // add ebx,eax - _adc_r32_imm(REG_EDX, 0); // adc edx,0 - _mov_m32abs_r32(LO(&mips3.hi), REG_EBX); // mov [hi].lo,ebx - _mov_m32abs_r32(HI(&mips3.hi), REG_EDX); // mov [hi].hi,edx + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _mul_m32abs(LO(&mips3.r[RTREG])); /* mul [rtreg].lo*/ + _mov_r32_r32(REG_ECX, REG_EDX); /* mov ecx,edx*/ + _xor_r32_r32(REG_EBX, REG_EBX); /* xor ebx,ebx*/ + _mov_m32abs_r32(LO(&mips3.lo), REG_EAX); /* mov [lo].lo,eax*/ + + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _mul_m32abs(LO(&mips3.r[RTREG])); /* mul [rtreg].lo*/ + _add_r32_r32(REG_ECX, REG_EAX); /* add ecx,eax*/ + _adc_r32_r32(REG_EBX, REG_EDX); /* adc ebx,edx*/ + + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _mul_m32abs(HI(&mips3.r[RTREG])); /* mul [rtreg].hi*/ + _add_r32_r32(REG_ECX, REG_EAX); /* add ecx,eax*/ + _adc_r32_r32(REG_EBX, REG_EDX); /* adc ebx,edx*/ + _mov_m32abs_r32(HI(&mips3.lo), REG_ECX); /* mov [lo].hi,ecx*/ + + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _mul_m32abs(HI(&mips3.r[RTREG])); /* mul [rtreg].hi*/ + _add_r32_r32(REG_EBX, REG_EAX); /* add ebx,eax*/ + _adc_r32_imm(REG_EDX, 0); /* adc edx,0*/ + _mov_m32abs_r32(LO(&mips3.hi), REG_EBX); /* mov [hi].lo,ebx*/ + _mov_m32abs_r32(HI(&mips3.hi), REG_EDX); /* mov [hi].hi,edx*/ return RECOMPILE_SUCCESSFUL_CP(8,4); case 0x1e: /* DDIV */ - _push_imm(&mips3.r[RTREG]); // push [rtreg] - _push_imm(&mips3.r[RSREG]); // push [rsreg] - _call((void *)ddiv); // call ddiv - _add_r32_imm(REG_ESP, 8); // add esp,8 + _push_imm(&mips3.r[RTREG]); /* push [rtreg]*/ + _push_imm(&mips3.r[RSREG]); /* push [rsreg]*/ + _call((void *)ddiv); /* call ddiv*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ return RECOMPILE_SUCCESSFUL_CP(68,4); case 0x1f: /* DDIVU */ - _push_imm(&mips3.r[RTREG]); // push [rtreg] - _push_imm(&mips3.r[RSREG]); // push [rsreg] - _call((void *)ddivu); // call ddivu - _add_r32_imm(REG_ESP, 8); // add esp,8 + _push_imm(&mips3.r[RTREG]); /* push [rtreg]*/ + _push_imm(&mips3.r[RSREG]); /* push [rsreg]*/ + _call((void *)ddivu); /* call ddivu*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ return RECOMPILE_SUCCESSFUL_CP(68,4); case 0x20: /* ADD */ if (RSREG != 0 && RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // add eax,[rtreg] - _jcc(COND_O, mips3.generate_overflow_exception); // jo generate_overflow_exception + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* add eax,[rtreg]*/ + _jcc(COND_O, mips3.generate_overflow_exception); /* jo generate_overflow_exception*/ if (RDREG != 0) { - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else if (RDREG != 0) { if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3231,22 +3234,22 @@ { if (RSREG != 0 && RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // add eax,[rtreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* add eax,[rtreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3256,29 +3259,29 @@ case 0x22: /* SUB */ if (RSREG != 0 && RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _sub_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // sub eax,[rtreg] - _jcc(COND_O, mips3.generate_overflow_exception); // jo generate_overflow_exception + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _sub_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* sub eax,[rtreg]*/ + _jcc(COND_O, mips3.generate_overflow_exception); /* jo generate_overflow_exception*/ if (RDREG != 0) { - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else if (RDREG != 0) { if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] - _neg_r32(REG_EAX); // neg eax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ + _neg_r32(REG_EAX); /* neg eax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3290,23 +3293,23 @@ { if (RSREG != 0 && RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _sub_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // sub eax,[rtreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _sub_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* sub eax,[rtreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RSREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[rtreg] - _neg_r32(REG_EAX); // neg eax - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[rtreg]*/ + _neg_r32(REG_EAX); /* neg eax*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3320,17 +3323,17 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); // movsd xmm0,[rsreg] - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _pand_r128_r128(REG_XMM0, REG_XMM1); // pand xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); /* movsd xmm0,[rsreg]*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _pand_r128_r128(REG_XMM0, REG_XMM1); /* pand xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _and_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // and edx,[rtreg].hi - _and_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // and eax,[rtreg].lo - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _and_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* and edx,[rtreg].hi*/ + _and_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* and eax,[rtreg].lo*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else @@ -3345,23 +3348,23 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); // movsd xmm0,[rsreg] - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _por_r128_r128(REG_XMM0, REG_XMM1); // por xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); /* movsd xmm0,[rsreg]*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _por_r128_r128(REG_XMM0, REG_XMM1); /* por xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _or_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // or edx,[rtreg].hi - _or_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // or eax,[rtreg].lo - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _or_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* or edx,[rtreg].hi*/ + _or_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* or eax,[rtreg].lo*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else if (RSREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ else if (RTREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); // mov [rdreg],[rtreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); /* mov [rdreg],[rtreg]*/ else _zero_m64abs(&mips3.r[RDREG]); } @@ -3374,23 +3377,23 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); // movsd xmm0,[rsreg] - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _pxor_r128_r128(REG_XMM0, REG_XMM1); // pxor xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); /* movsd xmm0,[rsreg]*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _pxor_r128_r128(REG_XMM0, REG_XMM1); /* pxor xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _xor_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // xor edx,[rtreg].hi - _xor_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // xor eax,[rtreg].lo - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _xor_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* xor edx,[rtreg].hi*/ + _xor_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* xor eax,[rtreg].lo*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else if (RSREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ else if (RTREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); // mov [rdreg],[rtreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); /* mov [rdreg],[rtreg]*/ else _zero_m64abs(&mips3.r[RDREG]); } @@ -3401,31 +3404,31 @@ { if (RSREG != 0 && RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _or_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // or edx,[rtreg].hi - _or_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // or eax,[rtreg].lo - _not_r32(REG_EDX); // not edx - _not_r32(REG_EAX); // not eax - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _or_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* or edx,[rtreg].hi*/ + _or_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* or eax,[rtreg].lo*/ + _not_r32(REG_EDX); /* not edx*/ + _not_r32(REG_EAX); /* not eax*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _not_r32(REG_EDX); // not edx - _not_r32(REG_EAX); // not eax - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _not_r32(REG_EDX); /* not edx*/ + _not_r32(REG_EAX); /* not eax*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] - _not_r32(REG_EDX); // not edx - _not_r32(REG_EAX); // not eax - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ + _not_r32(REG_EDX); /* not edx*/ + _not_r32(REG_EAX); /* not eax*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else { - _mov_m32abs_imm(LO(&mips3.r[RDREG]), ~0); // mov [rtreg].lo,~0 - _mov_m32abs_imm(HI(&mips3.r[RDREG]), ~0); // mov [rtreg].hi,~0 + _mov_m32abs_imm(LO(&mips3.r[RDREG]), ~0); /* mov [rtreg].lo,~0*/ + _mov_m32abs_imm(HI(&mips3.r[RDREG]), ~0); /* mov [rtreg].hi,~0*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -3434,59 +3437,59 @@ if (RDREG != 0) { if (RSREG != 0) - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ else { - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ } if (RTREG != 0) { - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].lo + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].lo*/ } - _shr_r32_imm(REG_EDX, 31); // shr edx,31 - _mov_m32abs_r32(LO(&mips3.r[RDREG]), REG_EDX); // mov [rdreg].lo,edx - _mov_m32abs_imm(HI(&mips3.r[RDREG]), 0); // mov [rdreg].hi,0 + _shr_r32_imm(REG_EDX, 31); /* shr edx,31*/ + _mov_m32abs_r32(LO(&mips3.r[RDREG]), REG_EDX); /* mov [rdreg].lo,edx*/ + _mov_m32abs_imm(HI(&mips3.r[RDREG]), 0); /* mov [rdreg].hi,0*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2b: /* SLTU */ if (RDREG != 0) { - _xor_r32_r32(REG_ECX, REG_ECX); // xor ecx,ecx - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_short_link(COND_B, &link1); // jb setit - _jcc_short_link(COND_A, &link2); // ja skipit - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc_short_link(COND_AE, &link3); // jae skipit - _resolve_link(&link1); // setit: - _add_r32_imm(REG_ECX, 1); // add ecx,1 - _resolve_link(&link2); // skipit: - _resolve_link(&link3); // skipit: - _mov_m32abs_r32(LO(&mips3.r[RDREG]), REG_ECX); // mov [rdreg].lo,ecx - _mov_m32abs_imm(HI(&mips3.r[RDREG]), 0); // mov [rdreg].hi,0 + _xor_r32_r32(REG_ECX, REG_ECX); /* xor ecx,ecx*/ + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_short_link(COND_B, &link1); /* jb setit*/ + _jcc_short_link(COND_A, &link2); /* ja skipit*/ + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc_short_link(COND_AE, &link3); /* jae skipit*/ + _resolve_link(&link1); /* setit:*/ + _add_r32_imm(REG_ECX, 1); /* add ecx,1*/ + _resolve_link(&link2); /* skipit:*/ + _resolve_link(&link3); /* skipit:*/ + _mov_m32abs_r32(LO(&mips3.r[RDREG]), REG_ECX); /* mov [rdreg].lo,ecx*/ + _mov_m32abs_imm(HI(&mips3.r[RDREG]), 0); /* mov [rdreg].hi,0*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x2c: /* DADD */ if (RSREG != 0 && RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _add_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // add eax,[rtreg].lo - _adc_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // adc edx,[rtreg].hi - _jcc(COND_O, mips3.generate_overflow_exception); // jo generate_overflow_exception + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* add eax,[rtreg].lo*/ + _adc_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* adc edx,[rtreg].hi*/ + _jcc(COND_O, mips3.generate_overflow_exception); /* jo generate_overflow_exception*/ if (RDREG != 0) - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RDREG != 0) { if (RSREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ else if (RTREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); // mov [rdreg],[rtreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); /* mov [rdreg],[rtreg]*/ else _zero_m64abs(&mips3.r[RDREG]); } @@ -3499,23 +3502,23 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); // movsd xmm0,[rsreg] - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _paddq_r128_r128(REG_XMM0, REG_XMM1); // paddq xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); /* movsd xmm0,[rsreg]*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _paddq_r128_r128(REG_XMM0, REG_XMM1); /* paddq xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _add_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // add eax,[rtreg].lo - _adc_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // adc edx,[rtreg].hi - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* add eax,[rtreg].lo*/ + _adc_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* adc edx,[rtreg].hi*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else if (RSREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ else if (RTREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); // mov [rdreg],[rtreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RTREG]); /* mov [rdreg],[rtreg]*/ else _zero_m64abs(&mips3.r[RDREG]); } @@ -3524,33 +3527,33 @@ case 0x2e: /* DSUB */ if (RSREG != 0 && RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].hi - _jcc(COND_O, mips3.generate_overflow_exception); // jo generate_overflow_exception + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].hi*/ + _jcc(COND_O, mips3.generate_overflow_exception); /* jo generate_overflow_exception*/ if (RDREG != 0) - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else if (RDREG != 0) { if (RSREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ else if (RTREG != 0) { if (USE_SSE) { - _pxor_r128_r128(REG_XMM0, REG_XMM0); // pxor xmm0,xmm0 - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _psubq_r128_r128(REG_XMM0, REG_XMM1); // psubq xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _pxor_r128_r128(REG_XMM0, REG_XMM0); /* pxor xmm0,xmm0*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _psubq_r128_r128(REG_XMM0, REG_XMM1); /* psubq xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].hi - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].hi*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else @@ -3565,37 +3568,37 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); // movsd xmm0,[rsreg] - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _psubq_r128_r128(REG_XMM0, REG_XMM1); // psubq xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RSREG]); /* movsd xmm0,[rsreg]*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _psubq_r128_r128(REG_XMM0, REG_XMM1); /* psubq xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].hi - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].hi*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else if (RSREG != 0) - _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); // mov [rdreg],[rsreg] + _mov_m64abs_m64abs(&mips3.r[RDREG], &mips3.r[RSREG]); /* mov [rdreg],[rsreg]*/ else if (RTREG != 0) { if (USE_SSE) { - _pxor_r128_r128(REG_XMM0, REG_XMM0); // pxor xmm0,xmm0 - _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); // movsd xmm1,[rtreg] - _psubq_r128_r128(REG_XMM0, REG_XMM1); // psubq xmm0,xmm1 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // mov [rdreg],xmm0 + _pxor_r128_r128(REG_XMM0, REG_XMM0); /* pxor xmm0,xmm0*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.r[RTREG]); /* movsd xmm1,[rtreg]*/ + _psubq_r128_r128(REG_XMM0, REG_XMM1); /* psubq xmm0,xmm1*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* mov [rdreg],xmm0*/ } else { - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].hi - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].hi*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else @@ -3605,80 +3608,80 @@ case 0x30: /* TGE */ if (RSREG != 0) - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ else { - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ } if (RTREG != 0) { - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].hi + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].hi*/ } else - _cmp_r32_imm(REG_EDX, 0); // cmp edx,0 - _jcc(COND_GE, mips3.generate_trap_exception); // jge generate_trap_exception + _cmp_r32_imm(REG_EDX, 0); /* cmp edx,0*/ + _jcc(COND_GE, mips3.generate_trap_exception); /* jge generate_trap_exception*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x31: /* TGEU */ - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc(COND_A, mips3.generate_trap_exception); // ja generate_trap_exception - _jcc_short_link(COND_B, &link1); // jb skipit - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc(COND_AE, mips3.generate_trap_exception); // jae generate_trap_exception - _resolve_link(&link1); // skipit: + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc(COND_A, mips3.generate_trap_exception); /* ja generate_trap_exception*/ + _jcc_short_link(COND_B, &link1); /* jb skipit*/ + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc(COND_AE, mips3.generate_trap_exception); /* jae generate_trap_exception*/ + _resolve_link(&link1); /* skipit:*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x32: /* TLT */ if (RSREG != 0) - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ else { - _xor_r32_r32(REG_EDX, REG_EDX); // xor edx,edx - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax + _xor_r32_r32(REG_EDX, REG_EDX); /* xor edx,edx*/ + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ } if (RTREG != 0) { - _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // sub eax,[rtreg].lo - _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); // sbb edx,[rtreg].hi + _sub_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* sub eax,[rtreg].lo*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.r[RTREG])); /* sbb edx,[rtreg].hi*/ } else - _cmp_r32_imm(REG_EDX, 0); // cmp edx,0 - _jcc(COND_L, mips3.generate_trap_exception); // jl generate_trap_exception + _cmp_r32_imm(REG_EDX, 0); /* cmp edx,0*/ + _jcc(COND_L, mips3.generate_trap_exception); /* jl generate_trap_exception*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x33: /* TLTU */ - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc(COND_B, mips3.generate_trap_exception); // jb generate_trap_exception - _jcc_short_link(COND_A, &link1); // ja skipit - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc(COND_B, mips3.generate_trap_exception); // jb generate_trap_exception - _resolve_link(&link1); // skipit: + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc(COND_B, mips3.generate_trap_exception); /* jb generate_trap_exception*/ + _jcc_short_link(COND_A, &link1); /* ja skipit*/ + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc(COND_B, mips3.generate_trap_exception); /* jb generate_trap_exception*/ + _resolve_link(&link1); /* skipit:*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x34: /* TEQ */ - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_short_link(COND_NE, &link1); // jne skipit - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc(COND_E, mips3.generate_trap_exception); // je generate_trap_exception - _resolve_link(&link1); // skipit: + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_short_link(COND_NE, &link1); /* jne skipit*/ + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc(COND_E, mips3.generate_trap_exception); /* je generate_trap_exception*/ + _resolve_link(&link1); /* skipit:*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x36: /* TNE */ - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); // mov eax,[rsreg].hi - _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // cmp eax,[rtreg].hi - _jcc_short_link(COND_E, &link1); // je skipit - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); // mov eax,[rsreg].lo - _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // cmp eax,[rtreg].lo - _jcc(COND_NE, mips3.generate_trap_exception); // jne generate_trap_exception - _resolve_link(&link1); // skipit: + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RSREG])); /* mov eax,[rsreg].hi*/ + _cmp_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* cmp eax,[rtreg].hi*/ + _jcc_short_link(COND_E, &link1); /* je skipit*/ + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RSREG])); /* mov eax,[rsreg].lo*/ + _cmp_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* cmp eax,[rtreg].lo*/ + _jcc(COND_NE, mips3.generate_trap_exception); /* jne generate_trap_exception*/ + _resolve_link(&link1); /* skipit:*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x38: /* DSLL */ @@ -3688,20 +3691,20 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); // movsd xmm0,[rtreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); /* movsd xmm0,[rtreg]*/ if (SHIFT) - _psllq_r128_imm(REG_XMM0, SHIFT); // psllq xmm0,SHIFT - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // movsd [rdreg],xmm0 + _psllq_r128_imm(REG_XMM0, SHIFT); /* psllq xmm0,SHIFT*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* movsd [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ if (SHIFT != 0) { - _shld_r32_r32_imm(REG_EDX, REG_EAX, SHIFT); // shld edx,eax,SHIFT - _shl_r32_imm(REG_EAX, SHIFT); // shl eax,SHIFT + _shld_r32_r32_imm(REG_EDX, REG_EAX, SHIFT); /* shld edx,eax,SHIFT*/ + _shl_r32_imm(REG_EAX, SHIFT); /* shl eax,SHIFT*/ } - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else @@ -3716,20 +3719,20 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); // movsd xmm0,[rtreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); /* movsd xmm0,[rtreg]*/ if (SHIFT) - _psrlq_r128_imm(REG_XMM0, SHIFT); // psrlq xmm0,SHIFT - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // movsd [rdreg],xmm0 + _psrlq_r128_imm(REG_XMM0, SHIFT); /* psrlq xmm0,SHIFT*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* movsd [rdreg],xmm0*/ } else { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ if (SHIFT != 0) { - _shrd_r32_r32_imm(REG_EAX, REG_EDX, SHIFT); // shrd eax,edx,SHIFT - _shr_r32_imm(REG_EDX, SHIFT); // shr edx,SHIFT + _shrd_r32_r32_imm(REG_EAX, REG_EDX, SHIFT); /* shrd eax,edx,SHIFT*/ + _shr_r32_imm(REG_EDX, SHIFT); /* shr edx,SHIFT*/ } - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } } else @@ -3742,13 +3745,13 @@ { if (RTREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); // mov edx:eax,[rtreg] + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RTREG]); /* mov edx:eax,[rtreg]*/ if (SHIFT != 0) { - _shrd_r32_r32_imm(REG_EAX, REG_EDX, SHIFT); // shrd eax,edx,SHIFT - _sar_r32_imm(REG_EDX, SHIFT); // sar edx,SHIFT + _shrd_r32_r32_imm(REG_EAX, REG_EDX, SHIFT); /* shrd eax,edx,SHIFT*/ + _sar_r32_imm(REG_EDX, SHIFT); /* sar edx,SHIFT*/ } - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3762,17 +3765,17 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); // movsd xmm0,[rtreg] - _psllq_r128_imm(REG_XMM0, SHIFT+32); // psllq xmm0,SHIFT+32 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // movsd [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); /* movsd xmm0,[rtreg]*/ + _psllq_r128_imm(REG_XMM0, SHIFT+32); /* psllq xmm0,SHIFT+32*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* movsd [rdreg],xmm0*/ } else { - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ if (SHIFT != 0) - _shl_r32_imm(REG_EAX, SHIFT); // shl eax,SHIFT - _mov_m32abs_imm(LO(&mips3.r[RDREG]), 0); // mov [rdreg].lo,0 - _mov_m32abs_r32(HI(&mips3.r[RDREG]), REG_EAX); // mov [rdreg].hi,eax + _shl_r32_imm(REG_EAX, SHIFT); /* shl eax,SHIFT*/ + _mov_m32abs_imm(LO(&mips3.r[RDREG]), 0); /* mov [rdreg].lo,0*/ + _mov_m32abs_r32(HI(&mips3.r[RDREG]), REG_EAX); /* mov [rdreg].hi,eax*/ } } else @@ -3787,17 +3790,17 @@ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); // movsd xmm0,[rtreg] - _psrlq_r128_imm(REG_XMM0, SHIFT+32); // psrlq xmm0,SHIFT+32 - _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); // movsd [rdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.r[RTREG]); /* movsd xmm0,[rtreg]*/ + _psrlq_r128_imm(REG_XMM0, SHIFT+32); /* psrlq xmm0,SHIFT+32*/ + _movsd_m64abs_r128(&mips3.r[RDREG], REG_XMM0); /* movsd [rdreg],xmm0*/ } else { - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // mov eax,[rtreg].hi + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* mov eax,[rtreg].hi*/ if (SHIFT != 0) - _shr_r32_imm(REG_EAX, SHIFT); // shr eax,SHIFT - _mov_m32abs_imm(HI(&mips3.r[RDREG]), 0); // mov [rdreg].hi,0 - _mov_m32abs_r32(LO(&mips3.r[RDREG]), REG_EAX); // mov [rdreg].lo,eax + _shr_r32_imm(REG_EAX, SHIFT); /* shr eax,SHIFT*/ + _mov_m32abs_imm(HI(&mips3.r[RDREG]), 0); /* mov [rdreg].hi,0*/ + _mov_m32abs_r32(LO(&mips3.r[RDREG]), REG_EAX); /* mov [rdreg].lo,eax*/ } } else @@ -3810,11 +3813,11 @@ { if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // mov eax,[rtreg].hi - _cdq(); // cdq + _mov_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* mov eax,[rtreg].hi*/ + _cdq(); /* cdq*/ if (SHIFT != 0) - _sar_r32_imm(REG_EAX, SHIFT); // sar eax,SHIFT - _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); // mov [rdreg],edx:eax + _sar_r32_imm(REG_EAX, SHIFT); /* sar eax,SHIFT*/ + _mov_m64abs_r64(&mips3.r[RDREG], REG_EDX, REG_EAX); /* mov [rdreg],edx:eax*/ } else _zero_m64abs(&mips3.r[RDREG]); @@ -3822,7 +3825,7 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); } - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } @@ -3843,31 +3846,31 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_GE, &link1); // jge skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_GE, &link1); /* jge skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x01: /* BGEZ */ if (RSREG == 0) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_L, &link1); // jl skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_L, &link1); /* jl skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x02: /* BLTZL */ @@ -3875,126 +3878,126 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_GE, &link1); // jge skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_GE, &link1); /* jge skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x03: /* BGEZL */ if (RSREG == 0) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_L, &link1); // jl skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_L, &link1); /* jl skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x08: /* TGEI */ if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _sub_r32_imm(REG_EAX, SIMMVAL); // sub eax,[rtreg].lo - _sbb_r32_imm(REG_EDX, ((INT32)SIMMVAL >> 31)); // sbb edx,[rtreg].lo - _jcc(COND_GE, mips3.generate_trap_exception); // jge generate_trap_exception + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _sub_r32_imm(REG_EAX, SIMMVAL); /* sub eax,[rtreg].lo*/ + _sbb_r32_imm(REG_EDX, ((INT32)SIMMVAL >> 31)); /* sbb edx,[rtreg].lo*/ + _jcc(COND_GE, mips3.generate_trap_exception); /* jge generate_trap_exception*/ } else { if (0 >= SIMMVAL) - _jmp(mips3.generate_trap_exception); // jmp generate_trap_exception + _jmp(mips3.generate_trap_exception); /* jmp generate_trap_exception*/ } return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x09: /* TGEIU */ if (RSREG != 0) { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); // cmp [rsreg].hi,upper - _jcc(COND_A, mips3.generate_trap_exception); // ja generate_trap_exception - _jcc_short_link(COND_B, &link1); // jb skip - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); // cmp [rsreg].lo,lower - _jcc(COND_AE, mips3.generate_trap_exception); // jae generate_trap_exception - _resolve_link(&link1); // skip: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); /* cmp [rsreg].hi,upper*/ + _jcc(COND_A, mips3.generate_trap_exception); /* ja generate_trap_exception*/ + _jcc_short_link(COND_B, &link1); /* jb skip*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); /* cmp [rsreg].lo,lower*/ + _jcc(COND_AE, mips3.generate_trap_exception); /* jae generate_trap_exception*/ + _resolve_link(&link1); /* skip:*/ } else { if (0 >= SIMMVAL) - _jmp(mips3.generate_trap_exception); // jmp generate_trap_exception + _jmp(mips3.generate_trap_exception); /* jmp generate_trap_exception*/ } return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x0a: /* TLTI */ if (RSREG != 0) { - _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); // mov edx:eax,[rsreg] - _sub_r32_imm(REG_EAX, SIMMVAL); // sub eax,[rtreg].lo - _sbb_r32_imm(REG_EDX, ((INT32)SIMMVAL >> 31)); // sbb edx,[rtreg].lo - _jcc(COND_L, mips3.generate_trap_exception); // jl generate_trap_exception + _mov_r64_m64abs(REG_EDX, REG_EAX, &mips3.r[RSREG]); /* mov edx:eax,[rsreg]*/ + _sub_r32_imm(REG_EAX, SIMMVAL); /* sub eax,[rtreg].lo*/ + _sbb_r32_imm(REG_EDX, ((INT32)SIMMVAL >> 31)); /* sbb edx,[rtreg].lo*/ + _jcc(COND_L, mips3.generate_trap_exception); /* jl generate_trap_exception*/ } else { if (0 < SIMMVAL) - _jmp(mips3.generate_trap_exception); // jmp generate_trap_exception + _jmp(mips3.generate_trap_exception); /* jmp generate_trap_exception*/ } return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x0b: /* TLTIU */ if (RSREG != 0) { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); // cmp [rsreg].hi,upper - _jcc(COND_B, mips3.generate_trap_exception); // jb generate_trap_exception - _jcc_short_link(COND_A, &link1); // ja skip - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); // cmp [rsreg].lo,lower - _jcc(COND_B, mips3.generate_trap_exception); // jb generate_trap_exception - _resolve_link(&link1); // skip: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); /* cmp [rsreg].hi,upper*/ + _jcc(COND_B, mips3.generate_trap_exception); /* jb generate_trap_exception*/ + _jcc_short_link(COND_A, &link1); /* ja skip*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); /* cmp [rsreg].lo,lower*/ + _jcc(COND_B, mips3.generate_trap_exception); /* jb generate_trap_exception*/ + _resolve_link(&link1); /* skip:*/ } else { - _mov_m32abs_imm(LO(&mips3.r[RTREG]), (0 < SIMMVAL)); // mov [rtreg].lo,const - _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); // mov [rtreg].hi,sign-extend(const) + _mov_m32abs_imm(LO(&mips3.r[RTREG]), (0 < SIMMVAL)); /* mov [rtreg].lo,const*/ + _mov_m32abs_imm(HI(&mips3.r[RTREG]), 0); /* mov [rtreg].hi,sign-extend(const)*/ } return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x0c: /* TEQI */ if (RSREG != 0) { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); // cmp [rsreg].hi,upper - _jcc_short_link(COND_NE, &link1); // jne skip - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); // cmp [rsreg].lo,lower - _jcc(COND_E, mips3.generate_trap_exception); // je generate_trap_exception - _resolve_link(&link1); // skip: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); /* cmp [rsreg].hi,upper*/ + _jcc_short_link(COND_NE, &link1); /* jne skip*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); /* cmp [rsreg].lo,lower*/ + _jcc(COND_E, mips3.generate_trap_exception); /* je generate_trap_exception*/ + _resolve_link(&link1); /* skip:*/ } else { if (0 == SIMMVAL) - _jmp(mips3.generate_trap_exception); // jmp generate_trap_exception + _jmp(mips3.generate_trap_exception); /* jmp generate_trap_exception*/ } return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; case 0x0e: /* TNEI */ if (RSREG != 0) { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); // cmp [rsreg].hi,upper - _jcc_short_link(COND_E, &link1); // je skip - _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); // cmp [rsreg].lo,lower - _jcc(COND_NE, mips3.generate_trap_exception); // jne generate_trap_exception - _resolve_link(&link1); // skip: + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), ((INT32)SIMMVAL >> 31)); /* cmp [rsreg].hi,upper*/ + _jcc_short_link(COND_E, &link1); /* je skip*/ + _cmp_m32abs_imm(LO(&mips3.r[RSREG]), SIMMVAL); /* cmp [rsreg].lo,lower*/ + _jcc(COND_NE, mips3.generate_trap_exception); /* jne generate_trap_exception*/ + _resolve_link(&link1); /* skip:*/ } else { if (0 != SIMMVAL) - _jmp(mips3.generate_trap_exception); // jmp generate_trap_exception + _jmp(mips3.generate_trap_exception); /* jmp generate_trap_exception*/ } return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_MAY_CAUSE_EXCEPTION; @@ -4003,34 +4006,34 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_GE, &link1); // jge skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_GE, &link1); /* jge skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x11: /* BGEZAL */ if (RSREG == 0) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_L, &link1); // jl skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_L, &link1); /* jl skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x12: /* BLTZALL */ @@ -4038,38 +4041,38 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_GE, &link1); // jge skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_GE, &link1); /* jge skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x13: /* BGEZALL */ if (RSREG == 0) { - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ return RECOMPILE_SUCCESSFUL_CP(0,0) | RECOMPILE_END_OF_STRING; } else { - _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); // cmp [rsreg].hi,0 - _jcc_near_link(COND_L, &link1); // jl skip + _cmp_m32abs_imm(HI(&mips3.r[RSREG]), 0); /* cmp [rsreg].hi,0*/ + _jcc_near_link(COND_L, &link1); /* jl skip*/ } - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - _mov_m64abs_imm32(&mips3.r[31], pc + 8); // mov [31],pc + 8 - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); // <branch or dispatch> - _resolve_link(&link1); // skip: + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + _mov_m64abs_imm32(&mips3.r[31], pc + 8); /* mov [31],pc + 8*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles); /* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); } - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } @@ -4090,48 +4093,48 @@ switch (reg) { case COP0_Cause: - _mov_r32_m32abs(REG_EBX, &mips3.cpr[0][COP0_Cause]); // mov ebx,[mips3.cpr[0][COP0_Cause]] - _and_r32_imm(REG_EAX, ~0xfc00); // and eax,~0xfc00 - _and_r32_imm(REG_EBX, 0xfc00); // and ebx,0xfc00 - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx - _mov_m32abs_r32(&mips3.cpr[0][COP0_Cause], REG_EAX); // mov [mips3.cpr[0][COP0_Cause]],eax + _mov_r32_m32abs(REG_EBX, &mips3.cpr[0][COP0_Cause]); /* mov ebx,[mips3.cpr[0][COP0_Cause]]*/ + _and_r32_imm(REG_EAX, ~0xfc00); /* and eax,~0xfc00*/ + _and_r32_imm(REG_EBX, 0xfc00); /* and ebx,0xfc00*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ + _mov_m32abs_r32(&mips3.cpr[0][COP0_Cause], REG_EAX); /* mov [mips3.cpr[0][COP0_Cause]],eax*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_CHECK_INTERRUPTS; case COP0_Status: - _mov_r32_m32abs(REG_EBX, &mips3.cpr[0][COP0_Status]); // mov ebx,[mips3.cpr[0][COP0_Status]] - _mov_m32abs_r32(&mips3.cpr[0][COP0_Status], REG_EAX); // mov [mips3.cpr[0][COP0_Status]],eax - _xor_r32_r32(REG_EAX, REG_EBX); // xor eax,ebx - _test_r32_imm(REG_EAX, 0x8000); // test eax,0x8000 - _jcc_short_link(COND_Z, &link1); // jz skip - append_update_cycle_counting(drc); // update cycle counting - _resolve_link(&link1); // skip: + _mov_r32_m32abs(REG_EBX, &mips3.cpr[0][COP0_Status]); /* mov ebx,[mips3.cpr[0][COP0_Status]]*/ + _mov_m32abs_r32(&mips3.cpr[0][COP0_Status], REG_EAX); /* mov [mips3.cpr[0][COP0_Status]],eax*/ + _xor_r32_r32(REG_EAX, REG_EBX); /* xor eax,ebx*/ + _test_r32_imm(REG_EAX, 0x8000); /* test eax,0x8000*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ + append_update_cycle_counting(drc); /* update cycle counting*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4) | RECOMPILE_CHECK_INTERRUPTS; case COP0_Count: - _mov_m32abs_r32(&mips3.cpr[0][COP0_Count], REG_EAX); // mov [mips3.cpr[0][COP0_Count]],eax - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_r32(REG_EAX); // push eax - _call((void *)activecpu_gettotalcycles64); // call activecpu_gettotalcycles64 - _pop_r32(REG_EBX); // pop ebx - _sub_r32_r32(REG_EAX, REG_EBX); // sub eax,ebx - _sbb_r32_imm(REG_EDX, 0); // sbb edx,0 - _sub_r32_r32(REG_EAX, REG_EBX); // sub eax,ebx - _sbb_r32_imm(REG_EDX, 0); // sbb edx,0 - _mov_m64abs_r64(&mips3.count_zero_time, REG_EDX, REG_EAX); // mov [mips3.count_zero_time],edx:eax - append_update_cycle_counting(drc); // update cycle counting + _mov_m32abs_r32(&mips3.cpr[0][COP0_Count], REG_EAX); /* mov [mips3.cpr[0][COP0_Count]],eax*/ + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_r32(REG_EAX); /* push eax*/ + _call((void *)activecpu_gettotalcycles64); /* call activecpu_gettotalcycles64*/ + _pop_r32(REG_EBX); /* pop ebx*/ + _sub_r32_r32(REG_EAX, REG_EBX); /* sub eax,ebx*/ + _sbb_r32_imm(REG_EDX, 0); /* sbb edx,0*/ + _sub_r32_r32(REG_EAX, REG_EBX); /* sub eax,ebx*/ + _sbb_r32_imm(REG_EDX, 0); /* sbb edx,0*/ + _mov_m64abs_r64(&mips3.count_zero_time, REG_EDX, REG_EAX); /* mov [mips3.count_zero_time],edx:eax*/ + append_update_cycle_counting(drc); /* update cycle counting*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case COP0_Compare: - _mov_m32abs_r32(&mips3.cpr[0][COP0_Compare], REG_EAX); // mov [mips3.cpr[0][COP0_Compare]],eax - _and_m32abs_imm(&mips3.cpr[0][COP0_Cause], ~0x8000); // and [mips3.cpr[0][COP0_Cause]],~0x8000 - append_update_cycle_counting(drc); // update cycle counting + _mov_m32abs_r32(&mips3.cpr[0][COP0_Compare], REG_EAX); /* mov [mips3.cpr[0][COP0_Compare]],eax*/ + _and_m32abs_imm(&mips3.cpr[0][COP0_Cause], ~0x8000); /* and [mips3.cpr[0][COP0_Cause]],~0x8000*/ + append_update_cycle_counting(drc); /* update cycle counting*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case COP0_PRId: return RECOMPILE_SUCCESSFUL_CP(1,4); default: - _mov_m32abs_r32(&mips3.cpr[0][reg], REG_EAX); // mov [mips3.cpr[0][reg]],eax + _mov_m32abs_r32(&mips3.cpr[0][reg], REG_EAX); /* mov [mips3.cpr[0][reg]],eax*/ return RECOMPILE_SUCCESSFUL_CP(1,4); } return RECOMPILE_UNIMPLEMENTED; @@ -4149,27 +4152,27 @@ switch (reg) { case COP0_Count: - _sub_r32_imm(REG_EBP, 24); // sub ebp,24 - _jcc_short_link(COND_NS, &link1); // jns notneg - _xor_r32_r32(REG_EBP, REG_EBP); // xor ebp,ebp - _resolve_link(&link1); // notneg: - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _call((void *)activecpu_gettotalcycles64); // call activecpu_gettotalcycles64 - _sub_r32_m32abs(REG_EAX, LO(&mips3.count_zero_time)); // sub eax,[mips3.count_zero_time+0] - _sbb_r32_m32abs(REG_EDX, HI(&mips3.count_zero_time)); // sbb edx,[mips3.count_zero_time+4] - _shrd_r32_r32_imm(REG_EAX, REG_EDX, 1); // shrd eax,edx,1 + _sub_r32_imm(REG_EBP, 24); /* sub ebp,24*/ + _jcc_short_link(COND_NS, &link1); /* jns notneg*/ + _xor_r32_r32(REG_EBP, REG_EBP); /* xor ebp,ebp*/ + _resolve_link(&link1); /* notneg:*/ + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _call((void *)activecpu_gettotalcycles64); /* call activecpu_gettotalcycles64*/ + _sub_r32_m32abs(REG_EAX, LO(&mips3.count_zero_time)); /* sub eax,[mips3.count_zero_time+0]*/ + _sbb_r32_m32abs(REG_EDX, HI(&mips3.count_zero_time)); /* sbb edx,[mips3.count_zero_time+4]*/ + _shrd_r32_r32_imm(REG_EAX, REG_EDX, 1); /* shrd eax,edx,1*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case COP0_Cause: - _sub_r32_imm(REG_EBP, 25); // sub ebp,24 - _jcc_short_link(COND_NS, &link1); // jns notneg - _xor_r32_r32(REG_EBP, REG_EBP); // xor ebp,ebp - _resolve_link(&link1); // notneg: - _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][reg]); // mov eax,[mips3.cpr[0][reg]] + _sub_r32_imm(REG_EBP, 25); /* sub ebp,24*/ + _jcc_short_link(COND_NS, &link1); /* jns notneg*/ + _xor_r32_r32(REG_EBP, REG_EBP); /* xor ebp,ebp*/ + _resolve_link(&link1); /* notneg:*/ + _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][reg]); /* mov eax,[mips3.cpr[0][reg]]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); default: - _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][reg]); // mov eax,[mips3.cpr[0][reg]] + _mov_r32_m32abs(REG_EAX, &mips3.cpr[0][reg]); /* mov eax,[mips3.cpr[0][reg]]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); } return RECOMPILE_UNIMPLEMENTED; @@ -4187,11 +4190,11 @@ if (mips3.drcoptions & MIPS3DRC_STRICT_COP0) { - _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_KSU_MASK); // test [mips3.cpr[0][COP0_Status]],SR_KSU_MASK - _jcc_short_link(COND_Z, &checklink); // jz okay - _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_COP0); // test [mips3.cpr[0][COP0_Status]],SR_COP0 - _jcc(COND_Z, mips3.generate_cop_exception); // jz generate_cop_exception - _resolve_link(&checklink); // okay: + _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_KSU_MASK); /* test [mips3.cpr[0][COP0_Status]],SR_KSU_MASK*/ + _jcc_short_link(COND_Z, &checklink); /* jz okay*/ + _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_COP0); /* test [mips3.cpr[0][COP0_Status]],SR_COP0*/ + _jcc(COND_Z, mips3.generate_cop_exception); /* jz generate_cop_exception*/ + _resolve_link(&checklink); /* okay:*/ } switch (RSREG) @@ -4200,9 +4203,9 @@ result = RECOMPILE_SUCCESSFUL_CP(1,4); if (RTREG != 0) { - result = recompile_get_cop0_reg(drc, RDREG); // read cop0 reg - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + result = recompile_get_cop0_reg(drc, RDREG); /* read cop0 reg*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } return result; @@ -4210,56 +4213,57 @@ result = RECOMPILE_SUCCESSFUL_CP(1,4); if (RTREG != 0) { - result = recompile_get_cop0_reg(drc, RDREG); // read cop0 reg - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + result = recompile_get_cop0_reg(drc, RDREG); /* read cop0 reg*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } return result; case 0x02: /* CFCz */ if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.ccr[0][RDREG]); // mov eax,[mips3.ccr[0][rdreg]] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [rtreg],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.ccr[0][RDREG]); /* mov eax,[mips3.ccr[0][rdreg]]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [rtreg],edx:eax*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x04: /* MTCz */ if (RTREG != 0) - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[mips3.r[RTREG]] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[mips3.r[RTREG]]*/ else - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - result = recompile_set_cop0_reg(drc, RDREG); // write cop0 reg + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + result = recompile_set_cop0_reg(drc, RDREG); /* write cop0 reg*/ return result; case 0x05: /* DMTCz */ if (RTREG != 0) - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[mips3.r[RTREG]] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[mips3.r[RTREG]]*/ else - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - result = recompile_set_cop0_reg(drc, RDREG); // write cop0 reg + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + result = recompile_set_cop0_reg(drc, RDREG); /* write cop0 reg*/ return result; case 0x06: /* CTCz */ if (RTREG != 0) - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[mips3.r[RTREG]] + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[mips3.r[RTREG]]*/ else - _xor_r32_r32(REG_EAX, REG_EAX); // xor eax,eax - _mov_m32abs_r32(&mips3.ccr[0][RDREG], REG_EAX); // mov [mips3.ccr[0][RDREG]],eax + _xor_r32_r32(REG_EAX, REG_EAX); /* xor eax,eax*/ + _mov_m32abs_r32(&mips3.ccr[0][RDREG], REG_EAX); /* mov [mips3.ccr[0][RDREG]],eax*/ return RECOMPILE_SUCCESSFUL_CP(1,4); -// case 0x08: /* BC */ +/* + case 0x08: // BC // switch (RTREG) // { -// case 0x00: /* BCzF */ if (!mips3.cf[0][0]) ADDPC(SIMMVAL); break; -// case 0x01: /* BCzF */ if (mips3.cf[0][0]) ADDPC(SIMMVAL); break; -// case 0x02: /* BCzFL */ invalid_instruction(op); break; -// case 0x03: /* BCzTL */ invalid_instruction(op); break; +// case 0x00: // BCzF if (!mips3.cf[0][0]) ADDPC(SIMMVAL); break; +// case 0x01: // BCzF if (mips3.cf[0][0]) ADDPC(SIMMVAL); break; +// case 0x02: // BCzFL invalid_instruction(op); break; +// case 0x03: // BCzTL invalid_instruction(op); break; // default: invalid_instruction(op); break; // } // break; - +*/ case 0x10: case 0x11: case 0x12: @@ -4282,34 +4286,34 @@ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x02: /* TLBWI */ - drc_append_save_call_restore(drc, (void *)logtlbentry, 0); // call logtlbentry + drc_append_save_call_restore(drc, (void *)logtlbentry, 0); /* call logtlbentry*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x06: /* TLBWR */ - drc_append_save_call_restore(drc, (void *)logtlbentry, 0); // call logtlbentry + drc_append_save_call_restore(drc, (void *)logtlbentry, 0); /* call logtlbentry*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x08: /* TLBP */ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x10: /* RFE */ - _jmp(mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp(mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; case 0x18: /* ERET */ - _mov_r32_m32abs(REG_EDI, &mips3.cpr[0][COP0_EPC]); // mov edi,[mips3.cpr[0][COP0_EPC]] - _and_m32abs_imm(&mips3.cpr[0][COP0_Status], ~SR_EXL); // and [mips3.cpr[0][COP0_Status]],~SR_EXL + _mov_r32_m32abs(REG_EDI, &mips3.cpr[0][COP0_EPC]); /* mov edi,[mips3.cpr[0][COP0_EPC]]*/ + _and_m32abs_imm(&mips3.cpr[0][COP0_Status], ~SR_EXL); /* and [mips3.cpr[0][COP0_Status]],~SR_EXL*/ return RECOMPILE_SUCCESSFUL_CP(1,0) | RECOMPILE_CHECK_INTERRUPTS | RECOMPILE_END_OF_STRING | RECOMPILE_ADD_DISPATCH; default: - _jmp(mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp(mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } break; -// default: -// _jmp(mips3.generate_invalidop_exception); // jmp generate_invalidop_exception -// return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; +/* default:*/ +/* _jmp(mips3.generate_invalidop_exception); */ /* jmp generate_invalidop_exception*/ +/* return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING;*/ } return RECOMPILE_UNIMPLEMENTED; } @@ -4331,8 +4335,8 @@ if (mips3.drcoptions & MIPS3DRC_STRICT_COP1) { - _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_COP1); // test [mips3.cpr[0][COP0_Status]],SR_COP1 - _jcc(COND_Z, mips3.generate_cop_exception); // jz generate_cop_exception + _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_COP1); /* test [mips3.cpr[0][COP0_Status]],SR_COP1*/ + _jcc(COND_Z, mips3.generate_cop_exception); /* jz generate_cop_exception*/ } switch (RSREG) @@ -4340,9 +4344,9 @@ case 0x00: /* MFCz */ if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][RDREG]); // mov eax,[mips3.cpr[1][RDREG]] - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [mips3.r[RTREG]],edx:eax + _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][RDREG]); /* mov eax,[mips3.cpr[1][RDREG]]*/ + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [mips3.r[RTREG]],edx:eax*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4354,71 +4358,71 @@ case 0x02: /* CFCz */ if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.ccr[1][RDREG]); // mov eax,[mips3.ccr[1][RDREG]] + _mov_r32_m32abs(REG_EAX, &mips3.ccr[1][RDREG]); /* mov eax,[mips3.ccr[1][RDREG]]*/ if (RDREG == 31) { - _and_r32_imm(REG_EAX, ~0xfe800000); // and eax,~0xfe800000 - _xor_r32_r32(REG_EBX, REG_EBX); // xor ebx,ebx - _cmp_m8abs_imm(&mips3.cf[1][0], 0); // cmp [cf[0]],0 - _setcc_r8(COND_NZ, REG_BL); // setnz bl - _shl_r32_imm(REG_EBX, 23); // shl ebx,23 - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx + _and_r32_imm(REG_EAX, ~0xfe800000); /* and eax,~0xfe800000*/ + _xor_r32_r32(REG_EBX, REG_EBX); /* xor ebx,ebx*/ + _cmp_m8abs_imm(&mips3.cf[1][0], 0); /* cmp [cf[0]],0*/ + _setcc_r8(COND_NZ, REG_BL); /* setnz bl*/ + _shl_r32_imm(REG_EBX, 23); /* shl ebx,23*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ if (mips3.is_mips4) for (i = 1; i <= 7; i++) { - _cmp_m8abs_imm(&mips3.cf[1][i], 0); // cmp [cf[i]],0 - _setcc_r8(COND_NZ, REG_BL); // setnz bl - _shl_r32_imm(REG_EBX, 24+i); // shl ebx,24+i - _or_r32_r32(REG_EAX, REG_EBX); // or eax,ebx + _cmp_m8abs_imm(&mips3.cf[1][i], 0); /* cmp [cf[i]],0*/ + _setcc_r8(COND_NZ, REG_BL); /* setnz bl*/ + _shl_r32_imm(REG_EBX, 24+i); /* shl ebx,24+i*/ + _or_r32_r32(REG_EAX, REG_EBX); /* or eax,ebx*/ } } - _cdq(); // cdq - _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); // mov [mips3.r[RTREG]],edx:eax + _cdq(); /* cdq*/ + _mov_m64abs_r64(&mips3.r[RTREG], REG_EDX, REG_EAX); /* mov [mips3.r[RTREG]],edx:eax*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x04: /* MTCz */ if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[mips3.r[RTREG]] - _mov_m32abs_r32(LO(&mips3.cpr[1][RDREG]), REG_EAX); // mov [mips3.cpr[1][RDREG]],eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[mips3.r[RTREG]]*/ + _mov_m32abs_r32(LO(&mips3.cpr[1][RDREG]), REG_EAX); /* mov [mips3.cpr[1][RDREG]],eax*/ } else - _mov_m32abs_imm(&mips3.cpr[1][RDREG], 0); // mov [mips3.cpr[1][RDREG]],0 + _mov_m32abs_imm(&mips3.cpr[1][RDREG], 0); /* mov [mips3.cpr[1][RDREG]],0*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x05: /* DMTCz */ if (RTREG != 0) _mov_m64abs_m64abs(&mips3.cpr[1][RDREG], &mips3.r[RTREG]); else - _zero_m64abs(&mips3.cpr[1][RDREG]); // mov [mips3.cpr[1][RDREG]],0 + _zero_m64abs(&mips3.cpr[1][RDREG]); /* mov [mips3.cpr[1][RDREG]],0*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x06: /* CTCz */ if (RTREG != 0) { - _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // mov eax,[mips3.r[RTREG]] - _mov_m32abs_r32(&mips3.ccr[1][RDREG], REG_EAX); // mov [mips3.ccr[1][RDREG]],eax + _mov_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* mov eax,[mips3.r[RTREG]]*/ + _mov_m32abs_r32(&mips3.ccr[1][RDREG], REG_EAX); /* mov [mips3.ccr[1][RDREG]],eax*/ } else - _mov_m32abs_imm(&mips3.ccr[1][RDREG], 0); // mov [mips3.ccr[1][RDREG]],0 + _mov_m32abs_imm(&mips3.ccr[1][RDREG], 0); /* mov [mips3.ccr[1][RDREG]],0*/ if (RDREG == 31) { - _mov_r32_m32abs(REG_EAX, LO(&mips3.ccr[1][RDREG])); // mov eax,[mips3.ccr[1][RDREG]] - _test_r32_imm(REG_EAX, 1 << 23); // test eax,1<<23 - _setcc_m8abs(COND_NZ, &mips3.cf[1][0]); // setnz [cf[0]] + _mov_r32_m32abs(REG_EAX, LO(&mips3.ccr[1][RDREG])); /* mov eax,[mips3.ccr[1][RDREG]]*/ + _test_r32_imm(REG_EAX, 1 << 23); /* test eax,1<<23*/ + _setcc_m8abs(COND_NZ, &mips3.cf[1][0]); /* setnz [cf[0]]*/ if (mips3.is_mips4) for (i = 1; i <= 7; i++) { - _test_r32_imm(REG_EAX, 1 << (24+i)); // test eax,1<<(24+i) - _setcc_m8abs(COND_NZ, &mips3.cf[1][i]); // setnz [cf[i]] + _test_r32_imm(REG_EAX, 1 << (24+i)); /* test eax,1<<(24+i)*/ + _setcc_m8abs(COND_NZ, &mips3.cf[1][i]); /* setnz [cf[i]]*/ } - _and_r32_imm(REG_EAX, 3); // and eax,3 - _test_r32_imm(REG_EAX, 1); // test eax,1 - _jcc_near_link(COND_Z, &link1); // jz skip - _xor_r32_imm(REG_EAX, 2); // xor eax,2 - _resolve_link(&link1); // skip: - drc_append_set_fp_rounding(drc, REG_EAX); // set_rounding(EAX) + _and_r32_imm(REG_EAX, 3); /* and eax,3*/ + _test_r32_imm(REG_EAX, 1); /* test eax,1*/ + _jcc_near_link(COND_Z, &link1); /* jz skip*/ + _xor_r32_imm(REG_EAX, 2); /* xor eax,2*/ + _resolve_link(&link1); /* skip:*/ + drc_append_set_fp_rounding(drc, REG_EAX); /* set_rounding(EAX)*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4426,35 +4430,35 @@ switch ((op >> 16) & 3) { case 0x00: /* BCzF */ - _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); // cmp [cf[x]],0 - _jcc_near_link(COND_NZ, &link1); // jnz link1 - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);// <branch or dispatch> - _resolve_link(&link1); // skip: + _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); /* cmp [cf[x]],0*/ + _jcc_near_link(COND_NZ, &link1); /* jnz link1*/ + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);/* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x01: /* BCzT */ - _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); // cmp [cf[x]],0 - _jcc_near_link(COND_Z, &link1); // jz link1 - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);// <branch or dispatch> - _resolve_link(&link1); // skip: + _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); /* cmp [cf[x]],0*/ + _jcc_near_link(COND_Z, &link1); /* jz link1*/ + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);/* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x02: /* BCzFL */ - _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); // cmp [cf[x]],0 - _jcc_near_link(COND_NZ, &link1); // jnz link1 - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);// <branch or dispatch> - _resolve_link(&link1); // skip: + _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); /* cmp [cf[x]],0*/ + _jcc_near_link(COND_NZ, &link1); /* jnz link1*/ + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);/* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); case 0x03: /* BCzTL */ - _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); // cmp [cf[x]],0 - _jcc_near_link(COND_Z, &link1); // jz link1 - cycles = recompile_delay_slot(drc, pc + 4); // <next instruction> - append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);// <branch or dispatch> - _resolve_link(&link1); // skip: + _cmp_m8abs_imm(&mips3.cf[1][mips3.is_mips4 ? ((op >> 18) & 7) : 0], 0); /* cmp [cf[x]],0*/ + _jcc_near_link(COND_Z, &link1); /* jz link1*/ + cycles = recompile_delay_slot(drc, pc + 4); /* <next instruction>*/ + append_branch_or_dispatch(drc, pc + 4 + (SIMMVAL << 2), 1+cycles);/* <branch or dispatch>*/ + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,8); } break; @@ -4467,32 +4471,32 @@ { if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _addss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // addss xmm0,[ftreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _addss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* addss xmm0,[ftreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _faddp(); // faddp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _faddp(); /* faddp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } else /* ADD.D */ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _addsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // addsd xmm0,[ftreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _addsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* addsd xmm0,[ftreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _faddp(); // faddp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _faddp(); /* faddp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4502,32 +4506,32 @@ { if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _subss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // subss xmm0,[ftreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _subss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* subss xmm0,[ftreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fsubp(); // fsubp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fsubp(); /* fsubp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } else /* SUB.D */ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _subsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // subsd xmm0,[ftreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _subsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* subsd xmm0,[ftreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fsubp(); // fsubp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fsubp(); /* fsubp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4537,32 +4541,32 @@ { if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulss xmm0,[ftreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulss xmm0,[ftreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } else /* MUL.D */ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulsd xmm0,[ftreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulsd xmm0,[ftreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4572,32 +4576,32 @@ { if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _divss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // divss xmm0,[ftreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _divss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* divss xmm0,[ftreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fdivp(); // fdivp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fdivp(); /* fdivp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } else /* DIV.D */ { if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _divsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // divsd xmm0,[ftreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _divsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* divsd xmm0,[ftreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fdivp(); // fdivp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fdivp(); /* fdivp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4607,28 +4611,28 @@ { if (USE_SSE) { - _sqrtss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // sqrtss xmm0,[fsreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _sqrtss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* sqrtss xmm0,[fsreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fsqrt(); // fsqrt - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fsqrt(); /* fsqrt*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } else /* SQRT.D */ { if (USE_SSE) { - _sqrtsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // sqrtsd xmm0,[fsreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _sqrtsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* sqrtsd xmm0,[fsreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fsqrt(); // fsqrt - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fsqrt(); /* fsqrt*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4636,23 +4640,23 @@ case 0x05: if (IS_SINGLE(op)) /* ABS.S */ { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fabs(); // fabs - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fabs(); /* fabs*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } else /* ABS.D */ { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fabs(); // fabs - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fabs(); /* fabs*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x06: if (IS_SINGLE(op)) /* MOV.S */ { - _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); // mov eax,[fsreg] - _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); // mov [fdreg],eax + _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); /* mov eax,[fsreg]*/ + _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); /* mov [fdreg],eax*/ } else /* MOV.D */ _mov_m64abs_m64abs(&mips3.cpr[1][FDREG], &mips3.cpr[1][FSREG]); @@ -4661,195 +4665,195 @@ case 0x07: if (IS_SINGLE(op)) /* NEG.S */ { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fchs(); // fchs - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fchs(); /* fchs*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } else /* NEG.D */ { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fchs(); // fchs - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fchs(); /* fchs*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x08: drc_append_set_temp_fp_rounding(drc, FPRND_NEAR); if (IS_SINGLE(op)) /* ROUND.L.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* ROUND.L.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m64abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m64abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x09: drc_append_set_temp_fp_rounding(drc, FPRND_CHOP); if (IS_SINGLE(op)) /* TRUNC.L.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* TRUNC.L.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m64abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m64abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0a: drc_append_set_temp_fp_rounding(drc, FPRND_UP); if (IS_SINGLE(op)) /* CEIL.L.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* CEIL.L.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m64abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m64abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0b: drc_append_set_temp_fp_rounding(drc, FPRND_DOWN); if (IS_SINGLE(op)) /* FLOOR.L.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* FLOOR.L.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m64abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m64abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0c: drc_append_set_temp_fp_rounding(drc, FPRND_NEAR); if (IS_SINGLE(op)) /* ROUND.W.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* ROUND.W.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m32abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m32abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0d: drc_append_set_temp_fp_rounding(drc, FPRND_CHOP); if (IS_SINGLE(op)) /* TRUNC.W.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* TRUNC.W.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m32abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m32abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0e: drc_append_set_temp_fp_rounding(drc, FPRND_UP); if (IS_SINGLE(op)) /* CEIL.W.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* CEIL.W.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m32abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m32abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0f: drc_append_set_temp_fp_rounding(drc, FPRND_DOWN); if (IS_SINGLE(op)) /* FLOOR.W.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* FLOOR.W.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m32abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m32abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ drc_append_restore_fp_rounding(drc); return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x11: /* R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } - _cmp_m8abs_imm(&mips3.cf[1][(op >> 18) & 7], 0); // cmp [cf[x]],0 - _jcc_short_link(((op >> 16) & 1) ? COND_Z : COND_NZ, &link1); // jz/nz skip + _cmp_m8abs_imm(&mips3.cf[1][(op >> 18) & 7], 0); /* cmp [cf[x]],0*/ + _jcc_short_link(((op >> 16) & 1) ? COND_Z : COND_NZ, &link1); /* jz/nz skip*/ if (IS_SINGLE(op)) /* MOVT/F.S */ { - _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); // mov eax,[fsreg] - _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); // mov [fdreg],eax + _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); /* mov eax,[fsreg]*/ + _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); /* mov [fdreg],eax*/ } else /* MOVT/F.D */ _mov_m64abs_m64abs(&mips3.cpr[1][FDREG], &mips3.cpr[1][FSREG]); - _resolve_link(&link1); // skip: + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x12: /* R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_short_link(COND_NZ, &link1); // jnz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_short_link(COND_NZ, &link1); /* jnz skip*/ if (IS_SINGLE(op)) /* MOVZ.S */ { - _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); // mov eax,[fsreg] - _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); // mov [fdreg],eax + _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); /* mov eax,[fsreg]*/ + _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); /* mov [fdreg],eax*/ } else /* MOVZ.D */ _mov_m64abs_m64abs(&mips3.cpr[1][FDREG], &mips3.cpr[1][FSREG]); - _resolve_link(&link1); // skip: + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x13: /* R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } - _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); // mov eax,[rtreg].lo - _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); // or eax,[rtreg].hi - _jcc_short_link(COND_Z, &link1); // jz skip + _mov_r32_m32abs(REG_EAX, LO(&mips3.r[RTREG])); /* mov eax,[rtreg].lo*/ + _or_r32_m32abs(REG_EAX, HI(&mips3.r[RTREG])); /* or eax,[rtreg].hi*/ + _jcc_short_link(COND_Z, &link1); /* jz skip*/ if (IS_SINGLE(op)) /* MOVN.S */ { - _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); // mov eax,[fsreg] - _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); // mov [fdreg],eax + _mov_r32_m32abs(REG_EAX, &mips3.cpr[1][FSREG]); /* mov eax,[fsreg]*/ + _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); /* mov [fdreg],eax*/ } else /* MOVN.D */ _mov_m64abs_m64abs(&mips3.cpr[1][FDREG], &mips3.cpr[1][FSREG]); - _resolve_link(&link1); // skip: + _resolve_link(&link1); /* skip:*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x15: /* R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } - _fld1(); // fld1 + _fld1(); /* fld1*/ if (IS_SINGLE(op)) /* RECIP.S */ { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fdivp(); // fdivp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fdivp(); /* fdivp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } else /* RECIP.D */ { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fdivp(); // fdivp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fdivp(); /* fdivp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x16: /* R5000 */ if (!mips3.is_mips4) { - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } - _fld1(); // fld1 + _fld1(); /* fld1*/ if (IS_SINGLE(op)) /* RSQRT.S */ { - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fsqrt(); // fsqrt - _fdivp(); // fdivp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fsqrt(); /* fsqrt*/ + _fdivp(); /* fdivp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } else /* RSQRT.D */ { - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fsqrt(); // fsqrt - _fdivp(); // fdivp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fsqrt(); /* fsqrt*/ + _fdivp(); /* fdivp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4857,42 +4861,42 @@ if (IS_INTEGRAL(op)) { if (IS_SINGLE(op)) /* CVT.S.W */ - _fild_m32abs(&mips3.cpr[1][FSREG]); // fild [fsreg] + _fild_m32abs(&mips3.cpr[1][FSREG]); /* fild [fsreg]*/ else /* CVT.S.L */ - _fild_m64abs(&mips3.cpr[1][FSREG]); // fild [fsreg] + _fild_m64abs(&mips3.cpr[1][FSREG]); /* fild [fsreg]*/ } else /* CVT.S.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x21: if (IS_INTEGRAL(op)) { if (IS_SINGLE(op)) /* CVT.D.W */ - _fild_m32abs(&mips3.cpr[1][FSREG]); // fild [fsreg] + _fild_m32abs(&mips3.cpr[1][FSREG]); /* fild [fsreg]*/ else /* CVT.D.L */ - _fild_m64abs(&mips3.cpr[1][FSREG]); // fild [fsreg] + _fild_m64abs(&mips3.cpr[1][FSREG]); /* fild [fsreg]*/ } else /* CVT.D.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x24: if (IS_SINGLE(op)) /* CVT.W.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* CVT.W.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m32abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m32abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x25: if (IS_SINGLE(op)) /* CVT.L.S */ - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ else /* CVT.L.D */ - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fistp_m64abs(&mips3.cpr[1][FDREG]); // fistp [fdreg] + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fistp_m64abs(&mips3.cpr[1][FDREG]); /* fistp [fdreg]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x30: @@ -4911,32 +4915,32 @@ { if (IS_SINGLE(op)) /* C.EQ.S */ { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _comiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // comiss xmm0,[ftreg] + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _comiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* comiss xmm0,[ftreg]*/ } else { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _comisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // comisd xmm0,[ftreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _comisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* comisd xmm0,[ftreg]*/ } - _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // sete [cf[x]] + _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* sete [cf[x]]*/ } else { if (IS_SINGLE(op)) /* C.EQ.S */ { - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } else { - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } - _fcompp(); // fcompp - _fnstsw_ax(); // fnstsw ax - _sahf(); // sahf - _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // sete [cf[x]] + _fcompp(); /* fcompp*/ + _fnstsw_ax(); /* fnstsw ax*/ + _sahf(); /* sahf*/ + _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* sete [cf[x]]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4946,32 +4950,32 @@ { if (IS_SINGLE(op)) /* C.UEQ.S */ { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _ucomiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // ucomiss xmm0,[ftreg] + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _ucomiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* ucomiss xmm0,[ftreg]*/ } else { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _ucomisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // ucomisd xmm0,[ftreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _ucomisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* ucomisd xmm0,[ftreg]*/ } - _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // sete [cf[x]] + _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* sete [cf[x]]*/ } else { if (IS_SINGLE(op)) /* C.UEQ.S */ { - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } else { - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } - _fucompp(); // fucompp - _fnstsw_ax(); // fnstsw ax - _sahf(); // sahf - _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // sete [cf[x]] + _fucompp(); /* fucompp*/ + _fnstsw_ax(); /* fnstsw ax*/ + _sahf(); /* sahf*/ + _setcc_m8abs(COND_E, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* sete [cf[x]]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -4981,32 +4985,32 @@ { if (IS_SINGLE(op)) /* C.OLT.S */ { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _comiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // comiss xmm0,[ftreg] + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _comiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* comiss xmm0,[ftreg]*/ } else { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _comisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // comisd xmm0,[ftreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _comisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* comisd xmm0,[ftreg]*/ } - _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setb [cf[x]] + _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setb [cf[x]]*/ } else { if (IS_SINGLE(op)) /* C.OLT.S */ { - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } else { - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } - _fcompp(); // fcompp - _fnstsw_ax(); // fnstsw ax - _sahf(); // sahf - _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setb [cf[x]] + _fcompp(); /* fcompp*/ + _fnstsw_ax(); /* fnstsw ax*/ + _sahf(); /* sahf*/ + _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setb [cf[x]]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -5016,32 +5020,32 @@ { if (IS_SINGLE(op)) /* C.ULT.S */ { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _ucomiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // ucomiss xmm0,[ftreg] + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _ucomiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* ucomiss xmm0,[ftreg]*/ } else { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _ucomisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // ucomisd xmm0,[ftreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _ucomisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* ucomisd xmm0,[ftreg]*/ } - _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setb [cf[x]] + _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setb [cf[x]]*/ } else { if (IS_SINGLE(op)) /* C.ULT.S */ { - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } else { - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } - _fucompp(); // fucompp - _fnstsw_ax(); // fnstsw ax - _sahf(); // sahf - _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setb [cf[x]] + _fucompp(); /* fucompp*/ + _fnstsw_ax(); /* fnstsw ax*/ + _sahf(); /* sahf*/ + _setcc_m8abs(COND_B, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setb [cf[x]]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -5051,32 +5055,32 @@ { if (IS_SINGLE(op)) /* C.OLE.S */ { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _comiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // comiss xmm0,[ftreg] + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _comiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* comiss xmm0,[ftreg]*/ } else { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _comisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // comisd xmm0,[ftreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _comisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* comisd xmm0,[ftreg]*/ } - _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setle [cf[x]] + _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setle [cf[x]]*/ } else { if (IS_SINGLE(op)) /* C.OLE.S */ { - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } else { - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } - _fcompp(); // fcompp - _fnstsw_ax(); // fnstsw ax - _sahf(); // sahf - _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setbe [cf[x]] + _fcompp(); /* fcompp*/ + _fnstsw_ax(); /* fnstsw ax*/ + _sahf(); /* sahf*/ + _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setbe [cf[x]]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -5086,38 +5090,38 @@ { if (IS_SINGLE(op)) /* C.ULE.S */ { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _ucomiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // ucomiss xmm0,[ftreg] + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _ucomiss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* ucomiss xmm0,[ftreg]*/ } else { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _ucomisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // ucomisd xmm0,[ftreg] + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _ucomisd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* ucomisd xmm0,[ftreg]*/ } - _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setl [cf[x]] + _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setl [cf[x]]*/ } else { if (IS_SINGLE(op)) /* C.ULE.S */ { - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } else { - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ } - _fucompp(); // fucompp - _fnstsw_ax(); // fnstsw ax - _sahf(); // sahf - _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); // setbe [cf[x]] + _fucompp(); /* fucompp*/ + _fnstsw_ax(); /* fnstsw ax*/ + _sahf(); /* sahf*/ + _setcc_m8abs(COND_BE, &mips3.cf[1][mips3.is_mips4 ? ((op >> 8) & 7) : 0]); /* setbe [cf[x]]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); } break; } - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } @@ -5135,64 +5139,64 @@ { if (mips3.drcoptions & MIPS3DRC_STRICT_COP1) { - _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_COP1); // test [mips3.cpr[0][COP0_Status]],SR_COP1 - _jcc(COND_Z, mips3.generate_cop_exception); // jz generate_cop_exception + _test_m32abs_imm(&mips3.cpr[0][COP0_Status], SR_COP1); /* test [mips3.cpr[0][COP0_Status]],SR_COP1*/ + _jcc(COND_Z, mips3.generate_cop_exception); /* jz generate_cop_exception*/ } switch (op & 0x3f) { case 0x00: /* LWXC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // add eax,[rtreg] - _push_r32(REG_EAX); // push eax - _call(mips3.memory.readlong); // call readlong - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); // mov [fdreg],eax - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* add eax,[rtreg]*/ + _push_r32(REG_EAX); /* push eax*/ + _call(mips3.memory.readlong); /* call readlong*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_m32abs_r32(&mips3.cpr[1][FDREG], REG_EAX); /* mov [fdreg],eax*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x01: /* LDXC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // add eax,[rtreg] - _push_r32(REG_EAX); // push eax - _call(mips3.memory.readlong); // call readlong - _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.cpr[1][FDREG]) : LO(&mips3.cpr[1][FDREG]), REG_EAX);// mov [fdreg].hi/lo,eax - _pop_r32(REG_EAX); // pop eax - _add_r32_imm(REG_EAX, 4); // add eax,4 - _push_r32(REG_EAX); // push eax - _call(mips3.memory.readlong); // call readlong - _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.cpr[1][FDREG]) : HI(&mips3.cpr[1][FDREG]), REG_EAX);// mov [fdreg].lo/hi,eax - _add_r32_imm(REG_ESP, 4); // add esp,4 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* add eax,[rtreg]*/ + _push_r32(REG_EAX); /* push eax*/ + _call(mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(mips3.bigendian ? HI(&mips3.cpr[1][FDREG]) : LO(&mips3.cpr[1][FDREG]), REG_EAX);/* mov [fdreg].hi/lo,eax*/ + _pop_r32(REG_EAX); /* pop eax*/ + _add_r32_imm(REG_EAX, 4); /* add eax,4*/ + _push_r32(REG_EAX); /* push eax*/ + _call(mips3.memory.readlong); /* call readlong*/ + _mov_m32abs_r32(mips3.bigendian ? LO(&mips3.cpr[1][FDREG]) : HI(&mips3.cpr[1][FDREG]), REG_EAX);/* mov [fdreg].lo/hi,eax*/ + _add_r32_imm(REG_ESP, 4); /* add esp,4*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x08: /* SWXC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_m32abs(&mips3.cpr[1][FSREG]); // push [fsreg] - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // add eax,[rtreg] - _push_r32(REG_EAX); // push eax - _call(mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 8); // add esp,8 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_m32abs(&mips3.cpr[1][FSREG]); /* push [fsreg]*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* add eax,[rtreg]*/ + _push_r32(REG_EAX); /* push eax*/ + _call(mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 8); /* add esp,8*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x09: /* SDXC1 */ - _mov_m32abs_r32(&mips3_icount, REG_EBP); // mov [mips3_icount],ebp - _push_m32abs(mips3.bigendian ? HI(&mips3.cpr[1][FSREG]) : LO(&mips3.cpr[1][FSREG]));// push [fsreg].hi/lo - _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); // mov eax,[rsreg] - _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); // add eax,[rtreg] - _push_r32(REG_EAX); // push eax - _call(mips3.memory.writelong); // call writelong - _pop_r32(REG_EAX); // pop eax - _add_r32_imm(REG_EAX, 4); // add eax,4 - _push_m32abs(mips3.bigendian ? LO(&mips3.cpr[1][FSREG]) : HI(&mips3.cpr[1][FSREG]));// push [fsreg].lo/hi - _push_r32(REG_EAX); // push eax - _call(mips3.memory.writelong); // call writelong - _add_r32_imm(REG_ESP, 12); // add esp,12 - _mov_r32_m32abs(REG_EBP, &mips3_icount); // mov ebp,[mips3_icount] + _mov_m32abs_r32(&mips3_icount, REG_EBP); /* mov [mips3_icount],ebp*/ + _push_m32abs(mips3.bigendian ? HI(&mips3.cpr[1][FSREG]) : LO(&mips3.cpr[1][FSREG]));/* push [fsreg].hi/lo*/ + _mov_r32_m32abs(REG_EAX, &mips3.r[RSREG]); /* mov eax,[rsreg]*/ + _add_r32_m32abs(REG_EAX, &mips3.r[RTREG]); /* add eax,[rtreg]*/ + _push_r32(REG_EAX); /* push eax*/ + _call(mips3.memory.writelong); /* call writelong*/ + _pop_r32(REG_EAX); /* pop eax*/ + _add_r32_imm(REG_EAX, 4); /* add eax,4*/ + _push_m32abs(mips3.bigendian ? LO(&mips3.cpr[1][FSREG]) : HI(&mips3.cpr[1][FSREG]));/* push [fsreg].lo/hi*/ + _push_r32(REG_EAX); /* push eax*/ + _call(mips3.memory.writelong); /* call writelong*/ + _add_r32_imm(REG_ESP, 12); /* add esp,12*/ + _mov_r32_m32abs(REG_EBP, &mips3_icount); /* mov ebp,[mips3_icount]*/ return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x0f: /* PREFX */ @@ -5201,160 +5205,160 @@ case 0x20: /* MADD.S */ if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulss xmm0,[ftreg] - _addss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FRREG]); // addss xmm0,[frreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulss xmm0,[ftreg]*/ + _addss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FRREG]); /* addss xmm0,[frreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _faddp(); // faddp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _faddp(); /* faddp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x21: /* MADD.D */ if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulsd xmm0,[ftreg] - _addsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FRREG]); // addsd xmm0,[frreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulsd xmm0,[ftreg]*/ + _addsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FRREG]); /* addsd xmm0,[frreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _faddp(); // faddp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _faddp(); /* faddp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x28: /* MSUB.S */ if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulss xmm0,[ftreg] - _subss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FRREG]); // subss xmm0,[frreg] - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movss [fdreg],xmm0 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulss xmm0,[ftreg]*/ + _subss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FRREG]); /* subss xmm0,[frreg]*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movss [fdreg],xmm0*/ } else { - _fld_m32abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _fsubrp(); // fsubrp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _fsubrp(); /* fsubrp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x29: /* MSUB.D */ if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulsd xmm0,[ftreg] - _subsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FRREG]); // subsd xmm0,[frreg] - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); // movsd [fdreg],xmm0 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulsd xmm0,[ftreg]*/ + _subsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FRREG]); /* subsd xmm0,[frreg]*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM0); /* movsd [fdreg],xmm0*/ } else { - _fld_m64abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _fsubrp(); // fsubrp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _fsubrp(); /* fsubrp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x30: /* NMADD.S */ if (USE_SSE) { - _pxor_r128_r128(REG_XMM1, REG_XMM1); // pxor xmm1,xmm1 - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulss xmm0,[ftreg] - _addss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FRREG]); // addss xmm0,[frreg] - _subss_r128_r128(REG_XMM1, REG_XMM0); // subss xmm1,xmm0 - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); // movss [fdreg],xmm1 + _pxor_r128_r128(REG_XMM1, REG_XMM1); /* pxor xmm1,xmm1*/ + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulss xmm0,[ftreg]*/ + _addss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FRREG]); /* addss xmm0,[frreg]*/ + _subss_r128_r128(REG_XMM1, REG_XMM0); /* subss xmm1,xmm0*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); /* movss [fdreg],xmm1*/ } else { - _fld_m32abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _faddp(); // faddp - _fchs(); // fchs - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _faddp(); /* faddp*/ + _fchs(); /* fchs*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x31: /* NMADD.D */ if (USE_SSE) { - _pxor_r128_r128(REG_XMM1, REG_XMM1); // pxor xmm1,xmm1 - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulsd xmm0,[ftreg] - _addsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FRREG]); // addsd xmm0,[frreg] - _subss_r128_r128(REG_XMM1, REG_XMM0); // subss xmm1,xmm0 - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); // movsd [fdreg],xmm1 + _pxor_r128_r128(REG_XMM1, REG_XMM1); /* pxor xmm1,xmm1*/ + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulsd xmm0,[ftreg]*/ + _addsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FRREG]); /* addsd xmm0,[frreg]*/ + _subss_r128_r128(REG_XMM1, REG_XMM0); /* subss xmm1,xmm0*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); /* movsd [fdreg],xmm1*/ } else { - _fld_m64abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _faddp(); // faddp - _fchs(); // fchs - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _faddp(); /* faddp*/ + _fchs(); /* fchs*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x38: /* NMSUB.S */ if (USE_SSE) { - _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movss xmm0,[fsreg] - _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulss xmm0,[ftreg] - _movss_r128_m32abs(REG_XMM1, &mips3.cpr[1][FRREG]); // movss xmm1,[frreg] - _subss_r128_r128(REG_XMM1, REG_XMM0); // subss xmm1,xmm0 - _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); // movss [fdreg],xmm1 + _movss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movss xmm0,[fsreg]*/ + _mulss_r128_m32abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulss xmm0,[ftreg]*/ + _movss_r128_m32abs(REG_XMM1, &mips3.cpr[1][FRREG]); /* movss xmm1,[frreg]*/ + _subss_r128_r128(REG_XMM1, REG_XMM0); /* subss xmm1,xmm0*/ + _movss_m32abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); /* movss [fdreg],xmm1*/ } else { - _fld_m32abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m32abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m32abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _fsubp(); // fsubp - _fstp_m32abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m32abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m32abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m32abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _fsubp(); /* fsubp*/ + _fstp_m32abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); case 0x39: /* NMSUB.D */ if (USE_SSE) { - _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); // movsd xmm0,[fsreg] - _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); // mulsd xmm0,[ftreg] - _movsd_r128_m64abs(REG_XMM1, &mips3.cpr[1][FRREG]); // movsd xmm1,[frreg] - _subss_r128_r128(REG_XMM1, REG_XMM0); // subss xmm1,xmm0 - _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); // movsd [fdreg],xmm1 + _movsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FSREG]); /* movsd xmm0,[fsreg]*/ + _mulsd_r128_m64abs(REG_XMM0, &mips3.cpr[1][FTREG]); /* mulsd xmm0,[ftreg]*/ + _movsd_r128_m64abs(REG_XMM1, &mips3.cpr[1][FRREG]); /* movsd xmm1,[frreg]*/ + _subss_r128_r128(REG_XMM1, REG_XMM0); /* subss xmm1,xmm0*/ + _movsd_m64abs_r128(&mips3.cpr[1][FDREG], REG_XMM1); /* movsd [fdreg],xmm1*/ } else { - _fld_m64abs(&mips3.cpr[1][FRREG]); // fld [frreg] - _fld_m64abs(&mips3.cpr[1][FSREG]); // fld [fsreg] - _fld_m64abs(&mips3.cpr[1][FTREG]); // fld [ftreg] - _fmulp(); // fmulp - _fsubp(); // fsubrp - _fstp_m64abs(&mips3.cpr[1][FDREG]); // fstp [fdreg] + _fld_m64abs(&mips3.cpr[1][FRREG]); /* fld [frreg]*/ + _fld_m64abs(&mips3.cpr[1][FSREG]); /* fld [fsreg]*/ + _fld_m64abs(&mips3.cpr[1][FTREG]); /* fld [ftreg]*/ + _fmulp(); /* fmulp*/ + _fsubp(); /* fsubrp*/ + _fstp_m64abs(&mips3.cpr[1][FDREG]); /* fstp [fdreg]*/ } return RECOMPILE_SUCCESSFUL_CP(1,4); @@ -5370,7 +5374,7 @@ fprintf(stderr, "cop1x %X\n", op); break; } - _jmp((void *)mips3.generate_invalidop_exception); // jmp generate_invalidop_exception + _jmp((void *)mips3.generate_invalidop_exception); /* jmp generate_invalidop_exception*/ return RECOMPILE_SUCCESSFUL | RECOMPILE_END_OF_STRING; } @@ -5421,7 +5425,7 @@ case MIPS3_R28: return (UINT32)mips3.r[28]; case MIPS3_R29: return (UINT32)mips3.r[29]; case MIPS3_R30: return (UINT32)mips3.r[30]; -// case REG_SP: +/* case REG_SP:*/ case MIPS3_R31: return (UINT32)mips3.r[31]; case MIPS3_HI: return (UINT32)mips3.hi; case MIPS3_LO: return (UINT32)mips3.lo; @@ -5501,9 +5505,9 @@ default: if (regnum <= REG_SP_CONTENTS) { -// unsigned offset = REG_SP_CONTENTS - regnum; -// if (offset < PC_STACK_DEPTH) -// return mips3.pc_stack[offset]; +/* unsigned offset = REG_SP_CONTENTS - regnum;*/ +/* if (offset < PC_STACK_DEPTH)*/ +/* return mips3.pc_stack[offset];*/ } } return 0; @@ -5558,7 +5562,7 @@ case MIPS3_R28: mips3.r[28] = (INT32)val; break; case MIPS3_R29: mips3.r[29] = (INT32)val; break; case MIPS3_R30: mips3.r[30] = (INT32)val; break; -// case REG_SP: +/* case REG_SP:*/ case MIPS3_R31: mips3.r[31] = (INT32)val; break; case MIPS3_HI: mips3.hi = (INT32)val; break; case MIPS3_LO: mips3.lo = (INT32)val; break; @@ -5636,9 +5640,9 @@ default: if (regnum <= REG_SP_CONTENTS) { -// unsigned offset = REG_SP_CONTENTS - regnum; -// if (offset < PC_STACK_DEPTH) -// mips3.pc_stack[offset] = val; +/* unsigned offset = REG_SP_CONTENTS - regnum;*/ +/* if (offset < PC_STACK_DEPTH)*/ +/* mips3.pc_stack[offset] = val;*/ } } } @@ -5826,4 +5830,3 @@ return 4; #endif } -
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/mips/psx_cpu.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/mips/psx_cpu.c
Changed
@@ -216,20 +216,6 @@ 0x00000000 }; -#if 0 -void GTELOG(const char *a,...) -{ - va_list va; - char s_text[ 1024 ]; - va_start( va, a ); - vsprintf( s_text, a, va ); - va_end( va ); - logerror( "%08x: GTE: %08x %s\n", mipscpu.pc, INS_COFUN( mipscpu.op ), s_text ); -} -#else -static INLINE void GTELOG(const char *a, ...) {} -#endif - static UINT32 getcp2dr( int n_reg ); static void setcp2dr( int n_reg, UINT32 n_value ); static UINT32 getcp2cr( int n_reg ); @@ -758,7 +744,7 @@ break; case RS_CFC: /* todo: */ - logerror( "%08x: COP0 CFC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 CFC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; @@ -770,7 +756,7 @@ break; case RS_CTC: /* todo: */ - logerror( "%08x: COP0 CTC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 CTC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; @@ -779,19 +765,19 @@ { case RT_BCF: /* todo: */ - logerror( "%08x: COP0 BCF not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 BCF not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; case RT_BCT: /* todo: */ - logerror( "%08x: COP0 BCT not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 BCT not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; default: /* todo: */ - logerror( "%08x: COP0 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -809,7 +795,7 @@ break; default: /* todo: */ - logerror( "%08x: COP0 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -817,7 +803,7 @@ break; default: /* todo: */ - logerror( "%08x: COP0 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP0 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -838,25 +824,25 @@ { case RS_MFC: /* todo: */ - logerror( "%08x: COP1 BCT not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 BCT not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; case RS_CFC: /* todo: */ - logerror( "%08x: COP1 CFC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 CFC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; case RS_MTC: /* todo: */ - logerror( "%08x: COP1 MTC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 MTC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; case RS_CTC: /* todo: */ - logerror( "%08x: COP1 CTC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 CTC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; @@ -865,19 +851,19 @@ { case RT_BCF: /* todo: */ - logerror( "%08x: COP1 BCF not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 BCF not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; case RT_BCT: /* todo: */ - logerror( "%08x: COP1 BCT not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 BCT not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; default: /* todo: */ - logerror( "%08x: COP1 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -888,13 +874,13 @@ { case 1: /* todo: */ - logerror( "%08x: COP1 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; default: /* todo: */ - logerror( "%08x: COP1 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -932,19 +918,19 @@ { case RT_BCF: /* todo: */ - logerror( "%08x: COP2 BCF not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP2 BCF not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; case RT_BCT: /* todo: */ - logerror( "%08x: COP2 BCT not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP2 BCT not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; default: /* todo: */ - logerror( "%08x: COP2 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP2 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -959,7 +945,7 @@ break; default: /* todo: */ - logerror( "%08x: COP2 unknown command %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP2 unknown command %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_advance_pc(); break; @@ -972,7 +958,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LB SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LB SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1009,7 +995,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LH SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LH SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1046,7 +1032,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LWL SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LWL SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1113,7 +1099,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LW SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LW SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1136,7 +1122,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LBU SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LBU SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1173,7 +1159,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LHU SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LHU SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1210,7 +1196,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LWR SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LWR SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1277,7 +1263,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: SB SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: SB SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1316,7 +1302,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: SH SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: SH SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1355,7 +1341,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: SWL SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: SWL SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1425,7 +1411,7 @@ { /* todo: */ /* used by bootstrap - logerror( "%08x: SW SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: SW SR_ISC not supported\n", mipscpu.pc ); mips_stop(); */ mips_advance_pc(); @@ -1450,7 +1436,7 @@ if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: SWR SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: SWR SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1517,7 +1503,7 @@ break; case OP_LWC1: /* todo: */ - logerror( "%08x: COP1 LWC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 LWC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; @@ -1530,7 +1516,7 @@ else if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: LWC2 SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: LWC2 SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1553,7 +1539,7 @@ break; case OP_SWC1: /* todo: */ - logerror( "%08x: COP1 SWC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: COP1 SWC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); break; @@ -1566,7 +1552,7 @@ else if( ( mipscpu.cp0r[ CP0_SR ] & SR_ISC ) != 0 ) { /* todo: */ - logerror( "%08x: SWC2 SR_ISC not supported\n", mipscpu.pc ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: SWC2 SR_ISC not supported\n", mipscpu.pc ); mips_stop(); mips_advance_pc(); } @@ -1587,7 +1573,7 @@ } break; default: - logerror( "%08x: unknown opcode %08x\n", mipscpu.pc, mipscpu.op ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: unknown opcode %08x\n", mipscpu.pc, mipscpu.op ); mips_stop(); mips_exception( EXC_RI ); break; @@ -2272,13 +2258,13 @@ { ORGB = ( ( IR1 >> 7 ) & 0x1f ) | ( ( IR2 >> 2 ) & 0x3e0 ) | ( ( IR3 << 3 ) & 0x7c00 ); } - GTELOG( "get CP2DR%u=%08x", n_reg, mipscpu.cp2dr[ n_reg ].d ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "get CP2DR%u=%08x", n_reg, mipscpu.cp2dr[ n_reg ].d ); return mipscpu.cp2dr[ n_reg ].d; } static void setcp2dr( int n_reg, UINT32 n_value ) { - GTELOG( "set CP2DR%u=%08x", n_reg, n_value ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "set CP2DR%u=%08x", n_reg, n_value ); mipscpu.cp2dr[ n_reg ].d = n_value; if( n_reg == 15 ) @@ -2313,13 +2299,13 @@ static UINT32 getcp2cr( int n_reg ) { - GTELOG( "get CP2CR%u=%08x", n_reg, mipscpu.cp2cr[ n_reg ].d ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "get CP2CR%u=%08x", n_reg, mipscpu.cp2cr[ n_reg ].d ); return mipscpu.cp2cr[ n_reg ].d; } static void setcp2cr( int n_reg, UINT32 n_value ) { - GTELOG( "set CP2CR%u=%08x", n_reg, n_value ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "set CP2CR%u=%08x", n_reg, n_value ); mipscpu.cp2cr[ n_reg ].d = n_value; } @@ -2413,7 +2399,7 @@ case 0x01: if( gteop == 0x0180001 ) { - GTELOG( "RTPS" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "RTPS" ); FLAG = 0; MAC1 = A1( ( ( (INT64)(INT32)TRX << 12 ) + ( (INT16)R11 * (INT16)VX0 ) + ( (INT16)R12 * (INT16)VY0 ) + ( (INT16)R13 * (INT16)VZ0 ) ) >> 12 ); @@ -2438,7 +2424,7 @@ case 0x02: if( gteop == 0x0280030 ) { - GTELOG( "RTPT" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "RTPT" ); FLAG = 0; for( n_v = 0; n_v < 3; n_v++ ) @@ -2467,7 +2453,7 @@ if( GTE_CT( gteop ) == 0x012 || GTE_CT( gteop ) == 0x412 ) { - GTELOG( "MVMVA" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "MVMVA" ); n_sf = 12 * GTE_SF( gteop ); p_n_mx = p_p_n_mx[ GTE_MX( gteop ) ]; n_v = GTE_V( gteop ); @@ -2500,7 +2486,7 @@ case 0x07: if( gteop == 0x0780010 ) { - GTELOG( "DPCS" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "DPCS" ); FLAG = 0; MAC1 = A1( ( ( (INT64)R << 16 ) + ( (INT64)(INT16)IR0 * ( Lm_B1( (INT32)RFC - ( R << 4 ), 0 ) ) ) ) >> 12 ); @@ -2527,7 +2513,7 @@ case 0x09: if( gteop == 0x0980011 ) { - GTELOG( "INTPL" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "INTPL" ); FLAG = 0; MAC1 = A1( ( ( (INT64)(INT16)IR1 << 12 ) + ( (INT64)(INT16)IR0 * ( Lm_B1( (INT32)RFC - (INT16)IR1, 0 ) ) ) ) >> 12 ); @@ -2554,7 +2540,7 @@ case 0x0a: if( GTE_CT( gteop ) == 0x428 ) { - GTELOG( "SQR" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "SQR" ); n_sf = 12 * GTE_SF( gteop ); FLAG = 0; @@ -2570,7 +2556,7 @@ case 0x0c: if( gteop == 0x0c8041e ) { - GTELOG( "NCS" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCS" ); FLAG = 0; MAC1 = A1( ( ( (INT64)(INT16)L11 * (INT16)VX0 ) + ( (INT16)L12 * (INT16)VY0 ) + ( (INT16)L13 * (INT16)VZ0 ) ) >> 12 ); @@ -2603,7 +2589,7 @@ case 0x0d: if( gteop == 0x0d80420 ) { - GTELOG( "NCT" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCT" ); FLAG = 0; for( n_v = 0; n_v < 3; n_v++ ) @@ -2639,7 +2625,7 @@ case 0x0e: if( gteop == 0x0e80413 ) { - GTELOG( "NCDS" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCDS" ); FLAG = 0; MAC1 = A1( ( ( (INT64)(INT16)L11 * (INT16)VX0 ) + ( (INT16)L12 * (INT16)VY0 ) + ( (INT16)L13 * (INT16)VZ0 ) ) >> 12 ); @@ -2678,7 +2664,7 @@ case 0x0f: if( gteop == 0x0f8002a ) { - GTELOG( "DPCT" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "DPCT" ); FLAG = 0; for( n_pass = 0; n_pass < 3; n_pass++ ) @@ -2706,7 +2692,7 @@ } else if( gteop == 0x0f80416 ) { - GTELOG( "NCDT" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCDT" ); FLAG = 0; for( n_v = 0; n_v < 3; n_v++ ) @@ -2748,7 +2734,7 @@ case 0x10: if( gteop == 0x108041b ) { - GTELOG( "NCCS" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCCS" ); FLAG = 0; MAC1 = A1( ( ( (INT64)(INT16)L11 * (INT16)VX0 ) + ( (INT16)L12 * (INT16)VY0 ) + ( (INT16)L13 * (INT16)VZ0 ) ) >> 12 ); @@ -2787,7 +2773,7 @@ case 0x11: if( gteop == 0x118043f ) { - GTELOG( "NCCT" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCCT" ); FLAG = 0; for( n_v = 0; n_v < 3; n_v++ ) @@ -2829,7 +2815,7 @@ case 0x13: if( gteop == 0x138041c ) { - GTELOG( "CC" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "CC" ); FLAG = 0; MAC1 = A1( ( ( (INT64)RBK << 12 ) + ( (INT16)LR1 * (INT16)IR1 ) + ( (INT16)LR2 * (INT16)IR2 ) + ( (INT16)LR3 * (INT16)IR3 ) ) >> 12 ); @@ -2862,7 +2848,7 @@ case 0x14: if( gteop == 0x1400006 ) { - GTELOG( "NCLIP" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "NCLIP" ); FLAG = 0; MAC0 = F( ( (INT64)(INT16)SX0 * (INT16)SY1 ) + ( (INT16)SX1 * (INT16)SY2 ) + ( (INT16)SX2 * (INT16)SY0 ) - ( (INT16)SX0 * (INT16)SY2 ) - ( (INT16)SX1 * (INT16)SY0 ) - ( (INT16)SX2 * (INT16)SY1 ) ); @@ -2872,7 +2858,7 @@ case 0x15: if( gteop == 0x158002d ) { - GTELOG( "AVSZ3" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "AVSZ3" ); FLAG = 0; MAC0 = F( ( (INT64)(INT16)ZSF3 * SZ1 ) + ( (INT16)ZSF3 * SZ2 ) + ( (INT16)ZSF3 * SZ3 ) ); @@ -2883,7 +2869,7 @@ case 0x16: if( gteop == 0x168002e ) { - GTELOG( "AVSZ4" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "AVSZ4" ); FLAG = 0; MAC0 = F( ( (INT64)(INT16)ZSF4 * SZ0 ) + ( (INT16)ZSF4 * SZ1 ) + ( (INT16)ZSF4 * SZ2 ) + ( (INT16)ZSF4 * SZ3 ) ); @@ -2894,7 +2880,7 @@ case 0x17: if( GTE_CT( gteop ) == 0x00c ) { - GTELOG( "OP" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "OP" ); n_sf = 12 * GTE_SF( gteop ); FLAG = 0; @@ -2910,7 +2896,7 @@ case 0x19: if( GTE_CT( gteop ) == 0x03d ) { - GTELOG( "GPF" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "GPF" ); n_sf = 12 * GTE_SF( gteop ); FLAG = 0; @@ -2938,7 +2924,7 @@ case 0x1a: if( GTE_CT( gteop ) == 0x03e ) { - GTELOG( "GPL" ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "GPL" ); n_sf = 12 * GTE_SF( gteop ); FLAG = 0; @@ -2965,6 +2951,6 @@ break; } usrintf_showmessage_secs( 1, "unknown GTE op %08x", gteop ); - logerror( "%08x: unknown GTE op %08x\n", mipscpu.pc, gteop ); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: unknown GTE op %08x\n", mipscpu.pc, gteop ); mips_stop(); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/mips/r3000.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/mips/r3000.c
Changed
@@ -1021,9 +1021,9 @@ default: if (regnum <= REG_SP_CONTENTS) { -// unsigned offset = REG_SP_CONTENTS - regnum; -// if (offset < PC_STACK_DEPTH) -// return r3000.pc_stack[offset]; +/* unsigned offset = REG_SP_CONTENTS - regnum;*/ +/* if (offset < PC_STACK_DEPTH)*/ +/* return r3000.pc_stack[offset];*/ } } return 0; @@ -1080,9 +1080,9 @@ default: if (regnum <= REG_SP_CONTENTS) { -// unsigned offset = REG_SP_CONTENTS - regnum; -// if (offset < PC_STACK_DEPTH) -// r3000.pc_stack[offset] = val; +/* unsigned offset = REG_SP_CONTENTS - regnum;*/ +/* if (offset < PC_STACK_DEPTH)*/ +/* r3000.pc_stack[offset] = val;*/ } } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/nec/nec.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/nec/nec.c
Changed
@@ -571,7 +571,7 @@ OP( 0x99, i_cwd ) { I.regs.w[DW] = (I.regs.b[AH] & 0x80) ? 0xffff : 0; CLK(4); } OP( 0x9a, i_call_far ) { UINT32 tmp, tmp2; FETCHWORD(tmp); FETCHWORD(tmp2); PUSH(I.sregs[CS]); PUSH(I.ip); I.ip = (WORD)tmp; I.sregs[CS] = (WORD)tmp2; CHANGE_PC; CLKW(29,29,13,29,21,9,I.regs.w[SP]); } OP( 0x9b, i_wait ) { logerror("%06x: Hardware POLL\n",activecpu_get_pc()); } -OP( 0x9c, i_pushf ) { PUSH( CompressFlags() ); CLKS(12,8,3); } +OP( 0x9c, i_pushf ) { UINT32 val = CompressFlags(); PUSH( val ); CLKS(12,8,3); } OP( 0x9d, i_popf ) { UINT32 tmp; POP(tmp); ExpandFlags(tmp); CLKS(12,8,5); if (I.TF) nec_trap(); } OP( 0x9e, i_sahf ) { UINT32 tmp = (CompressFlags() & 0xff00) | (I.regs.b[AH] & 0xd5); ExpandFlags(tmp); CLKS(3,3,2); } OP( 0x9f, i_lahf ) { I.regs.b[AH] = CompressFlags() & 0xff; CLKS(3,3,2); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms32031/32031ops.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms32031/32031ops.c
Changed
@@ -615,9 +615,11 @@ /* check for underflow */ if (exp <= -128) { + /* make sure a 0 result doesn't set underflow */ + if (man != 0 || exp < -128) + IREG(TMR_ST) |= UFFLAG | LUFFLAG; man = 0x80000000; exp = -128; - IREG(TMR_ST) |= UFFLAG | LUFFLAG; } /* check for overflow */ @@ -1695,31 +1697,35 @@ static void fix_reg(void) { int dreg = (OP >> 16) & 31; - tms32031.r[dreg] = tms32031.r[OP & 7]; - float2int(&tms32031.r[dreg]); + tms32031.r[TMR_TEMP1] = tms32031.r[OP & 7]; + float2int(&tms32031.r[TMR_TEMP1]); + SET_MANTISSA(&tms32031.r[dreg], MANTISSA(&tms32031.r[TMR_TEMP1])); } static void fix_dir(void) { UINT32 res = RMEM(DIRECT()); int dreg = (OP >> 16) & 31; - LONG2FP(dreg, res); - float2int(&tms32031.r[dreg]); + LONG2FP(TMR_TEMP1, res); + float2int(&tms32031.r[TMR_TEMP1]); + SET_MANTISSA(&tms32031.r[dreg], MANTISSA(&tms32031.r[TMR_TEMP1])); } static void fix_ind(void) { UINT32 res = RMEM(INDIRECT_D(OP >> 8)); int dreg = (OP >> 16) & 31; - LONG2FP(dreg, res); - float2int(&tms32031.r[dreg]); + LONG2FP(TMR_TEMP1, res); + float2int(&tms32031.r[TMR_TEMP1]); + SET_MANTISSA(&tms32031.r[dreg], MANTISSA(&tms32031.r[TMR_TEMP1])); } static void fix_imm(void) { int dreg = (OP >> 16) & 31; - SHORT2FP(dreg, OP); - float2int(&tms32031.r[dreg]); + SHORT2FP(TMR_TEMP1, OP); + float2int(&tms32031.r[TMR_TEMP1]); + SET_MANTISSA(&tms32031.r[dreg], MANTISSA(&tms32031.r[TMR_TEMP1])); } /*-----------------------------------------------------*/ @@ -5790,11 +5796,11 @@ /*-----------------------------------------------------*/ -// src2 = ind(OP) -// dst2 = ind(OP >> 8) -// sreg3 = ((OP >> 16) & 7) -// sreg1 = ((OP >> 19) & 7) -// dreg1 = ((OP >> 22) & 7) +/* src2 = ind(OP)*/ +/* dst2 = ind(OP >> 8)*/ +/* sreg3 = ((OP >> 16) & 7)*/ +/* sreg1 = ((OP >> 19) & 7)*/ +/* dreg1 = ((OP >> 22) & 7)*/ static void absfstf(void) {
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/34010dsm.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/34010dsm.c
Changed
@@ -1731,4 +1731,3 @@ { return Dasm340x0(buff, pc, 1); } -
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/34010fld.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/34010fld.c
Changed
@@ -657,5 +657,3 @@ RFIELDMAC_BIG(0x7fffffff,2); return ((INT32)(ret << 1)) >> 1; } - -
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/34010gfx.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/34010gfx.c
Changed
@@ -22,14 +22,12 @@ { if (!P_FLAG) { -#if 0 if (state.window_checking != 0 && state.window_checking != 3) - logerror("LINE XY %08X - Window Checking Mode %d not supported\n", PC, state.window_checking); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "LINE XY %08X - Window Checking Mode %d not supported\n", PC, state.window_checking); P_FLAG = 1; TEMP = (state.op & 0x80) ? 1 : 0; /* boundary value depends on the algorithm */ - //LOGGFX(("%08X(%3d):LINE (%d,%d)-(%d,%d)\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DADDR_X + DYDX_X, DADDR_Y + DYDX_Y)); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08X(%3d):LINE (%d,%d)-(%d,%d)\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DADDR_X + DYDX_X, DADDR_Y + DYDX_Y); } if (COUNT > 0) @@ -87,10 +85,8 @@ int ey = sy + *dy - 1; int diff, cycles = 3; -#if 0 if (state.window_checking == 1 || state.window_checking == 2) - logerror("%08x: %s apply_window window mode %d not supported!\n", activecpu_get_pc(), inst_name, state.window_checking); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08x: %s apply_window window mode %d not supported!\n", activecpu_get_pc(), inst_name, state.window_checking); if (state.window_checking == 1) V_FLAG = 1; @@ -212,20 +208,16 @@ { if (state.config->from_shiftreg) (*state.config->from_shiftreg)((UINT32)(offset << 3) & ~15, &state.shiftreg[0]); -#if 0 else - logerror("From ShiftReg function not set. PC = %08X\n", PC); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "From ShiftReg function not set. PC = %08X\n", PC); } static data16_t shiftreg_r(offs_t offset) { if (state.config->to_shiftreg) (*state.config->to_shiftreg)((UINT32)(offset << 3) & ~15, &state.shiftreg[0]); -#if 0 else - logerror("To ShiftReg function not set. PC = %08X\n", PC); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "To ShiftReg function not set. PC = %08X\n", PC); return state.shiftreg[0]; } @@ -914,7 +906,7 @@ int trans = (IOREG(REG_CONTROL) & 0x20) >> 5; int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT B,L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT B,L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; (*pixblt_b_op_table[ix])(1); @@ -926,7 +918,7 @@ int trans = (IOREG(REG_CONTROL) & 0x20) >> 5; int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT B,XY (%d,%d) (%dx%d) depth=%d\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT B,XY (%d,%d) (%dx%d) depth=%d\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; (*pixblt_b_op_table[ix])(0); @@ -939,7 +931,7 @@ int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int pbh = (IOREG(REG_CONTROL) >> 8) & 1; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT L,L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT L,L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; if (!pbh) @@ -955,7 +947,7 @@ int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int pbh = (IOREG(REG_CONTROL) >> 8) & 1; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT L,XY (%d,%d) (%dx%d) depth=%d\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT L,XY (%d,%d) (%dx%d) depth=%d\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; if (!pbh) @@ -971,7 +963,7 @@ int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int pbh = (IOREG(REG_CONTROL) >> 8) & 1; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT XY,L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT XY,L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; if (!pbh) @@ -987,7 +979,7 @@ int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int pbh = (IOREG(REG_CONTROL) >> 8) & 1; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT XY,XY (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):PIXBLT XY,XY (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; if (!pbh) @@ -1002,7 +994,7 @@ int trans = (IOREG(REG_CONTROL) & 0x20) >> 5; int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):FILL L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):FILL L (%dx%d) depth=%d\n", PC, cpu_getscanline(), DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; (*fill_op_table[ix])(1); @@ -1014,7 +1006,7 @@ int trans = (IOREG(REG_CONTROL) & 0x20) >> 5; int rop = (IOREG(REG_CONTROL) >> 10) & 0x1f; int ix = trans | (rop << 1) | (psize << 6); - //if (!P_FLAG) LOGGFX(("%08X(%3d):FILL XY (%d,%d) (%dx%d) depth=%d\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32)); + /*if (!P_FLAG) LOGGFX(("%08X(%3d):FILL XY (%d,%d) (%dx%d) depth=%d\n", PC, cpu_getscanline(), DADDR_X, DADDR_Y, DYDX_X, DYDX_Y, IOREG(REG_PSIZE) ? IOREG(REG_PSIZE) : 32));*/ pixel_op = pixel_op_table[rop]; pixel_op_timing = pixel_op_timing_table[rop]; (*fill_op_table[ix])(0); @@ -1075,7 +1067,7 @@ else daddr = DADDR; daddr &= ~(BITS_PER_PIXEL - 1); - //LOGGFX((" saddr=%08X daddr=%08X sptch=%08X dptch=%08X\n", saddr, daddr, SPTCH, DPTCH)); + /*LOGGFX((" saddr=%08X daddr=%08X sptch=%08X dptch=%08X\n", saddr, daddr, SPTCH, DPTCH));*/ /* bail if we're clipped */ if (dx <= 0 || dy <= 0) @@ -1252,7 +1244,7 @@ daddr -= DPTCH; } } - //LOGGFX((" (%d cycles)\n", state.gfxcycles)); + /*LOGGFX((" (%d cycles)\n", state.gfxcycles));*/ } /* eat cycles */ @@ -1320,7 +1312,7 @@ else daddr = DADDR; daddr &= ~(BITS_PER_PIXEL - 1); - //LOGGFX((" saddr=%08X daddr=%08X sptch=%08X dptch=%08X\n", saddr, daddr, SPTCH, DPTCH)); + /*LOGGFX((" saddr=%08X daddr=%08X sptch=%08X dptch=%08X\n", saddr, daddr, SPTCH, DPTCH));*/ /* bail if we're clipped */ if (dx <= 0 || dy <= 0) @@ -1496,7 +1488,7 @@ daddr -= DPTCH; } } - //LOGGFX((" (%d cycles)\n", state.gfxcycles)); + /*LOGGFX((" (%d cycles)\n", state.gfxcycles));*/ } /* eat cycles */ @@ -1567,7 +1559,7 @@ else daddr = DADDR; daddr &= ~(BITS_PER_PIXEL - 1); - //LOGGFX((" saddr=%08X daddr=%08X sptch=%08X dptch=%08X\n", saddr, daddr, SPTCH, DPTCH)); + /*LOGGFX((" saddr=%08X daddr=%08X sptch=%08X dptch=%08X\n", saddr, daddr, SPTCH, DPTCH));*/ /* bail if we're clipped */ if (dx <= 0 || dy <= 0) @@ -1706,7 +1698,7 @@ saddr += SPTCH; daddr += DPTCH; } - //LOGGFX((" (%d cycles)\n", state.gfxcycles)); + /*LOGGFX((" (%d cycles)\n", state.gfxcycles));*/ } /* eat cycles */ @@ -1765,7 +1757,7 @@ else daddr = DADDR; daddr &= ~(BITS_PER_PIXEL - 1); - //LOGGFX((" daddr=%08X\n", daddr)); + /*LOGGFX((" daddr=%08X\n", daddr));*/ /* bail if we're clipped */ if (dx <= 0 || dy <= 0) @@ -1898,7 +1890,7 @@ } bailout: (void)0; - //LOGGFX((" (%d cycles)\n", state.gfxcycles)); + /*LOGGFX((" (%d cycles)\n", state.gfxcycles));*/ } /* eat cycles */ @@ -1941,4 +1933,3 @@ } #endif -
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/34010ops.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/34010ops.c
Changed
@@ -22,6 +22,8 @@ #define COUNT_CYCLES(x) tms34010_ICount -= x #define COUNT_UNKNOWN_CYCLES(x) COUNT_CYCLES(x) +#define CORRECT_ODD_PC(x) do { if (PC & 0x0f) logerror("%s to PC=%08X\n", x, PC); PC &= ~0x0f; } while (0) + /*################################################################################################### @@ -56,6 +58,12 @@ if (cpu_readop16(TOBYTE(PC - 0x10)) == 0x0007) return; + /* 9 Ball Shootout calls to FFDF7468, expecting it */ + /* to execute the next instruction from FFDF7470 */ + /* but the instruction at FFDF7460 is an 0x0001 */ + if (cpu_readop16(TOBYTE(PC - 0x10)) == 0x0001) + return; + PUSH(PC); PUSH(GET_ST()); RESET_ST(); @@ -1371,7 +1379,8 @@ { \ PUSH(PC); \ PC = R##REG(R##DSTREG); \ - change_pc29lew(TOBYTE(PC)); \ + CORRECT_ODD_PC("CALL"); \ + change_pc29lew(TOBYTE(PC)); \ COUNT_CYCLES(3); \ } static void call_a (void) { CALL(A); } @@ -1388,6 +1397,7 @@ { PUSH(PC+0x20); PC = PARAM_LONG_NO_INC(); + CORRECT_ODD_PC("CALLA"); change_pc29lew(TOBYTE(PC)); COUNT_CYCLES(4); } @@ -1494,7 +1504,8 @@ INT32 temppc = *rd; \ *rd = PC; \ PC = temppc; \ - change_pc29lew(TOBYTE(PC)); \ + CORRECT_ODD_PC("EXGPC"); \ + change_pc29lew(TOBYTE(PC)); \ COUNT_CYCLES(2); \ } static void exgpc_a (void) { EXGPC(A); } @@ -1533,9 +1544,10 @@ if (TAKE) \ { \ PC = PARAM_LONG_NO_INC(); \ - change_pc29lew(TOBYTE(PC)); \ + CORRECT_ODD_PC("J_XX_8"); \ + change_pc29lew(TOBYTE(PC)); \ COUNT_CYCLES(3); \ - } \ + } \ else \ { \ SKIP_LONG; \ @@ -1778,7 +1790,8 @@ #define JUMP(R) \ { \ PC = R##REG(R##DSTREG); \ - change_pc29lew(TOBYTE(PC)); \ + CORRECT_ODD_PC("JUMP"); \ + change_pc29lew(TOBYTE(PC)); \ COUNT_CYCLES(2); \ } static void jump_a (void) { JUMP(A); } @@ -1808,6 +1821,7 @@ { INT32 st = POP(); PC = POP(); + CORRECT_ODD_PC("RETI"); change_pc29lew(TOBYTE(PC)); SET_ST(st); COUNT_CYCLES(11); @@ -1817,6 +1831,7 @@ { UINT32 offs; PC = POP(); + CORRECT_ODD_PC("RETS"); change_pc29lew(TOBYTE(PC)); offs = PARAM_N; if (offs) @@ -1844,6 +1859,7 @@ } RESET_ST(); PC = RLONG(0xffffffe0-(t<<5)); + CORRECT_ODD_PC("TRAP"); change_pc29lew(TOBYTE(PC)); COUNT_CYCLES(16); } @@ -2017,25 +2033,24 @@ tms34010_ICount -= 2; } } -#if 0 + /* src is aligned, dst is not */ else if (!(src & 0x0f)) { - logerror("020:BLMOVE with aligned src and unaligned dst\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "020:BLMOVE with aligned src and unaligned dst\n"); } /* dst is aligned, src is not */ else if (!(dst & 0x0f)) { - logerror("020:BLMOVE with unaligned src and aligned dst\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "020:BLMOVE with unaligned src and aligned dst\n"); } /* neither are aligned */ else { - logerror("020:BLMOVE with completely unaligned src and dst\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "020:BLMOVE with completely unaligned src and dst\n"); } -#endif /* update the final results */ BREG(BINDEX(0)) = src; @@ -2050,91 +2065,91 @@ static void cexec_l(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cexec_l\n"); + /*logerror("020:cexec_l\n");*/ } static void cexec_s(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cexec_s\n"); + /*logerror("020:cexec_s\n");*/ } static void clip(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:clip\n"); + /*logerror("020:clip\n");*/ } static void cmovcg_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovcg_a\n"); + /*logerror("020:cmovcg_a\n");*/ } static void cmovcg_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovcg_b\n"); + /*logerror("020:cmovcg_b\n");*/ } static void cmovcm_f(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovcm_f\n"); + /*logerror("020:cmovcm_f\n");*/ } static void cmovcm_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovcm_b\n"); + /*logerror("020:cmovcm_b\n");*/ } static void cmovgc_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovgc_a\n"); + /*logerror("020:cmovgc_a\n");*/ } static void cmovgc_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovgc_b\n"); + /*logerror("020:cmovgc_b\n");*/ } static void cmovgc_a_s(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovgc_a_s\n"); + /*logerror("020:cmovgc_a_s\n");*/ } static void cmovgc_b_s(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovgc_b_s\n"); + /*logerror("020:cmovgc_b_s\n");*/ } static void cmovmc_f(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovmc_f\n"); + /*logerror("020:cmovmc_f\n");*/ } static void cmovmc_f_va(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovmc_f_va\n"); + /*logerror("020:cmovmc_f_va\n");*/ } static void cmovmc_f_vb(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovmc_f_vb\n"); + /*logerror("020:cmovmc_f_vb\n");*/ } static void cmovmc_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cmovmc_b\n"); + /*logerror("020:cmovmc_b\n");*/ } #define CMPK(R) \ @@ -2160,91 +2175,91 @@ static void cvdxyl_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cvdxyl_a\n"); + /*logerror("020:cvdxyl_a\n");*/ } static void cvdxyl_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cvdxyl_b\n"); + /*logerror("020:cvdxyl_b\n");*/ } static void cvmxyl_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cvmxyl_a\n"); + /*logerror("020:cvmxyl_a\n");*/ } static void cvmxyl_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cvmxyl_b\n"); + /*logerror("020:cvmxyl_b\n");*/ } static void cvsxyl_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cvsxyl_a\n"); + /*logerror("020:cvsxyl_a\n");*/ } static void cvsxyl_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:cvsxyl_b\n"); + /*logerror("020:cvsxyl_b\n");*/ } static void exgps_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:exgps_a\n"); + /*logerror("020:exgps_a\n");*/ } static void exgps_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:exgps_b\n"); + /*logerror("020:exgps_b\n");*/ } static void fline(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:fline\n"); + /*logerror("020:fline\n");*/ } static void fpixeq(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:fpixeq\n"); + /*logerror("020:fpixeq\n");*/ } static void fpixne(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:fpixne\n"); + /*logerror("020:fpixne\n");*/ } static void getps_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:getps_a\n"); + /*logerror("020:getps_a\n");*/ } static void getps_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:getps_b\n"); + /*logerror("020:getps_b\n");*/ } static void idle(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:idle\n"); + /*logerror("020:idle\n");*/ } static void linit(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:linit\n"); + /*logerror("020:linit\n");*/ } static void mwait(void) @@ -2255,19 +2270,19 @@ static void pfill_xy(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:pfill_xy\n"); + /*logerror("020:pfill_xy\n");*/ } static void pixblt_l_m_l(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:pixblt_l_m_l\n"); + /*logerror("020:pixblt_l_m_l\n");*/ } static void retm(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:retm\n"); + /*logerror("020:retm\n");*/ } #define RMO(R) \ @@ -2348,59 +2363,59 @@ static void setcdp(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:setcdp\n"); + /*logerror("020:setcdp\n");*/ } static void setcmp(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:setcmp\n"); + /*logerror("020:setcmp\n");*/ } static void setcsp(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:setcsp\n"); + /*logerror("020:setcsp\n");*/ } static void swapf_a(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:swapf_a\n"); + /*logerror("020:swapf_a\n");*/ } static void swapf_b(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:swapf_b\n"); + /*logerror("020:swapf_b\n");*/ } static void tfill_xy(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:tfill_xy\n"); + /*logerror("020:tfill_xy\n");*/ } static void trapl(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:trapl\n"); + /*logerror("020:trapl\n");*/ } static void vblt_b_l(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:vblt_b_l\n"); + /*logerror("020:vblt_b_l\n");*/ } static void vfill_l(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:vfill_l\n"); + /*logerror("020:vfill_l\n");*/ } static void vlcol(void) { if (!state.is_34020) { unimpl(); return; } - //logerror("020:vlcol\n"); + /*logerror("020:vlcol\n");*/ }
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/dis34010.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/dis34010.c
Changed
@@ -82,14 +82,14 @@ filebuf=malloc(len+16); if (!filebuf) { - printf ("Memory allocation error\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "Memory allocation error\n"); fclose (f); return 3; } memset (filebuf,0,len+16); if (fread(filebuf,1,len,f)!=len) { - printf ("Read error\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "Read error\n"); fclose (f); free (filebuf); return 4; @@ -100,11 +100,11 @@ { i=(Dasm34010 (buf,pc<<3))>>3; - printf ("%08X: ",(pc+offset) << 3); - for (j=0;j<i ;++j) printf("%02X ",filebuf[pc+j]); - for ( ;j<10;++j) printf(" "); - printf(buf); - printf ("\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%08X: ",(pc+offset) << 3); + for (j=0;j<i ;++j) log_cb(RETRO_LOG_DEBUG, LOGPRE "%02X ",filebuf[pc+j]); + for ( ;j<10;++j) log_cb(RETRO_LOG_DEBUG, LOGPRE " "); + log_cb(RETRO_LOG_DEBUG, LOGPRE buf); + log_cb(RETRO_LOG_DEBUG, LOGPRE "\n"); pc+=i; } free (filebuf);
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/makefile -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/makefile
Changed
@@ -3,4 +3,3 @@ dis34010.o : dis34010.c 34010dsm.c gcc -c -m486 -O3 -ffast-math -fomit-frame-pointer -finline-functions -I/mame/src -I/mame/src/msdos dis34010.c -
View file
libretro-mame2003-0~git20200805.tar.xz/src/cpu/tms34010/tms34010.c -> libretro-mame2003-0~git20210529.tar.xz/src/cpu/tms34010/tms34010.c
Changed
@@ -26,16 +26,6 @@ ** DEBUG STATE & STRUCTURES **#################################################################################################*/ -#define VERBOSE 0 -#define LOG_CONTROL_REGS 0 -#define LOG_GRAPHICS_OPS 0 - -#if VERBOSE -#define LOG(x) logerror x -#else -#define LOG(x) -#endif - static UINT8 tms34010_reg_layout[] = { TMS34010_PC, TMS34010_SP, -1, @@ -532,12 +522,12 @@ static INLINE void PUSH(UINT32 data) { SP -= 0x20; - TMS34010_WRMEM_DWORD(TOBYTE(SP), data); + WLONG(SP, data); } static INLINE INT32 POP(void) { - INT32 ret = TMS34010_RDMEM_DWORD(TOBYTE(SP)); + INT32 ret = RLONG(SP); SP += 0x20; return ret; } @@ -567,10 +557,8 @@ { if (state.config->to_shiftreg) state.config->to_shiftreg(offset, &state.shiftreg[0]); -#if 0 else - logerror("To ShiftReg function not set. PC = %08X\n", PC); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "To ShiftReg function not set. PC = %08X\n", PC); return state.shiftreg[0]; } @@ -687,10 +675,8 @@ { if (state.config->from_shiftreg) state.config->from_shiftreg(offset, &state.shiftreg[0]); -#if 0 else - logerror("From ShiftReg function not set. PC = %08X\n", PC); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "From ShiftReg function not set. PC = %08X\n", PC); } @@ -762,7 +748,7 @@ /* check for NMI first */ if (irq & TMS34010_NMI) { - LOG(("TMS34010#%d takes NMI\n", cpu_getactivecpu())); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d takes NMI\n", cpu_getactivecpu()); /* ack the NMI */ IOREG(REG_INTPEND) &= ~TMS34010_NMI; @@ -789,28 +775,28 @@ /* host interrupt */ if (irq & TMS34010_HI) { - LOG(("TMS34010#%d takes HI\n", cpu_getactivecpu())); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d takes HI\n", cpu_getactivecpu()); vector = 0xfffffec0; } /* display interrupt */ else if (irq & TMS34010_DI) { - LOG(("TMS34010#%d takes DI\n", cpu_getactivecpu())); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d takes DI\n", cpu_getactivecpu()); vector = 0xfffffea0; } /* window violation interrupt */ else if (irq & TMS34010_WV) { - LOG(("TMS34010#%d takes WV\n", cpu_getactivecpu())); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d takes WV\n", cpu_getactivecpu()); vector = 0xfffffe80; } /* external 1 interrupt */ else if (irq & TMS34010_INT1) { - LOG(("TMS34010#%d takes INT1\n", cpu_getactivecpu())); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d takes INT1\n", cpu_getactivecpu()); vector = 0xffffffc0; irqline = 0; } @@ -818,7 +804,7 @@ /* external 2 interrupt */ else if (irq & TMS34010_INT2) { - LOG(("TMS34010#%d takes INT2\n", cpu_getactivecpu())); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d takes INT2\n", cpu_getactivecpu()); vector = 0xffffffa0; irqline = 1; } @@ -1151,7 +1137,7 @@ void tms34010_set_irq_line(int irqline, int linestate) { - LOG(("TMS34010#%d set irq line %d state %d\n", cpu_getactivecpu(), irqline, linestate)); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d set irq line %d state %d\n", cpu_getactivecpu(), irqline, linestate); /* set the pending interrupt */ switch (irqline) @@ -1220,7 +1206,7 @@ /* call through to the CPU to generate the int */ cpuintrf_push_context(cpunum); IOREG(REG_INTPEND) |= type; - LOG(("TMS34010#%d set internal interrupt $%04x\n", cpu_getactivecpu(), type)); + log_cb(RETRO_LOG_DEBUG, LOGPRE "TMS34010#%d set internal interrupt $%04x\n", cpu_getactivecpu(), type); check_interrupt(); cpuintrf_pop_context(); @@ -1560,9 +1546,7 @@ { double interval = TIME_IN_HZ(Machine->drv->frames_per_second); -#if 0 -logerror("-- dpyint(%d) @ %d --\n", cpunum, cpu_getscanline()); -#endif + log_cb(RETRO_LOG_DEBUG, LOGPRE "-- dpyint(%d) @ %d --\n", cpunum, cpu_getscanline()); /* reset timer for next frame before going into the CPU context */ timer_adjust(dpyint_timer[cpunum], interval, cpunum, 0); @@ -1659,9 +1643,7 @@ break; case REG_PMASK: -#if 0 - if (data) logerror("Plane masking not supported. PC=%08X\n", activecpu_get_pc()); -#endif + if (data) log_cb(RETRO_LOG_DEBUG, LOGPRE "Plane masking not supported. PC=%08X\n", activecpu_get_pc()); break; case REG_DPYCTL: @@ -1716,9 +1698,9 @@ newreg |= data & 0x0008; } IOREG(offset) = newreg; -#if 0 -logerror("oldreg=%04X newreg=%04X\n", oldreg, newreg); -#endif + + log_cb(RETRO_LOG_DEBUG, LOGPRE "oldreg=%04X newreg=%04X\n", oldreg, newreg); + /* the TMS34010 can set output interrupt? */ if (!(oldreg & 0x0080) && (newreg & 0x0080)) { @@ -1763,10 +1745,8 @@ break; } -#if 0 - if (LOG_CONTROL_REGS) - logerror("CPU#%d@%08X: %s = %04X (%d)\n", cpunum, activecpu_get_pc(), ioreg_name[offset], IOREG(offset), cpu_getscanline()); -#endif + /*log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU#%d@%08X: %s = %04X (%d)\n", cpunum, activecpu_get_pc(), ioreg_name[offset], IOREG(offset), cpu_getscanline());*/ + } #if 0 @@ -1803,10 +1783,7 @@ oldreg = IOREG(offset); IOREG(offset) = data; -#if 0 - if (LOG_CONTROL_REGS) - logerror("CPU#%d@%08X: %s = %04X (%d)\n", cpunum, activecpu_get_pc(), ioreg020_name[offset], IOREG(offset), cpu_getscanline()); -#endif + /*log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU#%d@%08X: %s = %04X (%d)\n", cpunum, activecpu_get_pc(), ioreg020_name[offset], IOREG(offset), cpu_getscanline());*/ switch (offset) { @@ -1851,7 +1828,7 @@ case REG020_PMASKL: case REG020_PMASKH: - //if (data) logerror("Plane masking not supported. PC=%08X\n", activecpu_get_pc()); + /*if (data) log_cb(RETRO_LOG_DEBUG, LOGPRE "Plane masking not supported. PC=%08X\n", activecpu_get_pc());*/ break; case REG020_DPYCTL: @@ -1984,13 +1961,10 @@ READ16_HANDLER( tms34010_io_register_r ) { - //int cpunum = cpu_getactivecpu(); + int cpunum = cpu_getactivecpu(); int result, total; -#if 0 - if (LOG_CONTROL_REGS) - logerror("CPU#%d@%08X: read %s\n", cpunum, activecpu_get_pc(), ioreg_name[offset]); -#endif + /*log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU#%d@%08X: read %s\n", cpunum, activecpu_get_pc(), ioreg_name[offset]);*/ switch (offset) { @@ -2017,6 +1991,16 @@ case REG_REFCNT: return (activecpu_gettotalcycles() / 16) & 0xfffc; + + case REG_INTPEND: + result = IOREG(offset); + + /* Cool Pool loops in mainline code on the appearance of the DI, even though they */ + /* have an IRQ handler. For this reason, we return it signalled a bit early in order */ + /* to make it past these loops. */ + if (dpyint_timer[cpunum] && timer_timeleft(dpyint_timer[cpunum]) < 3 * TIME_IN_HZ(40000000/TMS34010_CLOCK_DIVIDER)) + result |= TMS34010_DI; + return result; } return IOREG(offset); @@ -2025,13 +2009,10 @@ READ16_HANDLER( tms34020_io_register_r ) { - //int cpunum = cpu_getactivecpu(); + /*int cpunum = cpu_getactivecpu();*/ int result, total; -#if 0 - if (LOG_CONTROL_REGS) - logerror("CPU#%d@%08X: read %s\n", cpunum, activecpu_get_pc(), ioreg_name[offset]); -#endif + /*log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU#%d@%08X: read %s\n", cpunum, activecpu_get_pc(), ioreg_name[offset]);*/ switch (offset) { @@ -2221,7 +2202,7 @@ /* error case */ default: - //logerror("tms34010_host_control_w called on invalid register %d\n", reg); + /*logerror("tms34010_host_control_w called on invalid register %d\n", reg);*/ break; } @@ -2280,7 +2261,7 @@ /* error case */ default: - //logerror("tms34010_host_control_r called on invalid register %d\n", reg); + /*logerror("tms34010_host_control_r called on invalid register %d\n", reg);*/ break; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/driver.c -> libretro-mame2003-0~git20210529.tar.xz/src/driver.c
Changed
@@ -1473,6 +1473,7 @@ DRIVER( slapshot ) /* D71 (c) 1994 Taito Corporation (Japan) */ DRIVER( opwolf3 ) /* D74 (c) 1994 Taito */ DRIVER( opwolf3u ) /* D74 (c) 1994 Taito */ + DRIVER( scessjoe ) /* ??? (c) 1990 Wave / Taito */ DRIVER( ashnojoe ) /* ??? (c) 1990 Wave / Taito */ /* Taito multi-screen games */ @@ -2588,9 +2589,9 @@ /* Sega System 1 / System 2 games */ DRIVER( starjack ) /* 834-5191 (c) 1983 (S1) */ DRIVER( starjacs ) /* (c) 1983 Stern (S1) */ - DRIVER( regulus ) /* 834-5328 (c) 1983 (S1) */ - DRIVER( reguluso ) /* 834-5328 (c) 1983 (S1) */ - DRIVER( regulusu ) /* 834-5328 (c) 1983 (S1) */ + DRIVER( regulus ) /* 834-5328Â (c) 1983 (S1) */ + DRIVER( reguluso ) /* 834-5328Â (c) 1983 (S1) */ + DRIVER( regulusu ) /* 834-5328Â (c) 1983 (S1) */ DRIVER( upndown ) /* (c) 1983 (S1) */ DRIVER( upndownu ) /* (c) 1983 (S1) */ DRIVER( mrviking ) /* 834-5383 (c) 1984 (S1) */ @@ -3251,7 +3252,9 @@ DRIVER( fghthstw ) /* MBF (c) 1993 Data East Corporation (World) */ DRIVER( fghthsta ) /* MBF (c) 1993 Data East Corporation (US) */ /* Heavy Smash MBG */ - DRIVER( nslasher ) /* MBH */ + DRIVER( nslasher ) /* MBH (c) 1994 Data East Corporation */ + DRIVER( nslasherj ) /* MBH (c) 1994 Data East Corporation */ + DRIVER( nslashers ) /* MBH (c) 1994 Data East Corporation */ /* MBI ?? */ /* MBJ ?? */ /* MBK ?? */ @@ -3574,6 +3577,7 @@ DRIVER( viostrmj ) /* GX168 (c) 1993 (Japan) */ DRIVER( viostrma ) /* GX168 (c) 1993 (Asia) */ DRIVER( dadandrn ) /* GX170 (c) 1993 (Japan) */ + DRIVER( mmaulers ) /* GX170 (c) 1993 (Europe) */ DRIVER( metamrph ) /* GX224 (c) 1993 (US) */ DRIVER( metamrpj ) /* GX224 (c) 1993 (Japan) */ DRIVER( mtlchamp ) /* GX234 (c) 1993 (World) */ @@ -4373,6 +4377,7 @@ DRIVER( mk2r42 ) /* hack */ DRIVER( mk2r91 ) /* hack */ DRIVER( mk2chal ) /* hack */ + DRIVER( mk2p ) /* hack plus beta 2*/ DRIVER( jdreddp ) /* (c) 1993 Midway */ DRIVER( nbajam ) /* (c) 1993 Midway */ DRIVER( nbajamr2 ) /* (c) 1993 Midway */ @@ -4386,6 +4391,7 @@ DRIVER( mk3r10 ) /* (c) 1994 Midway */ DRIVER( umk3 ) /* (c) 1994 Midway */ DRIVER( umk3r11 ) /* (c) 1994 Midway */ + DRIVER( umk3p ) /* hack plus beta 1*/ DRIVER( wwfmania ) /* (c) 1995 Midway */ DRIVER( openice ) /* (c) 1995 Midway */ DRIVER( nbahangt ) /* (c) 1996 Midway */
View file
libretro-mame2003-0~git20200805.tar.xz/src/driver.h -> libretro-mame2003-0~git20210529.tar.xz/src/driver.h
Changed
@@ -311,7 +311,7 @@ void (*video_update)(struct mame_bitmap *bitmap,const struct rectangle *cliprect); UINT32 sound_attributes; - struct MachineSound sound[MAX_SOUND]; + struct MachineSound sound[MAX_SOUND+1]; /* add one code is assuming its +1 in a lot of places and is causing overflows */ };
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/aerofgt.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/aerofgt.c
Changed
@@ -528,7 +528,7 @@ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x0000, "1" ) PORT_DIPSETTING( 0x0010, "2" ) - PORT_DIPNAME( 0x0060, 0x0060, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x0060, 0x0020, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x0060, "2 Players" ) PORT_DIPSETTING( 0x0040, "3 Players" ) PORT_DIPSETTING( 0x0020, "4 Players" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/armedf.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/armedf.c
Changed
@@ -463,7 +463,7 @@ PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) #if LEGION_HACK - PORT_DIPNAME( 0x80, 0x80, "Allow Invulnerability" ) // see notes + PORT_DIPNAME( 0x80, 0x80, "Allow Invulnerability" ) /* see notes*/ PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) #else @@ -510,12 +510,12 @@ PORT_START /* DSW0 */ NIHON_LIVES -// PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" ) -// PORT_DIPSETTING( 0x04, "20k" ) -// PORT_DIPSETTING( 0x00, "50k" ) -// PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" ) -// PORT_DIPSETTING( 0x08, "60k" ) -// PORT_DIPSETTING( 0x00, "90k" ) +/* PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" )*/ +/* PORT_DIPSETTING( 0x04, "20k" )*/ +/* PORT_DIPSETTING( 0x00, "50k" )*/ +/* PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" )*/ +/* PORT_DIPSETTING( 0x08, "60k" )*/ +/* PORT_DIPSETTING( 0x00, "90k" )*/ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x0c, "20k then every 60k" ) PORT_DIPSETTING( 0x04, "20k then every 90k" ) @@ -560,12 +560,12 @@ PORT_START /* DSW0 */ NIHON_LIVES -// PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" ) -// PORT_DIPSETTING( 0x04, "00k" ) -// PORT_DIPSETTING( 0x00, "50k" ) -// PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" ) -// PORT_DIPSETTING( 0x08, "60k" ) -// PORT_DIPSETTING( 0x00, "90k" ) +/* PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" )*/ +/* PORT_DIPSETTING( 0x04, "00k" )*/ +/* PORT_DIPSETTING( 0x00, "50k" )*/ +/* PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" )*/ +/* PORT_DIPSETTING( 0x08, "60k" )*/ +/* PORT_DIPSETTING( 0x00, "90k" )*/ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x08, "50k then every 60k" ) PORT_DIPSETTING( 0x00, "50k then every 90k" ) @@ -626,12 +626,12 @@ PORT_START /* DSW0 */ NIHON_LIVES -// PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" ) -// PORT_DIPSETTING( 0x04, "30k" ) -// PORT_DIPSETTING( 0x00, "60k" ) -// PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" ) -// PORT_DIPSETTING( 0x08, "70k" ) -// PORT_DIPSETTING( 0x00, "00k" ) +/* PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" )*/ +/* PORT_DIPSETTING( 0x04, "30k" )*/ +/* PORT_DIPSETTING( 0x00, "60k" )*/ +/* PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" )*/ +/* PORT_DIPSETTING( 0x08, "70k" )*/ +/* PORT_DIPSETTING( 0x00, "00k" )*/ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x0c, "30K and 100k" ) PORT_DIPSETTING( 0x08, "60k and 130k" ) @@ -679,12 +679,12 @@ PORT_START /* DSW0 */ NIHON_LIVES -// PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" ) -// PORT_DIPSETTING( 0x04, "20k" ) -// PORT_DIPSETTING( 0x00, "40k" ) -// PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" ) -// PORT_DIPSETTING( 0x08, "60k" ) -// PORT_DIPSETTING( 0x00, "80k" ) +/* PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" )*/ +/* PORT_DIPSETTING( 0x04, "20k" )*/ +/* PORT_DIPSETTING( 0x00, "40k" )*/ +/* PORT_DIPNAME( 0x08, 0x08, "2nd Bonus Life" )*/ +/* PORT_DIPSETTING( 0x08, "60k" )*/ +/* PORT_DIPSETTING( 0x00, "80k" )*/ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x0c, "20k then every 60k" ) PORT_DIPSETTING( 0x04, "20k then every 80k" ) @@ -705,12 +705,12 @@ PORT_START /* DSW1 */ NIHON_COINAGE_A NIHON_COINAGE_B - PORT_DIPNAME( 0x30, 0x00, "Allow Continue" ) // not in the "test mode" + PORT_DIPNAME( 0x30, 0x00, "Allow Continue" ) /* not in the "test mode"*/ PORT_DIPSETTING( 0x30, DEF_STR( No ) ) PORT_DIPSETTING( 0x20, "3 Times" ) PORT_DIPSETTING( 0x10, "5 Times" ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) // not in the "test mode" + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) /* not in the "test mode"*/ PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) @@ -738,7 +738,7 @@ 4, { 0, 1, 2, 3 }, { 4, 0, 12, 8, 20, 16, 28, 24, - 32+4, 32+0, 32+12, 32+8, 32+20, 32+16, 32+28, 32+24, }, + 32+4, 32+0, 32+12, 32+8, 32+20, 32+16, 32+28, 32+24 }, { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 }, 128*8 @@ -922,31 +922,29 @@ ROM_REGION( 0x50000, REGION_CPU1, 0 ) /* 64K*8 for 68000 code */ ROM_LOAD16_BYTE( "lg1.bin", 0x000001, 0x010000, CRC(c4aeb724) SHA1(b4c0383f3b1fa6b1d5bdab0f3a5293c89a82a474) ) ROM_LOAD16_BYTE( "lg3.bin", 0x000000, 0x010000, CRC(777e4935) SHA1(225766940059b4c12e69332ea77eb618dbd1467b) ) - ROM_LOAD16_BYTE( "legion.1b", 0x020001, 0x010000, CRC(c306660a) SHA1(31c6b868ba07677b5110c577335873354bff596f) ) // lg2 - ROM_LOAD16_BYTE( "legion.1d", 0x020000, 0x010000, CRC(c2e45e1e) SHA1(95cc359145b1b03123262891feed358407ba105a) ) // lg4 + ROM_LOAD16_BYTE( "legion.1b", 0x020001, 0x010000, CRC(c306660a) SHA1(31c6b868ba07677b5110c577335873354bff596f) ) /* lg2*/ + ROM_LOAD16_BYTE( "legion.1d", 0x020000, 0x010000, CRC(c2e45e1e) SHA1(95cc359145b1b03123262891feed358407ba105a) ) /* lg4*/ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 code (sound) */ - ROM_LOAD( "legion.1h", 0x00000, 0x04000, CRC(2ca4f7f0) SHA1(7cf997af9dd74ced9d28c047069ccfb67d72e257) ) // lg9 + ROM_LOAD( "legion.1h", 0x00000, 0x04000, CRC(2ca4f7f0) SHA1(7cf997af9dd74ced9d28c047069ccfb67d72e257) ) /* lg9*/ + ROM_LOAD( "legion.1i", 0x04000, 0x08000, CRC(79f4a827) SHA1(25e4c1b5b8466627244b7226310e67e4261333b6) ) /* lg10*/ ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "lg8.bin", 0x00000, 0x08000, CRC(e0596570) SHA1(68ddc950efc55a16e6abc699e3bad18ea19d579f) ) ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "legion.1e", 0x00000, 0x10000, CRC(a9d70faf) SHA1(8b8b60ae49c55e931d6838e863463f6b2bf7adb0) ) // lg5 - ROM_LOAD( "legion.1f", 0x18000, 0x08000, CRC(f018313b) SHA1(860bc9937202dc3a40c9fa7caad11c2c2aa19f5c) ) // lg6 + ROM_LOAD( "legion.1e", 0x00000, 0x10000, CRC(a9d70faf) SHA1(8b8b60ae49c55e931d6838e863463f6b2bf7adb0) ) /* lg5*/ + ROM_LOAD( "legion.1f", 0x18000, 0x08000, CRC(f018313b) SHA1(860bc9937202dc3a40c9fa7caad11c2c2aa19f5c) ) /* lg6*/ ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "legion.1l", 0x00000, 0x10000, CRC(29b8adaa) SHA1(10338ebe7324960683de1f796dd311ed662e42b4) ) // lg13 + ROM_LOAD( "legion.1l", 0x00000, 0x10000, CRC(29b8adaa) SHA1(10338ebe7324960683de1f796dd311ed662e42b4) ) /* lg13*/ ROM_REGION( 0x20000, REGION_GFX4, ROMREGION_DISPOSE ) - ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) ) // lg12 - ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) ) // lg11 + ROM_LOAD( "legion.1k", 0x000000, 0x010000, CRC(ff5a0db9) SHA1(9308deb363d3b7686cc69485ec14201dd68f9a97) ) /* lg12*/ + ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) ) /* lg11*/ ROM_REGION( 0x4000, REGION_GFX5, 0 ) /* data for mcu/blitter */ ROM_LOAD ( "lg7.bin", 0x0000, 0x4000, CRC(533e2b58) SHA1(a13ea4a530038760ffa87713903c59a932452717) ) - - ROM_REGION( 0x8000, REGION_USER1, 0 ) /* ? */ - ROM_LOAD( "legion.1i", 0x0000, 0x8000, CRC(79f4a827) SHA1(25e4c1b5b8466627244b7226310e67e4261333b6) ) // lg10 ROM_END ROM_START( legiono ) @@ -958,6 +956,7 @@ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* Z80 code (sound) */ ROM_LOAD( "legion.1h", 0x00000, 0x04000, CRC(2ca4f7f0) SHA1(7cf997af9dd74ced9d28c047069ccfb67d72e257) ) + ROM_LOAD( "legion.1i", 0x04000, 0x08000, CRC(79f4a827) SHA1(25e4c1b5b8466627244b7226310e67e4261333b6) ) ROM_REGION( 0x08000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "legion.1g", 0x00000, 0x08000, CRC(c50b0125) SHA1(83b5e9707152d97777fb65fa8820ba34ec2fac8d) ) @@ -974,9 +973,6 @@ ROM_LOAD( "legion.1j", 0x010000, 0x010000, CRC(bae220c8) SHA1(392ae0fb0351dcad7b0e8e0ed4a1dc6e07f493df) ) /* should lg7.bin be loaded here too? The ROM wasn't included in this set */ - - ROM_REGION( 0x8000, REGION_USER1, 0 ) /* ? */ - ROM_LOAD( "legion.1i", 0x0000, 0x8000, CRC(79f4a827) SHA1(25e4c1b5b8466627244b7226310e67e4261333b6) ) ROM_END ROM_START( terraf )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/ashnojoe.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/ashnojoe.c
Changed
@@ -4,11 +4,6 @@ driver by David Haywood and bits from Pierpaolo Prazzoli -todo: -- sound -- frequencies -- 1 unused rom - there is an english logo in the roms, needs different program roms? Tow sub-boards: @@ -87,21 +82,23 @@ extern VIDEO_START( ashnojoe ); extern VIDEO_UPDATE( ashnojoe ); +static UINT8 adpcm_byte; +static int soundlatch_status; +static int msm5205_vclk_toggle; + static READ16_HANDLER(fake_4a00a_r) { - //if it returns 1 there's no sound. is it used to sync the game and sound? - //or just a debug enable/disble register? + /* If it returns 1 there's no sound. Is it used to sync the game and sound? + or just a debug enable/disable register? */ return 0; - return 1; } static WRITE16_HANDLER( ashnojoe_soundlatch_w ) { if(ACCESSING_LSB) { - soundlatch_w(0,data & 0xff); - //needed? - cpu_set_irq_line(1,0,HOLD_LINE); + soundlatch_status = 1; + soundlatch_w(0, data & 0xff); } } @@ -110,10 +107,10 @@ { 0x040000, 0x043fff, MRA16_RAM }, { 0x044000, 0x048fff, MRA16_RAM }, { 0x049000, 0x049fff, MRA16_RAM }, - { 0x04a000, 0x04a001, input_port_0_word_r }, // p1 inputs, coins - { 0x04a002, 0x04a003, input_port_1_word_r }, // p2 inputs - { 0x04a004, 0x04a005, input_port_2_word_r }, // dipswitches - { 0x04a00a, 0x04a00b, fake_4a00a_r }, // ?? + { 0x04a000, 0x04a001, input_port_0_word_r }, /* p1 inputs, coins*/ + { 0x04a002, 0x04a003, input_port_1_word_r }, /* p2 inputs*/ + { 0x04a004, 0x04a005, input_port_2_word_r }, /* dipswitches*/ + { 0x04a00a, 0x04a00b, fake_4a00a_r }, /* ??*/ { 0x04c000, 0x04ffff, MRA16_RAM }, { 0x080000, 0x0bffff, MRA16_ROM }, MEMORY_END @@ -136,21 +133,20 @@ { 0x080000, 0x0bffff, MWA16_ROM }, MEMORY_END -static READ_HANDLER(fake_6_r) +static WRITE_HANDLER( adpcm_w ) { - // if it returns 0 the cpu doesn't read from port $4 ? - int ret = 0; - ret ^= 1; - return ret; - return 1; - return 0; - return rand(); + adpcm_byte = data; } -static WRITE_HANDLER( adpcm_data_w ) +static READ_HANDLER( sound_latch_r ) { - MSM5205_data_w(0, data & 0xf); - MSM5205_data_w(0, data>>4); + soundlatch_status = 0; + return soundlatch_r(0); +} + +static READ_HANDLER( sound_latch_status_r ) +{ + return soundlatch_status; } static MEMORY_READ_START( sound_readmem ) @@ -168,14 +164,14 @@ static PORT_READ_START( sound_readport ) { 0x00, 0x00, YM2203_status_port_0_r }, { 0x01, 0x01, YM2203_read_port_0_r }, - { 0x04, 0x04, soundlatch_r }, //PC: 15D -> cp $7f - { 0x06, 0x06, fake_6_r/*soundlatch_r */}, //PC: 14A -> and $1 + { 0x04, 0x04, sound_latch_r }, + { 0x06, 0x06, sound_latch_status_r}, PORT_END static PORT_WRITE_START( sound_writeport ) { 0x00, 0x00, YM2203_control_port_0_w }, { 0x01, 0x01, YM2203_write_port_0_w }, - { 0x02, 0x02, adpcm_data_w }, + { 0x02, 0x02, adpcm_w }, PORT_END INPUT_PORTS_START( ashnojoe ) @@ -186,7 +182,7 @@ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_PLAYER1 ) PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER1 ) PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER1 ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // anything else and the controls don't work + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* anything else and the controls don't work*/ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_SERVICE1 ) @@ -205,7 +201,7 @@ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_PLAYER2 ) PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER2 ) PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER2 ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // anything else and the controls don't work + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* anything else and the controls don't work*/ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* unused ? */ @@ -306,7 +302,9 @@ static WRITE_HANDLER(writeA) { - if (data == 0xff) return; // this gets called at 8910 startup with 0xff before the 5205 exists, causing a crash + /* This gets called at 8910 startup with 0xff before the 5205 exists, causing a crash */ + if (data == 0xff) + return; MSM5205_reset_w(0, !(data & 0x01)); } @@ -316,25 +314,35 @@ cpu_setbank(4, memory_region(REGION_SOUND1) + ((data & 0xf) * 0x8000)); } -static void ashnojoe_adpcm_int (int data) +static void ashnojoe_vclk_cb(int data) { - cpu_set_nmi_line(1, PULSE_LINE); + if (msm5205_vclk_toggle == 0) + { + MSM5205_data_w(0, adpcm_byte >> 4); + } + else + { + MSM5205_data_w(0, adpcm_byte & 0xf); + cpu_set_nmi_line(1, PULSE_LINE); + } + + msm5205_vclk_toggle ^= 1; } static struct MSM5205interface msm5205_interface = { 1, /* 1 chip */ 384000, /* 384KHz */ - { ashnojoe_adpcm_int}, /* interrupt function */ + { ashnojoe_vclk_cb }, /* interrupt function */ { MSM5205_S48_4B}, /* 4KHz 4-bit */ - { 50 } /* volume */ + { 100 } /* volume */ }; static struct YM2203interface ym2203_interface = { 1, - 3000000, /* ?? */ - { YM2203_VOL(100,100) }, + 4000000, /* 4 MHz (verified on pcb) */ + { YM2203_VOL(10,10) }, { 0 }, { 0 }, { writeA }, @@ -350,11 +358,11 @@ static MACHINE_DRIVER_START( ashnojoe ) /* basic machine hardware */ - MDRV_CPU_ADD(M68000, 8000000) /* 8 MHz? */ + MDRV_CPU_ADD(M68000, 8000000) /* 8 MHz (verified on pcb) */ MDRV_CPU_MEMORY(ashnojoe_readmem,ashnojoe_writemem) MDRV_CPU_VBLANK_INT(irq1_line_hold,1) - MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz ??? */ + MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz (verified on pcb) */ MDRV_CPU_FLAGS(CPU_AUDIO_CPU) MDRV_CPU_MEMORY(sound_readmem,sound_writemem) MDRV_CPU_PORTS(sound_readport,sound_writeport) @@ -378,41 +386,79 @@ MDRV_SOUND_ADD(MSM5205, msm5205_interface) MACHINE_DRIVER_END +ROM_START( scessjoe ) + ROM_REGION( 0xc0000, REGION_CPU1, 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "5.4q", 0x00000, 0x10000, CRC(c805f9e7) SHA1(e1e85701bde496b1fd64211b94bfb0def597ae51) ) + ROM_LOAD16_BYTE( "6.4s", 0x00001, 0x10000, CRC(eda7a537) SHA1(3bb19fbdfb6c8af4e2078958fa445ac1f4434d0d) ) + ROM_LOAD16_WORD_SWAP( "sj201-nw.6m", 0x80000, 0x40000, CRC(5a64ca42) SHA1(660b8bca21ef3c2230adce7cb7e7d1f018714f23) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 32k for Z80 code */ + ROM_LOAD( "9.8q", 0x0000, 0x8000, CRC(8767e212) SHA1(13bf927febedff9d7d164fbf0da7fb3a588c2a94) ) + + ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "8.5e", 0x00000, 0x10000, CRC(9bcb160e) SHA1(1677048e5ce26562ff7ba36fcc2d0ed5a652b91e) ) + ROM_LOAD( "7.5c", 0x10000, 0x10000, CRC(b250c69d) SHA1(594b1bb94a162b07944a971b7fedddca5c37f2cb) ) + + ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "4.4e", 0x00000, 0x10000, CRC(aa6336d3) SHA1(43f70cc3223f11d7929dd44b0edf0a31f5fe41c3) ) + ROM_LOAD( "3.4c", 0x10000, 0x10000, CRC(7e2d86b5) SHA1(8b8d1b9240a700e29afc109eddf6e58a0a7666a4) ) + + ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "2.3m", 0x00000, 0x10000, CRC(c3254938) SHA1(fd57163f740cd4fdecca94cced91314c289741ae) ) + ROM_LOAD( "1.1m", 0x10000, 0x10000, CRC(5d16a6fa) SHA1(2af907b0fcb9ff93340de3301da4b10e945455e5) ) + + ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) + ROM_LOAD16_WORD_SWAP( "sj402-nw.8e", 0x000000, 0x80000, CRC(b6d33d06) SHA1(688ccf467a5112ec522811894e2626ab5f155903) ) + ROM_LOAD16_WORD_SWAP( "sj403-nw.7e", 0x080000, 0x80000, CRC(07143f56) SHA1(1b953c8826d3993a486eed6b9d94d37145fd2e79) ) + + ROM_REGION( 0x300000, REGION_GFX5, ROMREGION_DISPOSE ) + ROM_LOAD16_WORD_SWAP( "sj404-nw.7a", 0x000000, 0x80000, CRC(8f134128) SHA1(026a6076d54cd5f1d06b29c51031cb79a6b2c11d) ) + ROM_LOAD16_WORD_SWAP( "sj405-nw.7c", 0x080000, 0x80000, CRC(6fd81699) SHA1(8a4f9e47dd39b4b0213c3682da2221ca53bba658) ) + ROM_LOAD16_WORD_SWAP( "sj406-nw.7d", 0x100000, 0x80000, CRC(634e33e6) SHA1(1d6a72a4ca80cd1c1fd6ce9359c304b45091cdfe) ) + ROM_LOAD16_WORD_SWAP( "sj407-nw.7f", 0x180000, 0x80000, CRC(5c66ff06) SHA1(9923ba00679e1b47b5da63c1a13e0f8dd4c78bb5) ) + ROM_LOAD16_WORD_SWAP( "sj408-nw.7g", 0x200000, 0x80000, CRC(6a3b1ea1) SHA1(e39a6e52d930f291bf237cf9db3d4b3d2fad53e0) ) + ROM_LOAD16_WORD_SWAP( "sj409-nw.7j", 0x280000, 0x80000, CRC(d8764213) SHA1(89eadefb956863216c8e3d0380394aba35e8c856) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* samples? */ + ROM_LOAD( "sj401-nw.10r", 0x00000, 0x80000, CRC(25dfab59) SHA1(7d50159204ba05323a2442778f35192e66117dda) ) +ROM_END + ROM_START( ashnojoe ) ROM_REGION( 0xc0000, REGION_CPU1, 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "5.bin", 0x00000, 0x10000, CRC(c61e1569) SHA1(422c18f5810539b5a9e3a9bd4e3b4d70bde8d1d5) ) ROM_LOAD16_BYTE( "6.bin", 0x00001, 0x10000, CRC(c0a16338) SHA1(fb127b9d38f2c9807b6e23ff71935fc8a22a2e8f) ) - ROM_LOAD16_WORD_SWAP( "sj201-nw.bin", 0x80000, 0x40000, CRC(5a64ca42) SHA1(660b8bca21ef3c2230adce7cb7e7d1f018714f23) ) + ROM_LOAD16_WORD_SWAP( "sj201-nw.6m", 0x80000, 0x40000, CRC(5a64ca42) SHA1(660b8bca21ef3c2230adce7cb7e7d1f018714f23) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 32k for Z80 code */ - ROM_LOAD( "9.bin", 0x0000, 0x8000, CRC(8767e212) SHA1(13bf927febedff9d7d164fbf0da7fb3a588c2a94) ) + ROM_LOAD( "9.8q", 0x0000, 0x8000, CRC(8767e212) SHA1(13bf927febedff9d7d164fbf0da7fb3a588c2a94) ) ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "8.bin", 0x00000, 0x10000, CRC(9bcb160e) SHA1(1677048e5ce26562ff7ba36fcc2d0ed5a652b91e) ) + ROM_LOAD( "8.5e", 0x00000, 0x10000, CRC(9bcb160e) SHA1(1677048e5ce26562ff7ba36fcc2d0ed5a652b91e) ) ROM_LOAD( "7.bin", 0x10000, 0x10000, CRC(7e1efc42) SHA1(e3c282072fdaa0b98c2a1bf25fd02c680d9ca4d7) ) ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "4.bin", 0x00000, 0x10000, CRC(aa6336d3) SHA1(43f70cc3223f11d7929dd44b0edf0a31f5fe41c3) ) - ROM_LOAD( "3.bin", 0x10000, 0x10000, CRC(7e2d86b5) SHA1(8b8d1b9240a700e29afc109eddf6e58a0a7666a4) ) + ROM_LOAD( "4.4e", 0x00000, 0x10000, CRC(aa6336d3) SHA1(43f70cc3223f11d7929dd44b0edf0a31f5fe41c3) ) + ROM_LOAD( "3.4c", 0x10000, 0x10000, CRC(7e2d86b5) SHA1(8b8d1b9240a700e29afc109eddf6e58a0a7666a4) ) ROM_REGION( 0x20000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "2.bin", 0x00000, 0x10000, CRC(c3254938) SHA1(fd57163f740cd4fdecca94cced91314c289741ae) ) + ROM_LOAD( "2.3m", 0x00000, 0x10000, CRC(c3254938) SHA1(fd57163f740cd4fdecca94cced91314c289741ae) ) ROM_LOAD( "1.bin", 0x10000, 0x10000, CRC(1bf585f0) SHA1(4003941636e7fded95e880109c3c9dd1d8f28b07) ) ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) - ROM_LOAD16_WORD_SWAP( "sj402-nw.bin", 0x000000, 0x80000, CRC(b6d33d06) SHA1(688ccf467a5112ec522811894e2626ab5f155903) ) - ROM_LOAD16_WORD_SWAP( "sj403-nw.bin", 0x080000, 0x80000, CRC(07143f56) SHA1(1b953c8826d3993a486eed6b9d94d37145fd2e79) ) + ROM_LOAD16_WORD_SWAP( "sj402-nw.8e", 0x000000, 0x80000, CRC(b6d33d06) SHA1(688ccf467a5112ec522811894e2626ab5f155903) ) + ROM_LOAD16_WORD_SWAP( "sj403-nw.7e", 0x080000, 0x80000, CRC(07143f56) SHA1(1b953c8826d3993a486eed6b9d94d37145fd2e79) ) ROM_REGION( 0x300000, REGION_GFX5, ROMREGION_DISPOSE ) - ROM_LOAD16_WORD_SWAP( "sj404-nw.bin", 0x000000, 0x80000, CRC(8f134128) SHA1(026a6076d54cd5f1d06b29c51031cb79a6b2c11d) ) - ROM_LOAD16_WORD_SWAP( "sj405-nw.bin", 0x080000, 0x80000, CRC(6fd81699) SHA1(8a4f9e47dd39b4b0213c3682da2221ca53bba658) ) - ROM_LOAD16_WORD_SWAP( "sj406-nw.bin", 0x100000, 0x80000, CRC(634e33e6) SHA1(1d6a72a4ca80cd1c1fd6ce9359c304b45091cdfe) ) - ROM_LOAD16_WORD_SWAP( "sj407-nw.bin", 0x180000, 0x80000, CRC(5c66ff06) SHA1(9923ba00679e1b47b5da63c1a13e0f8dd4c78bb5) ) - ROM_LOAD16_WORD_SWAP( "sj408-nw.bin", 0x200000, 0x80000, CRC(6a3b1ea1) SHA1(e39a6e52d930f291bf237cf9db3d4b3d2fad53e0) ) - ROM_LOAD16_WORD_SWAP( "sj409-nw.bin", 0x280000, 0x80000, CRC(d8764213) SHA1(89eadefb956863216c8e3d0380394aba35e8c856) ) + ROM_LOAD16_WORD_SWAP( "sj404-nw.7a", 0x000000, 0x80000, CRC(8f134128) SHA1(026a6076d54cd5f1d06b29c51031cb79a6b2c11d) ) + ROM_LOAD16_WORD_SWAP( "sj405-nw.7c", 0x080000, 0x80000, CRC(6fd81699) SHA1(8a4f9e47dd39b4b0213c3682da2221ca53bba658) ) + ROM_LOAD16_WORD_SWAP( "sj406-nw.7d", 0x100000, 0x80000, CRC(634e33e6) SHA1(1d6a72a4ca80cd1c1fd6ce9359c304b45091cdfe) ) + ROM_LOAD16_WORD_SWAP( "sj407-nw.7f", 0x180000, 0x80000, CRC(5c66ff06) SHA1(9923ba00679e1b47b5da63c1a13e0f8dd4c78bb5) ) + ROM_LOAD16_WORD_SWAP( "sj408-nw.7g", 0x200000, 0x80000, CRC(6a3b1ea1) SHA1(e39a6e52d930f291bf237cf9db3d4b3d2fad53e0) ) + ROM_LOAD16_WORD_SWAP( "sj409-nw.7j", 0x280000, 0x80000, CRC(d8764213) SHA1(89eadefb956863216c8e3d0380394aba35e8c856) ) ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* samples? */ - ROM_LOAD( "sj401-nw.bin", 0x00000, 0x80000, CRC(25dfab59) SHA1(7d50159204ba05323a2442778f35192e66117dda) ) + ROM_LOAD( "sj401-nw.10r", 0x00000, 0x80000, CRC(25dfab59) SHA1(7d50159204ba05323a2442778f35192e66117dda) ) ROM_END -GAMEX( 1990, ashnojoe, 0, ashnojoe, ashnojoe, ashnojoe, ROT0, "WAVE / Taito Corporation", "Ashita no Joe (Japan)", GAME_IMPERFECT_SOUND ) +GAME( 1990, scessjoe, 0, ashnojoe, ashnojoe, ashnojoe, ROT0, "WAVE / Taito Corporation", "Success Joe (World)" ) +GAME( 1990, ashnojoe, scessjoe, ashnojoe, ashnojoe, ashnojoe, ROT0, "WAVE / Taito Corporation", "Ashita no Joe (Japan)" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/avengrgs.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/avengrgs.c
Changed
@@ -60,6 +60,7 @@ #include "vidhrdw/generic.h" #include "machine/eeprom.h" #include "bootstrap.h" +#include "inptport.h" VIDEO_START( avengrgs ); VIDEO_UPDATE( avengrgs );
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/bagman.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/bagman.c
Changed
@@ -269,20 +269,20 @@ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY | IPF_COCKTAIL ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) PORT_START /* DSW */ @@ -317,20 +317,20 @@ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY | IPF_COCKTAIL ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) PORT_START /* DSW */ @@ -367,10 +367,10 @@ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) /* double-function button, start and shoot */ - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_START /* IN1 */ @@ -378,10 +378,10 @@ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL ) /* double-function button, start and shoot */ - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY | IPF_COCKTAIL ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY | IPF_COCKTAIL ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) PORT_START /* DSW */
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/battlex.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/battlex.c
Changed
@@ -156,7 +156,7 @@ PORT_DIPSETTING( 0x08, "2" ) PORT_DIPSETTING( 0x10, "3" ) PORT_DIPSETTING( 0x18, "5" ) - PORT_DIPNAME( 0x60, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x60, 0x20, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x00, "5000" ) PORT_DIPSETTING( 0x20, "10000" ) PORT_DIPSETTING( 0x40, "15000" ) @@ -208,7 +208,7 @@ { 1, /* 1 chip */ 10000000/8, - { 40 }, + { 30 }, { 0 }, { 0 }, { 0 },
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/bogeyman.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/bogeyman.c
Changed
@@ -40,7 +40,7 @@ static int last; /* bit 0 is flipscreen */ - flip_screen_set(data & 0x01); + flip_screen_set(~data & 0x01); /* bit 5 goes to 8910 #0 BDIR pin */ if ((last & 0x20) == 0x20 && (data & 0x20) == 0x00) @@ -145,10 +145,10 @@ PORT_DIPSETTING( 0x02, "50000" ) PORT_DIPSETTING( 0x00, "none" ) PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0x0c, "Easy" ) // Normal - PORT_DIPSETTING( 0x08, "Medium" ) // | - PORT_DIPSETTING( 0x04, "Hard" ) // | - PORT_DIPSETTING( 0x00, "Hardest" ) // HARD + PORT_DIPSETTING( 0x0c, "Easy" ) /* Normal*/ + PORT_DIPSETTING( 0x08, "Medium" ) /* |*/ + PORT_DIPSETTING( 0x04, "Hard" ) /* |*/ + PORT_DIPSETTING( 0x00, "Hardest" ) /* HARD*/ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -307,4 +307,5 @@ /******************************************************************************/ -GAMEX( 1985?, bogeyman, 0, bogeyman, bogeyman, 0, ROT0, "Technos Japan", "Bogey Manor", GAME_IMPERFECT_COLORS ) +/* ROT180 confirmed by Kold */ +GAMEX( 1985, bogeyman, 0, bogeyman, bogeyman, 0, ROT180, "Technos Japan", "Bogey Manor", GAME_IMPERFECT_COLORS )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/btoads.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/btoads.c
Changed
@@ -325,7 +325,7 @@ PORT_DIPNAME( 0x0004, 0x0000, "Common Coin Mech") PORT_DIPSETTING( 0x0004, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) - PORT_DIPNAME( 0x0008, 0x0008, "Three Players") + PORT_DIPNAME( 0x0008, 0x0000, "Three Players") PORT_DIPSETTING( 0x0008, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Free_Play ))
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/cheekyms.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/cheekyms.c
Changed
@@ -64,7 +64,7 @@ PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) ) -//PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) +/*PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )*/ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x10, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) @@ -100,41 +100,41 @@ static struct GfxLayout charlayout = { - 8,8, /* 16*16 sprites */ - 256, /* 64 sprites */ - 2, /* 2 bits per pixel */ - { 0, 256*8*8 }, /* the two bitplanes are separated */ + 8,8, + RGN_FRAC(1,2), + 2, + { 0, RGN_FRAC(1,2) }, { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 /* every sprite takes 8 consecutive bytes */ + 8*8 }; static struct GfxLayout spritelayout = { - 16,16, /* 16*16 sprites */ - 64, /* 64 sprites */ - 2, /* 2 bits per pixel */ - { 64*32*8, 0 }, /* the two bitplanes are separated */ + 16,16, + RGN_FRAC(1,2), + 2, + { RGN_FRAC(1,2), 0 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 }, - 32*8 /* every sprite takes 32 consecutive bytes */ + 32*8 }; static struct GfxDecodeInfo gfxdecodeinfo[] = { - { REGION_GFX1, 0, &charlayout, 0, 32 }, - { REGION_GFX2, 0, &spritelayout, 32*4, 16 }, + { REGION_GFX1, 0, &charlayout, 0x00, 0x20 }, + { REGION_GFX2, 0, &spritelayout, 0x80, 0x10 }, { -1 } /* end of array */ }; static struct DACinterface dac_interface = { - 1, - { 100 } + 8, + { 10, 100, 100, 100, 100, 100, 100, 100 } }; @@ -190,11 +190,11 @@ ROM_LOAD( "cm08.n6", 0x0800, 0x0800, CRC(b3fbd4ac) SHA1(9f45cc6d9e0bf580149e18de5c3e37d4de347b92) ) ROM_REGION( 0x0060, REGION_PROMS, 0 ) - ROM_LOAD( "cm.m8", 0x0000, 0x0020, CRC(2386bc68) SHA1(6676082860cd8678a71339a352d2c6286e78ba44) ) /* Character colors \ Selected by Bit 6 of Port 0x80 */ - ROM_LOAD( "cm.m9", 0x0020, 0x0020, CRC(db9c59a5) SHA1(357ed5ac8e954a4c8b4d78d36e57bf2de36c1d57) ) /* Character colors / */ + ROM_LOAD( "cm.m9", 0x0000, 0x0020, CRC(db9c59a5) SHA1(357ed5ac8e954a4c8b4d78d36e57bf2de36c1d57) ) /* Character colors / */ + ROM_LOAD( "cm.m8", 0x0020, 0x0020, CRC(2386bc68) SHA1(6676082860cd8678a71339a352d2c6286e78ba44) ) /* Character colors \ Selected by Bit 6 of Port 0x80 */ ROM_LOAD( "cm.p3", 0x0040, 0x0020, CRC(6ac41516) SHA1(05bf40790a0de1e859362df892f7f158c183e247) ) /* Sprite colors */ ROM_END -GAMEX( 1980?, cheekyms, 0, cheekyms, cheekyms, 0, ROT270, "Universal", "Cheeky Mouse", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAMEX( 1980, cheekyms, 0, cheekyms, cheekyms, 0, ROT270, "Universal", "Cheeky Mouse", GAME_IMPERFECT_SOUND )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/commando.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/commando.c
Changed
@@ -181,7 +181,7 @@ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, "Upright One Player" ) PORT_DIPSETTING( 0x40, "Upright Two Players" ) /* PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) */ @@ -259,7 +259,7 @@ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, "Upright One Player" ) PORT_DIPSETTING( 0x40, "Upright Two Players" ) /* PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) */
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/contra.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/contra.c
Changed
@@ -63,9 +63,54 @@ soundlatch_w(offset,data); } +UINT32 math_regs[6]; +UINT16 multiply_result; +UINT16 divide_quotient; +UINT16 divide_remainder; + + +READ_HANDLER(contra_k007452_r) +{ + switch (offset & 7) + { + case 0: return multiply_result & 0xff; + case 1: return (multiply_result >> 8) & 0xff; + case 2: return divide_remainder & 0xff; + case 3: return (divide_remainder >> 8) & 0xff; + case 4: return divide_quotient & 0xff; + case 5: return (divide_quotient >> 8) & 0xff; + default: return 0; + } +} + + +WRITE_HANDLER(contra_k007452_w) +{ + if (offset < 6) math_regs[offset] = data; + + if (offset == 1) + { + // Starts multiplication process + multiply_result = math_regs[0] * math_regs[1]; + } + else if (offset == 5) + { + // Starts division process + UINT16 dividend = (math_regs[4]<<8) + math_regs[5]; + UINT16 divisor = (math_regs[2]<<8) + math_regs[3]; + if (!divisor) { + divide_quotient = 0xffff; + divide_remainder = 0x0000; + } else { + divide_quotient = dividend / divisor; + divide_remainder = dividend % divisor; + } + } +} static MEMORY_READ_START( readmem ) + { 0x0008, 0x000f, contra_k007452_r }, { 0x0010, 0x0010, input_port_0_r }, /* IN0 */ { 0x0011, 0x0011, input_port_1_r }, /* IN1 */ { 0x0012, 0x0012, input_port_2_r }, /* IN2 */ @@ -82,6 +127,7 @@ static MEMORY_WRITE_START( writemem ) { 0x0000, 0x0007, contra_K007121_ctrl_0_w }, + { 0x0008, 0x000f, contra_k007452_w }, { 0x0018, 0x0018, contra_coin_counter_w }, { 0x001a, 0x001a, contra_sh_irqtrigger_w }, { 0x001c, 0x001c, cpu_sound_command_w },
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/cps1.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/cps1.c
Changed
@@ -2376,7 +2376,7 @@ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0, 0xc0, "Max Players" ) + PORT_DIPNAME( 0xc0, 0x00, "Max Players" ) PORT_DIPSETTING( 0x40, "1" ) PORT_DIPSETTING( 0xc0, "2" ) PORT_DIPSETTING( 0x80, "3" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/cps2.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/cps2.c
Changed
@@ -95,6 +95,8 @@ #include "driver.h" #include "machine/eeprom.h" #include "cpu/m68000/m68000.h" +#include "bootstrap.h" +#include "inptport.h" #include "cps1.h" /* External CPS1 definitions */ @@ -6172,13 +6174,13 @@ GAMEX(1996, 19xxj, 19xx, cps2, 19xx, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Japan 951225)", GAME_NOT_WORKING ) GAME( 1996, 19xxjr1, 19xx, cps2, 19xx, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Japan 951207)" ) GAME( 1996, 19xxh, 19xx, cps2, 19xx, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Hispanic 951218)" ) -GAME( 1996, ddsom, 0, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Euro 960619)" ) -GAME( 1996, ddsomr1, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Euro 960209)" ) -GAME( 1996, ddsomu, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (US 960619)" ) -GAME( 1996, ddsomur1, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (US 960209)" ) -GAME( 1996, ddsomj, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Japan 960619)" ) -GAME( 1996, ddsomjr1, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Japan 960206)" ) -GAME( 1996, ddsoma, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Asia 960619)" ) +GAMEC( 1996, ddsom, 0, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Euro 960619)", &ddsom_ctrl , &ddsom_bootstrap ) +GAMEC( 1996, ddsomr1, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Euro 960209)", &ddsom_ctrl , &ddsom_bootstrap ) +GAMEC( 1996, ddsomu, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (US 960619)", &ddsom_ctrl , &ddsomu_bootstrap ) +GAMEC( 1996, ddsomur1, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (US 960209)", &ddsom_ctrl , &ddsomu_bootstrap ) +GAMEC( 1996, ddsomj, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Japan 960619)", &ddsom_ctrl , &ddsomj_bootstrap ) +GAMEC( 1996, ddsomjr1, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Japan 960206)", &ddsom_ctrl , &ddsomj_bootstrap ) +GAMEC( 1996, ddsoma, ddsom, cps2, ddtod, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Asia 960619)", &ddsom_ctrl , &ddsoma_bootstrap ) GAME( 1996, megaman2, 0, cps2, sgemf, cps2, ROT0, "Capcom", "Mega Man 2: The Power Fighters (US 960708)" ) GAMEX(1996, megamn2a, megaman2,cps2, sgemf, cps2, ROT0, "Capcom", "Mega Man 2: The Power Fighters (Asia 960708)", GAME_NOT_WORKING ) GAME( 1996, rckman2j, megaman2,cps2, sgemf, cps2, ROT0, "Capcom", "Rockman 2: The Power Fighters (Japan 960708)" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/dassault.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/dassault.c
Changed
@@ -355,7 +355,7 @@ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Max Players" ) + PORT_DIPNAME( 0x20, 0x00, "Max Players" ) PORT_DIPSETTING( 0x20, "2" ) PORT_DIPSETTING( 0x00, "4" ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) @@ -426,7 +426,7 @@ PORT_DIPSETTING( 0x0c, "Normal" ) PORT_DIPSETTING( 0x04, "Hard" ) PORT_DIPSETTING( 0x00, "Hardest" ) - PORT_DIPNAME( 0x30, 0x30, "Max Players" ) + PORT_DIPNAME( 0x30, 0x10, "Max Players" ) PORT_DIPSETTING( 0x30, "2" ) PORT_DIPSETTING( 0x20, "3" ) PORT_DIPSETTING( 0x10, "4" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/ddragon3.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/ddragon3.c
Changed
@@ -354,7 +354,7 @@ PORT_DIPNAME( 0x0100, 0x0100, "Starting Energy" ) PORT_DIPSETTING( 0x0000, "200" ) PORT_DIPSETTING( 0x0100, "230" ) - PORT_DIPNAME( 0x0200, 0x0200, "Players" ) + PORT_DIPNAME( 0x0200, 0x0000, "Players" ) PORT_DIPSETTING( 0x0200, "2" ) PORT_DIPSETTING( 0x0000, "3" ) PORT_BIT( 0xfc00, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -435,7 +435,7 @@ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x0200, 0x0200, "Players" ) + PORT_DIPNAME( 0x0200, 0x0000, "Players" ) PORT_DIPSETTING( 0x0200, "2" ) PORT_DIPSETTING( 0x0000, "3" ) PORT_BIT( 0xc000, IP_ACTIVE_LOW, IPT_UNUSED )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/deco32.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/deco32.c
Changed
@@ -110,10 +110,19 @@ #include "decoprot.h" #include "machine/eeprom.h" #include "deco32.h" +#include "cpu/z80/z80.h" +#include "bootstrap.h" +#include "inptport.h" static data32_t *deco32_ram; static int raster_enable,raster_offset; static void *raster_irq_timer; +static UINT8 nslasher_sound_irq; + +extern data32_t *deco32_ace_ram; +extern VIDEO_START( nslasher ); +extern VIDEO_UPDATE( nslasher ); +extern WRITE32_HANDLER( deco32_ace_ram_w ); /**********************************************************************************/ @@ -152,10 +161,10 @@ return 0xffffff80 | 0x1 | 0x10; /* Assume VBL takes priority over possible raster/lightgun irq */ return 0xffffff80 | cpu_getvblank() | (cpu_getiloops() ? 0x40 : 0x20); -// return 0xffffff80 | cpu_getvblank() | (0x40); //test for lock load guns +/* return 0xffffff80 | cpu_getvblank() | (0x40); */ /*test for lock load guns*/ } - logerror("%08x: Unmapped IRQ read %08x (%08x)\n",activecpu_get_pc(),offset,mem_mask); + log_cb(RETRO_LOG_ERROR, LOGPRE "%08x: Unmapped IRQ read %08x (%08x)\n",activecpu_get_pc(),offset,mem_mask); return 0xffffffff; } @@ -165,7 +174,7 @@ switch (offset) { case 0: /* IRQ enable - probably an irq mask, but only values used are 0xc8 and 0xca */ -// logerror("%08x: IRQ write %d %08x\n",activecpu_get_pc(),offset,data); +/* log_cb(RETRO_LOG_ERROR, LOGPRE "%08x: IRQ write %d %08x\n",activecpu_get_pc(),offset,data);*/ raster_enable=(data&0xff)==0xc8; /* 0xca seems to be off */ break; @@ -203,7 +212,7 @@ case 0xed4: return readinputport(2); /* Misc */ } - logerror("%08x: Unmapped protection read %04x\n",activecpu_get_pc(),offset<<2); + log_cb(RETRO_LOG_ERROR, LOGPRE "%08x: Unmapped protection read %04x\n",activecpu_get_pc(),offset<<2); return 0xffffffff; } @@ -217,7 +226,7 @@ { switch (offset) { case 0: return 0xffff0000 | readinputport(0); - case 1: return 0xffff0000 | readinputport(1); //check top bits?? + case 1: return 0xffff0000 | readinputport(1); /*check top bits??*/ case 2: return 0xfffffffe | EEPROM_read_bit(); } @@ -237,28 +246,28 @@ static READ32_HANDLER( dragngun_service_r ) { -// logerror("%08x:Read service\n",activecpu_get_pc()); +/* log_cb(RETRO_LOG_ERROR, LOGPRE "%08x:Read service\n",activecpu_get_pc());*/ return readinputport(3); } static READ32_HANDLER( lockload_gun_mirror_r ) { -//logerror("%08x:Read gun %d\n",activecpu_get_pc(),offset); -//return ((rand()%0xffff)<<16) | rand()%0xffff; +/*logerror("%08x:Read gun %d\n",activecpu_get_pc(),offset);*/ +/*return ((rand()%0xffff)<<16) | rand()%0xffff;*/ if (offset) /* Mirror of player 1 and player 2 fire buttons */ return readinputport(5) | ((rand()%0xff)<<16); - return readinputport(4) | readinputport(6) | (readinputport(6)<<16) | (readinputport(6)<<24); //((rand()%0xff)<<16); + return readinputport(4) | readinputport(6) | (readinputport(6)<<16) | (readinputport(6)<<24); /*((rand()%0xff)<<16);*/ } static READ32_HANDLER( dragngun_prot_r ) { -// logerror("%08x:Read prot %08x (%08x)\n",activecpu_get_pc(),offset<<1,mem_mask); +/* log_cb(RETRO_LOG_ERROR, LOGPRE "%08x:Read prot %08x (%08x)\n",activecpu_get_pc(),offset<<1,mem_mask);*/ static int strobe=0; if (!strobe) strobe=8; else strobe=0; -//definitely vblank in locked load +/*definitely vblank in locked load*/ switch (offset<<1) { case 0x140/2: return 0xffff0000 | readinputport(0); /* IN0 */ @@ -280,13 +289,13 @@ case 7: return readinputport(7); break; } -// logerror("Illegal lightgun port %d read \n",dragngun_lightgun_port); +/* log_cb(RETRO_LOG_ERROR, LOGPRE "Illegal lightgun port %d read \n",dragngun_lightgun_port);*/ return 0; } static WRITE32_HANDLER( dragngun_lightgun_w ) { -// logerror("Lightgun port %d\n",dragngun_lightgun_port); +/* log_cb(RETRO_LOG_ERROR, LOGPRE "Lightgun port %d\n",dragngun_lightgun_port);*/ dragngun_lightgun_port=offset; } @@ -303,7 +312,7 @@ EEPROM_set_cs_line((data & 0x4) ? CLEAR_LINE : ASSERT_LINE); return; } - logerror("%08x:Write control 1 %08x %08x\n",activecpu_get_pc(),offset,data); + log_cb(RETRO_LOG_ERROR, LOGPRE "%08x:Write control 1 %08x %08x\n",activecpu_get_pc(),offset,data); } static READ32_HANDLER(dragngun_oki_2_r) @@ -328,7 +337,7 @@ case 0x35a: return tattass_eprom_bit << 16; } - logerror("%08x:Read prot %08x (%08x)\n",activecpu_get_pc(),offset<<1,mem_mask); + log_cb(RETRO_LOG_ERROR, LOGPRE "%08x:Read prot %08x (%08x)\n",activecpu_get_pc(),offset<<1,mem_mask); return 0xffffffff; } @@ -379,10 +388,10 @@ if ((data&0x40)==0) { if (bufPtr) { int i; - logerror("Eprom reset (bit count %d): ",readBitCount); + log_cb(RETRO_LOG_ERROR, LOGPRE "Eprom reset (bit count %d): ",readBitCount); for (i=0; i<bufPtr; i++) - logerror("%s",buffer[i] ? "1" : "0"); - logerror("\n"); + log_cb(RETRO_LOG_ERROR, LOGPRE "%s",buffer[i] ? "1" : "0"); + log_cb(RETRO_LOG_ERROR, LOGPRE "\n"); } bufPtr=0; @@ -393,7 +402,7 @@ /* Eprom has been clocked */ if (lastClock==0 && data&0x20 && data&0x40) { if (bufPtr>=32) { - logerror("Eprom overflow!"); + log_cb(RETRO_LOG_ERROR, LOGPRE "Eprom overflow!"); bufPtr=0; } @@ -444,13 +453,13 @@ pendingCommand=2; } else { - logerror("Detected unknown eprom command\n"); + log_cb(RETRO_LOG_ERROR, LOGPRE "Detected unknown eprom command\n"); } } } else { if (!(data&0x40)) { - logerror("Cs set low\n"); + log_cb(RETRO_LOG_ERROR, LOGPRE "Cs set low\n"); bufPtr=0; } } @@ -461,7 +470,7 @@ /* Volume in high byte */ if (mem_mask==0xffff00ff) { - //TODO: volume attenuation == ((data>>8)&0xff); + /*TODO: volume attenuation == ((data>>8)&0xff);*/ return; } @@ -477,7 +486,58 @@ /* bit 0x4 fade cancel? */ /* bit 0x8 ?? */ /* Bit 0x100 ?? */ - //logerror("%08x: %08x data\n",data,mem_mask); + /*logerror("%08x: %08x data\n",data,mem_mask);*/ +} + +/**********************************************************************************/ + +static READ32_HANDLER( nslasher_prot_r ) +{ + + switch (offset<<1) { + case 0x280: return readinputport(0) << 16| 0xffff; /* IN0 */ + case 0x4c4: { + static int vblank = 0; + + unsigned int ret = readinputport(1) << 16 | 0xffff; + ret &= ~(0x100000); + ret |= vblank; + + vblank ^= 0x100000; /* iq_132*/ + + return ret; /* IN1 */ + } + + case 0x35a: return (EEPROM_read_bit()<< 16) | 0xffff; /* Debug switch in low word??*/ + } + + /*logerror("%08x: Read unmapped prot %08x (%08x)\n",cpu_get_pc(space->cpu),offset<<1,mem_mask);*/ + + return 0xffffffff; +} + +static WRITE32_HANDLER( nslasher_eeprom_w ) +{ + if (ACCESSING_LSB32) + { + EEPROM_set_clock_line((data & 0x20) ? ASSERT_LINE : CLEAR_LINE); + EEPROM_write_bit(data & 0x10); + EEPROM_set_cs_line((data & 0x40) ? CLEAR_LINE : ASSERT_LINE); + + deco32_pri_w(0,data&0x3,0xffffffff); /* Bit 0 - layer priority toggle, Bit 1 - BG2/3 Joint mode (8bpp) */ + } +} + +static WRITE32_HANDLER( nslasher_prot_w ) +{ + /* Only sound port of chip is used - no protection */ + if (offset==0x700/4) { + + /* bit 1 of nslasher_sound_irq specifies IRQ command writes */ + soundlatch_w(0,(data>>16)&0xff); + nslasher_sound_irq |= 0x02; + cpu_set_irq_line(1, 0, (nslasher_sound_irq != 0) ? ASSERT_LINE : CLEAR_LINE); + } } /**********************************************************************************/ @@ -570,12 +630,12 @@ { 0x12002c, 0x12002f, fghthist_eeprom_w }, { 0x1201fc, 0x1201ff, deco32_sound_w }, { 0x140000, 0x140003, MWA32_NOP }, /* VBL irq ack */ - //148000 - IRQ mask (ca)... + /*148000 - IRQ mask (ca)...*/ { 0x168000, 0x169fff, deco32_buffered_palette_w, &paletteram32 }, { 0x16c008, 0x16c00b, deco32_palette_dma_w }, { 0x178000, 0x178fff, MWA32_RAM, &spriteram32, &spriteram_size }, - { 0x179000, 0x179fff, MWA32_RAM, &spriteram32_2 }, // ? + { 0x179000, 0x179fff, MWA32_RAM, &spriteram32_2 }, /* ?*/ { 0x17c010, 0x17c013, buffer_spriteram32_w }, { 0x182000, 0x183fff, deco32_pf1_data_w, &deco32_pf1_data }, @@ -674,8 +734,8 @@ { 0x218000, 0x21ffff, MRA32_RAM }, { 0x220000, 0x221fff, MRA32_RAM }, /* Main spriteram */ - { 0x204800, 0x204fff, MRA32_RAM }, //0x10 byte increments only - { 0x228000, 0x2283ff, MRA32_RAM }, //0x10 byte increments only + { 0x204800, 0x204fff, MRA32_RAM }, /*0x10 byte increments only*/ + { 0x228000, 0x2283ff, MRA32_RAM }, /*0x10 byte increments only*/ { 0x300000, 0x3fffff, MRA32_ROM }, @@ -692,7 +752,7 @@ { 0x128000, 0x12800f, deco32_irq_controller_w }, { 0x130000, 0x131fff, deco32_buffered_palette_w, &paletteram32 }, - { 0x138000, 0x138003, MWA32_NOP }, // palette mode? check + { 0x138000, 0x138003, MWA32_NOP }, /* palette mode? check*/ { 0x138008, 0x13800b, deco32_palette_dma_w }, { 0x180000, 0x18001f, MWA32_RAM, &deco32_pf12_control }, @@ -707,7 +767,7 @@ { 0x1e0000, 0x1e0fff, MWA32_RAM, &deco32_pf3_rowscroll }, { 0x1e4000, 0x1e4fff, MWA32_RAM, &deco32_pf4_rowscroll }, - { 0x204800, 0x204fff, MWA32_RAM }, // ace? 0x10 byte increments only // 13f ff stuff + { 0x204800, 0x204fff, MWA32_RAM }, /* ace? 0x10 byte increments only */ /* 13f ff stuff*/ { 0x208000, 0x208fff, MWA32_RAM, &dragngun_sprite_layout_0_ram }, { 0x20c000, 0x20cfff, MWA32_RAM, &dragngun_sprite_layout_1_ram }, @@ -732,7 +792,7 @@ { 0x120000, 0x120fff, dragngun_prot_r }, { 0x128000, 0x12800f, deco32_irq_controller_r }, { 0x130000, 0x131fff, MRA32_RAM }, - { 0x138000, 0x138003, MRA32_RAM }, //palette dma complete in bit 0x8? ack? return 0 else tight loop + { 0x138000, 0x138003, MRA32_RAM }, /*palette dma complete in bit 0x8? ack? return 0 else tight loop*/ { 0x170000, 0x170007, lockload_gun_mirror_r }, /* Not on Dragongun */ @@ -754,14 +814,14 @@ { 0x218000, 0x21ffff, MRA32_RAM }, { 0x220000, 0x221fff, MRA32_RAM }, /* Main spriteram */ - { 0x204800, 0x204fff, MRA32_RAM }, //0x10 byte increments only - { 0x228000, 0x2283ff, MRA32_RAM }, //0x10 byte increments only + { 0x204800, 0x204fff, MRA32_RAM }, /*0x10 byte increments only*/ + { 0x228000, 0x2283ff, MRA32_RAM }, /*0x10 byte increments only*/ { 0x300000, 0x3fffff, MRA32_ROM }, { 0x400000, 0x400003, dragngun_oki_2_r }, { 0x420000, 0x420003, dragngun_eeprom_r }, -// { 0x438000, 0x438003, dragngun_lightgun_r }, +/* { 0x438000, 0x438003, dragngun_lightgun_r },*/ { 0x440000, 0x440003, dragngun_service_r }, MEMORY_END @@ -773,7 +833,7 @@ { 0x128000, 0x12800f, deco32_irq_controller_w }, { 0x130000, 0x131fff, deco32_buffered_palette_w, &paletteram32 }, - { 0x138000, 0x138003, MWA32_NOP }, // palette mode? check + { 0x138000, 0x138003, MWA32_NOP }, /* palette mode? check*/ { 0x138008, 0x13800b, deco32_palette_dma_w }, { 0x178008, 0x17800f, MWA32_NOP }, /* Gun read ACK's */ @@ -789,7 +849,7 @@ { 0x1e0000, 0x1e0fff, MWA32_RAM, &deco32_pf3_rowscroll }, { 0x1e4000, 0x1e4fff, MWA32_RAM, &deco32_pf4_rowscroll }, - { 0x204800, 0x204fff, MWA32_RAM }, // ace? 0x10 byte increments only // 13f ff stuff + { 0x204800, 0x204fff, MWA32_RAM }, /* ace? 0x10 byte increments only */ /* 13f ff stuff*/ { 0x208000, 0x208fff, MWA32_RAM, &dragngun_sprite_layout_0_ram }, { 0x20c000, 0x20cfff, MWA32_RAM, &dragngun_sprite_layout_1_ram }, @@ -804,7 +864,7 @@ { 0x300000, 0x3fffff, MWA32_ROM }, { 0x400000, 0x400003, dragngun_oki_2_w }, { 0x420000, 0x420003, dragngun_eeprom_w }, -// { 0x430000, 0x43001f, dragngun_lightgun_w }, +/* { 0x430000, 0x43001f, dragngun_lightgun_w },*/ { 0x500000, 0x500003, dragngun_sprite_control_w }, MEMORY_END @@ -886,6 +946,71 @@ { 0x200000, 0x200fff, tattass_prot_w, &deco32_prot_ram }, MEMORY_END +static MEMORY_READ32_START( nslasher_readmem ) + { 0x000000, 0x0fffff, MRA32_ROM }, + { 0x100000, 0x11ffff, MRA32_RAM }, + { 0x120000, 0x1200ff, MRA32_NOP }, /* ACIA (unused) */ + + { 0x163000, 0x16309f, MRA32_RAM }, /* 'Ace' RAM!? */ + { 0x168000, 0x169fff, MRA32_RAM }, + { 0x170000, 0x171fff, MRA32_RAM }, + { 0x178000, 0x179fff, MRA32_RAM }, + { 0x182000, 0x183fff, MRA32_RAM }, + { 0x184000, 0x185fff, MRA32_RAM }, + + { 0x192000, 0x193fff, MRA32_RAM }, + { 0x194000, 0x195fff, MRA32_RAM }, + { 0x1a0000, 0x1a001f, MRA32_RAM }, + { 0x1c2000, 0x1c3fff, MRA32_RAM }, + { 0x1c4000, 0x1c5fff, MRA32_RAM }, + + { 0x1d2000, 0x1d3fff, MRA32_RAM }, + { 0x1d4000, 0x1d5fff, MRA32_RAM }, + { 0x1e0000, 0x1e001f, MRA32_RAM }, + { 0x200000, 0x200fff, nslasher_prot_r }, +MEMORY_END + +static MEMORY_WRITE32_START( nslasher_writemem ) + { 0x000000, 0x0fffff, MWA32_ROM }, + { 0x100000, 0x11ffff, MWA32_RAM, &deco32_ram }, + { 0x120000, 0x1200ff, MWA32_NOP }, /* ACIA (unused) */ + { 0x140000, 0x140003, MWA32_NOP }, /* Vblank ack */ + { 0x150000, 0x150003, nslasher_eeprom_w }, /* Volume port/Eprom/Priority */ + + { 0x163000, 0x16309f, deco32_ace_ram_w, &deco32_ace_ram }, /* 'Ace' RAM!? */ + { 0x164000, 0x164003, MWA32_NOP }, /* Palette control BG2/3 ($1a constant) */ + { 0x164004, 0x164007, MWA32_NOP }, /* Palette control Obj1 ($4 constant) */ + { 0x164008, 0x16400b, MWA32_NOP }, /* Palette control Obj2 ($6 constant) */ + { 0x16400c, 0x16400f, MWA32_NOP }, + { 0x168000, 0x169fff, deco32_buffered_palette_w, &paletteram32 }, + { 0x16c000, 0x16c003, MWA32_NOP }, + { 0x16c008, 0x16c00b, deco32_palette_dma_w }, + + { 0x170000, 0x171fff, MWA32_RAM, &spriteram32, &spriteram_size }, + { 0x174000, 0x174003, MWA32_NOP }, /* Sprite DMA mode (2) */ + { 0x174010, 0x174013, buffer_spriteram32_w }, + { 0x174018, 0x17401b, MWA32_NOP }, /* Sprite 'CPU' (unused) */ + { 0x178000, 0x179fff, MWA32_RAM, &spriteram32_2, &spriteram_2_size }, + { 0x17c000, 0x17c003, MWA32_NOP }, /* Sprite DMA mode (2) */ + { 0x17c010, 0x17c013, buffer_spriteram32_2_w }, + { 0x17c018, 0x17c01b, MWA32_NOP }, /* Sprite 'CPU' (unused) */ + + { 0x182000, 0x183fff, deco32_pf1_data_w, &deco32_pf1_data }, + { 0x184000, 0x185fff, deco32_pf2_data_w, &deco32_pf2_data }, + { 0x192000, 0x193fff, MWA32_RAM, &deco32_pf1_rowscroll }, + { 0x194000, 0x195fff, MWA32_RAM, &deco32_pf2_rowscroll }, + { 0x1a0000, 0x1a001f, MWA32_RAM, &deco32_pf12_control }, + + { 0x1c2000, 0x1c3fff, deco32_pf3_data_w, &deco32_pf3_data }, + { 0x1c4000, 0x1c5fff, deco32_pf4_data_w, &deco32_pf4_data }, + { 0x1d2000, 0x1d3fff, MWA32_RAM, &deco32_pf3_rowscroll }, + { 0x1d4000, 0x1d5fff, MWA32_RAM, &deco32_pf4_rowscroll }, + { 0x1e0000, 0x1e001f, MWA32_RAM, &deco32_pf34_control }, + + { 0x200000, 0x200fff, nslasher_prot_w, &deco32_prot_ram }, +MEMORY_END + + /******************************************************************************/ static int bsmt_latch; @@ -940,6 +1065,46 @@ { 0x2000, 0xffff, MWA_ROM }, MEMORY_END + +static READ_HANDLER(latch_r) +{ + /* bit 1 of nslasher_sound_irq specifies IRQ command writes */ + nslasher_sound_irq &= ~0x02; + cpu_set_irq_line(1, 0, (nslasher_sound_irq != 0) ? ASSERT_LINE : CLEAR_LINE); + return soundlatch_r(0); +} + + +static MEMORY_READ_START( sound_readmem_nslasher ) + { 0x0000, 0x7fff, MRA_ROM }, + { 0x8000, 0x87ff, MRA_RAM }, + { 0xa001, 0xa001, YM2151_status_port_0_r }, + { 0xb000, 0xb000, OKIM6295_status_0_r }, + { 0xc000, 0xc000, OKIM6295_status_1_r }, + { 0xd000, 0xd000, latch_r }, +MEMORY_END + +static MEMORY_WRITE_START( sound_writemem_nslasher ) + { 0x0000, 0x7fff, MWA_ROM }, + { 0x8000, 0x87ff, MWA_RAM }, + { 0xa000, 0xa000, YM2151_register_port_0_w }, + { 0xa001, 0xa001, YM2151_data_port_0_w }, + { 0xb000, 0xb000, OKIM6295_data_0_w }, + { 0xc000, 0xc000, OKIM6295_data_1_w }, +MEMORY_END + + +static READ_HANDLER( nslasher_read_rom ) +{ + unsigned char *rom = (unsigned char*)memory_region(REGION_CPU2); + return rom[activecpu_get_reg((unsigned int)Z80_BC)]; +} + +static PORT_READ_START( sound_readport_nslasher ) + { 0x0000, 0xffff, nslasher_read_rom }, +PORT_END + + /**********************************************************************************/ /* Notes (2002.02.05) : @@ -1083,7 +1248,7 @@ PORT_DIPNAME( 0x1000, 0x1000, "Coin Slots" ) PORT_DIPSETTING( 0x1000, "Common" ) PORT_DIPSETTING( 0x0000, "Individual" ) - PORT_DIPNAME( 0x2000, 0x2000, "Max Players" ) + PORT_DIPNAME( 0x2000, 0x0000, "Max Players" ) PORT_DIPSETTING( 0x2000, "2" ) PORT_DIPSETTING( 0x0000, "4" ) PORT_DIPNAME( 0x4000, 0x4000, "Allow Continue" ) @@ -1155,7 +1320,7 @@ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SPECIAL ) //check //test BUTTON F2 + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SPECIAL ) /*check */ /*test BUTTON F2*/ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1200,7 +1365,7 @@ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BITX(0x0004, 0x04, IPT_DIPSWITCH_NAME | IPF_TOGGLE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) //check //test BUTTON F2 + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) /*check */ /*test BUTTON F2*/ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1239,10 +1404,10 @@ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) PORT_START - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) //reset button?? + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) /*reset button??*/ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) //service?? - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SPECIAL ) //check //test BUTTON F2 + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) /*service??*/ + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SPECIAL ) /*check */ /*test BUTTON F2*/ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 ) @@ -1284,11 +1449,11 @@ PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_START - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN2 ) //IPT_VBLANK ) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN2 ) /*IPT_VBLANK )*/ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BITX(0x0004, 0x04, IPT_DIPSWITCH_NAME | IPF_TOGGLE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE ) -// PORT_BITX(0x0004, IP_ACTIVE_LOW, IPT_SERVICE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) //check //test BUTTON F2 +/* PORT_BITX(0x0004, IP_ACTIVE_LOW, IPT_SERVICE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE )*/ + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) /*check */ /*test BUTTON F2*/ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER2 ) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON5 | IPF_PLAYER2 ) @@ -1353,6 +1518,44 @@ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END +INPUT_PORTS_START( nslasher ) + PORT_START + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER1 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER1 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER1 ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER2 ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER2 ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER2 ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_START + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_SERVICE_NO_TOGGLE( 0x0008, IP_ACTIVE_LOW ) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_VBLANK ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED ) /* 'soundmask' */ + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER3 ) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER3 ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER3 ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER3 ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER3 ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER3 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER3 ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START3 ) +INPUT_PORTS_END + /**********************************************************************************/ static struct GfxLayout charlayout = @@ -1372,7 +1575,7 @@ RGN_FRAC(1,1), 4, { 16, 0, 24, 8 }, -// { 24, 16, 8, 0 }, +/* { 24, 16, 8, 0 },*/ { 64*8+0, 64*8+1, 64*8+2, 64*8+3, 64*8+4, 64*8+5, 64*8+6, 64*8+7, 0, 1, 2, 3, 4, 5, 6, 7 }, { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, @@ -1380,6 +1583,20 @@ 128*8 }; +static struct GfxLayout spritelayout_5bpp = +{ + 16,16, + RGN_FRAC(1,2), + 5, + { RGN_FRAC(1,2), 16, 0, 24, 8 }, + { 64*8+0, 64*8+1, 64*8+2, 64*8+3, 64*8+4, 64*8+5, 64*8+6, 64*8+7, + 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, + 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 }, + 128*8 +}; + + static struct GfxLayout tilelayout = { 16,16, @@ -1412,7 +1629,7 @@ RGN_FRAC(1,5), 5, { 0x800000*8, 0x600000*8, 0x400000*8, 0x200000*8, 0 }, - { //7,6,5,4,3,2,1,0,16*8+7, 16*8+6, 16*8+5, 16*8+4, 16*8+3, 16*8+2, 16*8+1, 16*8+0, + { /*7,6,5,4,3,2,1,0,16*8+7, 16*8+6, 16*8+5, 16*8+4, 16*8+3, 16*8+2, 16*8+1, 16*8+0,*/ 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7, 0,1,2,3,4,5,6,7 @@ -1487,6 +1704,16 @@ { -1 } /* end of array */ }; +static struct GfxDecodeInfo gfxdecodeinfo_nslasher[] = +{ + { REGION_GFX1, 0, &charlayout, 0, 32 }, /* Characters 8x8 */ + { REGION_GFX1, 0, &tilelayout, 0, 32 }, /* Tiles 16x16 */ + { REGION_GFX2, 0, &tilelayout, 512, 32 }, /* Tiles 16x16 */ + { REGION_GFX3, 0, &spritelayout_5bpp,1024, 16 }, /* Sprites 16x16 */ + { REGION_GFX4, 0, &spritelayout, 1536, 32 }, /* Sprites 16x16 */ + { -1 } /* end of array */ +}; + /**********************************************************************************/ static void sound_irq(int state) @@ -1494,6 +1721,17 @@ cpu_set_irq_line(1,1,state); /* IRQ 2 */ } +static void sound_irq_nslasher(int state) +{ + /* bit 0 of nslasher_sound_irq specifies IRQ from sound chip */ + if (state) + nslasher_sound_irq |= 0x01; + else + nslasher_sound_irq &= ~0x01; + + cpu_set_irq_line(1,0, (nslasher_sound_irq != 0) ? ASSERT_LINE : CLEAR_LINE); /* IRQ 2 */ +} + static WRITE_HANDLER( sound_bankswitch_w ) { OKIM6295_set_bank_base(0, ((data >> 0)& 1) * 0x40000); @@ -1509,6 +1747,15 @@ { sound_bankswitch_w } }; +static struct YM2151interface ym2151_interface_nslasher = +{ + 1, + 32220000/9, /* Accurate, audio section crystal is 32.220 MHz */ + { YM3012_VOL(40,MIXER_PAN_LEFT,40,MIXER_PAN_RIGHT) }, + { sound_irq_nslasher }, + { sound_bankswitch_w } +}; + static struct OKIM6295interface okim6295_interface = { 2, /* 2 chips */ @@ -1562,8 +1809,8 @@ static struct EEPROM_interface eeprom_interface_tattass = { - 10, // address bits 10 ==> } 1024 byte eprom - 8, // data bits 8 + 10, /* address bits 10 ==> } 1024 byte eprom*/ + 8, /* data bits 8*/ }; static NVRAM_HANDLER(tattass) @@ -1599,7 +1846,7 @@ static MACHINE_DRIVER_START( captaven ) /* basic machine hardware */ - MDRV_CPU_ADD(ARM, 28000000/3) + MDRV_CPU_ADD(ARM, 28000000/4) MDRV_CPU_MEMORY(captaven_readmem,captaven_writemem) MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,1) @@ -1612,7 +1859,7 @@ MDRV_VBLANK_DURATION(529) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM | VIDEO_RGB_DIRECT) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) MDRV_GFXDECODE(gfxdecodeinfo_captaven) @@ -1631,7 +1878,7 @@ static MACHINE_DRIVER_START( fghthist ) /* basic machine hardware */ - MDRV_CPU_ADD(ARM, 28000000/3) + MDRV_CPU_ADD(ARM, 28000000/4) MDRV_CPU_MEMORY(fghthist_readmem,fghthist_writemem) MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,1) @@ -1644,7 +1891,7 @@ MDRV_NVRAM_HANDLER(93C46) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM | VIDEO_RGB_DIRECT) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) MDRV_GFXDECODE(gfxdecodeinfo_fghthist) @@ -1662,7 +1909,7 @@ static MACHINE_DRIVER_START( fghthsta ) /* basic machine hardware */ - MDRV_CPU_ADD(ARM, 28000000/3) + MDRV_CPU_ADD(ARM, 28000000/4) MDRV_CPU_MEMORY(fghthsta_readmem,fghthsta_writemem) MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,1) @@ -1675,7 +1922,7 @@ MDRV_NVRAM_HANDLER(93C46) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM | VIDEO_RGB_DIRECT) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) MDRV_GFXDECODE(gfxdecodeinfo_fghthist) @@ -1693,7 +1940,7 @@ static MACHINE_DRIVER_START( dragngun ) /* basic machine hardware */ - MDRV_CPU_ADD(ARM, 28000000/2) + MDRV_CPU_ADD(ARM, 28000000/4) MDRV_CPU_MEMORY(dragngun_readmem,dragngun_writemem) MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,1) @@ -1726,9 +1973,9 @@ static MACHINE_DRIVER_START( lockload ) /* basic machine hardware */ - MDRV_CPU_ADD(ARM, 28000000/2) + MDRV_CPU_ADD(ARM, 28000000/4) MDRV_CPU_MEMORY(lockload_readmem,lockload_writemem) - MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,2) // From 2 + MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,2) /* From 2*/ MDRV_CPU_ADD(H6280, 32220000/8) MDRV_CPU_FLAGS(CPU_AUDIO_CPU) @@ -1759,7 +2006,7 @@ static MACHINE_DRIVER_START( tattass ) /* basic machine hardware */ - MDRV_CPU_ADD(ARM, 28000000/2) /* Unconfirmed */ + MDRV_CPU_ADD(ARM, 28000000/4) /* Unconfirmed */ MDRV_CPU_MEMORY(tattass_readmem,tattass_writemem) MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,1) @@ -1787,6 +2034,40 @@ MDRV_SOUND_ADD(BSMT2000, bsmt2000_interface) MACHINE_DRIVER_END +static MACHINE_DRIVER_START( nslasher ) + + /* basic machine hardware */ + MDRV_CPU_ADD(ARM, 28322000/4) /* Unconfirmed */ + MDRV_CPU_MEMORY(nslasher_readmem,nslasher_writemem) + MDRV_CPU_VBLANK_INT(deco32_vbl_interrupt,1) + + MDRV_CPU_ADD(Z80, 32220000/9) + MDRV_CPU_FLAGS(CPU_AUDIO_CPU) + MDRV_CPU_MEMORY(sound_readmem_nslasher,sound_writemem_nslasher) + MDRV_CPU_PORTS(sound_readport_nslasher,0) + + MDRV_INTERLEAVE(100) + + MDRV_FRAMES_PER_SECOND(60) + MDRV_VBLANK_DURATION(529) + MDRV_NVRAM_HANDLER(93C46) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM | VIDEO_RGB_DIRECT) + MDRV_SCREEN_SIZE(42*8, 32*8) + MDRV_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) + MDRV_GFXDECODE(gfxdecodeinfo_nslasher) + MDRV_PALETTE_LENGTH(2048) + + MDRV_VIDEO_START(nslasher) + MDRV_VIDEO_UPDATE(nslasher) + + /* sound hardware */ + MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO) + MDRV_SOUND_ADD(YM2151, ym2151_interface_nslasher) + MDRV_SOUND_ADD(OKIM6295, okim6295_interface) +MACHINE_DRIVER_END + /**********************************************************************************/ ROM_START( captaven ) @@ -1803,10 +2084,10 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "hj_08.17k", 0x00000, 0x10000, CRC(361fbd16) SHA1(c4bbaf74e09c263044be74bb2c98caf6cfcab618) ) - ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, REGION_GFX1, 0 ) ROM_LOAD( "man-00.8a", 0x000000, 0x80000, CRC(7855a607) SHA1(fa0be080515482281e5a12fe172eeb9a21af0820) ) /* Encrypted tiles */ - ROM_REGION( 0x500000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x500000, REGION_GFX2, 0 ) ROM_LOAD( "man-05.16a", 0x000000, 0x40000, CRC(d44d1995) SHA1(e88e1a59a4b24ad058f21538f6e9bbba94a166b4) ) /* Encrypted tiles */ ROM_CONTINUE( 0x140000, 0x40000 ) ROM_CONTINUE( 0x280000, 0x40000 ) @@ -1828,7 +2109,7 @@ ROM_CONTINUE( 0x380000, 0x40000 ) ROM_CONTINUE( 0x4c0000, 0x40000 ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x400000, REGION_GFX3, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "man-06.17a", 0x000000, 0x100000, CRC(a9a64297) SHA1(e4cb441207b1907461c90c32c05a461c9bd30756) ) ROM_LOAD16_BYTE( "man-07.18a", 0x000001, 0x100000, CRC(b1db200c) SHA1(970bb15e90194dd285f53594aca5dec3405e75d5) ) ROM_LOAD16_BYTE( "man-08.17c", 0x200000, 0x100000, CRC(28e98e66) SHA1(55dbbd945eada81f7dcc874fdcb0b9e62ea453f0) ) @@ -1855,10 +2136,10 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "hj_08.17k", 0x00000, 0x10000, CRC(361fbd16) SHA1(c4bbaf74e09c263044be74bb2c98caf6cfcab618) ) - ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, REGION_GFX1, 0 ) ROM_LOAD( "man-00.8a", 0x000000, 0x80000, CRC(7855a607) SHA1(fa0be080515482281e5a12fe172eeb9a21af0820) ) /* Encrypted tiles */ - ROM_REGION( 0x500000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x500000, REGION_GFX2, 0 ) ROM_LOAD( "man-05.16a", 0x000000, 0x40000, CRC(d44d1995) SHA1(e88e1a59a4b24ad058f21538f6e9bbba94a166b4) ) /* Encrypted tiles */ ROM_CONTINUE( 0x140000, 0x40000 ) ROM_CONTINUE( 0x280000, 0x40000 ) @@ -1880,7 +2161,7 @@ ROM_CONTINUE( 0x380000, 0x40000 ) ROM_CONTINUE( 0x4c0000, 0x40000 ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x400000, REGION_GFX3, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "man-06.17a", 0x000000, 0x100000, CRC(a9a64297) SHA1(e4cb441207b1907461c90c32c05a461c9bd30756) ) ROM_LOAD16_BYTE( "man-07.18a", 0x000001, 0x100000, CRC(b1db200c) SHA1(970bb15e90194dd285f53594aca5dec3405e75d5) ) ROM_LOAD16_BYTE( "man-08.17c", 0x200000, 0x100000, CRC(28e98e66) SHA1(55dbbd945eada81f7dcc874fdcb0b9e62ea453f0) ) @@ -1907,10 +2188,10 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "hj_08.17k", 0x00000, 0x10000, CRC(361fbd16) SHA1(c4bbaf74e09c263044be74bb2c98caf6cfcab618) ) - ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, REGION_GFX1, 0 ) ROM_LOAD( "man-00.8a", 0x000000, 0x80000, CRC(7855a607) SHA1(fa0be080515482281e5a12fe172eeb9a21af0820) ) /* Encrypted tiles */ - ROM_REGION( 0x500000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x500000, REGION_GFX2, 0 ) ROM_LOAD( "man-05.16a", 0x000000, 0x40000, CRC(d44d1995) SHA1(e88e1a59a4b24ad058f21538f6e9bbba94a166b4) ) /* Encrypted tiles */ ROM_CONTINUE( 0x140000, 0x40000 ) ROM_CONTINUE( 0x280000, 0x40000 ) @@ -1932,7 +2213,7 @@ ROM_CONTINUE( 0x380000, 0x40000 ) ROM_CONTINUE( 0x4c0000, 0x40000 ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x400000, REGION_GFX3, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "man-06.17a", 0x000000, 0x100000, CRC(a9a64297) SHA1(e4cb441207b1907461c90c32c05a461c9bd30756) ) ROM_LOAD16_BYTE( "man-07.18a", 0x000001, 0x100000, CRC(b1db200c) SHA1(970bb15e90194dd285f53594aca5dec3405e75d5) ) ROM_LOAD16_BYTE( "man-08.17c", 0x200000, 0x100000, CRC(28e98e66) SHA1(55dbbd945eada81f7dcc874fdcb0b9e62ea453f0) ) @@ -1959,10 +2240,10 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "hj_08.17k", 0x00000, 0x10000, CRC(361fbd16) SHA1(c4bbaf74e09c263044be74bb2c98caf6cfcab618) ) - ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, REGION_GFX1, 0 ) ROM_LOAD( "man-00.8a", 0x000000, 0x80000, CRC(7855a607) SHA1(fa0be080515482281e5a12fe172eeb9a21af0820) ) /* Encrypted tiles */ - ROM_REGION( 0x500000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x500000, REGION_GFX2, 0 ) ROM_LOAD( "man-05.16a", 0x000000, 0x40000, CRC(d44d1995) SHA1(e88e1a59a4b24ad058f21538f6e9bbba94a166b4) ) /* Encrypted tiles */ ROM_CONTINUE( 0x140000, 0x40000 ) ROM_CONTINUE( 0x280000, 0x40000 ) @@ -1984,7 +2265,7 @@ ROM_CONTINUE( 0x380000, 0x40000 ) ROM_CONTINUE( 0x4c0000, 0x40000 ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x400000, REGION_GFX3, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "man-06.17a", 0x000000, 0x100000, CRC(a9a64297) SHA1(e4cb441207b1907461c90c32c05a461c9bd30756) ) ROM_LOAD16_BYTE( "man-07.18a", 0x000001, 0x100000, CRC(b1db200c) SHA1(970bb15e90194dd285f53594aca5dec3405e75d5) ) ROM_LOAD16_BYTE( "man-08.17c", 0x200000, 0x100000, CRC(28e98e66) SHA1(55dbbd945eada81f7dcc874fdcb0b9e62ea453f0) ) @@ -2011,10 +2292,10 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "hj_08.17k", 0x00000, 0x10000, CRC(361fbd16) SHA1(c4bbaf74e09c263044be74bb2c98caf6cfcab618) ) - ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, REGION_GFX1, 0 ) ROM_LOAD( "man-00.8a", 0x000000, 0x80000, CRC(7855a607) SHA1(fa0be080515482281e5a12fe172eeb9a21af0820) ) /* Encrypted tiles */ - ROM_REGION( 0x500000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x500000, REGION_GFX2, 0 ) ROM_LOAD( "man-05.16a", 0x000000, 0x40000, CRC(d44d1995) SHA1(e88e1a59a4b24ad058f21538f6e9bbba94a166b4) ) /* Encrypted tiles */ ROM_CONTINUE( 0x140000, 0x40000 ) ROM_CONTINUE( 0x280000, 0x40000 ) @@ -2036,7 +2317,7 @@ ROM_CONTINUE( 0x380000, 0x40000 ) ROM_CONTINUE( 0x4c0000, 0x40000 ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x400000, REGION_GFX3, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "man-06.17a", 0x000000, 0x100000, CRC(a9a64297) SHA1(e4cb441207b1907461c90c32c05a461c9bd30756) ) ROM_LOAD16_BYTE( "man-07.18a", 0x000001, 0x100000, CRC(b1db200c) SHA1(970bb15e90194dd285f53594aca5dec3405e75d5) ) ROM_LOAD16_BYTE( "man-08.17c", 0x200000, 0x100000, CRC(28e98e66) SHA1(55dbbd945eada81f7dcc874fdcb0b9e62ea453f0) ) @@ -2063,10 +2344,10 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "hj_08.17k", 0x00000, 0x10000, CRC(361fbd16) SHA1(c4bbaf74e09c263044be74bb2c98caf6cfcab618) ) - ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x80000, REGION_GFX1, 0 ) ROM_LOAD( "man-00.8a", 0x000000, 0x80000, CRC(7855a607) SHA1(fa0be080515482281e5a12fe172eeb9a21af0820) ) /* Encrypted tiles */ - ROM_REGION( 0x500000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x500000, REGION_GFX2, 0 ) ROM_LOAD( "man-05.16a", 0x000000, 0x40000, CRC(d44d1995) SHA1(e88e1a59a4b24ad058f21538f6e9bbba94a166b4) ) /* Encrypted tiles */ ROM_CONTINUE( 0x140000, 0x40000 ) ROM_CONTINUE( 0x280000, 0x40000 ) @@ -2088,7 +2369,7 @@ ROM_CONTINUE( 0x380000, 0x40000 ) ROM_CONTINUE( 0x4c0000, 0x40000 ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x400000, REGION_GFX3, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "man-06.17a", 0x000000, 0x100000, CRC(a9a64297) SHA1(e4cb441207b1907461c90c32c05a461c9bd30756) ) ROM_LOAD16_BYTE( "man-07.18a", 0x000001, 0x100000, CRC(b1db200c) SHA1(970bb15e90194dd285f53594aca5dec3405e75d5) ) ROM_LOAD16_BYTE( "man-08.17c", 0x200000, 0x100000, CRC(28e98e66) SHA1(55dbbd945eada81f7dcc874fdcb0b9e62ea453f0) ) @@ -2115,15 +2396,15 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "kb10.bin", 0x00000, 0x10000, CRC(ec56f560) SHA1(feb9491683ba7f1000edebb568d6b3471fcc87fb) ) - ROM_REGION( 0x020000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x020000, REGION_GFX1, 0 ) ROM_LOAD16_BYTE( "kb08.bin", 0x00000, 0x10000, CRC(8fe4e5f5) SHA1(922b94f8ce0c35e965259c11e95891ef4be913d4) ) /* Encrypted tiles */ ROM_LOAD16_BYTE( "kb09.bin", 0x00001, 0x10000, CRC(e9dcac3f) SHA1(0621e601ffae73bbf69623042c9c8ab0526c3de6) ) - ROM_REGION( 0x120000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x120000, REGION_GFX2, 0 ) ROM_LOAD( "mar-00.bin", 0x00000, 0x80000, CRC(d0491a37) SHA1(cc0ae1e9e5f42ba30159fb79bccd2e237cd037d0) ) /* Encrypted tiles */ ROM_LOAD( "mar-01.bin", 0x90000, 0x80000, CRC(d5970365) SHA1(729baf1efbef15c9f3e1d700717f5ba4f10d3014) ) - ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_REGION( 0x400000, REGION_GFX3, 0 ) ROM_LOAD( "mar-02.bin", 0x000000, 0x40000, CRC(c6cd4baf) SHA1(350286829a330b64f463d0a9cbbfdb71eecf5188) ) /* Encrypted tiles 0/4 */ ROM_CONTINUE( 0x100000, 0x40000 ) /* 2 bpp per 0x40000 chunk, 1/4 */ ROM_CONTINUE( 0x200000, 0x40000 ) /* 2/4 */ @@ -2141,7 +2422,7 @@ ROM_CONTINUE( 0x2c0000, 0x40000 ) /* 2/4 */ ROM_CONTINUE( 0x3c0000, 0x40000 ) /* 3/4 */ - ROM_REGION( 0x800000, REGION_GFX4, ROMREGION_DISPOSE ) + ROM_REGION( 0x800000, REGION_GFX4, 0 ) ROM_LOAD32_BYTE( "mar-09.bin", 0x000000, 0x100000, CRC(18fec9e1) SHA1(1290a9c13b4fd7d2197b39ec616206796e3a17a8) ) ROM_LOAD32_BYTE( "mar-10.bin", 0x400000, 0x100000, CRC(73126fbc) SHA1(9b9c31335e4db726863b219072c83810008f88f9) ) ROM_LOAD32_BYTE( "mar-11.bin", 0x000001, 0x100000, CRC(1fc638a4) SHA1(003dcfbb65a8f32a1a030502a11432287cf8b4e0) ) @@ -2239,8 +2520,8 @@ ROM_REGION(0x100000, REGION_CPU1, 0 ) /* ARM 32 bit code */ ROM_LOAD32_WORD( "le-00.1f", 0x000000, 0x80000, CRC(a5c410eb) SHA1(e2b0cb2351782e1155ecc4029010beb7326fd874) ) ROM_LOAD32_WORD( "le-01.2f", 0x000002, 0x80000, CRC(7e148aa2) SHA1(b21e16604c4d29611f91d629deb9f041eaf41e9b) ) -// ROM_LOAD32_WORD( "kz00.out", 0x000000, 0x80000, CRC(03a3dd5c) ) -// ROM_LOAD32_WORD( "kz01.out", 0x000002, 0x80000, CRC(086796d6) ) +/* ROM_LOAD32_WORD( "kz00.out", 0x000000, 0x80000, CRC(03a3dd5c) )*/ +/* ROM_LOAD32_WORD( "kz01.out", 0x000002, 0x80000, CRC(086796d6) )*/ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "kz02.18k", 0x00000, 0x10000, CRC(5fd2309c) SHA1(2fb7af54d5cd9bf7dd6fb4f6b82aa52b03294f1f) ) @@ -2330,18 +2611,18 @@ ROM_LOAD32_BYTE( "mbm-15.a25", 0x400003, 0x100000, CRC(789ce7b1) SHA1(3fb390ce0620ce7a63f7f46eac1ff0eb8ed76d26) ) ROM_REGION( 0x100000, REGION_GFX5, 0 ) /* Video data - same as Dragongun, probably leftover from a conversion */ -// ROM_LOAD( "dgma17.bin", 0x00000, 0x100000, CRC(7799ed23) SHA1(ae28ad4fa6033a3695fa83356701b3774b26e6b0) ) /* Todo - fix filenames */ -// ROM_LOAD( "dgma18.bin", 0x00000, 0x100000, CRC(ded66da9) SHA1(5134cb47043cc190a35ebdbf1912166669f9c055) ) -// ROM_LOAD( "dgma19.bin", 0x00000, 0x100000, CRC(bdd1ed20) SHA1(2435b23210b8fee4d39c30d4d3c6ea40afaa3b93) ) -// ROM_LOAD( "dgma20.bin", 0x00000, 0x100000, CRC(fa0462f0) SHA1(1a52617ad4d7abebc0f273dd979f4cf2d6a0306b) ) -// ROM_LOAD( "dgma21.bin", 0x00000, 0x100000, CRC(2d0a28ae) SHA1(d87f6f71bb76880e4d4f1eab8e0451b5c3df69a5) ) -// ROM_LOAD( "dgma22.bin", 0x00000, 0x100000, CRC(c85f3559) SHA1(a5d5cf9b18c9ef6a92d7643ca1ec9052de0d4a01) ) -// ROM_LOAD( "dgma23.bin", 0x00000, 0x100000, CRC(ba907d6a) SHA1(1fd99b66e6297c8d927c1cf723a613b4ee2e2f90) ) -// ROM_LOAD( "dgma24.bin", 0x00000, 0x100000, CRC(5cec45c8) SHA1(f99a26afaca9d9320477e469b09e3873bc8c156f) ) -// ROM_LOAD( "dgma25.bin", 0x00000, 0x100000, CRC(d65d895c) SHA1(4508dfff95a7aff5109dc74622cbb4503b0b5840) ) -// ROM_LOAD( "dgma26.bin", 0x00000, 0x100000, CRC(246a06c5) SHA1(447252be976a5059925f4ad98df8564b70198f62) ) -// ROM_LOAD( "dgma27.bin", 0x00000, 0x100000, CRC(3fcbd10f) SHA1(70fc7b88bbe35bbae1de14364b03d0a06d541de5) ) -// ROM_LOAD( "dgma28.bin", 0x00000, 0x100000, CRC(5a2ec71d) SHA1(447c404e6bb696f7eb7c61992a99b9be56f5d6b0) ) +/* ROM_LOAD( "dgma17.bin", 0x00000, 0x100000, CRC(7799ed23) SHA1(ae28ad4fa6033a3695fa83356701b3774b26e6b0) ) Todo - fix filenames */ +/* ROM_LOAD( "dgma18.bin", 0x00000, 0x100000, CRC(ded66da9) SHA1(5134cb47043cc190a35ebdbf1912166669f9c055) )*/ +/* ROM_LOAD( "dgma19.bin", 0x00000, 0x100000, CRC(bdd1ed20) SHA1(2435b23210b8fee4d39c30d4d3c6ea40afaa3b93) )*/ +/* ROM_LOAD( "dgma20.bin", 0x00000, 0x100000, CRC(fa0462f0) SHA1(1a52617ad4d7abebc0f273dd979f4cf2d6a0306b) )*/ +/* ROM_LOAD( "dgma21.bin", 0x00000, 0x100000, CRC(2d0a28ae) SHA1(d87f6f71bb76880e4d4f1eab8e0451b5c3df69a5) )*/ +/* ROM_LOAD( "dgma22.bin", 0x00000, 0x100000, CRC(c85f3559) SHA1(a5d5cf9b18c9ef6a92d7643ca1ec9052de0d4a01) )*/ +/* ROM_LOAD( "dgma23.bin", 0x00000, 0x100000, CRC(ba907d6a) SHA1(1fd99b66e6297c8d927c1cf723a613b4ee2e2f90) )*/ +/* ROM_LOAD( "dgma24.bin", 0x00000, 0x100000, CRC(5cec45c8) SHA1(f99a26afaca9d9320477e469b09e3873bc8c156f) )*/ +/* ROM_LOAD( "dgma25.bin", 0x00000, 0x100000, CRC(d65d895c) SHA1(4508dfff95a7aff5109dc74622cbb4503b0b5840) )*/ +/* ROM_LOAD( "dgma26.bin", 0x00000, 0x100000, CRC(246a06c5) SHA1(447252be976a5059925f4ad98df8564b70198f62) )*/ +/* ROM_LOAD( "dgma27.bin", 0x00000, 0x100000, CRC(3fcbd10f) SHA1(70fc7b88bbe35bbae1de14364b03d0a06d541de5) )*/ +/* ROM_LOAD( "dgma28.bin", 0x00000, 0x100000, CRC(5a2ec71d) SHA1(447c404e6bb696f7eb7c61992a99b9be56f5d6b0) )*/ ROM_REGION(0x100000, REGION_SOUND1, 0 ) ROM_LOAD( "mbm-06.n17", 0x00000, 0x100000, CRC(f34d5999) SHA1(265b5f4e8598bcf9183bf9bd95db69b01536acb2) ) @@ -2350,7 +2631,7 @@ ROM_LOAD( "mbm-07.n21", 0x00000, 0x80000, CRC(414f3793) SHA1(ed5f63e57390d503193fd1e9f7294ae1da6d3539) ) ROM_REGION(0x80000, REGION_SOUND3, 0 ) - ROM_LOAD( "mar-07.n19", 0x00000, 0x80000, CRC(40287d62) SHA1(c00cb08bcdae55bcddc14c38e88b0484b1bc9e3e) ) // same as dragngun, unused? + ROM_LOAD( "mar-07.n19", 0x00000, 0x80000, CRC(40287d62) SHA1(c00cb08bcdae55bcddc14c38e88b0484b1bc9e3e) ) /* same as dragngun, unused?*/ ROM_END ROM_START( tattass ) @@ -2501,21 +2782,88 @@ ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ ROM_LOAD( "sndprg.17l", 0x00000, 0x10000, CRC(18939e92) SHA1(50b37a78d9d2259d4b140dd17393c4e5ca92bca5) ) - ROM_REGION( 0x200000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x200000, REGION_GFX1, 0 ) ROM_LOAD( "mbh-00.8c", 0x000000, 0x200000, CRC(a877f8a3) SHA1(79253525f360a73161894f31e211e4d6b38d307a) ) /* Encrypted tiles */ - ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x200000, REGION_GFX2, 0 ) + ROM_LOAD( "mbh-01.9c", 0x000000, 0x200000, CRC(1853dafc) SHA1(b1183c0db301cbed9f079c782202dbfc553b198e) ) /* Encrypted tiles */ + + ROM_REGION( 0xa00000, REGION_GFX3, 0 ) /* Sprites */ + ROM_LOAD16_BYTE( "mbh-02.14c", 0x000001, 0x200000, CRC(b2f158a1) SHA1(4f8c0b324813db198fe1dad7fff4185b828b94de) ) + ROM_LOAD16_BYTE( "mbh-04.16c", 0x000000, 0x200000, CRC(eecfe06d) SHA1(2df817fe5e2ea31207b217bb03dc58979c05d0d2) ) + ROM_LOAD16_BYTE( "mbh-03.15c", 0x400001, 0x80000, CRC(787787e3) SHA1(531444e3f28aa9a7539a5a76ca94a9d6b97274c5) ) + ROM_LOAD16_BYTE( "mbh-05.17c", 0x400000, 0x80000, CRC(1d2b7c17) SHA1(ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602) ) + ROM_LOAD32_BYTE( "mbh-06.18c", 0x500000, 0x100000, CRC(038c2127) SHA1(5bdb215305f1a419fde27a83b623a38b9328e560) ) + ROM_LOAD32_BYTE( "mbh-07.19c", 0x900000, 0x40000, CRC(bbd22323) SHA1(6ab665b2e6d04cdadc48c52e15098e978b61fe10) ) + + ROM_REGION( 0x100000, REGION_GFX4, 0 ) /* Sprites */ + ROM_LOAD16_BYTE( "mbh-08.16e", 0x000001, 0x80000, CRC(cdd7f8cb) SHA1(910bbe8783c0ba722e9d6399b332d658fa059fdb) ) + ROM_LOAD16_BYTE( "mbh-09.18e", 0x000000, 0x80000, CRC(33fa2121) SHA1(eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3) ) + + ROM_REGION(0x80000, REGION_SOUND1, 0 ) + ROM_LOAD( "mbh-10.14l", 0x000000, 0x80000, CRC(c4d6b116) SHA1(c5685bce6a6c6a74ca600ebf766ba1007f0dc666) ) + + ROM_REGION(0x80000, REGION_SOUND2, 0 ) + ROM_LOAD( "mbh-11.16l", 0x000000, 0x80000, CRC(0ec40b6b) SHA1(9fef44149608ae2a00f6a75a6f77f2efcab6e78e) ) + +ROM_END + +ROM_START( nslasherj ) + ROM_REGION(0x100000, REGION_CPU1, 0 ) /* Encrypted ARM 32 bit code */ + ROM_LOAD32_WORD( "lx-00.1f", 0x000000, 0x80000, CRC(6ed5fb88) SHA1(84350da7939a479968a523c84e254e3ee54b8da2) ) + ROM_LOAD32_WORD( "lx-01.2f", 0x000002, 0x80000, CRC(a6df2152) SHA1(6fe7e0b2e71c5f807951dcc81a6a3cff55247961) ) + + ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ + ROM_LOAD( "sndprg.17l", 0x00000, 0x10000, CRC(18939e92) SHA1(50b37a78d9d2259d4b140dd17393c4e5ca92bca5) ) + + ROM_REGION( 0x200000, REGION_GFX1, 0 ) + ROM_LOAD( "mbh-00.8c", 0x000000, 0x200000, CRC(a877f8a3) SHA1(79253525f360a73161894f31e211e4d6b38d307a) ) /* Encrypted tiles */ + + ROM_REGION( 0x200000, REGION_GFX2, 0 ) + ROM_LOAD( "mbh-01.9c", 0x000000, 0x200000, CRC(1853dafc) SHA1(b1183c0db301cbed9f079c782202dbfc553b198e) ) /* Encrypted tiles */ + + ROM_REGION( 0xa00000, REGION_GFX3, 0 ) /* Sprites */ + ROM_LOAD16_BYTE( "mbh-02.14c", 0x000001, 0x200000, CRC(b2f158a1) SHA1(4f8c0b324813db198fe1dad7fff4185b828b94de) ) + ROM_LOAD16_BYTE( "mbh-04.16c", 0x000000, 0x200000, CRC(eecfe06d) SHA1(2df817fe5e2ea31207b217bb03dc58979c05d0d2) ) + ROM_LOAD16_BYTE( "mbh-03.15c", 0x400001, 0x80000, CRC(787787e3) SHA1(531444e3f28aa9a7539a5a76ca94a9d6b97274c5) ) + ROM_LOAD16_BYTE( "mbh-05.17c", 0x400000, 0x80000, CRC(1d2b7c17) SHA1(ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602) ) + ROM_LOAD32_BYTE( "mbh-06.18c", 0x500000, 0x100000, CRC(038c2127) SHA1(5bdb215305f1a419fde27a83b623a38b9328e560) ) + ROM_LOAD32_BYTE( "mbh-07.19c", 0x900000, 0x40000, CRC(bbd22323) SHA1(6ab665b2e6d04cdadc48c52e15098e978b61fe10) ) + + ROM_REGION( 0x100000, REGION_GFX4, 0 ) /* Sprites */ + ROM_LOAD16_BYTE( "mbh-08.16e", 0x000001, 0x80000, CRC(cdd7f8cb) SHA1(910bbe8783c0ba722e9d6399b332d658fa059fdb) ) + ROM_LOAD16_BYTE( "mbh-09.18e", 0x000000, 0x80000, CRC(33fa2121) SHA1(eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3) ) + + ROM_REGION(0x80000, REGION_SOUND1, 0 ) + ROM_LOAD( "mbh-10.14l", 0x000000, 0x80000, CRC(c4d6b116) SHA1(c5685bce6a6c6a74ca600ebf766ba1007f0dc666) ) + + ROM_REGION(0x80000, REGION_SOUND2, 0 ) + ROM_LOAD( "mbh-11.16l", 0x000000, 0x80000, CRC(0ec40b6b) SHA1(9fef44149608ae2a00f6a75a6f77f2efcab6e78e) ) +ROM_END + +ROM_START( nslashers ) + ROM_REGION(0x100000, REGION_CPU1, 0 ) /* Encrypted ARM 32 bit code */ + ROM_LOAD32_WORD( "ly-00.1f", 0x000000, 0x80000, CRC(fa0646f9) SHA1(7f9633bda230a0ced59171cdc5ab40a6d56c3d34) ) + ROM_LOAD32_WORD( "ly-01.2f", 0x000002, 0x80000, CRC(ae508149) SHA1(3592949e5fb2770adb9c9daa4e38c4e75f3e2554) ) + + ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ + ROM_LOAD( "sndprg.17l", 0x00000, 0x10000, CRC(18939e92) SHA1(50b37a78d9d2259d4b140dd17393c4e5ca92bca5) ) + + ROM_REGION( 0x200000, REGION_GFX1, 0 ) + ROM_LOAD( "mbh-00.8c", 0x000000, 0x200000, CRC(a877f8a3) SHA1(79253525f360a73161894f31e211e4d6b38d307a) ) /* Encrypted tiles */ + + ROM_REGION( 0x200000, REGION_GFX2, 0 ) ROM_LOAD( "mbh-01.9c", 0x000000, 0x200000, CRC(1853dafc) SHA1(b1183c0db301cbed9f079c782202dbfc553b198e) ) /* Encrypted tiles */ - ROM_REGION( 0xc00000, REGION_GFX3, ROMREGION_DISPOSE ) /* Sprites */ - ROM_LOAD16_BYTE( "mbh-02.14c", 0x000001, 0x200000, CRC(b2f158a1) SHA1(4f8c0b324813db198fe1dad7fff4185b828b94de) ) - ROM_LOAD16_BYTE( "mbh-04.16c", 0x000000, 0x200000, CRC(eecfe06d) SHA1(2df817fe5e2ea31207b217bb03dc58979c05d0d2) ) + ROM_REGION( 0xa00000, REGION_GFX3, 0 ) /* Sprites */ + ROM_LOAD16_BYTE( "mbh-02.14c", 0x000001, 0x200000, CRC(b2f158a1) SHA1(4f8c0b324813db198fe1dad7fff4185b828b94de) ) + ROM_LOAD16_BYTE( "mbh-04.16c", 0x000000, 0x200000, CRC(eecfe06d) SHA1(2df817fe5e2ea31207b217bb03dc58979c05d0d2) ) ROM_LOAD16_BYTE( "mbh-03.15c", 0x400001, 0x80000, CRC(787787e3) SHA1(531444e3f28aa9a7539a5a76ca94a9d6b97274c5) ) ROM_LOAD16_BYTE( "mbh-05.17c", 0x400000, 0x80000, CRC(1d2b7c17) SHA1(ae0b8e0448a1a8180fb424fb0bc8a4302f8ff602) ) - ROM_LOAD16_BYTE( "mbh-06.18c", 0xa00000, 0x100000, CRC(038c2127) SHA1(5bdb215305f1a419fde27a83b623a38b9328e560) ) - ROM_LOAD16_BYTE( "mbh-07.19c", 0xb00000, 0x40000, CRC(bbd22323) SHA1(6ab665b2e6d04cdadc48c52e15098e978b61fe10) ) + ROM_LOAD32_BYTE( "mbh-06.18c", 0x500000, 0x100000, CRC(038c2127) SHA1(5bdb215305f1a419fde27a83b623a38b9328e560) ) + ROM_LOAD32_BYTE( "mbh-07.19c", 0x900000, 0x40000, CRC(bbd22323) SHA1(6ab665b2e6d04cdadc48c52e15098e978b61fe10) ) - ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) /* Sprites */ + ROM_REGION( 0x100000, REGION_GFX4, 0 ) /* Sprites */ ROM_LOAD16_BYTE( "mbh-08.16e", 0x000001, 0x80000, CRC(cdd7f8cb) SHA1(910bbe8783c0ba722e9d6399b332d658fa059fdb) ) ROM_LOAD16_BYTE( "mbh-09.18e", 0x000000, 0x80000, CRC(33fa2121) SHA1(eb0e99d29b1ad9995df28e5b7cfc89d53efb53c3) ) @@ -2533,7 +2881,7 @@ data32_t ret=deco32_ram[0x748c/4]; if (activecpu_get_pc()==0x39e8 && (ret&0xff)!=0) { -// logerror("CPU Spin - %d cycles left this frame ran %d (%d)\n",cycles_left_to_run(),cycles_currently_ran(),cycles_left_to_run()+cycles_currently_ran()); +/* log_cb(RETRO_LOG_ERROR, LOGPRE "CPU Spin - %d cycles left this frame ran %d (%d)\n",cycles_left_to_run(),cycles_currently_ran(),cycles_left_to_run()+cycles_currently_ran());*/ cpu_spinuntil_int(); } @@ -2545,7 +2893,7 @@ data32_t ret=deco32_ram[0x1f15c/4]; if (activecpu_get_pc()==0x628c && (ret&0xff)!=0) { - //logerror("%08x (%08x): CPU Spin - %d cycles left this frame ran %d (%d)\n",activecpu_get_pc(),ret,cycles_left_to_run(),cycles_currently_ran(),cycles_left_to_run()+cycles_currently_ran()); + /*logerror("%08x (%08x): CPU Spin - %d cycles left this frame ran %d (%d)\n",activecpu_get_pc(),ret,cycles_left_to_run(),cycles_currently_ran(),cycles_left_to_run()+cycles_currently_ran());*/ cpu_spinuntil_int(); } @@ -2558,13 +2906,27 @@ data32_t ret=deco32_ram[0]; if (activecpu_get_pc()==0x1c5ec && left>32) { - //logerror("%08x (%08x): CPU Spin - %d cycles left this frame ran %d (%d)\n",activecpu_get_pc(),ret,cycles_left_to_run(),cycles_currently_ran(),cycles_left_to_run()+cycles_currently_ran()); + /*logerror("%08x (%08x): CPU Spin - %d cycles left this frame ran %d (%d)\n",activecpu_get_pc(),ret,cycles_left_to_run(),cycles_currently_ran(),cycles_left_to_run()+cycles_currently_ran());*/ cpu_spinuntil_int(); } return ret; } +static READ32_HANDLER( nslasher_skip ) +{ + int pc = activecpu_get_pc(); + int left=cycles_left_to_run(); + UINT32 ret=deco32_ram[0]; + + if ((pc==0x9c8 || pc== 0xa84)&& left>32 && (ret&0x80)) { + cpu_spinuntil_int(); + } + + return ret; +} + + /**********************************************************************************/ static DRIVER_INIT( captaven ) @@ -2589,7 +2951,7 @@ memcpy(DST_RAM+0x80000,SRC_RAM,0x10000); memcpy(DST_RAM+0x110000,SRC_RAM+0x10000,0x10000); - ROM[0x1b32c/4]=0xe1a00000;// NOP test switch lock + ROM[0x1b32c/4]=0xe1a00000;/* NOP test switch lock*/ raster_offset=0; install_mem_read32_handler(0, 0x11f15c, 0x11f15f, dragngun_skip); @@ -2604,7 +2966,7 @@ static DRIVER_INIT( lockload ) { data8_t *RAM = memory_region(REGION_CPU1); -// data32_t *ROM = (UINT32 *)memory_region(REGION_CPU1); +/* data32_t *ROM = (UINT32 *)memory_region(REGION_CPU1);*/ deco74_decrypt(REGION_GFX1); deco74_decrypt(REGION_GFX2); @@ -2614,9 +2976,9 @@ memcpy(RAM+0x300000,RAM+0x100000,0x100000); memset(RAM+0x100000,0,0x100000); -// ROM[0x3fe3c0/4]=0xe1a00000;// NOP test switch lock -// ROM[0x3fe3cc/4]=0xe1a00000;// NOP test switch lock -// ROM[0x3fe40c/4]=0xe1a00000;// NOP test switch lock +/* ROM[0x3fe3c0/4]=0xe1a00000;*/ /* NOP test switch lock*/ +/* ROM[0x3fe3cc/4]=0xe1a00000;*/ /* NOP test switch lock*/ +/* ROM[0x3fe40c/4]=0xe1a00000;*/ /* NOP test switch lock*/ } static DRIVER_INIT( tattass ) @@ -2658,10 +3020,15 @@ memcpy(RAM+0x100000,tmp,0x80000); free(tmp); + deco156_decrypt(); deco56_decrypt(REGION_GFX1); /* 141 */ deco74_decrypt(REGION_GFX2); + soundlatch_setclearedvalue( 0xff ); + + install_mem_read32_handler(0, 0x100000, 0x100003, nslasher_skip); + /* The board for Night Slashers is very close to the Fighter's History and Tattoo Assassins boards, but has an encrypted ARM cpu. */ } @@ -2681,4 +3048,6 @@ GAMEX(1994, lockload, 0, lockload, lockload, lockload, ROT0, "Data East Corporation", "Locked 'n Loaded (US)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) GAMEX(1994, tattass, 0, tattass, tattass, tattass, ROT0, "Data East Pinball", "Tattoo Assassins (US Prototype)", GAME_IMPERFECT_GRAPHICS ) GAMEX(1994, tattassa, tattass, tattass, tattass, tattass, ROT0, "Data East Pinball", "Tattoo Assassins (Asia Prototype)", GAME_IMPERFECT_GRAPHICS ) -GAMEX(1994, nslasher, 0, tattass, tattass, nslasher, ROT0, "Data East Corporation", "Night Slashers", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION) +GAME( 1994, nslasher, 0, nslasher, nslasher, nslasher, ROT0, "Data East Corporation", "Night Slashers (Korea Rev 1.3)" ) +GAME( 1994, nslasherj,nslasher, nslasher, nslasher, nslasher, ROT0, "Data East Corporation", "Night Slashers (Japan Rev 1.2)" ) +GAMEC( 1994, nslashers,nslasher, nslasher, nslasher, nslasher, ROT0, "Data East Corporation", "Night Slashers (Over Sea Rev 1.2)", &generic_ctrl, &nslashers_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/diverboy.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/diverboy.c
Changed
@@ -1,17 +1,14 @@ /* Diver Boy (c)1992 Device Electronics - TODO: - - Sound doesn't seem entirely correct, but it might just be this bad in the original ---- Here's the info about this dump: Name: DiverBoy - Manufacturer: Unknow - Year: Unknow + Manufacturer: Unknown + Year: Unknown Date Dumped: 17-07-2002 (DD-MM-YYYY) CPU: 68000, Z80 @@ -70,9 +67,9 @@ static WRITE_HANDLER( okibank_w ) { /* bit 2 might be reset */ -// usrintf_showmessage("%02x",data); +/* usrintf_showmessage("%02x",data);*/ - OKIM6295_set_bank_base(0,(data & 3) * 0x20000); + OKIM6295_set_bank_base(0,(data & 3) * 0x40000); } @@ -84,7 +81,6 @@ { 0x180000, 0x180001, input_port_0_word_r }, { 0x180002, 0x180003, input_port_1_word_r }, { 0x180008, 0x180009, input_port_2_word_r }, -// { 0x18000a, 0x18000b, MRA16_NOP }, MEMORY_END static MEMORY_WRITE16_START( diverboy_writemem ) @@ -93,18 +89,15 @@ { 0x080000, 0x083fff, MWA16_RAM, &diverboy_spriteram, &diverboy_spriteram_size }, { 0x100000, 0x100001, soundcmd_w }, { 0x140000, 0x1407ff, paletteram16_xxxxBBBBGGGGRRRR_word_w, &paletteram16 }, -// { 0x18000c, 0x18000d, MWA16_NOP }, { 0x320000, 0x3207ff, MWA16_RAM }, /* ?? */ { 0x322000, 0x3227ff, MWA16_RAM }, /* ?? */ -// { 0x340000, 0x340001, MWA16_NOP }, -// { 0x340002, 0x340003, MWA16_NOP }, MEMORY_END static MEMORY_READ_START( snd_readmem ) { 0x0000, 0x7fff, MRA_ROM }, { 0x8000, 0x87ff, MRA_RAM }, - { 0xa000, 0xa000, soundlatch_r }, { 0x9800, 0x9800, OKIM6295_status_0_r }, + { 0xa000, 0xa000, soundlatch_r }, MEMORY_END static MEMORY_WRITE_START( snd_writemem ) @@ -117,25 +110,25 @@ INPUT_PORTS_START( diverboy ) - PORT_START // 0x180000.w - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 ) // unused ? - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 ) // unused ? + PORT_START /* 0x180000.w*/ + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER1 ) /* unused ?*/ + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER1 ) /* unused ?*/ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER1 ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER1 ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) // "Dive" - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) // unknown effect + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) /* "Dive"*/ + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) /* unknown effect*/ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 ) // unused ? - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 ) // unused ? + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_PLAYER2 ) /* unused ?*/ + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_PLAYER2 ) /* unused ?*/ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_PLAYER2 ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_PLAYER2 ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) // "Dive" - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) // unknown effect + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) /* "Dive"*/ + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) /* unknown effect*/ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) - PORT_START // 0x180002.w + PORT_START /* 0x180002.w*/ PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 3C_1C ) ) @@ -151,7 +144,7 @@ PORT_DIPNAME( 0x10, 0x10, "Display Copyright" ) PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x60, 0x00, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x20, DEF_STR( Difficulty ) ) PORT_DIPSETTING( 0x00, "Easy" ) PORT_DIPSETTING( 0x20, "Normal" ) PORT_DIPSETTING( 0x40, "Hard" ) @@ -160,11 +153,11 @@ PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_START // 0x180008.w + PORT_START /* 0x180008.w*/ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) // read notes - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be 00 - check code at 0x001680 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) /* read notes*/ + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* must be 00 - check code at 0x001680*/ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -200,7 +193,7 @@ 1, /* 1 chip */ { 10000 }, /* ???? frequency (Hz) */ { REGION_SOUND1 }, /* memory region */ - { 100 } + { 50 } }; @@ -221,7 +214,7 @@ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(64*8, 32*8) - MDRV_VISIBLE_AREA(2*8, 40*8-1, 2*8, 32*8-1) + MDRV_VISIBLE_AREA(0*8+4, 40*8+1, 2*8, 32*8-1) MDRV_PALETTE_LENGTH(0x400) MDRV_VIDEO_START(diverboy) @@ -251,13 +244,17 @@ ROM_LOAD16_BYTE( "db_06.bin", 0x040000, 0x20000, CRC(21b4e352) SHA1(a553de67e5dc751ea81ec4739724e0e46e8c5fab) ) ROM_LOAD16_BYTE( "db_11.bin", 0x040001, 0x20000, CRC(41d29c81) SHA1(448fd5c1b16159d03436b8bd71ffe871c8daf7fa) ) - ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* Sound */ - ROM_LOAD( "db_03.bin", 0x00000, 0x80000, CRC(50457505) SHA1(faf1c055ec56d2ed7f5e6993cc04d3317bf1c3cc) ) - - ROM_REGION( 0x20000, REGION_SOUND2, 0 ) /* Sound */ - ROM_LOAD( "db_04.bin", 0x00000, 0x20000, CRC(01b81da0) SHA1(914802f3206dc59a720af9d57eb2285bc8ba822b) ) /* same as tumble pop?, is this used? */ + ROM_REGION( 0x100000, REGION_SOUND1, 0 ) /* Sound */ + ROM_LOAD( "db_03.bin", 0x00000, 0x20000, CRC(50457505) SHA1(faf1c055ec56d2ed7f5e6993cc04d3317bf1c3cc) ) + ROM_CONTINUE( 0x40000, 0x20000 ) + ROM_CONTINUE( 0x80000, 0x20000 ) + ROM_CONTINUE( 0xc0000, 0x20000 ) + ROM_LOAD( "db_04.bin", 0x20000, 0x20000, CRC(01b81da0) SHA1(914802f3206dc59a720af9d57eb2285bc8ba822b) ) /* same as tumble pop?, is this used? */ + ROM_RELOAD( 0x60000, 0x20000 ) + ROM_RELOAD( 0xa0000, 0x20000 ) + ROM_RELOAD( 0xe0000, 0x20000 ) ROM_END -GAMEX(1992, diverboy, 0, diverboy, diverboy, 0, ORIENTATION_FLIP_X, "Electronic Devices Italy", "Diver Boy", GAME_IMPERFECT_SOUND ) +GAME(1992, diverboy, 0, diverboy, diverboy, 0, ORIENTATION_FLIP_X, "Electronic Devices Italy", "Diver Boy" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/findout.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/findout.c
Changed
@@ -10,6 +10,8 @@ #include "vidhrdw/generic.h" #include "machine/8255ppi.h" +static UINT8 drawctrl[3]; +static UINT8 color[8]; VIDEO_UPDATE( findout ) @@ -17,45 +19,51 @@ copybitmap(bitmap,tmpbitmap,0,0,0,0,cliprect,TRANSPARENCY_NONE,0); } - -static data8_t drawctrl[3]; - static WRITE_HANDLER( findout_drawctrl_w ) { drawctrl[offset] = data; + if (offset == 2) + { + int i; + for (i = 0; i < 8; i++) + if (BIT(drawctrl[1],i)) color[i] = drawctrl[0] & 7; + } } static WRITE_HANDLER( findout_bitmap_w ) { int sx,sy; - int fg,bg,mask,bits; + int mask; - fg = drawctrl[0] & 7; - bg = 2; - mask = 0xff;//drawctrl[2]; - bits = drawctrl[1]; + mask = 0xff; sx = 8*(offset % 64); sy = offset / 64; -//if (mask != bits) -// usrintf_showmessage("color %02x bits %02x mask %02x\n",fg,bits,mask); - - if (mask & 0x80) plot_pixel(tmpbitmap,sx+0,sy,(bits & 0x80) ? fg : bg); - if (mask & 0x40) plot_pixel(tmpbitmap,sx+1,sy,(bits & 0x40) ? fg : bg); - if (mask & 0x20) plot_pixel(tmpbitmap,sx+2,sy,(bits & 0x20) ? fg : bg); - if (mask & 0x10) plot_pixel(tmpbitmap,sx+3,sy,(bits & 0x10) ? fg : bg); - if (mask & 0x08) plot_pixel(tmpbitmap,sx+4,sy,(bits & 0x08) ? fg : bg); - if (mask & 0x04) plot_pixel(tmpbitmap,sx+5,sy,(bits & 0x04) ? fg : bg); - if (mask & 0x02) plot_pixel(tmpbitmap,sx+6,sy,(bits & 0x02) ? fg : bg); - if (mask & 0x01) plot_pixel(tmpbitmap,sx+7,sy,(bits & 0x01) ? fg : bg); + if (mask & 0x80) plot_pixel(tmpbitmap,sx+0,sy, color[8-0-1]); + if (mask & 0x40) plot_pixel(tmpbitmap,sx+1,sy, color[8-1-1]); + if (mask & 0x20) plot_pixel(tmpbitmap,sx+2,sy, color[8-2-1]); + if (mask & 0x10) plot_pixel(tmpbitmap,sx+3,sy, color[8-3-1]); + if (mask & 0x08) plot_pixel(tmpbitmap,sx+4,sy, color[8-4-1]); + if (mask & 0x04) plot_pixel(tmpbitmap,sx+5,sy, color[8-5-1]); + if (mask & 0x02) plot_pixel(tmpbitmap,sx+6,sy, color[8-6-1]); + if (mask & 0x01) plot_pixel(tmpbitmap,sx+7,sy, color[8-7-1]); } +PALETTE_INIT( findout ) +{ + int i; + + for (i = 0; i < 8; i++ ) + { + palette_set_color(i, pal1bit(i >> 2), pal1bit(i), pal1bit(i >> 1)); + } +} static READ_HANDLER( portC_r ) { return 4; -// return (rand()&2); +/* return (rand()&2);*/ } static WRITE_HANDLER( lamps_w ) @@ -77,8 +85,8 @@ /* bit 7 goes directly to the sound amplifier */ DAC_data_w(0,((data & 0x80) >> 7) * 255); -// logerror("%04x: sound_w %02x\n",activecpu_get_pc(),data); -// usrintf_showmessage("%02x",data); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: sound_w %02x\n",activecpu_get_pc(),data);*/ +/* usrintf_showmessage("%02x",data);*/ } static ppi8255_interface ppi8255_intf = @@ -103,7 +111,7 @@ int pc = activecpu_get_pc(); if (pc != 0x3c74 && pc != 0x0364 && pc != 0x036d) /* weed out spurious blit reads */ - logerror("%04x: unmapped memory read from %04x\n",pc,offset); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: unmapped memory read from %04x\n",pc,offset); return 0xff; } @@ -264,7 +272,8 @@ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER|VIDEO_PIXEL_ASPECT_RATIO_1_2) MDRV_SCREEN_SIZE(512, 256) MDRV_VISIBLE_AREA(48, 511-48, 16, 255-16) - MDRV_PALETTE_LENGTH(256) + MDRV_PALETTE_LENGTH(8) + MDRV_PALETTE_INIT(findout) MDRV_VIDEO_START(generic_bitmapped) MDRV_VIDEO_UPDATE(findout) @@ -297,4 +306,4 @@ -GAMEX( 1987, findout, 0, findout, findout, 0, ROT0, "Elettronolo", "Find Out", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAMEX( 1987, findout, 0, findout, findout, 0, ROT0, "Elettronolo", "Find Out", GAME_IMPERFECT_SOUND )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/foodf.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/foodf.c
Changed
@@ -78,6 +78,7 @@ #include "vidhrdw/generic.h" #include "foodf.h" #include "bootstrap.h" +#include "inptport.h" /*************************************
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/funybubl.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/funybubl.c
Changed
@@ -11,9 +11,6 @@ banking might not be 100% -sprite glitches in 2 player mode (end of list marker? or are we using the wrong copy of the sprites) -dips not done -sound banking (we have 2 oki roms ..) */ @@ -71,18 +68,18 @@ static MEMORY_READ_START( readmem ) { 0x0000, 0x7fff, MRA_ROM }, - { 0x8000, 0xbfff, MRA_BANK2 }, // banked port 1? + { 0x8000, 0xbfff, MRA_BANK2 }, /* banked port 1?*/ { 0xc400, 0xc7ff, MRA_RAM }, { 0xc800, 0xcfff, MRA_RAM }, - { 0xd000, 0xdfff, MRA_BANK1 }, // banked port 0? + { 0xd000, 0xdfff, MRA_BANK1 }, /* banked port 0?*/ { 0xe000, 0xffff, MRA_RAM }, MEMORY_END static MEMORY_WRITE_START( writemem ) { 0x0000, 0x7fff, MWA_ROM }, { 0x8000, 0xbfff, MWA_ROM }, - { 0xc400, 0xcfff, funybubl_paldatawrite, &funybubl_paletteram }, // palette? - { 0xd000, 0xdfff, MWA_BANK1 }, // banked port 0? + { 0xc400, 0xcfff, funybubl_paldatawrite, &funybubl_paletteram }, /* palette?*/ + { 0xd000, 0xdfff, MWA_BANK1 }, /* banked port 0?*/ { 0xe000, 0xffff, MWA_RAM }, MEMORY_END @@ -101,11 +98,14 @@ cpu_set_irq_line(1,0, PULSE_LINE); } - +WRITE_HANDLER( funybubl_oki_bank_sw ) +{ + OKIM6295_set_bank_base(0, ((data & 1) * 0x40000)); +} static PORT_WRITE_START( writeport ) - { 0x00, 0x00, vidram_bank_w }, // vidram bank - { 0x01, 0x01, bank2_w }, // rom bank? + { 0x00, 0x00, vidram_bank_w }, /* vidram bank*/ + { 0x01, 0x01, bank2_w }, /* rom bank?*/ { 0x03, 0x03, funybubl_soundcommand_w }, @@ -117,21 +117,22 @@ static MEMORY_READ_START( soundreadmem ) { 0x0000, 0x7fff, MRA_ROM }, - { 0x8000, 0x87ff, MRA_RAM }, // ram? + { 0x8000, 0x87ff, MRA_RAM }, /* ram?*/ { 0x9800, 0x9800, OKIM6295_status_0_r }, { 0xa000, 0xa000, soundlatch_r }, MEMORY_END static MEMORY_WRITE_START( soundwritemem ) { 0x0000, 0x7fff, MWA_ROM }, - { 0x8000, 0x87ff, MWA_RAM }, // ram? + { 0x8000, 0x87ff, MWA_RAM }, /* ram?*/ + { 0x9000, 0x9000, funybubl_oki_bank_sw }, { 0x9800, 0x9800, OKIM6295_data_0_w }, MEMORY_END INPUT_PORTS_START( funybubl ) - PORT_START /* DSW 1 */ + PORT_START /* System inputs */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) @@ -141,7 +142,7 @@ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */ - PORT_START /* DSW 1 */ + PORT_START /* Player 1 controls */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER1 ) @@ -151,7 +152,7 @@ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */ - PORT_START /* DSW 1 */ + PORT_START /* Player 2 controls */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER2 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_PLAYER2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER2 ) @@ -162,56 +163,31 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */ PORT_START /* DSW 1 */ - PORT_DIPNAME( 0x01, 0x01, "3" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x38, 0x38, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x30, "Very Easy" ) + PORT_DIPSETTING( 0x28, "Easy" ) + PORT_DIPSETTING( 0x38, "Normal" ) + PORT_DIPSETTING( 0x20, "Hard 1" ) + PORT_DIPSETTING( 0x18, "Hard 2" ) + PORT_DIPSETTING( 0x10, "Hard 3" ) + PORT_DIPSETTING( 0x08, "Hard 4" ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "Nudity" ) + PORT_DIPSETTING( 0x80, "Semi" ) + PORT_DIPSETTING( 0x00, "Full" ) - PORT_START /* DSW 1 */ - PORT_DIPNAME( 0x01, 0x01, "6" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + /* Looks like the PCB shows an empty DSW 2 location */ INPUT_PORTS_END @@ -275,38 +251,27 @@ return 0; } -/* note, we're not using half the sprite data .. maybe one copy is a buffer, we could be using the wrong one .. */ + static void funybubl_drawsprites( struct mame_bitmap *bitmap, const struct rectangle *cliprect ) { + UINT8 *source = &banked_videoram[0x2000-0x20]; + UINT8 *finish = source - 0x1000; + while( source>finish ) + { + int xpos, ypos, tile; - data8_t *source = &banked_videoram[0x2000-0x20]; - data8_t *finish = source - 0x1000; - - - while( source>finish ) - { - int xpos, ypos, tile; - - ypos = 0xff-source[1+0x10]; - xpos = source[2+0x10]; - + ypos = source[2]; + xpos = source[3]; + tile = source[0] | ( (source[1] & 0x0f) <<8); + if (source[1] & 0x80) tile += 0x1000; + if (source[1] & 0x20) { if (xpos < 0xe0) xpos += 0x100; } + /* bits 0x40 and 0x10 not used?... */ + drawgfx(bitmap,Machine->gfx[1],tile,0,0,0,xpos,ypos,cliprect,TRANSPARENCY_PEN,255); - tile = source[0+0x10] | ( (source[3+0x10] & 0x0f) <<8); - - if (source[3+0x10] & 0x80) tile += 0x1000; - if (source[3+0x10] & 0x20) xpos += 0x100; - - // bits 0x40 (not used?) and 0x10 (just set during transition period of x co-ord 0xff and 0x00) ... - - xpos -= 8; - ypos -= 14; - - drawgfx(bitmap,Machine->gfx[1],tile,0,0,0,xpos,ypos,cliprect,TRANSPARENCY_PEN,255); - - source -= 0x20; - } + source -= 0x20; + } } @@ -363,8 +328,8 @@ MDRV_CPU_ADD(Z80,8000000) /* ? MHz */ MDRV_CPU_MEMORY(soundreadmem,soundwritemem) -// MDRV_CPU_PORTS(readport,writeport) -// MDRV_CPU_VBLANK_INT(irq0_line_hold,1) +/* MDRV_CPU_PORTS(readport,writeport)*/ +/* MDRV_CPU_VBLANK_INT(irq0_line_hold,1)*/ MDRV_FRAMES_PER_SECOND(60) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) @@ -373,7 +338,7 @@ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER ) MDRV_SCREEN_SIZE(512, 256) MDRV_VISIBLE_AREA(12*8, 512-12*8-1, 16, 256-16-1) -// MDRV_VISIBLE_AREA(0*8, 512-1, 0, 256-1) +/* MDRV_VISIBLE_AREA(0*8, 512-1, 0, 256-1)*/ MDRV_GFXDECODE(gfxdecodeinfo) MDRV_PALETTE_LENGTH(0x400) @@ -393,7 +358,7 @@ ROM_RELOAD ( 0x10000, 0x40000 ) - ROM_REGION( 0x200000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) // bg gfx 8x8x8 + ROM_REGION( 0x200000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT ) /* bg gfx 8x8x8*/ ROM_LOAD( "7.bin", 0x000000, 0x40000, CRC(87603d7b) SHA1(21aec4cd011691f8608c3ddab83697bd89634fc8) ) ROM_LOAD( "8.bin", 0x040000, 0x40000, CRC(ab6031bd) SHA1(557793817f98c07c82caab4293aed7dffa4dbf7b) ) ROM_LOAD( "9.bin", 0x080000, 0x40000, CRC(0e8352ff) SHA1(29679a7ece2585e1a66296439b68bd56c937e313) ) @@ -410,15 +375,15 @@ ROM_LOAD( "12.bin",0x180000, 0x80000, CRC(63f0e810) SHA1(5c7ed32ee8dc1d9aabc8d136ec370471096356c2) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* sound z80 (not much code here ..) */ - ROM_LOAD( "1.bin", 0x00000, 0x10000, CRC(b8b5b675) SHA1(0a02ccd09bb2ae20efe49e3ca2006331aea0e2a7) ) - - ROM_REGION( 0x20000, REGION_SOUND1, 0 ) - ROM_LOAD( "3.bin", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) - - ROM_REGION( 0x40000, REGION_SOUND2, 0 ) - ROM_LOAD( "4.bin", 0x00000, 0x40000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) - + ROM_LOAD( "1.bin", 0x00000, 0x10000, CRC(b8b5b675) SHA1(0a02ccd09bb2ae20efe49e3ca2006331aea0e2a7) ) + ROM_FILL( 0x08000, 0x08000, 0x00 ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) + ROM_LOAD( "3.bin", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) + ROM_RELOAD( 0x40000, 0x20000 ) + ROM_LOAD( "4.bin", 0x20000, 0x20000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) + ROM_CONTINUE( 0x60000, 0x20000 ) ROM_END -GAMEX( 1999, funybubl, 0, funybubl, funybubl, funybubl, ROT0, "Comad", "Funny Bubble", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1999, funybubl, 0, funybubl, funybubl, funybubl, ROT0, "Comad", "Funny Bubble" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/harddriv.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/harddriv.c
Changed
@@ -480,27 +480,27 @@ { ADSP_DATA_ADDR_RANGE(0x3800, 0x3bff), MRA16_RAM }, /* internal RAM */ { ADSP_DATA_ADDR_RANGE(0x3fe0, 0x3fff), hdds3_control_r }, /* adsp control regs */ { ADSP_PGM_ADDR_RANGE (0x0000, 0x3fff), MRA16_RAM }, -// -// /SIRQ2 = IRQ2 -// /SRES -> RESET -// -// 2xx0 W = SWR0 (POUT) -// 2xx1 W = SWR1 (SINT) -// 2xx2 W = SWR2 (TFLAG) -// 2xx3 W = SWR3 (INTSRC) -// 2xx4 W = DACL -// 2xx5 W = DACR -// 2xx6 W = SRMADL -// 2xx7 W = SRMADH -// -// 2xx0 R = SRD0 (PIN) -// 2xx1 R = SRD1 (RSAT) -// 2xx4 R = SROM -// 2xx7 R = SFWCLR -// -// -// /XRES -> RESET -// communicate over serial I/O +/**/ +/* /SIRQ2 = IRQ2*/ +/* /SRES -> RESET*/ +/**/ +/* 2xx0 W = SWR0 (POUT)*/ +/* 2xx1 W = SWR1 (SINT)*/ +/* 2xx2 W = SWR2 (TFLAG)*/ +/* 2xx3 W = SWR3 (INTSRC)*/ +/* 2xx4 W = DACL*/ +/* 2xx5 W = DACR*/ +/* 2xx6 W = SRMADL*/ +/* 2xx7 W = SRMADH*/ +/**/ +/* 2xx0 R = SRD0 (PIN)*/ +/* 2xx1 R = SRD1 (RSAT)*/ +/* 2xx4 R = SROM*/ +/* 2xx7 R = SFWCLR*/ +/**/ +/**/ +/* /XRES -> RESET*/ +/* communicate over serial I/O*/ MEMORY_END @@ -646,10 +646,10 @@ PORT_BIT( 0xfff8, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START /* b00000 - 8 bit ADC 0 - gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER1, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 1 - clutch pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER3, 25, 100, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER3, 100, 25, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 2 - seat */ PORT_BIT( 0xff, 0x80, IPT_SPECIAL ) @@ -673,7 +673,7 @@ PORT_ANALOG( 0xff, 0x80, IPT_PADDLE, 25, 5, 0x10, 0xf0 ) PORT_START /* b80000 - 12 bit ADC 1 - force brake */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2 | IPF_REVERSE, 25, 40, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2 | IPF_REVERSE, 100, 40, 0x00, 0xff ) PORT_START /* b80000 - 12 bit ADC 2 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -702,10 +702,10 @@ PORT_BIT( 0xfff8, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START /* b00000 - 8 bit ADC 0 - gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER1, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 1 - clutch pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER3, 25, 100, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER3, 100, 25, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 2 - seat */ PORT_BIT( 0xff, 0x80, IPT_SPECIAL ) @@ -729,7 +729,7 @@ PORT_ANALOG( 0xff, 0x80, IPT_PADDLE, 25, 5, 0x10, 0xf0 ) PORT_START /* b80000 - 12 bit ADC 1 - force brake */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2 | IPF_REVERSE, 25, 40, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2 | IPF_REVERSE, 100, 40, 0x00, 0xff ) PORT_START /* b80000 - 12 bit ADC 2 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -765,10 +765,10 @@ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START /* b00000 - 8 bit ADC 0 - gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER1, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 1 - clutch pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER3, 25, 100, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER3, 100, 25, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 2 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -783,7 +783,7 @@ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START /* b00000 - 8 bit ADC 6 - force brake */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2 | IPF_REVERSE, 25, 40, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2 | IPF_REVERSE, 100, 40, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 7 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -945,7 +945,7 @@ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START /* b00000 - 8 bit ADC 0 - gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER1, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 1 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -963,7 +963,7 @@ PORT_BIT( 0xff, 0X80, IPT_UNUSED ) PORT_START /* b00000 - 8 bit ADC 6 - brake */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2 | IPF_REVERSE, 25, 40, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2 | IPF_REVERSE, 100, 40, 0x00, 0xff ) PORT_START /* b00000 - 8 bit ADC 7 - seat adjust */ PORT_BIT( 0xff, 0X80, IPT_UNUSED ) @@ -1145,13 +1145,13 @@ MDRV_CPU_ADD_TAG("adsp", ADSP2101, 12000000) MDRV_CPU_MEMORY(ds3_readmem,ds3_writemem) -// MDRV_CPU_ADD_TAG("sound", ADSP2105, 10000000) -// MDRV_CPU_FLAGS(CPU_AUDIO_CPU) -// MDRV_CPU_MEMORY(ds3snd_readmem,ds3snd_writemem) - -// MDRV_CPU_ADD_TAG("sounddsp", ADSP2105, 10000000) -// MDRV_CPU_FLAGS(CPU_AUDIO_CPU) -// MDRV_CPU_MEMORY(ds3snd_readmem,ds3snd_writemem) +/* MDRV_CPU_ADD_TAG("sound", ADSP2105, 10000000)*/ +/* MDRV_CPU_FLAGS(CPU_AUDIO_CPU)*/ +/* MDRV_CPU_MEMORY(ds3snd_readmem,ds3snd_writemem)*/ + +/* MDRV_CPU_ADD_TAG("sounddsp", ADSP2105, 10000000)*/ +/* MDRV_CPU_FLAGS(CPU_AUDIO_CPU)*/ +/* MDRV_CPU_MEMORY(ds3snd_readmem,ds3snd_writemem)*/ MDRV_SOUND_ADD(DAC, dac2_interface) MACHINE_DRIVER_END
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/kinst.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/kinst.c
Changed
@@ -171,6 +171,10 @@ kinst_buffer_vram(&rambase1[0x30000/4]); break; + case 1: /* $88 - sound reset */ + dcs_reset_w(data & 0x01); + break; + case 2: /* $90 - sound control */ if (!(olddata & 0x02) && (kinst_control[offset] & 0x02)) dcs_data_w(kinst_control[3]);
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/m92.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/m92.c
Changed
@@ -256,6 +256,11 @@ sound_status = (data<<8) | (sound_status&0xff); } +static WRITE_HANDLER( m92_sound_reset_w ) /* Added sound reset line for IREM M92 */ +{ + cpu_set_reset_line( 1, (data) ? CLEAR_LINE : ASSERT_LINE); +} + /*****************************************************************************/ static MEMORY_READ_START( readmem ) @@ -321,7 +326,19 @@ { 0x88, 0x8f, m92_pf2_control_w }, { 0x90, 0x97, m92_pf3_control_w }, { 0x98, 0x9f, m92_master_control_w }, -// { 0xc0, 0xc1, m92_unknown_w }, // sound related? +/* { 0xc0, 0xc1, m92_sound_reset_w }, */ /* causes breakage with certain games */ +PORT_END + +static PORT_WRITE_START( psoldier_writeport ) + { 0x00, 0x01, m92_soundlatch_w }, + { 0x02, 0x03, m92_coincounter_w }, + { 0x20, 0x21, m92_bankswitch_w }, + { 0x40, 0x43, MWA_NOP }, /* Interrupt controller, only written to at bootup */ + { 0x80, 0x87, m92_pf1_control_w }, + { 0x88, 0x8f, m92_pf2_control_w }, + { 0x90, 0x97, m92_pf3_control_w }, + { 0x98, 0x9f, m92_master_control_w }, + { 0xc0, 0xc1, m92_sound_reset_w }, PORT_END /******************************************************************************/ @@ -1270,7 +1287,7 @@ /* basic machine hardware */ MDRV_CPU_ADD(V33, 18000000/2) /* NEC V33, 18 MHz clock */ MDRV_CPU_MEMORY(readmem,writemem) - MDRV_CPU_PORTS(readport,writeport) + MDRV_CPU_PORTS(readport,psoldier_writeport) MDRV_CPU_VBLANK_INT(m92_interrupt,1) MDRV_CPU_ADD(V30, 14318180/2) @@ -2430,8 +2447,8 @@ GAME( 1993, kaiteids, inthunt, raster, inthunt, inthunt, ROT0, "Irem", "Kaitei Daisensou (Japan)" ) GAMEX(1993, nbbatman, 0, raster, nbbatman, nbbatman, ROT0, "Irem America", "Ninja Baseball Batman (US)", GAME_IMPERFECT_GRAPHICS ) GAMEX(1993, leaguemn, nbbatman, raster, nbbatman, nbbatman, ROT0, "Irem", "Yakyuu Kakutou League-Man (Japan)", GAME_IMPERFECT_GRAPHICS ) -GAMEX(1993, ssoldier, 0, psoldier, psoldier, ssoldier, ROT0, "Irem America", "Superior Soldiers (US)", GAME_IMPERFECT_SOUND ) -GAMEX(1993, psoldier, ssoldier, psoldier, psoldier, psoldier, ROT0, "Irem", "Perfect Soldiers (Japan)", GAME_IMPERFECT_SOUND ) +GAME (1993, ssoldier, 0, psoldier, psoldier, ssoldier, ROT0, "Irem America", "Superior Soldiers (US)" ) +GAME (1993, psoldier, ssoldier, psoldier, psoldier, psoldier, ROT0, "Irem", "Perfect Soldiers (Japan)" ) GAME( 1994, dsccr94j, dsoccr94, psoldier, dsccr94j, dsccr94j, ROT0, "Irem", "Dream Soccer '94 (Japan)" ) GAME( 1994, gunforc2, 0, raster, gunforc2, gunforc2, ROT0, "Irem", "Gunforce 2 (US)" ) GAME( 1994, geostorm, gunforc2, raster, gunforc2, gunforc2, ROT0, "Irem", "Geostorm (Japan)" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/mcr2.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/mcr2.c
Changed
@@ -248,17 +248,17 @@ *************************************/ INPUT_PORTS_START( shollow ) - PORT_START /* IN0 */ + PORT_START /* J4 1-8 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_TILT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) - PORT_START /* IN1 */ + PORT_START /* J4 10-13,15-18 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_2WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_2WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) @@ -268,20 +268,22 @@ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) - PORT_START /* IN2 unused */ + PORT_START /* J5 1-8 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* IN3 -- dipswitches */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_START /* DIPSW @ B3 */ + PORT_DIPNAME( 0x01, 0x01, "Coin Meters" ) + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, "2" ) PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) ) PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START /* IN4 unused */ + PORT_START /* J6 1-8 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* AIN0 */ + PORT_START PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END @@ -426,43 +428,44 @@ INPUT_PORTS_START( journey ) - PORT_START /* IN0 */ + PORT_START /* J4 1-8 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_TILT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) - PORT_START /* IN1 */ + PORT_START /* J4 10-13,15-18 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* IN2 unused */ + PORT_START /* J5 1-8 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL ) + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* IN3 -- dipswitches */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet) ) - PORT_DIPSETTING( 0x00, DEF_STR (Upright)) - PORT_DIPSETTING( 0x02, DEF_STR (Cocktail )) - PORT_BIT( 0x3c, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x80, 0x00, "Coin Meters" ) - PORT_DIPSETTING( 0x80, "1" ) + PORT_START /* DIPSW @ B3 */ + PORT_DIPNAME( 0x01, 0x01, "Coin Meters" ) + PORT_DIPSETTING( 0x01, "1" ) PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) ) + PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START /* IN4 unused */ + PORT_START /* J6 1-8 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START /* AIN0 */ + PORT_START PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/midtunit.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/midtunit.c
Changed
@@ -8,6 +8,7 @@ Games supported: * Mortal Kombat (T-unit version) * Mortal Kombat 2 + * Mortal Kombat 2 + * NBA Jam * NBA Jam Tournament Edition * Judge Dredd (prototype) @@ -27,6 +28,7 @@ #include "midtunit.h" #include "bootstrap.h" +#include "inptport.h" /************************************* @@ -1016,6 +1018,46 @@ ROM_END +ROM_START( mk2p ) + ROM_REGION( 0x10, REGION_CPU1, 0 ) /* 34010 dummy region */ + + ROM_REGION( ADSP2100_SIZE + 0x800000, REGION_CPU2, 0 ) /* ADSP-2105 data */ + ROM_LOAD( "su2.l1", ADSP2100_SIZE + 0x000000, 0x80000, CRC(65d11dd7) SHA1(bb94cca5a35f8f285d32314f8762c3c52ec48f5b) ) + ROM_RELOAD( ADSP2100_SIZE + 0x080000, 0x80000 ) + ROM_LOAD( "su3.l1", ADSP2100_SIZE + 0x100000, 0x80000, CRC(d6d92bf9) SHA1(397351c6b707f2595e36360471015f9fa494e894) ) + ROM_RELOAD( ADSP2100_SIZE + 0x180000, 0x80000 ) + ROM_LOAD( "su4.l1", ADSP2100_SIZE + 0x200000, 0x80000, CRC(eebc8e0f) SHA1(705ab63ff7672a4857d546afda6dca4973cce1ad) ) + ROM_RELOAD( ADSP2100_SIZE + 0x280000, 0x80000 ) + ROM_LOAD( "su5.l1", ADSP2100_SIZE + 0x300000, 0x80000, CRC(2b0b7961) SHA1(1cdc64aab74d14afbd8c3531e3d0bd49271a281f) ) + ROM_RELOAD( ADSP2100_SIZE + 0x380000, 0x80000 ) + ROM_LOAD( "su6.l1", ADSP2100_SIZE + 0x400000, 0x80000, CRC(f694b27f) SHA1(d43e38a124665f49ebb4ffc5a55e8f19a1a64686) ) + ROM_RELOAD( ADSP2100_SIZE + 0x480000, 0x80000 ) + ROM_LOAD( "su7.l1", ADSP2100_SIZE + 0x500000, 0x80000, CRC(20387e0a) SHA1(505d05173b2a1f1ee3ebc2898ccd3a95c98dd04a) ) + ROM_RELOAD( ADSP2100_SIZE + 0x580000, 0x80000 ) + /* su8 and su9 are unpopulated */ + + ROM_REGION16_LE( 0x100000, REGION_USER1, ROMREGION_DISPOSE ) /* 34010 code */ + ROM_LOAD16_BYTE( "uj12.l31", 0x00000, 0x80000, CRC(05ff15a9) SHA1(23e9c47644c756d7568b6e5122801b19cf594e9b) ) + ROM_LOAD16_BYTE( "ug12.l31", 0x00001, 0x80000, CRC(b6d8ff5c) SHA1(ad974cc0dcdf35c7175f7cb8c620b58b82843523) ) + + ROM_REGION( 0xc00000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "ug14-vid", 0x000000, 0x100000, CRC(01e73af6) SHA1(6598cfd704cc92a7f358a0e1f1c973ab79dcc493) ) + ROM_LOAD( "ug16-vid", 0x100000, 0x100000, CRC(b2af2798) SHA1(3d679fb59753b72f961fe60a65e4e03a76b64266) ) + ROM_LOAD( "ug17-vid", 0x200000, 0x100000, CRC(937d8620) SHA1(8b9f80a460b124a747a6d1495b53f01f580e28f1) ) + + ROM_LOAD( "uj14-vid", 0x300000, 0x100000, CRC(d4985cbb) SHA1(367865da7efae38d83de3c0868d02a705177ae63) ) + ROM_LOAD( "uj16-vid", 0x400000, 0x100000, CRC(d70dd149) SHA1(1add61f22a68c0bd8dba3fa0da18f5ecc7f51c6f) ) + ROM_LOAD( "uj17-vid", 0x500000, 0x100000, CRC(218de160) SHA1(87aea173720d2a33d8183903f4fe8ba1d47e3348) ) + + ROM_LOAD( "ug19-vid", 0x600000, 0x100000, CRC(fec137be) SHA1(f11ecb8a7993f5c4f4449564b4911f69bd6e9bf8) ) + ROM_LOAD( "ug20-vid", 0x700000, 0x100000, CRC(d05e970a) SHA1(0f07d72c0ae9ed77c79b4a39abbc047df68a6b1d) ) + ROM_LOAD( "ug22-vid", 0x800000, 0x100000, CRC(154d53b1) SHA1(58ff0aa59101f40a9a3b5fbae1c904d0b0b31612) ) + + ROM_LOAD( "uj19-vid", 0x900000, 0x100000, CRC(2d763156) SHA1(06536006da49ab5fb6b75b25f801b83fad000ff5) ) + ROM_LOAD( "uj20-vid", 0xa00000, 0x100000, CRC(0f9c9a12) SHA1(6c593ab037f9e203e50a13bef1cdbba765a45845) ) + ROM_LOAD( "uj22-vid", 0xb00000, 0x100000, CRC(8891d785) SHA1(fd460df1ef8f4306ea42f7dc41488a80fd2c8f53) ) +ROM_END + /* equivalences for the extension board version (same contents, split in half) @@ -1325,19 +1367,20 @@ GAME( 1992, mk, 0, tunit_adpcm, mk, mk, ROT0, "Midway", "Mortal Kombat (rev 5.0 T-Unit 03/19/93)" ) GAME( 1992, mkr4, mk, tunit_adpcm, mk, mkr4, ROT0, "Midway", "Mortal Kombat (rev 4.0 T-Unit 02/11/93)" ) -GAMEC(1993, mk2, 0, tunit_dcs, mk2, mk2, ROT0, "Midway", "Mortal Kombat II (rev L3.1)", &generic_ctrl, &mk2_bootstrap ) -GAMEC(1993, mk2r32, mk2, tunit_dcs, mk2, mk2, ROT0, "Midway", "Mortal Kombat II (rev L3.2 (European))", &generic_ctrl, &mk2r32_bootstrap ) -GAMEC(1993, mk2r21, mk2, tunit_dcs, mk2, mk2r21, ROT0, "Midway", "Mortal Kombat II (rev L2.1)", &generic_ctrl, &mk2r21_bootstrap) -GAMEC(1993, mk2r14, mk2, tunit_dcs, mk2, mk2r14, ROT0, "Midway", "Mortal Kombat II (rev L1.4)", &generic_ctrl, &mk2r14_bootstrap ) -GAMEC(1993, mk2r42, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II (rev L4.2, hack)", &generic_ctrl, &mk2r42_bootstrap ) -GAMEC(1993, mk2r91, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II (rev L9.1, hack)", &generic_ctrl, &mk2r91_bootstrap ) -GAMEC(1993, mk2chal, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II Challenger (hack)", &generic_ctrl, &mk2chal_bootstrap ) +GAMEC(1993, mk2, 0, tunit_dcs, mk2, mk2, ROT0, "Midway", "Mortal Kombat II (rev L3.1)", &mk2_ctrl, &mk2_bootstrap ) +GAMEC(1993, mk2r32, mk2, tunit_dcs, mk2, mk2, ROT0, "Midway", "Mortal Kombat II (rev L3.2 (European))", &mk2_ctrl, &mk2r32_bootstrap ) +GAMEC(1993, mk2r21, mk2, tunit_dcs, mk2, mk2r21, ROT0, "Midway", "Mortal Kombat II (rev L2.1)", &mk2_ctrl, &mk2r21_bootstrap) +GAMEC(1993, mk2r14, mk2, tunit_dcs, mk2, mk2r14, ROT0, "Midway", "Mortal Kombat II (rev L1.4)", &mk2_ctrl, &mk2r14_bootstrap ) +GAMEC(1993, mk2r42, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II (rev L4.2, hack)", &mk2_ctrl, &mk2r42_bootstrap ) +GAMEC(1993, mk2r91, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II (rev L9.1, hack)", &mk2_ctrl, &mk2r91_bootstrap ) +GAMEC(1993, mk2chal, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II Challenger (hack)", &mk2_ctrl, &mk2chal_bootstrap ) +GAMEC(2019, mk2p, mk2, tunit_dcs, mk2, mk2, ROT0, "hack", "Mortal Kombat II Plus (Beta 2)", &mk2_ctrl, &mk2p_bootstrap ) GAME( 1993, jdreddp, 0, tunit_adpcm, jdreddp, jdreddp, ROT0, "Midway", "Judge Dredd (rev LA1, prototype)" ) -GAME( 1993, nbajam, 0, tunit_adpcm, nbajam, nbajam, ROT0, "Midway", "NBA Jam (rev 3.01 04/07/93)" ) -GAME( 1993, nbajamr2, nbajam, tunit_adpcm, nbajam, nbajam20, ROT0, "Midway", "NBA Jam (rev 2.00 02/10/93)" ) -GAME( 1994, nbajamte, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 4.0 03/23/94)" ) -GAME( 1994, nbajamt1, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 1.0 01/17/94)" ) -GAME( 1994, nbajamt2, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 2.0 01/28/94)" ) -GAME( 1994, nbajamt3, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 3.0 03/04/94)" ) +GAMEC( 1993, nbajam, 0, tunit_adpcm, nbajam, nbajam, ROT0, "Midway", "NBA Jam (rev 3.01 04/07/93)", &nbajam_ctrl, &nbajam_bootstrap ) +GAMEC( 1993, nbajamr2, nbajam, tunit_adpcm, nbajam, nbajam20, ROT0, "Midway", "NBA Jam (rev 2.00 02/10/93)", &nbajam_ctrl, &nbajamr2_bootstrap ) +GAMEC( 1994, nbajamte, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 4.0 03/23/94)", &nbajam_ctrl, &nbajamte_bootstrap ) +GAMEC( 1994, nbajamt1, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 1.0 01/17/94)", &nbajam_ctrl, &nbajamt1_bootstrap ) +GAMEC( 1994, nbajamt2, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 2.0 01/28/94)", &nbajam_ctrl, &nbajamt2_bootstrap ) +GAMEC( 1994, nbajamt3, nbajam, tunit_adpcm, nbajamte, nbajamte, ROT0, "Midway", "NBA Jam TE (rev 3.0 03/04/94)", &nbajam_ctrl, &nbajamt3_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/midvunit.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/midvunit.c
Changed
@@ -26,6 +26,8 @@ #include "machine/midwayic.h" #include "midvunit.h" #include <time.h> +#include "bootstrap.h" +#include "inptport.h" static data32_t *ram_base; @@ -56,8 +58,8 @@ static MACHINE_INIT( midvunit ) { - dcs_reset_w(1); dcs_reset_w(0); + dcs_reset_w(1); cpu_setbank(1, memory_region(REGION_USER1)); memcpy(ram_base, memory_region(REGION_USER1), 0x20000*4); @@ -69,10 +71,10 @@ static MACHINE_INIT( midvplus ) { - dcs_reset_w(1); dcs_reset_w(0); + dcs_reset_w(1); -// cpu_setbank(1, ram_base); +/* cpu_setbank(1, ram_base);*/ memcpy(ram_base, memory_region(REGION_USER1), 0x20000*4); timer[0] = timer_alloc(NULL); @@ -135,7 +137,7 @@ if (!(control_data & 0x40)) return adc_data << adc_shift; else - logerror("adc_r without enabling reads!\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "adc_r without enabling reads!\n"); return 0xffffffff; } @@ -152,12 +154,12 @@ { int which = (data >> adc_shift) - 4; if (which < 0 || which > 2) - logerror("adc_w: unexpected which = %02X\n", which + 4); + log_cb(RETRO_LOG_DEBUG, LOGPRE "adc_w: unexpected which = %02X\n", which + 4); adc_data = readinputport(3 + which); timer_set(TIME_IN_MSEC(1), 0, adc_ready); } else - logerror("adc_w without enabling writes!\n"); + log_cb(RETRO_LOG_DEBUG, LOGPRE "adc_w without enabling writes!\n"); } @@ -210,11 +212,11 @@ watchdog_reset_w(0, 0); /* bit 1 is the DCS sound reset */ - dcs_reset_w((~control_data >> 1) & 1); + dcs_reset_w((control_data >> 1) & 1); /* log anything unusual */ if ((olddata ^ control_data) & ~0x00e8) - logerror("midvunit_control_w: old=%04X new=%04X diff=%04X\n", olddata, control_data, olddata ^ control_data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "midvunit_control_w: old=%04X new=%04X diff=%04X\n", olddata, control_data, olddata ^ control_data); } @@ -224,7 +226,7 @@ COMBINE_DATA(&control_data); /* bit 11 is the DCS sound reset */ - dcs_reset_w((~control_data >> 11) & 1); + dcs_reset_w((control_data >> 11) & 1); /* bit 9 is the watchdog */ if ((olddata ^ control_data) & 0x0200) @@ -234,13 +236,13 @@ /* log anything unusual */ if ((olddata ^ control_data) & ~0xe800) - logerror("crusnwld_control_w: old=%04X new=%04X diff=%04X\n", olddata, control_data, olddata ^ control_data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "crusnwld_control_w: old=%04X new=%04X diff=%04X\n", olddata, control_data, olddata ^ control_data); } static WRITE32_HANDLER( midvunit_sound_w ) { - logerror("Sound W = %02X\n", data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "Sound W = %02X\n", data); dcs_data_w(data & 0xff); } @@ -260,13 +262,13 @@ /* timer is clocked at 100ns */ int which = (offset >> 4) & 1; INT32 result = timer_timeelapsed(timer[which]) * timer_rate; -// logerror("%06X:tms32031_control_r(%02X) = %08X\n", activecpu_get_pc(), offset, result); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "%06X:tms32031_control_r(%02X) = %08X\n", activecpu_get_pc(), offset, result);*/ return result; } /* log anything else except the memory control register */ if (offset != 0x64) - logerror("%06X:tms32031_control_r(%02X)\n", activecpu_get_pc(), offset); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%06X:tms32031_control_r(%02X)\n", activecpu_get_pc(), offset); return tms32031_control[offset]; } @@ -284,7 +286,7 @@ else if (offset == 0x20 || offset == 0x30) { int which = (offset >> 4) & 1; -// logerror("%06X:tms32031_control_w(%02X) = %08X\n", activecpu_get_pc(), offset, data); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "%06X:tms32031_control_w(%02X) = %08X\n", activecpu_get_pc(), offset, data);*/ if (data & 0x40) timer_adjust(timer[which], TIME_NEVER, 0, TIME_NEVER); @@ -295,7 +297,7 @@ timer_rate = 10000000.; } else - logerror("%06X:tms32031_control_w(%02X) = %08X\n", activecpu_get_pc(), offset, data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%06X:tms32031_control_w(%02X) = %08X\n", activecpu_get_pc(), offset, data); } @@ -417,7 +419,7 @@ } if (offset != 0 && offset != 3) - logerror("%06X:midvplus_misc_r(%d) = %08X\n", activecpu_get_pc(), offset, result); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%06X:midvplus_misc_r(%d) = %08X\n", activecpu_get_pc(), offset, result); return result; } @@ -446,7 +448,7 @@ } if (logit) - logerror("%06X:midvplus_misc_w(%d) = %08X\n", activecpu_get_pc(), offset, data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%06X:midvplus_misc_w(%d) = %08X\n", activecpu_get_pc(), offset, data); } @@ -460,7 +462,7 @@ static void midvplus_xf1_w(UINT8 val) { static int lastval; -// printf("xf1_w = %d\n", val); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "xf1_w = %d\n", val);*/ if (lastval && !val) memcpy(ram_base, fastram_base, 0x20000*4); @@ -489,13 +491,13 @@ { ADDR_RANGE(0x980040, 0x980040), midvunit_page_control_r }, { ADDR_RANGE(0x980080, 0x980080), MRA32_NOP }, { ADDR_RANGE(0x980082, 0x980083), midvunit_dma_trigger_r }, - { ADDR_RANGE(0x990000, 0x990000), MRA32_NOP }, // link PAL (low 4 bits must == 4) + { ADDR_RANGE(0x990000, 0x990000), MRA32_NOP }, /* link PAL (low 4 bits must == 4)*/ { ADDR_RANGE(0x991030, 0x991030), port1_r }, -// { ADDR_RANGE(0x991050, 0x991050), MRA32_RAM }, // seems to be another port +/* { ADDR_RANGE(0x991050, 0x991050), MRA32_RAM }, */ /* seems to be another port*/ { ADDR_RANGE(0x991060, 0x991060), port0_r }, { ADDR_RANGE(0x992000, 0x992000), port2_r }, { ADDR_RANGE(0x993000, 0x993000), midvunit_adc_r }, - { ADDR_RANGE(0x997000, 0x997000), MRA32_NOP }, // communications + { ADDR_RANGE(0x997000, 0x997000), MRA32_NOP }, /* communications*/ { ADDR_RANGE(0x9c0000, 0x9c1fff), midvunit_cmos_r }, { ADDR_RANGE(0x9e0000, 0x9e7fff), MRA32_RAM }, { ADDR_RANGE(0xa00000, 0xbfffff), midvunit_textureram_r }, @@ -515,9 +517,9 @@ { ADDR_RANGE(0x980080, 0x980080), MWA32_NOP }, { ADDR_RANGE(0x993000, 0x993000), midvunit_adc_w }, { ADDR_RANGE(0x994000, 0x994000), midvunit_control_w }, - { ADDR_RANGE(0x995000, 0x995000), MWA32_NOP }, // force feedback? + { ADDR_RANGE(0x995000, 0x995000), MWA32_NOP }, /* force feedback?*/ { ADDR_RANGE(0x995020, 0x995020), midvunit_cmos_protect_w }, - { ADDR_RANGE(0x997000, 0x997000), MWA32_NOP }, // link communications + { ADDR_RANGE(0x997000, 0x997000), MWA32_NOP }, /* link communications*/ { ADDR_RANGE(0x9a0000, 0x9a0000), midvunit_sound_w }, { ADDR_RANGE(0x9c0000, 0x9c1fff), midvunit_cmos_w, (data32_t **)&generic_nvram, &generic_nvram_size }, { ADDR_RANGE(0x9e0000, 0x9e7fff), midvunit_paletteram_w, &paletteram32 }, @@ -693,10 +695,10 @@ PORT_ANALOG( 0xff, 0x80, IPT_PADDLE, 25, 20, 0x10, 0xf0 ) PORT_START /* gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* brake pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2, 100, 20, 0x00, 0xff ) INPUT_PORTS_END @@ -814,10 +816,10 @@ PORT_ANALOG( 0xff, 0x80, IPT_PADDLE, 25, 20, 0x10, 0xf0 ) PORT_START /* gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* brake pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2, 100, 20, 0x00, 0xff ) INPUT_PORTS_END @@ -909,10 +911,10 @@ PORT_ANALOG( 0xff, 0x80, IPT_PADDLE, 25, 20, 0x10, 0xf0 ) PORT_START /* gas pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 20, 0x00, 0xff ) PORT_START /* brake pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL | IPF_PLAYER2, 25, 20, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2, 100, 20, 0x00, 0xff ) INPUT_PORTS_END @@ -1451,12 +1453,12 @@ * *************************************/ -GAME( 1994, crusnusa, 0, midvunit, crusnusa, crusnusa, ROT0, "Midway", "Cruis'n USA (rev L4.1)" ) -GAME( 1994, crusnu40, crusnusa, midvunit, crusnusa, crusnu40, ROT0, "Midway", "Cruis'n USA (rev L4.0)" ) -GAME( 1994, crusnu21, crusnusa, midvunit, crusnusa, crusnu21, ROT0, "Midway", "Cruis'n USA (rev L2.1)" ) -GAME( 1996, crusnwld, 0, midvunit, crusnwld, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.3)" ) -GAME( 1996, crusnw20, crusnwld, midvunit, crusnwld, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.0)" ) -GAME( 1996, crusnw13, crusnwld, midvunit, crusnwld, crusnwld, ROT0, "Midway", "Cruis'n World (rev L1.3)" ) -GAMEX( 1997, offroadc, 0, midvunit, offroadc, offroadc, ROT0, "Midway", "Off Road Challenge", GAME_NOT_WORKING ) +GAMEC( 1994, crusnusa, 0, midvunit, crusnusa, crusnusa, ROT0, "Midway", "Cruis'n USA (rev L4.1)", &generic_ctrl, &crusnusa_bootstrap ) +GAMEC( 1994, crusnu40, crusnusa, midvunit, crusnusa, crusnu40, ROT0, "Midway", "Cruis'n USA (rev L4.0)", &generic_ctrl, &crusnu40_bootstrap ) +GAMEC( 1994, crusnu21, crusnusa, midvunit, crusnusa, crusnu21, ROT0, "Midway", "Cruis'n USA (rev L2.1)", &generic_ctrl, &crusnu21_bootstrap ) +GAME ( 1996, crusnwld, 0, midvunit, crusnwld, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.3)" ) +GAME ( 1996, crusnw20, crusnwld, midvunit, crusnwld, crusnwld, ROT0, "Midway", "Cruis'n World (rev L2.0)" ) +GAME ( 1996, crusnw13, crusnwld, midvunit, crusnwld, crusnwld, ROT0, "Midway", "Cruis'n World (rev L1.3)" ) +GAMEC( 1997, offroadc, 0, midvunit, offroadc, offroadc, ROT0, "Midway", "Off Road Challenge", &generic_ctrl, &offroadc_bootstrap ) -GAME( 1995, wargods, 0, midvplus, wargods, wargods, ROT0, "Midway", "War Gods" ) +GAME ( 1995, wargods, 0, midvplus, wargods, wargods, ROT0, "Midway", "War Gods" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/midwunit.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/midwunit.c
Changed
@@ -8,6 +8,7 @@ Games supported: * Mortal Kombat 3 * Ultimate Mortal Kombat 3 + * Ultimate Mortal Kombat 3 + * NBA Hangtime * NBA Maximum Hangtime * 2 On 2 Open Ice Challenge @@ -25,6 +26,8 @@ #include "cpu/adsp2100/adsp2100.h" #include "sndhrdw/dcs.h" #include "midwunit.h" +#include "bootstrap.h" +#include "inptport.h" @@ -256,7 +259,7 @@ PORT_DIPNAME( 0x0800, 0x0800, "Head Size" ) PORT_DIPSETTING( 0x0800, "Normal" ) PORT_DIPSETTING( 0x0000, "Large" ) - PORT_DIPNAME( 0x1000, 0x0000, DEF_STR( Cabinet )) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Cabinet )) PORT_DIPSETTING( 0x0000, "2-player" ) PORT_DIPSETTING( 0x1000, "4-player" ) PORT_BIT( 0x6000, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -332,7 +335,7 @@ PORT_DIPNAME( 0x0040, 0x0040, "Bill Validator" ) PORT_DIPSETTING( 0x0040, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) - PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Cabinet )) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Cabinet )) PORT_DIPSETTING( 0x0000, "2-player" ) PORT_DIPSETTING( 0x0080, "4-player" ) PORT_DIPNAME( 0x0300, 0x0300, "Counters" ) @@ -831,6 +834,52 @@ ROM_END +ROM_START( umk3p ) + ROM_REGION( 0x10, REGION_CPU1, 0 ) /* 34010 dummy region */ + + ROM_REGION( ADSP2100_SIZE + 0x400000, REGION_CPU2, 0 ) /* ADSP-2105 data */ + ROM_LOAD( "umk3-u2.bin", ADSP2100_SIZE + 0x000000, 0x100000, CRC(3838cfe5) SHA1(e3d2901f3bae1362742fc6ee0aa31c9f63b4dfa3) ) + ROM_LOAD( "umk3-u3.bin", ADSP2100_SIZE + 0x100000, 0x100000, CRC(856fe411) SHA1(6165ebecfce7500e948d84492ffa19eed7f47091) ) + ROM_LOAD( "umk3-u4.bin", ADSP2100_SIZE + 0x200000, 0x100000, CRC(428a406f) SHA1(e70ec83cd054de0da1e178720ed0035b8887f797) ) + ROM_LOAD( "umk3-u5.bin", ADSP2100_SIZE + 0x300000, 0x100000, CRC(3b98a09f) SHA1(edf1d02a56dcf3349e6b4bb4097acfe7592305f4) ) + + ROM_REGION16_LE( 0x100000, REGION_USER1, ROMREGION_DISPOSE ) /* 34010 code */ + ROM_LOAD16_BYTE( "um312u54.bin", 0x00000, 0x80000, CRC(a46ee73c) SHA1(2ad13bf20b9e42729773307b55fa67e430b1cf87) ) + ROM_LOAD16_BYTE( "um312u63.bin", 0x00001, 0x80000, CRC(4f200db2) SHA1(25bab2c52df59056e3018d88491de1f2b1a8eed2) ) + + ROM_REGION( 0x2000000, REGION_GFX1, 0 ) + ROM_LOAD( "umk-u133.bin", 0x0000000, 0x100000, CRC(79b94667) SHA1(31bba640c351fdccc6685cadb74dd79a3f910ce8) ) + ROM_LOAD( "umk-u132.bin", 0x0100000, 0x100000, CRC(13e95228) SHA1(405b05f5a5a55667c2be17d4b399129bdacefd90) ) + ROM_LOAD( "umk-u131.bin", 0x0200000, 0x100000, CRC(41001e30) SHA1(2cec91116771951c0380cec5debf4cbb40c14c61) ) + ROM_LOAD( "umk-u130.bin", 0x0300000, 0x100000, CRC(49379dd7) SHA1(e6dfab4e23d9cc38ae56c1bbf10ccd160e8fad5e) ) + + ROM_LOAD( "umk-u129.bin", 0x0400000, 0x100000, CRC(a8b41803) SHA1(9697e35e8bb51d6d36b1d7ae47377b446e57682f) ) + ROM_LOAD( "umk-u128.bin", 0x0500000, 0x100000, CRC(b410d72f) SHA1(ac5c1c6f744186540f4ab100d9bd4ce6007e600b) ) + ROM_LOAD( "umk-u127.bin", 0x0600000, 0x100000, CRC(bd985be7) SHA1(f5183abea2e5eb2c2c8cefa72c9ed321679f5128) ) + ROM_LOAD( "umk-u126.bin", 0x0700000, 0x100000, CRC(e7c32cf4) SHA1(94ea7b2eed7dae66f5dd676c20d6b360140e3e0e) ) + + ROM_LOAD( "umk-u125.bin", 0x0800000, 0x100000, CRC(9a52227e) SHA1(0474a14fa8dbfea0b0889c1d1756b86391683558) ) + ROM_LOAD( "umk-u124.bin", 0x0900000, 0x100000, CRC(5c750ebc) SHA1(45d68af1a56994376e086d840502453c8d6be700) ) + ROM_LOAD( "umk-u123.bin", 0x0a00000, 0x100000, CRC(f0ab88a8) SHA1(cdc9dc12e162255845c6627b1e35182b7e8502d0) ) + ROM_LOAD( "umk-u122.bin", 0x0b00000, 0x100000, CRC(9b87cdac) SHA1(a5f8db559293978f23e6f105543d8b2e170a2e0d) ) + + ROM_LOAD( "umk-u121.bin", 0x0c00000, 0x100000, CRC(cc4b95db) SHA1(3d53180eec649e9616c4b87db55573f12d9bfee3) ) + ROM_LOAD( "umk-u120.bin", 0x0d00000, 0x100000, CRC(1c8144cd) SHA1(77cdc1eaf630ccb7233f5532f8b08191d00f0816) ) + ROM_LOAD( "umk-u119.bin", 0x0e00000, 0x100000, CRC(5f10c543) SHA1(24dc83b7aa531ebd399258ffa7b2e028f1c4a28e) ) + ROM_LOAD( "umk-u118.bin", 0x0f00000, 0x100000, CRC(de0c4488) SHA1(227cab34798c440b2a45223567113df5f17d913f) ) + + ROM_LOAD( "umk-u117.bin", 0x1000000, 0x80000, CRC(52ee547e) SHA1(97dba4d6dd503a623dad5709767e4617de211af0) ) + ROM_LOAD( "umk-u116.bin", 0x1100000, 0x80000, CRC(f6df5c98) SHA1(e8317cf46d23738223f034c10f0f6f874d72165f) ) + ROM_LOAD( "umk-u115.bin", 0x1200000, 0x80000, CRC(e003a51b) SHA1(e11c0cb0a9d647f17398b48d0b7d088526a18af8) ) + ROM_LOAD( "umk-u114.bin", 0x1300000, 0x80000, CRC(b8504598) SHA1(fce32581d6ff9e1a7455c30fb10812ba9dc70db5) ) + + ROM_LOAD( "umk-u113.bin", 0x1400000, 0x100000, CRC(99d74a1e) SHA1(ed3068afa98287ea290d1f537f5009d3b6d683da) ) + ROM_LOAD( "umk-u112.bin", 0x1500000, 0x100000, CRC(b5a46488) SHA1(dbf22e55d200eb9ff550f48b223cf0c6114a9357) ) + ROM_LOAD( "umk-u111.bin", 0x1600000, 0x100000, CRC(a87523c8) SHA1(e70b7599fef82001f762fc2c48f7b85474431ccc) ) + ROM_LOAD( "umk-u110.bin", 0x1700000, 0x100000, CRC(0038f205) SHA1(059c1c71a2d92ee6db36c09831d213a48a7e81d0) ) +ROM_END + + ROM_START( openice ) ROM_REGION( 0x10, REGION_CPU1, 0 ) /* 34010 dummy region */ @@ -1064,15 +1113,16 @@ * *************************************/ -GAME( 1994, mk3, 0, wunit, mk3, mk3, ROT0, "Midway", "Mortal Kombat 3 (rev 2.1)" ) -GAME( 1994, mk3r20, mk3, wunit, mk3, mk3r20, ROT0, "Midway", "Mortal Kombat 3 (rev 2.0)" ) -GAME( 1994, mk3r10, mk3, wunit, mk3, mk3r10, ROT0, "Midway", "Mortal Kombat 3 (rev 1.0)" ) -GAME( 1994, umk3, mk3, wunit, mk3, umk3, ROT0, "Midway", "Ultimate Mortal Kombat 3 (rev 1.2)" ) -GAME( 1994, umk3r11, mk3, wunit, mk3, umk3r11, ROT0, "Midway", "Ultimate Mortal Kombat 3 (rev 1.1)" ) - -GAME( 1995, wwfmania,0, wunit, wwfmania,wwfmania,ROT0, "Midway", "WWF: Wrestlemania (rev 1.30 08/10/95)" ) -GAME( 1995, openice, 0, wunit, openice, openice, ROT0, "Midway", "2 On 2 Open Ice Challenge (rev 1.21)" ) -GAME( 1996, nbahangt,0, wunit, nbahangt,nbahangt,ROT0, "Midway", "NBA Hangtime (rev L1.1 04/16/96)" ) -GAME( 1996, nbamaxht,nbahangt, wunit, nbahangt,nbahangt,ROT0, "Midway", "NBA Maximum Hangtime (rev 1.0 11/8/96)" ) -GAME( 1997, rmpgwt, 0, wunit, rmpgwt, rmpgwt, ROT0, "Midway", "Rampage: World Tour (rev 1.3)" ) -GAME( 1997, rmpgwt11,rmpgwt, wunit, rmpgwt, rmpgwt, ROT0, "Midway", "Rampage: World Tour (rev 1.1)" ) +GAME ( 1994, mk3, 0, wunit, mk3, mk3, ROT0, "Midway", "Mortal Kombat 3 (rev 2.1)" ) +GAME ( 1994, mk3r20, mk3, wunit, mk3, mk3r20, ROT0, "Midway", "Mortal Kombat 3 (rev 2.0)" ) +GAME ( 1994, mk3r10, mk3, wunit, mk3, mk3r10, ROT0, "Midway", "Mortal Kombat 3 (rev 1.0)" ) +GAMEC( 1994, umk3, mk3, wunit, mk3, umk3, ROT0, "Midway", "Ultimate Mortal Kombat 3 (rev 1.2)", &mk3_ctrl, &umk3_bootstrap ) +GAMEC( 1994, umk3r11, mk3, wunit, mk3, umk3r11, ROT0, "Midway", "Ultimate Mortal Kombat 3 (rev 1.1)", &mk3_ctrl, &umk3r11_bootstrap ) +GAMEC( 2019, umk3p, mk3, wunit, mk3, umk3p, ROT0, "hack", "Ultimate Mortal Kombat 3 Plus (Beta 1)", &mk3_ctrl, &umk3p_bootstrap ) + +GAMEC( 1995, wwfmania,0, wunit, wwfmania,wwfmania,ROT0, "Midway", "WWF: Wrestlemania (rev 1.30 08/10/95)", &wwfmania_ctrl, &wwfmania_bootstrap ) +GAMEC( 1995, openice, 0, wunit, openice, openice, ROT0, "Midway", "2 On 2 Open Ice Challenge (rev 1.21)", &openice_ctrl, &openice_bootstrap ) +GAMEC( 1996, nbahangt,0, wunit, nbahangt,nbahangt,ROT0, "Midway", "NBA Hangtime (rev L1.1 04/16/96)", &nbahangt_ctrl, &nbahangt_bootstrap ) +GAMEC( 1996, nbamaxht,nbahangt, wunit, nbahangt,nbahangt,ROT0, "Midway", "NBA Maximum Hangtime (rev 1.0 11/8/96)", &nbahangt_ctrl, &nbamaxht_bootstrap ) +GAMEC( 1997, rmpgwt, 0, wunit, rmpgwt, rmpgwt, ROT0, "Midway", "Rampage: World Tour (rev 1.3)", &rmpgwt_ctrl, &rmpgwt_bootstrap ) +GAMEC( 1997, rmpgwt11,rmpgwt, wunit, rmpgwt, rmpgwt, ROT0, "Midway", "Rampage: World Tour (rev 1.1)", &rmpgwt_ctrl, &rmpgwt11_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/midxunit.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/midxunit.c
Changed
@@ -19,6 +19,9 @@ #include "sndhrdw/dcs.h" #include "midwunit.h" +#include "bootstrap.h" +#include "inptport.h" + /************************************* @@ -120,18 +123,18 @@ PORT_DIPSETTING( 0x0014, "3" ) PORT_DIPSETTING( 0x000c, "ECA" ) PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play )) - PORT_DIPNAME( 0x00e0, 0x0060, "Credits" ) - PORT_DIPSETTING( 0x0020, "3 Start/1 Continue" ) + PORT_DIPNAME( 0x00e0, 0x00a0, "Credits" ) + PORT_DIPSETTING( 0x0020, "4 Start/2 Continue" ) PORT_DIPSETTING( 0x00e0, "2 Start/2 Continue" ) - PORT_DIPSETTING( 0x00a0, "2 Start/1 Continue" ) - PORT_DIPSETTING( 0x0000, "1 Start/4 Continue" ) - PORT_DIPSETTING( 0x0040, "1 Start/3 Continue" ) - PORT_DIPSETTING( 0x0060, "1 Start/1 Continue" ) + PORT_DIPSETTING( 0x00a0, "1 Start/1 Continue" ) + PORT_DIPSETTING( 0x0000, "3 Start/3 Continue" ) + PORT_DIPSETTING( 0x0040, "3 Start/2 Continue" ) + PORT_DIPSETTING( 0x0060, "4 Start/1 Continue" ) PORT_DIPNAME( 0x0300, 0x0300, "Country" ) PORT_DIPSETTING( 0x0300, "USA" ) PORT_DIPSETTING( 0x0100, "French" ) PORT_DIPSETTING( 0x0200, "German" ) -// PORT_DIPSETTING( 0x0000, DEF_STR( Unused )) +/* PORT_DIPSETTING( 0x0000, DEF_STR( Unused ))*/ PORT_DIPNAME( 0x0400, 0x0400, "Bill Validator" ) PORT_DIPSETTING( 0x0400, DEF_STR( Off )) PORT_DIPSETTING( 0x0000, DEF_STR( On )) @@ -152,27 +155,27 @@ PORT_DIPSETTING( 0x0000, DEF_STR( On )) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER1, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER1, 39, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_Y | IPF_PLAYER1, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_Y | IPF_PLAYER1, 39, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER2, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER2, 39, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_Y | IPF_PLAYER2, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_Y | IPF_PLAYER2, 39, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER3, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER3, 39, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_Y | IPF_PLAYER3, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_Y | IPF_PLAYER3, 39, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -311,4 +314,4 @@ * *************************************/ -GAME( 1994, revx, 0, midxunit, revx, revx, ROT0, "Midway", "Revolution X (Rev. 1.0 6/16/94)" ) +GAMEC( 1994, revx, 0, midxunit, revx, revx, ROT0, "Midway", "Revolution X (Rev. 1.0 6/16/94)", &revx_ctrl, &revx_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/midyunit.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/midyunit.c
Changed
@@ -32,7 +32,7 @@ #include "midyunit.h" #include "bootstrap.h" - +#include "inptport.h" /************************************* * @@ -246,26 +246,19 @@ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN | IPF_PLAYER1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT | IPF_PLAYER1 ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT | IPF_PLAYER1 ) - //PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER1 ) - //PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER1 ) - //PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER1 ) - //PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER1 ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER1 ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER1 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER1 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER1 ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER1 ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP | IPF_PLAYER2 ) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN | IPF_PLAYER2 ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT | IPF_PLAYER2 ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT | IPF_PLAYER2 ) - //PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER2 ) - //PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER2 ) - //PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER2 ) - //PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER2 ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 ) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER2 ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER2 ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER2 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER2 ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER2 ) PORT_START PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -654,7 +647,7 @@ PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER1, 20, 10, 0, 0xff) + PORT_ANALOG( 0x00ff, 0x0080, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER1, 35, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START @@ -674,7 +667,7 @@ PORT_DIPSETTING( 0x0008, "4" ) PORT_DIPSETTING( 0x0030, "ECA" ) PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play )) - PORT_DIPNAME( 0x0040, 0x0040, "Dipswitch Coinage" ) + PORT_DIPNAME( 0x0040, 0x0000, "Dipswitch Coinage" ) PORT_DIPSETTING( 0x0000, DEF_STR( Off )) PORT_DIPSETTING( 0x0040, DEF_STR( On )) PORT_DIPNAME( 0x0080, 0x0000, "Normal Display" ) @@ -710,15 +703,15 @@ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START - PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER1, 20, 10, 0, 0xff) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER1, 35, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER2, 20, 10, 0, 0xff) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER2, 35, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER2, 20, 10, 0, 0xff) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER2, 35, 10, 0, 0xff) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -729,28 +722,19 @@ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN | IPF_PLAYER1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT | IPF_PLAYER1 ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT | IPF_PLAYER1 ) - //PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER1 ) - //PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER1 ) - //PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER1 ) - //PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER1 ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER1 ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER1 ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER1 ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER1 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER1 ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER1 ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP | IPF_PLAYER2 ) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN | IPF_PLAYER2 ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT | IPF_PLAYER2 ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT | IPF_PLAYER2 ) - - //PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER2 ) - //PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER2 ) - //PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER2 ) - //PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER2 ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_PLAYER2 ) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 | IPF_PLAYER2 ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP | IPF_PLAYER2 ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN | IPF_PLAYER2 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT | IPF_PLAYER2 ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT | IPF_PLAYER2 ) PORT_START PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -998,7 +982,8 @@ static MACHINE_DRIVER_START( smashtv ) MDRV_IMPORT_FROM(yunit_cvsd_6bit) MDRV_VBLANK_DURATION(COMPUTED_VBLANK(256, 288, MKLA5_FPS)) - MDRV_VISIBLE_AREA(0, 409, 0, 255) + MDRV_VISIBLE_AREA(0, 399, 0, 254) + // MDRV_VISIBLE_AREA(0, 409, 0, 255) MACHINE_DRIVER_END @@ -1891,27 +1876,27 @@ GAMEC(1988, narc, 0, zunit, narc, narc, ROT0, "Williams", "Narc (rev 7.00)", &narc_ctrl, &narc_bootstrap ) GAMEC(1988, narc3, narc, zunit, narc, narc3, ROT0, "Williams", "Narc (rev 3.20)", &narc_ctrl, &narc3_bootstrap ) -GAME( 1990, trog, 0, trog, trog, trog, ROT0, "Midway", "Trog (rev LA4 03/11/91)" ) -GAME( 1990, trog3, trog, trog, trog, trog3, ROT0, "Midway", "Trog (rev LA3 02/14/91)" ) -GAME( 1990, trogpa6, trog, trog, trog, trogpa6, ROT0, "Midway", "Trog (rev PA6-PAC 09/09/90)" ) -GAME( 1990, trogp, trog, trog, trog, trogp, ROT0, "Midway", "Trog (prototype, rev 4.00 07/27/90)" ) -GAME( 1991, strkforc, 0, strkforc, strkforc,strkforc, ROT0, "Midway", "Strike Force (rev 1 02/25/91)" ) - -GAME( 1990, smashtv, 0, smashtv, smashtv, smashtv, ROT0, "Williams", "Smash T.V. (rev 8.00)" ) -GAME( 1990, smashtv6, smashtv, smashtv, smashtv, smashtv, ROT0, "Williams", "Smash T.V. (rev 6.00)" ) -GAME( 1990, smashtv5, smashtv, smashtv, smashtv, smashtv, ROT0, "Williams", "Smash T.V. (rev 5.00)" ) -GAME( 1990, smashtv4, smashtv, smashtv, smashtv, smashtv4, ROT0, "Williams", "Smash T.V. (rev 4.00)" ) -GAME( 1990, hiimpact, 0, hiimpact, trog, hiimpact, ROT0, "Williams", "High Impact Football (rev LA3 12/27/90)" ) -GAMEX(1991, shimpact, 0, hiimpact, trog, shimpact, ROT0, "Midway", "Super High Impact (rev LA1 09/30/91)", GAME_NOT_WORKING ) -GAMEX(1991, shimpacp, shimpact,hiimpact, trog, shimpacp, ROT0, "Midway", "Super High Impact (prototype, rev 5.0 09/15/91)", GAME_NOT_WORKING ) - -GAME( 1991, term2, 0, term2, term2, term2, ROT0, "Midway", "Terminator 2 - Judgment Day (rev LA3 03/27/92)" ) -GAME( 1991, term2la2, term2, term2, term2, term2la2, ROT0, "Midway", "Terminator 2 - Judgment Day (rev LA2 12/09/91)" ) -GAME( 1991, term2la1, term2, term2, term2, term2la1, ROT0, "Midway", "Terminator 2 - Judgment Day (rev LA1 11/01/91)" ) -GAME( 1992, mkprot9, mk, mk, mkla2, mkprot9, ROT0, "Midway", "Mortal Kombat (prototype, rev 9.0 07/28/92)" ) -GAME( 1992, mkla1, mk, mk, mkla2, mkla1, ROT0, "Midway", "Mortal Kombat (rev 1.0 08/08/92)" ) -GAME( 1992, mkla2, mk, mk, mkla2, mkla2, ROT0, "Midway", "Mortal Kombat (rev 2.0 08/18/92)" ) -GAME( 1992, mkla3, mk, mk, mkla4, mkla3, ROT0, "Midway", "Mortal Kombat (rev 3.0 08/31/92)" ) -GAME( 1992, mkla4, mk, mk, mkla4, mkla4, ROT0, "Midway", "Mortal Kombat (rev 4.0 09/28/92)" ) -GAME( 1992, totcarn, 0, totcarn, totcarn, totcarn, ROT0, "Midway", "Total Carnage (rev LA1 03/10/92)" ) -GAME( 1992, totcarnp, totcarn, totcarn, totcarn, totcarnp, ROT0, "Midway", "Total Carnage (prototype, rev 1.0 01/25/92)" ) +GAMEC( 1990, trog, 0, trog, trog, trog, ROT0, "Midway", "Trog (rev LA4 03/11/91)", &trog_ctrl, &trog_bootstrap ) +GAMEC( 1990, trog3, trog, trog, trog, trog3, ROT0, "Midway", "Trog (rev LA3 02/14/91)", &trog_ctrl, &trog3_bootstrap ) +GAMEC( 1990, trogpa6, trog, trog, trog, trogpa6, ROT0, "Midway", "Trog (rev PA6-PAC 09/09/90)", &trog_ctrl, &trogpa6_bootstrap ) +GAMEC( 1990, trogp, trog, trog, trog, trogp, ROT0, "Midway", "Trog (prototype, rev 4.00 07/27/90)", &trog_ctrl, &trogp_bootstrap ) +GAME ( 1991, strkforc, 0, strkforc, strkforc,strkforc, ROT0, "Midway", "Strike Force (rev 1 02/25/91)" ) + +GAMEC( 1990, smashtv, 0, smashtv, smashtv, smashtv, ROT0, "Williams", "Smash T.V. (rev 8.00)", &smashtv_ctrl, &smashtv_bootstrap ) +GAMEC( 1990, smashtv6, smashtv, smashtv, smashtv, smashtv, ROT0, "Williams", "Smash T.V. (rev 6.00)", &smashtv_ctrl, &smashtv6_bootstrap ) +GAMEC( 1990, smashtv5, smashtv, smashtv, smashtv, smashtv, ROT0, "Williams", "Smash T.V. (rev 5.00)", &smashtv_ctrl, &smashtv5_bootstrap ) +GAMEC( 1990, smashtv4, smashtv, smashtv, smashtv, smashtv4, ROT0, "Williams", "Smash T.V. (rev 4.00)", &smashtv_ctrl, &smashtv4_bootstrap ) +GAMEC( 1990, hiimpact, 0, hiimpact, trog, hiimpact, ROT0, "Williams", "High Impact Football (rev LA3 12/27/90)", &hiimpact_ctrl, &hiimpact_bootstrap ) +GAMEC( 1991, shimpact, 0, hiimpact, trog, shimpact, ROT0, "Midway", "Super High Impact (rev LA1 09/30/91)", &shimpact_ctrl, &shimpact_bootstrap ) +GAMEC( 1991, shimpacp, shimpact,hiimpact, trog, shimpacp, ROT0, "Midway", "Super High Impact (prototype, rev 5.0 09/15/91)", &shimpact_ctrl, &shimpacp_bootstrap ) + +GAMEC( 1991, term2, 0, term2, term2, term2, ROT0, "Midway", "Terminator 2 - Judgment Day (rev LA3 03/27/92)", &term2_ctrl, &term2_bootstrap ) +GAMEC( 1991, term2la2, term2, term2, term2, term2la2, ROT0, "Midway", "Terminator 2 - Judgment Day (rev LA2 12/09/91)", &term2_ctrl, &term2la2_bootstrap ) +GAMEC( 1991, term2la1, term2, term2, term2, term2la1, ROT0, "Midway", "Terminator 2 - Judgment Day (rev LA1 11/01/91)", &term2_ctrl, &term2la1_bootstrap ) +GAME ( 1992, mkprot9, mk, mk, mkla2, mkprot9, ROT0, "Midway", "Mortal Kombat (prototype, rev 9.0 07/28/92)" ) +GAME ( 1992, mkla1, mk, mk, mkla2, mkla1, ROT0, "Midway", "Mortal Kombat (rev 1.0 08/08/92)" ) +GAME ( 1992, mkla2, mk, mk, mkla2, mkla2, ROT0, "Midway", "Mortal Kombat (rev 2.0 08/18/92)" ) +GAME ( 1992, mkla3, mk, mk, mkla4, mkla3, ROT0, "Midway", "Mortal Kombat (rev 3.0 08/31/92)" ) +GAME ( 1992, mkla4, mk, mk, mkla4, mkla4, ROT0, "Midway", "Mortal Kombat (rev 4.0 09/28/92)" ) +GAMEC( 1992, totcarn, 0, totcarn, totcarn, totcarn, ROT0, "Midway", "Total Carnage (rev LA1 03/10/92)", &totcarn_ctrl, &totcarn_bootstrap ) +GAMEC( 1992, totcarnp, totcarn, totcarn, totcarn, totcarnp, ROT0, "Midway", "Total Carnage (prototype, rev 1.0 01/25/92)", &totcarn_ctrl, &totcarnp_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/mystwarr.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/mystwarr.c
Changed
@@ -32,6 +32,8 @@ #include "cpu/z80/z80.h" #include "machine/eeprom.h" #include "sound/k054539.h" +#include "bootstrap.h" +#include "inptport.h" VIDEO_START(gaiapols); VIDEO_START(dadandrn); @@ -1043,7 +1045,7 @@ PORT_DIPNAME( 0x20, 0x20, "Coin Mechanism") PORT_DIPSETTING( 0x20, "Common") PORT_DIPSETTING( 0x00, "Independant") - PORT_DIPNAME( 0x40, 0x40, "Number of Players") + PORT_DIPNAME( 0x40, 0x00, "Number of Players") PORT_DIPSETTING( 0x00, "4") PORT_DIPSETTING( 0x40, "2") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1111,7 +1113,7 @@ PORT_DIPNAME( 0x20, 0x20, "Coin Mechanism") PORT_DIPSETTING( 0x20, "Common") PORT_DIPSETTING( 0x00, "Independant") - PORT_DIPNAME( 0x40, 0x40, "Number of Players") + PORT_DIPNAME( 0x40, 0x00, "Number of Players") PORT_DIPSETTING( 0x00, "4") PORT_DIPSETTING( 0x40, "2") PORT_DIPNAME( 0x80, 0x80, "Continuous Energy Increment") @@ -1184,7 +1186,7 @@ PORT_DIPNAME( 0x40, 0x40, "Coin Mechanism") PORT_DIPSETTING( 0x40, "Common") PORT_DIPSETTING( 0x00, "Independant") - PORT_DIPNAME( 0x80, 0x80, "Number of Players") + PORT_DIPNAME( 0x80, 0x00, "Number of Players") PORT_DIPSETTING( 0x00, "3") PORT_DIPSETTING( 0x80, "2") @@ -1768,8 +1770,8 @@ ROM_START( dadandrn ) /* main program */ ROM_REGION( 0x400000, REGION_CPU1, 0 ) - ROM_LOAD16_BYTE( "170a07.24m", 0x000000, 0x80000, CRC(6a55e828) SHA1(06be9a45fdddcc826a33ff8d6eb595e11b98a31f) ) - ROM_LOAD16_BYTE( "170a09.19l", 0x000001, 0x80000, CRC(9e821cd8) SHA1(51e9c3b0a187db62cfcdff23ecaf3205f368f4e0) ) + ROM_LOAD16_BYTE( "170jaa07.24m", 0x000000, 0x80000, CRC(6a55e828) SHA1(06be9a45fdddcc826a33ff8d6eb595e11b98a31f) ) + ROM_LOAD16_BYTE( "170jaa09.19l", 0x000001, 0x80000, CRC(9e821cd8) SHA1(51e9c3b0a187db62cfcdff23ecaf3205f368f4e0) ) ROM_LOAD16_BYTE( "170a08.21m", 0x100000, 0x40000, CRC(03c59ba2) SHA1(041473fe5f9004bfb7ca767c2004154c27f726ff) ) ROM_LOAD16_BYTE( "170a10.17l", 0x100001, 0x40000, CRC(8a340909) SHA1(3e2ef2642e792cdc38b3442df67377ed9e70d3ab) ) @@ -1810,6 +1812,51 @@ ROM_LOAD("170a15.2m", 0x200000, 2*1024*1024, CRC(d4113ae9) SHA1(e234d06f462e3db64455c384c2f42174f9ef9c6a) ) ROM_END +ROM_START( mmaulers ) + /* main program */ + ROM_REGION( 0x400000, REGION_CPU1, 0 ) + ROM_LOAD16_BYTE( "170eaa07.24m", 0x000000, 0x80000, CRC(5458bd93) SHA1(d27a29076be3c745e3efdb1c528b07bd5d8aff1c) ) + ROM_LOAD16_BYTE( "170eaa09.19l", 0x000001, 0x80000, CRC(99c95c7b) SHA1(7f22930c2fe21205ccd01b80566d6bc31fea34d2) ) + ROM_LOAD16_BYTE( "170a08.21m", 0x100000, 0x40000, CRC(03c59ba2) SHA1(041473fe5f9004bfb7ca767c2004154c27f726ff) ) + ROM_LOAD16_BYTE( "170a10.17l", 0x100001, 0x40000, CRC(8a340909) SHA1(3e2ef2642e792cdc38b3442df67377ed9e70d3ab) ) + + /* sound program */ + ROM_REGION( 0x080000, REGION_CPU2, 0 ) + ROM_LOAD("170a13.9c", 0x000000, 0x40000, CRC(2ebf4d1c) SHA1(33a3f4153dfdc46cc223d216a17ef9428c09129d) ) + ROM_RELOAD( 0x010000, 0x040000 ) + + /* tiles */ + ROM_REGION( 0x600000, REGION_GFX1, ROMREGION_ERASE00 ) + ROM_LOADTILE_WORD( "170a16.2t", 0x000000, 1*1024*1024, CRC(41fee912) SHA1(73cf167ac9fc42cb8048a87b6c6d1c3c0ae3c2e2) ) + ROM_LOADTILE_WORD( "170a17.2x", 0x000002, 1*1024*1024, CRC(96957c91) SHA1(b12d356f8a015ec0984bdb86da9c569eb0c67880) ) + ROM_LOADTILE_BYTE( "170a24.5r", 0x000004, 512*1024, CRC(562ad4bd) SHA1(f55b29142ea39f090244f0945a56760bab25c7a7) ) + + /* sprites */ + ROM_REGION( 0xa00000, REGION_GFX2, ROMREGION_ERASE00 ) + ROM_LOAD64_WORD( "170a19.34u", 0x000000, 2*1024*1024, CRC(be835141) SHA1(b76e1da45bf602dd9eb30fb8b7181cea2e820c3d) ) + ROM_LOAD64_WORD( "170a21.34y", 0x000002, 2*1024*1024, CRC(bcb68136) SHA1(1d453f59d832b8ea99cf0a60a917edce5c1c90a0) ) + ROM_LOAD64_WORD( "170a18.36u", 0x000004, 2*1024*1024, CRC(e1e3c8d2) SHA1(2c94fcedd1dcef3d3332af358ae8a67dea507216) ) + ROM_LOAD64_WORD( "170a20.36y", 0x000006, 2*1024*1024, CRC(ccb4d88c) SHA1(064b4dab0ca6e5a1fa2fc2e9bbb19c7499830ee1) ) + ROM_LOAD16_BYTE( "170a23.29y", 0x800000, 1024*1024, CRC(6b5390e4) SHA1(0c5066bc86e782db4b64c2a604aed89ae99af005) ) + ROM_LOAD16_BYTE( "170a22.32y", 0x800001, 1024*1024, CRC(21628106) SHA1(1e025ff53caa5cbbf7695f8a77736d59f8a8af1b) ) + + /* K053536 roz plane */ + ROM_REGION( 0x180000, REGION_GFX3, 0 ) + ROM_LOAD( "170a04.33n", 0x000000, 0x80000, CRC(64b9a73b) SHA1(8b984bfd8bdf6d93ad223fca46a4f958a0edb2be) ) + ROM_LOAD( "170a05.30n", 0x080000, 0x80000, CRC(f2c101d0) SHA1(d80045c9a02db08ea6c851bdc12826862e11c381) ) + ROM_LOAD( "170a06.27n", 0x100000, 0x80000, CRC(b032e59b) SHA1(482300c683db20c2b2fc6e007b8f7e35373e3c00) ) + + /* K053936 tilemap data */ + ROM_REGION( 0x80000, REGION_GFX4, 0 ) + ROM_LOAD( "170a02.34j", 0x000000, 0x40000, CRC(b040cebf) SHA1(4d1ba4ee60fd7caf678837ec6f4d68fcbce1ccf2) ) + ROM_LOAD( "170a03.36m", 0x040000, 0x40000, CRC(7fb412b2) SHA1(f603a8f0becf88e345f4b7a68cf018962a255a1e) ) + + /* sound data */ + ROM_REGION( 0x400000, REGION_SOUND1, 0 ) + ROM_LOAD("170a14.2g", 0x000000, 2*1024*1024, CRC(83317cda) SHA1(c5398c5959ef3ea73835e13db69660dd28c31486) ) + ROM_LOAD("170a15.2m", 0x200000, 2*1024*1024, CRC(d4113ae9) SHA1(e234d06f462e3db64455c384c2f42174f9ef9c6a) ) +ROM_END + static void init_common(void) { unsigned char *s = memory_region(REGION_GFX1); @@ -1946,15 +1993,16 @@ /* ROM parent machine inp init */ -GAMEX( 1993, mystwarr, 0, mystwarr, mystwarr, mystwarr, ROT0, "Konami", "Mystic Warriors (Europe ver EAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, mystwaru, mystwarr, mystwarr, mystwarr, mystwarr, ROT0, "Konami", "Mystic Warriors (US ver UAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, dadandrn, 0, dadandrn, dadandrn, dadandrn, ROT0, "Konami", "Kyukyoku Sentai Dadandarn (Japan ver JAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, viostorm, 0, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (Europe ver EAB)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, viostrmu, viostorm, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (US ver UAB)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, viostrmj, viostorm, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (Japan ver JAC)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, viostrma, viostorm, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (Asia ver AAC)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, metamrph, 0, metamrph, metamrph, metamrph, ROT0, "Konami", "Metamorphic Force (US ver UAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, metamrpj, metamrph, metamrph, metamrph, metamrph, ROT0, "Konami", "Metamorphic Force (Japan ver JAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, mtlchamp, 0, martchmp, martchmp, martchmp, ROT0, "Konami", "Martial Champion (Europe ver EAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, mtlchmpj, mtlchamp, martchmp, martchmp, martchmp, ROT0, "Konami", "Martial Champion (Japan ver JAA)", GAME_IMPERFECT_GRAPHICS ) -GAMEX( 1993, gaiapols, 0, gaiapols, dadandrn, gaiapols, ROT90, "Konami", "Gaiapolis (Japan ver JAF)", GAME_IMPERFECT_GRAPHICS ) +GAMEX ( 1993, mystwarr, 0, mystwarr, mystwarr, mystwarr, ROT0, "Konami", "Mystic Warriors (Europe ver EAA)", GAME_IMPERFECT_GRAPHICS ) +GAMEX ( 1993, mystwaru, mystwarr, mystwarr, mystwarr, mystwarr, ROT0, "Konami", "Mystic Warriors (US ver UAA)", GAME_IMPERFECT_GRAPHICS ) +GAMECX( 1993, mmaulers, 0, dadandrn, dadandrn, dadandrn, ROT0, "Konami", "Monster Maulers (ver EAA)", GAME_IMPERFECT_GRAPHICS, &generic_ctrl, &mmaulers_bootstrap ) +GAMEX ( 1993, dadandrn, mmaulers, dadandrn, dadandrn, dadandrn, ROT0, "Konami", "Kyukyoku Sentai Dadandarn (Japan ver JAA)", GAME_IMPERFECT_GRAPHICS ) +GAMECX( 1993, viostorm, 0, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (Europe ver EAB)", GAME_IMPERFECT_GRAPHICS, &generic_ctrl, &viostorm_bootstrap ) +GAMEX ( 1993, viostrmu, viostorm, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (US ver UAB)", GAME_IMPERFECT_GRAPHICS ) +GAMECX( 1993, viostrmj, viostorm, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (Japan ver JAC)", GAME_IMPERFECT_GRAPHICS, &generic_ctrl, &viostrmj_bootstrap ) +GAMECX( 1993, viostrma, viostorm, viostorm, viostorm, viostorm, ROT0, "Konami", "Violent Storm (Asia ver AAC)", GAME_IMPERFECT_GRAPHICS, &generic_ctrl, &viostrma_bootstrap ) +GAMEX ( 1993, metamrph, 0, metamrph, metamrph, metamrph, ROT0, "Konami", "Metamorphic Force (US ver UAA)", GAME_IMPERFECT_GRAPHICS ) +GAMEX ( 1993, metamrpj, metamrph, metamrph, metamrph, metamrph, ROT0, "Konami", "Metamorphic Force (Japan ver JAA)", GAME_IMPERFECT_GRAPHICS ) +GAMEX ( 1993, mtlchamp, 0, martchmp, martchmp, martchmp, ROT0, "Konami", "Martial Champion (Europe ver EAA)", GAME_IMPERFECT_GRAPHICS ) +GAMEX ( 1993, mtlchmpj, mtlchamp, martchmp, martchmp, martchmp, ROT0, "Konami", "Martial Champion (Japan ver JAA)", GAME_IMPERFECT_GRAPHICS ) +GAMECX( 1993, gaiapols, 0, gaiapols, dadandrn, gaiapols, ROT90, "Konami", "Gaiapolis (Japan ver JAF)", GAME_IMPERFECT_GRAPHICS, &generic_ctrl, &gaiapols_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/namcos2.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/namcos2.c
Changed
@@ -450,6 +450,8 @@ #include "cpu/m6809/m6809.h" #include "namcoic.h" #include "artwork.h" +#include "bootstrap.h" +#include "inptport.h" /*************************************************************/ @@ -1148,9 +1150,9 @@ PORT_START /* Steering Wheel */ /* sensitivity, delta, min, max */ PORT_ANALOG( 0xff, 0x7f, IPT_DIAL|IPF_CENTER|IPF_PLAYER1, 75, 100, 0x00, 0xff ) PORT_START /* Brake Pedal */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER2, 100, 30, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL2, 100, 30, 0x00, 0xff ) PORT_START /* Accelerator Pedal */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER1, 100, 15, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL, 100, 15, 0x00, 0xff ) PORT_START /* 63B05Z0 - PORT H */ PORT_DIPNAME( 0x01, 0x01, "PortH 0x01") @@ -1212,9 +1214,9 @@ PORT_ANALOG( 0xff, 0x00, IPT_DIAL | IPF_PLAYER1, 50, 10, 0x00, 0xff ) PORT_START /* Brake Pedal */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER2, 100, 30, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL2, 100, 30, 0x00, 0xff ) PORT_START /* Accelerator Pedal */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER1, 100, 15, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL, 100, 15, 0x00, 0xff ) PORT_START /* 63B05Z0 - PORT H */ PORT_DIPNAME( 0x01, 0x01, "PortH 0x01") @@ -1299,9 +1301,9 @@ PORT_START /* Steering Wheel 7 */ /* sensitivity, delta, min, max */ PORT_ANALOG( 0xff, 0x7f, IPT_DIAL|IPF_CENTER|IPF_PLAYER1, 75, 100, 0x00, 0xff ) PORT_START /* Brake Pedal 8 */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER2, 100, 30, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL2, 100, 30, 0x00, 0xff ) PORT_START /* Accelerator Pedal 9 */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER1, 100, 15, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL, 100, 15, 0x00, 0xff ) PORT_START /* 63B05Z0 - PORT H */ PORT_DIPNAME( 0x01, 0x01, "PortH 0x01") @@ -1398,9 +1400,9 @@ PORT_START /* Steering Wheel */ PORT_ANALOG( 0xff, 0x7f, IPT_AD_STICK_X|IPF_PLAYER1, 50, 100, 0x00, 0xff ) PORT_START /* Brake pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL|IPF_PLAYER2, 100, 30, 0x00, 0x7f ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2, 100, 30, 0x00, 0x7f ) PORT_START /* Accelerator pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL|IPF_PLAYER1, 100, 15, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 15, 0x00, 0xff ) PORT_START /* 63B05Z0 - PORT H */ \ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1443,19 +1445,19 @@ PORT_START /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 0 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_ANALOG( 0xff, 0x00, IPT_LIGHTGUN_Y | IPF_PLAYER2, 50, 8, 0, 0xff ) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER2, 50, 8, 0, 0xff ) PORT_START - PORT_ANALOG( 0xff, 0x00, IPT_LIGHTGUN_Y, 50, 8, 0, 0xff ) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y, 50, 8, 0, 0xff ) PORT_START - PORT_ANALOG( 0xff, 0x00, IPT_LIGHTGUN_X | IPF_PLAYER2, 50, 8, 0, 0xff ) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X | IPF_PLAYER2, 50, 8, 0, 0xff ) PORT_START - PORT_ANALOG( 0xff, 0x00, IPT_LIGHTGUN_X, 50, 8, 0, 0xff ) + PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X, 50, 8, 0, 0xff ) PORT_START /* Steering Wheel */ - PORT_ANALOG( 0xff, 0x7f, IPT_DIAL|IPF_CENTER|IPF_PLAYER1, 100, 70, 0x00, 0xff ) + PORT_ANALOG( 0xff, 0x80, IPT_DIAL|IPF_CENTER, 100, 70, 0x00, 0x00 ) PORT_START /* Brake pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL|IPF_PLAYER2, 100, 30, 0x00, 0x7f ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL2, 100, 30, 0x00, 0x7f ) PORT_START /* Accelerator pedal */ - PORT_ANALOG( 0xff, 0x00, IPT_PEDAL|IPF_PLAYER1, 100, 15, 0x00, 0x7f ) + PORT_ANALOG( 0xff, 0x00, IPT_PEDAL, 100, 15, 0x00, 0x7f ) PORT_START /* 63B05Z0 - PORT H */ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1524,9 +1526,9 @@ PORT_START /* Steering Wheel */ PORT_ANALOG( 0xff, 0x7f, IPT_DIAL|IPF_CENTER|IPF_PLAYER1, 70, 50, 0x00, 0xff ) PORT_START /* Brake pedal */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER2, 100, 30, 0x00, 0x7f ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL2, 100, 30, 0x00, 0x7f ) PORT_START /* Accelerator pedal */ - PORT_ANALOG( 0xff, 0xff, IPT_PEDAL|IPF_PLAYER1, 100, 15, 0x00, 0x7f ) + PORT_ANALOG( 0xff, 0xff, IPT_PEDAL, 100, 15, 0x00, 0x7f ) PORT_START /* 63B05Z0 - PORT H */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -4441,7 +4443,7 @@ GAME( 1991, cosmognj, cosmogng, default, default, cosmogng, ROT90, "Namco", "Cosmo Gang the Video (Japan)" ) GAMEX(1992, finalap3, 0, finallap, finalap3, finalap3, ROT0, "Namco", "Final Lap 3 (Japan set 1)", GAME_IMPERFECT_GRAPHICS ) GAMEX(1992, finalp3a, finalap3, finallap, finalap3, finalap3, ROT0, "Namco", "Final Lap 3 (World)", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) -GAMEX(1992, luckywld, 0, luckywld, luckywld, luckywld, ROT0, "Namco", "Lucky & Wild",GAME_IMPERFECT_GRAPHICS ) +GAMECX(1992, luckywld, 0, luckywld, luckywld, luckywld, ROT0, "Namco", "Lucky & Wild",GAME_IMPERFECT_GRAPHICS, &generic_ctrl, &luckywld_bootstrap ) GAMEX(1992, suzuka8h, 0, luckywld, suzuka, suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (World?)", GAME_IMPERFECT_GRAPHICS ) GAMEX(1992, suzuk8hj, suzuka8h, luckywld, suzuka, suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (Japan)", GAME_IMPERFECT_GRAPHICS ) GAME( 1992, sws92, 0, default, default, sws92, ROT0, "Namco", "Super World Stadium '92 (Japan)" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/qix.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/qix.c
Changed
@@ -197,6 +197,7 @@ #include "vidhrdw/generic.h" #include "bootstrap.h" +#include "inptport.h" /* Constants */
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/rungun.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/rungun.c
Changed
@@ -48,6 +48,7 @@ #include "mame2003.h" #include "bootstrap.h" +#include "inptport.h" VIDEO_START( rng ); VIDEO_UPDATE( rng ); @@ -74,17 +75,6 @@ "0100110000000" /* unlock command */ }; -static const unsigned char bootstrap_nvram[] = { - 4, 20,251,235,146, 71, 69, 65, 65, 0, 21, 3, 7, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 0, 21, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; - static NVRAM_HANDLER( rungun ) { if (read_or_write) @@ -99,22 +89,9 @@ EEPROM_load(file); } else - { - log_cb(RETRO_LOG_INFO, "[MAME 2003] Generating bootstrap nvram for rungun"); - /* - I can't seem to get the Machine to accept nvram loaded directly from a byte array in memory. - Thus writing the data to a file and creating a valid read-mode mame_file (which the driver - wants to have) --markwkidd - */ - - file = mame_fopen(Machine->gamedrv->name, 0, FILETYPE_NVRAM, 1); - mame_fwrite(file, bootstrap_nvram, sizeof(bootstrap_nvram)); - mame_fclose(file); - - file = mame_fopen(Machine->gamedrv->name, 0, FILETYPE_NVRAM, 0); - init_eeprom_count = 0; - EEPROM_load(file); - } + { + init_eeprom_count = 10; + } } } @@ -422,7 +399,7 @@ PORT_DIPNAME( 0x10, 0x00, "Monitors" ) PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x10, "2" ) - PORT_DIPNAME( 0x20, 0x00, "Number of players" ) + PORT_DIPNAME( 0x20, 0x20, "Number of players" ) PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPNAME( 0x40, 0x00, "Sound Output" ) @@ -612,4 +589,4 @@ GAMECX( 1993, rungun, 0, rng, rng, rng, ROT0, "Konami", "Run and Gun (World ver. EAA)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND, &generic_ctrl, &rungun_bootstrap ) GAMECX( 1993, rungunu, rungun, rng, rng, rng, ROT0, "Konami", "Run and Gun (US ver. UAB)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND, &generic_ctrl, &rungunu_bootstrap ) -GAMEX( 1993, slmdunkj, rungun, rng, rng, rng, ROT0, "Konami", "Slam Dunk (Japan ver. JAA))", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND ) \ No newline at end of file +GAMEX( 1993, slmdunkj, rungun, rng, rng, rng, ROT0, "Konami", "Slam Dunk (Japan ver. JAA))", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS | GAME_IMPERFECT_SOUND )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/safarir.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/safarir.c
Changed
@@ -33,7 +33,6 @@ TODO: -- colors (8 colors originally, see game flyer screen shots) - SN76477 sound ****************************************************************************/ @@ -42,34 +41,26 @@ #include "vidhrdw/generic.h" -UINT8 *safarir_ram1, *safarir_ram2; -size_t safarir_ram_size; - -static UINT8 *safarir_ram; +static UINT8 *safarir_ram1, *safarir_ram2; +static size_t safarir_ram_size; +static UINT8 safarir_ram_bank; static struct tilemap *bg_tilemap, *fg_tilemap; WRITE_HANDLER( safarir_ram_w ) { - if (safarir_ram[offset] != data) - { - safarir_ram[offset] = data; + if (safarir_ram_bank) + safarir_ram2[offset] = data; + else + safarir_ram1[offset] = data; - if (offset < 0x400) - { - tilemap_mark_tile_dirty(fg_tilemap, offset); - } - else - { - tilemap_mark_tile_dirty(bg_tilemap, offset - 0x400); - } - } + tilemap_mark_tile_dirty((offset & 0x0400) ? bg_tilemap : fg_tilemap, offset & 0x03ff); } READ_HANDLER( safarir_ram_r ) { - return safarir_ram[offset]; + return safarir_ram_bank ? safarir_ram2[offset] : safarir_ram1[offset]; } WRITE_HANDLER( safarir_scroll_w ) @@ -79,23 +70,44 @@ WRITE_HANDLER( safarir_ram_bank_w ) { - safarir_ram = data ? safarir_ram1 : safarir_ram2; + safarir_ram_bank = data & 0x01; + tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); } static void get_bg_tile_info(int tile_index) { - int code = safarir_ram[tile_index + 0x400]; + int color; + UINT8 code = safarir_ram_r(tile_index | 0x400); + + if (code & 0x80) + color = 6; /* yellow */ + else + { + color = ((~tile_index & 0x04) >> 2) | ((tile_index & 0x04) >> 1); + + if (~tile_index & 0x100) + color |= ((tile_index & 0xc0) == 0x80) ? 1 : 0; + else + color |= (tile_index & 0xc0) ? 1 : 0; + } - SET_TILE_INFO(0, code & 0x7f, code >> 7, 0) + SET_TILE_INFO(0, code & 0x7f, color, 0) } static void get_fg_tile_info(int tile_index) { - int code = safarir_ram[tile_index]; - int flags = ((tile_index & 0x1d) && (tile_index & 0x1e)) ? 0 : TILE_IGNORE_TRANSPARENCY; + int color, flags; + UINT8 code = safarir_ram_r(tile_index); + + if (code & 0x80) + color = 7; /* white */ + else + color = (~tile_index & 0x04) | ((tile_index >> 1) & 0x03); - SET_TILE_INFO(1, code & 0x7f, code >> 7, flags) + flags = ((tile_index & 0x1f) >= 0x03) ? 0 : TILE_IGNORE_TRANSPARENCY; + + SET_TILE_INFO(1, code & 0x7f, color, flags) } VIDEO_START( safarir ) @@ -119,35 +131,114 @@ VIDEO_UPDATE( safarir ) { - tilemap_draw(bitmap, &Machine->visible_area, bg_tilemap, 0, 0); - tilemap_draw(bitmap, &Machine->visible_area, fg_tilemap, 0, 0); + tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); + tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); +} + + +/************************************* + * + * Audio system + * + *************************************/ + +#define SAMPLE_SOUND1_1 0 +#define SAMPLE_SOUND1_2 1 +#define SAMPLE_SOUND2 2 +#define SAMPLE_SOUND3 3 +#define SAMPLE_SOUND4_1 4 +#define SAMPLE_SOUND4_2 5 +#define SAMPLE_SOUND5_1 6 +#define SAMPLE_SOUND5_2 7 +#define SAMPLE_SOUND6 8 +#define SAMPLE_SOUND7 9 +#define SAMPLE_SOUND8 10 + +#define CHANNEL_SOUND1 0 +#define CHANNEL_SOUND2 1 +#define CHANNEL_SOUND3 2 +#define CHANNEL_SOUND4 3 +#define CHANNEL_SOUND5 4 +#define CHANNEL_SOUND6 5 + +static UINT8 port_last; +static UINT8 port_last2; + + +WRITE_HANDLER( safarir_audio_w ) +{ + UINT8 rising_bits = data & ~port_last; + + if (rising_bits == 0x12) sample_start(CHANNEL_SOUND1, SAMPLE_SOUND1_1, 0); + if (rising_bits == 0x02) sample_start(CHANNEL_SOUND1, SAMPLE_SOUND1_2, 0); + if (rising_bits == 0x95) sample_start(CHANNEL_SOUND1, SAMPLE_SOUND6, 0); + + if (rising_bits == 0x04 && (data == 0x15 || data ==0x16)) sample_start(CHANNEL_SOUND2, SAMPLE_SOUND2, 0); + + if (data == 0x5f && (rising_bits == 0x49 || rising_bits == 0x5f)) sample_start(CHANNEL_SOUND3, SAMPLE_SOUND3, 1); + if (data == 0x00 || rising_bits == 0x01) sample_stop(CHANNEL_SOUND3); + + if (data == 0x13) + { + if ((rising_bits == 0x13 && port_last != 0x04) || (rising_bits == 0x01 && port_last == 0x12)) + { + sample_start(CHANNEL_SOUND4, SAMPLE_SOUND7, 0); + } + else if (rising_bits == 0x03 && port_last2 == 0x15 && !sample_playing(CHANNEL_SOUND4)) + { + sample_start(CHANNEL_SOUND4, SAMPLE_SOUND4_1, 0); + } + } + if (data == 0x53 && port_last == 0x55) sample_start(CHANNEL_SOUND4, SAMPLE_SOUND4_2, 0); + + if (data == 0x1f && rising_bits == 0x1f) sample_start(CHANNEL_SOUND5, SAMPLE_SOUND5_1, 0); + if (data == 0x14 && (rising_bits == 0x14 || rising_bits == 0x04)) sample_start(CHANNEL_SOUND5, SAMPLE_SOUND5_2, 0); + + if (data == 0x07 && rising_bits == 0x07 && !sample_playing(CHANNEL_SOUND6)) + sample_start(CHANNEL_SOUND6, SAMPLE_SOUND8, 0); + + port_last2 = port_last; + port_last = data; } -static unsigned short colortable_source[] = +static const char *safarir_sample_names[] = +{ + "*safarir", + "sound1-1.wav", + "sound1-2.wav", + "sound2.wav", + "sound3.wav", + "sound4-1.wav", + "sound4-2.wav", + "sound5-1.wav", + "sound5-2.wav", + "sound6.wav", + "sound7.wav", + "sound8.wav", + 0 +}; + + +struct Samplesinterface safarir_samples_interface = { - 0x00, 0x01, - 0x00, 0x02, - 0x00, 0x03, - 0x00, 0x04, - 0x00, 0x05, - 0x00, 0x06, - 0x00, 0x07, + 6, /* 6 channels */ + 50, /* volume */ + safarir_sample_names }; + static PALETTE_INIT( safarir ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0x80, 0x80, 0x80); - palette_set_color(2, 0xff, 0xff, 0xff); - - palette_set_color(3, 0x00, 0x00, 0x00); - palette_set_color(4, 0x00, 0x00, 0x00); - palette_set_color(5, 0x00, 0x00, 0x00); - palette_set_color(6, 0x00, 0x00, 0x00); - palette_set_color(7, 0x00, 0x00, 0x00); - - memcpy(colortable, colortable_source, sizeof(colortable_source)); + int i; + + for (i = 0; i < Machine->drv->total_colors; i++) + { + palette_set_color(i, pal1bit(i >> 2), pal1bit(i >> 1), pal1bit(i >> 0)); + + colortable[(i * 2) + 0] = 0; + colortable[(i * 2) + 1] = i; + } } @@ -163,8 +254,7 @@ { 0x2000, 0x27ff, safarir_ram_w, &safarir_ram1, &safarir_ram_size }, { 0x2800, 0x28ff, safarir_ram_bank_w }, { 0x2c00, 0x2cff, safarir_scroll_w }, - { 0x3000, 0x30ff, MWA_NOP }, /* goes to SN76477 */ - + { 0x3000, 0x30ff, safarir_audio_w }, /* goes to SN76477 */ { 0x8000, 0x87ff, MWA_NOP, &safarir_ram2 }, /* only here to initialize pointer */ MEMORY_END @@ -218,8 +308,8 @@ static struct GfxDecodeInfo gfxdecodeinfo[] = { - { REGION_GFX1, 0, &charlayout, 0, 2 }, - { REGION_GFX2, 0, &charlayout, 0, 2 }, + { REGION_GFX1, 0, &charlayout, 0, 8 }, + { REGION_GFX2, 0, &charlayout, 0, 8 }, { -1 } /* end of array */ }; @@ -246,10 +336,11 @@ { 0 /* N/C */} /* 24 oneshot_res */ }; + static MACHINE_DRIVER_START( safarir ) /* basic machine hardware */ - MDRV_CPU_ADD(8080, 3072000) /* 3 MHz ? */ + MDRV_CPU_ADD(8080, 18000000/8) /* 2.25 MHz ? */ MDRV_CPU_MEMORY(readmem, writemem) MDRV_FRAMES_PER_SECOND(60) @@ -261,14 +352,14 @@ MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 26*8-1) MDRV_GFXDECODE(gfxdecodeinfo) MDRV_PALETTE_LENGTH(8) - MDRV_COLORTABLE_LENGTH(2*7) + MDRV_COLORTABLE_LENGTH(2*8) MDRV_PALETTE_INIT(safarir) MDRV_VIDEO_START(safarir) MDRV_VIDEO_UPDATE(safarir) /* sound hardware */ - MDRV_SOUND_ADD(SN76477, safarir_sn76477_interface) + MDRV_SOUND_ADD(SAMPLES, safarir_samples_interface) MACHINE_DRIVER_END /*************************************************************************** @@ -286,18 +377,22 @@ ROM_LOAD( "rl05", 0x1000, 0x0400, CRC(935ed469) SHA1(052a59df831dcc2c618e9e5e5fdfa47548550596) ) ROM_LOAD( "rl06", 0x1400, 0x0400, CRC(24c1cd42) SHA1(fe32ecea77a3777f8137ca248b8f371db37b8b85) ) - ROM_REGION( 0x0400, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_REGION( 0x0400, REGION_GFX1, 0 ) ROM_LOAD( "rl08", 0x0000, 0x0400, CRC(d6a50aac) SHA1(0a0c2cefc556e4e15085318fcac485b82bac2416) ) - ROM_REGION( 0x0400, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_REGION( 0x0400, REGION_GFX2, 0 ) ROM_LOAD( "rl07", 0x0000, 0x0400, CRC(ba525203) SHA1(1c261cc1259787a7a248766264fefe140226e465) ) ROM_END DRIVER_INIT( safarir ) { - safarir_ram = safarir_ram1; + safarir_ram1 = auto_malloc(safarir_ram_size); + safarir_ram2 = auto_malloc(safarir_ram_size); + + port_last = 0; + port_last2 = 0; } -GAMEX( 1979, safarir, 0, safarir, safarir, safarir, ROT90, "SNK", "Safari Rally (Japan)", GAME_NO_SOUND | GAME_WRONG_COLORS ) +GAMEX( 1979, safarir, 0, safarir, safarir, safarir, ROT90, "SNK", "Safari Rally (Japan)", GAME_IMPERFECT_SOUND )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/sbowling.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/sbowling.c
Changed
@@ -6,7 +6,7 @@ Todo: - analog sound - - colors + - horizontal sprite positioning when screen is flipped *********************************************************** @@ -59,18 +59,19 @@ SET_TILE_INFO(0, tileno, 0, 0) } -static void plot_pixel_sbw(int x, int y, int col) +static void plot_pixel_sbw(int x, int y, int col, int flip) { - if (flip_screen) + if (flip) { - y = 255-y; - x = 247-x; + y = 255 - y; + x = 255 - x; } plot_pixel(tmpbitmap,x,y,Machine->pens[col]); } static WRITE_HANDLER( sbw_videoram_w ) { + int flip = flip_screen; int x,y,i,v1,v2; videoram[offset] = data; @@ -82,10 +83,10 @@ v1 = videoram[offset]; v2 = videoram[offset+0x2000]; - - for(i = 0; i < 8; i++) + + for (i = 0; i < 8; i++) { - plot_pixel_sbw(x++, y, color_prom_address | ( ((v1&1)*0x20) | ((v2&1)*0x40) ) ); + plot_pixel_sbw(x++, y, color_prom_address | ( ((v1&1)*0x20) | ((v2&1)*0x40) ), flip); v1 >>= 1; v2 >>= 1; } @@ -139,6 +140,7 @@ static WRITE_HANDLER (system_w) { + int offs; /* 76543210 -------x flip screen/controls? @@ -146,14 +148,11 @@ -----x-- 1 ? ----x--- flip screen/controls */ - flip_screen_set(data&1); + flip_screen_set(BIT(data, 3)); + + for (offs = 0; offs < 0x4000; offs++) + sbw_videoram_w(offs, videoram[offs]); - if((sbw_system^data)&1) - { - int offs; - for (offs = 0;offs < videoram_size; offs++) - sbw_videoram_w(offs, videoram[offs]); - } sbw_system = data; } @@ -218,54 +217,76 @@ INPUT_PORTS_START( sbowling ) PORT_START + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_TILT ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_TILT ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_COCKTAIL ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 ) - + PORT_START PORT_ANALOG( 0xff, 0, IPT_TRACKBALL_Y, 30, 30, 0, 0) PORT_START PORT_ANALOG( 0xff, 0, IPT_TRACKBALL_X|IPF_REVERSE, 30, 30, 0, 0) - - PORT_START /* coin slots: A 4 LSB, B 4 MSB */ - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START /* coin slots: A 4 LSB, B 4 MSB */ + PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) + PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) + PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 6C_1C ) ) + PORT_DIPSETTING( 0x0b, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x09, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) ) + + PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) ) + PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) ) + PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 6C_1C ) ) + PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0xa0, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x90, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) PORT_START - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x01, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Year Display" ) + PORT_DIPNAME( 0x04, 0x00, "Year Display" ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) @@ -277,7 +298,7 @@ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, "Ball Controll Check" ) + PORT_DIPNAME( 0x40, 0x00, "Ball Control Check" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x00, "Video Test" ) @@ -288,9 +309,9 @@ static struct GfxLayout charlayout = { 8,8, - 256, + RGN_FRAC(1,3), 3, - { 0x800*0*8, 0x800*1*8, 0x800*2*8 }, + { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, { 7, 6, 5, 4, 3, 2, 1, 0 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 @@ -320,12 +341,13 @@ const int resistances_rg[3] = { 470, 270, 100 }; const int resistances_b[2] = { 270, 100 }; - double weights_r[3], weights_g[3], weights_b[2]; + double outputs_r[1<<3], outputs_g[1<<3], outputs_b[1<<2]; - compute_resistor_weights(0, 255, -1.0, - 3, resistances_rg, weights_r, 0, 100, - 3, resistances_rg, weights_g, 0, 100, - 2, resistances_b, weights_b, 0, 100); + /* the game uses output collector PROMs type: NEC B406 */ + compute_resistor_net_outputs(0, 255, -1.0, + 3, resistances_rg, outputs_r, 0, 100, + 3, resistances_rg, outputs_g, 0, 100, + 2, resistances_b, outputs_b, 0, 100); for (i = 0;i < Machine->drv->total_colors;i++) { @@ -334,19 +356,19 @@ /* blue component */ bit0 = (color_prom[i] >> 0) & 0x01; bit1 = (color_prom[i] >> 1) & 0x01; - b = combine_2_weights(weights_b, bit0, bit1); + b = (int)(outputs_b[ (bit0<<0) | (bit1<<1) ] + 0.5); /* green component */ bit0 = (color_prom[i] >> 2) & 0x01; bit1 = (color_prom[i] >> 3) & 0x01; bit2 = (color_prom[i+0x400] >> 0) & 0x01; - g = combine_3_weights(weights_g, bit0, bit1, bit2); + g = (int)(outputs_g[ (bit0<<0) | (bit1<<1) | (bit2<<2) ] + 0.5); /* red component */ bit0 = (color_prom[i+0x400] >> 1) & 0x01; bit1 = (color_prom[i+0x400] >> 2) & 0x01; bit2 = (color_prom[i+0x400] >> 3) & 0x01; - r = combine_3_weights(weights_r, bit0, bit1, bit2); + r = (int)(outputs_r[ (bit0<<0) | (bit1<<1) | (bit2<<2) ] + 0.5); palette_set_color(i,r,g,b); } @@ -392,5 +414,4 @@ ROM_LOAD( "kb09.6m", 0x0400, 0x0400, CRC(e29191a6) SHA1(9a2c78a96ef6d118f4dacbea0b7d454b66a452ae)) ROM_END -GAMEX( 1982, sbowling, 0, sbowling, sbowling, 0, ROT90, "Taito Corporation", "Strike Bowling",GAME_IMPERFECT_SOUND|GAME_IMPERFECT_COLORS) - +GAMEX( 1982, sbowling, 0, sbowling, sbowling, 0, ROT90, "Taito Corporation", "Strike Bowling", GAME_IMPERFECT_SOUND )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/scramble.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/scramble.c
Changed
@@ -1104,9 +1104,9 @@ INPUT_PORTS_START( sfx ) PORT_START /* IN0 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_PLAYER2 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) // "Fire" left + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 ) /* "Fire" left*/ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) // "Fire" right + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 ) /* "Fire" right*/ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) @@ -1118,8 +1118,8 @@ PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x00, "5" ) PORT_BITX( 0, 0x03, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Invulnerability", IP_KEY_NONE, IP_JOY_NONE ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) // "Fire" left - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) // "Fire" right + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) /* "Fire" left*/ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 ) /* "Fire" right*/ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_PLAYER2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 ) @@ -1197,6 +1197,7 @@ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 /* every char takes 8 consecutive bytes */ }; + static struct GfxLayout devilfsh_spritelayout = { 16,16, /* 16*16 sprites */ @@ -1209,22 +1210,24 @@ 16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 }, 32*8 /* every sprite takes 32 consecutive bytes */ }; + static struct GfxLayout newsin7_charlayout = { 8,8, /* 8*8 characters */ 256, /* 256 characters */ 3, /* 3 bits per pixel */ - { 0, 2*256*8*8, 2*2*256*8*8 }, /* the bitplanes are separated */ + { 2*2*256*8*8, 0, 2*256*8*8 }, /* the bitplanes are separated */ { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 /* every char takes 8 consecutive bytes */ }; + static struct GfxLayout newsin7_spritelayout = { 16,16, /* 16*16 sprites */ 64, /* 64 sprites */ 3, /* 3 bits per pixel */ - { 0, 2*64*16*16, 2*2*64*16*16 }, /* the bitplanes are separated */ + { 2*2*64*16*16, 0, 2*64*16*16 }, /* the bitplanes are separated */ { 0, 1, 2, 3, 4, 5, 6, 7, 8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, @@ -1242,6 +1245,7 @@ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 16*8 }; + static struct GfxLayout mrkougar_spritelayout = { 16,16, @@ -1265,6 +1269,7 @@ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 /* every char takes 8 consecutive bytes */ }; + static struct GfxLayout sfx_spritelayout = { 16,16, /* 16*16 sprites */ @@ -2163,7 +2168,7 @@ GAME( 1981, ckongs, ckong, ckongs, ckongs, ckongs, ROT90, "bootleg", "Crazy Kong (Scramble hardware)" ) GAME( 1981, mars, 0, mars, mars, mars, ROT90, "Artic", "Mars" ) GAME( 1982, devilfsh, 0, devilfsh, devilfsh, devilfsh, ROT90, "Artic", "Devil Fish" ) -GAMEX(1983, newsin7, 0, newsin7, newsin7, mars, ROT90, "ATW USA, Inc.", "New Sinbad 7", GAME_IMPERFECT_COLORS ) +GAME( 1983, newsin7, 0, newsin7, newsin7, mars, ROT90, "ATW USA, Inc.", "New Sinbad 7" ) GAME( 1984, mrkougar, 0, mrkougar, mrkougar, mrkougar, ROT90, "ATW", "Mr. Kougar" ) GAME( 1983, mrkougr2, mrkougar, mrkougar, mrkougar, mrkougar, ROT90, "ATW", "Mr. Kougar (earlier)" ) GAME( 1983, mrkougb, mrkougar, mrkougb, mrkougar, mrkougb, ROT90, "bootleg", "Mr. Kougar (bootleg)" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/seattle.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/seattle.c
Changed
@@ -39,6 +39,8 @@ #include "machine/idectrl.h" #include "machine/midwayic.h" #include "vidhrdw/voodoo.h" +#include "bootstrap.h" +#include "inptport.h" #define TIMER_CLOCK TIME_IN_HZ(50000000) @@ -92,8 +94,8 @@ if (mame_find_cpu_index("dcs2") != -1) { - dcs_reset_w(1); dcs_reset_w(0); + dcs_reset_w(1); } else if (mame_find_cpu_index("cage") != -1) { @@ -2280,4 +2282,4 @@ GAME ( 1997, blitz, 0, seattle150, blitz, blitz, ROT0, "Midway Games", "NFL Blitz" ) GAME ( 1998, blitz99, 0, seattle150, blitz99, blitz99, ROT0, "Midway Games", "NFL Blitz '99" ) GAME ( 1999, blitz2k, 0, seattle150, blitz99, blitz2k, ROT0, "Midway Games", "NFL Blitz 2000" ) -GAME ( 1998, carnevil, 0, carnevil, carnevil, carnevil, ROT0, "Midway Games", "CarnEvil" ) +GAMEC( 1998, carnevil, 0, carnevil, carnevil, carnevil, ROT0, "Midway Games", "CarnEvil", &carnevil_ctrl, &carnevil_bootstrap )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/senjyo.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/senjyo.c
Changed
@@ -4,9 +4,6 @@ driver by Mirko Buffoni -TODO: -- wrong background colors in baluba, intermissions after round 13 - This board was obviously born to run Senjyo. Four scrolling layers, gradient background, sprite/background priorities, and even a small bitmap for the @@ -89,6 +86,7 @@ WRITE_HANDLER( senjyo_bg3videoram_w ); WRITE_HANDLER( senjyo_bgstripes_w ); + DRIVER_INIT( starforc ); DRIVER_INIT( starfore ); DRIVER_INIT( senjyo ); @@ -135,7 +133,20 @@ flip_screen_set(data); } +static WRITE_HANDLER( senjyo_paletteram_w ) +{ + int r = (data << 2) & 0x0c; + int g = (data ) & 0x0c; + int b = (data >> 2) & 0x0c; + int i = (data >> 6) & 0x03; + int rr = r | ((r != 0) ? i : 0); + int gg = g | ((g != 0) ? i : 0); + int bb = b | ((b != 0) ? i : 0); + + paletteram[offset] = data; + palette_set_color(offset, pal4bit(rr), pal4bit(gg), pal4bit(bb) ); +} static MEMORY_READ_START( readmem ) { 0x0000, 0x7fff, MRA_ROM }, @@ -160,7 +171,7 @@ { 0x9000, 0x93ff, senjyo_fgvideoram_w, &senjyo_fgvideoram }, { 0x9400, 0x97ff, senjyo_fgcolorram_w, &senjyo_fgcolorram }, { 0x9800, 0x987f, MWA_RAM, &spriteram, &spriteram_size }, - { 0x9c00, 0x9d8f, paletteram_IIBBGGRR_w, &paletteram }, + { 0x9c00, 0x9d8f, senjyo_paletteram_w, &paletteram }, { 0x9e00, 0x9e1f, MWA_RAM, &senjyo_fgscroll }, { 0x9e20, 0x9e21, MWA_RAM, &senjyo_scrolly3 }, /* { 0x9e22, 0x9e23, height of the layer (Senjyo only, fixed at 0x380) */ @@ -800,4 +811,4 @@ GAME( 1984, starforc, 0, senjyo, starforc, starforc, ROT90, "Tehkan", "Star Force" ) GAME( 1984, starfore, starforc, senjyo, starforc, starfore, ROT90, "Tehkan", "Star Force (encrypted)" ) GAME( 1985, megaforc, starforc, senjyo, starforc, starforc, ROT90, "Tehkan (Video Ware license)", "Mega Force" ) -GAMEX(1986, baluba, 0, senjyo, baluba, starforc, ROT90, "Able Corp, Ltd.", "Baluba-louk no Densetsu", GAME_IMPERFECT_COLORS ) +GAME( 1986, baluba, 0, senjyo, baluba, starforc, ROT90, "Able Corp, Ltd.", "Baluba-louk no Densetsu" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/seta.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/seta.c
Changed
@@ -5636,7 +5636,7 @@ PORT_DIPSETTING( 0x0010, "2" ) PORT_DIPSETTING( 0x0030, "3" ) PORT_DIPSETTING( 0x0020, "5" ) - PORT_DIPNAME( 0x0040, 0x0040, "Max Players" ) + PORT_DIPNAME( 0x0040, 0x0000, "Max Players" ) PORT_DIPSETTING( 0x0040, "2" ) PORT_DIPSETTING( 0x0000, "4" ) PORT_DIPNAME( 0x0080, 0x0080, "Unknown 1-7*" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/sharrier.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/sharrier.c
Changed
@@ -7,12 +7,226 @@ ** Space Harrier */ +/* +03/11/04 Charles MacDonald +Various Hang-On fixes: +- Fixed sprite RAM size. +- Fixed tile RAM size. +- Fixed 2nd 68000 work RAM size, passes RAM test. +- Fixed visibility of 2nd 68000 ROM to 1st 68000, passes ROM test. +- Fixed access to road RAM and shared RAM by both CPUs. +- Cleaned up input management, now entering test mode does not crash + MAME, there are no specific control hacks for the name entry screen, + and the ROM patches are no longer needed. + +To do: +- Missing color bars in CRT tests +- Proper Enduro Racer and Space Harrier inputs +*/ + #include "driver.h" #include "vidhrdw/generic.h" #include "cpu/z80/z80.h" #include "cpu/i8039/i8039.h" #include "system16.h" +/* + Hang-On I/O hardware +*/ + +static int latched_analog_input; /* Selected input to read with ADC */ +static int ppi_reg[2][4]; /* PPI registers */ + +static WRITE16_HANDLER( hangon_io_w ) +{ + if( ACCESSING_LSB ) + { + switch( offset & 0x003020/2 ) + { + case 0x0000: /* PPI @ 4B */ + switch( offset & 0x07) + { + case 0x00: /* Port A : Z80 sound command */ + ppi_reg[0][0] = data; + soundlatch_w(0, data & 0xff); + cpu_set_nmi_line(1, PULSE_LINE); + return; + + case 0x01: /* Port B : Miscellaneous outputs */ + ppi_reg[0][1] = data; + + /* D7 : FLIPC (1= flip screen, 0= normal orientation) */ + /* D6 : SHADE0 (1= highlight, 0= shadow) */ + /* D4 : /KILL (1= screen on, 0= screen off) */ + sys16_refreshenable = data & 0x10; + + /* D3 : LAMP2 */ + set_led_status(1, data & 0x08); + + /* D2 : LAMP1 */ + set_led_status(0, data & 0x04); + + /* D1 : COIN2 */ + coin_counter_w(1, data & 0x02); + + /* D0 : COIN1 */ + coin_counter_w(0, data & 0x01); + return; + + case 0x02: /* Port C : Tilemap origin and audio mute */ + ppi_reg[0][2] = data; + + /* D2 : SCONT1 - Tilemap origin bit 1 */ + /* D1 : SCONT0 - Tilemap origin bit 0 */ + /* D0 : MUTE (1= audio on, 0= audio off) */ + + /* Not used */ + return; + + case 0x03: /* PPI control register */ + ppi_reg[0][3] = data; + return; + } + break; + + case 0x3000/2: /* PPI @ 4C */ + switch( offset & 0x07) + { + case 0x00: /* Port A : S.CPU control and ADC channel select */ + ppi_reg[1][0] = data; + +#if 0 /* Not sure this is correct */ + + /* To S.RES of second CPU */ + if(data & 0x20) + cpu_set_reset_line(2, CLEAR_LINE); + else + cpu_set_reset_line(2, ASSERT_LINE); + + /* To S.INT of second CPU */ + if(data & 0x10) + cpu_set_irq_line(2, 1, HOLD_LINE); + else + cpu_set_irq_line(2, 1, CLEAR_LINE); +#endif + return; + + case 0x01: /* Port B : High-current outputs */ + ppi_reg[1][1] = data; + /* Not used */ + return; + + case 0x02: /* Port C : LED driver control (?) */ + ppi_reg[1][2] = data; + /* Not used */ + return; + + case 0x03: /* PPI control register */ + ppi_reg[1][3] = data; + return; + } + break; + + case 0x3020/2: /* ADC0804 */ + switch(ppi_reg[1][0] & 0x0C) + { + case 0x00: /* "ANGLE" */ + latched_analog_input = readinputport(0); + return; + + case 0x04: /* "ACCEL" */ + latched_analog_input = readinputport(1); + return; + + case 0x08: /* "BRAKE" */ + latched_analog_input = readinputport(5); + return; + + case 0x0C: /* Not used */ + latched_analog_input = 0; + return; + } + break; + } + } +} + +static READ16_HANDLER( hangon_io_r ) +{ + switch( offset & 0x003020/2 ) + { + case 0x0000: /* PPI @ 4B */ + switch( offset & 0x07) + { + case 0x00: /* Port A : Z80 sound command */ + /* + Bidirectional port, but Z80 only ever reads data written + by the main 68000. + */ + return 0xFF; + + case 0x01: /* Port B */ + return ppi_reg[0][1]; + + case 0x02: /* Port C */ + return ppi_reg[0][2]; + + case 0x03: /* PPI control register */ + return ppi_reg[0][3]; + } + break; + + case 0x1000/2: /* Input ports and DIP switches */ + switch( offset & 0x0F ) + { + case 0x00: /* Input port #0 */ + return readinputport(2); + + case 0x01: /* Input port #1 */ + /* Not used */ + return 0xFF; + + case 0x04: /* DIP switch A */ + return readinputport(3); + + case 0x06: /* DIP switch B */ + return readinputport(4); + } + break; + + case 0x3000/2: /* PPI @ 4C */ + switch( offset & 0x07) + { + case 0x00: /* Port A */ + return ppi_reg[1][0]; + + case 0x01: /* Port B */ + return ppi_reg[1][1]; + + case 0x02: /* Port C : ADC status */ + /* + D7 = 0 (left open) + D6 = /INTR of ADC0804 + D5 = 0 (left open) + D4 = 0 (left open) + + We leave /INTR low to indicate converted data is + always ready to be read. + */ + return (ppi_reg[1][2] & 0x0F); + + case 0x03: /* PPI control register */ + return ppi_reg[1][3]; + } + break; + + case 0x3020/2: /* ADC0804 data output */ + return latched_analog_input; + } + + return -1; +} + /***************************************************************************/ static void generate_gr_screen( @@ -169,21 +383,30 @@ } #endif +/* + Hang-On shared road RAM and 68000 #2 work RAM +*/ -static READ16_HANDLER( ho_io_x_r ){ return input_port_0_r( offset ); } -static READ16_HANDLER( ho_io_y_r ){ return (input_port_1_r( offset ) << 8) + input_port_5_r( offset ); } +data16_t *hangon_roadram; +data16_t *hangon_sharedram; -static READ16_HANDLER( ho_io_highscoreentry_r ){ - int mode= sys16_extraram4[0x3000/2]; - if( mode&4 ){ // brake - if(ho_io_y_r(0,0) & 0x00ff) return 0xffff; - } - else if( mode&8 ){ // button - if(ho_io_y_r(0,0) & 0xff00) return 0xffff; - } - return 0; +static READ16_HANDLER( hangon_sharedram_r ) { + return hangon_sharedram[offset]; +} + +static WRITE16_HANDLER( hangon_sharedram_w ) { + COMBINE_DATA( hangon_sharedram + offset ); +} + +static READ16_HANDLER( hangon_roadram_r ) { + return hangon_roadram[offset]; +} + +static WRITE16_HANDLER( hangon_roadram_w ) { + COMBINE_DATA( hangon_roadram + offset ); } + static READ16_HANDLER( hangon1_skip_r ){ if (activecpu_get_pc()==0x17e6) {cpu_spinuntil_int(); return 0xffff;} return sys16_extraram[0x0400/2]; @@ -193,53 +416,45 @@ { 0x000000, 0x03ffff, MRA16_ROM }, { 0x20c400, 0x20c401, hangon1_skip_r }, { 0x20c000, 0x20ffff, SYS16_MRA16_EXTRAM }, - { 0x400000, 0x40ffff, SYS16_MRA16_TILERAM }, + { 0x400000, 0x403fff, SYS16_MRA16_TILERAM }, { 0x410000, 0x410fff, SYS16_MRA16_TEXTRAM }, - { 0x600000, 0x600fff, SYS16_MRA16_SPRITERAM }, + { 0x600000, 0x6007ff, SYS16_MRA16_SPRITERAM }, { 0xa00000, 0xa00fff, SYS16_MRA16_PALETTERAM }, - { 0xc68000, 0xc68fff, SYS16_MRA16_EXTRAM2 }, - { 0xc7e000, 0xc7ffff, SYS16_MRA16_EXTRAM3 }, - { 0xe00002, 0xe00003, sys16_coinctrl_r }, - { 0xe01000, 0xe01001, input_port_2_word_r }, // service - { 0xe0100c, 0xe0100d, input_port_4_word_r }, // dip2 - { 0xe0100a, 0xe0100b, input_port_3_word_r }, // dip1 - { 0xe03020, 0xe03021, ho_io_highscoreentry_r }, - { 0xe03028, 0xe03029, ho_io_x_r }, - { 0xe0302a, 0xe0302b, ho_io_y_r }, + { 0xc00000, 0xc0ffff, SYS16_CPU3ROM16_r }, + { 0xc68000, 0xc68fff, hangon_roadram_r }, + { 0xc7c000, 0xc7ffff, hangon_sharedram_r }, + { 0xe00000, 0xffffff, hangon_io_r }, MEMORY_END static MEMORY_WRITE16_START( hangon_writemem ) { 0x000000, 0x03ffff, MWA16_ROM }, { 0x20c000, 0x20ffff, SYS16_MWA16_EXTRAM }, - { 0x400000, 0x40ffff, SYS16_MWA16_TILERAM }, + { 0x400000, 0x403fff, SYS16_MWA16_TILERAM }, { 0x410000, 0x410fff, SYS16_MWA16_TEXTRAM }, - { 0x600000, 0x600fff, SYS16_MWA16_SPRITERAM }, + { 0x600000, 0x6007ff, SYS16_MWA16_SPRITERAM }, { 0xa00000, 0xa00fff, SYS16_MWA16_PALETTERAM }, - { 0xc68000, 0xc68fff, SYS16_MWA16_EXTRAM2 }, - { 0xc7e000, 0xc7ffff, SYS16_MWA16_EXTRAM3 }, - { 0xe00000, 0xe00001, sound_command_nmi_w }, - { 0xe00002, 0xe00003, sys16_3d_coinctrl_w }, - { 0xe00004, 0xe00005, MWA16_NOP }, /* ? */ - { 0xe02000, 0xe02001, MWA16_NOP }, /* ? */ - { 0xe03000, 0xe03001, MWA16_NOP }, /* ? */ + { 0xc00000, 0xc3ffff, MWA16_NOP }, + { 0xc68000, 0xc68fff, hangon_roadram_w, &hangon_roadram }, + { 0xc7c000, 0xc7ffff, hangon_sharedram_w, &hangon_sharedram }, + { 0xe00000, 0xffffff, hangon_io_w }, MEMORY_END static READ16_HANDLER( hangon2_skip_r ){ if (activecpu_get_pc()==0xf66) {cpu_spinuntil_int(); return 0xffff;} - return sys16_extraram3[0x01000/2]; + return hangon_sharedram[0x01000/2]; } static MEMORY_READ16_START( hangon_readmem2 ) { 0x000000, 0x03ffff, MRA16_ROM }, { 0xc7f000, 0xc7f001, hangon2_skip_r }, - { 0xc68000, 0xc68fff, SYS16_MRA16_EXTRAM2 }, - { 0xc7e000, 0xc7ffff, SYS16_MRA16_EXTRAM3 }, + { 0xc68000, 0xc68fff, hangon_roadram_r }, + { 0xc7c000, 0xc7ffff, hangon_sharedram_r }, MEMORY_END static MEMORY_WRITE16_START( hangon_writemem2 ) - { 0x000000, 0x03ffff, MWA16_ROM }, - { 0xc68000, 0xc68fff, SYS16_MWA16_EXTRAM2 }, - { 0xc7e000, 0xc7ffff, SYS16_MWA16_EXTRAM3 }, + { 0x000000, 0x03ffff, MWA16_ROM }, + { 0xc68000, 0xc68fff, hangon_roadram_w }, + { 0xc7c000, 0xc7ffff, hangon_sharedram_w }, MEMORY_END static MEMORY_READ_START( hangon_sound_readmem ) @@ -269,11 +484,11 @@ /***************************************************************************/ static void hangon_update_proc( void ){ - set_page( sys16_bg_page, sys16_textram[0x74e] ); - set_page( sys16_fg_page, sys16_textram[0x74f] ); + set_page( sys16_bg_page, sys16_textram[0x74e] & 0x3333 ); + set_page( sys16_fg_page, sys16_textram[0x74f] & 0x3333 ); sys16_fg_scrollx = sys16_textram[0x7fc] & 0x01ff; sys16_bg_scrollx = sys16_textram[0x7fd] & 0x01ff; - sys16_fg_scrolly = sys16_textram[0x792] & 0x00ff; + sys16_fg_scrolly = sys16_textram[0x792] & 0x01ff; sys16_bg_scrolly = sys16_textram[0x793] & 0x01ff; } @@ -287,13 +502,20 @@ sys16_textlayer_hi_min=0; sys16_textlayer_hi_max=0xff; - sys16_patch_code( 0x83bd, 0x29); - sys16_patch_code( 0x8495, 0x2a); - sys16_patch_code( 0x84f9, 0x2b); +/* + The following patches modified the input code to read the first three + analog inputs from unique addresses rather than the single address + the ADC is mapped to, so the input selection behavior didn't have to be + emulated. Not needed anymore, but left in for reference. +*/ + +/* sys16_patch_code( 0x83bd, 0x29); */ /* $E03021 -> $E03029 */ +/* sys16_patch_code( 0x8495, 0x2a); */ /* $E03021 -> $E0302A */ +/* sys16_patch_code( 0x84f9, 0x2b); */ /* $E03021 -> $E0302B */ sys16_update_proc = hangon_update_proc; - sys16_gr_ver = &sys16_extraram2[0x0]; + sys16_gr_ver = &hangon_roadram[0x0]; sys16_gr_hor = sys16_gr_ver+0x200/2; sys16_gr_pal = sys16_gr_ver+0x400/2; sys16_gr_flip= sys16_gr_ver+0x600/2;
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/shootout.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/shootout.c
Changed
@@ -72,7 +72,7 @@ static WRITE_HANDLER( shootout_flipscreen_w ) { - flip_screen_set(data & 0x01); + flip_screen_set(~data & 0x01); } static WRITE_HANDLER( shootout_coin_counter_w ) @@ -454,6 +454,7 @@ } -GAME( 1985, shootout, 0, shootout, shootout, shootout, ROT0, "Data East USA", "Shoot Out (US)") -GAME( 1985, shootouj, shootout, shootouj, shootout, 0, ROT0, "Data East USA", "Shoot Out (Japan)" ) -GAME( 1985, shootoub, shootout, shootouj, shootout, shootout, ROT0, "bootleg", "Shoot Out (Korean Bootleg)" ) +/* ROT180 confirmed by Kold */ +GAME( 1985, shootout, 0, shootout, shootout, shootout, ROT180, "Data East USA", "Shoot Out (US)") +GAME( 1985, shootouj, shootout, shootouj, shootout, 0, ROT180, "Data East USA", "Shoot Out (Japan)" ) +GAME( 1985, shootoub, shootout, shootouj, shootout, shootout, ROT180, "bootleg", "Shoot Out (Korean Bootleg)" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/slapfght.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/slapfght.c
Changed
@@ -1424,6 +1424,6 @@ GAMEX( 1986, slapbtjp, slapfigh, slapfigh, slapfigh, 0, ROT270, "bootleg", "Slap Fight (Japan bootleg)", GAME_NO_COCKTAIL ) GAMEX( 1986, slapbtuk, slapfigh, slapbtuk, slapfigh, 0, ROT270, "bootleg", "Slap Fight (English bootleg)", GAME_NO_COCKTAIL ) GAMEX( 1986, alcon, slapfigh, slapfigh, slapfigh, 0, ROT270, "<unknown>","Alcon", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) -GAMEX( 1986, getstar, 0, slapfigh, getstar, 0, ROT0, "Taito", "Guardian", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) +GAMEX( 1986, getstar, 0, slapfigh, getstar, 0, ROT0, "Taito", "Guardian (US)", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) GAMEX( 1986, getstarj, getstar, slapfigh, getstar, 0, ROT0, "Taito", "Get Star (Japan)", GAME_NOT_WORKING | GAME_NO_COCKTAIL ) GAMEX( 1986, getstarb, getstar, slapfigh, getstar, 0, ROT0, "bootleg","Get Star (bootleg)", GAME_NO_COCKTAIL )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/snk.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/snk.c
Changed
@@ -973,7 +973,7 @@ MDRV_CPU_ADD(Z80, 4000000) MDRV_CPU_FLAGS(CPU_AUDIO_CPU) MDRV_CPU_MEMORY(YM3526_YM3526_readmem_sound,YM3526_YM3526_writemem_sound) - MDRV_CPU_VBLANK_INT(irq0_line_hold,1) + MDRV_CPU_VBLANK_INT(irq0_line_hold,2) MDRV_FRAMES_PER_SECOND(60) MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION)
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/speedspn.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/speedspn.c
Changed
@@ -7,7 +7,7 @@ e.g. BUTTON 1. TODO: -- A couple of garbage sprites on the player selection screen + - Unknown Port Writes: cpu #0 (PC=00000D88): unmapped port byte write to 00000001 = 02 cpu #0 (PC=00006974): unmapped port byte write to 00000010 = 10 @@ -65,8 +65,8 @@ static READ_HANDLER(speedspn_irq_ack_r) { - // I think this simply acknowledges the IRQ #0, it's read within the handler and the - // value is discarded + /* I think this simply acknowledges the IRQ #0, it's read within the handler and the*/ + /* value is discarded*/ return 0; } @@ -139,12 +139,12 @@ PORT_END static PORT_READ_START( readport ) - { 0x10, 0x10, input_port_0_r }, // inputs - { 0x11, 0x11, input_port_1_r }, // inputs - { 0x12, 0x12, input_port_2_r }, // inputs + { 0x10, 0x10, input_port_0_r }, /* inputs*/ + { 0x11, 0x11, input_port_1_r }, /* inputs*/ + { 0x12, 0x12, input_port_2_r }, /* inputs*/ { 0x13, 0x13, input_port_3_r }, - { 0x14, 0x14, input_port_4_r }, // inputs - { 0x16, 0x16, speedspn_irq_ack_r }, // @@@ could be watchdog, value is discarded + { 0x14, 0x14, input_port_4_r }, /* inputs*/ + { 0x16, 0x16, speedspn_irq_ack_r }, /* @@@ could be watchdog, value is discarded*/ PORT_END /* sound cpu */ @@ -159,7 +159,7 @@ static MEMORY_WRITE_START( writemem2 ) { 0x0000, 0x7fff, MWA_ROM }, { 0x8000, 0x87ff, MWA_RAM }, - { 0x9000, 0x9000, MWA_NOP }, // ?? + { 0x9000, 0x9000, MWA_NOP }, /* ??*/ { 0x9800, 0x9800, OKIM6295_data_0_w }, MEMORY_END @@ -339,7 +339,7 @@ ROM_CONTINUE( 0x10000, 0x078000 ) /* banked data */ ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* CPU2 code */ - ROM_LOAD( "tch-ss2.u96", 0x00000, 0x10000, CRC(4611fd0c) SHA1(b49ad6a8be6ccfef0b2ed187fb3b008fb7eeb2b5) ) // FIRST AND SECOND HALF IDENTICAL + ROM_LOAD( "tch-ss2.u96", 0x00000, 0x10000, CRC(4611fd0c) SHA1(b49ad6a8be6ccfef0b2ed187fb3b008fb7eeb2b5) ) /* FIRST AND SECOND HALF IDENTICAL*/ ROM_REGION( 0x080000, REGION_SOUND1, 0 ) /* Samples */ ROM_LOAD( "tch-ss3.u95", 0x00000, 0x080000, CRC(1c9deb5e) SHA1(89f01a8e8bdb0eee47e9195b312d2e65d41d3548) ) @@ -357,4 +357,4 @@ /*** GAME DRIVERS ************************************************************/ -GAMEX( 1994, speedspn, 0, speedspn, speedspn, 0, ROT180, "TCH", "Speed Spin", GAME_IMPERFECT_GRAPHICS ) +GAME( 1994, speedspn, 0, speedspn, speedspn, 0, ROT180, "TCH", "Speed Spin" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/statriv2.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/statriv2.c
Changed
@@ -11,7 +11,6 @@ * in attract and fixing the questions so it actually asked more * * than one per category. * * * -* Colours are wrong, what should they be? * * Game Speed too fast? * * * * MG: Dave seems to think that the AY is hooked up wrong since * @@ -108,28 +107,21 @@ PALETTE_INIT(statriv2) { - int j; + int i; - for (j = 0;j < 16;j++) + for (i = 0; i < 8; i++) { - int r = (j & 1) >> 0; - int g = (j & 2) >> 1; - int b = (j & 4) >> 2; - int i = (j & 8) >> 3; - - r = 0xff * r; - g = 0x7f * g * (i + 1); - b = 0x7f * b * (i + 1); - - palette_set_color(j,r,g,b); + palette_set_color(i, + 0xff * ((i >> 2) & 1), + 0xff * ((i >> 0) & 1), + 0xff * ((i >> 1) & 1)); } - for (j = 0;j < 256;j++) + for (i = 0; i < 64; i++) { - colortable[2*j] = j & 0x0f; - colortable[2*j+1] = j >> 4; + colortable[2*i+0] = i % 8; + colortable[2*i+1] = i / 8; } - palette_set_color(8,0xFF,0xFF,0xFF); } /* end video related */ @@ -263,7 +255,7 @@ static MEMORY_WRITE_START( statriv2_writemem ) { 0x0000, 0x2fff, MWA_ROM }, { 0x4000, 0x43ff, MWA_RAM }, - { 0x4800, 0x48ff, MWA_RAM, &generic_nvram, &generic_nvram_size }, // backup ram? + { 0x4800, 0x48ff, MWA_RAM, &generic_nvram, &generic_nvram_size }, /* backup ram?*/ { 0xc800, 0xcfff, statriv2_videoram_w, &statriv2_videoram }, MEMORY_END @@ -277,63 +269,63 @@ static MEMORY_WRITE_START( supertr2_writemem ) { 0x0000, 0x3fff, MWA_ROM }, { 0x4000, 0x43ff, MWA_RAM }, - { 0x4800, 0x48ff, MWA_RAM, &generic_nvram, &generic_nvram_size }, // backup ram? + { 0x4800, 0x48ff, MWA_RAM, &generic_nvram, &generic_nvram_size }, /* backup ram?*/ { 0xc800, 0xcfff, statriv2_videoram_w, &statriv2_videoram }, MEMORY_END static PORT_READ_START( statriv2_readport ) { 0x20, 0x20, input_port_0_r }, { 0x21, 0x21, input_port_1_r }, - { 0x2b, 0x2b, statriv2_questions_read }, // question data - { 0xb1, 0xb1, AY8910_read_port_0_r }, // ??? - { 0xce, 0xce, IORP_NOP }, // ??? + { 0x2b, 0x2b, statriv2_questions_read }, /* question data*/ + { 0xb1, 0xb1, AY8910_read_port_0_r }, /* ???*/ + { 0xce, 0xce, IORP_NOP }, /* ???*/ PORT_END static PORT_WRITE_START( statriv2_writeport ) - { 0x22, 0x22, IOWP_NOP }, // ??? - { 0x23, 0x23, IOWP_NOP }, // ??? + { 0x22, 0x22, IOWP_NOP }, /* ???*/ + { 0x23, 0x23, IOWP_NOP }, /* ???*/ { 0x29, 0x29, question_offset_low_w }, { 0x2a, 0x2a, question_offset_high_w }, { 0xb0, 0xb0, AY8910_control_port_0_w }, { 0xb1, 0xb1, AY8910_write_port_0_w }, - { 0xc0, 0xcf, IOWP_NOP }, // ??? + { 0xc0, 0xcf, IOWP_NOP }, /* ???*/ PORT_END static PORT_READ_START( supertr2_readport ) { 0x20, 0x20, input_port_0_r }, { 0x21, 0x21, input_port_1_r }, - { 0x28, 0x28, supertr2_questions_read }, // question data - { 0xb1, 0xb1, AY8910_read_port_0_r }, // ??? - { 0xce, 0xce, IORP_NOP }, // ??? + { 0x28, 0x28, supertr2_questions_read }, /* question data*/ + { 0xb1, 0xb1, AY8910_read_port_0_r }, /* ???*/ + { 0xce, 0xce, IORP_NOP }, /* ???*/ PORT_END static PORT_WRITE_START( supertr2_writeport ) - { 0x22, 0x22, IOWP_NOP }, // ??? - { 0x23, 0x23, IOWP_NOP }, // ??? + { 0x22, 0x22, IOWP_NOP }, /* ???*/ + { 0x23, 0x23, IOWP_NOP }, /* ???*/ { 0x28, 0x28, question_offset_low_w }, { 0x29, 0x29, question_offset_med_w }, { 0x2a, 0x2a, question_offset_high_w }, { 0xb0, 0xb0, AY8910_control_port_0_w }, { 0xb1, 0xb1, AY8910_write_port_0_w }, - { 0xc0, 0xcf, IOWP_NOP }, // ??? + { 0xc0, 0xcf, IOWP_NOP }, /* ???*/ PORT_END static PORT_WRITE_START( trivquiz_writeport ) - { 0x22, 0x22, IOWP_NOP }, // ??? - { 0x23, 0x23, IOWP_NOP }, // ??? + { 0x22, 0x22, IOWP_NOP }, /* ???*/ + { 0x23, 0x23, IOWP_NOP }, /* ???*/ { 0x28, 0x28, question_offset_low_w }, { 0x29, 0x29, question_offset_high_w }, { 0xb0, 0xb0, AY8910_control_port_0_w }, { 0xb1, 0xb1, AY8910_write_port_0_w }, - { 0xc0, 0xcf, IOWP_NOP }, // ??? + { 0xc0, 0xcf, IOWP_NOP }, /* ???*/ PORT_END static PORT_READ_START( trivquiz_readport ) { 0x20, 0x20, input_port_0_r }, { 0x21, 0x21, input_port_1_r }, - { 0x2a, 0x2a, statriv2_questions_read }, // question data - { 0xb1, 0xb1, AY8910_read_port_0_r }, // ??? - { 0xce, 0xce, IORP_NOP }, // ??? + { 0x2a, 0x2a, statriv2_questions_read }, /* question data*/ + { 0xb1, 0xb1, AY8910_read_port_0_r }, /* ???*/ + { 0xce, 0xce, IORP_NOP }, /* ???*/ PORT_END INPUT_PORTS_START( statriv2 ) @@ -404,7 +396,7 @@ static struct AY8910interface ay8910_interface = { 1, /* 1 chip */ - 1500000, /* 1.5 MHz ???? */ + 12440000/8, /* 1.555 MHz */ { 100 }, { 0 }, { 0 }, @@ -419,7 +411,7 @@ static MACHINE_DRIVER_START( statriv2 ) /* basic machine hardware */ - MDRV_CPU_ADD(8085A,12400000) /* 12.4MHz / 4? */ + MDRV_CPU_ADD(8085A,12440000) /* 12.44MHz / 4? */ MDRV_CPU_MEMORY(statriv2_readmem,statriv2_writemem) MDRV_CPU_PORTS(statriv2_readport,statriv2_writeport) MDRV_CPU_VBLANK_INT(statriv2_interrupt,1) @@ -434,8 +426,8 @@ MDRV_SCREEN_SIZE(64*8, 32*8) MDRV_VISIBLE_AREA(4*8, 38*8-1, 0, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) - MDRV_PALETTE_LENGTH(16) - MDRV_COLORTABLE_LENGTH(2*256) + MDRV_PALETTE_LENGTH(8) + MDRV_COLORTABLE_LENGTH(2*64) MDRV_PALETTE_INIT(statriv2) MDRV_VIDEO_START(statriv2) @@ -447,7 +439,7 @@ static MACHINE_DRIVER_START( supertr2 ) /* basic machine hardware */ - MDRV_CPU_ADD(8085A,12400000) /* 12.4MHz / 4? */ + MDRV_CPU_ADD(8085A,12440000) /* 12.44MHz / 4? */ MDRV_CPU_MEMORY(supertr2_readmem,supertr2_writemem) MDRV_CPU_PORTS(supertr2_readport,supertr2_writeport) MDRV_CPU_VBLANK_INT(statriv2_interrupt,1) @@ -462,8 +454,8 @@ MDRV_SCREEN_SIZE(64*8, 32*8) MDRV_VISIBLE_AREA(2*8, 36*8-1, 0, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) - MDRV_PALETTE_LENGTH(16) - MDRV_COLORTABLE_LENGTH(2*256) + MDRV_PALETTE_LENGTH(8) + MDRV_COLORTABLE_LENGTH(2*64) MDRV_PALETTE_INIT(statriv2) MDRV_VIDEO_START(statriv2) @@ -475,7 +467,7 @@ static MACHINE_DRIVER_START( trivquiz ) /* basic machine hardware */ - MDRV_CPU_ADD(8085A,12400000) /* 12.4MHz / 4? */ + MDRV_CPU_ADD(8085A,12440000) /* 12.44MHz / 4? */ MDRV_CPU_MEMORY(supertr2_readmem,supertr2_writemem) MDRV_CPU_PORTS(trivquiz_readport,trivquiz_writeport) MDRV_CPU_VBLANK_INT(statriv2_interrupt,1) @@ -488,10 +480,10 @@ /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER ) MDRV_SCREEN_SIZE(64*8, 32*8) - MDRV_VISIBLE_AREA(4*8, 40*8-1, 0, 32*8-1) + MDRV_VISIBLE_AREA(4*8, 38*8-1, 0, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) - MDRV_PALETTE_LENGTH(16) - MDRV_COLORTABLE_LENGTH(2*256) + MDRV_PALETTE_LENGTH(8) + MDRV_COLORTABLE_LENGTH(2*64) MDRV_PALETTE_INIT(statriv2) MDRV_VIDEO_START(statriv2) @@ -562,6 +554,6 @@ ROM_LOAD( "astq2-8.rom", 0x38000, 0x08000, CRC(cd2674d5) SHA1(7fb6513172ffe8e3b9e0f4dc9ecdb42d954b1ff0) ) ROM_END -GAMEX( 1984, trivquiz, 0, trivquiz, statriv2, 0, ROT0, "Status Games", "Triv Quiz", GAME_WRONG_COLORS ) -GAMEX( 1984, statriv2, 0, statriv2, statriv2, 0, ROT0, "Status Games", "(Status) Triv Two", GAME_WRONG_COLORS ) -GAMEX( 1986, supertr2, 0, supertr2, supertr2, 0, ROT0, "Status Games", "Super Triv II", GAME_WRONG_COLORS ) +GAME( 1984, trivquiz, 0, trivquiz, statriv2, 0, ROT0, "Status Games", "Triv Quiz" ) +GAME( 1984, statriv2, 0, statriv2, statriv2, 0, ROT0, "Status Games", "Triv Two" ) +GAME( 1986, supertr2, 0, supertr2, supertr2, 0, ROT0, "Status Games", "Super Triv II" )
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/taito_f3.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/taito_f3.c
Changed
@@ -39,6 +39,7 @@ #include "state.h" #include "bootstrap.h" +#include "inptport.h" VIDEO_START( f3 ); VIDEO_UPDATE( f3 );
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/thunderx.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/thunderx.c
Changed
@@ -67,12 +67,12 @@ { if (pmcbank) { -// logerror("%04x read pmcram %04x\n",activecpu_get_pc(),offset); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x read pmcram %04x\n",activecpu_get_pc(),offset);*/ return pmcram[offset]; } else { - logerror("%04x read pmc internal ram %04x\n",activecpu_get_pc(),offset); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x read pmc internal ram %04x\n",activecpu_get_pc(),offset); return 0; } } @@ -86,14 +86,14 @@ ram[offset] = data; else if (rambank & 0x10) { -// if (offset == 0x200) debug_signal_breakpoint(1); +/* if (offset == 0x200) debug_signal_breakpoint(1);*/ if (pmcbank) { - logerror("%04x pmcram %04x = %02x\n",activecpu_get_pc(),offset,data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x pmcram %04x = %02x\n",activecpu_get_pc(),offset,data); pmcram[offset] = data; } else - logerror("%04x pmc internal ram %04x = %02x\n",activecpu_get_pc(),offset,data); + log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x pmc internal ram %04x = %02x\n",activecpu_get_pc(),offset,data); } else paletteram_xBBBBBGGGGGRRRRR_swap_w(offset,data); @@ -170,21 +170,21 @@ 03 6c 04 40 04 */ -// run_collisions -// -// collide objects from s0 to e0 against -// objects from s1 to e1 -// -// only compare objects with the specified bits (cm) set in their flags -// only set object 0's hit bit if (hm & 0x40) is true -// -// the data format is: -// -// +0 : flags -// +1 : width (4 pixel units) -// +2 : height (4 pixel units) -// +3 : x (2 pixel units) of center of object -// +4 : y (2 pixel units) of center of object +/* run_collisions*/ +/**/ +/* collide objects from s0 to e0 against*/ +/* objects from s1 to e1*/ +/**/ +/* only compare objects with the specified bits (cm) set in their flags*/ +/* only set object 0's hit bit if (hm & 0x40) is true*/ +/**/ +/* the data format is:*/ +/**/ +/* +0 : flags*/ +/* +1 : width (4 pixel units)*/ +/* +2 : height (4 pixel units)*/ +/* +3 : x (2 pixel units) of center of object*/ +/* +4 : y (2 pixel units) of center of object*/ static void run_collisions(int s0, int e0, int s1, int e1, int cm, int hm) { @@ -197,10 +197,10 @@ { int l0,r0,b0,t0; - // check valid + /* check valid*/ if (!(p0[0] & cm)) continue; - // get area + /* get area*/ l0 = p0[3] - p0[1]; r0 = p0[3] + p0[1]; t0 = p0[4] - p0[2]; @@ -211,31 +211,31 @@ { int l1,r1,b1,t1; - // check valid + /* check valid*/ if (!(p1[0] & hm)) continue; - // get area + /* get area*/ l1 = p1[3] - p1[1]; r1 = p1[3] + p1[1]; t1 = p1[4] - p1[2]; b1 = p1[4] + p1[2]; - // overlap check + /* overlap check*/ if (l1 >= r0) continue; if (l0 >= r1) continue; if (t1 >= b0) continue; if (t0 >= b1) continue; - // set flags - p0[0] = (p0[0] & 0x9f) | 0x10; - p1[0] = (p1[0] & 0x9b) | 0x10; + /* set flags*/ + p0[0] = (p0[0] & 0x9f) | (p1[0] & 0x04) | 0x10; + p1[0] = (p1[0] & 0x9f) | 0x10; } } } -// calculate_collisions -// -// emulates K052591 collision detection +/* calculate_collisions*/ +/**/ +/* emulates K052591 collision detection*/ static void calculate_collisions( void ) { @@ -243,24 +243,24 @@ int X1,Y1; int CM,HM; - // the data at 0x00 to 0x06 defines the operation - // - // 0x00 : word : last byte of set 0 - // 0x02 : byte : last byte of set 1 - // 0x03 : byte : collide mask - // 0x04 : byte : hit mask - // 0x05 : byte : first byte of set 0 - // 0x06 : byte : first byte of set 1 - // - // the USA version is slightly different: - // - // 0x05 : word : first byte of set 0 - // 0x07 : byte : first byte of set 1 - // - // the operation is to intersect set 0 with set 1 - // collide mask specifies objects to ignore - // hit mask is 40 to set bit on object 0 and object 1 - // hit mask is 20 to set bit on object 1 only + /* the data at 0x00 to 0x06 defines the operation*/ + /**/ + /* 0x00 : word : last byte of set 0*/ + /* 0x02 : byte : last byte of set 1*/ + /* 0x03 : byte : collide mask*/ + /* 0x04 : byte : hit mask*/ + /* 0x05 : byte : first byte of set 0*/ + /* 0x06 : byte : first byte of set 1*/ + /**/ + /* the USA version is slightly different:*/ + /**/ + /* 0x05 : word : first byte of set 0*/ + /* 0x07 : byte : first byte of set 1*/ + /**/ + /* the operation is to intersect set 0 with set 1*/ + /* collide mask specifies objects to ignore*/ + /* hit mask is 40 to set bit on object 0 and object 1*/ + /* hit mask is 20 to set bit on object 1 only*/ Y0 = pmcram[0]; Y0 = (Y0 << 8) + pmcram[1]; @@ -269,7 +269,7 @@ if (pmcram[5] < 16) { - // US Thunder Cross uses this form + /* US Thunder Cross uses this form*/ X0 = pmcram[5]; X0 = (X0 << 8) + pmcram[6]; X0 = (X0 - 16) / 5; @@ -277,7 +277,7 @@ } else { - // Japan Thunder Cross uses this form + /* Japan Thunder Cross uses this form*/ X0 = (pmcram[5] - 16) / 5; X1 = (pmcram[6] - 16) / 5; } @@ -290,7 +290,7 @@ static WRITE_HANDLER( thunderx_1f98_w ) { -// logerror("%04x: 1f98_w %02x\n",activecpu_get_pc(),data); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: 1f98_w %02x\n",activecpu_get_pc(),data);*/ /* bit 0 = enable char ROM reading through the video RAM */ K052109_set_RMRD_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE); @@ -315,7 +315,7 @@ unsigned char *RAM = memory_region(REGION_CPU1); int offs; -//logerror("%04x: bank switch %02x\n",activecpu_get_pc(),data); +/*logerror("%04x: bank switch %02x\n",activecpu_get_pc(),data);*/ /* bits 0-3 ROM bank */ offs = 0x10000 + (data & 0x0f)*0x2000; @@ -334,7 +334,7 @@ static WRITE_HANDLER( thunderx_videobank_w ) { -//logerror("%04x: select video ram bank %02x\n",activecpu_get_pc(),data); +/*logerror("%04x: select video ram bank %02x\n",activecpu_get_pc(),data);*/ /* 0x01 = work RAM at 4000-5fff */ /* 0x00 = palette at 5800-5fff */ /* 0x10 = unknown RAM at 5800-5fff */ @@ -523,7 +523,7 @@ PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) -// PORT_DIPSETTING( 0x00, "Invalid" ) +/* PORT_DIPSETTING( 0x00, "Invalid" )*/ PORT_START /* DSW #2 */ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) @@ -627,7 +627,7 @@ PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) -// PORT_DIPSETTING( 0x00, "Invalid" ) +/* PORT_DIPSETTING( 0x00, "Invalid" )*/ PORT_START PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) @@ -949,7 +949,7 @@ unsigned char *RAM = memory_region(REGION_CPU1); int offs; -// logerror("thunderx %04x: bank select %02x\n", activecpu_get_pc(), lines ); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "thunderx %04x: bank select %02x\n", activecpu_get_pc(), lines );*/ offs = 0x10000 + (((lines & 0x0f) ^ 0x08) * 0x2000); if (offs >= 0x28000) offs -= 0x20000;
View file
libretro-mame2003-0~git20200805.tar.xz/src/drivers/tmnt.c -> libretro-mame2003-0~git20210529.tar.xz/src/drivers/tmnt.c
Changed
@@ -347,15 +347,14 @@ * (Sound info courtesy of Dave <dave@finalburn.com>) */ - for (i = 0;i < 0x40000;i++) + for (i = 0; i < 0x40000; i++) { - int val = source[2*i] + source[2*i+1] * 256; + int val = source[2 * i] + source[2 * i + 1] * 256; int expo = val >> 13; + val = (val >> 3) & (0x3ff); /* 10 bit, Max Amplitude 0x400 */ + val -= 0x200; /* Centralize value */ - val = (val >> 3) & (0x3ff); /* 10 bit, Max Amplitude 0x400 */ - val -= 0x200; /* Centralize value */ - - val <<= (expo-3); + val = (val << expo) >> 3; dest[i] = val; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/fileio.c -> libretro-mame2003-0~git20210529.tar.xz/src/fileio.c
Changed
@@ -6,6 +6,7 @@ #include <compat/zlib.h> +#include <stdio.h> #include <assert.h> #include <streams/file_stream.h> @@ -173,54 +174,70 @@ } /****************************************************************************** - + osd_get_path Sets char* path to point at a valid path of the type incidated by int pathtype, although the path itself does not necessarily exist at this point in the process. - + *****************************************************************************/ void osd_get_path(int pathtype, char* path) { - char save_path_buffer[PATH_MAX_LENGTH]; - char sys_path_buffer[PATH_MAX_LENGTH]; + char save_path_buffer[PATH_MAX_LENGTH]= {0}; + char sys_path_buffer[PATH_MAX_LENGTH]= {0}; save_path_buffer[0] = '\0'; if(options.save_subfolder) - snprintf(save_path_buffer, PATH_MAX_LENGTH, "%s%c%s", options.libretro_save_path,path_default_slash_c(), APPNAME); + snprintf(save_path_buffer, PATH_MAX_LENGTH, "%s%c%s", options.libretro_save_path, PATH_DEFAULT_SLASH_C(), APPNAME); else snprintf(save_path_buffer, PATH_MAX_LENGTH, "%s", options.libretro_save_path); sys_path_buffer[0] = '\0'; if(options.system_subfolder) - snprintf(sys_path_buffer, PATH_MAX_LENGTH, "%s%c%s", options.libretro_system_path,path_default_slash_c(), APPNAME); + snprintf(sys_path_buffer, PATH_MAX_LENGTH, "%s%c%s", options.libretro_system_path, PATH_DEFAULT_SLASH_C(), APPNAME); else snprintf(sys_path_buffer, PATH_MAX_LENGTH, "%s", options.libretro_system_path); - + + /* force system and save paths to be created if not already there */ + if ( !(path_is_directory(sys_path_buffer)) || !(path_is_directory(save_path_buffer)) ) + { + log_cb(RETRO_LOG_INFO, LOGPRE "Searching for missing directories.........\n"); + + if (path_mkdir(sys_path_buffer)) + log_cb(RETRO_LOG_INFO, LOGPRE "Verified system directory exists: %s\n", sys_path_buffer); + else + log_cb(RETRO_LOG_INFO, LOGPRE "Failed to create missing system directory: %s\n", sys_path_buffer); + + if (path_mkdir(save_path_buffer)) + log_cb(RETRO_LOG_INFO, LOGPRE "Verified save directory exists: %s\n", save_path_buffer); + else + log_cb(RETRO_LOG_INFO, LOGPRE "Failed to create missing save directory: %s\n", save_path_buffer); + } + switch (pathtype) - { + { case FILETYPE_ROM: - case FILETYPE_IMAGE: - strcpy(path, options.libretro_content_path); + case FILETYPE_IMAGE: + strcpy(path, options.libretro_content_path); break; - /* user-initiated content goes in mame2003 save directory subfolders */ + /* user-initiated content goes in mame2003 save directory subfolders */ case FILETYPE_IMAGE_DIFF: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer,path_default_slash_c(), "diff"); - break; + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer, PATH_DEFAULT_SLASH_C(), "diff"); + break; case FILETYPE_NVRAM: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer,path_default_slash_c(), "nvram"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer, PATH_DEFAULT_SLASH_C(), "nvram"); break; case FILETYPE_HIGHSCORE: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer,path_default_slash_c(), "hi"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer, PATH_DEFAULT_SLASH_C(), "hi"); break; case FILETYPE_CONFIG: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer,path_default_slash_c(), "cfg"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer, PATH_DEFAULT_SLASH_C(), "cfg"); break; case FILETYPE_MEMCARD: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer,path_default_slash_c(), "memcard"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer, PATH_DEFAULT_SLASH_C(), "memcard"); break; case FILETYPE_CTRLR: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer,path_default_slash_c(), "ctrlr"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", save_path_buffer, PATH_DEFAULT_SLASH_C(), "ctrlr"); break; case FILETYPE_XML_DAT: snprintf(path, PATH_MAX_LENGTH, "%s", save_path_buffer); @@ -228,19 +245,25 @@ /* static, pregenerated content goes in mam2003 system directory subfolders */ case FILETYPE_ARTWORK: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", sys_path_buffer,path_default_slash_c(), "artwork"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", sys_path_buffer, PATH_DEFAULT_SLASH_C(), "artwork"); break; case FILETYPE_SAMPLE: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", sys_path_buffer,path_default_slash_c(), "samples"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", sys_path_buffer, PATH_DEFAULT_SLASH_C(), "samples"); break; case FILETYPE_SAMPLE_FLAC: - snprintf(path, PATH_MAX_LENGTH, "%s%c%s", sys_path_buffer,path_default_slash_c(), "samples"); + snprintf(path, PATH_MAX_LENGTH, "%s%c%s", sys_path_buffer, PATH_DEFAULT_SLASH_C(), "samples"); break; default: /* .dat files and additional core content goes in mame2003 system directory */ snprintf(path, PATH_MAX_LENGTH, "%s", sys_path_buffer); - } + break; + } + /* Create path if it doesn't exist and log create failures */ + if (!path_is_directory(path)) + if (!path_mkdir(path)) log_cb(RETRO_LOG_DEBUG, LOGPRE "osd_get_path() failed to create path: %s\n", path); + + log_cb(RETRO_LOG_DEBUG, LOGPRE "osd_get_path() return path= %s\n", path); } int osd_get_path_info(int pathtype, int pathindex, const char *filename) @@ -249,30 +272,36 @@ char currDir[PATH_MAX_LENGTH]; osd_get_path(pathtype, currDir); - snprintf(buffer, PATH_MAX_LENGTH, "%s%c%s", currDir,path_default_slash_c(), filename); + snprintf(buffer, PATH_MAX_LENGTH, "%s%c%s", currDir, PATH_DEFAULT_SLASH_C(), filename); - /*log_cb(RETRO_LOG_INFO, LOGPRE "osd_get_path_info (buffer = [%s]), (directory: [%s]), (path type: [%d]), (filename: [%s]) \n", buffer, currDir, pathtype, filename);*/ + log_cb(RETRO_LOG_DEBUG, "(osd_get_path_info) buffer= %s\n", buffer); if (path_is_directory(buffer)) + { + log_cb(RETRO_LOG_DEBUG, "(osd_get_path_info) path is directory _-_ %s\n",buffer); return PATH_IS_DIRECTORY; + } else if (filestream_exists(buffer)) + { + log_cb(RETRO_LOG_DEBUG, "(osd_get_path_info) path is file _-_ %s\n",buffer); return PATH_IS_FILE; - + } + log_cb(RETRO_LOG_DEBUG, "(osd_get_path_info) path not found _-_ %s\n",buffer); return PATH_NOT_FOUND; } FILE* osd_fopen(int pathtype, int pathindex, const char *filename, const char *mode) { - char buffer[PATH_MAX_LENGTH]; - char currDir[PATH_MAX_LENGTH]; + char buffer[PATH_MAX_LENGTH]= {0}; + char currDir[PATH_MAX_LENGTH]= {0}; FILE* out; osd_get_path(pathtype, currDir); - snprintf(buffer, PATH_MAX_LENGTH, "%s%c%s", currDir,path_default_slash_c(), filename); - - path_mkdir(currDir); + snprintf(buffer, PATH_MAX_LENGTH, "%s%c%s", currDir, PATH_DEFAULT_SLASH_C(), filename); out = fopen(buffer, mode); + if (out) log_cb(RETRO_LOG_DEBUG, "(osd_fopen) opened the file: %s\n", buffer); + else log_cb(RETRO_LOG_DEBUG, "(osd_fopen) failed to open file: %s\n", buffer); return out; } @@ -283,7 +312,7 @@ mame_fopen_rom ***************************************************************************/ -/* Similar to mame_fopen(,,FILETYPE_ROM), but lets you specify an expected checksum +/* Similar to mame_fopen(,,FILETYPE_ROM), but lets you specify an expected checksum (better encapsulation of the load by CRC used for ZIP files) */ mame_file *mame_fopen_rom(const char *gamename, const char *filename, const char* exphash) { @@ -419,7 +448,7 @@ /* check against null pointer */ if (!file) return 0; - + /* switch off the file type */ switch (file->type) { @@ -802,12 +831,12 @@ /* now open the file appropriately */ switch (filetype) { - case FILETYPE_RAW: /* raw data files */ - case FILETYPE_ROM: /* ROM files */ - case FILETYPE_HIGHSCORE_DB: /* highscore database/history files */ - case FILETYPE_HISTORY: /* game history files */ - case FILETYPE_CHEAT: /* cheat file */ - default: /* anything else */ + case FILETYPE_RAW: /* raw data files */ + case FILETYPE_ROM: /* ROM files */ + case FILETYPE_HIGHSCORE_DB: /* highscore database/history files */ + case FILETYPE_HISTORY: /* game history files */ + case FILETYPE_CHEAT: /* cheat file */ + default: /* anything else */ extension = NULL; break; @@ -823,9 +852,9 @@ extension = "wav"; break; - case FILETYPE_SAMPLE_FLAC: /* samples */ + case FILETYPE_SAMPLE_FLAC: /* samples */ extension = "flac"; - break; + break; case FILETYPE_ARTWORK: /* artwork files */ extension = "png"; @@ -874,7 +903,7 @@ mame_file file, *newfile; char tempname[256]; - log_cb(RETRO_LOG_DEBUG, LOGPRE "generic_fopen(%d, %s, %s, %s, %X)\n", pathtype, gamename, filename, extension, flags); + log_cb(RETRO_LOG_DEBUG, "(generic_fopen) (pathtype:%d, gamename:%s, filename:%s, extension:%s, flags:%X)\n", pathtype, gamename, filename, extension, flags); /* reset the file handle */ memset(&file, 0, sizeof(file)); @@ -912,6 +941,7 @@ /* if the directory exists, proceed */ if (*name == 0 || osd_get_path_info(pathtype, pathindex, name) == PATH_IS_DIRECTORY) { + log_cb(RETRO_LOG_DEBUG, LOGPRE "(generic_fopen) directory exists: %s\n", name); /* now look for path/gamename/filename.ext */ compose_path(name, gamename, filename, extension); @@ -928,6 +958,7 @@ /* otherwise, just open it straight */ else { + log_cb(RETRO_LOG_DEBUG, LOGPRE " (generic_fopen) using osd_fopen %s\n", name); file.type = PLAIN_FILE; file.file = osd_fopen(pathtype, pathindex, name, access_modes[flags & 3]); if (file.file == NULL && (flags & 3) == 3) @@ -976,7 +1007,7 @@ } hash_data_clear(file.hash); - + if (checksum_zipped_file(pathtype, pathindex, name, tempname, &ziplength, &crc) == 0) { file.length = ziplength; @@ -999,8 +1030,8 @@ /* Try loading the file */ err = load_zipped_file(pathtype, pathindex, name, tempname, &file.data, &ziplength); - /* If it failed, since this is a ZIP file, we can try to load by CRC - if an expected hash has been provided. unzip.c uses this ugly hack + /* If it failed, since this is a ZIP file, we can try to load by CRC + if an expected hash has been provided. unzip.c uses this ugly hack of specifying the CRC as filename. */ if (err && hash) { @@ -1111,7 +1142,7 @@ *size = length; - + /* compute the checksums (only the functions for which we have an expected checksum). Take also care of crconly: if the user asked, we will calculate only the CRC, but only if there is an expected CRC for this file. */ @@ -1154,17 +1185,17 @@ mame_file *nvram_file = NULL; log_cb(RETRO_LOG_INFO, LOGPRE "Generating bootstrap nvram for %s\n", options.romset_filename_noext); - + nvram_file = mame_fopen(options.romset_filename_noext, 0, FILETYPE_NVRAM, 1); - mame_fwrite(nvram_file, bootstrap_nvram, nvram_length); + mame_fwrite(nvram_file, bootstrap_nvram, nvram_length); mame_fclose(nvram_file); nvram_file = mame_fopen(options.romset_filename_noext, 0, FILETYPE_NVRAM, 0); - + if(!nvram_file) log_cb(RETRO_LOG_ERROR, LOGPRE "Error generating nvram bootstrap file!\n"); - - return nvram_file; + + return nvram_file; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/fileio.h -> libretro-mame2003-0~git20210529.tar.xz/src/fileio.h
Changed
@@ -64,11 +64,11 @@ }; /****************************************************************************** - + osd_get_path Sets char* path to point at a valid path of the type incidated by int pathtype, although the path itself does not necessarily exist at this point in the process. - + *****************************************************************************/ void osd_get_path(int pathtype, char* path);
View file
libretro-mame2003-0~git20200805.tar.xz/src/includes/deco16ic.h -> libretro-mame2003-0~git20210529.tar.xz/src/includes/deco16ic.h
Changed
@@ -22,16 +22,19 @@ void deco16_set_tilemap_bank_callback(int tilemap, int (*callback)(const int bank)); void deco16_set_tilemap_colour_base(int tilemap, int base); void deco16_set_tilemap_colour_mask(int tilemap, int mask); +void deco16_set_tilemap_transparency_mask(int tilemap, int mask); void deco16_tilemap_1_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority); void deco16_tilemap_2_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority); void deco16_tilemap_3_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority); void deco16_tilemap_4_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority); +void deco16_tilemap_34_combine_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority); + void deco16_clear_sprite_priority_bitmap(void); void deco16_pdrawgfx(struct mame_bitmap *dest,const struct GfxElement *gfx, unsigned int code,unsigned int color,int flipx,int flipy,int sx,int sy, - const struct rectangle *clip,int transparency,int transparent_color,UINT32 pri_mask,UINT32 sprite_mask); + const struct rectangle *clip,int transparency,int transparent_color,UINT32 pri_mask,UINT32 sprite_mask,UINT8 write_pri); struct tilemap *deco16_get_tilemap(int pf, int size);
View file
libretro-mame2003-0~git20200805.tar.xz/src/includes/decocrpt.h -> libretro-mame2003-0~git20210529.tar.xz/src/includes/decocrpt.h
Changed
@@ -1,2 +1,3 @@ void deco56_decrypt(int region); void deco74_decrypt(int region); +void deco156_decrypt(void);
View file
libretro-mame2003-0~git20200805.tar.xz/src/includes/harddriv.h -> libretro-mame2003-0~git20210529.tar.xz/src/includes/harddriv.h
Changed
@@ -26,7 +26,7 @@ extern data16_t *st68k_sloop_alt_base; extern data16_t *hdgsp_protection; -extern data16_t *stmsp_sync[2]; +extern data16_t *stmsp_sync[3]; extern data16_t *hdgsp_speedup_addr[2]; extern offs_t hdgsp_speedup_pc;
View file
libretro-mame2003-0~git20200805.tar.xz/src/includes/midwunit.h -> libretro-mame2003-0~git20210529.tar.xz/src/includes/midwunit.h
Changed
@@ -33,6 +33,7 @@ DRIVER_INIT( mk3r10 ); DRIVER_INIT( umk3 ); DRIVER_INIT( umk3r11 ); +DRIVER_INIT( umk3p ); DRIVER_INIT( openice ); DRIVER_INIT( nbahangt );
View file
libretro-mame2003-0~git20200805.tar.xz/src/info.c -> libretro-mame2003-0~git20210529.tar.xz/src/info.c
Changed
@@ -12,7 +12,6 @@ #define XML_ROOT "mame" #define XML_TOP "game" - /* Print a free format string */ static void print_free_string(FILE* out, const char* s) { @@ -417,18 +416,44 @@ fprintf(out, "/>\n"); } } - -} +} -/* disable optimization for this section until code is change to be 64 bit friendly */ -#pragma GCC push_options -#pragma GCC optimize ("O0") +static int sampleof; static void print_game_sampleof(FILE* out, const struct GameDriver* game) { #if (HAS_SAMPLES) struct InternalMachineDriver drv; int i=0; + sampleof =0; + expand_machine_driver(game->drv, &drv); + + for( i = 0; drv.sound[i].sound_type && i < MAX_SOUND; i++ ) { + const char **samplenames = NULL; + if( drv.sound[i].sound_type == SOUND_SAMPLES ) + samplenames = ((struct Samplesinterface *)drv.sound[i].sound_interface)->samplenames; + if (samplenames != 0 && samplenames[0] != 0){ + int k = 0; + if (samplenames[k][0]=='*'){ + /* output sampleof only if different from game name */ + if (strcmp(samplenames[k] + 1, game->name)!=0){ + fprintf(out, " sampleof=\"%s\"", samplenames[k] + 1); + sampleof=1; + ++k; + } + } + } + } +#endif +} + +static void print_game_sample(FILE* out, const struct GameDriver* game) +{ +#if (HAS_SAMPLES) + struct InternalMachineDriver drv; + int i=0; + + if (!sampleof || true){ expand_machine_driver(game->drv, &drv); @@ -441,53 +466,25 @@ int k = 0; if (samplenames[k][0]=='*') { - /* output sampleof only if different from game name */ - if (strcmp(samplenames[k] + 1, game->name)!=0) - fprintf(out, " sampleof=\"%s\"", samplenames[k] + 1); ++k; } + while (samplenames[k] != 0) { + /* check if is not empty */ + if (*samplenames[k]) { + /* check if sample is duplicate */ + int l = 0; + while (l<k && strcmp(samplenames[k],samplenames[l])!=0) + ++l; + if (l==k) + fprintf(out, "\t\t<sample name=\"%s\"/>\n", samplenames[k]); + } + ++k; + } } - } -#endif -} - -static void print_game_sample(FILE* out, const struct GameDriver* game) -{ -#if (HAS_SAMPLES) - struct InternalMachineDriver drv; - int i=0; - - expand_machine_driver(game->drv, &drv); - - for( i = 0; drv.sound[i].sound_type && i < MAX_SOUND; i++ ) - { - const char **samplenames = NULL; - if( drv.sound[i].sound_type == SOUND_SAMPLES ) - samplenames = ((struct Samplesinterface *)drv.sound[i].sound_interface)->samplenames; - if (samplenames != 0 && samplenames[0] != 0) { - int k = 0; - if (samplenames[k][0]=='*') - { - ++k; - } - while (samplenames[k] != 0) { - /* check if is not empty */ - if (*samplenames[k]) { - /* check if sample is duplicate */ - int l = 0; - while (l<k && strcmp(samplenames[k],samplenames[l])!=0) - ++l; - if (l==k) - fprintf(out, "\t\t<sample name=\"%s\"/>\n", samplenames[k]); - } - ++k; - } - } + } } #endif } -#pragma GCC pop_options -/*restore gcc flags */ static void print_game_micro(FILE* out, const struct GameDriver* game) { @@ -686,6 +683,11 @@ else fprintf(out, " sound=\"good\""); + if (game->flags & GAME_IMPERFECT_GRAPHICS) + fprintf(out, " graphic=\"imperfect\""); + else + fprintf(out, " graphic=\"good\""); + fprintf(out, " palettesize=\"%d\"/>\n", driver.total_colors); } @@ -694,10 +696,19 @@ static void print_game_info(FILE* out, const struct GameDriver* game) { extern struct GameDriver driver_0; + const char *start; fprintf(out, "\t<" XML_TOP); - fprintf(out, " name=\"%s\"", game->name ); /* use GameDrv "name" field as the filename */ + fprintf(out, " name=\"%s\"", game->name ); /* use GameDrv "name" field as the filename */ + + start = strrchr(game->source_file, '/'); + if (!start) + start = strrchr(game->source_file, '\\'); + if (!start) + start = game->source_file - 1; + fprintf(out, " sourcefile=\"%s\"", start + 1); + if (game->clone_of && !(game->clone_of->flags & NOT_A_DRIVER)) fprintf(out, " cloneof=\"%s\"", game->clone_of->name); @@ -780,12 +791,12 @@ void print_mame_xml() { int driver_index = 0; - FILE *xml_dat = osd_fopen(FILETYPE_XML_DAT, 1, APPNAME".xml", "w+b"); - - if (xml_dat != NULL) - { - log_cb(RETRO_LOG_INFO, LOGPRE "Generating mame2003.xml\n"); - } else { + FILE *xml_dat = osd_fopen(FILETYPE_XML_DAT, 1, APPNAME".xml", "w+b"); + + if (xml_dat != NULL) + { + log_cb(RETRO_LOG_INFO, LOGPRE "Generating mame2003.xml\n"); + } else { log_cb(RETRO_LOG_WARN, LOGPRE "Unable to open mame2003.xml for writing.\n"); return; } @@ -796,6 +807,7 @@ "<!ELEMENT " XML_ROOT " (" XML_TOP "+)>\n" "\t<!ELEMENT " XML_TOP " (description, year?, manufacturer, history?, biosset*, rom*, disk*, sample*, chip*, video?, sound?, input?, dipswitch*, driver?)>\n" "\t\t<!ATTLIST " XML_TOP " name CDATA #REQUIRED>\n" + "\t\t<!ATTLIST " XML_TOP " sourcefile CDATA #IMPLIED>\n" "\t\t<!ATTLIST " XML_TOP " runnable (yes|no) \"yes\">\n" "\t\t<!ATTLIST " XML_TOP " cloneof CDATA #IMPLIED>\n" "\t\t<!ATTLIST " XML_TOP " romof CDATA #IMPLIED>\n" @@ -861,6 +873,7 @@ "\t\t\t<!ATTLIST driver status (good|preliminary|test) #REQUIRED>\n" "\t\t\t<!ATTLIST driver color (good|imperfect|preliminary) #REQUIRED>\n" "\t\t\t<!ATTLIST driver sound (good|imperfect|preliminary) #REQUIRED>\n" + "\t\t\t<!ATTLIST driver graphic (good|imperfect) #REQUIRED>\n" "\t\t\t<!ATTLIST driver palettesize CDATA #REQUIRED>\n" "]>\n\n" "<" XML_ROOT ">\n" @@ -887,7 +900,7 @@ PRINT_RESOURCE(tps); PRINT_RESOURCE(taitofx1); PRINT_RESOURCE(acpsx); - + fprintf(xml_dat, "</" XML_ROOT ">\n"); fclose(xml_dat); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/input.c -> libretro-mame2003-0~git20210529.tar.xz/src/input.c
Changed
@@ -685,7 +685,12 @@ static int record_count; /* number of key/joy press recorded */ static clock_t record_last; /* time of last key/joy press */ +/* Windows out of spec workaround */ +#if defined WIN32 || (defined _WIN64) || (defined _WINDOWS) #define RECORD_TIME (CLOCKS_PER_SEC*2/3) /* max time between key press */ +#else +#define RECORD_TIME (CLOCKS_PER_SEC/8) /* max time between key press */ +#endif /* Start a sequence recording */ void seq_read_async_start(void)
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/mame-chd/chd.c -> libretro-mame2003-0~git20210529.tar.xz/src/lib/mame-chd/chd.c
Changed
@@ -120,7 +120,7 @@ UINT8 * compressed; /* pointer to buffer for compressed data */ void * codecdata; /* opaque pointer to codec data */ - + struct crcmap_entry * crcmap; /* CRC map entries */ struct crcmap_entry * crcfree; /* free list CRC entries */ struct crcmap_entry ** crctable; /* table of CRC entries */ @@ -320,14 +320,14 @@ SET_ERROR_AND_CLEANUP(CHDERR_INVALID_PARAMETER); if (!parent && (logicalbytes == 0 || hunkbytes == 0)) SET_ERROR_AND_CLEANUP(CHDERR_INVALID_PARAMETER); - + /* if we have a parent, the sizes come from there */ if (parent) { logicalbytes = parent->header.logicalbytes; hunkbytes = parent->header.hunkbytes; } - + /* if we have a parent, it must be V3 or later */ if (parent && parent->header.version < 3) SET_ERROR_AND_CLEANUP(CHDERR_UNSUPPORTED_VERSION); @@ -357,12 +357,12 @@ memcpy(&header.parentmd5[0], &parent->header.md5[0], sizeof(header.parentmd5)); memcpy(&header.parentsha1[0], &parent->header.sha1[0], sizeof(header.parentsha1)); } - + /* validate it */ err = validate_header(&header); if (err != CHDERR_NONE) SET_ERROR_AND_CLEANUP(err); - + /* attempt to create the file */ file = multi_open(filename, "wb"); if (!file) @@ -372,7 +372,7 @@ err = write_header(file, &header); if (err != CHDERR_NONE) SET_ERROR_AND_CLEANUP(err); - + /* create a mini hunk of 0's */ mapentry.offset = 0; mapentry.crc = 0; @@ -380,7 +380,7 @@ mapentry.flags = MAP_ENTRY_TYPE_MINI | MAP_ENTRY_FLAG_NO_CRC; for (i = 0; i < MAP_STACK_ENTRIES; i++) assemble_map_entry(&blank_map_entries[i * MAP_ENTRY_SIZE], &mapentry); - + /* prepare to write a blank hunk map immediately following */ fileoffset = header.length; fullchunks = header.totalhunks / MAP_STACK_ENTRIES; @@ -434,7 +434,7 @@ /* all done */ multi_close(file); - + /* if we have a parent, clone the metadata */ if (parent) { @@ -445,7 +445,7 @@ struct chd_file *newchd = chd_open(filename, 1, parent); if (newchd == NULL) SET_ERROR_AND_CLEANUP(last_error); - + /* clone the metadata */ for (metaindex = 0; ; metaindex++) { @@ -458,7 +458,7 @@ if (err != CHDERR_NONE) SET_ERROR_AND_CLEANUP(err); } - + /* close the file */ chd_close(newchd); } @@ -508,7 +508,7 @@ err = read_header(chd.file, &chd.header); if (err != CHDERR_NONE) SET_ERROR_AND_CLEANUP(err); - + /* validate the header */ err = validate_header(&chd.header); if (err != CHDERR_NONE) @@ -530,14 +530,14 @@ if (parent) { /* check MD5 if it isn't empty */ - if (memcmp(nullmd5, chd.header.parentmd5, sizeof(chd.header.parentmd5)) && - memcmp(nullmd5, chd.parent->header.md5, sizeof(chd.parent->header.md5)) && + if (memcmp(nullmd5, chd.header.parentmd5, sizeof(chd.header.parentmd5)) && + memcmp(nullmd5, chd.parent->header.md5, sizeof(chd.parent->header.md5)) && memcmp(chd.parent->header.md5, chd.header.parentmd5, sizeof(chd.header.parentmd5))) SET_ERROR_AND_CLEANUP(CHDERR_INVALID_PARENT); /* check SHA1 if it isn't empty */ - if (memcmp(nullsha1, chd.header.parentsha1, sizeof(chd.header.parentsha1)) && - memcmp(nullsha1, chd.parent->header.sha1, sizeof(chd.parent->header.sha1)) && + if (memcmp(nullsha1, chd.header.parentsha1, sizeof(chd.header.parentsha1)) && + memcmp(nullsha1, chd.parent->header.sha1, sizeof(chd.parent->header.sha1)) && memcmp(chd.parent->header.sha1, chd.header.parentsha1, sizeof(chd.header.parentsha1))) SET_ERROR_AND_CLEANUP(CHDERR_INVALID_PARENT); } @@ -682,7 +682,7 @@ { struct metadata_entry metaentry; UINT32 count; - + /* if we didn't find it, just return */ last_error = find_metadata_entry(chd, *metatag, metaindex, &metaentry); if (last_error != CHDERR_NONE) @@ -693,7 +693,7 @@ /* fill in the faux metadata */ char faux_metadata[256]; sprintf(faux_metadata, HARD_DISK_METADATA_FORMAT, chd->header.obsolete_cylinders, chd->header.obsolete_heads, chd->header.obsolete_sectors, chd->header.hunkbytes / chd->header.obsolete_hunksize); - + /* fake it */ metaentry.length = strlen(faux_metadata) + 1; if (outputlen > metaentry.length) @@ -711,7 +711,7 @@ /* clamp to the maximum requested size */ if (outputlen > metaentry.length) outputlen = metaentry.length; - + /* read the metadata */ count = multi_read(chd->file, metaentry.offset + METADATA_HEADER_SIZE, outputlen, outputbuf); if (count != outputlen) @@ -739,15 +739,15 @@ /* if the disk is an old version, punt */ if (chd->header.version < 3) return CHDERR_NOT_SUPPORTED; - + /* if the disk isn't writeable, punt */ if (!(chd->header.flags & CHDFLAGS_IS_WRITEABLE)) return CHDERR_FILE_NOT_WRITEABLE; - + /* must be at least 1 byte */ if (inputlen < 1 || inputlen > CHD_MAX_METADATA_SIZE) return CHDERR_INVALID_METADATA_SIZE; - + /* if the entry fits within the previous entry, just overwrite it */ last_error = (metaindex != CHD_METAINDEX_APPEND) ? find_metadata_entry(chd, metatag, metaindex, &metaentry) : CHDERR_METADATA_NOT_FOUND; if (last_error == CHDERR_NONE && inputlen <= metaentry.length) @@ -762,14 +762,14 @@ count = multi_read(chd->file, metaentry.offset, sizeof(raw_meta_header), raw_meta_header); if (count != sizeof(raw_meta_header)) return last_error = CHDERR_READ_ERROR; - + put_bigendian_uint32(&raw_meta_header[4], inputlen); count = multi_write(chd->file, metaentry.offset, sizeof(raw_meta_header), raw_meta_header); if (count != sizeof(raw_meta_header)) return last_error = CHDERR_WRITE_ERROR; } } - + /* otherwise, we need to append an entry */ else { @@ -784,32 +784,32 @@ if (last_error != CHDERR_NONE) return last_error; } - + /* otherwise, update the link in the previous pointer */ else { count = multi_read(chd->file, metaentry.prev, sizeof(raw_meta_header), raw_meta_header); if (count != sizeof(raw_meta_header)) return last_error = CHDERR_READ_ERROR; - + put_bigendian_uint64(&raw_meta_header[8], metaentry.next); count = multi_write(chd->file, metaentry.prev, sizeof(raw_meta_header), raw_meta_header); if (count != sizeof(raw_meta_header)) return last_error = CHDERR_WRITE_ERROR; } } - + /* now build us a new entry */ put_bigendian_uint32(&raw_meta_header[0], metatag); put_bigendian_uint32(&raw_meta_header[4], inputlen); put_bigendian_uint64(&raw_meta_header[8], chd->header.metaoffset); - + /* write out the new header */ metaentry.offset = multi_length(chd->file); count = multi_write(chd->file, metaentry.offset, sizeof(raw_meta_header), raw_meta_header); if (count != sizeof(raw_meta_header)) return last_error = CHDERR_WRITE_ERROR; - + /* follow that with the data */ count = multi_write(chd->file, metaentry.offset + METADATA_HEADER_SIZE, inputlen, inputbuf); if (count != inputlen) @@ -821,7 +821,7 @@ if (last_error != CHDERR_NONE) return last_error; } - + return CHDERR_NONE; } @@ -855,7 +855,7 @@ /* if we're past the end, fail */ if (hunknum >= chd->header.totalhunks) SET_ERROR_AND_CLEANUP(CHDERR_HUNK_OUT_OF_RANGE); - + /* track the max */ if (hunknum > chd->maxhunk) chd->maxhunk = hunknum; @@ -1046,7 +1046,7 @@ /* verify parameters */ if (!chd || !rawfile) SET_ERROR_AND_CLEANUP(CHDERR_INVALID_PARAMETER); - + /* open the raw file */ sourcefile = multi_open(rawfile, "rb"); if (!sourcefile) @@ -1057,7 +1057,7 @@ err = write_header(chd->file, &chd->header); if (err != CHDERR_NONE) SET_ERROR_AND_CLEANUP(err); - + /* create CRC maps for the new CHD and the parent */ init_crcmap(chd, 0); if (chd->parent) @@ -1108,7 +1108,7 @@ err = write_hunk_from_memory(chd, hunknum, chd->cache); if (err != CHDERR_NONE) SET_ERROR_AND_CLEANUP(err); - + /* update our CRC map */ if ((chd->map[hunknum].flags & MAP_ENTRY_FLAG_TYPE_MASK) != MAP_ENTRY_TYPE_SELF_HUNK && (chd->map[hunknum].flags & MAP_ENTRY_FLAG_TYPE_MASK) != MAP_ENTRY_TYPE_PARENT_HUNK) @@ -1213,7 +1213,7 @@ MD5_Update(&md5, chd->cache, bytestochecksum); sha1_update(&sha, bytestochecksum, chd->cache); } - + /* prepare for the next hunk */ sourceoffset += chd->header.hunkbytes; } @@ -1251,7 +1251,7 @@ (header->version == 2 && header->length != CHD_V2_HEADER_SIZE) || (header->version == 3 && header->length != CHD_V3_HEADER_SIZE)) return CHDERR_INVALID_PARAMETER; - + /* require valid flags */ if (header->flags & CHDFLAGS_UNDEFINED) return CHDERR_INVALID_PARAMETER; @@ -1267,19 +1267,19 @@ /* require a valid hunk count */ if (header->totalhunks == 0) return CHDERR_INVALID_PARAMETER; - + /* require a valid MD5 and/or SHA1 if we're using a parent */ if ((header->flags & CHDFLAGS_HAS_PARENT) && !memcmp(header->parentmd5, nullmd5, sizeof(nullmd5)) && !memcmp(header->parentsha1, nullsha1, sizeof(nullsha1))) return CHDERR_INVALID_PARAMETER; - + /* if we're V3 or later, the obsolete fields must be 0 */ - if (header->version >= 3 && + if (header->version >= 3 && (header->obsolete_cylinders != 0 || header->obsolete_sectors != 0 || header->obsolete_heads != 0 || header->obsolete_hunksize != 0)) return CHDERR_INVALID_PARAMETER; /* if we're pre-V3, the obsolete fields must NOT be 0 */ - if (header->version < 3 && + if (header->version < 3 && (header->obsolete_cylinders == 0 || header->obsolete_sectors == 0 || header->obsolete_heads == 0 || header->obsolete_hunksize == 0)) return CHDERR_INVALID_PARAMETER; @@ -1307,7 +1307,7 @@ { /* compressed data */ case MAP_ENTRY_TYPE_COMPRESSED: - + /* read it into the decompression buffer */ bytes = multi_read(chd->file, entry->offset, entry->length, chd->compressed); if (bytes != entry->length) @@ -1340,7 +1340,7 @@ } } break; - + /* uncompressed data */ case MAP_ENTRY_TYPE_UNCOMPRESSED: bytes = multi_read(chd->file, entry->offset, chd->header.hunkbytes, dest); @@ -1384,12 +1384,12 @@ if (chd->cachehunk == hunknum) return CHDERR_NONE; chd->cachehunk = ~0; - + /* otherwise, read the data */ err = read_hunk_into_memory(chd, hunknum, chd->cache); if (err != CHDERR_NONE) return err; - + /* mark the hunk successfully cached in */ chd->cachehunk = hunknum; return CHDERR_NONE; @@ -1410,10 +1410,10 @@ UINT8 fileentry[MAP_ENTRY_SIZE]; const void *data = src; UINT32 bytes, match; - + /* first compute the CRC */ newentry.crc = crc32(0, &src[0], chd->header.hunkbytes); - + /* some extra stuff for zlib+ compression */ if (chd->header.compression == CHDCOMPRESSION_ZLIB_PLUS) { @@ -1421,7 +1421,7 @@ for (bytes = 8; bytes < chd->header.hunkbytes; bytes++) if (src[bytes] != src[bytes - 8]) break; - + /* if so, we don't need to write any data */ if (bytes == chd->header.hunkbytes) { @@ -1459,7 +1459,7 @@ /* first, fill in an uncompressed entry */ newentry.length = chd->header.hunkbytes; newentry.flags = MAP_ENTRY_TYPE_UNCOMPRESSED; - + /* now try compressing the data */ switch (chd->header.compression) { @@ -1585,7 +1585,7 @@ header->hunkbytes = seclen * header->obsolete_hunksize; header->metaoffset = 0; } - + /* extract the V3-specific data */ else { @@ -1596,7 +1596,7 @@ memcpy(header->sha1, &rawheader[80], CHD_SHA1_BYTES); memcpy(header->parentsha1, &rawheader[100], CHD_SHA1_BYTES); } - + /* guess it worked */ return CHDERR_NONE; } @@ -1625,7 +1625,7 @@ /* punt if no interface */ if (!interface.write) return CHDERR_NO_INTERFACE; - + /* only support writing modern headers */ if (header->version != 3) return CHDERR_INVALID_PARAMETER; @@ -1694,7 +1694,7 @@ goto cleanup; } fileoffset += entries * entrysize; - + /* process that many */ if (entrysize == MAP_ENTRY_SIZE) { @@ -1739,17 +1739,17 @@ /* if we already have one, bail */ if (chd->crcmap) return; - + /* reset all pointers */ chd->crcmap = NULL; chd->crcfree = NULL; chd->crctable = NULL; - + /* allocate a list; one for each hunk */ chd->crcmap = malloc(chd->header.totalhunks * sizeof(chd->crcmap[0])); if (!chd->crcmap) return; - + /* allocate a CRC map table */ chd->crctable = malloc(CRCMAP_HASH_SIZE * sizeof(chd->crctable[0])); if (!chd->crctable) @@ -1758,17 +1758,17 @@ chd->crcmap = NULL; return; } - + /* initialize the free list */ for (i = 0; i < chd->header.totalhunks; i++) { chd->crcmap[i].next = chd->crcfree; chd->crcfree = &chd->crcmap[i]; } - + /* initialize the table */ memset(chd->crctable, 0, CRCMAP_HASH_SIZE * sizeof(chd->crctable[0])); - + /* if we're to prepopulate, go for it */ if (prepopulate) for (i = 0; i < chd->header.totalhunks; i++) @@ -1787,11 +1787,11 @@ { UINT32 hash = chd->map[hunknum].crc % CRCMAP_HASH_SIZE; struct crcmap_entry *crcmap; - + /* pull a free entry off the list */ crcmap = chd->crcfree; chd->crcfree = crcmap->next; - + /* set up the entry and link it into the hash table */ crcmap->hunknum = hunknum; crcmap->next = chd->crctable[hash]; @@ -1831,7 +1831,7 @@ { UINT32 lasthunk = (hunknum < chd->header.totalhunks) ? hunknum : chd->header.totalhunks; int curhunk; - + /* if we have a CRC map, use that */ if (chd->crctable) { @@ -1844,12 +1844,12 @@ } return NO_MATCH; } - + /* first see if the last match is a valid one */ if (chd->comparehunk < chd->header.totalhunks && chd->map[chd->comparehunk].crc == crc && !(chd->map[chd->comparehunk].flags & MAP_ENTRY_FLAG_NO_CRC) && !memcmp(rawdata, chd->compare, chd->header.hunkbytes)) return chd->comparehunk; - + /* scan through the CHD's hunk map looking for a match */ for (curhunk = 0; curhunk < lasthunk; curhunk++) if (chd->map[curhunk].crc == crc && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_NO_CRC) && is_really_matching_hunk(chd, curhunk, rawdata)) @@ -1871,7 +1871,7 @@ /* start at the beginning */ metaentry->offset = chd->header.metaoffset; metaentry->prev = 0; - + /* loop until we run out of options */ while (metaentry->offset != 0) { @@ -1882,22 +1882,22 @@ count = multi_read(chd->file, metaentry->offset, sizeof(raw_meta_header), raw_meta_header); if (count != sizeof(raw_meta_header)) break; - + /* extract the data */ metaentry->metatag = get_bigendian_uint32(&raw_meta_header[0]); metaentry->length = get_bigendian_uint32(&raw_meta_header[4]); metaentry->next = get_bigendian_uint64(&raw_meta_header[8]); - + /* if we got a match, proceed */ if (metatag == CHDMETATAG_WILDCARD || metaentry->metatag == metatag) if (metaindex-- == 0) return CHDERR_NONE; - + /* no match, fetch the next link */ metaentry->prev = metaentry->offset; metaentry->offset = metaentry->next; } - + /* if we get here, we didn't find it */ return CHDERR_METADATA_NOT_FOUND; } @@ -2112,4 +2112,4 @@ static UINT64 multi_length(struct chd_interface_file *file) { return (*interface.length)(file); -} \ No newline at end of file +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/lib/mame-chd/chd.h -> libretro-mame2003-0~git20210529.tar.xz/src/lib/mame-chd/chd.h
Changed
@@ -13,7 +13,7 @@ /*************************************************************************** Compressed Hunks of Data header format. All numbers are stored in - Motorola (big-endian) byte ordering. The header is 76 (V1) or 80 (V2) + Motorola (big-endian) byte ordering. The header is 76 (V1) or 80 (V2) bytes long. V1 header: @@ -105,7 +105,7 @@ enum { - CHDERR_NONE, + CHDERR_NONE = 0, CHDERR_NO_INTERFACE, CHDERR_OUT_OF_MEMORY, CHDERR_INVALID_FILE, @@ -131,6 +131,7 @@ + /************************************* * * Type definitions @@ -200,4 +201,4 @@ int chd_compress(struct chd_file *chd, const char *rawfile, UINT32 offset, void (*progress)(const char *, ...)); int chd_verify(struct chd_file *chd, void (*progress)(const char *, ...), UINT8 actualmd5[CHD_MD5_BYTES], UINT8 actualsha1[CHD_SHA1_BYTES]); -#endif /* CHD_H */ \ No newline at end of file +#endif /* CHD_H */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/Makefile.test
Added
@@ -0,0 +1,58 @@ + +OBJDIR = ../obj-unix + +TEST_UNIT_CFLAGS = $(CFLAGS) -Iinclude $(LDFLAGS) -lcheck $(LIBCHECK_CFLAGS) -Werror -Wdeclaration-after-statement -fsanitize=address -fsanitize=undefined -ftest-coverage -fprofile-arcs -ggdb + +TEST_GENERIC_QUEUE = test/queues/test_generic_queue +TEST_GENERIC_QUEUE_SRC = test/queues/test_generic_queue.c queues/generic_queue.c + +TEST_LINKED_LIST = test/lists/test_linked_list +TEST_LINKED_LIST_SRC = test/lists/test_linked_list.c lists/linked_list.c + +TEST_STDSTRING = test/string/test_stdstring +TEST_STDSTRING_SRC = test/string/test_stdstring.c string/stdstring.c encodings/encoding_utf.c \ + compat/compat_strl.c + +TEST_UTILS = test/utils/test_utils +TEST_UTILS_SRC = test/utils/test_utils.c utils/md5.c encodings/encoding_crc32.c \ + streams/file_stream.c vfs/vfs_implementation.c file/file_path.c \ + compat/compat_strl.c time/rtime.c string/stdstring.c encodings/encoding_utf.c + +TEST_HASH = test/hash/test_hash +TEST_HASH_SRC = test/hash/test_hash.c hash/lrc_hash.c \ + streams/file_stream.c vfs/vfs_implementation.c file/file_path.c \ + compat/compat_strl.c time/rtime.c string/stdstring.c encodings/encoding_utf.c + +all: + # Build and execute tests in order, to avoid coverage file collision + # string + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_STDSTRING_SRC) -o $(TEST_STDSTRING) + $(TEST_STDSTRING) + lcov -c -d . -o `dirname $(TEST_STDSTRING)`/coverage.info + # utils + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_UTILS_SRC) -o $(TEST_UTILS) + $(TEST_UTILS) + lcov -c -d . -o `dirname $(TEST_UTILS)`/coverage.info + # utils + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_HASH_SRC) -o $(TEST_HASH) + $(TEST_HASH) + lcov -c -d . -o `dirname $(TEST_HASH)`/coverage.info + # list + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_LINKED_LIST_SRC) -o $(TEST_LINKED_LIST) + $(TEST_LINKED_LIST) + lcov -c -d . -o `dirname $(TEST_LINKED_LIST)`/coverage.info + # queue + $(CC) $(TEST_UNIT_CFLAGS) $(TEST_GENERIC_QUEUE_SRC) -o $(TEST_GENERIC_QUEUE) + $(TEST_GENERIC_QUEUE) + lcov -c -d . -o `dirname $(TEST_GENERIC_QUEUE)`/coverage.info + + lcov -o test/coverage.info \ + -a test/utils/coverage.info \ + -a test/string/coverage.info \ + -a test/lists/coverage.info \ + -a test/queues/coverage.info + genhtml -o test/coverage/ test/coverage.info + +clean: + rm -f *.gcda *.gcno +
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/audio_mix.c
Added
@@ -0,0 +1,381 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_mix.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <memalign.h> + +#include <retro_environment.h> + +#if defined(__SSE2__) +#include <emmintrin.h> +#elif defined(__ALTIVEC__) +#include <altivec.h> +#endif + +#include <retro_miscellaneous.h> +#include <audio/audio_mix.h> +#include <streams/file_stream.h> +#include <audio/conversion/float_to_s16.h> +#include <audio/conversion/s16_to_float.h> + +void audio_mix_volume_C(float *out, const float *in, float vol, size_t samples) +{ + size_t i; + for (i = 0; i < samples; i++) + out[i] += in[i] * vol; +} + +#ifdef __SSE2__ +void audio_mix_volume_SSE2(float *out, const float *in, float vol, size_t samples) +{ + size_t i, remaining_samples; + __m128 volume = _mm_set1_ps(vol); + + for (i = 0; i + 16 <= samples; i += 16, out += 16, in += 16) + { + unsigned j; + __m128 input[4]; + __m128 additive[4]; + + input[0] = _mm_loadu_ps(out + 0); + input[1] = _mm_loadu_ps(out + 4); + input[2] = _mm_loadu_ps(out + 8); + input[3] = _mm_loadu_ps(out + 12); + + additive[0] = _mm_mul_ps(volume, _mm_loadu_ps(in + 0)); + additive[1] = _mm_mul_ps(volume, _mm_loadu_ps(in + 4)); + additive[2] = _mm_mul_ps(volume, _mm_loadu_ps(in + 8)); + additive[3] = _mm_mul_ps(volume, _mm_loadu_ps(in + 12)); + + for (j = 0; j < 4; j++) + _mm_storeu_ps(out + 4 * j, _mm_add_ps(input[j], additive[j])); + } + + remaining_samples = samples - i; + + for (i = 0; i < remaining_samples; i++) + out[i] += in[i] * vol; +} +#endif + +void audio_mix_free_chunk(audio_chunk_t *chunk) +{ + if (!chunk) + return; + +#ifdef HAVE_RWAV + if (chunk->rwav && chunk->rwav->samples) + { + /* rwav_free only frees the samples */ + rwav_free(chunk->rwav); + free(chunk->rwav); + } +#endif + + if (chunk->buf) + free(chunk->buf); + + if (chunk->upsample_buf) + memalign_free(chunk->upsample_buf); + + if (chunk->float_buf) + memalign_free(chunk->float_buf); + + if (chunk->float_resample_buf) + memalign_free(chunk->float_resample_buf); + + if (chunk->resample_buf) + memalign_free(chunk->resample_buf); + + if (chunk->resampler && chunk->resampler_data) + chunk->resampler->free(chunk->resampler_data); + + free(chunk); +} + +audio_chunk_t* audio_mix_load_wav_file(const char *path, int sample_rate) +{ +#ifdef HAVE_RWAV + int sample_size; + int64_t len = 0; + void *buf = NULL; + audio_chunk_t *chunk = (audio_chunk_t*)malloc(sizeof(*chunk)); + + if (!chunk) + return NULL; + + chunk->buf = NULL; + chunk->upsample_buf = NULL; + chunk->float_buf = NULL; + chunk->float_resample_buf = NULL; + chunk->resample_buf = NULL; + chunk->len = 0; + chunk->resample_len = 0; + chunk->rwav = (rwav_t*)malloc(sizeof(rwav_t)); + chunk->sample_rate = sample_rate; + chunk->resample = false; + chunk->resampler = NULL; + chunk->resampler_data = NULL; + chunk->ratio = 0.00f; + + chunk->rwav->bitspersample = 0; + chunk->rwav->numchannels = 0; + chunk->rwav->samplerate = 0; + chunk->rwav->numsamples = 0; + chunk->rwav->subchunk2size = 0; + chunk->rwav->samples = NULL; + + if (!filestream_read_file(path, &buf, &len)) + { + printf("Could not open WAV file for reading.\n"); + goto error; + } + + chunk->buf = buf; + chunk->len = len; + + if (rwav_load(chunk->rwav, chunk->buf, chunk->len) == RWAV_ITERATE_ERROR) + { + printf("error: could not load WAV file\n"); + goto error; + } + + /* numsamples does not know or care about + * multiple channels, but we need space for 2 */ + chunk->upsample_buf = (int16_t*)memalign_alloc(128, + chunk->rwav->numsamples * 2 * sizeof(int16_t)); + + sample_size = chunk->rwav->bitspersample / 8; + + if (sample_size == 1) + { + unsigned i; + + if (chunk->rwav->numchannels == 1) + { + for (i = 0; i < chunk->rwav->numsamples; i++) + { + uint8_t *sample = ( + (uint8_t*)chunk->rwav->samples) + i; + + chunk->upsample_buf[i * 2] = + (int16_t)((sample[0] - 128) << 8); + chunk->upsample_buf[(i * 2) + 1] = + (int16_t)((sample[0] - 128) << 8); + } + } + else if (chunk->rwav->numchannels == 2) + { + for (i = 0; i < chunk->rwav->numsamples; i++) + { + uint8_t *sample = ( + (uint8_t*)chunk->rwav->samples) + + (i * 2); + + chunk->upsample_buf[i * 2] = + (int16_t)((sample[0] - 128) << 8); + chunk->upsample_buf[(i * 2) + 1] = + (int16_t)((sample[1] - 128) << 8); + } + } + } + else if (sample_size == 2) + { + if (chunk->rwav->numchannels == 1) + { + unsigned i; + + for (i = 0; i < chunk->rwav->numsamples; i++) + { + int16_t sample = ((int16_t*) + chunk->rwav->samples)[i]; + + chunk->upsample_buf[i * 2] = sample; + chunk->upsample_buf[(i * 2) + 1] = sample; + } + } + else if (chunk->rwav->numchannels == 2) + memcpy(chunk->upsample_buf, chunk->rwav->samples, + chunk->rwav->subchunk2size); + } + else if (sample_size != 2) + { + /* we don't support any other sample size besides 8 and 16-bit yet */ + printf("error: we don't support a sample size of %d\n", sample_size); + goto error; + } + + if (sample_rate != (int)chunk->rwav->samplerate) + { + chunk->resample = true; + chunk->ratio = (double)sample_rate / chunk->rwav->samplerate; + + retro_resampler_realloc(&chunk->resampler_data, + &chunk->resampler, + NULL, + RESAMPLER_QUALITY_DONTCARE, + chunk->ratio); + + if (chunk->resampler && chunk->resampler_data) + { + struct resampler_data info; + + chunk->float_buf = (float*)memalign_alloc(128, + chunk->rwav->numsamples * 2 * + chunk->ratio * sizeof(float)); + + /* why is *3 needed instead of just *2? Does the + * sinc driver require more space than we know about? */ + chunk->float_resample_buf = (float*)memalign_alloc(128, + chunk->rwav->numsamples * 3 * + chunk->ratio * sizeof(float)); + + convert_s16_to_float(chunk->float_buf, + chunk->upsample_buf, chunk->rwav->numsamples * 2, 1.0); + + info.data_in = (const float*)chunk->float_buf; + info.data_out = chunk->float_resample_buf; + /* a 'frame' consists of two channels, so we set this + * to the number of samples irrespective of channel count */ + info.input_frames = chunk->rwav->numsamples; + info.output_frames = 0; + info.ratio = chunk->ratio; + + chunk->resampler->process(chunk->resampler_data, &info); + + /* number of output_frames does not increase with + * multiple channels, but assume we need space for 2 */ + chunk->resample_buf = (int16_t*)memalign_alloc(128, + info.output_frames * 2 * sizeof(int16_t)); + chunk->resample_len = info.output_frames; + convert_float_to_s16(chunk->resample_buf, + chunk->float_resample_buf, info.output_frames * 2); + } + } + + return chunk; + +error: + audio_mix_free_chunk(chunk); +#endif + return NULL; +} + +size_t audio_mix_get_chunk_num_samples(audio_chunk_t *chunk) +{ + if (!chunk) + return 0; + +#ifdef HAVE_RWAV + if (chunk->rwav) + { + if (chunk->resample) + return chunk->resample_len; + return chunk->rwav->numsamples; + } +#endif + + /* no other filetypes supported yet */ + return 0; +} + +/** + * audio_mix_get_chunk_sample: + * @chunk : audio chunk instance + * @channel : channel of the sample (0=left, 1=right) + * @index : index of the sample + * + * Get a sample from an audio chunk. + * + * Returns: A signed 16-bit audio sample. + **/ +int16_t audio_mix_get_chunk_sample(audio_chunk_t *chunk, + unsigned channel, size_t index) +{ + if (!chunk) + return 0; + +#ifdef HAVE_RWAV + if (chunk->rwav) + { + int sample_size = chunk->rwav->bitspersample / 8; + int16_t sample_out = 0; + + /* 0 is the first/left channel */ + uint8_t *sample = NULL; + + if (chunk->resample) + sample = (uint8_t*)chunk->resample_buf + + (sample_size * index * chunk->rwav->numchannels) + + (channel * sample_size); + else + sample = (uint8_t*)chunk->upsample_buf + + (sample_size * index * chunk->rwav->numchannels) + + (channel * sample_size); + + sample_out = (int16_t)*sample; + + return sample_out; + } +#endif + + /* no other filetypes supported yet */ + return 0; +} + +int16_t* audio_mix_get_chunk_samples(audio_chunk_t *chunk) +{ + if (!chunk) + return 0; + +#ifdef HAVE_RWAV + if (chunk->rwav) + { + int16_t *sample; + + if (chunk->resample) + sample = chunk->resample_buf; + else + sample = chunk->upsample_buf; + + return sample; + } +#endif + + return NULL; +} + +int audio_mix_get_chunk_num_channels(audio_chunk_t *chunk) +{ + if (!chunk) + return 0; + +#ifdef HAVE_RWAV + if (chunk->rwav) + return chunk->rwav->numchannels; +#endif + + /* don't support other formats yet */ + return 0; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/audio_mixer.c
Added
@@ -0,0 +1,1257 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_mixer.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include <audio/audio_mixer.h> +#include <audio/audio_resampler.h> + +#ifdef HAVE_RWAV +#include <formats/rwav.h> +#endif +#include <memalign.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#ifdef HAVE_STB_VORBIS +#define STB_VORBIS_NO_PUSHDATA_API +#define STB_VORBIS_NO_STDIO +#define STB_VORBIS_NO_CRT + +#include <stb/stb_vorbis.h> +#endif + +#ifdef HAVE_DR_FLAC +#define DR_FLAC_IMPLEMENTATION +#include <dr/dr_flac.h> +#endif + +#ifdef HAVE_DR_MP3 +#define DR_MP3_IMPLEMENTATION +#include <retro_assert.h> +#define DRMP3_ASSERT(expression) retro_assert(expression) +#include <dr/dr_mp3.h> +#endif + +#ifdef HAVE_IBXM +#include <ibxm/ibxm.h> +#endif + +#define AUDIO_MIXER_MAX_VOICES 8 +#define AUDIO_MIXER_TEMP_BUFFER 8192 + +struct audio_mixer_sound +{ + enum audio_mixer_type type; + + union + { + struct + { + /* wav */ + const float* pcm; + unsigned frames; + } wav; + +#ifdef HAVE_STB_VORBIS + struct + { + /* ogg */ + const void* data; + unsigned size; + } ogg; +#endif + +#ifdef HAVE_DR_FLAC + struct + { + /* flac */ + const void* data; + unsigned size; + } flac; +#endif + +#ifdef HAVE_DR_MP3 + struct + { + /* mp */ + const void* data; + unsigned size; + } mp3; +#endif + +#ifdef HAVE_IBXM + struct + { + /* mod/s3m/xm */ + const void* data; + unsigned size; + } mod; +#endif + } types; +}; + +struct audio_mixer_voice +{ + union + { + struct + { + unsigned position; + } wav; + +#ifdef HAVE_STB_VORBIS + struct + { + stb_vorbis *stream; + void *resampler_data; + const retro_resampler_t *resampler; + float *buffer; + unsigned position; + unsigned samples; + unsigned buf_samples; + float ratio; + } ogg; +#endif + +#ifdef HAVE_DR_FLAC + struct + { + float* buffer; + drflac *stream; + void *resampler_data; + const retro_resampler_t *resampler; + unsigned position; + unsigned samples; + unsigned buf_samples; + float ratio; + } flac; +#endif + +#ifdef HAVE_DR_MP3 + struct + { + drmp3 stream; + void *resampler_data; + const retro_resampler_t *resampler; + float* buffer; + unsigned position; + unsigned samples; + unsigned buf_samples; + float ratio; + } mp3; +#endif + +#ifdef HAVE_IBXM + struct + { + int* buffer; + struct replay* stream; + struct module* module; + unsigned position; + unsigned samples; + unsigned buf_samples; + } mod; +#endif + } types; + audio_mixer_sound_t *sound; + audio_mixer_stop_cb_t stop_cb; + unsigned type; + float volume; + bool repeat; + +}; + +/* TODO/FIXME - static globals */ +static struct audio_mixer_voice s_voices[AUDIO_MIXER_MAX_VOICES] = {0}; +static unsigned s_rate = 0; + +#ifdef HAVE_RWAV +static bool wav_to_float(const rwav_t* wav, float** pcm, size_t samples_out) +{ + size_t i; + /* Allocate on a 16-byte boundary, and pad to a multiple of 16 bytes */ + float *f = (float*)memalign_alloc(16, + ((samples_out + 15) & ~15) * sizeof(float)); + + if (!f) + return false; + + *pcm = f; + + if (wav->bitspersample == 8) + { + float sample = 0.0f; + const uint8_t *u8 = (const uint8_t*)wav->samples; + + if (wav->numchannels == 1) + { + for (i = wav->numsamples; i != 0; i--) + { + sample = (float)*u8++ / 255.0f; + sample = sample * 2.0f - 1.0f; + *f++ = sample; + *f++ = sample; + } + } + else if (wav->numchannels == 2) + { + for (i = wav->numsamples; i != 0; i--) + { + sample = (float)*u8++ / 255.0f; + sample = sample * 2.0f - 1.0f; + *f++ = sample; + sample = (float)*u8++ / 255.0f; + sample = sample * 2.0f - 1.0f; + *f++ = sample; + } + } + } + else + { + /* TODO/FIXME note to leiradel - can we use audio/conversion/s16_to_float + * functions here? */ + + float sample = 0.0f; + const int16_t *s16 = (const int16_t*)wav->samples; + + if (wav->numchannels == 1) + { + for (i = wav->numsamples; i != 0; i--) + { + sample = (float)((int)*s16++ + 32768) / 65535.0f; + sample = sample * 2.0f - 1.0f; + *f++ = sample; + *f++ = sample; + } + } + else if (wav->numchannels == 2) + { + for (i = wav->numsamples; i != 0; i--) + { + sample = (float)((int)*s16++ + 32768) / 65535.0f; + sample = sample * 2.0f - 1.0f; + *f++ = sample; + sample = (float)((int)*s16++ + 32768) / 65535.0f; + sample = sample * 2.0f - 1.0f; + *f++ = sample; + } + } + } + + return true; +} + +static bool one_shot_resample(const float* in, size_t samples_in, + unsigned rate, float** out, size_t* samples_out) +{ + struct resampler_data info; + void* data = NULL; + const retro_resampler_t* resampler = NULL; + float ratio = (double)s_rate / (double)rate; + + if (!retro_resampler_realloc(&data, &resampler, NULL, + RESAMPLER_QUALITY_DONTCARE, ratio)) + return false; + + /* + * Allocate on a 16-byte boundary, and pad to a multiple of 16 bytes. We + * add four more samples in the formula below just as safeguard, because + * resampler->process sometimes reports more output samples than the + * formula below calculates. Ideally, audio resamplers should have a + * function to return the number of samples they will output given a + * count of input samples. + */ + *samples_out = samples_in * ratio + 4; + *out = (float*)memalign_alloc(16, + ((*samples_out + 15) & ~15) * sizeof(float)); + + if (*out == NULL) + return false; + + info.data_in = in; + info.data_out = *out; + info.input_frames = samples_in / 2; + info.output_frames = 0; + info.ratio = ratio; + + resampler->process(data, &info); + resampler->free(data); + return true; +} +#endif + +void audio_mixer_init(unsigned rate) +{ + unsigned i; + + s_rate = rate; + + for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++) + s_voices[i].type = AUDIO_MIXER_TYPE_NONE; +} + +void audio_mixer_done(void) +{ + unsigned i; + + for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++) + s_voices[i].type = AUDIO_MIXER_TYPE_NONE; +} + +audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size) +{ +#ifdef HAVE_RWAV + /* WAV data */ + rwav_t wav; + /* WAV samples converted to float */ + float* pcm = NULL; + size_t samples = 0; + /* Result */ + audio_mixer_sound_t* sound = NULL; + enum rwav_state rwav_ret = rwav_load(&wav, buffer, size); + + if (rwav_ret != RWAV_ITERATE_DONE) + return NULL; + + samples = wav.numsamples * 2; + + if (!wav_to_float(&wav, &pcm, samples)) + return NULL; + + if (wav.samplerate != s_rate) + { + float* resampled = NULL; + + if (!one_shot_resample(pcm, samples, + wav.samplerate, &resampled, &samples)) + return NULL; + + memalign_free((void*)pcm); + pcm = resampled; + } + + sound = (audio_mixer_sound_t*)calloc(1, sizeof(*sound)); + + if (!sound) + { + memalign_free((void*)pcm); + return NULL; + } + + sound->type = AUDIO_MIXER_TYPE_WAV; + sound->types.wav.frames = (unsigned)(samples / 2); + sound->types.wav.pcm = pcm; + + rwav_free(&wav); + + return sound; +#else + return NULL; +#endif +} + +audio_mixer_sound_t* audio_mixer_load_ogg(void *buffer, int32_t size) +{ +#ifdef HAVE_STB_VORBIS + audio_mixer_sound_t* sound = (audio_mixer_sound_t*)calloc(1, sizeof(*sound)); + + if (!sound) + return NULL; + + sound->type = AUDIO_MIXER_TYPE_OGG; + sound->types.ogg.size = size; + sound->types.ogg.data = buffer; + + return sound; +#else + return NULL; +#endif +} + +audio_mixer_sound_t* audio_mixer_load_flac(void *buffer, int32_t size) +{ +#ifdef HAVE_DR_FLAC + audio_mixer_sound_t* sound = (audio_mixer_sound_t*)calloc(1, sizeof(*sound)); + + if (!sound) + return NULL; + + sound->type = AUDIO_MIXER_TYPE_FLAC; + sound->types.flac.size = size; + sound->types.flac.data = buffer; + + return sound; +#else + return NULL; +#endif +} + +audio_mixer_sound_t* audio_mixer_load_mp3(void *buffer, int32_t size) +{ +#ifdef HAVE_DR_MP3 + audio_mixer_sound_t* sound = (audio_mixer_sound_t*)calloc(1, sizeof(*sound)); + + if (!sound) + return NULL; + + sound->type = AUDIO_MIXER_TYPE_MP3; + sound->types.mp3.size = size; + sound->types.mp3.data = buffer; + + return sound; +#else + return NULL; +#endif +} + +audio_mixer_sound_t* audio_mixer_load_mod(void *buffer, int32_t size) +{ +#ifdef HAVE_IBXM + audio_mixer_sound_t* sound = (audio_mixer_sound_t*)calloc(1, sizeof(*sound)); + + if (!sound) + return NULL; + + sound->type = AUDIO_MIXER_TYPE_MOD; + sound->types.mod.size = size; + sound->types.mod.data = buffer; + + return sound; +#else + return NULL; +#endif +} + +void audio_mixer_destroy(audio_mixer_sound_t* sound) +{ + void *handle = NULL; + if (!sound) + return; + + switch (sound->type) + { + case AUDIO_MIXER_TYPE_WAV: + handle = (void*)sound->types.wav.pcm; + if (handle) + memalign_free(handle); + break; + case AUDIO_MIXER_TYPE_OGG: +#ifdef HAVE_STB_VORBIS + handle = (void*)sound->types.ogg.data; + if (handle) + free(handle); +#endif + break; + case AUDIO_MIXER_TYPE_MOD: +#ifdef HAVE_IBXM + handle = (void*)sound->types.mod.data; + if (handle) + free(handle); +#endif + break; + case AUDIO_MIXER_TYPE_FLAC: +#ifdef HAVE_DR_FLAC + handle = (void*)sound->types.flac.data; + if (handle) + free(handle); +#endif + break; + case AUDIO_MIXER_TYPE_MP3: +#ifdef HAVE_DR_MP3 + handle = (void*)sound->types.mp3.data; + if (handle) + free(handle); +#endif + break; + case AUDIO_MIXER_TYPE_NONE: + break; + } + + free(sound); +} + +static bool audio_mixer_play_wav(audio_mixer_sound_t* sound, + audio_mixer_voice_t* voice, bool repeat, float volume, + audio_mixer_stop_cb_t stop_cb) +{ + voice->types.wav.position = 0; + return true; +} + +#ifdef HAVE_STB_VORBIS +static bool audio_mixer_play_ogg( + audio_mixer_sound_t* sound, + audio_mixer_voice_t* voice, + bool repeat, float volume, + audio_mixer_stop_cb_t stop_cb) +{ + stb_vorbis_info info; + int res = 0; + float ratio = 1.0f; + unsigned samples = 0; + void *ogg_buffer = NULL; + void *resampler_data = NULL; + const retro_resampler_t* resamp = NULL; + stb_vorbis *stb_vorbis = stb_vorbis_open_memory( + (const unsigned char*)sound->types.ogg.data, + sound->types.ogg.size, &res, NULL); + + if (!stb_vorbis) + return false; + + info = stb_vorbis_get_info(stb_vorbis); + + if (info.sample_rate != s_rate) + { + ratio = (double)s_rate / (double)info.sample_rate; + + if (!retro_resampler_realloc(&resampler_data, + &resamp, NULL, RESAMPLER_QUALITY_DONTCARE, + ratio)) + goto error; + } + + samples = (unsigned)(AUDIO_MIXER_TEMP_BUFFER * ratio); + ogg_buffer = (float*)memalign_alloc(16, + ((samples + 15) & ~15) * sizeof(float)); + + if (!ogg_buffer) + { + if (resamp && resampler_data) + resamp->free(resampler_data); + goto error; + } + + /* "system" menu sounds may reuse the same voice without freeing anything first, so do that here if needed */ + if (voice->types.ogg.stream) + stb_vorbis_close(voice->types.ogg.stream); + if (voice->types.ogg.resampler && voice->types.ogg.resampler_data) + voice->types.ogg.resampler->free(voice->types.ogg.resampler_data); + if (voice->types.ogg.buffer) + memalign_free(voice->types.ogg.buffer); + + voice->types.ogg.resampler = resamp; + voice->types.ogg.resampler_data = resampler_data; + voice->types.ogg.buffer = (float*)ogg_buffer; + voice->types.ogg.buf_samples = samples; + voice->types.ogg.ratio = ratio; + voice->types.ogg.stream = stb_vorbis; + voice->types.ogg.position = 0; + voice->types.ogg.samples = 0; + + return true; + +error: + stb_vorbis_close(stb_vorbis); + return false; +} +#endif + +#ifdef HAVE_IBXM +static bool audio_mixer_play_mod( + audio_mixer_sound_t* sound, + audio_mixer_voice_t* voice, + bool repeat, float volume, + audio_mixer_stop_cb_t stop_cb) +{ + struct data data; + char message[64]; + int buf_samples = 0; + int samples = 0; + void *mod_buffer = NULL; + struct module* module = NULL; + struct replay* replay = NULL; + + data.buffer = (char*)sound->types.mod.data; + data.length = sound->types.mod.size; + module = module_load(&data, message); + + if (!module) + { + printf("audio_mixer_play_mod module_load() failed with error: %s\n", message); + goto error; + } + + if (voice->types.mod.module) + dispose_module(voice->types.mod.module); + + voice->types.mod.module = module; + + replay = new_replay(module, s_rate, 1); + + if (!replay) + { + printf("audio_mixer_play_mod new_replay() failed\n"); + goto error; + } + + buf_samples = calculate_mix_buf_len(s_rate); + mod_buffer = memalign_alloc(16, ((buf_samples + 15) & ~15) * sizeof(int)); + + if (!mod_buffer) + { + printf("audio_mixer_play_mod cannot allocate mod_buffer !\n"); + goto error; + } + + samples = replay_calculate_duration(replay); + + if (!samples) + { + printf("audio_mixer_play_mod cannot retrieve duration !\n"); + goto error; + } + + /* FIXME: stopping and then starting a mod stream will crash here in dispose_replay (ASAN says struct replay is misaligned?) */ + if (voice->types.mod.stream) + dispose_replay(voice->types.mod.stream); + if (voice->types.mod.buffer) + memalign_free(voice->types.mod.buffer); + + voice->types.mod.buffer = (int*)mod_buffer; + voice->types.mod.buf_samples = buf_samples; + voice->types.mod.stream = replay; + voice->types.mod.position = 0; + voice->types.mod.samples = 0; /* samples; */ + + return true; + +error: + if (mod_buffer) + memalign_free(mod_buffer); + if (module) + dispose_module(module); + return false; + +} +#endif + +#ifdef HAVE_DR_FLAC +static bool audio_mixer_play_flac( + audio_mixer_sound_t* sound, + audio_mixer_voice_t* voice, + bool repeat, float volume, + audio_mixer_stop_cb_t stop_cb) +{ + float ratio = 1.0f; + unsigned samples = 0; + void *flac_buffer = NULL; + void *resampler_data = NULL; + const retro_resampler_t* resamp = NULL; + drflac *dr_flac = drflac_open_memory((const unsigned char*)sound->types.flac.data,sound->types.flac.size); + + if (!dr_flac) + return false; + if (dr_flac->sampleRate != s_rate) + { + ratio = (double)s_rate / (double)(dr_flac->sampleRate); + + if (!retro_resampler_realloc(&resampler_data, + &resamp, NULL, RESAMPLER_QUALITY_DONTCARE, + ratio)) + goto error; + } + + samples = (unsigned)(AUDIO_MIXER_TEMP_BUFFER * ratio); + flac_buffer = (float*)memalign_alloc(16, + ((samples + 15) & ~15) * sizeof(float)); + + if (!flac_buffer) + { + if (resamp && resamp->free) + resamp->free(resampler_data); + goto error; + } + + if (voice->types.flac.stream) + drflac_close(voice->types.flac.stream); + if (voice->types.flac.resampler && voice->types.flac.resampler_data) + voice->types.flac.resampler->free(voice->types.flac.resampler_data); + if (voice->types.flac.buffer) + memalign_free(voice->types.flac.buffer); + + voice->types.flac.resampler = resamp; + voice->types.flac.resampler_data = resampler_data; + voice->types.flac.buffer = (float*)flac_buffer; + voice->types.flac.buf_samples = samples; + voice->types.flac.ratio = ratio; + voice->types.flac.stream = dr_flac; + voice->types.flac.position = 0; + voice->types.flac.samples = 0; + + return true; + +error: + drflac_close(dr_flac); + return false; +} +#endif + +#ifdef HAVE_DR_MP3 +static bool audio_mixer_play_mp3( + audio_mixer_sound_t* sound, + audio_mixer_voice_t* voice, + bool repeat, float volume, + audio_mixer_stop_cb_t stop_cb) +{ + float ratio = 1.0f; + unsigned samples = 0; + void *mp3_buffer = NULL; + void *resampler_data = NULL; + const retro_resampler_t* resamp = NULL; + bool res; + + if (voice->types.mp3.stream.pData) + { + drmp3_uninit(&voice->types.mp3.stream); + memset(&voice->types.mp3.stream, 0, sizeof(voice->types.mp3.stream)); + } + + res = drmp3_init_memory(&voice->types.mp3.stream, (const unsigned char*)sound->types.mp3.data, sound->types.mp3.size, NULL); + + if (!res) + return false; + + if (voice->types.mp3.stream.sampleRate != s_rate) + { + ratio = (double)s_rate / (double)(voice->types.mp3.stream.sampleRate); + + if (!retro_resampler_realloc(&resampler_data, + &resamp, NULL, RESAMPLER_QUALITY_DONTCARE, + ratio)) + goto error; + } + + samples = (unsigned)(AUDIO_MIXER_TEMP_BUFFER * ratio); + mp3_buffer = (float*)memalign_alloc(16, + ((samples + 15) & ~15) * sizeof(float)); + + if (!mp3_buffer) + { + if (resamp && resampler_data) + resamp->free(resampler_data); + goto error; + } + + /* "system" menu sounds may reuse the same voice without freeing anything first, so do that here if needed */ + if (voice->types.mp3.resampler && voice->types.mp3.resampler_data) + voice->types.mp3.resampler->free(voice->types.mp3.resampler_data); + if (voice->types.mp3.buffer) + memalign_free(voice->types.mp3.buffer); + + voice->types.mp3.resampler = resamp; + voice->types.mp3.resampler_data = resampler_data; + voice->types.mp3.buffer = (float*)mp3_buffer; + voice->types.mp3.buf_samples = samples; + voice->types.mp3.ratio = ratio; + voice->types.mp3.position = 0; + voice->types.mp3.samples = 0; + + return true; + +error: + drmp3_uninit(&voice->types.mp3.stream); + return false; +} +#endif + +audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, bool repeat, + float volume, audio_mixer_stop_cb_t stop_cb) +{ + unsigned i; + bool res = false; + audio_mixer_voice_t* voice = s_voices; + + if (!sound) + return NULL; + + for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++, voice++) + { + if (voice->type != AUDIO_MIXER_TYPE_NONE) + continue; + + switch (sound->type) + { + case AUDIO_MIXER_TYPE_WAV: + res = audio_mixer_play_wav(sound, voice, repeat, volume, stop_cb); + break; + case AUDIO_MIXER_TYPE_OGG: +#ifdef HAVE_STB_VORBIS + res = audio_mixer_play_ogg(sound, voice, repeat, volume, stop_cb); +#endif + break; + case AUDIO_MIXER_TYPE_MOD: +#ifdef HAVE_IBXM + res = audio_mixer_play_mod(sound, voice, repeat, volume, stop_cb); +#endif + break; + case AUDIO_MIXER_TYPE_FLAC: +#ifdef HAVE_DR_FLAC + res = audio_mixer_play_flac(sound, voice, repeat, volume, stop_cb); +#endif + break; + case AUDIO_MIXER_TYPE_MP3: +#ifdef HAVE_DR_MP3 + res = audio_mixer_play_mp3(sound, voice, repeat, volume, stop_cb); +#endif + break; + case AUDIO_MIXER_TYPE_NONE: + break; + } + + break; + } + + if (res) + { + voice->type = sound->type; + voice->repeat = repeat; + voice->volume = volume; + voice->sound = sound; + voice->stop_cb = stop_cb; + } + else + voice = NULL; + + return voice; +} + +void audio_mixer_stop(audio_mixer_voice_t* voice) +{ + audio_mixer_stop_cb_t stop_cb = NULL; + audio_mixer_sound_t* sound = NULL; + + if (voice) + { + stop_cb = voice->stop_cb; + sound = voice->sound; + + voice->type = AUDIO_MIXER_TYPE_NONE; + + if (stop_cb) + stop_cb(sound, AUDIO_MIXER_SOUND_STOPPED); + } +} + +static void audio_mixer_mix_wav(float* buffer, size_t num_frames, + audio_mixer_voice_t* voice, + float volume) +{ + int i; + unsigned buf_free = (unsigned)(num_frames * 2); + const audio_mixer_sound_t* sound = voice->sound; + unsigned pcm_available = sound->types.wav.frames + * 2 - voice->types.wav.position; + const float* pcm = sound->types.wav.pcm + + voice->types.wav.position; + +again: + if (pcm_available < buf_free) + { + for (i = pcm_available; i != 0; i--) + *buffer++ += *pcm++ * volume; + + if (voice->repeat) + { + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_REPEATED); + + buf_free -= pcm_available; + pcm_available = sound->types.wav.frames * 2; + pcm = sound->types.wav.pcm; + voice->types.wav.position = 0; + goto again; + } + + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED); + + voice->type = AUDIO_MIXER_TYPE_NONE; + } + else + { + for (i = buf_free; i != 0; i--) + *buffer++ += *pcm++ * volume; + + voice->types.wav.position += buf_free; + } +} + +#ifdef HAVE_STB_VORBIS +static void audio_mixer_mix_ogg(float* buffer, size_t num_frames, + audio_mixer_voice_t* voice, + float volume) +{ + int i; + float* temp_buffer = NULL; + unsigned buf_free = (unsigned)(num_frames * 2); + unsigned temp_samples = 0; + float* pcm = NULL; + + if (voice->types.ogg.position == voice->types.ogg.samples) + { +again: + if (temp_buffer == NULL) + temp_buffer = (float*)malloc(AUDIO_MIXER_TEMP_BUFFER * sizeof(float)); + + temp_samples = stb_vorbis_get_samples_float_interleaved( + voice->types.ogg.stream, 2, temp_buffer, + AUDIO_MIXER_TEMP_BUFFER) * 2; + + if (temp_samples == 0) + { + if (voice->repeat) + { + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_REPEATED); + + stb_vorbis_seek_start(voice->types.ogg.stream); + goto again; + } + + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED); + + voice->type = AUDIO_MIXER_TYPE_NONE; + goto cleanup; + } + + if (voice->types.ogg.resampler) + { + struct resampler_data info; + info.data_in = temp_buffer; + info.data_out = voice->types.ogg.buffer; + info.input_frames = temp_samples / 2; + info.output_frames = 0; + info.ratio = voice->types.ogg.ratio; + + voice->types.ogg.resampler->process( + voice->types.ogg.resampler_data, &info); + } + else + memcpy(voice->types.ogg.buffer, temp_buffer, + temp_samples * sizeof(float)); + + voice->types.ogg.position = 0; + voice->types.ogg.samples = voice->types.ogg.buf_samples; + } + + pcm = voice->types.ogg.buffer + voice->types.ogg.position; + + if (voice->types.ogg.samples < buf_free) + { + for (i = voice->types.ogg.samples; i != 0; i--) + *buffer++ += *pcm++ * volume; + + buf_free -= voice->types.ogg.samples; + goto again; + } + + for (i = buf_free; i != 0; --i ) + *buffer++ += *pcm++ * volume; + + voice->types.ogg.position += buf_free; + voice->types.ogg.samples -= buf_free; + +cleanup: + if (temp_buffer != NULL) + free(temp_buffer); +} +#endif + +#ifdef HAVE_IBXM +static void audio_mixer_mix_mod(float* buffer, size_t num_frames, + audio_mixer_voice_t* voice, + float volume) +{ + int i; + float samplef = 0.0f; + unsigned temp_samples = 0; + unsigned buf_free = (unsigned)(num_frames * 2); + int* pcm = NULL; + + if (voice->types.mod.samples == 0) + { +again: + temp_samples = replay_get_audio( + voice->types.mod.stream, voice->types.mod.buffer, 0 ) * 2; + + if (temp_samples == 0) + { + if (voice->repeat) + { + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_REPEATED); + + replay_seek( voice->types.mod.stream, 0); + goto again; + } + + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED); + + voice->type = AUDIO_MIXER_TYPE_NONE; + return; + } + + voice->types.mod.position = 0; + voice->types.mod.samples = temp_samples; + } + pcm = voice->types.mod.buffer + voice->types.mod.position; + + if (voice->types.mod.samples < buf_free) + { + for (i = voice->types.mod.samples; i != 0; i--) + { + samplef = ((float)(*pcm++) + 32768.0f) / 65535.0f; + samplef = samplef * 2.0f - 1.0f; + *buffer++ += samplef * volume; + } + + buf_free -= voice->types.mod.samples; + goto again; + } + + for (i = buf_free; i != 0; --i ) + { + samplef = ((float)(*pcm++) + 32768.0f) / 65535.0f; + samplef = samplef * 2.0f - 1.0f; + *buffer++ += samplef * volume; + } + + voice->types.mod.position += buf_free; + voice->types.mod.samples -= buf_free; +} +#endif + +#ifdef HAVE_DR_FLAC +static void audio_mixer_mix_flac(float* buffer, size_t num_frames, + audio_mixer_voice_t* voice, + float volume) +{ + int i; + struct resampler_data info; + float temp_buffer[AUDIO_MIXER_TEMP_BUFFER] = { 0 }; + unsigned buf_free = (unsigned)(num_frames * 2); + unsigned temp_samples = 0; + float *pcm = NULL; + + if (voice->types.flac.position == voice->types.flac.samples) + { +again: + temp_samples = (unsigned)drflac_read_f32( voice->types.flac.stream, AUDIO_MIXER_TEMP_BUFFER, temp_buffer); + if (temp_samples == 0) + { + if (voice->repeat) + { + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_REPEATED); + + drflac_seek_to_sample(voice->types.flac.stream,0); + goto again; + } + + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED); + + voice->type = AUDIO_MIXER_TYPE_NONE; + return; + } + + info.data_in = temp_buffer; + info.data_out = voice->types.flac.buffer; + info.input_frames = temp_samples / 2; + info.output_frames = 0; + info.ratio = voice->types.flac.ratio; + + if (voice->types.flac.resampler) + voice->types.flac.resampler->process( + voice->types.flac.resampler_data, &info); + else + memcpy(voice->types.flac.buffer, temp_buffer, temp_samples * sizeof(float)); + voice->types.flac.position = 0; + voice->types.flac.samples = voice->types.flac.buf_samples; + } + + pcm = voice->types.flac.buffer + voice->types.flac.position; + + if (voice->types.flac.samples < buf_free) + { + for (i = voice->types.flac.samples; i != 0; i--) + *buffer++ += *pcm++ * volume; + + buf_free -= voice->types.flac.samples; + goto again; + } + + for (i = buf_free; i != 0; --i ) + *buffer++ += *pcm++ * volume; + + voice->types.flac.position += buf_free; + voice->types.flac.samples -= buf_free; +} +#endif + +#ifdef HAVE_DR_MP3 +static void audio_mixer_mix_mp3(float* buffer, size_t num_frames, + audio_mixer_voice_t* voice, + float volume) +{ + int i; + struct resampler_data info; + float temp_buffer[AUDIO_MIXER_TEMP_BUFFER] = { 0 }; + unsigned buf_free = (unsigned)(num_frames * 2); + unsigned temp_samples = 0; + float* pcm = NULL; + + if (voice->types.mp3.position == voice->types.mp3.samples) + { +again: + temp_samples = (unsigned)drmp3_read_f32( + &voice->types.mp3.stream, + AUDIO_MIXER_TEMP_BUFFER / 2, temp_buffer) * 2; + + if (temp_samples == 0) + { + if (voice->repeat) + { + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_REPEATED); + + drmp3_seek_to_frame(&voice->types.mp3.stream,0); + goto again; + } + + if (voice->stop_cb) + voice->stop_cb(voice->sound, AUDIO_MIXER_SOUND_FINISHED); + + voice->type = AUDIO_MIXER_TYPE_NONE; + return; + } + + info.data_in = temp_buffer; + info.data_out = voice->types.mp3.buffer; + info.input_frames = temp_samples / 2; + info.output_frames = 0; + info.ratio = voice->types.mp3.ratio; + + if (voice->types.mp3.resampler) + voice->types.mp3.resampler->process( + voice->types.mp3.resampler_data, &info); + else + memcpy(voice->types.mp3.buffer, temp_buffer, + temp_samples * sizeof(float)); + voice->types.mp3.position = 0; + voice->types.mp3.samples = voice->types.mp3.buf_samples; + } + + pcm = voice->types.mp3.buffer + voice->types.mp3.position; + + if (voice->types.mp3.samples < buf_free) + { + for (i = voice->types.mp3.samples; i != 0; i--) + *buffer++ += *pcm++ * volume; + + buf_free -= voice->types.mp3.samples; + goto again; + } + + for (i = buf_free; i != 0; --i ) + *buffer++ += *pcm++ * volume; + + voice->types.mp3.position += buf_free; + voice->types.mp3.samples -= buf_free; +} +#endif + +void audio_mixer_mix(float* buffer, size_t num_frames, + float volume_override, bool override) +{ + unsigned i; + size_t j = 0; + float* sample = NULL; + audio_mixer_voice_t* voice = s_voices; + + for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++, voice++) + { + float volume = (override) ? volume_override : voice->volume; + + switch (voice->type) + { + case AUDIO_MIXER_TYPE_WAV: + audio_mixer_mix_wav(buffer, num_frames, voice, volume); + break; + case AUDIO_MIXER_TYPE_OGG: +#ifdef HAVE_STB_VORBIS + audio_mixer_mix_ogg(buffer, num_frames, voice, volume); +#endif + break; + case AUDIO_MIXER_TYPE_MOD: +#ifdef HAVE_IBXM + audio_mixer_mix_mod(buffer, num_frames, voice, volume); +#endif + break; + case AUDIO_MIXER_TYPE_FLAC: +#ifdef HAVE_DR_FLAC + audio_mixer_mix_flac(buffer, num_frames, voice, volume); +#endif + break; + case AUDIO_MIXER_TYPE_MP3: +#ifdef HAVE_DR_MP3 + audio_mixer_mix_mp3(buffer, num_frames, voice, volume); +#endif + break; + case AUDIO_MIXER_TYPE_NONE: + break; + } + } + + for (j = 0, sample = buffer; j < num_frames * 2; j++, sample++) + { + if (*sample < -1.0f) + *sample = -1.0f; + else if (*sample > 1.0f) + *sample = 1.0f; + } +} + +float audio_mixer_voice_get_volume(audio_mixer_voice_t *voice) +{ + if (!voice) + return 0.0f; + + return voice->volume; +} + +void audio_mixer_voice_set_volume(audio_mixer_voice_t *voice, float val) +{ + if (!voice) + return; + + voice->volume = val; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion/float_to_s16.c
Added
@@ -0,0 +1,166 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (float_to_s16.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include <stdint.h> +#include <stddef.h> + +#if defined(__SSE2__) +#include <emmintrin.h> +#elif defined(__ALTIVEC__) +#include <altivec.h> +#endif + +#if (defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS)) || defined(HAVE_NEON) +#ifndef HAVE_ARM_NEON_OPTIMIZATIONS +#define HAVE_ARM_NEON_OPTIMIZATIONS +#endif +#endif + +#include <features/features_cpu.h> +#include <audio/conversion/float_to_s16.h> + +#if defined(HAVE_ARM_NEON_OPTIMIZATIONS) +static bool float_to_s16_neon_enabled = false; +void convert_float_s16_asm(int16_t *out, const float *in, size_t samples); +#endif + +/** + * convert_float_to_s16: + * @out : output buffer + * @in : input buffer + * @samples : size of samples to be converted + * + * Converts floating point + * to signed integer 16-bit. + * + * C implementation callback function. + **/ +void convert_float_to_s16(int16_t *out, + const float *in, size_t samples) +{ + size_t i = 0; +#if defined(__SSE2__) + __m128 factor = _mm_set1_ps((float)0x8000); + + for (i = 0; i + 8 <= samples; i += 8, in += 8, out += 8) + { + __m128 input_l = _mm_loadu_ps(in + 0); + __m128 input_r = _mm_loadu_ps(in + 4); + __m128 res_l = _mm_mul_ps(input_l, factor); + __m128 res_r = _mm_mul_ps(input_r, factor); + __m128i ints_l = _mm_cvtps_epi32(res_l); + __m128i ints_r = _mm_cvtps_epi32(res_r); + __m128i packed = _mm_packs_epi32(ints_l, ints_r); + + _mm_storeu_si128((__m128i *)out, packed); + } + + samples = samples - i; + i = 0; +#elif defined(__ALTIVEC__) + int samples_in = samples; + + /* Unaligned loads/store is a bit expensive, + * so we optimize for the good path (very likely). */ + if (((uintptr_t)out & 15) + ((uintptr_t)in & 15) == 0) + { + size_t i; + for (i = 0; i + 8 <= samples; i += 8, in += 8, out += 8) + { + vector float input0 = vec_ld( 0, in); + vector float input1 = vec_ld(16, in); + vector signed int result0 = vec_cts(input0, 15); + vector signed int result1 = vec_cts(input1, 15); + vec_st(vec_packs(result0, result1), 0, out); + } + + samples_in -= i; + } + + samples = samples_in; + i = 0; +#elif defined(HAVE_ARM_NEON_OPTIMIZATIONS) + if (float_to_s16_neon_enabled) + { + size_t aligned_samples = samples & ~7; + if (aligned_samples) + convert_float_s16_asm(out, in, aligned_samples); + + out = out + aligned_samples; + in = in + aligned_samples; + samples = samples - aligned_samples; + i = 0; + } +#elif defined(_MIPS_ARCH_ALLEGREX) + +#ifdef DEBUG + /* Make sure the buffers are 16 byte aligned, this should be + * the default behaviour of malloc in the PSPSDK. + * Assume alignment. */ + retro_assert(((uintptr_t)in & 0xf) == 0); + retro_assert(((uintptr_t)out & 0xf) == 0); +#endif + + for (i = 0; i + 8 <= samples; i += 8) + { + __asm__ ( + ".set push \n" + ".set noreorder \n" + + "lv.q c100, 0(%0) \n" + "lv.q c110, 16(%0) \n" + + "vf2in.q c100, c100, 31 \n" + "vf2in.q c110, c110, 31 \n" + "vi2s.q c100, c100 \n" + "vi2s.q c102, c110 \n" + + "sv.q c100, 0(%1) \n" + + ".set pop \n" + :: "r"(in + i), "r"(out + i)); + } + +#endif + + for (; i < samples; i++) + { + int32_t val = (int32_t)(in[i] * 0x8000); + out[i] = (val > 0x7FFF) ? 0x7FFF : + (val < -0x8000 ? -0x8000 : (int16_t)val); + } +} + +/** + * convert_float_to_s16_init_simd: + * + * Sets up function pointers for conversion + * functions based on CPU features. + **/ +void convert_float_to_s16_init_simd(void) +{ +#if defined(HAVE_ARM_NEON_OPTIMIZATIONS) + unsigned cpu = cpu_features_get(); + + if (cpu & RETRO_SIMD_NEON) + float_to_s16_neon_enabled = true; +#endif +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion/float_to_s16_neon.S
Added
@@ -0,0 +1,69 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (float_to_s16_neon.S). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS) + +#ifndef __MACH__ +.arm +#endif + +.align 4 +.globl convert_float_s16_asm +#ifndef __MACH__ +.type convert_float_s16_asm, %function +#endif +.globl _convert_float_s16_asm +#ifndef __MACH__ +.type _convert_float_s16_asm, %function +#endif +# convert_float_s16_asm(int16_t *out, const float *in, size_t samples) +convert_float_s16_asm: +_convert_float_s16_asm: + # Hacky way to get a constant of 2^15. + # ((2^4)^2)^2 * 0.5 = 2^15 + vmov.f32 q8, #16.0 + vmov.f32 q9, #0.5 + vmul.f32 q8, q8, q8 + vmul.f32 q8, q8, q8 + vmul.f32 q8, q8, q9 + +1: + # Preload here? + vld1.f32 {q0-q1}, [r1]! + + vmul.f32 q0, q0, q8 + vmul.f32 q1, q1, q8 + + vcvt.s32.f32 q0, q0 + vcvt.s32.f32 q1, q1 + + vqmovn.s32 d4, q0 + vqmovn.s32 d5, q1 + + vst1.f32 {d4-d5}, [r0]! + + # Guaranteed to get samples in multiples of 8. + subs r2, r2, #8 + bne 1b + + bx lr + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion/float_to_s16_neon.c
Added
@@ -0,0 +1,64 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (float_to_s16_neon.S). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS) + +#if defined(__thumb__) +#define DECL_ARMMODE(x) " .align 2\n" " .global " x "\n" " .thumb\n" " .thumb_func\n" " .type " x ", %function\n" x ":\n" +#else +#define DECL_ARMMODE(x) " .align 4\n" " .global " x "\n" " .arm\n" x ":\n" +#endif + +asm( + DECL_ARMMODE("convert_float_s16_asm") + DECL_ARMMODE("_convert_float_s16_asm") + "# convert_float_s16_asm(int16_t *out, const float *in, size_t samples)\n" + " # Hacky way to get a constant of 2^15.\n" + " # ((2^4)^2)^2 * 0.5 = 2^15\n" + " vmov.f32 q8, #16.0\n" + " vmov.f32 q9, #0.5\n" + " vmul.f32 q8, q8, q8\n" + " vmul.f32 q8, q8, q8\n" + " vmul.f32 q8, q8, q9\n" + "\n" + "1:\n" + " # Preload here?\n" + " vld1.f32 {q0-q1}, [r1]!\n" + "\n" + " vmul.f32 q0, q0, q8\n" + " vmul.f32 q1, q1, q8\n" + "\n" + " vcvt.s32.f32 q0, q0\n" + " vcvt.s32.f32 q1, q1\n" + "\n" + " vqmovn.s32 d4, q0\n" + " vqmovn.s32 d5, q1\n" + "\n" + " vst1.f32 {d4-d5}, [r0]!\n" + "\n" + " # Guaranteed to get samples in multiples of 8.\n" + " subs r2, r2, #8\n" + " bne 1b\n" + "\n" + " bx lr\n" + "\n" + ); +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion/s16_to_float.c
Added
@@ -0,0 +1,196 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (s16_to_float.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#if defined(__SSE2__) +#include <emmintrin.h> +#elif defined(__ALTIVEC__) +#include <altivec.h> +#endif + +#include <boolean.h> +#include <features/features_cpu.h> +#include <audio/conversion/s16_to_float.h> + +#if (defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS)) || defined(HAVE_NEON) +#ifndef HAVE_ARM_NEON_OPTIMIZATIONS +#define HAVE_ARM_NEON_OPTIMIZATIONS +#endif +#endif + +#if defined(HAVE_ARM_NEON_OPTIMIZATIONS) +static bool s16_to_float_neon_enabled = false; + +/* Avoid potential hard-float/soft-float ABI issues. */ +void convert_s16_float_asm(float *out, const int16_t *in, + size_t samples, const float *gain); +#endif + +/** + * convert_s16_to_float: + * @out : output buffer + * @in : input buffer + * @samples : size of samples to be converted + * @gain : gain applied (.e.g. audio volume) + * + * Converts from signed integer 16-bit + * to floating point. + **/ +void convert_s16_to_float(float *out, + const int16_t *in, size_t samples, float gain) +{ + unsigned i = 0; + +#if defined(__SSE2__) + float fgain = gain / UINT32_C(0x80000000); + __m128 factor = _mm_set1_ps(fgain); + + for (i = 0; i + 8 <= samples; i += 8, in += 8, out += 8) + { + __m128i input = _mm_loadu_si128((const __m128i *)in); + __m128i regs_l = _mm_unpacklo_epi16(_mm_setzero_si128(), input); + __m128i regs_r = _mm_unpackhi_epi16(_mm_setzero_si128(), input); + __m128 output_l = _mm_mul_ps(_mm_cvtepi32_ps(regs_l), factor); + __m128 output_r = _mm_mul_ps(_mm_cvtepi32_ps(regs_r), factor); + + _mm_storeu_ps(out + 0, output_l); + _mm_storeu_ps(out + 4, output_r); + } + + samples = samples - i; + i = 0; +#elif defined(__ALTIVEC__) + size_t samples_in = samples; + + /* Unaligned loads/store is a bit expensive, so we + * optimize for the good path (very likely). */ + if (((uintptr_t)out & 15) + ((uintptr_t)in & 15) == 0) + { + const vector float gain_vec = { gain, gain , gain, gain }; + const vector float zero_vec = { 0.0f, 0.0f, 0.0f, 0.0f}; + + for (i = 0; i + 8 <= samples; i += 8, in += 8, out += 8) + { + vector signed short input = vec_ld(0, in); + vector signed int hi = vec_unpackh(input); + vector signed int lo = vec_unpackl(input); + vector float out_hi = vec_madd(vec_ctf(hi, 15), gain_vec, zero_vec); + vector float out_lo = vec_madd(vec_ctf(lo, 15), gain_vec, zero_vec); + + vec_st(out_hi, 0, out); + vec_st(out_lo, 16, out); + } + + samples_in -= i; + } + + samples = samples_in; + i = 0; + +#elif defined(HAVE_ARM_NEON_OPTIMIZATIONS) + if (s16_to_float_neon_enabled) + { + size_t aligned_samples = samples & ~7; + if (aligned_samples) + convert_s16_float_asm(out, in, aligned_samples, &gain); + + /* Could do all conversion in ASM, but keep it simple for now. */ + out = out + aligned_samples; + in = in + aligned_samples; + samples = samples - aligned_samples; + i = 0; + } + +#endif + + gain = gain / 0x8000; + +#if defined(_MIPS_ARCH_ALLEGREX) +#ifdef DEBUG + /* Make sure the buffer is 16 byte aligned, this should be the + * default behaviour of malloc in the PSPSDK. + * Only the output buffer can be assumed to be 16-byte aligned. */ + retro_assert(((uintptr_t)out & 0xf) == 0); +#endif + + __asm__ ( + ".set push \n" + ".set noreorder \n" + "mtv %0, s200 \n" + ".set pop \n" + ::"r"(gain)); + + for (i = 0; i + 16 <= samples; i += 16) + { + __asm__ ( + ".set push \n" + ".set noreorder \n" + + "lv.s s100, 0(%0) \n" + "lv.s s101, 4(%0) \n" + "lv.s s110, 8(%0) \n" + "lv.s s111, 12(%0) \n" + "lv.s s120, 16(%0) \n" + "lv.s s121, 20(%0) \n" + "lv.s s130, 24(%0) \n" + "lv.s s131, 28(%0) \n" + + "vs2i.p c100, c100 \n" + "vs2i.p c110, c110 \n" + "vs2i.p c120, c120 \n" + "vs2i.p c130, c130 \n" + + "vi2f.q c100, c100, 16 \n" + "vi2f.q c110, c110, 16 \n" + "vi2f.q c120, c120, 16 \n" + "vi2f.q c130, c130, 16 \n" + + "vmscl.q e100, e100, s200 \n" + + "sv.q c100, 0(%1) \n" + "sv.q c110, 16(%1) \n" + "sv.q c120, 32(%1) \n" + "sv.q c130, 48(%1) \n" + + ".set pop \n" + :: "r"(in + i), "r"(out + i)); + } + +#endif + + for (; i < samples; i++) + out[i] = (float)in[i] * gain; +} + +/** + * convert_s16_to_float_init_simd: + * + * Sets up function pointers for conversion + * functions based on CPU features. + **/ +void convert_s16_to_float_init_simd(void) +{ +#if defined(HAVE_ARM_NEON_OPTIMIZATIONS) + unsigned cpu = cpu_features_get(); + + if (cpu & RETRO_SIMD_NEON) + s16_to_float_neon_enabled = true; +#endif +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion/s16_to_float_neon.S
Added
@@ -0,0 +1,76 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (s16_to_float_neon.S). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS) + +#ifndef __MACH__ +.arm +#endif + +.align 4 +.globl convert_s16_float_asm +#ifndef __MACH__ +.type convert_s16_float_asm, %function +#endif +.globl _convert_s16_float_asm +#ifndef __MACH__ +.type _convert_s16_float_asm, %function +#endif +# convert_s16_float_asm(float *out, const int16_t *in, size_t samples, const float *gain) +convert_s16_float_asm: +_convert_s16_float_asm: + # Hacky way to get a constant of 2^-15. + # Might be faster to just load a constant from memory. + # It's just done once however ... + vmov.f32 q8, #0.25 + vmul.f32 q8, q8, q8 + vmul.f32 q8, q8, q8 + vmul.f32 q8, q8, q8 + vadd.f32 q8, q8, q8 + + # Apply gain + vld1.f32 {d6[0]}, [r3] + vmul.f32 q8, q8, d6[0] + +1: + # Preload here? + vld1.s16 {q0}, [r1]! + + # Widen to 32-bit + vmovl.s16 q1, d0 + vmovl.s16 q2, d1 + + # Convert to float + vcvt.f32.s32 q1, q1 + vcvt.f32.s32 q2, q2 + + vmul.f32 q1, q1, q8 + vmul.f32 q2, q2, q8 + + vst1.f32 {q1-q2}, [r0]! + + # Guaranteed to get samples in multiples of 8. + subs r2, r2, #8 + bne 1b + + bx lr + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/conversion/s16_to_float_neon.c
Added
@@ -0,0 +1,71 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (s16_to_float_neon.S). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS) + +#if defined(__thumb__) +#define DECL_ARMMODE(x) " .align 2\n" " .global " x "\n" " .thumb\n" " .thumb_func\n" " .type " x ", %function\n" x ":\n" +#else +#define DECL_ARMMODE(x) " .align 4\n" " .global " x "\n" " .arm\n" x ":\n" +#endif + +asm( + DECL_ARMMODE("convert_s16_float_asm") + DECL_ARMMODE("_convert_s16_float_asm") + "# convert_s16_float_asm(float *out, const int16_t *in, size_t samples, const float *gain)\n" + " # Hacky way to get a constant of 2^-15.\n" + " # Might be faster to just load a constant from memory.\n" + " # It's just done once however ...\n" + " vmov.f32 q8, #0.25\n" + " vmul.f32 q8, q8, q8\n" + " vmul.f32 q8, q8, q8\n" + " vmul.f32 q8, q8, q8\n" + " vadd.f32 q8, q8, q8\n" + "\n" + " # Apply gain\n" + " vld1.f32 {d6[0]}, [r3]\n" + " vmul.f32 q8, q8, d6[0]\n" + "\n" + "1:\n" + " # Preload here?\n" + " vld1.s16 {q0}, [r1]!\n" + "\n" + " # Widen to 32-bit\n" + " vmovl.s16 q1, d0\n" + " vmovl.s16 q2, d1\n" + "\n" + " # Convert to float\n" + " vcvt.f32.s32 q1, q1\n" + " vcvt.f32.s32 q2, q2\n" + "\n" + " vmul.f32 q1, q1, q8\n" + " vmul.f32 q2, q2, q8\n" + "\n" + " vst1.f32 {q1-q2}, [r0]!\n" + "\n" + " # Guaranteed to get samples in multiples of 8.\n" + " subs r2, r2, #8\n" + " bne 1b\n" + "\n" + " bx lr\n" + "\n" + ); +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filter.c
Added
@@ -0,0 +1,324 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (dsp_filter.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> + +#include <retro_miscellaneous.h> + +#include <compat/posix_string.h> +#include <dynamic/dylib.h> + +#include <file/file_path.h> +#include <file/config_file_userdata.h> +#include <features/features_cpu.h> +#include <lists/string_list.h> +#include <string/stdstring.h> +#include <libretro_dspfilter.h> + +#include <audio/dsp_filter.h> + +struct retro_dsp_plug +{ +#ifdef HAVE_DYLIB + dylib_t lib; +#endif + const struct dspfilter_implementation *impl; +}; + +struct retro_dsp_instance +{ + const struct dspfilter_implementation *impl; + void *impl_data; +}; + +struct retro_dsp_filter +{ + config_file_t *conf; + + struct retro_dsp_plug *plugs; + unsigned num_plugs; + + struct retro_dsp_instance *instances; + unsigned num_instances; +}; + +static const struct dspfilter_implementation *find_implementation( + retro_dsp_filter_t *dsp, const char *ident) +{ + unsigned i; + for (i = 0; i < dsp->num_plugs; i++) + { + if (string_is_equal(dsp->plugs[i].impl->short_ident, ident)) + return dsp->plugs[i].impl; + } + + return NULL; +} + +static const struct dspfilter_config dspfilter_config = { + config_userdata_get_float, + config_userdata_get_int, + config_userdata_get_float_array, + config_userdata_get_int_array, + config_userdata_get_string, + config_userdata_free, +}; + +static bool create_filter_graph(retro_dsp_filter_t *dsp, float sample_rate) +{ + unsigned i; + struct retro_dsp_instance *instances = NULL; + unsigned filters = 0; + + if (!config_get_uint(dsp->conf, "filters", &filters)) + return false; + + instances = (struct retro_dsp_instance*)calloc(filters, sizeof(*instances)); + if (!instances) + return false; + + dsp->instances = instances; + dsp->num_instances = filters; + + for (i = 0; i < filters; i++) + { + struct config_file_userdata userdata; + struct dspfilter_info info; + char key[64]; + char name[64]; + + key[0] = name[0] = '\0'; + + info.input_rate = sample_rate; + + snprintf(key, sizeof(key), "filter%u", i); + + if (!config_get_array(dsp->conf, key, name, sizeof(name))) + return false; + + dsp->instances[i].impl = find_implementation(dsp, name); + if (!dsp->instances[i].impl) + return false; + + userdata.conf = dsp->conf; + /* Index-specific configs take priority over ident-specific. */ + userdata.prefix[0] = key; + userdata.prefix[1] = dsp->instances[i].impl->short_ident; + + dsp->instances[i].impl_data = dsp->instances[i].impl->init(&info, + &dspfilter_config, &userdata); + if (!dsp->instances[i].impl_data) + return false; + } + + return true; +} + +#if defined(HAVE_FILTERS_BUILTIN) +extern const struct dspfilter_implementation *panning_dspfilter_get_implementation(dspfilter_simd_mask_t mask); +extern const struct dspfilter_implementation *iir_dspfilter_get_implementation(dspfilter_simd_mask_t mask); +extern const struct dspfilter_implementation *echo_dspfilter_get_implementation(dspfilter_simd_mask_t mask); +extern const struct dspfilter_implementation *phaser_dspfilter_get_implementation(dspfilter_simd_mask_t mask); +extern const struct dspfilter_implementation *wahwah_dspfilter_get_implementation(dspfilter_simd_mask_t mask); +extern const struct dspfilter_implementation *eq_dspfilter_get_implementation(dspfilter_simd_mask_t mask); +extern const struct dspfilter_implementation *chorus_dspfilter_get_implementation(dspfilter_simd_mask_t mask); + +static const dspfilter_get_implementation_t dsp_plugs_builtin[] = { + panning_dspfilter_get_implementation, + iir_dspfilter_get_implementation, + echo_dspfilter_get_implementation, + phaser_dspfilter_get_implementation, + wahwah_dspfilter_get_implementation, + eq_dspfilter_get_implementation, + chorus_dspfilter_get_implementation, +}; + +static bool append_plugs(retro_dsp_filter_t *dsp, struct string_list *list) +{ + unsigned i; + dspfilter_simd_mask_t mask = (dspfilter_simd_mask_t)cpu_features_get(); + struct retro_dsp_plug *plugs = (struct retro_dsp_plug*) + calloc(ARRAY_SIZE(dsp_plugs_builtin), sizeof(*plugs)); + + if (!plugs) + return false; + + dsp->plugs = plugs; + dsp->num_plugs = ARRAY_SIZE(dsp_plugs_builtin); + + for (i = 0; i < ARRAY_SIZE(dsp_plugs_builtin); i++) + { + dsp->plugs[i].impl = dsp_plugs_builtin[i](mask); + if (!dsp->plugs[i].impl) + return false; + } + + return true; +} +#elif defined(HAVE_DYLIB) +static bool append_plugs(retro_dsp_filter_t *dsp, struct string_list *list) +{ + unsigned i; + dspfilter_simd_mask_t mask = (dspfilter_simd_mask_t)cpu_features_get(); + unsigned list_size = list ? (unsigned)list->size : 0; + + for (i = 0; i < list_size; i++) + { + dspfilter_get_implementation_t cb; + const struct dspfilter_implementation *impl = NULL; + struct retro_dsp_plug *new_plugs = NULL; + dylib_t lib = + dylib_load(list->elems[i].data); + + if (!lib) + continue; + + cb = (dspfilter_get_implementation_t)dylib_proc(lib, "dspfilter_get_implementation"); + if (!cb) + { + dylib_close(lib); + continue; + } + + impl = cb(mask); + if (!impl) + { + dylib_close(lib); + continue; + } + + if (impl->api_version != DSPFILTER_API_VERSION) + { + dylib_close(lib); + continue; + } + + new_plugs = (struct retro_dsp_plug*) + realloc(dsp->plugs, sizeof(*dsp->plugs) * (dsp->num_plugs + 1)); + if (!new_plugs) + { + dylib_close(lib); + return false; + } + + /* Found plug. */ + + dsp->plugs = new_plugs; + dsp->plugs[dsp->num_plugs].lib = lib; + dsp->plugs[dsp->num_plugs].impl = impl; + dsp->num_plugs++; + } + + return true; +} +#endif + +retro_dsp_filter_t *retro_dsp_filter_new( + const char *filter_config, + void *string_data, + float sample_rate) +{ + config_file_t *conf = NULL; + struct string_list *plugs = NULL; + retro_dsp_filter_t *dsp = (retro_dsp_filter_t*)calloc(1, sizeof(*dsp)); + + if (!dsp) + return NULL; + + if (!(conf = config_file_new_from_path_to_string(filter_config))) + goto error; + + dsp->conf = conf; + + if (string_data) + plugs = (struct string_list*)string_data; + +#if defined(HAVE_DYLIB) || defined(HAVE_FILTERS_BUILTIN) + if (!append_plugs(dsp, plugs)) + goto error; +#endif + + if (plugs) + string_list_free(plugs); + plugs = NULL; + + if (!create_filter_graph(dsp, sample_rate)) + goto error; + + return dsp; + +error: + if (plugs) + string_list_free(plugs); + retro_dsp_filter_free(dsp); + return NULL; +} + +void retro_dsp_filter_free(retro_dsp_filter_t *dsp) +{ + unsigned i; + if (!dsp) + return; + + for (i = 0; i < dsp->num_instances; i++) + { + if (dsp->instances[i].impl_data && dsp->instances[i].impl) + dsp->instances[i].impl->free(dsp->instances[i].impl_data); + } + free(dsp->instances); + +#ifdef HAVE_DYLIB + for (i = 0; i < dsp->num_plugs; i++) + { + if (dsp->plugs[i].lib) + dylib_close(dsp->plugs[i].lib); + } + free(dsp->plugs); +#endif + + if (dsp->conf) + config_file_free(dsp->conf); + + free(dsp); +} + +void retro_dsp_filter_process(retro_dsp_filter_t *dsp, + struct retro_dsp_data *data) +{ + unsigned i; + struct dspfilter_output output = {0}; + struct dspfilter_input input = {0}; + + output.samples = data->input; + output.frames = data->input_frames; + + for (i = 0; i < dsp->num_instances; i++) + { + input.samples = output.samples; + input.frames = output.frames; + dsp->instances[i].impl->process( + dsp->instances[i].impl_data, &output, &input); + } + + data->output = output.samples; + data->output_frames = output.frames; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/BassBoost.dsp
Added
@@ -0,0 +1,11 @@ +filters = 2 +filter0 = iir +filter1 = panning + +iir_gain = 10.0 +iir_type = BBOOST +iir_frequency = 200.0 + +# Avoids clipping. +panning_left_mix = "0.3 0.0" +panning_right_mix = "0.0 0.3"
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/ChipTuneEnhance.dsp
Added
@@ -0,0 +1,22 @@ +filters = 4 +filter0 = eq +filter1 = reverb +filter2 = iir +filter3 = panning + +eq_frequencies = "32 64 125 250 500 1000 2000 4000 8000 16000 20000" +eq_gains = "6 9 12 7 6 5 7 9 11 6 0" + +# Reverb - slight reverb + reverb_drytime = 0.5 + reverb_wettime = 0.15 + reverb_damping = 0.8 + reverb_roomwidth = 0.25 + reverb_roomsize = 0.25 + +# IIR - filters out some harsh sounds on the upper end +iir_type = RIAA_CD + +# Panning - cut the volume a bit +panning_left_mix = "0.75 0.0" +panning_right_mix = "0.0 0.75"
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Chorus.dsp
Added
@@ -0,0 +1,14 @@ +filters = 1 +filter0 = chorus + +# Controls the base delay of the chorus (milliseconds). +# chorus_delay_ms = 25.0 +# +# Controls the depth of the delay. The delay will vary between delay_ms +/- depth_ms. +# chorus_depth_ms = 1.0 +# +# Frequency of LFO which controls delay. +# chorus_lfo_freq = 0.5 +# +# Controls dry/wet-ness of effect. 1.0 = full chorus, 0.0 = no chorus. +# chorus_drywet = 0.8
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Crystalizer.dsp
Added
@@ -0,0 +1,4 @@ +filters = 1 +filter0 = crystalizer +# Controls dry/wet-ness of effect. 0.0 = none, 10.0 = max. +crystalizer_intensity = 5.0
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/EQ.dsp
Added
@@ -0,0 +1,41 @@ +filters = 1 +filter0 = eq + +# Defaults + +# Beta factor for Kaiser window. +# Lower values will allow better frequency resolution, but more ripple. +# eq_window_beta = 4.0 + +# The block size on which FFT is done. +# Too high value requires more processing as well as longer latency but +# allows finer-grained control over the spectrum. +# eq_block_size_log2 = 8 + +# An array of which frequencies to control. +# You can create an arbitrary amount of these sampling points. +# The EQ will try to create a frequency response which fits well to these points. +# The filter response is linearly interpolated between sampling points here. +# +# It is implied that 0 Hz (DC) and Nyquist have predefined gains of 0 dB which are interpolated against. +# If you want a "peak" in the spectrum or similar, you have to define close points to say, 0 dB. +# +# E.g.: A boost of 3 dB at 1 kHz can be expressed as. +# eq_frequencies = "500 1000 2000" +# eq_gains = "0 3 0" +# Due to frequency domain smearing, you will not get exactly +3 dB at 1 kHz. + +# By default, this filter has a flat frequency response. + +# Dumps the impulse response generated by the EQ as a plain-text file +# with one coefficient per line. +# eq_impulse_response_output = "eq_impulse.txt" +# +# Using GNU Octave or Matlab, you can plot the response with: +# +# f = fopen('/path/to/eq_impulse.txt'); +# l = textscan(f, '%f'); +# res = l{1}; +# freqz(res, 1, 4096, 48000); +# +# It will give the response in Hz; 48000 is the default Output Rate of RetroArch
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Echo.dsp
Added
@@ -0,0 +1,19 @@ +filters = 1 +filter0 = echo + +# Somewhat fancy Echo filter. Can take any number of echo channels with varying delays (ms) and feedback factors. +# Echo output from all channels can be fed back into each other to create a somewhat reverb-like effect if desired. + +# Defaults, 200 ms delay echo with feedback: +# Delay in ms. Takes an array with multiple channels. +# echo_delay = "200" +# Feedback factor for echo. +# echo_feedback = "0.5" +# Overall echo amplification. If too high, the echo becomes unstable due to feedback. +# echo_amp = "0.2" + +# Reverby preset. +# echo_delay = " 60 80 120 172 200 320 380" +# echo_feedback = "0.5 0.5 0.4 0.3 0.5 0.3 0.2" + +# echo_amp = "0.12"
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/EchoReverb.dsp
Added
@@ -0,0 +1,12 @@ +filters = 2 +filter0 = echo +filter1 = reverb + +echo_delay = "200" +echo_feedback = "0.6" +echo_amp = "0.25" + +reverb_roomwidth = 0.75 +reverb_roomsize = 0.75 +reverb_damping = 1.0 +reverb_wettime = 0.3
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/HighShelfDampen.dsp
Added
@@ -0,0 +1,6 @@ +filters = 1 +filter0 = iir + +iir_gain = -12.0 +iir_type = HSH +iir_frequency = 8000.0
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/IIR.dsp
Added
@@ -0,0 +1,22 @@ +filters = 1 +filter0 = iir + +# Defaults. +#iir_frequency = 1024.0 +#iir_quality = 0.707 +#iir_gain = 0.0 +#iir_type = LPF + +# Filter types: +# LPF: Low-pass +# HPF: High-pass +# BPCSGF: Band-pass #1 +# BPZPGF: Band-pass #2 +# APF: Allpass +# NOTCH: Notch filter +# RIAA_phono: RIAA record/tape deemphasis +# PEQ: peaking band EQ +# BBOOST: Bassboost +# LSH: Low-shelf +# HSH: High-shelf +# RIAA_CD: CD de-emphasis
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/LowPassCPS.dsp
Added
@@ -0,0 +1,47 @@ +filters = 1 +filter0 = eq + +eq_frequencies = "8000 10000 12500 16000 20000" +eq_gains = "0 -30 -30 -30 -30" + +# Low pass filter for the QSound chip from CPS-1/2. +# Some games have aliasing due low quality samples, so you can hear some annoying noisy near 11 kHz + +# Defaults + +# Beta factor for Kaiser window. +# Lower values will allow better frequency resolution, but more ripple. +# eq_window_beta = 4.0 + +# The block size on which FFT is done. +# Too high value requires more processing as well as longer latency but +# allows finer-grained control over the spectrum. +# eq_block_size_log2 = 8 + +# An array of which frequencies to control. +# You can create an arbitrary amount of these sampling points. +# The EQ will try to create a frequency response which fits well to these points. +# The filter response is linearly interpolated between sampling points here. +# +# It is implied that 0 Hz (DC) and Nyquist have predefined gains of 0 dB which are interpolated against. +# If you want a "peak" in the spectrum or similar, you have to define close points to say, 0 dB. +# +# E.g.: A boost of 3 dB at 1 kHz can be expressed as. +# eq_frequencies = "500 1000 2000" +# eq_gains = "0 3 0" +# Due to frequency domain smearing, you will not get exactly +3 dB at 1 kHz. + +# By default, this filter has a low pass response with cuttof frequency at ~8600 Hz. + +# Dumps the impulse response generated by the EQ as a plain-text file +# with one coefficient per line. +# eq_impulse_response_output = "eq_impulse.txt" +# +# Using GNU Octave or Matlab, you can plot the response with: +# +# f = fopen('/path/to/eq_impulse.txt'); +# l = textscan(f, '%f'); +# res = l{1}; +# freqz(res, 1, 4096, 48000); +# +# It will give the response in Hz; 48000 is the default Output Rate of RetroArch
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Makefile
Added
@@ -0,0 +1,137 @@ +compiler := gcc +extra_flags := +use_neon := 0 +build = release +DYLIB := so +PREFIX := /usr +INSTALLDIR := $(PREFIX)/lib/retroarch/filters/audio + +ifeq ($(platform),) + platform = unix + ifeq ($(shell uname -s),) + platform = win + else ifneq ($(findstring Darwin,$(shell uname -s)),) + platform = osx + arch = intel + ifeq ($(shell uname -p),powerpc) + arch = ppc + endif + else ifneq ($(findstring MINGW,$(shell uname -s)),) + platform = win + endif +endif + +ifeq ($(platform),gcc) + extra_rules_gcc := $(shell $(compiler) -dumpmachine) +endif + +ifneq (,$(findstring armv7,$(extra_rules_gcc))) + extra_flags += -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon + use_neon := 1 +endif + +ifneq (,$(findstring hardfloat,$(extra_rules_gcc))) + extra_flags += -mfloat-abi=hard +endif + +ifeq (release,$(build)) + extra_flags += -O2 +endif + +ifeq (debug,$(build)) + extra_flags += -O0 -g +endif + +ldflags := $(LDFLAGS) -shared -lm -Wl,--version-script=link.T + +ifeq ($(platform), unix) + DYLIB = so +else ifeq ($(platform), osx) + compiler := $(CC) + DYLIB = dylib + ldflags := -dynamiclib + ARCHFLAGS= + MINVERFLAGS= + ifeq ($(shell uname -p),arm) + MINVERFLAGS = -mmacosx-version-min=10.15 -stdlib=libc++ # macOS (Metal, ARM 64bit) + MINVERFLAGS += -DDONT_WANT_ARM_OPTIMIZATIONS + else ifeq ($(HAVE_METAL),1) + MINVERFLAGS = -mmacosx-version-min=10.13 -stdlib=libc++ # macOS (Metal, x86 64bit) + else ifeq ($(shell uname -p),powerpc) + MINVERFLAGS = -mmacosx-version-min=10.5 # macOSX (PowerPC 32-bit) + else ifeq ($(shell uname -m),i386) + MINVERFLAGS = -mmacosx-version-min=10.6 # macOSX (OpenGL, x86 32bit) + else + MINVERFLAGS = -mmacosx-version-min=10.7 -stdlib=libc++ # macOSX (OpenGL, x86 64bit) + endif + + # Build for a specific architecture when ARCH is defined as a switch + ifeq ($(ARCH),arm64) + MINVERFLAGS = -mmacosx-version-min=10.15 -stdlib=libc++ # macOS (Metal, ARM 64bit) + MINVERFLAGS += -DDONT_WANT_ARM_OPTIMIZATIONS + ARCHFLAGS = -arch arm64 + else ifeq ($(ARCH),x86_64) + ifeq ($(HAVE_METAL),1) + MINVERFLAGS = -mmacosx-version-min=10.13 -stdlib=libc++ + else + MINVERFLAGS = -mmacosx-version-min=10.7 -stdlib=libc++ + endif + ARCHFLAGS = -arch x86_64 + else ifeq ($(ARCH),x86) + MINVERFLAGS = -mmacosx-version-min=10.6 + ARCHFLAGS = -arch x86 + else ifeq ($(ARCH),ppc) + MINVERFLAGS = -mmacosx-version-min=10.5 + ARCHFLAGS = -arch ppc + endif + ifeq ($(BUILDBOT),1) + ARCHFLAGS = -target $(LIBRETRO_APPLE_PLATFORM) -isysroot $(LIBRETRO_APPLE_ISYSROOT) + endif + extraflags += $(MINVERFLAGS) $(ARCHFLAGS) + ldflags += $(MINVERFLAGS) $(ARCHFLAGS) +else + extra_flags += -static-libgcc -static-libstdc++ + DYLIB = dll +endif + +CC := $(compiler) -Wall +CXX := $(subst CC,++,$(compiler)) -std=gnu++0x -Wall +flags := $(CPPFLAGS) $(CFLAGS) -fPIC $(extra_flags) -I../../include +asflags := $(ASFLAGS) -fPIC $(extra_flags) +objects := + +ifeq (1,$(use_neon)) + ASMFLAGS := -INEON/asm + asflags += -mfpu=neon +endif + +plugs := $(wildcard *.c) +objects := $(plugs:.c=.o) +targets := $(objects:.o=.$(DYLIB)) + +all: build; + +%.o: %.S + $(CC) -c -o $@ $(asflags) $(ASMFLAGS) $< + +%.o: %.c + $(CC) -c -o $@ $(flags) $< + +%.$(DYLIB): %.o + $(CC) -o $@ $(ldflags) $(flags) $^ + +build: $(targets) + +clean: + rm -f *.o + rm -f *.$(DYLIB) + +strip: + strip -s *.$(DYLIB) + +install: + mkdir -p $(DESTDIR)$(INSTALLDIR) + cp -t $(DESTDIR)$(INSTALLDIR) $(targets) *.dsp + +test-install: + DESTDIR=/tmp/build $(MAKE) install
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Mono.dsp
Added
@@ -0,0 +1,12 @@ +filters = 1 +filter0 = panning + +# Gains are linear. + +# Stereo Mono: + panning_left_mix = "0.5 0.5" + panning_right_mix = "0.5 0.5" + +# Mono on one speaker: +# panning_left_mix = "0.5 0.5" +# panning_right_mix = "0.0 0.0"
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Panning.dsp
Added
@@ -0,0 +1,22 @@ +filters = 1 +filter0 = panning + +# Gains are linear. + +# The default. Left and right channels map to each other. +panning_left_mix = "1.0 0.0" +panning_right_mix = "0.0 1.0" + +# Some examples: +# +# Mono: +# panning_left_mix = "0.5 0.5" +# panning_right_mix = "0.5 0.5" + +# Swap left and right channels: +# panning_left_mix = "0.0 1.0" +# panning_right_mix = "1.0 0.0" +# +# Mono on one speaker: +# panning_left_mix = "0.5 0.5" +# panning_right_mix = "0.0 0.0"
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Phaser.dsp
Added
@@ -0,0 +1,10 @@ +filters = 1 +filter0 = phaser + +# Defaults. +# phaser_lfo_freq = 0.4 +# phaser_lfo_start_phase = 0.0 +# phaser_feedback = 0.0 +# phaser_depth = 0.4 +# phaser_dry_wet = 0.5 +# phaser_stages = 2
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Reverb.dsp
Added
@@ -0,0 +1,9 @@ +filters = 1 +filter0 = reverb + +# Defaults. +# reverb_drytime = 0.43 +# reverb_wettime = 0.4 +# reverb_damping = 0.8 +# reverb_roomwidth = 0.56 +# reverb_roomsize = 0.56
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Tremolo.dsp
Added
@@ -0,0 +1,6 @@ +filters = 1 +filter0 = tremolo + +# Defaults. +#tremolo_frequency = 4.0 +#tremolo_depth = 0.9
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/Vibrato.dsp
Added
@@ -0,0 +1,6 @@ +filters = 1 +filter0 = vibrato + +# Defaults. +#vibrato_frequency = 5.0 +#vibrato_depth = 0.5
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/WahWah.dsp
Added
@@ -0,0 +1,9 @@ +filters = 1 +filter0 = wahwah + +# Defaults. +# wahwah_lfo_freq = 1.5 +# wahwah_lfo_start_phase = 0.0 +# wahwah_freq_offset = 0.3 +# wahwah_depth = 0.7 +# wahwah_resonance = 2.5
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/chorus.c
Added
@@ -0,0 +1,160 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (chorus.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> + +#define CHORUS_MAX_DELAY 4096 +#define CHORUS_DELAY_MASK (CHORUS_MAX_DELAY - 1) + +struct chorus_data +{ + float old[2][CHORUS_MAX_DELAY]; + unsigned old_ptr; + + float delay; + float depth; + float input_rate; + float mix_dry; + float mix_wet; + unsigned lfo_ptr; + unsigned lfo_period; +}; + +static void chorus_free(void *data) +{ + if (data) + free(data); +} + +static void chorus_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + float *out = NULL; + struct chorus_data *ch = (struct chorus_data*)data; + + output->samples = input->samples; + output->frames = input->frames; + out = output->samples; + + for (i = 0; i < input->frames; i++, out += 2) + { + unsigned delay_int; + float delay_frac, l_a, l_b, r_a, r_b; + float chorus_l, chorus_r; + float in[2] = { out[0], out[1] }; + float delay = ch->delay + ch->depth * sin((2.0 * M_PI * ch->lfo_ptr++) / ch->lfo_period); + + delay *= ch->input_rate; + if (ch->lfo_ptr >= ch->lfo_period) + ch->lfo_ptr = 0; + + delay_int = (unsigned)delay; + + if (delay_int >= CHORUS_MAX_DELAY - 1) + delay_int = CHORUS_MAX_DELAY - 2; + + delay_frac = delay - delay_int; + + ch->old[0][ch->old_ptr] = in[0]; + ch->old[1][ch->old_ptr] = in[1]; + + l_a = ch->old[0][(ch->old_ptr - delay_int - 0) & CHORUS_DELAY_MASK]; + l_b = ch->old[0][(ch->old_ptr - delay_int - 1) & CHORUS_DELAY_MASK]; + r_a = ch->old[1][(ch->old_ptr - delay_int - 0) & CHORUS_DELAY_MASK]; + r_b = ch->old[1][(ch->old_ptr - delay_int - 1) & CHORUS_DELAY_MASK]; + + /* Lerp introduces aliasing of the chorus component, + * but doing full polyphase here is probably overkill. */ + chorus_l = l_a * (1.0f - delay_frac) + l_b * delay_frac; + chorus_r = r_a * (1.0f - delay_frac) + r_b * delay_frac; + + out[0] = ch->mix_dry * in[0] + ch->mix_wet * chorus_l; + out[1] = ch->mix_dry * in[1] + ch->mix_wet * chorus_r; + + ch->old_ptr = (ch->old_ptr + 1) & CHORUS_DELAY_MASK; + } +} + +static void *chorus_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float delay, depth, lfo_freq, drywet; + struct chorus_data *ch = (struct chorus_data*)calloc(1, sizeof(*ch)); + if (!ch) + return NULL; + + config->get_float(userdata, "delay_ms", &delay, 25.0f); + config->get_float(userdata, "depth_ms", &depth, 1.0f); + config->get_float(userdata, "lfo_freq", &lfo_freq, 0.5f); + config->get_float(userdata, "drywet", &drywet, 0.8f); + + delay /= 1000.0f; + depth /= 1000.0f; + + if (depth > delay) + depth = delay; + + if (drywet < 0.0f) + drywet = 0.0f; + else if (drywet > 1.0f) + drywet = 1.0f; + + ch->mix_dry = 1.0f - 0.5f * drywet; + ch->mix_wet = 0.5f * drywet; + + ch->delay = delay; + ch->depth = depth; + ch->lfo_period = (1.0f / lfo_freq) * info->input_rate; + ch->input_rate = info->input_rate; + if (!ch->lfo_period) + ch->lfo_period = 1; + return ch; +} + +static const struct dspfilter_implementation chorus_plug = { + chorus_init, + chorus_process, + chorus_free, + + DSPFILTER_API_VERSION, + "Chorus", + "chorus", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation chorus_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation * +dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &chorus_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/configure
Added
@@ -0,0 +1,3 @@ +#!/bin/sh + +PACKAGE_NAME=retroarch-filters-audio \ No newline at end of file
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/crystalizer.c
Added
@@ -0,0 +1,90 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (echo.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> + +struct delta_data +{ + float intensity; + float old[2]; +}; + +static void delta_free(void *data) +{ + free(data); +} + +static void delta_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i, c; + struct delta_data *d = (struct delta_data*)data; + float *out = output->samples; + output->samples = input->samples; + output->frames = input->frames; + + for (i = 0; i < input->frames; i++) + { + for (c = 0; c < 2; c++) + { + float current = *out; + *out++ = current + (current - d->old[c]) * d->intensity; + d->old[c] = current; + } + } +} + +static void *delta_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + struct delta_data *d = (struct delta_data*)calloc(1, sizeof(*d)); + if (!d) + return NULL; + config->get_float(userdata, "intensity", &d->intensity, 5.0f); + return d; +} + +static const struct dspfilter_implementation delta_plug = { + delta_init, + delta_process, + delta_free, + DSPFILTER_API_VERSION, + "Delta Sharpening", + "crystalizer", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation delta_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &delta_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/echo.c
Added
@@ -0,0 +1,180 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (echo.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> + +struct echo_channel +{ + float *buffer; + unsigned ptr; + unsigned frames; + float feedback; +}; + +struct echo_data +{ + struct echo_channel *channels; + unsigned num_channels; + float amp; +}; + +static void echo_free(void *data) +{ + unsigned i; + struct echo_data *echo = (struct echo_data*)data; + + for (i = 0; i < echo->num_channels; i++) + free(echo->channels[i].buffer); + free(echo->channels); + free(echo); +} + +static void echo_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i, c; + float *out = NULL; + struct echo_data *echo = (struct echo_data*)data; + + output->samples = input->samples; + output->frames = input->frames; + + out = output->samples; + + for (i = 0; i < input->frames; i++, out += 2) + { + float left, right; + float echo_left = 0.0f; + float echo_right = 0.0f; + + for (c = 0; c < echo->num_channels; c++) + { + echo_left += echo->channels[c].buffer[(echo->channels[c].ptr << 1) + 0]; + echo_right += echo->channels[c].buffer[(echo->channels[c].ptr << 1) + 1]; + } + + echo_left *= echo->amp; + echo_right *= echo->amp; + + left = out[0] + echo_left; + right = out[1] + echo_right; + + for (c = 0; c < echo->num_channels; c++) + { + float feedback_left = out[0] + echo->channels[c].feedback * echo_left; + float feedback_right = out[1] + echo->channels[c].feedback * echo_right; + + echo->channels[c].buffer[(echo->channels[c].ptr << 1) + 0] = feedback_left; + echo->channels[c].buffer[(echo->channels[c].ptr << 1) + 1] = feedback_right; + + echo->channels[c].ptr = (echo->channels[c].ptr + 1) % echo->channels[c].frames; + } + + out[0] = left; + out[1] = right; + } +} + +static void *echo_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + unsigned i, channels; + struct echo_channel *echo_channels = NULL; + float *delay = NULL; + float *feedback = NULL; + unsigned num_delay = 0; + unsigned num_feedback = 0; + + static const float default_delay[] = { 200.0f }; + static const float default_feedback[] = { 0.5f }; + struct echo_data *echo = (struct echo_data*) + calloc(1, sizeof(*echo)); + + if (!echo) + return NULL; + + config->get_float_array(userdata, "delay", &delay, + &num_delay, default_delay, 1); + config->get_float_array(userdata, "feedback", &feedback, + &num_feedback, default_feedback, 1); + config->get_float(userdata, "amp", &echo->amp, 0.2f); + + channels = num_feedback = num_delay = MIN(num_delay, num_feedback); + + echo_channels = (struct echo_channel*)calloc(channels, + sizeof(*echo_channels)); + + if (!echo_channels) + goto error; + + echo->channels = echo_channels; + echo->num_channels = channels; + + for (i = 0; i < channels; i++) + { + unsigned frames = (unsigned)(delay[i] * info->input_rate / 1000.0f + 0.5f); + if (!frames) + goto error; + + echo->channels[i].buffer = (float*)calloc(frames, 2 * sizeof(float)); + if (!echo->channels[i].buffer) + goto error; + + echo->channels[i].frames = frames; + echo->channels[i].feedback = feedback[i]; + } + + config->free(delay); + config->free(feedback); + return echo; + +error: + config->free(delay); + config->free(feedback); + echo_free(echo); + return NULL; +} + +static const struct dspfilter_implementation echo_plug = { + echo_init, + echo_process, + echo_free, + + DSPFILTER_API_VERSION, + "Multi-Echo", + "echo", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation echo_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &echo_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/eq.c
Added
@@ -0,0 +1,352 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (eq.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_inline.h> +#include <retro_miscellaneous.h> +#include <filters.h> +#include <libretro_dspfilter.h> + +#include "fft/fft.c" + +struct eq_data +{ + fft_t *fft; + float buffer[8 * 1024]; + + float *save; + float *block; + fft_complex_t *filter; + fft_complex_t *fftblock; + unsigned block_size; + unsigned block_ptr; +}; + +struct eq_gain +{ + float freq; + float gain; /* Linear. */ +}; + +static void eq_free(void *data) +{ + struct eq_data *eq = (struct eq_data*)data; + if (!eq) + return; + + fft_free(eq->fft); + free(eq->save); + free(eq->block); + free(eq->fftblock); + free(eq->filter); + free(eq); +} + +static void eq_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + float *out; + const float *in; + unsigned input_frames; + struct eq_data *eq = (struct eq_data*)data; + + output->samples = eq->buffer; + output->frames = 0; + + out = eq->buffer; + in = input->samples; + input_frames = input->frames; + + while (input_frames) + { + unsigned write_avail = eq->block_size - eq->block_ptr; + + if (input_frames < write_avail) + write_avail = input_frames; + + memcpy(eq->block + eq->block_ptr * 2, in, write_avail * 2 * sizeof(float)); + + in += write_avail * 2; + input_frames -= write_avail; + eq->block_ptr += write_avail; + + // Convolve a new block. + if (eq->block_ptr == eq->block_size) + { + unsigned i, c; + + for (c = 0; c < 2; c++) + { + fft_process_forward(eq->fft, eq->fftblock, eq->block + c, 2); + for (i = 0; i < 2 * eq->block_size; i++) + eq->fftblock[i] = fft_complex_mul(eq->fftblock[i], eq->filter[i]); + fft_process_inverse(eq->fft, out + c, eq->fftblock, 2); + } + + // Overlap add method, so add in saved block now. + for (i = 0; i < 2 * eq->block_size; i++) + out[i] += eq->save[i]; + + // Save block for later. + memcpy(eq->save, out + 2 * eq->block_size, 2 * eq->block_size * sizeof(float)); + + out += eq->block_size * 2; + output->frames += eq->block_size; + eq->block_ptr = 0; + } + } +} + +static int gains_cmp(const void *a_, const void *b_) +{ + const struct eq_gain *a = (const struct eq_gain*)a_; + const struct eq_gain *b = (const struct eq_gain*)b_; + if (a->freq < b->freq) + return -1; + if (a->freq > b->freq) + return 1; + return 0; +} + +static void generate_response(fft_complex_t *response, + const struct eq_gain *gains, unsigned num_gains, unsigned samples) +{ + unsigned i; + + float start_freq = 0.0f; + float start_gain = 1.0f; + + float end_freq = 1.0f; + float end_gain = 1.0f; + + if (num_gains) + { + end_freq = gains->freq; + end_gain = gains->gain; + num_gains--; + gains++; + } + + /* Create a response by linear interpolation between + * known frequency sample points. */ + for (i = 0; i <= samples; i++) + { + float gain; + float lerp = 0.5f; + float freq = (float)i / samples; + + while (freq >= end_freq) + { + if (num_gains) + { + start_freq = end_freq; + start_gain = end_gain; + end_freq = gains->freq; + end_gain = gains->gain; + + gains++; + num_gains--; + } + else + { + start_freq = end_freq; + start_gain = end_gain; + end_freq = 1.0f; + end_gain = 1.0f; + break; + } + } + + /* Edge case where i == samples. */ + if (end_freq > start_freq) + lerp = (freq - start_freq) / (end_freq - start_freq); + gain = (1.0f - lerp) * start_gain + lerp * end_gain; + + response[i].real = gain; + response[i].imag = 0.0f; + response[2 * samples - i].real = gain; + response[2 * samples - i].imag = 0.0f; + } +} + +static void create_filter(struct eq_data *eq, unsigned size_log2, + struct eq_gain *gains, unsigned num_gains, double beta, const char *filter_path) +{ + int i; + int half_block_size = eq->block_size >> 1; + double window_mod = 1.0 / kaiser_window_function(0.0, beta); + + fft_t *fft = fft_new(size_log2); + float *time_filter = (float*)calloc(eq->block_size * 2 + 1, sizeof(*time_filter)); + if (!fft || !time_filter) + goto end; + + /* Make sure bands are in correct order. */ + qsort(gains, num_gains, sizeof(*gains), gains_cmp); + + /* Compute desired filter response. */ + generate_response(eq->filter, gains, num_gains, half_block_size); + + /* Get equivalent time-domain filter. */ + fft_process_inverse(fft, time_filter, eq->filter, 1); + + /* ifftshift() to create the correct linear phase filter. + * The filter response was designed with zero phase, which + * won't work unless we compensate + * for the repeating property of the FFT here + * by flipping left and right blocks. */ + for (i = 0; i < half_block_size; i++) + { + float tmp = time_filter[i + half_block_size]; + time_filter[i + half_block_size] = time_filter[i]; + time_filter[i] = tmp; + } + + /* Apply a window to smooth out the frequency repsonse. */ + for (i = 0; i < (int)eq->block_size; i++) + { + /* Kaiser window. */ + double phase = (double)i / eq->block_size; + phase = 2.0 * (phase - 0.5); + time_filter[i] *= window_mod * kaiser_window_function(phase, beta); + } + +#ifdef DEBUG + /* Debugging. */ + if (filter_path) + { + FILE *file = fopen(filter_path, "w"); + if (file) + { + for (i = 0; i < (int)eq->block_size - 1; i++) + fprintf(file, "%.8f\n", time_filter[i + 1]); + fclose(file); + } + } +#endif + + /* Padded FFT to create our FFT filter. + * Make our even-length filter odd by discarding the first coefficient. + * For some interesting reason, this allows us to design an odd-length linear phase filter. + */ + fft_process_forward(eq->fft, eq->filter, time_filter + 1, 1); + +end: + fft_free(fft); + free(time_filter); +} + +static void *eq_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float *frequencies, *gain; + unsigned num_freq, num_gain, i, size; + int size_log2; + float beta; + struct eq_gain *gains = NULL; + char *filter_path = NULL; + const float default_freq[] = { 0.0f, info->input_rate }; + const float default_gain[] = { 0.0f, 0.0f }; + struct eq_data *eq = (struct eq_data*)calloc(1, sizeof(*eq)); + if (!eq) + return NULL; + + config->get_float(userdata, "window_beta", &beta, 4.0f); + + config->get_int(userdata, "block_size_log2", &size_log2, 8); + size = 1 << size_log2; + + config->get_float_array(userdata, "frequencies", &frequencies, &num_freq, default_freq, 2); + config->get_float_array(userdata, "gains", &gain, &num_gain, default_gain, 2); + + if (!config->get_string(userdata, "impulse_response_output", &filter_path, "")) + { + config->free(filter_path); + filter_path = NULL; + } + + num_gain = num_freq = MIN(num_gain, num_freq); + + gains = (struct eq_gain*)calloc(num_gain, sizeof(*gains)); + if (!gains) + goto error; + + for (i = 0; i < num_gain; i++) + { + gains[i].freq = frequencies[i] / (0.5f * info->input_rate); + gains[i].gain = pow(10.0, gain[i] / 20.0); + } + config->free(frequencies); + config->free(gain); + + eq->block_size = size; + + eq->save = (float*)calloc( size, 2 * sizeof(*eq->save)); + eq->block = (float*)calloc(2 * size, 2 * sizeof(*eq->block)); + eq->fftblock = (fft_complex_t*)calloc(2 * size, sizeof(*eq->fftblock)); + eq->filter = (fft_complex_t*)calloc(2 * size, sizeof(*eq->filter)); + + /* Use an FFT which is twice the block size with zero-padding + * to make circular convolution => proper convolution. + */ + eq->fft = fft_new(size_log2 + 1); + + if (!eq->fft || !eq->fftblock || !eq->save || !eq->block || !eq->filter) + goto error; + + create_filter(eq, size_log2, gains, num_gain, beta, filter_path); + config->free(filter_path); + filter_path = NULL; + + free(gains); + return eq; + +error: + free(gains); + eq_free(eq); + return NULL; +} + +static const struct dspfilter_implementation eq_plug = { + eq_init, + eq_process, + eq_free, + + DSPFILTER_API_VERSION, + "Linear-Phase FFT Equalizer", + "eq", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation eq_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &eq_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/fft
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/fft/fft.c
Added
@@ -0,0 +1,204 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (fft.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> + +#include "fft.h" + +#include <retro_miscellaneous.h> + +struct fft +{ + fft_complex_t *interleave_buffer; + fft_complex_t *phase_lut; + unsigned *bitinverse_buffer; + unsigned size; +}; + +static unsigned bitswap(unsigned x, unsigned size_log2) +{ + unsigned i; + unsigned ret = 0; + for (i = 0; i < size_log2; i++) + ret |= ((x >> i) & 1) << (size_log2 - i - 1); + return ret; +} + +static void build_bitinverse(unsigned *bitinverse, unsigned size_log2) +{ + unsigned i; + unsigned size = 1 << size_log2; + for (i = 0; i < size; i++) + bitinverse[i] = bitswap(i, size_log2); +} + +static fft_complex_t exp_imag(double phase) +{ + fft_complex_t out = { cos(phase), sin(phase) }; + return out; +} + +static void build_phase_lut(fft_complex_t *out, int size) +{ + int i; + out += size; + for (i = -size; i <= size; i++) + out[i] = exp_imag((M_PI * i) / size); +} + +static void interleave_complex(const unsigned *bitinverse, + fft_complex_t *out, const fft_complex_t *in, + unsigned samples, unsigned step) +{ + unsigned i; + for (i = 0; i < samples; i++, in += step) + out[bitinverse[i]] = *in; +} + +static void interleave_float(const unsigned *bitinverse, + fft_complex_t *out, const float *in, + unsigned samples, unsigned step) +{ + unsigned i; + for (i = 0; i < samples; i++, in += step) + { + unsigned inv_i = bitinverse[i]; + out[inv_i].real = *in; + out[inv_i].imag = 0.0f; + } +} + +static void resolve_float(float *out, const fft_complex_t *in, unsigned samples, + float gain, unsigned step) +{ + unsigned i; + for (i = 0; i < samples; i++, in++, out += step) + *out = gain * in->real; +} + +fft_t *fft_new(unsigned block_size_log2) +{ + unsigned size; + fft_t *fft = (fft_t*)calloc(1, sizeof(*fft)); + if (!fft) + return NULL; + + size = 1 << block_size_log2; + fft->interleave_buffer = (fft_complex_t*)calloc(size, sizeof(*fft->interleave_buffer)); + fft->bitinverse_buffer = (unsigned*)calloc(size, sizeof(*fft->bitinverse_buffer)); + fft->phase_lut = (fft_complex_t*)calloc(2 * size + 1, sizeof(*fft->phase_lut)); + + if (!fft->interleave_buffer || !fft->bitinverse_buffer || !fft->phase_lut) + goto error; + + fft->size = size; + + build_bitinverse(fft->bitinverse_buffer, block_size_log2); + build_phase_lut(fft->phase_lut, size); + return fft; + +error: + fft_free(fft); + return NULL; +} + +void fft_free(fft_t *fft) +{ + if (!fft) + return; + + free(fft->interleave_buffer); + free(fft->bitinverse_buffer); + free(fft->phase_lut); + free(fft); +} + +static void butterfly(fft_complex_t *a, fft_complex_t *b, fft_complex_t mod) +{ + mod = fft_complex_mul(mod, *b); + *b = fft_complex_sub(*a, mod); + *a = fft_complex_add(*a, mod); +} + +static void butterflies(fft_complex_t *butterfly_buf, + const fft_complex_t *phase_lut, + int phase_dir, unsigned step_size, unsigned samples) +{ + unsigned i, j; + for (i = 0; i < samples; i += step_size << 1) + { + int phase_step = (int)samples * phase_dir / (int)step_size; + for (j = i; j < i + step_size; j++) + butterfly(&butterfly_buf[j], &butterfly_buf[j + step_size], + phase_lut[phase_step * (int)(j - i)]); + } +} + +void fft_process_forward_complex(fft_t *fft, + fft_complex_t *out, const fft_complex_t *in, unsigned step) +{ + unsigned step_size; + unsigned samples = fft->size; + interleave_complex(fft->bitinverse_buffer, out, in, samples, step); + + for (step_size = 1; step_size < samples; step_size <<= 1) + { + butterflies(out, + fft->phase_lut + samples, + -1, step_size, samples); + } +} + +void fft_process_forward(fft_t *fft, + fft_complex_t *out, const float *in, unsigned step) +{ + unsigned step_size; + unsigned samples = fft->size; + interleave_float(fft->bitinverse_buffer, out, in, samples, step); + + for (step_size = 1; step_size < fft->size; step_size <<= 1) + { + butterflies(out, + fft->phase_lut + samples, + -1, step_size, samples); + } +} + +void fft_process_inverse(fft_t *fft, + float *out, const fft_complex_t *in, unsigned step) +{ + unsigned step_size; + unsigned samples = fft->size; + + interleave_complex(fft->bitinverse_buffer, fft->interleave_buffer, + in, samples, 1); + + for (step_size = 1; step_size < samples; step_size <<= 1) + { + butterflies(fft->interleave_buffer, + fft->phase_lut + samples, + 1, step_size, samples); + } + + resolve_float(out, fft->interleave_buffer, samples, 1.0f / samples, step); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/fft/fft.h
Added
@@ -0,0 +1,44 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (fft.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef RARCH_FFT_H__ +#define RARCH_FFT_H__ + +#include <retro_inline.h> +#include <math/complex.h> + +typedef struct fft fft_t; + +fft_t *fft_new(unsigned block_size_log2); + +void fft_free(fft_t *fft); + +void fft_process_forward_complex(fft_t *fft, + fft_complex_t *out, const fft_complex_t *in, unsigned step); + +void fft_process_forward(fft_t *fft, + fft_complex_t *out, const float *in, unsigned step); + +void fft_process_inverse(fft_t *fft, + float *out, const fft_complex_t *in, unsigned step); + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/iir.c
Added
@@ -0,0 +1,371 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (iir.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> +#include <string/stdstring.h> + +#define sqr(a) ((a) * (a)) + +/* filter types */ +enum IIRFilter +{ + LPF, /* low pass filter */ + HPF, /* High pass filter */ + BPCSGF, /* band pass filter 1 */ + BPZPGF, /* band pass filter 2 */ + APF, /* Allpass filter*/ + NOTCH, /* Notch Filter */ + RIAA_phono, /* RIAA record/tape deemphasis */ + PEQ, /* Peaking band EQ filter */ + BBOOST, /* Bassboost filter */ + LSH, /* Low shelf filter */ + HSH, /* High shelf filter */ + RIAA_CD /* CD de-emphasis */ +}; + +struct iir_data +{ + float b0, b1, b2; + float a0, a1, a2; + + struct + { + float xn1, xn2; + float yn1, yn2; + } l, r; +}; + +static void iir_free(void *data) +{ + free(data); +} + +static void iir_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + struct iir_data *iir = (struct iir_data*)data; + float *out = output->samples; + + float b0 = iir->b0; + float b1 = iir->b1; + float b2 = iir->b2; + float a0 = iir->a0; + float a1 = iir->a1; + float a2 = iir->a2; + + float xn1_l = iir->l.xn1; + float xn2_l = iir->l.xn2; + float yn1_l = iir->l.yn1; + float yn2_l = iir->l.yn2; + + float xn1_r = iir->r.xn1; + float xn2_r = iir->r.xn2; + float yn1_r = iir->r.yn1; + float yn2_r = iir->r.yn2; + + output->samples = input->samples; + output->frames = input->frames; + + for (i = 0; i < input->frames; i++, out += 2) + { + float in_l = out[0]; + float in_r = out[1]; + + float l = (b0 * in_l + b1 * xn1_l + b2 * xn2_l - a1 * yn1_l - a2 * yn2_l) / a0; + float r = (b0 * in_r + b1 * xn1_r + b2 * xn2_r - a1 * yn1_r - a2 * yn2_r) / a0; + + xn2_l = xn1_l; + xn1_l = in_l; + yn2_l = yn1_l; + yn1_l = l; + + xn2_r = xn1_r; + xn1_r = in_r; + yn2_r = yn1_r; + yn1_r = r; + + out[0] = l; + out[1] = r; + } + + iir->l.xn1 = xn1_l; + iir->l.xn2 = xn2_l; + iir->l.yn1 = yn1_l; + iir->l.yn2 = yn2_l; + + iir->r.xn1 = xn1_r; + iir->r.xn2 = xn2_r; + iir->r.yn1 = yn1_r; + iir->r.yn2 = yn2_r; +} + +#define CHECK(x) if (string_is_equal(str, #x)) return x +static enum IIRFilter str_to_type(const char *str) +{ + CHECK(LPF); + CHECK(HPF); + CHECK(BPCSGF); + CHECK(BPZPGF); + CHECK(APF); + CHECK(NOTCH); + CHECK(RIAA_phono); + CHECK(PEQ); + CHECK(BBOOST); + CHECK(LSH); + CHECK(HSH); + CHECK(RIAA_CD); + + return LPF; /* Fallback. */ +} + +static void make_poly_from_roots( + const double *roots, unsigned num_roots, float *poly) +{ + unsigned i, j; + + poly[0] = 1; + poly[1] = -roots[0]; + memset(poly + 2, 0, (num_roots + 1 - 2) * sizeof(*poly)); + + for (i = 1; i < num_roots; i++) + for (j = num_roots; j > 0; j--) + poly[j] -= poly[j - 1] * roots[i]; +} + +static void iir_filter_init(struct iir_data *iir, + float sample_rate, float freq, float qual, float gain, enum IIRFilter filter_type) +{ + double omega = 2.0 * M_PI * freq / sample_rate; + double cs = cos(omega); + double sn = sin(omega); + double a1pha = sn / (2.0 * qual); + double A = exp(log(10.0) * gain / 40.0); + double beta = sqrt(A + A); + + float b0 = 0.0, b1 = 0.0, b2 = 0.0, a0 = 0.0, a1 = 0.0, a2 = 0.0; + + /* Set up filter coefficients according to type */ + switch (filter_type) + { + case LPF: + b0 = (1.0 - cs) / 2.0; + b1 = 1.0 - cs ; + b2 = (1.0 - cs) / 2.0; + a0 = 1.0 + a1pha; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha; + break; + case HPF: + b0 = (1.0 + cs) / 2.0; + b1 = -(1.0 + cs); + b2 = (1.0 + cs) / 2.0; + a0 = 1.0 + a1pha; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha; + break; + case APF: + b0 = 1.0 - a1pha; + b1 = -2.0 * cs; + b2 = 1.0 + a1pha; + a0 = 1.0 + a1pha; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha; + break; + case BPZPGF: + b0 = a1pha; + b1 = 0.0; + b2 = -a1pha; + a0 = 1.0 + a1pha; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha; + break; + case BPCSGF: + b0 = sn / 2.0; + b1 = 0.0; + b2 = -sn / 2.0; + a0 = 1.0 + a1pha; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha; + break; + case NOTCH: + b0 = 1.0; + b1 = -2.0 * cs; + b2 = 1.0; + a0 = 1.0 + a1pha; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha; + break; + case RIAA_phono: /* http://www.dsprelated.com/showmessage/73300/3.php */ + { + double y, b_re, a_re, b_im, a_im, g; + float b[3] = {0.0f}; + float a[3] = {0.0f}; + + if ((int)sample_rate == 44100) + { + static const double zeros[] = {-0.2014898, 0.9233820}; + static const double poles[] = {0.7083149, 0.9924091}; + make_poly_from_roots(zeros, 2, b); + make_poly_from_roots(poles, 2, a); + } + else if ((int)sample_rate == 48000) + { + static const double zeros[] = {-0.1766069, 0.9321590}; + static const double poles[] = {0.7396325, 0.9931330}; + make_poly_from_roots(zeros, 2, b); + make_poly_from_roots(poles, 2, a); + } + else if ((int)sample_rate == 88200) + { + static const double zeros[] = {-0.1168735, 0.9648312}; + static const double poles[] = {0.8590646, 0.9964002}; + make_poly_from_roots(zeros, 2, b); + make_poly_from_roots(poles, 2, a); + } + else if ((int)sample_rate == 96000) + { + static const double zeros[] = {-0.1141486, 0.9676817}; + static const double poles[] = {0.8699137, 0.9966946}; + make_poly_from_roots(zeros, 2, b); + make_poly_from_roots(poles, 2, a); + } + + b0 = b[0]; + b1 = b[1]; + b2 = b[2]; + a0 = a[0]; + a1 = a[1]; + a2 = a[2]; + + /* Normalise to 0dB at 1kHz (Thanks to Glenn Davis) */ + y = 2.0 * M_PI * 1000.0 / sample_rate; + b_re = b0 + b1 * cos(-y) + b2 * cos(-2.0 * y); + a_re = a0 + a1 * cos(-y) + a2 * cos(-2.0 * y); + b_im = b1 * sin(-y) + b2 * sin(-2.0 * y); + a_im = a1 * sin(-y) + a2 * sin(-2.0 * y); + g = 1.0 / sqrt((sqr(b_re) + sqr(b_im)) / (sqr(a_re) + sqr(a_im))); + b0 *= g; b1 *= g; b2 *= g; + break; + } + case PEQ: + b0 = 1.0 + a1pha * A; + b1 = -2.0 * cs; + b2 = 1.0 - a1pha * A; + a0 = 1.0 + a1pha / A; + a1 = -2.0 * cs; + a2 = 1.0 - a1pha / A; + break; + case BBOOST: + beta = sqrt((A * A + 1) / 1.0 - (pow((A - 1), 2))); + b0 = A * ((A + 1) - (A - 1) * cs + beta * sn); + b1 = 2 * A * ((A - 1) - (A + 1) * cs); + b2 = A * ((A + 1) - (A - 1) * cs - beta * sn); + a0 = ((A + 1) + (A - 1) * cs + beta * sn); + a1 = -2 * ((A - 1) + (A + 1) * cs); + a2 = (A + 1) + (A - 1) * cs - beta * sn; + break; + case LSH: + b0 = A * ((A + 1) - (A - 1) * cs + beta * sn); + b1 = 2 * A * ((A - 1) - (A + 1) * cs); + b2 = A * ((A + 1) - (A - 1) * cs - beta * sn); + a0 = (A + 1) + (A - 1) * cs + beta * sn; + a1 = -2 * ((A - 1) + (A + 1) * cs); + a2 = (A + 1) + (A - 1) * cs - beta * sn; + break; + case RIAA_CD: + omega = 2.0 * M_PI * 5283.0 / sample_rate; + cs = cos(omega); + sn = sin(omega); + a1pha = sn / (2.0 * 0.4845); + A = exp(log(10.0) * -9.477 / 40.0); + beta = sqrt(A + A); + (void)a1pha; + case HSH: + b0 = A * ((A + 1.0) + (A - 1.0) * cs + beta * sn); + b1 = -2.0 * A * ((A - 1.0) + (A + 1.0) * cs); + b2 = A * ((A + 1.0) + (A - 1.0) * cs - beta * sn); + a0 = (A + 1.0) - (A - 1.0) * cs + beta * sn; + a1 = 2.0 * ((A - 1.0) - (A + 1.0) * cs); + a2 = (A + 1.0) - (A - 1.0) * cs - beta * sn; + break; + default: + break; + } + + iir->b0 = b0; + iir->b1 = b1; + iir->b2 = b2; + iir->a0 = a0; + iir->a1 = a1; + iir->a2 = a2; +} + +static void *iir_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float freq, qual, gain; + enum IIRFilter filter = LPF; + char *type = NULL; + struct iir_data *iir = (struct iir_data*)calloc(1, sizeof(*iir)); + if (!iir) + return NULL; + + config->get_float(userdata, "frequency", &freq, 1024.0f); + config->get_float(userdata, "quality", &qual, 0.707f); + config->get_float(userdata, "gain", &gain, 0.0f); + + config->get_string(userdata, "type", &type, "LPF"); + + filter = str_to_type(type); + config->free(type); + + iir_filter_init(iir, info->input_rate, freq, qual, gain, filter); + return iir; +} + +static const struct dspfilter_implementation iir_plug = { + iir_init, + iir_process, + iir_free, + + DSPFILTER_API_VERSION, + "IIR", + "iir", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation iir_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &iir_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/link.T
Added
@@ -0,0 +1,4 @@ +{ + global: dspfilter_get_implementation; + local: *; +};
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/panning.c
Added
@@ -0,0 +1,111 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (panning.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <libretro_dspfilter.h> + +struct panning_data +{ + float left[2]; + float right[2]; +}; + +static void panning_free(void *data) +{ + free(data); +} + +static void panning_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + struct panning_data *pan = (struct panning_data*)data; + float *out = output->samples; + + output->samples = input->samples; + output->frames = input->frames; + + for (i = 0; i < input->frames; i++, out += 2) + { + float left = out[0]; + float right = out[1]; + out[0] = left * pan->left[0] + right * pan->left[1]; + out[1] = left * pan->right[0] + right * pan->right[1]; + } +} + +static void *panning_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + static const float default_left[] = { 1.0f, 0.0f }; + static const float default_right[] = { 0.0f, 1.0f }; + float *left = NULL; + float *right = NULL; + unsigned num_left = 0; + unsigned num_right = 0; + struct panning_data *pan = (struct panning_data*) + calloc(1, sizeof(*pan)); + + if (!pan) + return NULL; + + config->get_float_array(userdata, "left_mix", + &left, &num_left, default_left, 2); + config->get_float_array(userdata, "right_mix", + &right, &num_right, default_right, 2); + + memcpy(pan->left, (num_left == 2) ? + left : default_left, sizeof(pan->left)); + memcpy(pan->right, (num_right == 2) ? + right : default_right, sizeof(pan->right)); + + config->free(left); + config->free(right); + + return pan; +} + +static const struct dspfilter_implementation panning = { + panning_init, + panning_process, + panning_free, + + DSPFILTER_API_VERSION, + "Panning", + "panning", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation panning_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation * +dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &panning; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/phaser.c
Added
@@ -0,0 +1,145 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (phaser.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> + +#define phaserlfoshape 4.0 +#define phaserlfoskipsamples 20 + +struct phaser_data +{ + float freq; + float startphase; + float fb; + float depth; + float drywet; + float old[2][24]; + float gain; + float fbout[2]; + float lfoskip; + float phase; + + int stages; + unsigned long skipcount; +}; + +static void phaser_free(void *data) +{ + free(data); +} + +static void phaser_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i, c; + int s; + float m[2], tmp[2]; + struct phaser_data *ph = (struct phaser_data*)data; + float *out = output->samples; + + output->samples = input->samples; + output->frames = input->frames; + + for (i = 0; i < input->frames; i++, out += 2) + { + float in[2] = { out[0], out[1] }; + + for (c = 0; c < 2; c++) + m[c] = in[c] + ph->fbout[c] * ph->fb * 0.01f; + + if ((ph->skipcount++ % phaserlfoskipsamples) == 0) + { + ph->gain = 0.5 * (1.0 + cos(ph->skipcount * ph->lfoskip + ph->phase)); + ph->gain = (exp(ph->gain * phaserlfoshape) - 1.0) / (exp(phaserlfoshape) - 1); + ph->gain = 1.0 - ph->gain * ph->depth; + } + + for (s = 0; s < ph->stages; s++) + { + for (c = 0; c < 2; c++) + { + tmp[c] = ph->old[c][s]; + ph->old[c][s] = ph->gain * tmp[c] + m[c]; + m[c] = tmp[c] - ph->gain * ph->old[c][s]; + } + } + + for (c = 0; c < 2; c++) + { + ph->fbout[c] = m[c]; + out[c] = m[c] * ph->drywet + in[c] * (1.0f - ph->drywet); + } + } +} + +static void *phaser_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float lfo_freq, lfo_start_phase; + struct phaser_data *ph = (struct phaser_data*)calloc(1, sizeof(*ph)); + if (!ph) + return NULL; + + config->get_float(userdata, "lfo_freq", &lfo_freq, 0.4f); + config->get_float(userdata, "lfo_start_phase", &lfo_start_phase, 0.0f); + config->get_float(userdata, "feedback", &ph->fb, 0.0f); + config->get_float(userdata, "depth", &ph->depth, 0.4f); + config->get_float(userdata, "dry_wet", &ph->drywet, 0.5f); + config->get_int(userdata, "stages", &ph->stages, 2); + + if (ph->stages < 1) + ph->stages = 1; + else if (ph->stages > 24) + ph->stages = 24; + + ph->lfoskip = lfo_freq * 2.0 * M_PI / info->input_rate; + ph->phase = lfo_start_phase * M_PI / 180.0; + + return ph; +} + +static const struct dspfilter_implementation phaser_plug = { + phaser_init, + phaser_process, + phaser_free, + + DSPFILTER_API_VERSION, + "Phaser", + "phaser", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation phaser_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &phaser_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/reverb.c
Added
@@ -0,0 +1,316 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (reverb.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_inline.h> +#include <libretro_dspfilter.h> + +struct comb +{ + float *buffer; + unsigned bufsize; + unsigned bufidx; + + float feedback; + float filterstore; + float damp1, damp2; +}; + +struct allpass +{ + float *buffer; + float feedback; + unsigned bufsize; + unsigned bufidx; +}; + +static INLINE float comb_process(struct comb *c, float input) +{ + float output = c->buffer[c->bufidx]; + c->filterstore = (output * c->damp2) + (c->filterstore * c->damp1); + + c->buffer[c->bufidx] = input + (c->filterstore * c->feedback); + + c->bufidx++; + if (c->bufidx >= c->bufsize) + c->bufidx = 0; + + return output; +} + +static INLINE float allpass_process(struct allpass *a, float input) +{ + float bufout = a->buffer[a->bufidx]; + float output = -input + bufout; + a->buffer[a->bufidx] = input + bufout * a->feedback; + + a->bufidx++; + if (a->bufidx >= a->bufsize) + a->bufidx = 0; + + return output; +} + +#define numcombs 8 +#define numallpasses 4 +static const float muted = 0; +static const float fixedgain = 0.015f; +static const float scalewet = 3; +static const float scaledry = 2; +static const float scaledamp = 0.4f; +static const float scaleroom = 0.28f; +static const float offsetroom = 0.7f; +static const float initialroom = 0.5f; +static const float initialdamp = 0.5f; +static const float initialwet = 1.0f / 3.0f; +static const float initialdry = 0; +static const float initialwidth = 1; +static const float initialmode = 0; +static const float freezemode = 0.5f; + +struct revmodel +{ + struct comb combL[numcombs]; + struct allpass allpassL[numallpasses]; + + float *bufcomb[numcombs]; + float *bufallpass[numallpasses]; + + float gain; + float roomsize, roomsize1; + float damp, damp1; + float wet, wet1, wet2; + float dry; + float width; + float mode; +}; + +static float revmodel_process(struct revmodel *rev, float in) +{ + int i; + float mono_out = 0.0f; + float mono_in = in; + float input = mono_in * rev->gain; + + for (i = 0; i < numcombs; i++) + mono_out += comb_process(&rev->combL[i], input); + + for (i = 0; i < numallpasses; i++) + mono_out = allpass_process(&rev->allpassL[i], mono_out); + + return mono_in * rev->dry + mono_out * rev->wet1; +} + +static void revmodel_update(struct revmodel *rev) +{ + int i; + rev->wet1 = rev->wet * (rev->width / 2.0f + 0.5f); + + if (rev->mode >= freezemode) + { + rev->roomsize1 = 1.0f; + rev->damp1 = 0.0f; + rev->gain = muted; + } + else + { + rev->roomsize1 = rev->roomsize; + rev->damp1 = rev->damp; + rev->gain = fixedgain; + } + + for (i = 0; i < numcombs; i++) + { + rev->combL[i].feedback = rev->roomsize1; + rev->combL[i].damp1 = rev->damp1; + rev->combL[i].damp2 = 1.0f - rev->damp1; + } +} + +static void revmodel_setroomsize(struct revmodel *rev, float value) +{ + rev->roomsize = value * scaleroom + offsetroom; + revmodel_update(rev); +} + +static void revmodel_setdamp(struct revmodel *rev, float value) +{ + rev->damp = value * scaledamp; + revmodel_update(rev); +} + +static void revmodel_setwet(struct revmodel *rev, float value) +{ + rev->wet = value * scalewet; + revmodel_update(rev); +} + +static void revmodel_setdry(struct revmodel *rev, float value) +{ + rev->dry = value * scaledry; + revmodel_update(rev); +} + +static void revmodel_setwidth(struct revmodel *rev, float value) +{ + rev->width = value; + revmodel_update(rev); +} + +static void revmodel_setmode(struct revmodel *rev, float value) +{ + rev->mode = value; + revmodel_update(rev); +} + +static void revmodel_init(struct revmodel *rev,int srate) +{ + + static const int comb_lengths[8] = { 1116,1188,1277,1356,1422,1491,1557,1617 }; + static const int allpass_lengths[4] = { 225,341,441,556 }; + double r = srate * (1 / 44100.0); + unsigned c; + + for (c = 0; c < numcombs; ++c) + { + rev->bufcomb[c] = malloc(r*comb_lengths[c]*sizeof(float)); + rev->combL[c].buffer = rev->bufcomb[c]; + memset(rev->combL[c].buffer,0,r*comb_lengths[c]*sizeof(float)); + rev->combL[c].bufsize=r*comb_lengths[c]; + } + + for (c = 0; c < numallpasses; ++c) + { + rev->bufallpass[c] = malloc(r*allpass_lengths[c]*sizeof(float)); + rev->allpassL[c].buffer = rev->bufallpass[c]; + memset(rev->allpassL[c].buffer,0,r*allpass_lengths[c]*sizeof(float)); + rev->allpassL[c].bufsize=r*allpass_lengths[c]; + rev->allpassL[c].feedback = 0.5f; + } + + revmodel_setwet(rev, initialwet); + revmodel_setroomsize(rev, initialroom); + revmodel_setdry(rev, initialdry); + revmodel_setdamp(rev, initialdamp); + revmodel_setwidth(rev, initialwidth); + revmodel_setmode(rev, initialmode); +} + +struct reverb_data +{ + struct revmodel left, right; +}; + +static void reverb_free(void *data) +{ + struct reverb_data *rev = (struct reverb_data*)data; + unsigned i; + + for (i = 0; i < numcombs; i++) { + free(rev->left.bufcomb[i]); + free(rev->right.bufcomb[i]); + } + + for (i = 0; i < numallpasses; i++) { + free(rev->left.bufallpass[i]); + free(rev->right.bufallpass[i]); + } + free(data); +} + +static void reverb_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + float *out; + struct reverb_data *rev = (struct reverb_data*)data; + + output->samples = input->samples; + output->frames = input->frames; + out = output->samples; + + for (i = 0; i < input->frames; i++, out += 2) + { + float in[2] = { out[0], out[1] }; + + out[0] = revmodel_process(&rev->left, in[0]); + out[1] = revmodel_process(&rev->right, in[1]); + } +} + +static void *reverb_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float drytime, wettime, damping, roomwidth, roomsize; + struct reverb_data *rev = (struct reverb_data*) + calloc(1, sizeof(*rev)); + if (!rev) + return NULL; + + config->get_float(userdata, "drytime", &drytime, 0.43f); + config->get_float(userdata, "wettime", &wettime, 0.4f); + config->get_float(userdata, "damping", &damping, 0.8f); + config->get_float(userdata, "roomwidth", &roomwidth, 0.56f); + config->get_float(userdata, "roomsize", &roomsize, 0.56f); + + revmodel_init(&rev->left,info->input_rate); + revmodel_init(&rev->right,info->input_rate); + + revmodel_setdamp(&rev->left, damping); + revmodel_setdry(&rev->left, drytime); + revmodel_setwet(&rev->left, wettime); + revmodel_setwidth(&rev->left, roomwidth); + revmodel_setroomsize(&rev->left, roomsize); + + revmodel_setdamp(&rev->right, damping); + revmodel_setdry(&rev->right, drytime); + revmodel_setwet(&rev->right, wettime); + revmodel_setwidth(&rev->right, roomwidth); + revmodel_setroomsize(&rev->right, roomsize); + + return rev; +} + +static const struct dspfilter_implementation reverb_plug = { + reverb_init, + reverb_process, + reverb_free, + + DSPFILTER_API_VERSION, + "Reverb", + "reverb", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation reverb_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &reverb_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/tremolo.c
Added
@@ -0,0 +1,132 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (tremolo.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> +#include <string/stdstring.h> + +#define sqr(a) ((a) * (a)) + +struct tremolo_core +{ + float freq; + float depth; + float* wavetable; + int index; + int maxindex; +}; + +struct tremolo +{ + struct tremolo_core left, right; +}; + +static void tremolo_free(void *data) +{ + struct tremolo *tre = (struct tremolo*)data; + free(tre->left.wavetable); + free(tre->right.wavetable); + free(data); +} + +static void tremolocore_init(struct tremolo_core *core,float depth,int samplerate,float freq) +{ + const double offset = 1. - depth / 2.; + unsigned i; + double env; + core->index = 0; + core->maxindex = samplerate/freq; + core->wavetable = malloc(core->maxindex*sizeof(float)); + memset(core->wavetable, 0, core->maxindex * sizeof(float)); + for (i = 0; i < core->maxindex; i++) { + env = freq * i / samplerate; + env = sin((M_PI*2) * fmod(env + 0.25, 1.0)); + core->wavetable[i] = env * (1 - fabs(offset)) + offset; + } +} + +float tremolocore_core(struct tremolo_core *core,float in) +{ + core->index = core->index % core->maxindex; + return in * core->wavetable[core->index++]; +} + +static void tremolo_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + float *out; + struct tremolo *tre = (struct tremolo*)data; + + output->samples = input->samples; + output->frames = input->frames; + out = output->samples; + + for (i = 0; i < input->frames; i++, out += 2) + { + float in[2] = { out[0], out[1] }; + + out[0] = tremolocore_core(&tre->left, in[0]); + out[1] = tremolocore_core(&tre->right, in[1]); + } +} + +static void *tremolo_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float freq, depth; + struct tremolo *tre = (struct tremolo*)calloc(1, sizeof(*tre)); + if (!tre) + return NULL; + + config->get_float(userdata, "freq", &freq,4.0f); + config->get_float(userdata, "depth", &depth, 0.9f); + tremolocore_init(&tre->left,depth,info->input_rate,freq); + tremolocore_init(&tre->right,depth,info->input_rate,freq); + return tre; +} + +static const struct dspfilter_implementation tremolo_plug = { + tremolo_init, + tremolo_process, + tremolo_free, + + DSPFILTER_API_VERSION, + "Tremolo", + "tremolo", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation tremolo_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &tremolo_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/vibrato.c
Added
@@ -0,0 +1,167 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (vibrato.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> +#include <string/stdstring.h> + +#define sqr(a) ((a) * (a)) + +const float BASE_DELAY_SEC = 0.002; // 2 ms +const float VIBRATO_FREQUENCY_DEFAULT_HZ = 2; +const float VIBRATO_FREQUENCY_MAX_HZ = 14; +const float VIBRATO_DEPTH_DEFAULT_PERCENT = 50; +const int add_delay = 3; + +float hermite_interp(float x, float *y) +{ + float c0, c1, c2, c3; + c0 = y[1]; + c1 = (1.0 / 2.0)*(y[2] - y[0]); + c2 = (y[0] - (5.0 / 2.0)*y[1]) + (2.0*y[2] - (1.0 / 2.0)*y[3]); + c3 = (1.0 / 2.0)*(y[3] - y[0]) + (3.0 / 2.0)*(y[1] - y[2]); + return ((c3*x + c2)*x + c1)*x + c0; +} + +struct vibrato_core +{ + float freq; + float samplerate; + int phase; + float depth; + float* buffer; + int writeindex; + int size; +}; + +struct vibrato +{ + struct vibrato_core left, right; +}; + +static void vibrato_free(void *data) +{ + struct vibrato *vib = (struct vibrato*)data; + free(vib->left.buffer); + free(vib->right.buffer); + free(data); +} + +static void vibratocore_init(struct vibrato_core *core,float depth,int samplerate,float freq) +{ + core->size = BASE_DELAY_SEC * samplerate * 2; + core->buffer = malloc((core->size + add_delay)*sizeof(float)); + memset(core->buffer, 0, (core->size + add_delay) * sizeof(float)); + core->samplerate = samplerate; + core->freq = freq; + core->depth = depth; + core->phase = 0; + core->writeindex = 0; +} + +float vibratocore_core(struct vibrato_core *core,float in) +{ + float M = core->freq / core->samplerate; + int maxphase = core->samplerate / core->freq; + float lfo = sin(M * 2. * M_PI * core->phase++); + core->phase = core->phase % maxphase; + lfo = (lfo + 1) * 1.; // transform from [-1; 1] to [0; 1] + int maxdelay = BASE_DELAY_SEC * core->samplerate; + float delay = lfo * core->depth * maxdelay; + delay += add_delay; + float readindex = core->writeindex - 1 - delay; + while (readindex < 0)readindex += core->size; + while (readindex >= core->size)readindex -= core->size; + int ipart = (int)readindex; // integer part of the delay + float fpart = readindex - ipart; // fractional part of the delay + float value = hermite_interp(fpart, &(core->buffer[ipart])); + core->buffer[core->writeindex] = in; + if (core->writeindex < add_delay){ + core->buffer[core->size + core->writeindex] = in; + } + core->writeindex++; + if (core->writeindex == core->size) { + core->writeindex = 0; + } + return value; +} + +static void vibrato_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + float *out; + struct vibrato *vib = (struct vibrato*)data; + + output->samples = input->samples; + output->frames = input->frames; + out = output->samples; + + for (i = 0; i < input->frames; i++, out += 2) + { + float in[2] = { out[0], out[1] }; + + out[0] = vibratocore_core(&vib->left, in[0]); + out[1] = vibratocore_core(&vib->right, in[1]); + } +} + +static void *vibrato_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + float freq, depth; + struct vibrato *vib = (struct vibrato*)calloc(1, sizeof(*vib)); + if (!vib) + return NULL; + + config->get_float(userdata, "freq", &freq,5.0f); + config->get_float(userdata, "depth", &depth, 0.5f); + vibratocore_init(&vib->left,depth,info->input_rate,freq); + vibratocore_init(&vib->right,depth,info->input_rate,freq); + return vib; +} + +static const struct dspfilter_implementation vibrato_plug = { + vibrato_init, + vibrato_process, + vibrato_free, + + DSPFILTER_API_VERSION, + "Vibrato", + "vibrato", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation vibrato_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation *dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &vibrato_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/dsp_filters/wahwah.c
Added
@@ -0,0 +1,147 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (wahwah.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <math.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> +#include <libretro_dspfilter.h> + +#define WAHWAH_LFO_SKIP_SAMPLES 30 + +struct wahwah_data +{ + float phase; + float lfoskip; + float b0, b1, b2, a0, a1, a2; + float freq, startphase; + float depth, freqofs, res; + unsigned long skipcount; + + struct + { + float xn1, xn2, yn1, yn2; + } l, r; +}; + +static void wahwah_free(void *data) +{ + if (data) + free(data); +} + +static void wahwah_process(void *data, struct dspfilter_output *output, + const struct dspfilter_input *input) +{ + unsigned i; + struct wahwah_data *wah = (struct wahwah_data*)data; + float *out = output->samples; + + output->samples = input->samples; + output->frames = input->frames; + + for (i = 0; i < input->frames; i++, out += 2) + { + float out_l, out_r; + float in[2] = { out[0], out[1] }; + + if ((wah->skipcount++ % WAHWAH_LFO_SKIP_SAMPLES) == 0) + { + float omega, sn, cs, alpha; + float frequency = (1.0 + cos(wah->skipcount * wah->lfoskip + wah->phase)) / 2.0; + + frequency = frequency * wah->depth * (1.0 - wah->freqofs) + wah->freqofs; + frequency = exp((frequency - 1.0) * 6.0); + + omega = M_PI * frequency; + sn = sin(omega); + cs = cos(omega); + alpha = sn / (2.0 * wah->res); + + wah->b0 = (1.0 - cs) / 2.0; + wah->b1 = 1.0 - cs; + wah->b2 = (1.0 - cs) / 2.0; + wah->a0 = 1.0 + alpha; + wah->a1 = -2.0 * cs; + wah->a2 = 1.0 - alpha; + } + + out_l = (wah->b0 * in[0] + wah->b1 * wah->l.xn1 + wah->b2 * wah->l.xn2 - wah->a1 * wah->l.yn1 - wah->a2 * wah->l.yn2) / wah->a0; + out_r = (wah->b0 * in[1] + wah->b1 * wah->r.xn1 + wah->b2 * wah->r.xn2 - wah->a1 * wah->r.yn1 - wah->a2 * wah->r.yn2) / wah->a0; + + wah->l.xn2 = wah->l.xn1; + wah->l.xn1 = in[0]; + wah->l.yn2 = wah->l.yn1; + wah->l.yn1 = out_l; + + wah->r.xn2 = wah->r.xn1; + wah->r.xn1 = in[1]; + wah->r.yn2 = wah->r.yn1; + wah->r.yn1 = out_r; + + out[0] = out_l; + out[1] = out_r; + } +} + +static void *wahwah_init(const struct dspfilter_info *info, + const struct dspfilter_config *config, void *userdata) +{ + struct wahwah_data *wah = (struct wahwah_data*)calloc(1, sizeof(*wah)); + if (!wah) + return NULL; + + config->get_float(userdata, "lfo_freq", &wah->freq, 1.5f); + config->get_float(userdata, "lfo_start_phase", &wah->startphase, 0.0f); + config->get_float(userdata, "freq_offset", &wah->freqofs, 0.3f); + config->get_float(userdata, "depth", &wah->depth, 0.7f); + config->get_float(userdata, "resonance", &wah->res, 2.5f); + + wah->lfoskip = wah->freq * 2.0 * M_PI / info->input_rate; + wah->phase = wah->startphase * M_PI / 180.0; + + return wah; +} + +static const struct dspfilter_implementation wahwah_plug = { + wahwah_init, + wahwah_process, + wahwah_free, + + DSPFILTER_API_VERSION, + "Wah-Wah", + "wahwah", +}; + +#ifdef HAVE_FILTERS_BUILTIN +#define dspfilter_get_implementation wahwah_dspfilter_get_implementation +#endif + +const struct dspfilter_implementation * +dspfilter_get_implementation(dspfilter_simd_mask_t mask) +{ + (void)mask; + return &wahwah_plug; +} + +#undef dspfilter_get_implementation
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/resampler
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/resampler/audio_resampler.c
Added
@@ -0,0 +1,189 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_resampler.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <string.h> + +#include <string/stdstring.h> +#include <features/features_cpu.h> +#include <file/config_file_userdata.h> + +#include <audio/audio_resampler.h> + +static void resampler_null_process(void *a, struct resampler_data *b) { } +static void resampler_null_free(void *a) { } +static void *resampler_null_init(const struct resampler_config *a, double b, + enum resampler_quality c, resampler_simd_mask_t d) { return (void*)0; } + +retro_resampler_t null_resampler = { + resampler_null_init, + resampler_null_process, + resampler_null_free, + RESAMPLER_API_VERSION, + "null", + "null" +}; + +static const retro_resampler_t *resampler_drivers[] = { + &sinc_resampler, +#ifdef HAVE_CC_RESAMPLER + &CC_resampler, +#endif +#ifdef HAVE_NEAREST_RESAMPLER + &nearest_resampler, +#endif + &null_resampler, + NULL, +}; + +static const struct resampler_config resampler_config = { + config_userdata_get_float, + config_userdata_get_int, + config_userdata_get_float_array, + config_userdata_get_int_array, + config_userdata_get_string, + config_userdata_free, +}; + +/** + * find_resampler_driver_index: + * @ident : Identifier of resampler driver to find. + * + * Finds resampler driver index by @ident name. + * + * Returns: resampler driver index if resampler driver was found, otherwise + * -1. + **/ +static int find_resampler_driver_index(const char *ident) +{ + unsigned i; + + for (i = 0; resampler_drivers[i]; i++) + if (string_is_equal_noncase(ident, resampler_drivers[i]->ident)) + return i; + return -1; +} + +/** + * find_resampler_driver: + * @ident : Identifier of resampler driver to find. + * + * Finds resampler by @ident name. + * + * Returns: resampler driver if resampler driver was found, otherwise + * NULL. + **/ +static const retro_resampler_t *find_resampler_driver(const char *ident) +{ + int i = find_resampler_driver_index(ident); + + if (i >= 0) + return resampler_drivers[i]; + + return resampler_drivers[0]; +} + +/** + * resampler_append_plugs: + * @re : Resampler handle + * @backend : Resampler backend that is about to be set. + * @bw_ratio : Bandwidth ratio. + * + * Initializes resampler driver based on queried CPU features. + * + * Returns: true (1) if successfully initialized, otherwise false (0). + **/ +static bool resampler_append_plugs(void **re, + const retro_resampler_t **backend, + enum resampler_quality quality, + double bw_ratio) +{ + resampler_simd_mask_t mask = (resampler_simd_mask_t)cpu_features_get(); + + if (*backend) + *re = (*backend)->init(&resampler_config, bw_ratio, quality, mask); + + if (!*re) + return false; + return true; +} + + +/** + * audio_resampler_driver_find_handle: + * @idx : index of driver to get handle to. + * + * Returns: handle to audio resampler driver at index. Can be NULL + * if nothing found. + **/ +const void *audio_resampler_driver_find_handle(int idx) +{ + const void *drv = resampler_drivers[idx]; + if (!drv) + return NULL; + return drv; +} + +/** + * audio_resampler_driver_find_ident: + * @idx : index of driver to get handle to. + * + * Returns: Human-readable identifier of audio resampler driver at index. + * Can be NULL if nothing found. + **/ +const char *audio_resampler_driver_find_ident(int idx) +{ + const retro_resampler_t *drv = resampler_drivers[idx]; + if (!drv) + return NULL; + return drv->ident; +} + +/** + * retro_resampler_realloc: + * @re : Resampler handle + * @backend : Resampler backend that is about to be set. + * @ident : Identifier name for resampler we want. + * @bw_ratio : Bandwidth ratio. + * + * Reallocates resampler. Will free previous handle before + * allocating a new one. If ident is NULL, first resampler will be used. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool retro_resampler_realloc(void **re, const retro_resampler_t **backend, + const char *ident, enum resampler_quality quality, double bw_ratio) +{ + if (*re && *backend) + (*backend)->free(*re); + + *re = NULL; + *backend = find_resampler_driver(ident); + + if (!resampler_append_plugs(re, backend, quality, bw_ratio)) + { + if (!*re) + *backend = NULL; + return false; + } + + return true; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/resampler/drivers
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/resampler/drivers/nearest_resampler.c
Added
@@ -0,0 +1,84 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (nearest_resampler.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <stdlib.h> +#include <math.h> + +#include <audio/audio_resampler.h> + +typedef struct rarch_nearest_resampler +{ + float fraction; +} rarch_nearest_resampler_t; + +static void resampler_nearest_process( + void *re_, struct resampler_data *data) +{ + rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*)re_; + audio_frame_float_t *inp = (audio_frame_float_t*)data->data_in; + audio_frame_float_t *inp_max = (audio_frame_float_t*)inp + data->input_frames; + audio_frame_float_t *outp = (audio_frame_float_t*)data->data_out; + float ratio = 1.0 / data->ratio; + + while (inp != inp_max) + { + while (re->fraction > 1) + { + *outp++ = *inp; + re->fraction -= ratio; + } + re->fraction++; + inp++; + } + + data->output_frames = (outp - (audio_frame_float_t*)data->data_out); +} + +static void resampler_nearest_free(void *re_) +{ + rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*)re_; + if (re) + free(re); +} + +static void *resampler_nearest_init(const struct resampler_config *config, + double bandwidth_mod, + enum resampler_quality quality, + resampler_simd_mask_t mask) +{ + rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*) + calloc(1, sizeof(rarch_nearest_resampler_t)); + if (!re) + return NULL; + re->fraction = 0; + return re; +} + +retro_resampler_t nearest_resampler = { + resampler_nearest_init, + resampler_nearest_process, + resampler_nearest_free, + RESAMPLER_API_VERSION, + "nearest", + "nearest" +};
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/resampler/drivers/sinc_resampler.c
Added
@@ -0,0 +1,886 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (sinc_resampler.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Bog-standard windowed SINC implementation. */ + +#include <stdint.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> + +#include <retro_environment.h> +#include <retro_inline.h> +#include <filters.h> +#include <memalign.h> + +#include <audio/audio_resampler.h> +#include <filters.h> + +#ifdef __SSE__ +#include <xmmintrin.h> +#endif + +#if defined(__AVX__) +#include <immintrin.h> +#endif + +/* Rough SNR values for upsampling: + * LOWEST: 40 dB + * LOWER: 55 dB + * NORMAL: 70 dB + * HIGHER: 110 dB + * HIGHEST: 140 dB + */ + +/* TODO, make all this more configurable. */ + +enum sinc_window +{ + SINC_WINDOW_NONE = 0, + SINC_WINDOW_KAISER, + SINC_WINDOW_LANCZOS +}; + +/* For the little amount of taps we're using, + * SSE1 is faster than AVX for some reason. + * AVX code is kept here though as by increasing number + * of sinc taps, the AVX code is clearly faster than SSE1. + */ + +typedef struct rarch_sinc_resampler +{ + /* A buffer for phase_table, buffer_l and buffer_r + * are created in a single calloc(). + * Ensure that we get as good cache locality as we can hope for. */ + float *main_buffer; + float *phase_table; + float *buffer_l; + float *buffer_r; + unsigned enable_avx; + unsigned phase_bits; + unsigned subphase_bits; + unsigned subphase_mask; + unsigned taps; + unsigned ptr; + uint32_t time; + float subphase_mod; + float kaiser_beta; + enum sinc_window window_type; +} rarch_sinc_resampler_t; + +#if (defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS)) || defined(HAVE_NEON) +#if TARGET_OS_IPHONE +#else +#ifndef WANT_NEON +#define WANT_NEON +#endif +#endif +#endif + +#ifdef WANT_NEON +/* Assumes that taps >= 8, and that taps is a multiple of 8. */ +void process_sinc_neon_asm(float *out, const float *left, + const float *right, const float *coeff, unsigned taps); + +static void resampler_sinc_process_neon(void *re_, struct resampler_data *data) +{ + rarch_sinc_resampler_t *resamp = (rarch_sinc_resampler_t*)re_; + unsigned phases = 1 << (resamp->phase_bits + resamp->subphase_bits); + + uint32_t ratio = phases / data->ratio; + const float *input = data->data_in; + float *output = data->data_out; + size_t frames = data->input_frames; + size_t out_frames = 0; + + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned phase = resamp->time >> resamp->subphase_bits; + const float *phase_table = resamp->phase_table + phase * taps; + + process_sinc_neon_asm(output, buffer_l, buffer_r, phase_table, taps); + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + } + + data->output_frames = out_frames; +} +#endif + +#if defined(__AVX__) +static void resampler_sinc_process_avx(void *re_, struct resampler_data *data) +{ + rarch_sinc_resampler_t *resamp = (rarch_sinc_resampler_t*)re_; + unsigned phases = 1 << (resamp->phase_bits + resamp->subphase_bits); + + uint32_t ratio = phases / data->ratio; + const float *input = data->data_in; + float *output = data->data_out; + size_t frames = data->input_frames; + size_t out_frames = 0; + + if (resamp->window_type == SINC_WINDOW_KAISER) + { + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned i; + unsigned phase = resamp->time >> resamp->subphase_bits; + + float *phase_table = resamp->phase_table + phase * taps * 2; + float *delta_table = phase_table + taps; + __m256 delta = _mm256_set1_ps((float) + (resamp->time & resamp->subphase_mask) * resamp->subphase_mod); + + __m256 sum_l = _mm256_setzero_ps(); + __m256 sum_r = _mm256_setzero_ps(); + + for (i = 0; i < taps; i += 8) + { + __m256 buf_l = _mm256_loadu_ps(buffer_l + i); + __m256 buf_r = _mm256_loadu_ps(buffer_r + i); + __m256 deltas = _mm256_load_ps(delta_table + i); + __m256 sinc = _mm256_add_ps(_mm256_load_ps((const float*)phase_table + i), + _mm256_mul_ps(deltas, delta)); + + sum_l = _mm256_add_ps(sum_l, _mm256_mul_ps(buf_l, sinc)); + sum_r = _mm256_add_ps(sum_r, _mm256_mul_ps(buf_r, sinc)); + } + + /* hadd on AVX is weird, and acts on low-lanes + * and high-lanes separately. */ + __m256 res_l = _mm256_hadd_ps(sum_l, sum_l); + __m256 res_r = _mm256_hadd_ps(sum_r, sum_r); + res_l = _mm256_hadd_ps(res_l, res_l); + res_r = _mm256_hadd_ps(res_r, res_r); + res_l = _mm256_add_ps(_mm256_permute2f128_ps(res_l, res_l, 1), res_l); + res_r = _mm256_add_ps(_mm256_permute2f128_ps(res_r, res_r, 1), res_r); + + /* This is optimized to mov %xmmN, [mem]. + * There doesn't seem to be any _mm256_store_ss intrinsic. */ + _mm_store_ss(output + 0, _mm256_extractf128_ps(res_l, 0)); + _mm_store_ss(output + 1, _mm256_extractf128_ps(res_r, 0)); + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + } + } + else + { + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned i; + __m256 delta; + unsigned phase = resamp->time >> resamp->subphase_bits; + float *phase_table = resamp->phase_table + phase * taps; + + __m256 sum_l = _mm256_setzero_ps(); + __m256 sum_r = _mm256_setzero_ps(); + + for (i = 0; i < taps; i += 8) + { + __m256 buf_l = _mm256_loadu_ps(buffer_l + i); + __m256 buf_r = _mm256_loadu_ps(buffer_r + i); + __m256 sinc = _mm256_load_ps((const float*)phase_table + i); + + sum_l = _mm256_add_ps(sum_l, _mm256_mul_ps(buf_l, sinc)); + sum_r = _mm256_add_ps(sum_r, _mm256_mul_ps(buf_r, sinc)); + } + + /* hadd on AVX is weird, and acts on low-lanes + * and high-lanes separately. */ + __m256 res_l = _mm256_hadd_ps(sum_l, sum_l); + __m256 res_r = _mm256_hadd_ps(sum_r, sum_r); + res_l = _mm256_hadd_ps(res_l, res_l); + res_r = _mm256_hadd_ps(res_r, res_r); + res_l = _mm256_add_ps(_mm256_permute2f128_ps(res_l, res_l, 1), res_l); + res_r = _mm256_add_ps(_mm256_permute2f128_ps(res_r, res_r, 1), res_r); + + /* This is optimized to mov %xmmN, [mem]. + * There doesn't seem to be any _mm256_store_ss intrinsic. */ + _mm_store_ss(output + 0, _mm256_extractf128_ps(res_l, 0)); + _mm_store_ss(output + 1, _mm256_extractf128_ps(res_r, 0)); + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + } + } + + data->output_frames = out_frames; +} +#endif + +#if defined(__SSE__) +static void resampler_sinc_process_sse(void *re_, struct resampler_data *data) +{ + rarch_sinc_resampler_t *resamp = (rarch_sinc_resampler_t*)re_; + unsigned phases = 1 << (resamp->phase_bits + resamp->subphase_bits); + + uint32_t ratio = phases / data->ratio; + const float *input = data->data_in; + float *output = data->data_out; + size_t frames = data->input_frames; + size_t out_frames = 0; + + if (resamp->window_type == SINC_WINDOW_KAISER) + { + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned i; + __m128 sum; + unsigned phase = resamp->time >> resamp->subphase_bits; + float *phase_table = resamp->phase_table + phase * taps * 2; + float *delta_table = phase_table + taps; + __m128 delta = _mm_set1_ps((float) + (resamp->time & resamp->subphase_mask) * resamp->subphase_mod); + + __m128 sum_l = _mm_setzero_ps(); + __m128 sum_r = _mm_setzero_ps(); + + for (i = 0; i < taps; i += 4) + { + __m128 buf_l = _mm_loadu_ps(buffer_l + i); + __m128 buf_r = _mm_loadu_ps(buffer_r + i); + __m128 deltas = _mm_load_ps(delta_table + i); + __m128 _sinc = _mm_add_ps(_mm_load_ps((const float*)phase_table + i), + _mm_mul_ps(deltas, delta)); + sum_l = _mm_add_ps(sum_l, _mm_mul_ps(buf_l, _sinc)); + sum_r = _mm_add_ps(sum_r, _mm_mul_ps(buf_r, _sinc)); + } + + /* Them annoying shuffles. + * sum_l = { l3, l2, l1, l0 } + * sum_r = { r3, r2, r1, r0 } + */ + + sum = _mm_add_ps(_mm_shuffle_ps(sum_l, sum_r, + _MM_SHUFFLE(1, 0, 1, 0)), + _mm_shuffle_ps(sum_l, sum_r, _MM_SHUFFLE(3, 2, 3, 2))); + + /* sum = { r1, r0, l1, l0 } + { r3, r2, l3, l2 } + * sum = { R1, R0, L1, L0 } + */ + + sum = _mm_add_ps(_mm_shuffle_ps(sum, sum, _MM_SHUFFLE(3, 3, 1, 1)), sum); + + /* sum = {R1, R1, L1, L1 } + { R1, R0, L1, L0 } + * sum = { X, R, X, L } + */ + + /* Store L */ + _mm_store_ss(output + 0, sum); + + /* movehl { X, R, X, L } == { X, R, X, R } */ + _mm_store_ss(output + 1, _mm_movehl_ps(sum, sum)); + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + } + } + else + { + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned i; + __m128 sum; + unsigned phase = resamp->time >> resamp->subphase_bits; + float *phase_table = resamp->phase_table + phase * taps; + + __m128 sum_l = _mm_setzero_ps(); + __m128 sum_r = _mm_setzero_ps(); + + for (i = 0; i < taps; i += 4) + { + __m128 buf_l = _mm_loadu_ps(buffer_l + i); + __m128 buf_r = _mm_loadu_ps(buffer_r + i); + __m128 _sinc = _mm_load_ps((const float*)phase_table + i); + sum_l = _mm_add_ps(sum_l, _mm_mul_ps(buf_l, _sinc)); + sum_r = _mm_add_ps(sum_r, _mm_mul_ps(buf_r, _sinc)); + } + + /* Them annoying shuffles. + * sum_l = { l3, l2, l1, l0 } + * sum_r = { r3, r2, r1, r0 } + */ + + sum = _mm_add_ps(_mm_shuffle_ps(sum_l, sum_r, + _MM_SHUFFLE(1, 0, 1, 0)), + _mm_shuffle_ps(sum_l, sum_r, _MM_SHUFFLE(3, 2, 3, 2))); + + /* sum = { r1, r0, l1, l0 } + { r3, r2, l3, l2 } + * sum = { R1, R0, L1, L0 } + */ + + sum = _mm_add_ps(_mm_shuffle_ps(sum, sum, _MM_SHUFFLE(3, 3, 1, 1)), sum); + + /* sum = {R1, R1, L1, L1 } + { R1, R0, L1, L0 } + * sum = { X, R, X, L } + */ + + /* Store L */ + _mm_store_ss(output + 0, sum); + + /* movehl { X, R, X, L } == { X, R, X, R } */ + _mm_store_ss(output + 1, _mm_movehl_ps(sum, sum)); + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + } + } + + data->output_frames = out_frames; +} +#endif + +static void resampler_sinc_process_c(void *re_, struct resampler_data *data) +{ + rarch_sinc_resampler_t *resamp = (rarch_sinc_resampler_t*)re_; + unsigned phases = 1 << (resamp->phase_bits + resamp->subphase_bits); + + uint32_t ratio = phases / data->ratio; + const float *input = data->data_in; + float *output = data->data_out; + size_t frames = data->input_frames; + size_t out_frames = 0; + + if (resamp->window_type == SINC_WINDOW_KAISER) + { + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned i; + float sum_l = 0.0f; + float sum_r = 0.0f; + unsigned phase = resamp->time >> resamp->subphase_bits; + float *phase_table = resamp->phase_table + phase * taps * 2; + float *delta_table = phase_table + taps; + float delta = (float) + (resamp->time & resamp->subphase_mask) * resamp->subphase_mod; + + for (i = 0; i < taps; i++) + { + float sinc_val = phase_table[i] + delta_table[i] * delta; + + sum_l += buffer_l[i] * sinc_val; + sum_r += buffer_r[i] * sinc_val; + } + + output[0] = sum_l; + output[1] = sum_r; + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + + } + } + else + { + while (frames) + { + while (frames && resamp->time >= phases) + { + /* Push in reverse to make filter more obvious. */ + if (!resamp->ptr) + resamp->ptr = resamp->taps; + resamp->ptr--; + + resamp->buffer_l[resamp->ptr + resamp->taps] = + resamp->buffer_l[resamp->ptr] = *input++; + + resamp->buffer_r[resamp->ptr + resamp->taps] = + resamp->buffer_r[resamp->ptr] = *input++; + + resamp->time -= phases; + frames--; + } + + { + const float *buffer_l = resamp->buffer_l + resamp->ptr; + const float *buffer_r = resamp->buffer_r + resamp->ptr; + unsigned taps = resamp->taps; + while (resamp->time < phases) + { + unsigned i; + float sum_l = 0.0f; + float sum_r = 0.0f; + unsigned phase = resamp->time >> resamp->subphase_bits; + float *phase_table = resamp->phase_table + phase * taps; + + for (i = 0; i < taps; i++) + { + float sinc_val = phase_table[i]; + + sum_l += buffer_l[i] * sinc_val; + sum_r += buffer_r[i] * sinc_val; + } + + output[0] = sum_l; + output[1] = sum_r; + + output += 2; + out_frames++; + resamp->time += ratio; + } + } + + } + } + + data->output_frames = out_frames; +} + +static void resampler_sinc_free(void *data) +{ + rarch_sinc_resampler_t *resamp = (rarch_sinc_resampler_t*)data; + if (resamp) + memalign_free(resamp->main_buffer); + free(resamp); +} + +static void sinc_init_table_kaiser(rarch_sinc_resampler_t *resamp, + double cutoff, + float *phase_table, int phases, int taps, bool calculate_delta) +{ + int i, j; + double window_mod = kaiser_window_function(0.0, resamp->kaiser_beta); /* Need to normalize w(0) to 1.0. */ + int stride = calculate_delta ? 2 : 1; + double sidelobes = taps / 2.0; + + for (i = 0; i < phases; i++) + { + for (j = 0; j < taps; j++) + { + double sinc_phase; + float val; + int n = j * phases + i; + double window_phase = (double)n / (phases * taps); /* [0, 1). */ + window_phase = 2.0 * window_phase - 1.0; /* [-1, 1) */ + sinc_phase = sidelobes * window_phase; + val = cutoff * sinc(M_PI * sinc_phase * cutoff) * + kaiser_window_function(window_phase, resamp->kaiser_beta) / window_mod; + phase_table[i * stride * taps + j] = val; + } + } + + if (calculate_delta) + { + int phase; + int p; + + for (p = 0; p < phases - 1; p++) + { + for (j = 0; j < taps; j++) + { + float delta = phase_table[(p + 1) * stride * taps + j] - + phase_table[p * stride * taps + j]; + phase_table[(p * stride + 1) * taps + j] = delta; + } + } + + phase = phases - 1; + for (j = 0; j < taps; j++) + { + float val, delta; + double sinc_phase; + int n = j * phases + (phase + 1); + double window_phase = (double)n / (phases * taps); /* (0, 1]. */ + window_phase = 2.0 * window_phase - 1.0; /* (-1, 1] */ + sinc_phase = sidelobes * window_phase; + + val = cutoff * sinc(M_PI * sinc_phase * cutoff) * + kaiser_window_function(window_phase, resamp->kaiser_beta) / window_mod; + delta = (val - phase_table[phase * stride * taps + j]); + phase_table[(phase * stride + 1) * taps + j] = delta; + } + } +} + +static void sinc_init_table_lanczos( + rarch_sinc_resampler_t *resamp, double cutoff, + float *phase_table, int phases, int taps, bool calculate_delta) +{ + int i, j; + double window_mod = lanzcos_window_function(0.0); /* Need to normalize w(0) to 1.0. */ + int stride = calculate_delta ? 2 : 1; + double sidelobes = taps / 2.0; + + for (i = 0; i < phases; i++) + { + for (j = 0; j < taps; j++) + { + double sinc_phase; + float val; + int n = j * phases + i; + double window_phase = (double)n / (phases * taps); /* [0, 1). */ + window_phase = 2.0 * window_phase - 1.0; /* [-1, 1) */ + sinc_phase = sidelobes * window_phase; + val = cutoff * sinc(M_PI * sinc_phase * cutoff) * + lanzcos_window_function(window_phase) / window_mod; + phase_table[i * stride * taps + j] = val; + } + } + + if (calculate_delta) + { + int phase; + int p; + + for (p = 0; p < phases - 1; p++) + { + for (j = 0; j < taps; j++) + { + float delta = phase_table[(p + 1) * stride * taps + j] - + phase_table[p * stride * taps + j]; + phase_table[(p * stride + 1) * taps + j] = delta; + } + } + + phase = phases - 1; + for (j = 0; j < taps; j++) + { + float val, delta; + double sinc_phase; + int n = j * phases + (phase + 1); + double window_phase = (double)n / (phases * taps); /* (0, 1]. */ + window_phase = 2.0 * window_phase - 1.0; /* (-1, 1] */ + sinc_phase = sidelobes * window_phase; + + val = cutoff * sinc(M_PI * sinc_phase * cutoff) * + lanzcos_window_function(window_phase) / window_mod; + delta = (val - phase_table[phase * stride * taps + j]); + phase_table[(phase * stride + 1) * taps + j] = delta; + } + } +} + +static void *resampler_sinc_new(const struct resampler_config *config, + double bandwidth_mod, enum resampler_quality quality, + resampler_simd_mask_t mask) +{ + double cutoff = 0.0; + size_t phase_elems = 0; + size_t elems = 0; + unsigned sidelobes = 0; + rarch_sinc_resampler_t *re = (rarch_sinc_resampler_t*) + calloc(1, sizeof(*re)); + + if (!re) + return NULL; + + re->window_type = SINC_WINDOW_NONE; + + switch (quality) + { + case RESAMPLER_QUALITY_LOWEST: + cutoff = 0.98; + sidelobes = 2; + re->phase_bits = 12; + re->subphase_bits = 10; + re->window_type = SINC_WINDOW_LANCZOS; + re->enable_avx = 0; + break; + case RESAMPLER_QUALITY_LOWER: + cutoff = 0.98; + sidelobes = 4; + re->phase_bits = 12; + re->subphase_bits = 10; + re->window_type = SINC_WINDOW_LANCZOS; + re->enable_avx = 0; + break; + case RESAMPLER_QUALITY_HIGHER: + cutoff = 0.90; + sidelobes = 32; + re->phase_bits = 10; + re->subphase_bits = 14; + re->window_type = SINC_WINDOW_KAISER; + re->kaiser_beta = 10.5; + re->enable_avx = 1; + break; + case RESAMPLER_QUALITY_HIGHEST: + cutoff = 0.962; + sidelobes = 128; + re->phase_bits = 10; + re->subphase_bits = 14; + re->window_type = SINC_WINDOW_KAISER; + re->kaiser_beta = 14.5; + re->enable_avx = 1; + break; + case RESAMPLER_QUALITY_NORMAL: + case RESAMPLER_QUALITY_DONTCARE: + cutoff = 0.825; + sidelobes = 8; + re->phase_bits = 8; + re->subphase_bits = 16; + re->window_type = SINC_WINDOW_KAISER; + re->kaiser_beta = 5.5; + re->enable_avx = 0; + break; + } + + re->subphase_mask = (1 << re->subphase_bits) - 1; + re->subphase_mod = 1.0f / (1 << re->subphase_bits); + re->taps = sidelobes * 2; + + /* Downsampling, must lower cutoff, and extend number of + * taps accordingly to keep same stopband attenuation. */ + if (bandwidth_mod < 1.0) + { + cutoff *= bandwidth_mod; + re->taps = (unsigned)ceil(re->taps / bandwidth_mod); + } + + /* Be SIMD-friendly. */ +#if defined(__AVX__) + if (re->enable_avx) + re->taps = (re->taps + 7) & ~7; + else +#endif + { +#if defined(WANT_NEON) + re->taps = (re->taps + 7) & ~7; +#else + re->taps = (re->taps + 3) & ~3; +#endif + } + + phase_elems = ((1 << re->phase_bits) * re->taps); + if (re->window_type == SINC_WINDOW_KAISER) + phase_elems = phase_elems * 2; + elems = phase_elems + 4 * re->taps; + + re->main_buffer = (float*)memalign_alloc(128, sizeof(float) * elems); + if (!re->main_buffer) + goto error; + + memset(re->main_buffer, 0, sizeof(float) * elems); + + re->phase_table = re->main_buffer; + re->buffer_l = re->main_buffer + phase_elems; + re->buffer_r = re->buffer_l + 2 * re->taps; + + switch (re->window_type) + { + case SINC_WINDOW_LANCZOS: + sinc_init_table_lanczos(re, cutoff, re->phase_table, + 1 << re->phase_bits, re->taps, false); + break; + case SINC_WINDOW_KAISER: + sinc_init_table_kaiser(re, cutoff, re->phase_table, + 1 << re->phase_bits, re->taps, true); + break; + case SINC_WINDOW_NONE: + goto error; + } + + sinc_resampler.process = resampler_sinc_process_c; + + if (mask & RESAMPLER_SIMD_AVX && re->enable_avx) + { +#if defined(__AVX__) + sinc_resampler.process = resampler_sinc_process_avx; +#endif + } + else if (mask & RESAMPLER_SIMD_SSE) + { +#if defined(__SSE__) + sinc_resampler.process = resampler_sinc_process_sse; +#endif + } + else if (mask & RESAMPLER_SIMD_NEON && re->window_type != SINC_WINDOW_KAISER) + { +#if defined(WANT_NEON) + sinc_resampler.process = resampler_sinc_process_neon; +#endif + } + + return re; + +error: + resampler_sinc_free(re); + return NULL; +} + +retro_resampler_t sinc_resampler = { + resampler_sinc_new, + resampler_sinc_process_c, + resampler_sinc_free, + RESAMPLER_API_VERSION, + "sinc", + "sinc" +}; + +#undef WANT_NEON
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/audio/resampler/drivers/sinc_resampler_neon.S
Added
@@ -0,0 +1,74 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (sinc_resampler_neon.S). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#if defined(__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS) + +#ifndef __MACH__ +.arm +#endif +.align 4 +.globl process_sinc_neon_asm +#ifndef __MACH__ +.type process_sinc_neon_asm, %function +#endif +.globl _process_sinc_neon_asm +#ifndef __MACH__ +.type _process_sinc_neon_asm, %function +#endif +# void process_sinc_neon(float *out, const float *left, const float *right, const float *coeff, unsigned taps) +# Assumes taps is >= 8, and a multiple of 8. +process_sinc_neon_asm: +_process_sinc_neon_asm: + + push {r4, lr} + vmov.f32 q0, #0.0 + vmov.f32 q8, #0.0 + + # Taps argument (r4) goes on stack in armeabi. + ldr r4, [sp, #8] + +1: + # Left + vld1.f32 {q2-q3}, [r1]! + # Right + vld1.f32 {q10-q11}, [r2]! + # Coeff + vld1.f32 {q12-q13}, [r3, :128]! + + # Left / Right + vmla.f32 q0, q2, q12 + vmla.f32 q8, q10, q12 + vmla.f32 q0, q3, q13 + vmla.f32 q8, q11, q13 + + subs r4, r4, #8 + bne 1b + + # Add everything together + vadd.f32 d0, d0, d1 + vadd.f32 d16, d16, d17 + vpadd.f32 d0, d0, d16 + vst1.f32 d0, [r0] + + pop {r4, pc} + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/cdrom
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/cdrom/cdrom.c
Added
@@ -0,0 +1,1744 @@ +/* Copyright (C) 2010-2020 The RetroArch team +* +* --------------------------------------------------------------------------------------- +* The following license statement only applies to this file (cdrom.c). +* --------------------------------------------------------------------------------------- +* +* Permission is hereby granted, free of charge, +* to any person obtaining a copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation the rights to +* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <cdrom/cdrom.h> +#include <libretro.h> +#include <stdio.h> +#include <string.h> +#include <compat/strl.h> +#include <compat/strcasestr.h> +#include <retro_math.h> +#include <retro_timers.h> +#include <streams/file_stream.h> +#include <retro_endianness.h> +#include <retro_miscellaneous.h> +#include <vfs/vfs_implementation.h> +#include <lists/string_list.h> +#include <lists/dir_list.h> +#include <string/stdstring.h> +#include <memalign.h> + +#include <math.h> +#ifdef _WIN32 +#include <direct.h> +#else +#include <unistd.h> +#endif + +#if defined(__linux__) && !defined(ANDROID) +#include <sys/ioctl.h> +#include <scsi/sg.h> +#endif + +#if defined(_WIN32) && !defined(_XBOX) +#include <windows.h> +#include <winioctl.h> +#include <ntddscsi.h> +#endif + +#define CDROM_CUE_TRACK_BYTES 107 +#define CDROM_MAX_SENSE_BYTES 16 +#define CDROM_MAX_RETRIES 10 + +typedef enum +{ + DIRECTION_NONE, + DIRECTION_IN, + DIRECTION_OUT +} CDROM_CMD_Direction; + +void cdrom_lba_to_msf(unsigned lba, unsigned char *min, unsigned char *sec, unsigned char *frame) +{ + if (!min || !sec || !frame) + return; + + *frame = lba % 75; + lba /= 75; + *sec = lba % 60; + lba /= 60; + *min = lba; +} + +unsigned cdrom_msf_to_lba(unsigned char min, unsigned char sec, unsigned char frame) +{ + return (min * 60 + sec) * 75 + frame; +} + +void increment_msf(unsigned char *min, unsigned char *sec, unsigned char *frame) +{ + if (!min || !sec || !frame) + return; + + *min = (*frame == 74) ? (*sec < 59 ? *min : *min + 1) : *min; + *sec = (*frame == 74) ? (*sec < 59 ? (*sec + 1) : 0) : *sec; + *frame = (*frame < 74) ? (*frame + 1) : 0; +} + +#ifdef CDROM_DEBUG +static void cdrom_print_sense_data(const unsigned char *sense, size_t len) +{ + unsigned i; + const char *sense_key_text = NULL; + unsigned char key; + unsigned char asc; + unsigned char ascq; + + if (len < 16) + { + printf("[CDROM] Sense data buffer length too small.\n"); + fflush(stdout); + return; + } + + key = sense[2] & 0xF; + asc = sense[12]; + ascq = sense[13]; + + printf("[CDROM] Sense Data: "); + + for (i = 0; i < MIN(len, 16); i++) + { + printf("%02X ", sense[i]); + } + + printf("\n"); + + if (sense[0] == 0x70) + printf("[CDROM] CURRENT ERROR:\n"); + if (sense[0] == 0x71) + printf("[CDROM] DEFERRED ERROR:\n"); + + switch (key) + { + case 0: + sense_key_text = "NO SENSE"; + break; + case 1: + sense_key_text = "RECOVERED ERROR"; + break; + case 2: + sense_key_text = "NOT READY"; + break; + case 3: + sense_key_text = "MEDIUM ERROR"; + break; + case 4: + sense_key_text = "HARDWARE ERROR"; + break; + case 5: + sense_key_text = "ILLEGAL REQUEST"; + break; + case 6: + sense_key_text = "UNIT ATTENTION"; + break; + case 7: + sense_key_text = "DATA PROTECT"; + break; + case 8: + sense_key_text = "BLANK CHECK"; + break; + case 9: + sense_key_text = "VENDOR SPECIFIC"; + break; + case 10: + sense_key_text = "COPY ABORTED"; + break; + case 11: + sense_key_text = "ABORTED COMMAND"; + break; + case 13: + sense_key_text = "VOLUME OVERFLOW"; + break; + case 14: + sense_key_text = "MISCOMPARE"; + break; + } + + printf("[CDROM] Sense Key: %02X (%s)\n", key, sense_key_text ? sense_key_text : "null"); + printf("[CDROM] ASC: %02X\n", asc); + printf("[CDROM] ASCQ: %02X\n", ascq); + + switch (key) + { + case 2: + { + switch (asc) + { + case 4: + { + switch (ascq) + { + case 1: + printf("[CDROM] Description: LOGICAL UNIT IS IN PROCESS OF BECOMING READY\n"); + break; + default: + break; + } + + break; + } + case 0x3a: + { + switch (ascq) + { + case 0: + printf("[CDROM] Description: MEDIUM NOT PRESENT\n"); + break; + case 3: + printf("[CDROM] Description: MEDIUM NOT PRESENT - LOADABLE\n"); + break; + case 1: + printf("[CDROM] Description: MEDIUM NOT PRESENT - TRAY CLOSED\n"); + break; + case 2: + printf("[CDROM] Description: MEDIUM NOT PRESENT - TRAY OPEN\n"); + break; + default: + break; + } + + break; + } + default: + break; + } + } + case 3: + { + if (asc == 0x11 && ascq == 0x5) + printf("[CDROM] Description: L-EC UNCORRECTABLE ERROR\n"); + break; + } + case 5: + { + if (asc == 0x20 && ascq == 0) + printf("[CDROM] Description: INVALID COMMAND OPERATION CODE\n"); + else if (asc == 0x24 && ascq == 0) + printf("[CDROM] Description: INVALID FIELD IN CDB\n"); + else if (asc == 0x26 && ascq == 0) + printf("[CDROM] Description: INVALID FIELD IN PARAMETER LIST\n"); + break; + } + case 6: + { + if (asc == 0x28 && ascq == 0) + printf("[CDROM] Description: NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED\n"); + break; + } + default: + break; + } + + fflush(stdout); +} +#endif + +#if defined(_WIN32) && !defined(_XBOX) +static int cdrom_send_command_win32(const libretro_vfs_implementation_file *stream, CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len, unsigned char *sense, size_t sense_len) +{ + DWORD ioctl_bytes; + BOOL ioctl_rv; +#ifdef CDROM_DEBUG + clock_t t = clock(); + const char *extra = " "; + static unsigned char last_min = 0; + static unsigned char last_sec = 0; + static unsigned char last_frame = 0; + + unsigned lba_cur = cdrom_msf_to_lba(last_min, last_sec, last_frame); + unsigned lba_req = cdrom_msf_to_lba(cmd[3], cmd[4], cmd[5]); +#endif + struct sptd_with_sense + { + SCSI_PASS_THROUGH_DIRECT s; + UCHAR sense[128]; + } sptd; + + memset(&sptd, 0, sizeof(sptd)); + + sptd.s.Length = sizeof(sptd.s); + sptd.s.CdbLength = cmd_len; + + switch (dir) + { + case DIRECTION_IN: + sptd.s.DataIn = SCSI_IOCTL_DATA_IN; + break; + case DIRECTION_OUT: + sptd.s.DataIn = SCSI_IOCTL_DATA_OUT; + break; + case DIRECTION_NONE: + default: + sptd.s.DataIn = SCSI_IOCTL_DATA_UNSPECIFIED; + break; + } + + sptd.s.TimeOutValue = 5; + sptd.s.DataBuffer = buf; + sptd.s.DataTransferLength = len; + sptd.s.SenseInfoLength = sizeof(sptd.sense); + sptd.s.SenseInfoOffset = offsetof(struct sptd_with_sense, sense); + + memcpy(sptd.s.Cdb, cmd, cmd_len); + + ioctl_rv = DeviceIoControl(stream->fh, IOCTL_SCSI_PASS_THROUGH_DIRECT, &sptd, + sizeof(sptd), &sptd, sizeof(sptd), &ioctl_bytes, NULL); + +#ifdef CDROM_DEBUG + if (lba_req < lba_cur) + extra = " BACKWARDS SECTOR READ"; + else if (lba_req > lba_cur) + extra = " SKIPPED SECTOR READ"; + + if (cmd[0] == 0xB9) + { + double time_taken = (double)(((clock() - t) * 1000) / CLOCKS_PER_SEC); + printf("time taken %f ms for DT received length %ld of %" PRId64 " for %02d:%02d:%02d to %02d:%02d:%02d%s req %d cur %d cur_lba %d\n", time_taken, sptd.s.DataTransferLength, len, cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], extra, lba_req, lba_cur, stream->cdrom.cur_lba); + fflush(stdout); + } + + last_min = cmd[3]; + last_sec = cmd[4]; + last_frame = cmd[5]; + increment_msf(&last_min, &last_sec, &last_frame); +#endif + + if (!ioctl_rv || sptd.s.ScsiStatus != 0) + return 1; + + return 0; +} +#endif + +#if defined(__linux__) && !defined(ANDROID) +static int cdrom_send_command_linux(const libretro_vfs_implementation_file *stream, CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len, unsigned char *sense, size_t sense_len) +{ + sg_io_hdr_t sgio = {0}; + int rv; + + switch (dir) + { + case DIRECTION_IN: + sgio.dxfer_direction = SG_DXFER_FROM_DEV; + break; + case DIRECTION_OUT: + sgio.dxfer_direction = SG_DXFER_TO_DEV; + break; + case DIRECTION_NONE: + default: + sgio.dxfer_direction = SG_DXFER_NONE; + break; + } + + sgio.interface_id = 'S'; + sgio.cmd_len = cmd_len; + sgio.cmdp = cmd; + sgio.dxferp = buf; + sgio.dxfer_len = len; + sgio.sbp = sense; + sgio.mx_sb_len = sense_len; + sgio.timeout = 5000; + + rv = ioctl(fileno(stream->fp), SG_IO, &sgio); + + if (rv == -1 || sgio.info & SG_INFO_CHECK) + return 1; + + return 0; +} +#endif + +static int cdrom_send_command(libretro_vfs_implementation_file *stream, CDROM_CMD_Direction dir, void *buf, size_t len, unsigned char *cmd, size_t cmd_len, size_t skip) +{ + unsigned char *xfer_buf = NULL; + unsigned char *xfer_buf_pos = xfer_buf; + unsigned char sense[CDROM_MAX_SENSE_BYTES] = {0}; + unsigned char retries_left = CDROM_MAX_RETRIES; + int i, rv = 0; + int frames = 1; + size_t padded_req_bytes; + size_t copied_bytes = 0; + bool read_cd = false; + + if (!cmd || cmd_len == 0) + return 1; + + if (cmd[0] == 0xBE || cmd[0] == 0xB9) + { + frames = ceil((len + skip) / 2352.0); + padded_req_bytes = 2352 * frames; + read_cd = true; + /* these will be incremented below */ + cmd[6] = cmd[3]; + cmd[7] = cmd[4]; + cmd[8] = cmd[5]; + } + else + { + padded_req_bytes = len + skip; + } + + xfer_buf = (unsigned char*)memalign_alloc(4096, padded_req_bytes); + xfer_buf_pos = xfer_buf; + + if (!xfer_buf) + return 1; + + memset(xfer_buf, 0, padded_req_bytes); +#ifdef CDROM_DEBUG + printf("Number of frames to read: %d\n", frames); + fflush(stdout); +#endif + for (i = 0; i < frames; i++) + { + size_t request_len = padded_req_bytes; + size_t copy_len = request_len; + bool cached_read = false; + + if (read_cd) + { + unsigned lba_req = 0; + + request_len = 2352; + copy_len = request_len; + + increment_msf(&cmd[6], &cmd[7], &cmd[8]); + + if (i > 0) + { + skip = 0; + increment_msf(&cmd[3], &cmd[4], &cmd[5]); + } + else + { + if (skip) + copy_len -= skip; + } + + if (i == frames - 1) + { + copy_len = len - copied_bytes; + } + + lba_req = cdrom_msf_to_lba(cmd[3], cmd[4], cmd[5]); + + if (stream->cdrom.last_frame_valid && lba_req == stream->cdrom.last_frame_lba) + { + /* use cached frame */ + cached_read = true; +#ifdef CDROM_DEBUG + printf("[CDROM] Using cached frame\n"); + fflush(stdout); +#endif + /* assumes request_len is always equal to the size of last_frame */ + memcpy(xfer_buf_pos, stream->cdrom.last_frame, sizeof(stream->cdrom.last_frame)); + } + + } + +#ifdef CDROM_DEBUG + if (!cached_read) + { + unsigned j; + + printf("[CDROM] Send Command: "); + + for (j = 0; j < cmd_len / sizeof(*cmd); j++) + { + printf("%02X ", cmd[j]); + } + + if (len) + printf("(buffer of size %" PRId64 " with skip bytes %" PRId64 " padded to %" PRId64 "), frame %d\n", len, skip, padded_req_bytes, i); + else + printf("\n"); + + fflush(stdout); + } +#endif + +retry: +#if defined(__linux__) && !defined(ANDROID) + if (cached_read || !cdrom_send_command_linux(stream, dir, xfer_buf_pos, request_len, cmd, cmd_len, sense, sizeof(sense))) +#else +#if defined(_WIN32) && !defined(_XBOX) + if (cached_read || !cdrom_send_command_win32(stream, dir, xfer_buf_pos, request_len, cmd, cmd_len, sense, sizeof(sense))) +#endif +#endif + { + rv = 0; + + if (buf) + { +#if 0 + printf("offsetting %" PRId64 " from buf, copying at xfer_buf offset %" PRId64 ", copying %" PRId64 " bytes\n", copied_bytes, (xfer_buf_pos + skip) - xfer_buf, copy_len); + fflush(stdout); +#endif + memcpy((char*)buf + copied_bytes, xfer_buf_pos + skip, copy_len); + copied_bytes += copy_len; + + if (read_cd && !cached_read && request_len >= 2352) + { + unsigned frame_end = cdrom_msf_to_lba(cmd[6], cmd[7], cmd[8]); + + /* cache the last received frame */ + memcpy(stream->cdrom.last_frame, xfer_buf_pos, sizeof(stream->cdrom.last_frame)); + stream->cdrom.last_frame_valid = true; + /* the ending frame is never actually read, so what we really just read is the one right before that */ + stream->cdrom.last_frame_lba = frame_end - 1; + } + else + stream->cdrom.last_frame_valid = false; + +#if 0 + printf("Frame %d, adding %" PRId64 " to buf_pos, is now %" PRId64 ". skip is %" PRId64 "\n", i, request_len, (xfer_buf_pos + request_len) - xfer_buf, skip); + fflush(stdout); +#endif + xfer_buf_pos += request_len; + } + } + else + { +#ifdef CDROM_DEBUG + cdrom_print_sense_data(sense, sizeof(sense)); +#endif + + /* INQUIRY/TEST/SENSE should never fail, don't retry. */ + /* READ ATIP seems to fail outright on some drives with pressed discs, skip retries. */ + if (cmd[0] != 0x0 && cmd[0] != 0x12 && cmd[0] != 0x5A && !(cmd[0] == 0x43 && cmd[2] == 0x4)) + { + unsigned char key = sense[2] & 0xF; + + switch (key) + { + case 0: + case 2: + case 3: + case 4: + case 6: + if (retries_left) + { + #ifdef CDROM_DEBUG + printf("[CDROM] Read Retry...\n"); + fflush(stdout); + #endif + retries_left--; + retro_sleep(1000); + goto retry; + } + else + { + rv = 1; + #ifdef CDROM_DEBUG + printf("[CDROM] Read retries failed, giving up.\n"); + fflush(stdout); + #endif + } + + break; + default: + break; + } + } + + rv = 1; + } + } + + if (xfer_buf) + memalign_free(xfer_buf); + + return rv; +} + +static const char* get_profile(unsigned short profile) +{ + switch (profile) + { + case 2: + return "Removable disk"; + break; + case 8: + return "CD-ROM"; + break; + case 9: + return "CD-R"; + break; + case 0xA: + return "CD-RW"; + break; + case 0x10: + return "DVD-ROM"; + break; + case 0x11: + return "DVD-R Sequential Recording"; + break; + case 0x12: + return "DVD-RAM"; + break; + case 0x13: + return "DVD-RW Restricted Overwrite"; + break; + case 0x14: + return "DVD-RW Sequential recording"; + break; + case 0x15: + return "DVD-R Dual Layer Sequential Recording"; + break; + case 0x16: + return "DVD-R Dual Layer Jump Recording"; + break; + case 0x17: + return "DVD-RW Dual Layer"; + break; + case 0x1A: + return "DVD+RW"; + break; + case 0x1B: + return "DVD+R"; + break; + case 0x2A: + return "DVD+RW Dual Layer"; + break; + case 0x2B: + return "DVD+R Dual Layer"; + break; + case 0x40: + return "BD-ROM"; + break; + case 0x41: + return "BD-R SRM"; + break; + case 0x42: + return "BD-R RRM"; + break; + case 0x43: + return "BD-RE"; + break; + case 0x50: + return "HD DVD-ROM"; + break; + case 0x51: + return "HD DVD-R"; + break; + case 0x52: + return "HD DVD-RAM"; + break; + case 0x53: + return "HD DVD-RW"; + break; + case 0x58: + return "HD DVD-R Dual Layer"; + break; + case 0x5A: + return "HD DVD-RW Dual Layer"; + break; + default: + break; + } + + return "Unknown"; +} + +int cdrom_get_sense(libretro_vfs_implementation_file *stream, unsigned char *sense, size_t len) +{ + unsigned char cdb[] = {0x3, 0, 0, 0, 0xFC, 0}; + unsigned char buf[0xFC] = {0}; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] get sense data status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return 1; + +#ifdef CDROM_DEBUG + cdrom_print_sense_data(buf, sizeof(buf)); +#endif + + return 0; +} + +void cdrom_get_current_config_random_readable(libretro_vfs_implementation_file *stream) +{ + unsigned char cdb[] = {0x46, 0x2, 0, 0x10, 0, 0, 0, 0, 0x14, 0}; + unsigned char buf[0x14] = {0}; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + int i; + + printf("[CDROM] get current config random readable status code %d\n", rv); + + if (rv) + return; + + printf("[CDROM] Feature Header: "); + + for (i = 0; i < 8; i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + + printf("[CDROM] Random Readable Feature Descriptor: "); + + for (i = 0; i < 12; i++) + { + printf("%02X ", buf[8 + i]); + } + + printf("\n"); + + printf("[CDROM] Supported commands: READ CAPACITY, READ (10)\n"); +} + +void cdrom_get_current_config_multiread(libretro_vfs_implementation_file *stream) +{ + unsigned char cdb[] = {0x46, 0x2, 0, 0x1D, 0, 0, 0, 0, 0xC, 0}; + unsigned char buf[0xC] = {0}; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + int i; + + printf("[CDROM] get current config multi-read status code %d\n", rv); + + if (rv) + return; + + printf("[CDROM] Feature Header: "); + + for (i = 0; i < 8; i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + + printf("[CDROM] Multi-Read Feature Descriptor: "); + + for (i = 0; i < 4; i++) + { + printf("%02X ", buf[8 + i]); + } + + printf("\n"); + + printf("[CDROM] Supported commands: READ (10), READ CD, READ DISC INFORMATION, READ TRACK INFORMATION\n"); +} + +void cdrom_get_current_config_cdread(libretro_vfs_implementation_file *stream) +{ + unsigned char cdb[] = {0x46, 0x2, 0, 0x1E, 0, 0, 0, 0, 0x10, 0}; + unsigned char buf[0x10] = {0}; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + int i; + + printf("[CDROM] get current config cd read status code %d\n", rv); + + if (rv) + return; + + printf("[CDROM] Feature Header: "); + + for (i = 0; i < 8; i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + + printf("[CDROM] CD Read Feature Descriptor: "); + + for (i = 0; i < 8; i++) + { + printf("%02X ", buf[8 + i]); + } + + if (buf[8 + 2] & 1) + printf("(current)\n"); + + printf("[CDROM] Supported commands: READ CD, READ CD MSF, READ TOC/PMA/ATIP\n"); +} + +void cdrom_get_current_config_profiles(libretro_vfs_implementation_file *stream) +{ + unsigned char cdb[] = {0x46, 0x2, 0, 0x0, 0, 0, 0, 0xFF, 0xFA, 0}; + unsigned char buf[0xFFFA] = {0}; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + int i; + + printf("[CDROM] get current config profiles status code %d\n", rv); + + if (rv) + return; + + printf("[CDROM] Feature Header: "); + + for (i = 0; i < 8; i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + + printf("[CDROM] Profile List Descriptor: "); + + for (i = 0; i < 4; i++) + { + printf("%02X ", buf[8 + i]); + } + + printf("\n"); + + printf("[CDROM] Number of profiles: %u\n", buf[8 + 3] / 4); + + for (i = 0; i < buf[8 + 3] / 4; i++) + { + unsigned short profile = (buf[8 + (4 * (i + 1))] << 8) | buf[8 + (4 * (i + 1)) + 1]; + + printf("[CDROM] Profile Number: %04X (%s) ", profile, get_profile(profile)); + + if (buf[8 + (4 * (i + 1)) + 2] & 1) + printf("(current)\n"); + else + printf("\n"); + } +} + +void cdrom_get_current_config_core(libretro_vfs_implementation_file *stream) +{ + unsigned char cdb[] = {0x46, 0x2, 0, 0x1, 0, 0, 0, 0, 0x14, 0}; + unsigned char buf[20] = {0}; + unsigned intf_std = 0; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + int i; + const char *intf_std_name = "Unknown"; + + printf("[CDROM] get current config core status code %d\n", rv); + + if (rv) + return; + + printf("[CDROM] Feature Header: "); + + for (i = 0; i < 8; i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + + if (buf[6] == 0 && buf[7] == 8) + printf("[CDROM] Current Profile: CD-ROM\n"); + else + printf("[CDROM] Current Profile: %02X%02X\n", buf[6], buf[7]); + + printf("[CDROM] Core Feature Descriptor: "); + + for (i = 0; i < 12; i++) + { + printf("%02X ", buf[8 + i]); + } + + printf("\n"); + + intf_std = buf[8 + 4] << 24 | buf[8 + 5] << 16 | buf[8 + 6] << 8 | buf[8 + 7]; + + switch (intf_std) + { + case 0: + intf_std_name = "Unspecified"; + break; + case 1: + intf_std_name = "SCSI Family"; + break; + case 2: + intf_std_name = "ATAPI"; + break; + case 7: + intf_std_name = "Serial ATAPI"; + break; + case 8: + intf_std_name = "USB"; + break; + default: + break; + } + + printf("[CDROM] Physical Interface Standard: %u (%s)\n", intf_std, intf_std_name); +} + +int cdrom_read_subq(libretro_vfs_implementation_file *stream, unsigned char *buf, size_t len) +{ + /* MMC Command: READ TOC/PMA/ATIP */ + unsigned char cdb[] = {0x43, 0x2, 0x2, 0, 0, 0, 0x1, 0x9, 0x30, 0}; +#ifdef CDROM_DEBUG + unsigned short data_len = 0; + unsigned char first_session = 0; + unsigned char last_session = 0; + int i; +#endif + int rv; + + if (!buf) + return 1; + + rv = cdrom_send_command(stream, DIRECTION_IN, buf, len, cdb, sizeof(cdb), 0); + + if (rv) + return 1; + +#ifdef CDROM_DEBUG + data_len = buf[0] << 8 | buf[1]; + first_session = buf[2]; + last_session = buf[3]; + + printf("[CDROM] Data Length: %d\n", data_len); + printf("[CDROM] First Session: %d\n", first_session); + printf("[CDROM] Last Session: %d\n", last_session); + + for (i = 0; i < (data_len - 2) / 11; i++) + { + unsigned char session_num = buf[4 + (i * 11) + 0]; + unsigned char adr = (buf[4 + (i * 11) + 1] >> 4) & 0xF; + /*unsigned char control = buf[4 + (i * 11) + 1] & 0xF;*/ + unsigned char tno = buf[4 + (i * 11) + 2]; + unsigned char point = buf[4 + (i * 11) + 3]; + unsigned char pmin = buf[4 + (i * 11) + 8]; + unsigned char psec = buf[4 + (i * 11) + 9]; + unsigned char pframe = buf[4 + (i * 11) + 10]; + + /*printf("i %d control %d adr %d tno %d point %d: ", i, control, adr, tno, point);*/ + /* why is control always 0? */ + + if (/*(control == 4 || control == 6) && */adr == 1 && tno == 0 && point >= 1 && point <= 99) + { + printf("[CDROM] - Session#: %d TNO %d POINT %d ", session_num, tno, point); + printf("Track start time: (aMSF %02u:%02u:%02u) ", (unsigned)pmin, (unsigned)psec, (unsigned)pframe); + } + else if (/*(control == 4 || control == 6) && */adr == 1 && tno == 0 && point == 0xA0) + { + printf("[CDROM] - Session#: %d TNO %d POINT %d ", session_num, tno, point); + printf("First Track Number: %d ", pmin); + printf("Disc Type: %d ", psec); + } + else if (/*(control == 4 || control == 6) && */adr == 1 && tno == 0 && point == 0xA1) + { + printf("[CDROM] - Session#: %d TNO %d POINT %d ", session_num, tno, point); + printf("Last Track Number: %d ", pmin); + } + else if (/*(control == 4 || control == 6) && */adr == 1 && tno == 0 && point == 0xA2) + { + printf("[CDROM] - Session#: %d TNO %d POINT %d ", session_num, tno, point); + printf("Lead-out start time: (aMSF %02u:%02u:%02u) ", (unsigned)pmin, (unsigned)psec, (unsigned)pframe); + } + + printf("\n"); + } + + fflush(stdout); +#endif + return 0; +} + +static int cdrom_read_track_info(libretro_vfs_implementation_file *stream, unsigned char track, cdrom_toc_t *toc) +{ + /* MMC Command: READ TRACK INFORMATION */ + unsigned char cdb[] = {0x52, 0x1, 0, 0, 0, 0, 0, 0x1, 0x80, 0}; + unsigned char buf[384] = {0}; + unsigned lba = 0; + unsigned track_size = 0; + int rv; + ssize_t pregap_lba_len; + + cdb[5] = track; + + rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + + if (rv) + return 1; + + memcpy(&lba, buf + 8, 4); + memcpy(&track_size, buf + 24, 4); + + lba = swap_if_little32(lba); + track_size = swap_if_little32(track_size); + + /* lba_start may be earlier than the MSF start times seen in read_subq */ + toc->track[track - 1].lba_start = lba; + toc->track[track - 1].track_size = track_size; + + pregap_lba_len = (toc->track[track - 1].audio ? 0 : (toc->track[track - 1].lba - toc->track[track - 1].lba_start)); + + toc->track[track - 1].track_bytes = (track_size - pregap_lba_len) * 2352; + toc->track[track - 1].mode = buf[6] & 0xF; + +#ifdef CDROM_DEBUG + printf("[CDROM] Track %d Info: ", track); + printf("Copy: %d ", (buf[5] & 0x10) > 0); + printf("Data Mode: %d ", toc->track[track - 1].mode); + printf("LBA Start: %d (%d) ", lba, toc->track[track - 1].lba); + printf("Track Size: %d\n", track_size); + fflush(stdout); +#endif + + return 0; +} + +int cdrom_set_read_speed(libretro_vfs_implementation_file *stream, unsigned speed) +{ + /* MMC Command: SET CD SPEED */ + unsigned char cmd[] = {0xBB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + cmd[2] = (speed >> 24) & 0xFF; + cmd[3] = (speed >> 16) & 0xFF; + cmd[4] = (speed >> 8) & 0xFF; + cmd[5] = speed & 0xFF; + + return cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cmd, sizeof(cmd), 0); +} + +int cdrom_write_cue(libretro_vfs_implementation_file *stream, char **out_buf, size_t *out_len, char cdrom_drive, unsigned char *num_tracks, cdrom_toc_t *toc) +{ + unsigned char buf[2352] = {0}; + unsigned short data_len = 0; + size_t len = 0; + size_t pos = 0; + int rv = 0; + int i; + + if (!out_buf || !out_len || !num_tracks || !toc) + { +#ifdef CDROM_DEBUG + printf("[CDROM] Invalid buffer/length pointer for CDROM cue sheet\n"); + fflush(stdout); +#endif + return 1; + } + + cdrom_set_read_speed(stream, 0xFFFFFFFF); + + rv = cdrom_read_subq(stream, buf, sizeof(buf)); + + if (rv) + return rv; + + data_len = buf[0] << 8 | buf[1]; + + for (i = 0; i < (data_len - 2) / 11; i++) + { + unsigned char adr = (buf[4 + (i * 11) + 1] >> 4) & 0xF; + unsigned char tno = buf[4 + (i * 11) + 2]; + unsigned char point = buf[4 + (i * 11) + 3]; + unsigned char pmin = buf[4 + (i * 11) + 8]; + + if (/*(control == 4 || control == 6) && */adr == 1 && tno == 0 && point == 0xA1) + { + *num_tracks = pmin; +#ifdef CDROM_DEBUG + printf("[CDROM] Number of CDROM tracks: %d\n", *num_tracks); + fflush(stdout); +#endif + break; + } + } + + if (!*num_tracks || *num_tracks > 99) + { +#ifdef CDROM_DEBUG + printf("[CDROM] Invalid number of CDROM tracks: %d\n", *num_tracks); + fflush(stdout); +#endif + return 1; + } + + len = CDROM_CUE_TRACK_BYTES * (*num_tracks); + toc->num_tracks = *num_tracks; + *out_buf = (char*)calloc(1, len); + *out_len = len; + + for (i = 0; i < (data_len - 2) / 11; i++) + { + /*unsigned char session_num = buf[4 + (i * 11) + 0];*/ + unsigned char adr = (buf[4 + (i * 11) + 1] >> 4) & 0xF; + unsigned char control = buf[4 + (i * 11) + 1] & 0xF; + unsigned char tno = buf[4 + (i * 11) + 2]; + unsigned char point = buf[4 + (i * 11) + 3]; + /*unsigned char amin = buf[4 + (i * 11) + 4]; + unsigned char asec = buf[4 + (i * 11) + 5]; + unsigned char aframe = buf[4 + (i * 11) + 6];*/ + unsigned char pmin = buf[4 + (i * 11) + 8]; + unsigned char psec = buf[4 + (i * 11) + 9]; + unsigned char pframe = buf[4 + (i * 11) + 10]; + unsigned lba = cdrom_msf_to_lba(pmin, psec, pframe); + + /*printf("i %d control %d adr %d tno %d point %d: amin %d asec %d aframe %d pmin %d psec %d pframe %d\n", i, control, adr, tno, point, amin, asec, aframe, pmin, psec, pframe);*/ + /* why is control always 0? */ + + if (/*(control == 4 || control == 6) && */adr == 1 && tno == 0 && point >= 1 && point <= 99) + { + bool audio = false; + const char *track_type = "MODE1/2352"; + + audio = (!(control & 0x4) && !(control & 0x5)); + +#ifdef CDROM_DEBUG + printf("[CDROM] Track %02d CONTROL %01X ADR %01X AUDIO? %d\n", point, control, adr, audio); + fflush(stdout); +#endif + + toc->track[point - 1].track_num = point; + toc->track[point - 1].min = pmin; + toc->track[point - 1].sec = psec; + toc->track[point - 1].frame = pframe; + toc->track[point - 1].lba = lba; + toc->track[point - 1].audio = audio; + + cdrom_read_track_info(stream, point, toc); + + if (audio) + track_type = "AUDIO"; + else if (toc->track[point - 1].mode == 1) + track_type = "MODE1/2352"; + else if (toc->track[point - 1].mode == 2) + track_type = "MODE2/2352"; + +#if defined(_WIN32) && !defined(_XBOX) + pos += snprintf(*out_buf + pos, len - pos, "FILE \"cdrom://%c:/drive-track%02d.bin\" BINARY\n", cdrom_drive, point); +#else + pos += snprintf(*out_buf + pos, len - pos, "FILE \"cdrom://drive%c-track%02d.bin\" BINARY\n", cdrom_drive, point); +#endif + pos += snprintf(*out_buf + pos, len - pos, " TRACK %02d %s\n", point, track_type); + + { + unsigned pregap_lba_len = toc->track[point - 1].lba - toc->track[point - 1].lba_start; + + if (toc->track[point - 1].audio && pregap_lba_len > 0) + { + unsigned char min = 0; + unsigned char sec = 0; + unsigned char frame = 0; + + cdrom_lba_to_msf(pregap_lba_len, &min, &sec, &frame); + + pos += snprintf(*out_buf + pos, len - pos, " INDEX 00 00:00:00\n"); + pos += snprintf(*out_buf + pos, len - pos, " INDEX 01 %02u:%02u:%02u\n", (unsigned)min, (unsigned)sec, (unsigned)frame); + } + else + pos += snprintf(*out_buf + pos, len - pos, " INDEX 01 00:00:00\n"); + } + } + } + + return 0; +} + +/* needs 32 bytes for full vendor, product and version */ +int cdrom_get_inquiry(libretro_vfs_implementation_file *stream, char *model, int len, bool *is_cdrom) +{ + /* MMC Command: INQUIRY */ + unsigned char cdb[] = {0x12, 0, 0, 0, 0xff, 0}; + unsigned char buf[256] = {0}; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + bool cdrom = false; + + if (rv) + return 1; + + if (model && len >= 32) + { + memset(model, 0, len); + + /* vendor */ + memcpy(model, buf + 8, 8); + + model[8] = ' '; + + /* product */ + memcpy(model + 9, buf + 16, 16); + + model[25] = ' '; + + /* version */ + memcpy(model + 26, buf + 32, 4); + } + + cdrom = (buf[0] == 5); + + if (is_cdrom && cdrom) + *is_cdrom = true; + +#ifdef CDROM_DEBUG + printf("[CDROM] Device Model: %s (is CD-ROM? %s)\n", model, (cdrom ? "yes" : "no")); +#endif + return 0; +} + +int cdrom_read(libretro_vfs_implementation_file *stream, cdrom_group_timeouts_t *timeouts, unsigned char min, unsigned char sec, unsigned char frame, void *s, size_t len, size_t skip) +{ + /* MMC Command: READ CD MSF */ + unsigned char cdb[] = {0xB9, 0, 0, 0, 0, 0, 0, 0, 0, 0xF8, 0, 0}; + int rv; + double frames = ceil((len + skip) / 2352.0); + unsigned frame_end = cdrom_msf_to_lba(min, sec, frame) + frames; + + cdb[3] = min; + cdb[4] = sec; + cdb[5] = frame; + + if (frames <= 1) + { + cdrom_lba_to_msf(frame_end, &cdb[6], &cdb[7], &cdb[8]); +#ifdef CDROM_DEBUG + printf("[CDROM] single-frame read: %d %d %d skip %" PRId64 "\n", cdb[3], cdb[4], cdb[5], skip); + fflush(stdout); +#endif + } + else + { + cdrom_lba_to_msf(frame_end, &cdb[6], &cdb[7], &cdb[8]); + +#ifdef CDROM_DEBUG + printf("[CDROM] multi-frame read: %d sectors starting from %02d:%02d:%02d skip %" PRId64 "\n", (int)frames, cdb[3], cdb[4], cdb[5], skip); + fflush(stdout); +#endif + } + + /* regardless of the length specified here, a new buffer will be allocated and padded to a sector multiple inside cdrom_send_command */ + rv = cdrom_send_command(stream, DIRECTION_IN, s, len, cdb, sizeof(cdb), skip); + +#ifdef CDROM_DEBUG + printf("[CDROM] read msf status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + { + stream->cdrom.last_frame_valid = false; + return 1; + } + + return 0; +} + +int cdrom_stop(libretro_vfs_implementation_file *stream) +{ + /* MMC Command: START STOP UNIT */ + unsigned char cdb[] = {0x1B, 0, 0, 0, 0x0, 0}; + int rv = cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] stop status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return 1; + + return 0; +} + +int cdrom_unlock(libretro_vfs_implementation_file *stream) +{ + /* MMC Command: PREVENT ALLOW MEDIUM REMOVAL */ + unsigned char cdb[] = {0x1E, 0, 0, 0, 0x2, 0}; + int rv = cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] persistent prevent clear status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return 1; + + cdb[4] = 0x0; + + rv = cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] prevent clear status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return 1; + + return 0; +} + +int cdrom_open_tray(libretro_vfs_implementation_file *stream) +{ + /* MMC Command: START STOP UNIT */ + unsigned char cdb[] = {0x1B, 0, 0, 0, 0x2, 0}; + int rv; + + cdrom_unlock(stream); + cdrom_stop(stream); + + rv = cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] open tray status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return 1; + + return 0; +} + +int cdrom_close_tray(libretro_vfs_implementation_file *stream) +{ + /* MMC Command: START STOP UNIT */ + unsigned char cdb[] = {0x1B, 0, 0, 0, 0x3, 0}; + int rv = cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] close tray status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return 1; + + return 0; +} + +struct string_list* cdrom_get_available_drives(void) +{ + struct string_list *list = string_list_new(); +#if defined(__linux__) && !defined(ANDROID) + struct string_list *dir_list = dir_list_new("/dev", NULL, false, false, false, false); + int i; + bool found = false; + + if (!dir_list) + return list; + + for (i = 0; i < (int)dir_list->size; i++) + { + if (string_starts_with_size(dir_list->elems[i].data, "/dev/sg", + STRLEN_CONST("/dev/sg"))) + { + libretro_vfs_implementation_file *stream; + char drive_model[32] = {0}; + char drive_string[33] = {0}; + union string_list_elem_attr attr = {0}; + int dev_index = 0; + RFILE *file = filestream_open( + dir_list->elems[i].data, RETRO_VFS_FILE_ACCESS_READ, 0); + bool is_cdrom = false; + + found = true; + + if (!file) + { +#ifdef CDROM_DEBUG + printf("[CDROM] Could not open %s, please check permissions.\n", dir_list->elems[i].data); + fflush(stdout); +#endif + continue; + } + + stream = filestream_get_vfs_handle(file); + cdrom_get_inquiry(stream, drive_model, sizeof(drive_model), &is_cdrom); + filestream_close(file); + + if (!is_cdrom) + continue; + + sscanf(dir_list->elems[i].data + STRLEN_CONST("/dev/sg"), + "%d", &dev_index); + + dev_index = '0' + dev_index; + attr.i = dev_index; + + if (!string_is_empty(drive_model)) + strlcat(drive_string, drive_model, sizeof(drive_string)); + else + strlcat(drive_string, "Unknown Drive", sizeof(drive_string)); + + string_list_append(list, drive_string, attr); + } + } + + if (!found) + { + char *buf = NULL; + int64_t len = 0; + + if (filestream_read_file("/proc/modules", (void**)&buf, &len)) + { +#ifdef CDROM_DEBUG + bool found = false; +#endif + struct string_list mods = {0}; + + string_list_initialize(&mods); + + if (string_split_noalloc(&mods, buf, "\n")) + { + for (i = 0; i < mods.size; i++) + { + if (strcasestr(mods.elems[i].data, "sg ")) + { +#ifdef CDROM_DEBUG + found = true; +#endif + break; + } + } + } + string_list_deinitialize(&mods); + +#ifdef CDROM_DEBUG + if (found) + { + printf("[CDROM] No sg devices found but kernel module is loaded.\n"); + fflush(stdout); + } + else + { + printf("[CDROM] No sg devices found and sg kernel module is not loaded.\n"); + fflush(stdout); + } +#endif + } +#ifdef CDROM_DEBUG + else + { + printf("[CDROM] No sg devices found, could not check if sg kernel module is loaded.\n"); + fflush(stdout); + } +#endif + } + + string_list_free(dir_list); +#endif +#if defined(_WIN32) && !defined(_XBOX) + DWORD drive_mask = GetLogicalDrives(); + int i; + + for (i = 0; i < sizeof(DWORD) * 8; i++) + { + char path[] = {"a:\\"}; + char cdrom_path[] = {"cdrom://a:/drive-track01.bin"}; + + path[0] += i; + cdrom_path[8] += i; + + /* this drive letter doesn't exist */ + if (!(drive_mask & (1 << i))) + continue; + + if (GetDriveType(path) != DRIVE_CDROM) + continue; + else + { + char drive_model[32] = {0}; + char drive_string[33] = {0}; + union string_list_elem_attr attr = {0}; + RFILE *file = filestream_open(cdrom_path, RETRO_VFS_FILE_ACCESS_READ, 0); + libretro_vfs_implementation_file *stream; + bool is_cdrom = false; + + if (!file) + continue; + + stream = filestream_get_vfs_handle(file); + cdrom_get_inquiry(stream, drive_model, sizeof(drive_model), &is_cdrom); + filestream_close(file); + + if (!is_cdrom) + continue; + + attr.i = path[0]; + + if (!string_is_empty(drive_model)) + strlcat(drive_string, drive_model, sizeof(drive_string)); + else + strlcat(drive_string, "Unknown Drive", sizeof(drive_string)); + + string_list_append(list, drive_string, attr); + } + } +#endif + return list; +} + +bool cdrom_is_media_inserted(libretro_vfs_implementation_file *stream) +{ + /* MMC Command: TEST UNIT READY */ + unsigned char cdb[] = {0x00, 0, 0, 0, 0, 0}; + int rv = cdrom_send_command(stream, DIRECTION_NONE, NULL, 0, cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] media inserted status code %d\n", rv); + fflush(stdout); +#endif + + /* Will also return false if the drive is simply not ready yet (tray open, disc spinning back up after tray closed etc). + * Command will not block or wait for media to become ready. */ + if (rv) + return false; + + return true; +} + +bool cdrom_drive_has_media(const char drive) +{ + RFILE *file; + char cdrom_path_bin[256] = {0}; + + cdrom_device_fillpath(cdrom_path_bin, sizeof(cdrom_path_bin), drive, 1, false); + + file = filestream_open(cdrom_path_bin, RETRO_VFS_FILE_ACCESS_READ, 0); + + if (file) + { + libretro_vfs_implementation_file *stream = filestream_get_vfs_handle(file); + bool has_media = false; + + has_media = cdrom_is_media_inserted(stream); + + filestream_close(file); + + return has_media; + } + + return false; +} + +bool cdrom_set_read_cache(libretro_vfs_implementation_file *stream, bool enabled) +{ + /* MMC Command: MODE SENSE (10) and MODE SELECT (10) */ + unsigned char cdb_sense_changeable[] = {0x5A, 0, 0x48, 0, 0, 0, 0, 0, 0x14, 0}; + unsigned char cdb_sense[] = {0x5A, 0, 0x8, 0, 0, 0, 0, 0, 0x14, 0}; + unsigned char cdb_select[] = {0x55, 0x10, 0, 0, 0, 0, 0, 0, 0x14, 0}; + unsigned char buf[20] = {0}; + int rv, i; + + rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb_sense_changeable, sizeof(cdb_sense_changeable), 0); + +#ifdef CDROM_DEBUG + printf("[CDROM] mode sense changeable status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return false; + + if (!(buf[10] & 0x1)) + { + /* RCD (read cache disable) bit is not changeable */ +#ifdef CDROM_DEBUG + printf("[CDROM] RCD (read cache disable) bit is not changeable.\n"); + fflush(stdout); +#endif + return false; + } + + memset(buf, 0, sizeof(buf)); + + rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb_sense, sizeof(cdb_sense), 0); + +#ifdef CDROM_DEBUG + printf("mode sense status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return false; + +#ifdef CDROM_DEBUG + printf("Mode sense data for caching mode page: "); + + for (i = 0; i < (int)sizeof(buf); i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + fflush(stdout); +#endif + + /* "When transferred during execution of the MODE SELECT (10) command, Mode Data Length is reserved." */ + for (i = 0; i < 8; i++) + buf[i] = 0; + + if (enabled) + buf[10] &= ~1; + else + buf[10] |= 1; + + rv = cdrom_send_command(stream, DIRECTION_OUT, buf, sizeof(buf), cdb_select, sizeof(cdb_select), 0); + +#ifdef CDROM_DEBUG + printf("mode select status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return false; + + return true; +} + +bool cdrom_get_timeouts(libretro_vfs_implementation_file *stream, cdrom_group_timeouts_t *timeouts) +{ + /* MMC Command: MODE SENSE (10) */ + int rv; + unsigned char cdb[] = {0x5A, 0, 0x1D, 0, 0, 0, 0, 0, 0x14, 0}; + unsigned char buf[20] = {0}; + unsigned short g1 = 0; + unsigned short g2 = 0; + unsigned short g3 = 0; + + if (!timeouts) + return false; + + rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + +#ifdef CDROM_DEBUG + printf("get timeouts status code %d\n", rv); + fflush(stdout); +#endif + + if (rv) + return false; + + g1 = buf[14] << 8 | buf[15]; + g2 = buf[16] << 8 | buf[17]; + g3 = buf[18] << 8 | buf[19]; + +#ifdef CDROM_DEBUG + { + int i; + + printf("Mode sense data for timeout groups: "); + + for (i = 0; i < (int)sizeof(buf); i++) + { + printf("%02X ", buf[i]); + } + + printf("\n"); + + printf("Group 1 Timeout: %d\n", g1); + printf("Group 2 Timeout: %d\n", g2); + printf("Group 3 Timeout: %d\n", g3); + + fflush(stdout); + } +#endif + + timeouts->g1_timeout = g1; + timeouts->g2_timeout = g2; + timeouts->g3_timeout = g3; + + return true; +} + +bool cdrom_has_atip(libretro_vfs_implementation_file *stream) +{ + /* MMC Command: READ TOC/PMA/ATIP */ + unsigned char cdb[] = {0x43, 0x2, 0x4, 0, 0, 0, 0, 0x9, 0x30, 0}; + unsigned char buf[32] = {0}; + unsigned short atip_len = 0; + int rv = cdrom_send_command(stream, DIRECTION_IN, buf, sizeof(buf), cdb, sizeof(cdb), 0); + + if (rv) + return false; + + atip_len = buf[0] << 8 | buf[1]; + +#ifdef CDROM_DEBUG + printf("ATIP Length %d, Disc Type %d, Disc Sub-Type %d\n", atip_len, (buf[6] >> 6) & 0x1, ((buf[6] >> 5) & 0x1) << 2 | ((buf[6] >> 4) & 0x1) << 1 | ((buf[6] >> 3) & 0x1) << 0); +#endif + + if (atip_len < 5) + return false; + + return true; +} + +void cdrom_device_fillpath(char *path, size_t len, char drive, unsigned char track, bool is_cue) +{ + size_t pos = 0; + + if (!path || len == 0) + return; + + if (is_cue) + { +#ifdef _WIN32 + pos = strlcpy(path, "cdrom://", len); + + if (len > pos) + path[pos++] = drive; + + pos = strlcat(path, ":/drive.cue", len); +#else +#ifdef __linux__ + pos = strlcpy(path, "cdrom://drive", len); + + if (len > pos + 1) + { + path[pos++] = drive; + path[pos] = '\0'; + } + + pos = strlcat(path, ".cue", len); +#endif +#endif + } + else + { +#ifdef _WIN32 + pos = strlcpy(path, "cdrom://", len); + + if (len > pos + 1) + { + path[pos++] = drive; + path[pos] = '\0'; + } + + pos += snprintf(path + pos, len - pos, ":/drive-track%02d.bin", track); +#else +#ifdef __linux__ + pos = strlcpy(path, "cdrom://drive", len); + + if (len > pos) + path[pos++] = drive; + + pos += snprintf(path + pos, len - pos, "-track%02d.bin", track); +#endif +#endif + } +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_fnmatch.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_fnmatch.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_fnmatch.c). @@ -20,9 +20,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if __TEST_FNMATCH__ -#include <assert.h> -#endif #include <stddef.h> #include <compat/fnmatch.h> @@ -123,37 +120,3 @@ return 0; return FNM_NOMATCH; } - -#if __TEST_FNMATCH__ -int main(void) -{ - assert(rl_fnmatch("TEST", "TEST", 0) == 0); - assert(rl_fnmatch("TE?T", "TEST", 0) == 0); - assert(rl_fnmatch("TE[Ssa]T", "TEST", 0) == 0); - assert(rl_fnmatch("TE[Ssda]T", "TEsT", 0) == 0); - assert(rl_fnmatch("TE[Ssda]T", "TEdT", 0) == 0); - assert(rl_fnmatch("TE[Ssda]T", "TEaT", 0) == 0); - assert(rl_fnmatch("TEST*", "TEST", 0) == 0); - assert(rl_fnmatch("TEST**", "TEST", 0) == 0); - assert(rl_fnmatch("TE*ST*", "TEST", 0) == 0); - assert(rl_fnmatch("TE**ST*", "TEST", 0) == 0); - assert(rl_fnmatch("TE**ST*", "TExST", 0) == 0); - assert(rl_fnmatch("TE**ST", "TEST", 0) == 0); - assert(rl_fnmatch("TE**ST", "TExST", 0) == 0); - assert(rl_fnmatch("TE\\**ST", "TE*xST", 0) == 0); - assert(rl_fnmatch("*.*", "test.jpg", 0) == 0); - assert(rl_fnmatch("*.jpg", "test.jpg", 0) == 0); - assert(rl_fnmatch("*.[Jj][Pp][Gg]", "test.jPg", 0) == 0); - assert(rl_fnmatch("*.[Jj]*[Gg]", "test.jPg", 0) == 0); - assert(rl_fnmatch("TEST?", "TEST", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TES[asd", "TEST", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TEST\\", "TEST", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TEST*S", "TEST", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TE**ST", "TExT", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TE\\*T", "TExT", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TES?", "TES", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TE", "TEST", 0) == FNM_NOMATCH); - assert(rl_fnmatch("TEST!", "TEST", 0) == FNM_NOMATCH); - assert(rl_fnmatch("DSAD", "TEST", 0) == FNM_NOMATCH); -} -#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_getopt.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_getopt.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_getopt.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_ifaddrs.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_ifaddrs.c
Changed
@@ -48,12 +48,13 @@ struct sockaddr_nl l_addr; int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); - if(l_socket < 0) + if (l_socket < 0) return -1; memset(&l_addr, 0, sizeof(l_addr)); l_addr.nl_family = AF_NETLINK; - if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) + + if (bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) { close(l_socket); return -1; @@ -91,67 +92,77 @@ struct iovec l_iov = { p_buffer, p_len }; struct sockaddr_nl l_addr; - for(;;) + for (;;) { - l_msg.msg_name = (void *)&l_addr; - l_msg.msg_namelen = sizeof(l_addr); - l_msg.msg_iov = &l_iov; - l_msg.msg_iovlen = 1; - l_msg.msg_control = NULL; + int l_result; + + l_msg.msg_name = (void *)&l_addr; + l_msg.msg_namelen = sizeof(l_addr); + l_msg.msg_iov = &l_iov; + l_msg.msg_iovlen = 1; + l_msg.msg_control = NULL; l_msg.msg_controllen = 0; - l_msg.msg_flags = 0; - int l_result = recvmsg(p_socket, &l_msg, 0); + l_msg.msg_flags = 0; + + l_result = recvmsg(p_socket, &l_msg, 0); - if(l_result < 0) + if (l_result < 0) { - if(errno == EINTR) + if (errno == EINTR) continue; return -2; } - if(l_msg.msg_flags & MSG_TRUNC) /* buffer too small */ + if (l_msg.msg_flags & MSG_TRUNC) /* buffer too small */ return -1; return l_result; } } -static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done) +static struct nlmsghdr *getNetlinkResponse(int p_socket, + int *p_size, int *p_done) { - size_t l_size = 4096; + size_t l_size = 4096; void *l_buffer = NULL; - for(;;) + for (;;) { + int l_read; + free(l_buffer); l_buffer = malloc(l_size); - if (l_buffer == NULL) + if (!l_buffer) return NULL; - int l_read = netlink_recv(p_socket, l_buffer, l_size); + l_read = netlink_recv(p_socket, l_buffer, l_size); *p_size = l_read; - if(l_read == -2) + if (l_read == -2) { free(l_buffer); return NULL; } - if(l_read >= 0) + if (l_read >= 0) { pid_t l_pid = getpid(); struct nlmsghdr *l_hdr; - for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) + + for (l_hdr = (struct nlmsghdr *)l_buffer; + NLMSG_OK(l_hdr, (unsigned int)l_read); + l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) { - if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) + if ( (pid_t)l_hdr->nlmsg_pid != l_pid || + (int)l_hdr->nlmsg_seq != p_socket) continue; - if(l_hdr->nlmsg_type == NLMSG_DONE) + if (l_hdr->nlmsg_type == NLMSG_DONE) { *p_done = 1; break; } - if(l_hdr->nlmsg_type == NLMSG_ERROR) + if (l_hdr->nlmsg_type == NLMSG_ERROR) { free(l_buffer); return NULL; @@ -166,8 +177,8 @@ static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size) { - NetlinkList *l_item = malloc(sizeof(NetlinkList)); - if (l_item == NULL) + NetlinkList *l_item = (NetlinkList*)malloc(sizeof(NetlinkList)); + if (!l_item) return NULL; l_item->m_next = NULL; @@ -179,7 +190,8 @@ static void freeResultList(NetlinkList *p_list) { NetlinkList *l_cur; - while(p_list) + + while (p_list) { l_cur = p_list; p_list = p_list->m_next; @@ -190,29 +202,30 @@ static NetlinkList *getResultList(int p_socket, int p_request) { - if(netlink_send(p_socket, p_request) < 0) + int l_size; + NetlinkList *l_list = NULL; + NetlinkList *l_end = NULL; + int l_done = 0; + + if (netlink_send(p_socket, p_request) < 0) return NULL; - NetlinkList *l_list = NULL; - NetlinkList *l_end = NULL; - int l_size; - int l_done = 0; - while(!l_done) + while (!l_done) { NetlinkList *l_item = NULL; struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done); - if(!l_hdr) + if (!l_hdr) goto error; l_item = newListItem(l_hdr, l_size); if (!l_item) goto error; - if(!l_list) - l_list = l_item; + if (!l_list) + l_list = l_item; else l_end->m_next = l_item; - l_end = l_item; + l_end = l_item; } return l_list; @@ -267,12 +280,12 @@ static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry) { - if(!*p_resultList) + if (!*p_resultList) *p_resultList = p_entry; else { struct ifaddrs *l_cur = *p_resultList; - while(l_cur->ifa_next) + while (l_cur->ifa_next) l_cur = l_cur->ifa_next; l_cur->ifa_next = p_entry; } @@ -288,7 +301,8 @@ size_t l_dataSize = 0; size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); - for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + for (l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); + l_rta = RTA_NEXT(l_rta, l_rtaSize)) { size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); switch(l_rta->rta_type) @@ -308,8 +322,8 @@ } } - l_entry = malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); - if (l_entry == NULL) + l_entry = (struct ifaddrs*)malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); + if (!l_entry) return -1; memset(l_entry, 0, sizeof(struct ifaddrs)); @@ -320,16 +334,20 @@ char *l_addr = l_name + l_nameSize; char *l_data = l_addr + l_addrSize; - // save the interface index so we can look it up when handling the addresses. + /* save the interface index so we can look + * it up when handling the addresses. */ memcpy(l_index, &l_info->ifi_index, sizeof(int)); l_entry->ifa_flags = l_info->ifi_flags; - l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); - for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); + + for (l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); + l_rta = RTA_NEXT(l_rta, l_rtaSize)) { - void *l_rtaData = RTA_DATA(l_rta); + void *l_rtaData = RTA_DATA(l_rta); size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); + switch(l_rta->rta_type) { case IFLA_ADDRESS: @@ -339,8 +357,8 @@ makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); ((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index; ((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type; - if(l_rta->rta_type == IFLA_ADDRESS) - l_entry->ifa_addr = (struct sockaddr *)l_addr; + if (l_rta->rta_type == IFLA_ADDRESS) + l_entry->ifa_addr = (struct sockaddr *)l_addr; else l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; l_addr += NLMSG_ALIGN(l_addrLen); @@ -364,17 +382,19 @@ return 0; } -static struct ifaddrs *findInterface(int p_index, struct ifaddrs **p_links, int p_numLinks) +static struct ifaddrs *findInterface(int p_index, + struct ifaddrs **p_links, int p_numLinks) { - int l_num = 0; + int l_num = 0; struct ifaddrs *l_cur = *p_links; - while(l_cur && l_num < p_numLinks) + + while (l_cur && l_num < p_numLinks) { int l_index; char *l_indexPtr = ((char *)l_cur) + sizeof(struct ifaddrs); memcpy(&l_index, l_indexPtr, sizeof(int)); - if(l_index == p_index) + if (l_index == p_index) return l_cur; l_cur = l_cur->ifa_next; @@ -383,21 +403,24 @@ return NULL; } -static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList, int p_numLinks) +static int interpretAddr(struct nlmsghdr *p_hdr, + struct ifaddrs **p_resultList, int p_numLinks) { - size_t l_nameSize = 0; - size_t l_addrSize = 0; - int l_addedNetmask = 0; - struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); + struct rtattr *l_rta; + size_t l_rtaSize; + size_t l_nameSize = 0; + size_t l_addrSize = 0; + int l_addedNetmask = 0; + struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); struct ifaddrs *l_interface = findInterface(l_info->ifa_index, p_resultList, p_numLinks); - if(l_info->ifa_family == AF_PACKET) + if (l_info->ifa_family == AF_PACKET) return 0; - size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); - struct rtattr *l_rta; + l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); - for(l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + for (l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); + l_rta = RTA_NEXT(l_rta, l_rtaSize)) { size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); @@ -405,7 +428,7 @@ { case IFA_ADDRESS: case IFA_LOCAL: - if((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) + if ((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) { /* make room for netmask */ l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); @@ -422,8 +445,8 @@ } } - struct ifaddrs *l_entry = malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); - if (l_entry == NULL) + struct ifaddrs *l_entry = (struct ifaddrs*)malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); + if (!l_entry) return -1; memset(l_entry, 0, sizeof(struct ifaddrs)); @@ -433,11 +456,12 @@ char *l_addr = l_name + l_nameSize; l_entry->ifa_flags = l_info->ifa_flags; - if(l_interface) + if (l_interface) l_entry->ifa_flags |= l_interface->ifa_flags; l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); - for(l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + for (l_rta = IFA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); + l_rta = RTA_NEXT(l_rta, l_rtaSize)) { void *l_rtaData = RTA_DATA(l_rta); size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); @@ -449,24 +473,24 @@ { size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize); makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); - if(l_info->ifa_family == AF_INET6) + if (l_info->ifa_family == AF_INET6) { - if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) + if (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) ((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index; } - if(l_rta->rta_type == IFA_ADDRESS) + if (l_rta->rta_type == IFA_ADDRESS) { /* apparently in a point-to-point network IFA_ADDRESS * contains the dest address and IFA_LOCAL contains the local address */ - if(l_entry->ifa_addr) + if (l_entry->ifa_addr) l_entry->ifa_dstaddr = (struct sockaddr *)l_addr; else l_entry->ifa_addr = (struct sockaddr *)l_addr; } - else if(l_rta->rta_type == IFA_LOCAL) + else if (l_rta->rta_type == IFA_LOCAL) { - if(l_entry->ifa_addr) + if (l_entry->ifa_addr) l_entry->ifa_dstaddr = l_entry->ifa_addr; l_entry->ifa_addr = (struct sockaddr *)l_addr; } @@ -485,7 +509,7 @@ } } - if(l_entry->ifa_addr && + if (l_entry->ifa_addr && ( l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6)) { @@ -498,9 +522,9 @@ l_mask[0] = '\0'; - for(i=0; i<(l_prefix/8); ++i) + for (i=0; i<(l_prefix/8); ++i) l_mask[i] = 0xff; - if(l_prefix % 8) + if (l_prefix % 8) l_mask[i] = 0xff << (8 - (l_prefix % 8)); makeSockaddr(l_entry->ifa_addr->sa_family, @@ -516,23 +540,26 @@ struct ifaddrs **p_resultList) { int l_numLinks = 0; - pid_t l_pid = getpid(); - for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) + pid_t l_pid = getpid(); + + for (; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { struct nlmsghdr *l_hdr = NULL; unsigned int l_nlsize = p_netlinkList->m_size; - for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) + for (l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); + l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { - if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) + if ( (pid_t)l_hdr->nlmsg_pid != l_pid || + (int)l_hdr->nlmsg_seq != p_socket) continue; - if(l_hdr->nlmsg_type == NLMSG_DONE) + if (l_hdr->nlmsg_type == NLMSG_DONE) break; - if(l_hdr->nlmsg_type == RTM_NEWLINK) + if (l_hdr->nlmsg_type == RTM_NEWLINK) { - if(interpretLink(l_hdr, p_resultList) == -1) + if (interpretLink(l_hdr, p_resultList) == -1) return -1; ++l_numLinks; } @@ -545,20 +572,22 @@ struct ifaddrs **p_resultList, int p_numLinks) { pid_t l_pid = getpid(); - for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) + for (; p_netlinkList; p_netlinkList = p_netlinkList->m_next) { struct nlmsghdr *l_hdr = NULL; unsigned int l_nlsize = p_netlinkList->m_size; - for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) + for (l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); + l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) { - if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) + if ( (pid_t)l_hdr->nlmsg_pid != l_pid + || (int)l_hdr->nlmsg_seq != p_socket) continue; - if(l_hdr->nlmsg_type == NLMSG_DONE) + if (l_hdr->nlmsg_type == NLMSG_DONE) break; - if(l_hdr->nlmsg_type == RTM_NEWADDR) + if (l_hdr->nlmsg_type == RTM_NEWADDR) { if (interpretAddr(l_hdr, p_resultList, p_numLinks) == -1) return -1; @@ -570,34 +599,40 @@ int getifaddrs(struct ifaddrs **ifap) { - int l_socket = 0; - int l_result = 0; - if(!ifap) + NetlinkList *l_linkResults; + NetlinkList *l_addrResults; + int l_numLinks; + int l_socket = 0; + int l_result = 0; + if (!ifap) return -1; - *ifap = NULL; + + *ifap = NULL; l_socket = netlink_socket(); - if(l_socket < 0) + + if (l_socket < 0) return -1; - NetlinkList *l_linkResults = getResultList(l_socket, RTM_GETLINK); - if(!l_linkResults) + l_linkResults = getResultList(l_socket, RTM_GETLINK); + if (!l_linkResults) { close(l_socket); return -1; } - NetlinkList *l_addrResults = getResultList(l_socket, RTM_GETADDR); - if(!l_addrResults) + l_addrResults = getResultList(l_socket, RTM_GETADDR); + if (!l_addrResults) { close(l_socket); freeResultList(l_linkResults); return -1; } - int l_numLinks = interpretLinks(l_socket, l_linkResults, ifap); + l_numLinks = interpretLinks(l_socket, l_linkResults, ifap); - if(l_numLinks == -1 || interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1) + if ( l_numLinks == -1 || + interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1) l_result = -1; freeResultList(l_linkResults); @@ -610,10 +645,10 @@ { struct ifaddrs *l_cur = NULL; - while(ifa) + while (ifa) { l_cur = ifa; - ifa = ifa->ifa_next; + ifa = ifa->ifa_next; free(l_cur); } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_posix_string.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_posix_string.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_posix_string.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_snprintf.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_snprintf.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_snprintf.c). @@ -33,12 +33,12 @@ #if _MSC_VER < 1300 #define _vscprintf c89_vscprintf_retro__ -static int c89_vscprintf_retro__(const char *format, va_list pargs) +static int c89_vscprintf_retro__(const char *fmt, va_list pargs) { int retval; va_list argcopy; va_copy(argcopy, pargs); - retval = vsnprintf(NULL, 0, format, argcopy); + retval = vsnprintf(NULL, 0, fmt, argcopy); va_end(argcopy); return retval; } @@ -46,38 +46,36 @@ /* http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 */ -int c99_vsnprintf_retro__(char *outBuf, size_t size, const char *format, va_list ap) +int c99_vsnprintf_retro__(char *s, size_t len, const char *fmt, va_list ap) { int count = -1; - if (size != 0) + if (len != 0) { #if (_MSC_VER <= 1310) - count = _vsnprintf(outBuf, size - 1, format, ap); + count = _vsnprintf(s, len - 1, fmt, ap); #else - count = _vsnprintf_s(outBuf, size, size - 1, format, ap); + count = _vsnprintf_s(s, len, len - 1, fmt, ap); #endif } if (count == -1) - count = _vscprintf(format, ap); + count = _vscprintf(fmt, ap); - if (count == size) - { - /* there was no room for a NULL, so truncate the last character */ - outBuf[size - 1] = '\0'; - } + /* there was no room for a NULL, so truncate the last character */ + if (count == len && len) + s[len - 1] = '\0'; return count; } -int c99_snprintf_retro__(char *outBuf, size_t size, const char *format, ...) +int c99_snprintf_retro__(char *s, size_t len, const char *fmt, ...) { int count; va_list ap; - va_start(ap, format); - count = c99_vsnprintf_retro__(outBuf, size, format, ap); + va_start(ap, fmt); + count = c99_vsnprintf_retro__(s, len, fmt, ap); va_end(ap); return count;
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_strcasestr.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_strcasestr.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_strcasestr.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_strl.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_strl.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_strl.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/compat_vscprintf.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/compat_vscprintf.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2017 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (compat_snprintf.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/compat/fopen_utf8.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/compat/fopen_utf8.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (fopen_utf8.c). @@ -36,9 +36,7 @@ void *fopen_utf8(const char * filename, const char * mode) { -#if defined(_XBOX) - return fopen(filename, mode); -#elif defined(LEGACY_WIN32) +#if defined(LEGACY_WIN32) FILE *ret = NULL; char * filename_local = utf8_to_local_string_alloc(filename); @@ -51,9 +49,14 @@ #else wchar_t * filename_w = utf8_to_utf16_string_alloc(filename); wchar_t * mode_w = utf8_to_utf16_string_alloc(mode); - FILE* ret = _wfopen(filename_w, mode_w); - free(filename_w); - free(mode_w); + FILE* ret = NULL; + + if (filename_w && mode_w) + ret = _wfopen(filename_w, mode_w); + if (filename_w) + free(filename_w); + if (mode_w) + free(mode_w); return ret; #endif }
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/dynamic
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/dynamic/dylib.c
Added
@@ -0,0 +1,206 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (dylib.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <string.h> +#include <stdio.h> +#include <dynamic/dylib.h> +#include <encodings/utf.h> + +#ifdef NEED_DYNAMIC + +#ifdef _WIN32 +#include <compat/posix_string.h> +#include <windows.h> +#else +#include <dlfcn.h> +#endif + +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) + +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif + +#endif + +#ifdef _WIN32 +static char last_dyn_error[512]; + +static void set_dl_error(void) +{ + DWORD err = GetLastError(); + + if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + err, + MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), + last_dyn_error, + sizeof(last_dyn_error) - 1, + NULL) == 0) + snprintf(last_dyn_error, sizeof(last_dyn_error) - 1, + "unknown error %lu", err); +} +#endif + +/** + * dylib_load: + * @path : Path to libretro core library. + * + * Platform independent dylib loading. + * + * Returns: library handle on success, otherwise NULL. + **/ +dylib_t dylib_load(const char *path) +{ +#ifdef _WIN32 +#ifndef __WINRT__ + int prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); +#endif +#ifdef __WINRT__ + dylib_t lib; + /* On UWP, you can only load DLLs inside your install directory, using a special function that takes a relative path */ + char relative_path_abbrev[PATH_MAX_LENGTH]; + char *relative_path = relative_path_abbrev; + wchar_t *path_wide = NULL; + + relative_path_abbrev[0] = '\0'; + + if (!path_is_absolute(path)) + RARCH_WARN("Relative path in dylib_load! This is likely an attempt to load a system library that will fail\n"); + + fill_pathname_abbreviate_special(relative_path_abbrev, path, sizeof(relative_path_abbrev)); + + /* Path to dylib_load is not inside app install directory. + * Loading will probably fail. */ + if (relative_path[0] != ':' || !PATH_CHAR_IS_SLASH(relative_path[1])) { } + else + relative_path += 2; + + path_wide = utf8_to_utf16_string_alloc(relative_path); + lib = LoadPackagedLibrary(path_wide, 0); + free(path_wide); +#elif defined(LEGACY_WIN32) + dylib_t lib = LoadLibrary(path); +#else + wchar_t *path_wide = utf8_to_utf16_string_alloc(path); + dylib_t lib = LoadLibraryW(path_wide); + free(path_wide); +#endif + +#ifndef __WINRT__ + SetErrorMode(prevmode); +#endif + + if (!lib) + { + set_dl_error(); + return NULL; + } + last_dyn_error[0] = 0; +#else + dylib_t lib = dlopen(path, RTLD_LAZY | RTLD_LOCAL); +#endif + return lib; +} + +char *dylib_error(void) +{ +#ifdef _WIN32 + if (last_dyn_error[0]) + return last_dyn_error; + return NULL; +#else + return (char*)dlerror(); +#endif +} + +function_t dylib_proc(dylib_t lib, const char *proc) +{ + function_t sym; + +#ifdef _WIN32 + HMODULE mod = (HMODULE)lib; +#ifndef __WINRT__ + if (!mod) + mod = GetModuleHandle(NULL); +#else + /* GetModuleHandle is not available on UWP */ + if (!mod) + { + /* It's not possible to lookup symbols in current executable + * on UWP. */ + DebugBreak(); + return NULL; + } +#endif + sym = (function_t)GetProcAddress(mod, proc); + if (!sym) + { + set_dl_error(); + return NULL; + } + last_dyn_error[0] = 0; +#else + void *ptr_sym = NULL; + + if (lib) + ptr_sym = dlsym(lib, proc); + else + { + void *handle = dlopen(NULL, RTLD_LAZY); + if (handle) + { + ptr_sym = dlsym(handle, proc); + dlclose(handle); + } + } + + /* Dirty hack to workaround the non-legality of + * (void*) -> fn-pointer casts. */ + memcpy(&sym, &ptr_sym, sizeof(void*)); +#endif + + return sym; +} + +/** + * dylib_close: + * @lib : Library handle. + * + * Frees library handle. + **/ +void dylib_close(dylib_t lib) +{ +#ifdef _WIN32 + if (!FreeLibrary((HMODULE)lib)) + set_dl_error(); + last_dyn_error[0] = 0; +#else +#ifndef NO_DLCLOSE + dlclose(lib); +#endif +#endif +} + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/encodings/encoding_base64.c
Added
@@ -0,0 +1,151 @@ +/* + https://github.com/superwills/NibbleAndAHalf + base64.h -- Fast base64 encoding and decoding. + version 1.0.0, April 17, 2013 143a + Copyright (C) 2013 William Sherif + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + William Sherif + will.sherif@gmail.com + YWxsIHlvdXIgYmFzZSBhcmUgYmVsb25nIHRvIHVz + + + Modified for RetroArch formatting, logging, and header files. +*/ + + +#include <stdio.h> +#include <stdlib.h> +#include <encodings/base64.h> + +/* + Converts binary data of length=len to base64 characters. + Length of the resultant string is stored in flen + (you must pass pointer flen). +*/ +char* base64(const void* binaryData, int len, int *flen) +{ + const unsigned char* bin = (const unsigned char*) binaryData; + char* res; + + int rc = 0; /* result counter */ + int byteNo; /* I need this after the loop */ + + int modulusLen = len % 3 ; + + /* 2 gives 1 and 1 gives 2, but 0 gives 0. */ + int pad = ((modulusLen&1)<<1) + ((modulusLen&2)>>1); + + *flen = 4*(len + pad)/3; + res = (char*) malloc(*flen + 1); /* and one for the null */ + if (!res) + { + /* ERROR: base64 could not allocate enough memory. */ + return 0; + } + + for (byteNo=0; byteNo <= len-3; byteNo+=3) + { + unsigned char BYTE0 = bin[byteNo]; + unsigned char BYTE1 = bin[byteNo+1]; + unsigned char BYTE2 = bin[byteNo+2]; + + res[rc++] = b64[BYTE0 >> 2]; + res[rc++] = b64[((0x3&BYTE0)<<4) + (BYTE1 >> 4)]; + res[rc++] = b64[((0x0f&BYTE1)<<2) + (BYTE2>>6)]; + res[rc++] = b64[0x3f&BYTE2]; + } + + if (pad==2) + { + res[rc++] = b64[bin[byteNo] >> 2]; + res[rc++] = b64[(0x3&bin[byteNo])<<4]; + res[rc++] = '='; + res[rc++] = '='; + } + else if (pad==1) + { + res[rc++] = b64[bin[byteNo] >> 2]; + res[rc++] = b64[((0x3&bin[byteNo])<<4) + (bin[byteNo+1] >> 4)]; + res[rc++] = b64[(0x0f&bin[byteNo+1])<<2]; + res[rc++] = '='; + } + + res[rc]=0; /* NULL TERMINATOR! ;) */ + return res; +} + +unsigned char* unbase64(const char* ascii, int len, int *flen) +{ + const unsigned char *safeAsciiPtr = (const unsigned char*) ascii; + unsigned char *bin; + int cb = 0; + int charNo; + int pad = 0; + + if (len < 2) { /* 2 accesses below would be OOB. */ + /* catch empty string, return NULL as result. */ + + /* ERROR: You passed an invalid base64 string (too short). + * You get NULL back. */ + *flen = 0; + return 0; + } + + if(safeAsciiPtr[len-1]=='=') + ++pad; + if(safeAsciiPtr[len-2]=='=') + ++pad; + + *flen = 3*len/4 - pad; + bin = (unsigned char*)malloc(*flen); + + if (!bin) + { + /* ERROR: unbase64 could not allocate enough memory. */ + return 0; + } + + for (charNo=0; charNo <= len-4-pad; charNo+=4) + { + int A = unb64[safeAsciiPtr[charNo]]; + int B = unb64[safeAsciiPtr[charNo+1]]; + int C = unb64[safeAsciiPtr[charNo+2]]; + int D = unb64[safeAsciiPtr[charNo+3]]; + + bin[cb++] = (A<<2) | (B>>4); + bin[cb++] = (B<<4) | (C>>2); + bin[cb++] = (C<<6) | (D); + } + + if (pad==1) + { + int A = unb64[safeAsciiPtr[charNo]]; + int B = unb64[safeAsciiPtr[charNo+1]]; + int C = unb64[safeAsciiPtr[charNo+2]]; + + bin[cb++] = (A<<2) | (B>>4); + bin[cb++] = (B<<4) | (C>>2); + } + else if (pad==2) + { + int A = unb64[safeAsciiPtr[charNo]]; + int B = unb64[safeAsciiPtr[charNo+1]]; + + bin[cb++] = (A<<2) | (B>>4); + } + + return bin; +} +
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/encodings/encoding_crc32.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/encodings/encoding_crc32.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (encoding_crc32.c). @@ -117,13 +117,13 @@ if (!buf) goto error; - for(i = 0; i < CRC32_MAX_MB; i++) + for (i = 0; i < CRC32_MAX_MB; i++) { - int nread = filestream_read(file, buf, CRC32_BUFFER_SIZE); - if (nread < 0) + int64_t nread = filestream_read(file, buf, CRC32_BUFFER_SIZE); + if (nread < 0) goto error; - crc = encoding_crc32(crc, buf, nread); + crc = encoding_crc32(crc, buf, (size_t)nread); if (filestream_eof(file)) break; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/encodings/encoding_utf.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/encodings/encoding_utf.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (encoding_utf.c). @@ -37,6 +37,8 @@ #include <xtl.h> #endif +#define UTF8_WALKBYTE(string) (*((*(string))++)) + static unsigned leading_ones(uint8_t c) { unsigned ones = 0; @@ -89,13 +91,14 @@ bool utf16_conv_utf8(uint8_t *out, size_t *out_chars, const uint16_t *in, size_t in_size) { - static uint8_t kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - size_t out_pos = 0; - size_t in_pos = 0; + size_t out_pos = 0; + size_t in_pos = 0; + static const + uint8_t utf8_limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; for (;;) { - unsigned numAdds; + unsigned num_adds; uint32_t value; if (in_pos == in_size) @@ -124,21 +127,21 @@ value = (((value - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000; } - for (numAdds = 1; numAdds < 5; numAdds++) - if (value < (((uint32_t)1) << (numAdds * 5 + 6))) + for (num_adds = 1; num_adds < 5; num_adds++) + if (value < (((uint32_t)1) << (num_adds * 5 + 6))) break; if (out) - out[out_pos] = (char)(kUtf8Limits[numAdds - 1] - + (value >> (6 * numAdds))); + out[out_pos] = (char)(utf8_limits[num_adds - 1] + + (value >> (6 * num_adds))); out_pos++; do { - numAdds--; + num_adds--; if (out) out[out_pos] = (char)(0x80 - + ((value >> (6 * numAdds)) & 0x3F)); + + ((value >> (6 * num_adds)) & 0x3F)); out_pos++; - }while (numAdds != 0); + }while (num_adds != 0); } *out_chars = out_pos; @@ -166,13 +169,15 @@ while (*sb && chars-- > 0) { sb++; - while ((*sb & 0xC0) == 0x80) sb++; + while ((*sb & 0xC0) == 0x80) + sb++; } if ((size_t)(sb - sb_org) > d_len-1 /* NUL */) { sb = sb_org + d_len-1; - while ((*sb & 0xC0) == 0x80) sb--; + while ((*sb & 0xC0) == 0x80) + sb--; } memcpy(d, sb_org, sb-sb_org); @@ -184,14 +189,18 @@ const char *utf8skip(const char *str, size_t chars) { const uint8_t *strb = (const uint8_t*)str; + if (!chars) return str; + do { strb++; - while ((*strb & 0xC0)==0x80) strb++; + while ((*strb & 0xC0)==0x80) + strb++; chars--; - } while(chars); + }while (chars); + return (const char*)strb; } @@ -211,30 +220,27 @@ return ret; } -static uint8_t utf8_walkbyte(const char **string) -{ - return *((*string)++); -} - /* Does not validate the input, returns garbage if it's not UTF-8. */ uint32_t utf8_walk(const char **string) { - uint8_t first = utf8_walkbyte(string); + uint8_t first = UTF8_WALKBYTE(string); uint32_t ret = 0; if (first < 128) return first; - ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F); - if (first >= 0xE0) - ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F); - if (first >= 0xF0) - ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F); - - if (first >= 0xF0) - return ret | (first & 7) << 18; + ret = (ret << 6) | (UTF8_WALKBYTE(string) & 0x3F); if (first >= 0xE0) + { + ret = (ret << 6) | (UTF8_WALKBYTE(string) & 0x3F); + if (first >= 0xF0) + { + ret = (ret << 6) | (UTF8_WALKBYTE(string) & 0x3F); + return ret | (first & 7) << 18; + } return ret | (first & 15) << 12; + } + return ret | (first & 31) << 6; } @@ -273,115 +279,115 @@ return ret; } +#if defined(_WIN32) && !defined(_XBOX) && !defined(UNICODE) /* Returned pointer MUST be freed by the caller if non-NULL. */ -static char* mb_to_mb_string_alloc(const char *str, +static char *mb_to_mb_string_alloc(const char *str, enum CodePage cp_in, enum CodePage cp_out) { - char *path_buf = NULL; wchar_t *path_buf_wide = NULL; - int path_buf_len = 0; - int path_buf_wide_len = 0; - - if (!str || !*str) - return NULL; + int path_buf_wide_len = MultiByteToWideChar(cp_in, 0, str, -1, NULL, 0); + + /* Windows 95 will return 0 from these functions with + * a UTF8 codepage set without MSLU. + * + * From an unknown MSDN version (others omit this info): + * - CP_UTF8 Windows 98/Me, Windows NT 4.0 and later: + * Translate using UTF-8. When this is set, dwFlags must be zero. + * - Windows 95: Under the Microsoft Layer for Unicode, + * MultiByteToWideChar also supports CP_UTF7 and CP_UTF8. + */ - (void)path_buf; - (void)path_buf_wide; - (void)path_buf_len; - (void)path_buf_wide_len; + if (!path_buf_wide_len) + return strdup(str); -#if !defined(_WIN32) || defined(_XBOX) - /* assume string needs no modification if not on Windows */ - return strdup(str); -#else -#ifdef UNICODE - /* TODO/FIXME: Not implemented. */ - return strdup(str); -#else + path_buf_wide = (wchar_t*) + calloc(path_buf_wide_len + sizeof(wchar_t), sizeof(wchar_t)); - /* Windows 95 will return 0 from these functions with a UTF8 codepage set without MSLU. From an unknown MSDN version (others omit this info): - * - CP_UTF8 Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-8. When this is set, dwFlags must be zero. - * - Windows 95: Under the Microsoft Layer for Unicode, MultiByteToWideChar also supports CP_UTF7 and CP_UTF8. - */ - path_buf_wide_len = MultiByteToWideChar(cp_in, 0, str, -1, NULL, 0); - - if (path_buf_wide_len) + if (path_buf_wide) { - path_buf_wide = (wchar_t*) - calloc(path_buf_wide_len + sizeof(wchar_t), sizeof(wchar_t)); + MultiByteToWideChar(cp_in, 0, + str, -1, path_buf_wide, path_buf_wide_len); - if (path_buf_wide) + if (*path_buf_wide) { - MultiByteToWideChar(cp_in, 0, - str, -1, path_buf_wide, path_buf_wide_len); + int path_buf_len = WideCharToMultiByte(cp_out, 0, + path_buf_wide, -1, NULL, 0, NULL, NULL); - if (*path_buf_wide) + if (path_buf_len) { - path_buf_len = WideCharToMultiByte(cp_out, 0, - path_buf_wide, -1, NULL, 0, NULL, NULL); + char *path_buf = (char*) + calloc(path_buf_len + sizeof(char), sizeof(char)); - if (path_buf_len) + if (path_buf) { - path_buf = (char*) - calloc(path_buf_len + sizeof(char), sizeof(char)); - - if (path_buf) - { - WideCharToMultiByte(cp_out, 0, - path_buf_wide, -1, path_buf, - path_buf_len, NULL, NULL); + WideCharToMultiByte(cp_out, 0, + path_buf_wide, -1, path_buf, + path_buf_len, NULL, NULL); - free(path_buf_wide); + free(path_buf_wide); - if (*path_buf) - return path_buf; + if (*path_buf) + return path_buf; - free(path_buf); - return NULL; - } - } - else - { - free(path_buf_wide); - return strdup(str); + free(path_buf); + return NULL; } } + else + { + free(path_buf_wide); + return strdup(str); + } } - } - else - return strdup(str); - if (path_buf_wide) free(path_buf_wide); + } return NULL; -#endif -#endif } +#endif /* Returned pointer MUST be freed by the caller if non-NULL. */ char* utf8_to_local_string_alloc(const char *str) { - return mb_to_mb_string_alloc(str, CODEPAGE_UTF8, CODEPAGE_LOCAL); + if (str && *str) + { +#if defined(_WIN32) && !defined(_XBOX) && !defined(UNICODE) + return mb_to_mb_string_alloc(str, CODEPAGE_UTF8, CODEPAGE_LOCAL); +#else + /* assume string needs no modification if not on Windows */ + return strdup(str); +#endif + } + return NULL; } /* Returned pointer MUST be freed by the caller if non-NULL. */ char* local_to_utf8_string_alloc(const char *str) { - return mb_to_mb_string_alloc(str, CODEPAGE_LOCAL, CODEPAGE_UTF8); + if (str && *str) + { +#if defined(_WIN32) && !defined(_XBOX) && !defined(UNICODE) + return mb_to_mb_string_alloc(str, CODEPAGE_LOCAL, CODEPAGE_UTF8); +#else + /* assume string needs no modification if not on Windows */ + return strdup(str); +#endif + } + return NULL; } /* Returned pointer MUST be freed by the caller if non-NULL. */ wchar_t* utf8_to_utf16_string_alloc(const char *str) { #ifdef _WIN32 - int len = 0; - int out_len = 0; + int len = 0; + int out_len = 0; #else - size_t len = 0; + size_t len = 0; size_t out_len = 0; #endif - wchar_t *buf = NULL; + wchar_t *buf = NULL; if (!str || !*str) return NULL; @@ -447,52 +453,44 @@ char* utf16_to_utf8_string_alloc(const wchar_t *str) { #ifdef _WIN32 - int len = 0; - int out_len = 0; + int len = 0; #else - size_t len = 0; - size_t out_len = 0; + size_t len = 0; #endif - char *buf = NULL; + char *buf = NULL; if (!str || !*str) return NULL; #ifdef _WIN32 - len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); - - if (len) { + UINT code_page = CP_UTF8; + len = WideCharToMultiByte(code_page, + 0, str, -1, NULL, 0, NULL, NULL); + + /* fallback to ANSI codepage instead */ + if (!len) + { + code_page = CP_ACP; + len = WideCharToMultiByte(code_page, + 0, str, -1, NULL, 0, NULL, NULL); + } + buf = (char*)calloc(len, sizeof(char)); if (!buf) return NULL; - out_len = WideCharToMultiByte(CP_UTF8, 0, str, -1, buf, len, NULL, NULL); - } - else - { - /* fallback to ANSI codepage instead */ - len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); - - if (len) + if (WideCharToMultiByte(code_page, + 0, str, -1, buf, len, NULL, NULL) < 0) { - buf = (char*)calloc(len, sizeof(char)); - - if (!buf) - return NULL; - - out_len = WideCharToMultiByte(CP_ACP, 0, str, -1, buf, len, NULL, NULL); + free(buf); + return NULL; } } - - if (out_len < 0) - { - free(buf); - return NULL; - } #else - /* NOTE: For now, assume non-Windows platforms' locale is already UTF-8. */ + /* NOTE: For now, assume non-Windows platforms' + * locale is already UTF-8. */ len = wcstombs(NULL, str, 0) + 1; if (len) @@ -502,13 +500,11 @@ if (!buf) return NULL; - out_len = wcstombs(buf, str, len); - } - - if (out_len == (size_t)-1) - { - free(buf); - return NULL; + if (wcstombs(buf, str, len) == (size_t)-1) + { + free(buf); + return NULL; + } } #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/features/features_cpu.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/features/features_cpu.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (features_cpu.c). @@ -39,12 +39,16 @@ #include <windows.h> #endif -#if defined(__CELLOS_LV2__) -#ifndef _PPU_INTRINSICS_H -#include <ppu_intrinsics.h> +#ifdef __PSL1GHT__ +#include <lv2/systime.h> #endif -#elif defined(_XBOX360) + +#if defined(_XBOX360) #include <PPCIntrinsics.h> +#elif !defined(__MACH__) && (defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__) || defined(__PPC64__) || defined(__powerpc64__)) +#ifndef _PPU_INTRINSICS_H +#include <ppu_intrinsics.h> +#endif #elif defined(_POSIX_MONOTONIC_CLOCK) || defined(ANDROID) || defined(__QNX__) || defined(DJGPP) /* POSIX_MONOTONIC_CLOCK is not being defined in Android headers despite support being present. */ #include <time.h> @@ -56,7 +60,13 @@ #if defined(PSP) #include <pspkernel.h> +#endif + +#if defined(PSP) || defined(__PSL1GHT__) #include <sys/time.h> +#endif + +#if defined(PSP) #include <psprtc.h> #endif @@ -66,13 +76,10 @@ #endif #if defined(PS2) -#include <kernel.h> -#include <timer.h> +#include <ps2sdkapi.h> #endif -#if defined(__PSL1GHT__) -#include <sys/time.h> -#elif defined(__CELLOS_LV2__) +#if !defined(__PSL1GHT__) && defined(__PS3__) #include <sys/sys_time.h> #endif @@ -166,7 +173,11 @@ tv_sec = (long)((ularge.QuadPart - epoch) / 10000000L); tv_usec = (long)(system_time.wMilliseconds * 1000); time_ticks = (1000000 * tv_sec + tv_usec); -#elif defined(__linux__) || defined(__QNX__) || defined(__MACH__) +#elif defined(GEKKO) + time_ticks = gettime(); +#elif !defined(__MACH__) && (defined(_XBOX360) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__) || defined(__PSL1GHT__) || defined(__PPC64__) || defined(__powerpc64__)) + time_ticks = __mftb(); +#elif (defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK > 0) || defined(__QNX__) || defined(ANDROID) struct timespec tv = {0}; if (ra_clock_gettime(CLOCK_MONOTONIC, &tv) == 0) time_ticks = (retro_perf_tick_t)tv.tv_sec * 1000000000 + @@ -180,26 +191,20 @@ time_ticks = (retro_perf_tick_t)a | ((retro_perf_tick_t)d << 32); #elif defined(__ARM_ARCH_6__) __asm__ volatile( "mrc p15, 0, %0, c9, c13, 0" : "=r"(time_ticks) ); -#elif defined(__CELLOS_LV2__) || defined(_XBOX360) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__) - time_ticks = __mftb(); -#elif defined(GEKKO) - time_ticks = gettime(); -#elif defined(PSP) - sceRtcGetCurrentTick((uint64_t*)&time_ticks); -#elif defined(VITA) - sceRtcGetCurrentTick((SceRtcTick*)&time_ticks); +#elif defined(__aarch64__) + __asm__ volatile( "mrs %0, cntvct_el0" : "=r"(time_ticks) ); +#elif defined(PSP) || defined(VITA) + time_ticks = sceKernelGetSystemTimeWide(); #elif defined(PS2) - time_ticks = clock()*294912; // 294,912MHZ / 1000 msecs + time_ticks = ps2_clock(); #elif defined(_3DS) time_ticks = svcGetSystemTick(); #elif defined(WIIU) time_ticks = OSGetSystemTime(); -#elif defined(__mips__) - struct timeval tv; - gettimeofday(&tv,NULL); - time_ticks = (1000000 * tv.tv_sec + tv.tv_usec); #elif defined(HAVE_LIBNX) time_ticks = armGetSystemTick(); +#elif defined(EMSCRIPTEN) + time_ticks = emscripten_get_now() * 1000; #endif return time_ticks; @@ -224,8 +229,10 @@ if (!QueryPerformanceCounter(&count)) return 0; - return count.QuadPart * 1000000 / freq.QuadPart; -#elif defined(__CELLOS_LV2__) + return (count.QuadPart / freq.QuadPart * 1000000) + (count.QuadPart % freq.QuadPart * 1000000 / freq.QuadPart); +#elif defined(__PSL1GHT__) + return sysGetSystemTime(); +#elif !defined(__PSL1GHT__) && defined(__PS3__) return sys_time_get_system_time(); #elif defined(GEKKO) return ticks_to_microsecs(gettime()); @@ -233,7 +240,9 @@ return ticks_to_us(OSGetSystemTime()); #elif defined(SWITCH) || defined(HAVE_LIBNX) return (svcGetSystemTick() * 10) / 192; -#elif defined(_POSIX_MONOTONIC_CLOCK) || defined(__QNX__) || defined(ANDROID) || defined(__MACH__) +#elif defined(_3DS) + return osGetTime() * 1000; +#elif defined(_POSIX_MONOTONIC_CLOCK) || defined(__QNX__) || defined(ANDROID) || defined(__MACH__) || defined(DJGPP) struct timespec tv = {0}; if (ra_clock_gettime(CLOCK_MONOTONIC, &tv) < 0) return 0; @@ -241,21 +250,15 @@ #elif defined(EMSCRIPTEN) return emscripten_get_now() * 1000; #elif defined(PS2) - return clock()*1000; -#elif defined(__mips__) || defined(DJGPP) - struct timeval tv; - gettimeofday(&tv,NULL); - return (1000000 * tv.tv_sec + tv.tv_usec); -#elif defined(_3DS) - return osGetTime() * 1000; -#elif defined(VITA) - return sceKernelGetProcessTimeWide(); + return ps2_clock() / PS2_CLOCKS_PER_MSEC * 1000; +#elif defined(VITA) || defined(PSP) + return sceKernelGetSystemTimeWide(); #else #error "Your platform does not have a timer function implemented in cpu_features_get_time_usec(). Cannot continue." #endif } -#if defined(__x86_64__) || defined(__i386__) || defined(__i486__) || defined(__i686__) || (defined(_M_X64) && _MSC_VER > 1310) || (defined(_M_IX86) && _MSC_VER > 1310) +#if defined(__x86_64__) || defined(__i386__) || defined(__i486__) || defined(__i686__) || (defined(_M_X64) && _MSC_VER > 1310) || (defined(_M_IX86) && _MSC_VER > 1310) #define CPU_X86 #endif @@ -288,7 +291,9 @@ #elif defined(_MSC_VER) __cpuid(flags, func); #else +#ifndef NDEBUG printf("Unknown compiler. Cannot check CPUID with inline assembly.\n"); +#endif memset(flags, 0, 4 * sizeof(int)); #endif } @@ -310,13 +315,16 @@ /* Intrinsic only works on 2010 SP1 and above. */ return _xgetbv(idx); #else +#ifndef NDEBUG printf("Unknown compiler. Cannot check xgetbv bits.\n"); +#endif return 0; #endif } #endif #if defined(__ARM_NEON__) +#if defined(__arm__) static void arm_enable_runfast_mode(void) { /* RunFast mode. Enables flush-to-zero and some @@ -334,6 +342,7 @@ ); } #endif +#endif #if defined(__linux__) && !defined(CPU_X86) static unsigned char check_arm_cpu_feature(const char* feature) @@ -347,12 +356,12 @@ if (!fp) return 0; - while (filestream_gets(fp, line, sizeof(line)) != NULL) + while (filestream_gets(fp, line, sizeof(line))) { if (strncmp(line, "Features\t: ", 11)) continue; - if (strstr(line + 11, feature) != NULL) + if (strstr(line + 11, feature)) status = 1; break; @@ -423,8 +432,7 @@ q = end; /* Get first value */ - p = parse_decimal(p, q, &start_value); - if (p == NULL) + if (!(p = parse_decimal(p, q, &start_value))) return; end_value = start_value; @@ -434,8 +442,7 @@ */ if (p < q && *p == '-') { - p = parse_decimal(p+1, q, &end_value); - if (p == NULL) + if (!(p = parse_decimal(p+1, q, &end_value))) return; } @@ -443,7 +450,7 @@ for (val = start_value; val <= end_value; val++) { if ((unsigned)val < 32) - list->mask |= (uint32_t)(1U << val); + list->mask |= (uint32_t)(UINT32_C(1) << val); } /* Jump to next item */ @@ -495,6 +502,8 @@ return 1; #elif defined(PSP) || defined(PS2) return 1; +#elif defined(__PSL1GHT__) || !defined(__PSL1GHT__) && defined(__PS3__) + return 1; /* Only one PPU, SPUs don't really count */ #elif defined(VITA) return 4; #elif defined(HAVE_LIBNX) || defined(SWITCH) @@ -586,41 +595,25 @@ **/ uint64_t cpu_features_get(void) { - int flags[4]; - int vendor_shuffle[3]; - char vendor[13]; - size_t len = 0; - uint64_t cpu_flags = 0; uint64_t cpu = 0; - unsigned max_flag = 0; #if defined(CPU_X86) && !defined(__MACH__) int vendor_is_intel = 0; const int avx_flags = (1 << 27) | (1 << 28); #endif - - char buf[sizeof(" MMX MMXEXT SSE SSE2 SSE3 SSSE3 SS4 SSE4.2 AES AVX AVX2 NEON VMX VMX128 VFPU PS")]; - - memset(buf, 0, sizeof(buf)); - - (void)len; - (void)cpu_flags; - (void)flags; - (void)max_flag; - (void)vendor; - (void)vendor_shuffle; - #if defined(__MACH__) - len = sizeof(size_t); - if (sysctlbyname("hw.optional.mmx", NULL, &len, NULL, 0) == 0) + size_t len = sizeof(size_t); + + if (sysctlbyname("hw.optional.floatingpoint", NULL, &len, NULL, 0) == 0) { - cpu |= RETRO_SIMD_MMX; - cpu |= RETRO_SIMD_MMXEXT; + cpu |= RETRO_SIMD_CMOV; } +#if defined(CPU_X86) len = sizeof(size_t); - if (sysctlbyname("hw.optional.floatingpoint", NULL, &len, NULL, 0) == 0) + if (sysctlbyname("hw.optional.mmx", NULL, &len, NULL, 0) == 0) { - cpu |= RETRO_SIMD_CMOV; + cpu |= RETRO_SIMD_MMX; + cpu |= RETRO_SIMD_MMXEXT; } len = sizeof(size_t); @@ -663,17 +656,29 @@ if (sysctlbyname("hw.optional.altivec", NULL, &len, NULL, 0) == 0) cpu |= RETRO_SIMD_VMX; +#else len = sizeof(size_t); if (sysctlbyname("hw.optional.neon", NULL, &len, NULL, 0) == 0) cpu |= RETRO_SIMD_NEON; + len = sizeof(size_t); + if (sysctlbyname("hw.optional.neon_fp16", NULL, &len, NULL, 0) == 0) + cpu |= RETRO_SIMD_VFPV3; + + len = sizeof(size_t); + if (sysctlbyname("hw.optional.neon_hpfp", NULL, &len, NULL, 0) == 0) + cpu |= RETRO_SIMD_VFPV4; +#endif #elif defined(_XBOX1) cpu |= RETRO_SIMD_MMX; cpu |= RETRO_SIMD_SSE; cpu |= RETRO_SIMD_MMXEXT; #elif defined(CPU_X86) - (void)avx_flags; - + unsigned max_flag = 0; + int flags[4]; + int vendor_shuffle[3]; + char vendor[13]; + uint64_t cpu_flags = 0; x86_cpuid(0, flags); vendor_shuffle[0] = flags[1]; vendor_shuffle[1] = flags[3]; @@ -759,7 +764,7 @@ if (check_arm_cpu_feature("neon")) { cpu |= RETRO_SIMD_NEON; -#ifdef __ARM_NEON__ +#if defined(__ARM_NEON__) && defined(__arm__) arm_enable_runfast_mode(); #endif } @@ -775,8 +780,10 @@ cpu |= RETRO_SIMD_ASIMD; #ifdef __ARM_NEON__ cpu |= RETRO_SIMD_NEON; +#if defined(__arm__) arm_enable_runfast_mode(); #endif +#endif } #if 0 @@ -794,7 +801,9 @@ #elif defined(__ARM_NEON__) cpu |= RETRO_SIMD_NEON; +#if defined(__arm__) arm_enable_runfast_mode(); +#endif #elif defined(__ALTIVEC__) cpu |= RETRO_SIMD_VMX; #elif defined(XBOX360) @@ -805,25 +814,64 @@ cpu |= RETRO_SIMD_PS; #endif - if (cpu & RETRO_SIMD_MMX) strlcat(buf, " MMX", sizeof(buf)); - if (cpu & RETRO_SIMD_MMXEXT) strlcat(buf, " MMXEXT", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE) strlcat(buf, " SSE", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE2) strlcat(buf, " SSE2", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE3) strlcat(buf, " SSE3", sizeof(buf)); - if (cpu & RETRO_SIMD_SSSE3) strlcat(buf, " SSSE3", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE4) strlcat(buf, " SSE4", sizeof(buf)); - if (cpu & RETRO_SIMD_SSE42) strlcat(buf, " SSE4.2", sizeof(buf)); - if (cpu & RETRO_SIMD_AES) strlcat(buf, " AES", sizeof(buf)); - if (cpu & RETRO_SIMD_AVX) strlcat(buf, " AVX", sizeof(buf)); - if (cpu & RETRO_SIMD_AVX2) strlcat(buf, " AVX2", sizeof(buf)); - if (cpu & RETRO_SIMD_NEON) strlcat(buf, " NEON", sizeof(buf)); - if (cpu & RETRO_SIMD_VFPV3) strlcat(buf, " VFPv3", sizeof(buf)); - if (cpu & RETRO_SIMD_VFPV4) strlcat(buf, " VFPv4", sizeof(buf)); - if (cpu & RETRO_SIMD_VMX) strlcat(buf, " VMX", sizeof(buf)); - if (cpu & RETRO_SIMD_VMX128) strlcat(buf, " VMX128", sizeof(buf)); - if (cpu & RETRO_SIMD_VFPU) strlcat(buf, " VFPU", sizeof(buf)); - if (cpu & RETRO_SIMD_PS) strlcat(buf, " PS", sizeof(buf)); - if (cpu & RETRO_SIMD_ASIMD) strlcat(buf, " ASIMD", sizeof(buf)); - return cpu; } + +void cpu_features_get_model_name(char *name, int len) +{ +#if defined(CPU_X86) && !defined(__MACH__) + union { + int i[4]; + unsigned char s[16]; + } flags; + int i, j; + size_t pos = 0; + bool start = false; + + if (!name) + return; + + x86_cpuid(0x80000000, flags.i); + + if (flags.i[0] < 0x80000004) + return; + + for (i = 0; i < 3; i++) + { + memset(flags.i, 0, sizeof(flags.i)); + x86_cpuid(0x80000002 + i, flags.i); + + for (j = 0; j < sizeof(flags.s); j++) + { + if (!start && flags.s[j] == ' ') + continue; + else + start = true; + + if (pos == len - 1) + { + /* truncate if we ran out of room */ + name[pos] = '\0'; + goto end; + } + + name[pos++] = flags.s[j]; + } + } +end: + /* terminate our string */ + if (pos < (size_t)len) + name[pos] = '\0'; +#elif defined(__MACH__) + if (!name) + return; + { + size_t len_size = len; + sysctlbyname("machdep.cpu.brand_string", name, &len_size, NULL, 0); + } +#else + if (!name) + return; + return; +#endif +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/archive_file.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/archive_file.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (archive_file.c). @@ -24,19 +24,6 @@ #include <stdlib.h> #include <string.h> -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef HAVE_MMAP -#include <fcntl.h> -#include <errno.h> -#include <unistd.h> - -#include <sys/mman.h> -#include <sys/stat.h> -#endif - #include <compat/strl.h> #include <file/archive_file.h> #include <file/file_path.h> @@ -45,110 +32,12 @@ #include <lists/string_list.h> #include <string/stdstring.h> -struct file_archive_file_data -{ #ifdef HAVE_MMAP - int fd; -#endif - void *data; - size_t size; -}; - -static size_t file_archive_size(file_archive_file_data_t *data) -{ - if (!data) - return 0; - return data->size; -} - -static const uint8_t *file_archive_data(file_archive_file_data_t *data) -{ - if (!data) - return NULL; - return (const uint8_t*)data->data; -} - -#ifdef HAVE_MMAP -/* Closes, unmaps and frees. */ -static void file_archive_free(file_archive_file_data_t *data) -{ - if (!data) - return; - - if (data->data) - munmap(data->data, data->size); - if (data->fd >= 0) - close(data->fd); - free(data); -} - -static file_archive_file_data_t* file_archive_open(const char *path) -{ - file_archive_file_data_t *data = (file_archive_file_data_t*)calloc(1, sizeof(*data)); - - if (!data) - return NULL; - - data->fd = open(path, O_RDONLY); - - /* Failed to open archive. */ - if (data->fd < 0) - goto error; - - data->size = path_get_size(path); - if (!data->size) - return data; - - data->data = mmap(NULL, data->size, PROT_READ, MAP_SHARED, data->fd, 0); - if (data->data == MAP_FAILED) - { - data->data = NULL; - - /* Failed to mmap() file */ - goto error; - } - - return data; - -error: - file_archive_free(data); - return NULL; -} -#else - -/* Closes, unmaps and frees. */ -static void file_archive_free(file_archive_file_data_t *data) -{ - if (!data) - return; - if(data->data) - free(data->data); - free(data); -} - -static file_archive_file_data_t* file_archive_open(const char *path) -{ - int64_t ret = -1; - bool read_from_file = false; - file_archive_file_data_t *data = (file_archive_file_data_t*) - calloc(1, sizeof(*data)); - - if (!data) - return NULL; - - read_from_file = filestream_read_file(path, &data->data, &ret); - - /* Failed to open archive? */ - if (!read_from_file || ret < 0) - goto error; - - data->size = ret; - return data; - -error: - file_archive_free(data); - return NULL; -} +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/stat.h> #endif static int file_archive_get_file_list_cb( @@ -162,55 +51,44 @@ struct archive_extract_userdata *userdata) { union string_list_elem_attr attr; - int ret = 0; - struct string_list *ext_list = NULL; - size_t path_len = strlen(path); - - (void)cdata; - (void)cmode; - (void)csize; - (void)size; - (void)checksum; - attr.i = 0; - if (!path_len) - return 0; - if (valid_exts) - ext_list = string_split(valid_exts, "|"); - - if (ext_list) { - const char *file_ext = NULL; + size_t path_len = strlen(path); /* Checks if this entry is a directory or a file. */ - char last_char = path[path_len-1]; + char last_char = path[path_len - 1]; + struct string_list ext_list = {0}; /* Skip if directory. */ if (last_char == '/' || last_char == '\\' ) - goto error; + return 0; + + string_list_initialize(&ext_list); + if (string_split_noalloc(&ext_list, valid_exts, "|")) + { + const char *file_ext = path_get_extension(path); - file_ext = path_get_extension(path); + if (!file_ext) + { + string_list_deinitialize(&ext_list); + return 0; + } - if (!file_ext) - goto error; + if (!string_list_find_elem_prefix(&ext_list, ".", file_ext)) + { + /* keep iterating */ + string_list_deinitialize(&ext_list); + return -1; + } - if (!string_list_find_elem_prefix(ext_list, ".", file_ext)) - { - /* keep iterating */ - ret = -1; - goto error; + attr.i = RARCH_COMPRESSED_FILE_IN_ARCHIVE; } - attr.i = RARCH_COMPRESSED_FILE_IN_ARCHIVE; - string_list_free(ext_list); + string_list_deinitialize(&ext_list); } return string_list_append(userdata->list, path, attr); - -error: - string_list_free(ext_list); - return ret; } static int file_archive_extract_cb(const char *name, const char *valid_exts, @@ -224,11 +102,17 @@ if (ext && string_list_find_elem(userdata->ext, ext)) { char new_path[PATH_MAX_LENGTH]; - char wanted_file[PATH_MAX_LENGTH]; - const char *delim = NULL; + const char *delim; - new_path[0] = wanted_file[0] = '\0'; + delim = path_get_archive_delim(userdata->archive_path); + if (delim) + { + if (!string_is_equal_noncase(userdata->current_file_path, delim + 1)) + return 1; /* keep searching for the right file */ + } + + new_path[0] = '\0'; if (userdata->extraction_directory) fill_pathname_join(new_path, userdata->extraction_directory, path_basename(name), sizeof(new_path)); @@ -236,25 +120,14 @@ fill_pathname_resolve_relative(new_path, userdata->archive_path, path_basename(name), sizeof(new_path)); - userdata->first_extracted_file_path = strdup(new_path); - - delim = path_get_archive_delim(userdata->archive_path); - - if (delim) - { - strlcpy(wanted_file, delim + 1, sizeof(wanted_file)); - - if (!string_is_equal_noncase(userdata->extracted_file_path, - wanted_file)) - return 1; /* keep searching for the right file */ - } - else - strlcpy(wanted_file, userdata->archive_path, sizeof(wanted_file)); if (file_archive_perform_mode(new_path, valid_exts, cdata, cmode, csize, size, - 0, userdata)) + checksum, userdata)) + { userdata->found_file = true; + userdata->first_extracted_file_path = strdup(new_path); + } return 0; } @@ -281,14 +154,37 @@ if (!state->backend) return -1; - state->handle = file_archive_open(path); - if (!state->handle) + state->archive_file = filestream_open(path, + RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + /* Failed to open archive. */ + if (!state->archive_file) return -1; - state->archive_size = (int32_t)file_archive_size(state->handle); - state->data = file_archive_data(state->handle); - state->footer = 0; - state->directory = 0; + state->archive_size = filestream_get_size(state->archive_file); + +#ifdef HAVE_MMAP + if (state->archive_size <= (256*1024*1024)) + { + state->archive_mmap_fd = open(path, O_RDONLY); + if (state->archive_mmap_fd) + { + state->archive_mmap_data = (uint8_t*)mmap(NULL, (size_t)state->archive_size, + PROT_READ, MAP_SHARED, state->archive_mmap_fd, 0); + + if (state->archive_mmap_data == (uint8_t*)MAP_FAILED) + { + close(state->archive_mmap_fd); + state->archive_mmap_fd = 0; + state->archive_mmap_data = NULL; + } + } + } +#endif + + state->step_current = 0; + state->step_total = 0; return state->backend->archive_parse_file_init(state, path); } @@ -296,35 +192,25 @@ /** * file_archive_decompress_data_to_file: * @path : filename path of archive. - * @valid_exts : Valid extensions of archive to be parsed. - * If NULL, allow all. - * @cdata : input data. - * @csize : size of input data. * @size : output file size * @checksum : CRC32 checksum from input data. * - * Decompress data to file. + * Write data to file. * * Returns: true (1) on success, otherwise false (0). **/ static int file_archive_decompress_data_to_file( + file_archive_transfer_t *transfer, file_archive_file_handle_t *handle, - int ret, const char *path, - const char *valid_exts, - const uint8_t *cdata, - uint32_t csize, uint32_t size, uint32_t checksum) { - if (!handle || ret == -1) - { - ret = 0; - goto end; - } + if (!handle) + return 0; #if 0 - handle->real_checksum = handle->backend->stream_crc_calculate( + handle->real_checksum = transfer->backend->stream_crc_calculate( 0, handle->data, size); if (handle->real_checksum != checksum) { @@ -335,40 +221,14 @@ #endif if (!filestream_write_file(path, handle->data, size)) - { - ret = false; - goto end; - } - -end: - - if (handle) - { - if (handle->backend) - { - if (handle->backend->stream_free) - { -#ifdef HAVE_7ZIP - if (handle->backend != &sevenzip_backend) - { - handle->backend->stream_free(handle->stream); - - if (handle->data) - free(handle->data); - } -#else - handle->backend->stream_free(handle->stream); -#endif - } - } - } + return 0; - return ret; + return 1; } void file_archive_parse_file_iterate_stop(file_archive_transfer_t *state) { - if (!state || !state->handle) + if (!state || !state->archive_file) return; state->type = ARCHIVE_TRANSFER_DEINIT; @@ -395,7 +255,7 @@ { if (userdata) { - userdata->context = state->stream; + userdata->transfer = state; strlcpy(userdata->archive_path, file, sizeof(userdata->archive_path)); } @@ -405,18 +265,15 @@ state->type = ARCHIVE_TRANSFER_DEINIT_ERROR; break; case ARCHIVE_TRANSFER_ITERATE: - if (file_archive_get_file_backend(file)) + if (state->backend) { - const struct file_archive_file_backend *backend = - file_archive_get_file_backend(file); - int ret = - backend->archive_parse_file_iterate_step(state, - valid_exts, userdata, file_cb); + int ret = state->backend->archive_parse_file_iterate_step( + state->context, valid_exts, userdata, file_cb); + if (ret == 1) + state->step_current++; /* found another file */ if (ret != 1) - { state->type = ARCHIVE_TRANSFER_DEINIT; - } if (ret == -1) state->type = ARCHIVE_TRANSFER_DEINIT_ERROR; @@ -427,25 +284,31 @@ case ARCHIVE_TRANSFER_DEINIT_ERROR: *returnerr = false; case ARCHIVE_TRANSFER_DEINIT: - if (state->handle) + if (state->context) { - file_archive_free(state->handle); - state->handle = NULL; + if (state->backend->archive_parse_file_free) + state->backend->archive_parse_file_free(state->context); + state->context = NULL; } - if (state->stream && state->backend) + if (state->archive_file) { - if (state->backend->stream_free) - state->backend->stream_free(state->stream); - - if (state->stream) - free(state->stream); - - state->stream = NULL; + filestream_close(state->archive_file); + state->archive_file = NULL; + } - if (userdata) - userdata->context = NULL; +#ifdef HAVE_MMAP + if (state->archive_mmap_data) + { + munmap(state->archive_mmap_data, (size_t)state->archive_size); + close(state->archive_mmap_fd); + state->archive_mmap_fd = 0; + state->archive_mmap_data = NULL; } +#endif + + if (userdata) + userdata->transfer = NULL; break; } @@ -473,16 +336,19 @@ file_archive_file_cb file_cb, struct archive_extract_userdata *userdata) { file_archive_transfer_t state; - bool returnerr = true; + bool returnerr = true; - state.type = ARCHIVE_TRANSFER_INIT; - state.archive_size = 0; - state.handle = NULL; - state.stream = NULL; - state.footer = NULL; - state.directory = NULL; - state.data = NULL; - state.backend = NULL; + state.type = ARCHIVE_TRANSFER_INIT; + state.archive_file = NULL; +#ifdef HAVE_MMAP + state.archive_mmap_fd = 0; + state.archive_mmap_data = NULL; +#endif + state.archive_size = 0; + state.context = NULL; + state.step_total = 0; + state.step_current = 0; + state.backend = NULL; for (;;) { @@ -496,17 +362,10 @@ int file_archive_parse_file_progress(file_archive_transfer_t *state) { - ptrdiff_t delta = 0; - - if (!state || state->archive_size == 0) + if (!state || state->step_total == 0) return 0; - delta = state->directory - state->data; - - if (!state->start_delta) - state->start_delta = delta; - - return (int)(((delta - state->start_delta) * 100) / (state->archive_size - state->start_delta)); + return (int)((state->step_current * 100) / (state->step_total)); } /** @@ -534,24 +393,18 @@ struct string_list *list = string_split(valid_exts, "|"); userdata.archive_path[0] = '\0'; + userdata.current_file_path[0] = '\0'; userdata.first_extracted_file_path = NULL; - userdata.extracted_file_path = NULL; userdata.extraction_directory = extraction_directory; userdata.archive_path_size = archive_path_size; userdata.ext = list; userdata.list = NULL; userdata.found_file = false; userdata.list_only = false; - userdata.context = NULL; - userdata.archive_name[0] = '\0'; userdata.crc = 0; + userdata.transfer = NULL; userdata.dec = NULL; - userdata.decomp_state.opt_file = NULL; - userdata.decomp_state.needle = NULL; - userdata.decomp_state.size = 0; - userdata.decomp_state.found = false; - if (!list) { ret = false; @@ -585,6 +438,37 @@ return ret; } +/* Warning: 'list' must zero initialised before + * calling this function, otherwise memory leaks/ + * undefined behaviour will occur */ +bool file_archive_get_file_list_noalloc(struct string_list *list, + const char *path, + const char *valid_exts) +{ + struct archive_extract_userdata userdata; + + if (!list || !string_list_initialize(list)) + return false; + + strlcpy(userdata.archive_path, path, sizeof(userdata.archive_path)); + userdata.current_file_path[0] = '\0'; + userdata.first_extracted_file_path = NULL; + userdata.extraction_directory = NULL; + userdata.archive_path_size = 0; + userdata.ext = NULL; + userdata.list = list; + userdata.found_file = false; + userdata.list_only = true; + userdata.crc = 0; + userdata.transfer = NULL; + userdata.dec = NULL; + + if (!file_archive_walk(path, valid_exts, + file_archive_get_file_list_cb, &userdata)) + return false; + return true; +} + /** * file_archive_get_file_list: * @path : filename path of archive @@ -594,96 +478,61 @@ struct string_list *file_archive_get_file_list(const char *path, const char *valid_exts) { - int ret; struct archive_extract_userdata userdata; strlcpy(userdata.archive_path, path, sizeof(userdata.archive_path)); + userdata.current_file_path[0] = '\0'; userdata.first_extracted_file_path = NULL; - userdata.extracted_file_path = NULL; userdata.extraction_directory = NULL; userdata.archive_path_size = 0; userdata.ext = NULL; userdata.list = string_list_new(); userdata.found_file = false; userdata.list_only = true; - userdata.context = NULL; - userdata.archive_name[0] = '\0'; userdata.crc = 0; + userdata.transfer = NULL; userdata.dec = NULL; - userdata.decomp_state.opt_file = NULL; - userdata.decomp_state.needle = NULL; - userdata.decomp_state.size = 0; - userdata.decomp_state.found = false; - if (!userdata.list) - goto error; - - ret = file_archive_walk(path, valid_exts, - file_archive_get_file_list_cb, &userdata); - - if (ret <= 0) + return NULL; + if (!file_archive_walk(path, valid_exts, + file_archive_get_file_list_cb, &userdata)) { - if (ret != -1) - goto error; + string_list_free(userdata.list); + return NULL; } - return userdata.list; - -error: - if (userdata.list) - string_list_free(userdata.list); - return NULL; } bool file_archive_perform_mode(const char *path, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32, struct archive_extract_userdata *userdata) { - switch (cmode) - { - case ARCHIVE_MODE_UNCOMPRESSED: - if (!filestream_write_file(path, cdata, size)) - goto error; - break; + file_archive_file_handle_t handle; + int ret; - case ARCHIVE_MODE_COMPRESSED: - { - int ret = 0; - file_archive_file_handle_t handle; + if (!userdata->transfer || !userdata->transfer->backend) + return false; - handle.stream = userdata->context; - handle.data = NULL; - handle.real_checksum = 0; - handle.backend = file_archive_get_file_backend(userdata->archive_path); + handle.data = NULL; + handle.real_checksum = 0; - if (!handle.backend) - goto error; + if (!userdata->transfer->backend->stream_decompress_data_to_file_init( + userdata->transfer->context, &handle, cdata, cmode, csize, size)) + return false; - if (!handle.backend->stream_decompress_data_to_file_init(&handle, - cdata, csize, size)) - goto error; + do + { + ret = userdata->transfer->backend->stream_decompress_data_to_file_iterate( + userdata->transfer->context, &handle); + }while (ret == 0); - do - { - ret = handle.backend->stream_decompress_data_to_file_iterate( - handle.stream); - }while(ret == 0); - - if (!file_archive_decompress_data_to_file(&handle, - ret, path, valid_exts, - cdata, csize, size, crc32)) - goto error; - } - break; - default: - goto error; - } + if (ret == -1 || !file_archive_decompress_data_to_file( + userdata->transfer, &handle, path, + size, crc32)) + return false; return true; - -error: - return false; } /** @@ -736,9 +585,9 @@ const char * path, void **buf, const char* optional_filename, int64_t *length) { - const struct file_archive_file_backend *backend = NULL; - int ret = 0; - struct string_list *str_list = file_archive_filename_split(path); + const struct + file_archive_file_backend *backend = NULL; + struct string_list *str_list = NULL; /* Safety check. * If optional_filename and optional_filename @@ -746,13 +595,13 @@ * hoping that optional_filename is the * same as requested. */ - if (optional_filename && filestream_exists(optional_filename)) + if (optional_filename && path_is_valid(optional_filename)) { *length = 0; - string_list_free(str_list); return 1; } + str_list = file_archive_filename_split(path); /* We assure that there is something after the '#' symbol. * * This error condition happens for example, when @@ -760,23 +609,22 @@ * path = /path/to/file.7z# */ if (str_list->size <= 1) - goto error; + { + /* could not extract string and substring. */ + string_list_free(str_list); + *length = 0; + return 0; + } backend = file_archive_get_file_backend(str_list->elems[0].data); - *length = backend->compressed_file_read(str_list->elems[0].data, str_list->elems[1].data, buf, optional_filename); - if (*length != -1) - ret = 1; - string_list_free(str_list); - return ret; -error: - /* could not extract string and substring. */ - string_list_free(str_list); - *length = 0; + if (*length != -1) + return 1; + return 0; } @@ -800,6 +648,7 @@ const struct file_archive_file_backend* file_archive_get_file_backend(const char *path) { +#if defined(HAVE_7ZIP) || defined(HAVE_ZLIB) char newpath[PATH_MAX_LENGTH]; const char *file_ext = NULL; char *last = NULL; @@ -826,6 +675,7 @@ ) return &zlib_backend; #endif +#endif return NULL; } @@ -841,16 +691,10 @@ uint32_t file_archive_get_file_crc32(const char *path) { file_archive_transfer_t state; - const struct file_archive_file_backend *backend = file_archive_get_file_backend(path); - struct archive_extract_userdata userdata = {{0}}; + struct archive_extract_userdata userdata = {0}; bool returnerr = false; - bool contains_compressed = false; const char *archive_path = NULL; - - if (!backend) - return 0; - - contains_compressed = path_contains_compressed_file(path); + bool contains_compressed = path_contains_compressed_file(path); if (contains_compressed) { @@ -861,14 +705,17 @@ archive_path += 1; } - state.type = ARCHIVE_TRANSFER_INIT; - state.archive_size = 0; - state.handle = NULL; - state.stream = NULL; - state.footer = NULL; - state.directory = NULL; - state.data = NULL; - state.backend = NULL; + state.type = ARCHIVE_TRANSFER_INIT; + state.archive_file = NULL; +#ifdef HAVE_MMAP + state.archive_mmap_fd = 0; + state.archive_mmap_data = NULL; +#endif + state.archive_size = 0; + state.context = NULL; + state.step_total = 0; + state.step_current = 0; + state.backend = NULL; /* Initialize and open archive first. Sets next state type to ITERATE. */ @@ -893,7 +740,7 @@ /* Stop when the right file in the archive is found. */ if (archive_path) { - if (string_is_equal(userdata.extracted_file_path, archive_path)) + if (string_is_equal(userdata.current_file_path, archive_path)) break; } else @@ -902,8 +749,5 @@ file_archive_parse_file_iterate_stop(&state); - if (userdata.crc) - return userdata.crc; - - return 0; + return userdata.crc; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/archive_file_7z.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/archive_file_7z.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (archive_file_sevenzip.c). @@ -38,6 +38,7 @@ #define SEVENZIP_MAGIC "7z\xBC\xAF\x27\x1C" #define SEVENZIP_MAGIC_LEN 6 +#define SEVENZIP_LOOKTOREAD_BUF_SIZE (1 << 14) /* Assume W-functions do not work below Win2K and Xbox platforms */ #if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) @@ -46,28 +47,29 @@ #endif #endif -struct sevenzip_context_t { +struct sevenzip_context_t +{ + uint8_t *output; CFileInStream archiveStream; - CLookToRead lookStream; + CLookToRead2 lookStream; ISzAlloc allocImp; ISzAlloc allocTempImp; CSzArEx db; size_t temp_size; - uint32_t block_index; - uint32_t index; + uint32_t parse_index; + uint32_t decompress_index; uint32_t packIndex; - uint8_t *output; - file_archive_file_handle_t *handle; + UInt32 block_index; }; -static void *sevenzip_stream_alloc_impl(void *p, size_t size) +static void *sevenzip_stream_alloc_impl(ISzAllocPtr p, size_t size) { if (size == 0) return 0; return malloc(size); } -static void sevenzip_stream_free_impl(void *p, void *address) +static void sevenzip_stream_free_impl(ISzAllocPtr p, void *address) { (void)p; @@ -75,7 +77,7 @@ free(address); } -static void *sevenzip_stream_alloc_tmp_impl(void *p, size_t size) +static void *sevenzip_stream_alloc_tmp_impl(ISzAllocPtr p, size_t size) { (void)p; if (size == 0) @@ -96,14 +98,19 @@ sevenzip_context->allocTempImp.Free = sevenzip_stream_free_impl; sevenzip_context->block_index = 0xFFFFFFFF; sevenzip_context->output = NULL; - sevenzip_context->handle = NULL; + + sevenzip_context->lookStream.bufSize = SEVENZIP_LOOKTOREAD_BUF_SIZE * sizeof(Byte); + sevenzip_context->lookStream.buf = (Byte*)malloc(sevenzip_context->lookStream.bufSize); + + if (!sevenzip_context->lookStream.buf) + sevenzip_context->lookStream.bufSize = 0; return sevenzip_context; } -static void sevenzip_stream_free(void *data) +static void sevenzip_parse_file_free(void *context) { - struct sevenzip_context_t *sevenzip_context = (struct sevenzip_context_t*)data; + struct sevenzip_context_t *sevenzip_context = (struct sevenzip_context_t*)context; if (!sevenzip_context) return; @@ -112,11 +119,15 @@ { IAlloc_Free(&sevenzip_context->allocImp, sevenzip_context->output); sevenzip_context->output = NULL; - sevenzip_context->handle->data = NULL; } SzArEx_Free(&sevenzip_context->db, &sevenzip_context->allocImp); File_Close(&sevenzip_context->archiveStream.file); + + if (sevenzip_context->lookStream.buf) + free(sevenzip_context->lookStream.buf); + + free(sevenzip_context); } /* Extract the relative path (needle) from a 7z archive @@ -124,18 +135,18 @@ * If optional_outfile is set, extract to that instead * and don't allocate buffer. */ -static int sevenzip_file_read( +static int64_t sevenzip_file_read( const char *path, const char *needle, void **buf, const char *optional_outfile) { CFileInStream archiveStream; - CLookToRead lookStream; + CLookToRead2 lookStream; ISzAlloc allocImp; ISzAlloc allocTempImp; CSzArEx db; uint8_t *output = 0; - long outsize = -1; + int64_t outsize = -1; /*These are the allocation routines. * Currently using the non-standard 7zip choices. */ @@ -144,6 +155,12 @@ allocTempImp.Alloc = sevenzip_stream_alloc_tmp_impl; allocTempImp.Free = sevenzip_stream_free_impl; + lookStream.bufSize = SEVENZIP_LOOKTOREAD_BUF_SIZE * sizeof(Byte); + lookStream.buf = (Byte*)malloc(lookStream.bufSize); + + if (!lookStream.buf) + lookStream.bufSize = 0; + #if defined(_WIN32) && defined(USE_WINDOWS_FILE) && !defined(LEGACY_WIN32) if (!string_is_empty(path)) { @@ -168,51 +185,34 @@ #endif FileInStream_CreateVTable(&archiveStream); - LookToRead_CreateVTable(&lookStream, false); - lookStream.realStream = &archiveStream.s; - LookToRead_Init(&lookStream); + LookToRead2_CreateVTable(&lookStream, false); + lookStream.realStream = &archiveStream.vt; + LookToRead2_Init(&lookStream); CrcGenerateTable(); - db.db.PackSizes = NULL; - db.db.PackCRCsDefined = NULL; - db.db.PackCRCs = NULL; - db.db.Folders = NULL; - db.db.Files = NULL; - db.db.NumPackStreams = 0; - db.db.NumFolders = 0; - db.db.NumFiles = 0; - db.startPosAfterHeader = 0; - db.dataPos = 0; - db.FolderStartPackStreamIndex = NULL; - db.PackStreamStartPositions = NULL; - db.FolderStartFileIndex = NULL; - db.FileIndexToFolderIndexMap = NULL; - db.FileNameOffsets = NULL; - db.FileNames.data = NULL; - db.FileNames.size = 0; + memset(&db, 0, sizeof(db)); SzArEx_Init(&db); - if (SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp) == SZ_OK) + if (SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp) == SZ_OK) { uint32_t i; bool file_found = false; uint16_t *temp = NULL; size_t temp_size = 0; - uint32_t block_index = 0xFFFFFFFF; + UInt32 block_index = 0xFFFFFFFF; SRes res = SZ_OK; - for (i = 0; i < db.db.NumFiles; i++) + for (i = 0; i < db.NumFiles; i++) { size_t len; char infile[PATH_MAX_LENGTH]; size_t offset = 0; size_t outSizeProcessed = 0; - const CSzFileItem *f = db.db.Files + i; /* We skip over everything which is not a directory. - * FIXME: Why continue then if f->IsDir is true?*/ - if (f->IsDir) + * FIXME: Why continue then if IsDir is true?*/ + if (SzArEx_IsDir(&db, i)) continue; len = SzArEx_GetFileNameUtf16(&db, i, NULL); @@ -247,16 +247,16 @@ * sourceforge.net/p/sevenzip/discussion/45798/thread/6fb59aaf/ * */ file_found = true; - res = SzArEx_Extract(&db, &lookStream.s, i, &block_index, + res = SzArEx_Extract(&db, &lookStream.vt, i, &block_index, &output, &output_size, &offset, &outSizeProcessed, &allocImp, &allocTempImp); if (res != SZ_OK) break; /* This goes to the error section. */ - outsize = outSizeProcessed; + outsize = (int64_t)outSizeProcessed; - if (optional_outfile != NULL) + if (optional_outfile) { const void *ptr = (const void*)(output + offset); @@ -274,7 +274,7 @@ * We would however need to realloc anyways, because RetroArch * expects a \0 at the end, therefore we allocate new, * copy and free the old one. */ - *buf = malloc(outsize + 1); + *buf = malloc((size_t)(outsize + 1)); ((char*)(*buf))[outsize] = '\0'; memcpy(*buf,output + offset,outsize); } @@ -300,28 +300,32 @@ SzArEx_Free(&db, &allocImp); File_Close(&archiveStream.file); - return (int)outsize; + if (lookStream.buf) + free(lookStream.buf); + + return outsize; } static bool sevenzip_stream_decompress_data_to_file_init( - file_archive_file_handle_t *handle, - const uint8_t *cdata, uint32_t csize, uint32_t size) + void *context, file_archive_file_handle_t *handle, + const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size) { struct sevenzip_context_t *sevenzip_context = - (struct sevenzip_context_t*)handle->stream; + (struct sevenzip_context_t*)context; if (!sevenzip_context) return false; - sevenzip_context->handle = handle; + sevenzip_context->decompress_index = (uint32_t)(size_t)cdata; return true; } -static int sevenzip_stream_decompress_data_to_file_iterate(void *data) +static int sevenzip_stream_decompress_data_to_file_iterate( + void *context, file_archive_file_handle_t *handle) { struct sevenzip_context_t *sevenzip_context = - (struct sevenzip_context_t*)data; + (struct sevenzip_context_t*)context; SRes res = SZ_ERROR_FAIL; size_t output_size = 0; @@ -329,7 +333,7 @@ size_t outSizeProcessed = 0; res = SzArEx_Extract(&sevenzip_context->db, - &sevenzip_context->lookStream.s, sevenzip_context->index, + &sevenzip_context->lookStream.vt, sevenzip_context->decompress_index, &sevenzip_context->block_index, &sevenzip_context->output, &output_size, &offset, &outSizeProcessed, &sevenzip_context->allocImp, &sevenzip_context->allocTempImp); @@ -337,8 +341,8 @@ if (res != SZ_OK) return 0; - if (sevenzip_context->handle) - sevenzip_context->handle->data = sevenzip_context->output + offset; + if (handle) + handle->data = sevenzip_context->output + offset; return 1; } @@ -346,16 +350,21 @@ static int sevenzip_parse_file_init(file_archive_transfer_t *state, const char *file) { - struct sevenzip_context_t *sevenzip_context = - (struct sevenzip_context_t*)sevenzip_stream_new(); + uint8_t magic_buf[SEVENZIP_MAGIC_LEN]; + struct sevenzip_context_t *sevenzip_context = NULL; if (state->archive_size < SEVENZIP_MAGIC_LEN) goto error; - if (string_is_not_equal_fast(state->data, SEVENZIP_MAGIC, SEVENZIP_MAGIC_LEN)) + filestream_seek(state->archive_file, 0, SEEK_SET); + if (filestream_read(state->archive_file, magic_buf, SEVENZIP_MAGIC_LEN) != SEVENZIP_MAGIC_LEN) goto error; - state->stream = sevenzip_context; + if (string_is_not_equal_fast(magic_buf, SEVENZIP_MAGIC, SEVENZIP_MAGIC_LEN)) + goto error; + + sevenzip_context = (struct sevenzip_context_t*)sevenzip_stream_new(); + state->context = sevenzip_context; #if defined(_WIN32) && defined(USE_WINDOWS_FILE) && !defined(LEGACY_WIN32) if (!string_is_empty(file)) @@ -381,46 +390,48 @@ #endif FileInStream_CreateVTable(&sevenzip_context->archiveStream); - LookToRead_CreateVTable(&sevenzip_context->lookStream, false); - sevenzip_context->lookStream.realStream = &sevenzip_context->archiveStream.s; - LookToRead_Init(&sevenzip_context->lookStream); + LookToRead2_CreateVTable(&sevenzip_context->lookStream, false); + sevenzip_context->lookStream.realStream = &sevenzip_context->archiveStream.vt; + LookToRead2_Init(&sevenzip_context->lookStream); CrcGenerateTable(); SzArEx_Init(&sevenzip_context->db); - if (SzArEx_Open(&sevenzip_context->db, &sevenzip_context->lookStream.s, + if (SzArEx_Open(&sevenzip_context->db, &sevenzip_context->lookStream.vt, &sevenzip_context->allocImp, &sevenzip_context->allocTempImp) != SZ_OK) goto error; + state->step_total = sevenzip_context->db.NumFiles; + return 0; error: if (sevenzip_context) - sevenzip_stream_free(sevenzip_context); + sevenzip_parse_file_free(sevenzip_context); return -1; } static int sevenzip_parse_file_iterate_step_internal( - file_archive_transfer_t *state, char *filename, + struct sevenzip_context_t *sevenzip_context, char *filename, const uint8_t **cdata, unsigned *cmode, uint32_t *size, uint32_t *csize, uint32_t *checksum, unsigned *payback, struct archive_extract_userdata *userdata) { - struct sevenzip_context_t *sevenzip_context = (struct sevenzip_context_t*)state->stream; - const CSzFileItem *file = sevenzip_context->db.db.Files + sevenzip_context->index; - - if (sevenzip_context->index < sevenzip_context->db.db.NumFiles) + if (sevenzip_context->parse_index < sevenzip_context->db.NumFiles) { size_t len = SzArEx_GetFileNameUtf16(&sevenzip_context->db, - sevenzip_context->index, NULL); + sevenzip_context->parse_index, NULL); uint64_t compressed_size = 0; if (sevenzip_context->packIndex < sevenzip_context->db.db.NumPackStreams) { - compressed_size = sevenzip_context->db.db.PackSizes[sevenzip_context->packIndex]; + compressed_size = sevenzip_context->db.db.PackPositions[sevenzip_context->packIndex + 1] - + sevenzip_context->db.db.PackPositions[sevenzip_context->packIndex]; + sevenzip_context->packIndex++; } - if (len < PATH_MAX_LENGTH && !file->IsDir) + if (len < PATH_MAX_LENGTH && + !SzArEx_IsDir(&sevenzip_context->db, sevenzip_context->parse_index)) { char infile[PATH_MAX_LENGTH]; SRes res = SZ_ERROR_FAIL; @@ -431,7 +442,7 @@ infile[0] = '\0'; - SzArEx_GetFileNameUtf16(&sevenzip_context->db, sevenzip_context->index, + SzArEx_GetFileNameUtf16(&sevenzip_context->db, sevenzip_context->parse_index, temp); if (temp) @@ -446,10 +457,12 @@ strlcpy(filename, infile, PATH_MAX_LENGTH); - *cmode = ARCHIVE_MODE_COMPRESSED; - *checksum = file->Crc; - *size = (uint32_t)file->Size; + *cmode = 0; /* unused for 7zip */ + *checksum = sevenzip_context->db.CRCs.Vals[sevenzip_context->parse_index]; + *size = (uint32_t)SzArEx_GetFileSize(&sevenzip_context->db, sevenzip_context->parse_index); *csize = (uint32_t)compressed_size; + + *cdata = (uint8_t *)(size_t)sevenzip_context->parse_index; } } else @@ -460,39 +473,37 @@ return 1; } -static int sevenzip_parse_file_iterate_step(file_archive_transfer_t *state, +static int sevenzip_parse_file_iterate_step(void *context, const char *valid_exts, struct archive_extract_userdata *userdata, file_archive_file_cb file_cb) { - char filename[PATH_MAX_LENGTH]; const uint8_t *cdata = NULL; uint32_t checksum = 0; uint32_t size = 0; uint32_t csize = 0; unsigned cmode = 0; unsigned payload = 0; - struct sevenzip_context_t *sevenzip_context = NULL; + struct sevenzip_context_t *sevenzip_context = (struct sevenzip_context_t*)context; int ret; - filename[0] = '\0'; + userdata->current_file_path[0] = '\0'; - ret = sevenzip_parse_file_iterate_step_internal(state, filename, + ret = sevenzip_parse_file_iterate_step_internal(sevenzip_context, + userdata->current_file_path, &cdata, &cmode, &size, &csize, &checksum, &payload, userdata); if (ret != 1) return ret; - userdata->extracted_file_path = filename; userdata->crc = checksum; - if (file_cb && !file_cb(filename, valid_exts, cdata, cmode, + if (file_cb && !file_cb(userdata->current_file_path, valid_exts, + cdata, cmode, csize, size, checksum, userdata)) return 0; - sevenzip_context = (struct sevenzip_context_t*)state->stream; - - sevenzip_context->index += payload; + sevenzip_context->parse_index += payload; return 1; } @@ -504,13 +515,12 @@ } const struct file_archive_file_backend sevenzip_backend = { - sevenzip_stream_new, - sevenzip_stream_free, + sevenzip_parse_file_init, + sevenzip_parse_file_iterate_step, + sevenzip_parse_file_free, sevenzip_stream_decompress_data_to_file_init, sevenzip_stream_decompress_data_to_file_iterate, sevenzip_stream_crc32_calculate, sevenzip_file_read, - sevenzip_parse_file_init, - sevenzip_parse_file_iterate_step, "7z" };
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/archive_file_zlib.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/archive_file_zlib.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (archive_file_zlib.c). @@ -31,7 +31,7 @@ #include <encodings/crc32.h> /* Only for MAX_WBITS */ -#include <compat/zlib.h> +#include <zlib.h> #ifndef CENTRAL_FILE_HEADER_SIGNATURE #define CENTRAL_FILE_HEADER_SIGNATURE 0x02014b50 @@ -41,6 +41,23 @@ #define END_OF_CENTRAL_DIR_SIGNATURE 0x06054b50 #endif +enum file_archive_compression_mode +{ + ZIP_MODE_STORED = 0, + ZIP_MODE_DEFLATED = 8 +}; + +typedef struct +{ + struct file_archive_transfer *state; + uint8_t *directory; + uint8_t *directory_entry; + uint8_t *directory_end; + void *current_stream; + uint8_t *compressed_data; + uint8_t *decompressed_data; +} zip_context_t; + static INLINE uint32_t read_le(const uint8_t *data, unsigned size) { unsigned i; @@ -53,69 +70,147 @@ return val; } -static void *zlib_stream_new(void) -{ - return zlib_inflate_backend.stream_new(); -} - -static void zlib_stream_free(void *stream) +static void zip_context_free_stream( + zip_context_t *zip_context, bool keep_decompressed) { - zlib_inflate_backend.stream_free(stream); + if (zip_context->current_stream) + { + zlib_inflate_backend.stream_free(zip_context->current_stream); + zip_context->current_stream = NULL; + } + if (zip_context->compressed_data) + { +#ifdef HAVE_MMAP + if (!zip_context->state->archive_mmap_data) +#endif + { + free(zip_context->compressed_data); + zip_context->compressed_data = NULL; + } + } + if (zip_context->decompressed_data && !keep_decompressed) + { + free(zip_context->decompressed_data); + zip_context->decompressed_data = NULL; + } } static bool zlib_stream_decompress_data_to_file_init( - file_archive_file_handle_t *handle, - const uint8_t *cdata, uint32_t csize, uint32_t size) + void *context, file_archive_file_handle_t *handle, + const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size) { - if (!handle) - return false; + zip_context_t *zip_context = (zip_context_t *)context; + struct file_archive_transfer *state = zip_context->state; + uint8_t local_header_buf[4]; + uint8_t *local_header; + uint32_t offsetNL, offsetEL; + int64_t offsetData; + + /* free previous data and stream if left unfinished */ + zip_context_free_stream(zip_context, false); + + /* seek past most of the local directory header */ +#ifdef HAVE_MMAP + if (state->archive_mmap_data) + { + local_header = state->archive_mmap_data + (size_t)cdata + 26; + } + else +#endif + { + filestream_seek(state->archive_file, (int64_t)(size_t)cdata + 26, RETRO_VFS_SEEK_POSITION_START); + if (filestream_read(state->archive_file, local_header_buf, 4) != 4) + goto error; + local_header = local_header_buf; + } - handle->stream = zlib_inflate_backend.stream_new(); + offsetNL = read_le(local_header, 2); /* file name length */ + offsetEL = read_le(local_header + 2, 2); /* extra field length */ + offsetData = (int64_t)(size_t)cdata + 26 + 4 + offsetNL + offsetEL; - if (!handle->stream) - goto error; +#ifdef HAVE_MMAP + if (state->archive_mmap_data) + { + zip_context->compressed_data = state->archive_mmap_data + (size_t)offsetData; + } + else +#endif + { + /* allocate memory for the compressed data */ + zip_context->compressed_data = (uint8_t*)malloc(csize); + if (!zip_context->compressed_data) + goto error; + + /* skip over name and extra data */ + filestream_seek(state->archive_file, offsetData, RETRO_VFS_SEEK_POSITION_START); + if (filestream_read(state->archive_file, zip_context->compressed_data, csize) != csize) + goto error; + } - if (zlib_inflate_backend.define) - zlib_inflate_backend.define(handle->stream, "window_bits", (uint32_t)-MAX_WBITS); + switch (cmode) + { + case ZIP_MODE_STORED: + handle->data = zip_context->compressed_data; + return true; - handle->data = (uint8_t*)malloc(size); + case ZIP_MODE_DEFLATED: + zip_context->current_stream = zlib_inflate_backend.stream_new(); + if (!zip_context->current_stream) + goto error; - if (!handle->data) - goto error; + if (zlib_inflate_backend.define) + zlib_inflate_backend.define(zip_context->current_stream, "window_bits", (uint32_t)-MAX_WBITS); - zlib_inflate_backend.set_in(handle->stream, - (const uint8_t*)cdata, csize); - zlib_inflate_backend.set_out(handle->stream, - handle->data, size); + zip_context->decompressed_data = (uint8_t*)malloc(size); - return true; + if (!zip_context->decompressed_data) + goto error; -error: - if (handle->stream) - zlib_inflate_backend.stream_free(handle->stream); - if (handle->data) - free(handle->data); + zlib_inflate_backend.set_in(zip_context->current_stream, + zip_context->compressed_data, csize); + zlib_inflate_backend.set_out(zip_context->current_stream, + zip_context->decompressed_data, size); + + return true; + } +error: + zip_context_free_stream(zip_context, false); return false; } -static int zlib_stream_decompress_data_to_file_iterate(void *stream) +static int zlib_stream_decompress_data_to_file_iterate( + void *context, file_archive_file_handle_t *handle) { + zip_context_t *zip_context = (zip_context_t *)context; bool zstatus; uint32_t rd, wn; enum trans_stream_error terror; - if (!stream) - return -1; + if (!zip_context->current_stream) + { + /* file was uncompressed or decompression finished before */ + return 1; + } - zstatus = zlib_inflate_backend.trans(stream, false, &rd, &wn, &terror); - - if (!zstatus && terror != TRANS_STREAM_ERROR_BUFFER_FULL) - return -1; + zstatus = zlib_inflate_backend.trans(zip_context->current_stream, false, &rd, &wn, &terror); if (zstatus && !terror) + { + /* successfully decompressed entire file */ + zip_context_free_stream(zip_context, true); + handle->data = zip_context->decompressed_data; return 1; + } + if (!zstatus && terror != TRANS_STREAM_ERROR_BUFFER_FULL) + { + /* error during stream processing */ + zip_context_free_stream(zip_context, false); + return -1; + } + + /* still more data to process */ return 0; } @@ -126,49 +221,51 @@ } static bool zip_file_decompressed_handle( - file_archive_file_handle_t *handle, - const uint8_t *cdata, uint32_t csize, + file_archive_transfer_t *transfer, + file_archive_file_handle_t* handle, + const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t crc32) { int ret = 0; - handle->backend = &zlib_backend; + transfer->backend = &zlib_backend; - if (!handle->backend->stream_decompress_data_to_file_init( - handle, cdata, csize, size)) + if (!transfer->backend->stream_decompress_data_to_file_init( + transfer->context, handle, cdata, cmode, csize, size)) return false; do { - ret = handle->backend->stream_decompress_data_to_file_iterate( - handle->stream); - }while(ret == 0); + ret = transfer->backend->stream_decompress_data_to_file_iterate( + transfer->context, handle); + }while (ret == 0); #if 0 - handle->real_checksum = handle->backend->stream_crc_calculate(0, + handle->real_checksum = transfer->backend->stream_crc_calculate(0, handle->data, size); if (handle->real_checksum != crc32) - goto error; -#endif + { + if (handle->data) + free(handle->data); - if (handle->stream) - free(handle->stream); + handle->data = NULL; + return false; + } +#endif return true; -#if 0 -error: - if (handle->stream) - free(handle->stream); - if (handle->data) - free(handle->data); - - handle->stream = NULL; - handle->data = NULL; - return false; -#endif } +typedef struct +{ + char *opt_file; + char *needle; + void **buf; + size_t size; + bool found; +} decomp_state_t; + /* Extract the relative path (needle) from a * ZIP archive (path) and allocate a buffer for it to write it in. * @@ -182,211 +279,252 @@ uint32_t csize, uint32_t size, uint32_t crc32, struct archive_extract_userdata *userdata) { + decomp_state_t* decomp_state = (decomp_state_t*)userdata->cb_data; + char last_char = name[strlen(name) - 1]; /* Ignore directories. */ - if (name[strlen(name) - 1] == '/' || name[strlen(name) - 1] == '\\') + if (last_char == '/' || last_char == '\\') return 1; - if (strstr(name, userdata->decomp_state.needle)) + if (strstr(name, decomp_state->needle)) { - bool goto_error = false; file_archive_file_handle_t handle = {0}; - userdata->decomp_state.found = true; - - if (zip_file_decompressed_handle(&handle, - cdata, csize, size, crc32)) + if (zip_file_decompressed_handle(userdata->transfer, + &handle, cdata, cmode, csize, size, crc32)) { - if (userdata->decomp_state.opt_file != 0) + if (decomp_state->opt_file != 0) { /* Called in case core has need_fullpath enabled. */ - char *buf = (char*)malloc(size); + bool success = filestream_write_file(decomp_state->opt_file, handle.data, size); - if (buf) - { - memcpy(buf, handle.data, size); + free(handle.data); + handle.data = NULL; - if (!filestream_write_file(userdata->decomp_state.opt_file, buf, size)) - goto_error = true; - } + decomp_state->size = 0; - free(buf); - - userdata->decomp_state.size = 0; + if (!success) + return -1; } else { /* Called in case core has need_fullpath disabled. - * Will copy decompressed content directly into + * Will move decompressed content directly into * RetroArch's ROM buffer. */ - *userdata->decomp_state.buf = malloc(size); - memcpy(*userdata->decomp_state.buf, handle.data, size); + *decomp_state->buf = handle.data; + handle.data = NULL; - userdata->decomp_state.size = size; + decomp_state->size = size; } } - if (handle.data) - free(handle.data); - - if (goto_error) - return 0; + decomp_state->found = true; } return 1; } -static int zip_file_read( +static int64_t zip_file_read( const char *path, const char *needle, void **buf, const char *optional_outfile) { - file_archive_transfer_t zlib; - struct archive_extract_userdata userdata = {{0}}; + file_archive_transfer_t state = {0}; + decomp_state_t decomp = {0}; + struct archive_extract_userdata userdata = {0}; bool returnerr = true; int ret = 0; - zlib.type = ARCHIVE_TRANSFER_INIT; - zlib.archive_size = 0; - zlib.start_delta = 0; - zlib.handle = NULL; - zlib.stream = NULL; - zlib.footer = NULL; - zlib.directory = NULL; - zlib.data = NULL; - zlib.backend = NULL; - - userdata.decomp_state.needle = NULL; - userdata.decomp_state.opt_file = NULL; - userdata.decomp_state.found = false; - userdata.decomp_state.buf = buf; - if (needle) - userdata.decomp_state.needle = strdup(needle); + decomp.needle = strdup(needle); if (optional_outfile) - userdata.decomp_state.opt_file = strdup(optional_outfile); + decomp.opt_file = strdup(optional_outfile); + + state.type = ARCHIVE_TRANSFER_INIT; + userdata.transfer = &state; + userdata.cb_data = &decomp; + decomp.buf = buf; do { - ret = file_archive_parse_file_iterate(&zlib, &returnerr, path, + ret = file_archive_parse_file_iterate(&state, &returnerr, path, "", zip_file_decompressed, &userdata); if (!returnerr) break; - }while(ret == 0 && !userdata.decomp_state.found); + }while (ret == 0 && !decomp.found); - file_archive_parse_file_iterate_stop(&zlib); + file_archive_parse_file_iterate_stop(&state); - if (userdata.decomp_state.opt_file) - free(userdata.decomp_state.opt_file); - if (userdata.decomp_state.needle) - free(userdata.decomp_state.needle); + if (decomp.opt_file) + free(decomp.opt_file); + if (decomp.needle) + free(decomp.needle); - if (!userdata.decomp_state.found) + if (!decomp.found) return -1; - return (int)userdata.decomp_state.size; + return (int64_t)decomp.size; } static int zip_parse_file_init(file_archive_transfer_t *state, const char *file) { - if (state->archive_size < 22) + uint8_t footer_buf[1024]; + uint8_t *footer = footer_buf; + int64_t read_pos = state->archive_size; + int64_t read_block = MIN(read_pos, sizeof(footer_buf)); + int64_t directory_size, directory_offset; + zip_context_t *zip_context = NULL; + + /* Minimal ZIP file size is 22 bytes */ + if (read_block < 22) return -1; - state->footer = state->data + state->archive_size - 22; - - for (;; state->footer--) + /* Find the end of central directory record by scanning + * the file from the end towards the beginning. + */ + for (;;) { - if (state->footer <= state->data + 22) - return -1; - if (read_le(state->footer, 4) == END_OF_CENTRAL_DIR_SIGNATURE) + if (--footer < footer_buf) { - unsigned comment_len = read_le(state->footer + 20, 2); - if (state->footer + 22 + comment_len == state->data + state->archive_size) - break; + if (read_pos <= 0) + return -1; /* reached beginning of file */ + + /* Read 21 bytes of overlaps except on the first block. */ + if (read_pos == state->archive_size) + read_pos = read_pos - read_block; + else + read_pos = MAX(read_pos - read_block + 21, 0); + + /* Seek to read_pos and read read_block bytes. */ + filestream_seek(state->archive_file, read_pos, RETRO_VFS_SEEK_POSITION_START); + if (filestream_read(state->archive_file, footer_buf, read_block) != read_block) + return -1; + + footer = footer_buf + read_block - 22; + } + if (read_le(footer, 4) == END_OF_CENTRAL_DIR_SIGNATURE) + { + unsigned comment_len = read_le(footer + 20, 2); + if (read_pos + (footer - footer_buf) + 22 + comment_len == state->archive_size) + break; /* found it! */ } } - state->directory = state->data + read_le(state->footer + 16, 4); + /* Read directory info and do basic sanity checks. */ + directory_size = read_le(footer + 12, 4); + directory_offset = read_le(footer + 16, 4); + if (directory_size > state->archive_size + || directory_offset > state->archive_size) + return -1; + + /* This is a ZIP file, allocate one block of memory for both the + * context and the entire directory, then read the directory. + */ + zip_context = (zip_context_t*)malloc(sizeof(zip_context_t) + (size_t)directory_size); + zip_context->state = state; + zip_context->directory = (uint8_t*)(zip_context + 1); + zip_context->directory_entry = zip_context->directory; + zip_context->directory_end = zip_context->directory + (size_t)directory_size; + zip_context->current_stream = NULL; + zip_context->compressed_data = NULL; + zip_context->decompressed_data = NULL; + + filestream_seek(state->archive_file, directory_offset, RETRO_VFS_SEEK_POSITION_START); + if (filestream_read(state->archive_file, zip_context->directory, directory_size) != directory_size) + { + free(zip_context); + return -1; + } + + state->context = zip_context; + state->step_total = read_le(footer + 10, 2); /* total entries */; return 0; } static int zip_parse_file_iterate_step_internal( - file_archive_transfer_t *state, char *filename, + zip_context_t * zip_context, char *filename, const uint8_t **cdata, unsigned *cmode, uint32_t *size, uint32_t *csize, uint32_t *checksum, unsigned *payback) { - uint32_t offset; - uint32_t namelength, extralength, commentlength, - offsetNL, offsetEL; - uint32_t signature = read_le(state->directory + 0, 4); + uint8_t *entry = zip_context->directory_entry; + uint32_t signature, namelength, extralength, commentlength, offset; + + if (entry < zip_context->directory || entry >= zip_context->directory_end) + return 0; + + signature = read_le(zip_context->directory_entry + 0, 4); if (signature != CENTRAL_FILE_HEADER_SIGNATURE) return 0; - *cmode = read_le(state->directory + 10, 2); /* compression mode, 0 = store, 8 = deflate */ - *checksum = read_le(state->directory + 16, 4); /* CRC32 */ - *csize = read_le(state->directory + 20, 4); /* compressed size */ - *size = read_le(state->directory + 24, 4); /* uncompressed size */ + *cmode = read_le(zip_context->directory_entry + 10, 2); /* compression mode, 0 = store, 8 = deflate */ + *checksum = read_le(zip_context->directory_entry + 16, 4); /* CRC32 */ + *csize = read_le(zip_context->directory_entry + 20, 4); /* compressed size */ + *size = read_le(zip_context->directory_entry + 24, 4); /* uncompressed size */ - namelength = read_le(state->directory + 28, 2); /* file name length */ - extralength = read_le(state->directory + 30, 2); /* extra field length */ - commentlength = read_le(state->directory + 32, 2); /* file comment length */ + namelength = read_le(zip_context->directory_entry + 28, 2); /* file name length */ + extralength = read_le(zip_context->directory_entry + 30, 2); /* extra field length */ + commentlength = read_le(zip_context->directory_entry + 32, 2); /* file comment length */ if (namelength >= PATH_MAX_LENGTH) return -1; - memcpy(filename, state->directory + 46, namelength); /* file name */ + memcpy(filename, zip_context->directory_entry + 46, namelength); /* file name */ + filename[namelength] = '\0'; - offset = read_le(state->directory + 42, 4); /* relative offset of local file header */ - offsetNL = read_le(state->data + offset + 26, 2); /* file name length */ - offsetEL = read_le(state->data + offset + 28, 2); /* extra field length */ + offset = read_le(zip_context->directory_entry + 42, 4); /* relative offset of local file header */ - *cdata = state->data + offset + 30 + offsetNL + offsetEL; + *cdata = (uint8_t*)(size_t)offset; /* store file offset in data pointer */ - *payback = 46 + namelength + extralength + commentlength; + *payback = 46 + namelength + extralength + commentlength; return 1; } -static int zip_parse_file_iterate_step(file_archive_transfer_t *state, +static int zip_parse_file_iterate_step(void *context, const char *valid_exts, struct archive_extract_userdata *userdata, file_archive_file_cb file_cb) { - char filename[PATH_MAX_LENGTH] = {0}; + zip_context_t *zip_context = (zip_context_t *)context; const uint8_t *cdata = NULL; uint32_t checksum = 0; uint32_t size = 0; uint32_t csize = 0; unsigned cmode = 0; unsigned payload = 0; - int ret = zip_parse_file_iterate_step_internal( - state, filename, &cdata, &cmode, &size, &csize, &checksum, &payload); + int ret = zip_parse_file_iterate_step_internal(zip_context, + userdata->current_file_path, &cdata, &cmode, &size, &csize, &checksum, &payload); if (ret != 1) return ret; - userdata->extracted_file_path = filename; userdata->crc = checksum; - if (file_cb && !file_cb(filename, valid_exts, cdata, cmode, + if (file_cb && !file_cb(userdata->current_file_path, valid_exts, cdata, cmode, csize, size, checksum, userdata)) return 0; - state->directory += payload; + zip_context->directory_entry += payload; return 1; } +static void zip_parse_file_free(void *context) +{ + zip_context_t *zip_context = (zip_context_t *)context; + zip_context_free_stream(zip_context, false); + free(zip_context); +} + const struct file_archive_file_backend zlib_backend = { - zlib_stream_new, - zlib_stream_free, + zip_parse_file_init, + zip_parse_file_iterate_step, + zip_parse_file_free, zlib_stream_decompress_data_to_file_init, zlib_stream_decompress_data_to_file_iterate, zlib_stream_crc32_calculate, zip_file_read, - zip_parse_file_init, - zip_parse_file_iterate_step, "zlib" };
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/config_file.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/config_file.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (config_file.c). @@ -26,14 +26,6 @@ #include <ctype.h> #include <errno.h> -#if !defined(_WIN32) && !defined(__CELLOS_LV2__) && !defined(_XBOX) -#include <sys/param.h> /* PATH_MAX */ -#elif defined(_WIN32) && !defined(_XBOX) -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#elif defined(_XBOX) -#include <xtl.h> -#endif #ifdef ORBIS #include <sys/fcntl.h> #include <orbisFile.h> @@ -45,46 +37,44 @@ #include <compat/msvc.h> #include <file/config_file.h> #include <file/file_path.h> -#include <lists/string_list.h> #include <string/stdstring.h> #include <streams/file_stream.h> +#include <array/rhmap.h> #define MAX_INCLUDE_DEPTH 16 -struct config_entry_list -{ - /* If we got this from an #include, - * do not allow overwrite. */ - bool readonly; - - char *key; - char *value; - struct config_entry_list *next; -}; - struct config_include_list { char *path; struct config_include_list *next; }; -static config_file_t *config_file_new_internal( - const char *path, unsigned depth, config_file_cb_t *cb); +/* Forward declaration */ +static bool config_file_parse_line(config_file_t *conf, + struct config_entry_list *list, char *line, config_file_cb_t *cb); -static int config_sort_compare_func(struct config_entry_list *a, +static int config_file_sort_compare_func(struct config_entry_list *a, struct config_entry_list *b) { - const char *a_key = a ? a->key : NULL; - const char *b_key = b ? b->key : NULL; - - if (!a_key || !b_key) - return 0; + if (a && b) + { + if (a->key) + { + if (b->key) + return strcasecmp(a->key, b->key); + return 1; + } + else if (b->key) + return -1; + } - return strcasecmp(a_key, b_key); + return 0; } /* https://stackoverflow.com/questions/7685/merge-sort-a-linked-list */ -static struct config_entry_list* merge_sort_linked_list(struct config_entry_list *list, int (*compare)(struct config_entry_list *one,struct config_entry_list *two)) +static struct config_entry_list* config_file_merge_sort_linked_list( + struct config_entry_list *list, int (*compare)( + struct config_entry_list *one,struct config_entry_list *two)) { struct config_entry_list *right = list, @@ -98,20 +88,22 @@ if (!list || !list->next) return list; - /* Find halfway through the list (by running two pointers, one at twice the speed of the other). */ + /* Find halfway through the list (by running two pointers, + * one at twice the speed of the other). */ while (temp && temp->next) { - last = right; - right = right->next; - temp = temp->next->next; + last = right; + right = right->next; + temp = temp->next->next; } - /* Break the list in two. (prev pointers are broken here, but we fix later) */ - last->next = 0; + /* Break the list in two. (prev pointers are broken here, + * but we fix later) */ + last->next = 0; /* Recurse on the two smaller lists: */ - list = merge_sort_linked_list(list, compare); - right = merge_sort_linked_list(right, compare); + list = config_file_merge_sort_linked_list(list, compare); + right = config_file_merge_sort_linked_list(right, compare); /* Merge: */ while (list || right) @@ -119,82 +111,108 @@ /* Take from empty lists, or compare: */ if (!right) { - next = list; - list = list->next; + next = list; + list = list->next; } else if (!list) { - next = right; + next = right; right = right->next; } else if (compare(list, right) < 0) { - next = list; - list = list->next; + next = list; + list = list->next; } else { - next = right; + next = right; right = right->next; } if (!result) - result = next; + result = next; else tail->next = next; - tail = next; + tail = next; } return result; } -static char *strip_comment(char *str) +/* Searches input string for a comment ('#') entry + * > If first character is '#', then entire line is + * a comment and may correspond to a directive + * (command action - e.g. include sub-config file). + * In this case, 'str' is set to NUL and the comment + * itself (everything after the '#' character) is + * returned + * > If a '#' character is found inside a string literal + * value, then it does not correspond to a comment and + * is ignored. In this case, 'str' is left untouched + * and NULL is returned + * > If a '#' character is found anywhere else, then the + * comment text is a suffix of the input string and + * has no programmatic value. In this case, the comment + * is removed from the end of 'str' and NULL is returned */ +static char *config_file_strip_comment(char *str) { - /* Remove everything after comment. - * Keep #s inside string literals. */ - char *string_end = str + strlen(str); - bool cut_comment = true; + /* Search for a comment (#) character */ + char *comment = strchr(str, '#'); - while (!string_is_empty(str)) + if (comment) { - char *comment = NULL; - char *literal = strchr(str, '\"'); - if (!literal) - literal = string_end; - comment = (char*)strchr(str, '#'); + char *literal_start = NULL; - if (!comment) - comment = string_end; - - if (cut_comment && literal < comment) - { - cut_comment = false; - str = literal + 1; - } - else if (!cut_comment && literal) + /* Check whether entire line is a comment + * > First character == '#' */ + if (str == comment) { - cut_comment = true; - str = literal + 1; + /* Set 'str' to NUL and return comment + * for processing at a higher level */ + *str = '\0'; + return ++comment; } - else + + /* Comment character occurs at an offset: + * Search for the start of a string literal value */ + literal_start = strchr(str, '\"'); + + /* Check whether string literal start occurs + * *before* the comment character */ + if (literal_start && (literal_start < comment)) { - *comment = '\0'; - str = comment; + /* Search for the end of the string literal + * value */ + char *literal_end = strchr(literal_start + 1, '\"'); + + /* Check whether string literal end occurs + * *after* the comment character + * > If this is the case, ignore the comment + * > Leave 'str' untouched and return NULL */ + if (literal_end && (literal_end > comment)) + return NULL; } + + /* If we reach this point, then a comment + * exists outside of a string literal + * > Trim the entire comment from the end + * of 'str' */ + *comment = '\0'; } - return str; + return NULL; } -static char *extract_value(char *line, bool is_value) +static char *config_file_extract_value(char *line, bool is_value) { - char *save = NULL; - char *tok = NULL; + size_t idx = 0; + char *value = NULL; if (is_value) { - while (isspace((int)*line)) + while (ISSPACE((int)*line)) line++; /* If we don't have an equal sign here, @@ -205,30 +223,59 @@ line++; } - while (isspace((int)*line)) + while (ISSPACE((int)*line)) line++; - /* We have a full string. Read until next ". */ + /* Note: From this point on, an empty value + * string is valid - and in this case, strdup("") + * will be returned + * > If we instead return NULL, the the entry + * is ignored completely - which means we cannot + * track *changes* in entry value */ + + /* If first character is ("), we have a full string + * literal */ if (*line == '"') { + /* Skip to next character */ line++; + + /* If this a ("), then value string is empty */ if (*line == '"') - return NULL; - tok = strtok_r(line, "\"", &save); + return strdup(""); + + /* Find the next (") character */ + while (line[idx] && (line[idx] != '\"')) + idx++; + + line[idx] = '\0'; + value = line; } - /* We don't have that. Read until next space. */ - else if (*line != '\0') /* Nothing */ - tok = strtok_r(line, " \n\t\f\r\v", &save); + /* This is not a string literal - just read + * until the next space is found + * > Note: Skip this if line is empty */ + else if (*line != '\0') + { + /* Find next space character */ + while (line[idx] && isgraph((int)line[idx])) + idx++; - if (tok && *tok) - return strdup(tok); - return NULL; + line[idx] = '\0'; + value = line; + } + + if (value && *value) + return strdup(value); + + return strdup(""); } /* Move semantics? */ -static void add_child_list(config_file_t *parent, config_file_t *child) +static void config_file_add_child_list(config_file_t *parent, config_file_t *child) { struct config_entry_list *list = child->entries; + bool merge_hash_map = false; + if (parent->entries) { struct config_entry_list *head = parent->entries; @@ -242,6 +289,8 @@ list = list->next; } head->next = child->entries; + + merge_hash_map = true; } else { @@ -254,8 +303,6 @@ parent->entries = child->entries; } - child->entries = NULL; - /* Rebase tail. */ if (parent->entries) { @@ -268,112 +315,311 @@ } else parent->tail = NULL; + + /* Update hash map */ + if (merge_hash_map) + { + size_t i; + size_t cap; + + /* We are merging two lists - if any child entry + * (key) is not present in the parent list, add it + * to the parent hash map */ + for (i = 0, cap = RHMAP_CAP(child->entries_map); i != cap; i++) + { + uint32_t child_hash = RHMAP_KEY(child->entries_map, i); + const char *child_key = RHMAP_KEY_STR(child->entries_map, i); + + if (child_hash && + child_key && + !RHMAP_HAS_FULL(parent->entries_map, child_hash, child_key)) + { + struct config_entry_list *entry = child->entries_map[i]; + + if (entry) + RHMAP_SET_FULL(parent->entries_map, child_hash, child_key, entry); + } + } + + /* Child entries map is no longer required, + * so free it now */ + RHMAP_FREE(child->entries_map); + } + else + { + /* If parent list was originally empty, + * take map from child list */ + RHMAP_FREE(parent->entries_map); + parent->entries_map = child->entries_map; + child->entries_map = NULL; + } + + child->entries = NULL; } -static void add_sub_conf(config_file_t *conf, char *path, config_file_cb_t *cb) +static void config_file_get_realpath(char *s, size_t len, + char *path, const char *config_path) +{ +#ifdef _WIN32 + if (!string_is_empty(config_path)) + fill_pathname_resolve_relative(s, config_path, + path, len); +#else +#if !defined(__PSL1GHT__) && !defined(__PS3__) + if (*path == '~') + { + const char *home = getenv("HOME"); + if (home) + { + strlcpy(s, home, len); + strlcat(s, path + 1, len); + } + else + strlcpy(s, path + 1, len); + } + else +#endif + if (!string_is_empty(config_path)) + fill_pathname_resolve_relative(s, config_path, path, len); +#endif +} + +static void config_file_add_sub_conf(config_file_t *conf, char *path, + char *real_path, size_t len, config_file_cb_t *cb) { - char real_path[PATH_MAX_LENGTH]; - config_file_t *sub_conf = NULL; struct config_include_list *head = conf->includes; struct config_include_list *node = (struct config_include_list*) malloc(sizeof(*node)); if (node) { - node->next = NULL; + node->next = NULL; /* Add include list */ - node->path = strdup(path); + node->path = strdup(path); if (head) { while (head->next) - head = head->next; + head = head->next; - head->next = node; + head->next = node; } else conf->includes = node; } - real_path[0] = '\0'; + config_file_get_realpath(real_path, len, path, + conf->path); +} -#ifdef _WIN32 - if (!string_is_empty(conf->path)) - fill_pathname_resolve_relative(real_path, conf->path, - path, sizeof(real_path)); -#else -#ifndef __CELLOS_LV2__ - if (*path == '~') +static int config_file_load_internal( + struct config_file *conf, + const char *path, unsigned depth, config_file_cb_t *cb) +{ + RFILE *file = NULL; + char *new_path = strdup(path); + if (!new_path) + return 1; + + conf->path = new_path; + conf->include_depth = depth; + file = filestream_open(path, + RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + if (!file) { - const char *home = getenv("HOME"); - strlcpy(real_path, home ? home : "", sizeof(real_path)); - strlcat(real_path, path + 1, sizeof(real_path)); + free(conf->path); + return 1; } - else -#endif - if (!string_is_empty(conf->path)) - fill_pathname_resolve_relative(real_path, conf->path, - path, sizeof(real_path)); -#endif - sub_conf = (config_file_t*) - config_file_new_internal(real_path, conf->include_depth + 1, cb); - if (!sub_conf) - return; + while (!filestream_eof(file)) + { + char *line = NULL; + struct config_entry_list *list = (struct config_entry_list*) + malloc(sizeof(*list)); + + if (!list) + { + filestream_close(file); + return -1; + } + + list->readonly = false; + list->key = NULL; + list->value = NULL; + list->next = NULL; + + line = filestream_getline(file); + + if (!line) + { + free(list); + continue; + } + + if ( + !string_is_empty(line) + && config_file_parse_line(conf, list, line, cb)) + { + if (conf->entries) + conf->tail->next = list; + else + conf->entries = list; + + conf->tail = list; - /* Pilfer internal list. */ - add_child_list(conf, sub_conf); - config_file_free(sub_conf); + if (list->key) + { + /* Only add entry to the map if an entry + * with the specified value does not + * already exist */ + uint32_t hash = rhmap_hash_string(list->key); + + if (!RHMAP_HAS_FULL(conf->entries_map, hash, list->key)) + { + RHMAP_SET_FULL(conf->entries_map, hash, list->key, list); + + if (cb && list->value) + cb->config_file_new_entry_cb(list->key, list->value); + } + } + } + + free(line); + + if (list != conf->tail) + free(list); + } + + filestream_close(file); + + return 0; } -static bool parse_line(config_file_t *conf, +static bool config_file_parse_line(config_file_t *conf, struct config_entry_list *list, char *line, config_file_cb_t *cb) { - char *comment = NULL; - char *key_tmp = NULL; - size_t cur_size = 8; - size_t idx = 0; - char *key = (char*)malloc(9); + size_t cur_size = 32; + size_t idx = 0; + char *key = NULL; + char *key_tmp = NULL; + /* Remove any comment text */ + char *comment = config_file_strip_comment(line); + + /* Check whether entire line is a comment */ + if (comment) + { + config_file_t sub_conf; + bool include_found = false; + bool reference_found = false; + char real_path[PATH_MAX_LENGTH]; + char *path = NULL; + char *include_line = NULL; + char *reference_line = NULL; + + include_found = string_starts_with_size(comment, "include ", + STRLEN_CONST("include ")); + reference_found = string_starts_with_size(comment, "reference ", + STRLEN_CONST("reference ")); + + /* All comments except those starting with the include or + * reference directive are ignored */ + if (!include_found && !reference_found) + return false; - if (!key) - return false; + /* Starting a line with an 'include' directive + * appends a sub-config file */ + if (include_found) + { + include_line = comment + STRLEN_CONST("include "); - comment = strip_comment(line); + if (string_is_empty(include_line)) + return false; - /* Starting line with #include includes config files. */ - if (comment == line) - { - comment++; - if (strstr(comment, "include ") == comment) - { - char *line = comment + strlen("include "); - char *path = extract_value(line, false); + path = config_file_extract_value(include_line, false); + + if (!path) + return false; - if (path) + if ( string_is_empty(path) + || conf->include_depth >= MAX_INCLUDE_DEPTH) { - if (conf->include_depth >= MAX_INCLUDE_DEPTH) - fprintf(stderr, "!!! #include depth exceeded for config. Might be a cycle.\n"); - else - add_sub_conf(conf, path, cb); free(path); + return false; + } + + real_path[0] = '\0'; + config_file_add_sub_conf(conf, path, + real_path, sizeof(real_path), cb); + + config_file_initialize(&sub_conf); + + switch (config_file_load_internal(&sub_conf, real_path, + conf->include_depth + 1, cb)) + { + case 0: + /* Pilfer internal list. */ + config_file_add_child_list(conf, &sub_conf); + /* fall-through to deinitialize */ + case -1: + config_file_deinitialize(&sub_conf); + break; + case 1: + default: + break; } - goto error; } + + /* Starting a line with an 'reference' directive + * sets the reference path */ + if (reference_found) + { + reference_line = comment + STRLEN_CONST("reference "); + + if (string_is_empty(reference_line)) + return false; + + path = config_file_extract_value(reference_line, false); + + if (!path) + return false; + + config_file_set_reference_path(conf, path); + + if (!path) + return false; + } + + free(path); + return true; } - /* Skips to first character. */ - while (isspace((int)*line)) + /* Skip to first non-space character */ + while (ISSPACE((int)*line)) line++; + /* Allocate storage for key */ + key = (char*)malloc(cur_size + 1); + if (!key) + return false; + + /* Copy line contents into key until we + * reach the next space character */ while (isgraph((int)*line)) { + /* If current key storage is too small, + * double its size */ if (idx == cur_size) { cur_size *= 2; - key_tmp = (char*)realloc(key, cur_size + 1); + key_tmp = (char*)realloc(key, cur_size + 1); if (!key_tmp) - goto error; + { + free(key); + return false; + } key = key_tmp; } @@ -381,120 +627,113 @@ key[idx++] = *line++; } key[idx] = '\0'; - list->key = key; - list->value = extract_value(line, true); + /* Add key and value entries to list */ + list->key = key; + list->value = config_file_extract_value(line, true); + /* An entry without a value is invalid */ if (!list->value) { list->key = NULL; - goto error; + free(key); + return false; } return true; - -error: - free(key); - return false; } -static config_file_t *config_file_new_internal( - const char *path, unsigned depth, config_file_cb_t *cb) +static int config_file_from_string_internal( + struct config_file *conf, + char *from_string, + const char *path) { - RFILE *file = NULL; - struct config_file *conf = (struct config_file*)malloc(sizeof(*conf)); - if (!conf) - return NULL; - - conf->path = NULL; - conf->entries = NULL; - conf->tail = NULL; - conf->last = NULL; - conf->includes = NULL; - conf->include_depth = 0; - conf->guaranteed_no_duplicates = false ; + char *lines = from_string; + char *save_ptr = NULL; + char *line = NULL; - if (!path || !*path) - return conf; -#if !defined(ORBIS) - if (path_is_directory(path)) - goto error; -#endif - conf->path = strdup(path); - if (!conf->path) - goto error; - - conf->include_depth = depth; - file = filestream_open(path, - RETRO_VFS_FILE_ACCESS_READ, - RETRO_VFS_FILE_ACCESS_HINT_NONE); + if (!string_is_empty(path)) + conf->path = strdup(path); + if (string_is_empty(lines)) + return 0; - if (!file) - { - free(conf->path); - goto error; - } + /* Get first line of config file */ + line = strtok_r(lines, "\n", &save_ptr); - while (!filestream_eof(file)) + while (line) { - char *line = NULL; - struct config_entry_list *list = (struct config_entry_list*)malloc(sizeof(*list)); + struct config_entry_list *list = (struct config_entry_list*) + malloc(sizeof(*list)); if (!list) - { - config_file_free(conf); - filestream_close(file); - return NULL; - } + return -1; list->readonly = false; list->key = NULL; list->value = NULL; list->next = NULL; - line = filestream_getline(file); - - if (!line) - { - free(list); - continue; - } - - if (*line && parse_line(conf, list, line, cb)) + /* Parse current line */ + if ( + !string_is_empty(line) + && config_file_parse_line(conf, list, line, NULL)) { if (conf->entries) conf->tail->next = list; else - conf->entries = list; + conf->entries = list; - conf->tail = list; + conf->tail = list; - if (cb != NULL && list->key != NULL && list->value != NULL) - cb->config_file_new_entry_cb(list->key, list->value) ; + if (list->key) + { + /* Only add entry to the map if an entry + * with the specified value does not + * already exist */ + uint32_t hash = rhmap_hash_string(list->key); + if (!RHMAP_HAS_FULL(conf->entries_map, hash, list->key)) + RHMAP_SET_FULL(conf->entries_map, hash, list->key, list); + } } - free(line); - if (list != conf->tail) free(list); + + /* Get next line of config file */ + line = strtok_r(NULL, "\n", &save_ptr); } + + return 0; +} - filestream_close(file); +void config_file_set_reference_path(config_file_t *conf, char *path) +{ + /* It is expected that the conf has it's path already set */ + + char short_path[PATH_MAX_LENGTH]; + + short_path[0] = '\0'; - return conf; + if (!conf) + return; -error: - free(conf); + if (conf->reference) + { + free(conf->reference); + conf->reference = NULL; + } - return NULL; + fill_pathname_abbreviated_or_relative(short_path, conf->path, path, sizeof(short_path)); + + conf->reference = strdup(short_path); } -void config_file_free(config_file_t *conf) +bool config_file_deinitialize(config_file_t *conf) { struct config_include_list *inc_tmp = NULL; struct config_entry_list *tmp = NULL; if (!conf) - return; + return false; tmp = conf->entries; while (tmp) @@ -519,23 +758,56 @@ while (inc_tmp) { struct config_include_list *hold = NULL; - free(inc_tmp->path); + if (inc_tmp->path) + free(inc_tmp->path); hold = (struct config_include_list*)inc_tmp; inc_tmp = inc_tmp->next; - free(hold); + if (hold) + free(hold); } + if (conf->reference) + free(conf->reference); + if (conf->path) free(conf->path); + + RHMAP_FREE(conf->entries_map); + + return true; +} + +void config_file_free(config_file_t *conf) +{ + if (!config_file_deinitialize(conf)) + return; free(conf); } bool config_append_file(config_file_t *conf, const char *path) { - config_file_t *new_conf = config_file_new(path); + config_file_t *new_conf = config_file_new_from_path_to_string(path); + size_t i; + size_t cap; + if (!new_conf) return false; + /* Update hash map */ + for (i = 0, cap = RHMAP_CAP(new_conf->entries_map); i != cap; i++) + { + uint32_t new_hash = RHMAP_KEY(new_conf->entries_map, i); + const char *new_key = RHMAP_KEY_STR(new_conf->entries_map, i); + + if (new_hash && new_key) + { + struct config_entry_list *entry = new_conf->entries_map[i]; + + if (entry) + RHMAP_SET_FULL(conf->entries_map, new_hash, new_key, entry); + } + } + if (new_conf->tail) { new_conf->tail->next = conf->entries; @@ -547,126 +819,167 @@ return true; } -config_file_t *config_file_new_from_string(const char *from_string) +config_file_t *config_file_new_from_string(char *from_string, + const char *path) { - size_t i; - struct string_list *lines = NULL; - struct config_file *conf = (struct config_file*)malloc(sizeof(*conf)); + struct config_file *conf = config_file_new_alloc(); + if (!conf) return NULL; + if (config_file_from_string_internal(conf, from_string, path) == -1) + { + config_file_free(conf); + return NULL; + } + return conf; +} - if (!from_string) - return conf; - - conf->path = NULL; - conf->entries = NULL; - conf->tail = NULL; - conf->last = NULL; - conf->includes = NULL; - conf->include_depth = 0; - conf->guaranteed_no_duplicates = false ; - - lines = string_split(from_string, "\n"); - if (!lines) - return conf; +config_file_t *config_file_new_from_path_to_string(const char *path) +{ + int64_t length = 0; + uint8_t *ret_buf = NULL; + config_file_t *conf = NULL; - for (i = 0; i < lines->size; i++) + if (path_is_valid(path)) { - struct config_entry_list *list = (struct config_entry_list*)malloc(sizeof(*list)); - char *line = lines->elems[i].data; - - if (!list) + if (filestream_read_file(path, (void**)&ret_buf, &length)) { - string_list_free(lines); - config_file_free(conf); - return NULL; + /* Note: 'ret_buf' is not used outside this + * function - we do not care that it will be + * modified by config_file_new_from_string() */ + if (length >= 0) + conf = config_file_new_from_string((char*)ret_buf, path); + + if ((void*)ret_buf) + free((void*)ret_buf); } + } - list->readonly = false; - list->key = NULL; - list->value = NULL; - list->next = NULL; - - if (line && conf) - { - if (*line && parse_line(conf, list, line, NULL)) - { - if (conf->entries) - conf->tail->next = list; - else - conf->entries = list; - - conf->tail = list; - } - } + return conf; +} - if (list != conf->tail) - free(list); +config_file_t *config_file_new_with_callback( + const char *path, config_file_cb_t *cb) +{ + int ret = 0; + struct config_file *conf = config_file_new_alloc(); + if (!path || !*path) + return conf; + ret = config_file_load_internal(conf, path, 0, cb); + if (ret == -1) + { + config_file_free(conf); + return NULL; } + else if (ret == 1) + { + free(conf); + return NULL; + } + return conf; +} - string_list_free(lines); - +config_file_t *config_file_new(const char *path) +{ + int ret = 0; + struct config_file *conf = config_file_new_alloc(); + if (!path || !*path) + return conf; + ret = config_file_load_internal(conf, path, 0, NULL); + if (ret == -1) + { + config_file_free(conf); + return NULL; + } + else if (ret == 1) + { + free(conf); + return NULL; + } return conf; } -config_file_t *config_file_new_with_callback(const char *path, config_file_cb_t *cb) +void config_file_initialize(struct config_file *conf) { - return config_file_new_internal(path, 0, cb); + if (!conf) + return; + + conf->path = NULL; + conf->entries_map = NULL; + conf->entries = NULL; + conf->tail = NULL; + conf->last = NULL; + conf->reference = NULL; + conf->includes = NULL; + conf->include_depth = 0; + conf->guaranteed_no_duplicates = false; + conf->modified = false; } -config_file_t *config_file_new(const char *path) + +config_file_t *config_file_new_alloc(void) { - return config_file_new_internal(path, 0, NULL); + struct config_file *conf = (struct config_file*)malloc(sizeof(*conf)); + if (!conf) + return NULL; + config_file_initialize(conf); + return conf; } -static struct config_entry_list *config_get_entry(const config_file_t *conf, +static struct config_entry_list *config_get_entry_internal( + const config_file_t *conf, const char *key, struct config_entry_list **prev) { struct config_entry_list *entry = NULL; struct config_entry_list *previous = prev ? *prev : NULL; - for (entry = conf->entries; entry; entry = entry->next) - { - if (string_is_equal(key, entry->key)) - return entry; + entry = RHMAP_GET_STR(conf->entries_map, key); - previous = entry; - } + if (entry) + return entry; if (prev) + { + for (entry = conf->entries; entry; entry = entry->next) + previous = entry; + *prev = previous; + } return NULL; } +struct config_entry_list *config_get_entry( + const config_file_t *conf, const char *key) +{ + return RHMAP_GET_STR(conf->entries_map, key); +} + bool config_get_double(config_file_t *conf, const char *key, double *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); - if (entry) - { - *in = strtod(entry->value, NULL); - return true; - } + if (!entry) + return false; - return false; + *in = strtod(entry->value, NULL); + return true; } bool config_get_float(config_file_t *conf, const char *key, float *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); - if (entry) - { - /* strtof() is C99/POSIX. Just use the more portable kind. */ - *in = (float)strtod(entry->value, NULL); - return true; - } - return false; + if (!entry) + return false; + + /* strtof() is C99/POSIX. Just use the more portable kind. */ + *in = (float)strtod(entry->value, NULL); + return true; } bool config_get_int(config_file_t *conf, const char *key, int *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); errno = 0; if (entry) @@ -685,7 +998,7 @@ bool config_get_size_t(config_file_t *conf, const char *key, size_t *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); errno = 0; if (entry) @@ -704,7 +1017,7 @@ #if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L bool config_get_uint64(config_file_t *conf, const char *key, uint64_t *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); errno = 0; if (entry) @@ -723,7 +1036,7 @@ bool config_get_uint(config_file_t *conf, const char *key, unsigned *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); errno = 0; if (entry) @@ -742,7 +1055,7 @@ bool config_get_hex(config_file_t *conf, const char *key, unsigned *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); errno = 0; if (entry) @@ -761,7 +1074,7 @@ bool config_get_char(config_file_t *conf, const char *key, char *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); if (entry) { @@ -777,29 +1090,26 @@ bool config_get_string(config_file_t *conf, const char *key, char **str) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); - if (entry) - { - *str = strdup(entry->value); - return true; - } - return false; + if (!entry || !entry->value) + return false; + + *str = strdup(entry->value); + return true; } bool config_get_config_path(config_file_t *conf, char *s, size_t len) { if (!conf) return false; - return strlcpy(s, conf->path, len); } bool config_get_array(config_file_t *conf, const char *key, char *buf, size_t size) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); - + const struct config_entry_list *entry = config_get_entry(conf, key); if (entry) return strlcpy(buf, entry->value, size) < size; return false; @@ -812,7 +1122,7 @@ if (config_get_array(conf, key, buf, size)) return true; #else - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); if (entry) { @@ -825,40 +1135,79 @@ bool config_get_bool(config_file_t *conf, const char *key, bool *in) { - const struct config_entry_list *entry = config_get_entry(conf, key, NULL); + const struct config_entry_list *entry = config_get_entry(conf, key); - if (entry) - { - if (string_is_equal(entry->value, "true")) - *in = true; - else if (string_is_equal(entry->value, "1")) - *in = true; - else if (string_is_equal(entry->value, "false")) - *in = false; - else if (string_is_equal(entry->value, "0")) - *in = false; - else - return false; - } + if (!entry) + return false; + + if ( + ( + entry->value[0] == '1' + && entry->value[1] == '\0' + ) + || string_is_equal(entry->value, "true") + ) + *in = true; + else if ( + ( + entry->value[0] == '0' + && entry->value[1] == '\0' + ) + || string_is_equal(entry->value, "false") + ) + *in = false; + else + return false; - return entry != NULL; + return true; } void config_set_string(config_file_t *conf, const char *key, const char *val) { - struct config_entry_list *last = (conf->guaranteed_no_duplicates && conf->last) ? conf->last : conf->entries; - struct config_entry_list *entry = conf->guaranteed_no_duplicates?NULL:config_get_entry(conf, key, &last); + struct config_entry_list *last = NULL; + struct config_entry_list *entry = NULL; - if (entry && !entry->readonly) - { - free(entry->value); - entry->value = strdup(val); + if (!conf || !key || !val) return; + + last = conf->entries; + + if (conf->guaranteed_no_duplicates) + { + if (conf->last) + last = conf->last; } + else + { + entry = config_get_entry_internal( + conf, key, &last); + if (entry) + { + /* An entry corresponding to 'key' already exists + * > Check whether value is currently set */ + if (entry->value) + { + /* Do nothing if value is unchanged */ + if (string_is_equal(entry->value, val)) + return; - if (!val) - return; + /* Value is to be updated + * > Free existing */ + free(entry->value); + } + + /* Update value + * > Note that once a value is set, it + * is no longer considered 'read only' */ + entry->value = strdup(val); + entry->readonly = false; + conf->modified = true; + return; + } + } + /* Entry corresponding to 'key' does not exist + * > Create new entry */ entry = (struct config_entry_list*)malloc(sizeof(*entry)); if (!entry) return; @@ -867,28 +1216,43 @@ entry->key = strdup(key); entry->value = strdup(val); entry->next = NULL; + conf->modified = true; if (last) last->next = entry; else conf->entries = entry; - conf->last = entry ; + conf->last = entry; + RHMAP_SET_STR(conf->entries_map, entry->key, entry); } void config_unset(config_file_t *conf, const char *key) { - struct config_entry_list *last = conf->entries; - struct config_entry_list *entry = config_get_entry(conf, key, &last); + struct config_entry_list *last = NULL; + struct config_entry_list *entry = NULL; + + if (!conf || !key) + return; + + last = conf->entries; + entry = config_get_entry_internal(conf, key, &last); if (!entry) return; - entry->key = NULL; - entry->value = NULL; - free(entry->key); - free(entry->value); + (void)RHMAP_DEL_STR(conf->entries_map, entry->key); + + if (entry->key) + free(entry->key); + + if (entry->value) + free(entry->value); + + entry->key = NULL; + entry->value = NULL; + conf->modified = true; } void config_set_path(config_file_t *conf, const char *entry, const char *val) @@ -906,9 +1270,7 @@ void config_set_double(config_file_t *conf, const char *key, double val) { - char buf[128]; - - buf[0] = '\0'; + char buf[320]; #ifdef __cplusplus snprintf(buf, sizeof(buf), "%f", (float)val); #elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L @@ -921,45 +1283,35 @@ void config_set_float(config_file_t *conf, const char *key, float val) { - char buf[128]; - - buf[0] = '\0'; + char buf[64]; snprintf(buf, sizeof(buf), "%f", val); config_set_string(conf, key, buf); } void config_set_int(config_file_t *conf, const char *key, int val) { - char buf[128]; - - buf[0] = '\0'; + char buf[16]; snprintf(buf, sizeof(buf), "%d", val); config_set_string(conf, key, buf); } void config_set_uint(config_file_t *conf, const char *key, unsigned int val) { - char buf[128]; - - buf[0] = '\0'; + char buf[16]; snprintf(buf, sizeof(buf), "%u", val); config_set_string(conf, key, buf); } void config_set_hex(config_file_t *conf, const char *key, unsigned val) { - char buf[128]; - - buf[0] = '\0'; + char buf[16]; snprintf(buf, sizeof(buf), "%x", val); config_set_string(conf, key, buf); } void config_set_uint64(config_file_t *conf, const char *key, uint64_t val) { - char buf[128]; - - buf[0] = '\0'; + char buf[32]; snprintf(buf, sizeof(buf), "%" PRIu64, val); config_set_string(conf, key, buf); } @@ -967,8 +1319,6 @@ void config_set_char(config_file_t *conf, const char *key, char val) { char buf[2]; - - buf[0] = '\0'; snprintf(buf, sizeof(buf), "%c", val); config_set_string(conf, key, buf); } @@ -980,24 +1330,28 @@ bool config_file_write(config_file_t *conf, const char *path, bool sort) { + if (!conf) + return false; + + if (!conf->modified) + return true; + if (!string_is_empty(path)) { - void* buf = NULL; #ifdef ORBIS - int fd = orbisOpen(path,O_RDWR|O_CREAT,0644); - RARCH_LOG("[Config]config_file_write orbisOpen path=%s fd=%d\n", path, fd); + int fd = orbisOpen(path,O_RDWR|O_CREAT,0644); if (fd < 0) return false; config_file_dump_orbis(conf,fd); orbisClose(fd); - RARCH_LOG("[Config]config_file_write orbisClose path=%s fd=%d\n", path, fd); #else + void* buf = NULL; FILE *file = (FILE*)fopen_utf8(path, "wb"); if (!file) return false; /* TODO: this is only useful for a few platforms, find which and add ifdef */ -#if !defined(PS2) && !defined(PSP) +#if !defined(PSP) buf = calloc(1, 0x4000); setvbuf(file, (char*)buf, _IOFBF, 0x4000); #endif @@ -1006,8 +1360,13 @@ if (file != stdout) fclose(file); - free(buf); + if (buf) + free(buf); #endif + + /* Only update modified flag if config file + * is actually written to disk */ + conf->modified = false; } else config_file_dump(conf, stdout, sort); @@ -1020,15 +1379,17 @@ { struct config_entry_list *list = NULL; struct config_include_list *includes = conf->includes; - while (includes) + + if (conf->reference) { - char cad[256]; - sprintf(cad,"#include %s\n", includes->path); - orbisWrite(fd,cad,strlen(cad)); - includes = includes->next; + pathname_make_slashes_portable(conf->reference); + fprintf(file, "#reference \"%s\"\n", conf->reference); } - list = merge_sort_linked_list((struct config_entry_list*)conf->entries, config_sort_compare_func); + + list = config_file_merge_sort_linked_list( + (struct config_entry_list*)conf->entries, + config_file_sort_compare_func); conf->entries = list; while (list) @@ -1036,11 +1397,27 @@ if (!list->readonly && list->key) { char newlist[256]; - sprintf(newlist,"%s = %s\n", list->key, list->value); - orbisWrite(fd,newlist,strlen(newlist)); + snprintf(newlist, sizeof(newlist), + "%s = %s\n", list->key, list->value); + orbisWrite(fd, newlist, strlen(newlist)); } list = list->next; } + + /* Config files are read from the top down - if + * duplicate entries are found then the topmost + * one in the list takes precedence. This means + * '#include' directives must go *after* individual + * config entries, otherwise they will override + * any custom-set values */ + while (includes) + { + char cad[256]; + snprintf(cad, sizeof(cad), + "#include %s\n", includes->path); + orbisWrite(fd, cad, strlen(cad)); + includes = includes->next; + } } #endif @@ -1049,14 +1426,16 @@ struct config_entry_list *list = NULL; struct config_include_list *includes = conf->includes; - while (includes) + if (conf->reference) { - fprintf(file, "#include \"%s\"\n", includes->path); - includes = includes->next; + pathname_make_slashes_portable(conf->reference); + fprintf(file, "#reference \"%s\"\n", conf->reference); } if (sort) - list = merge_sort_linked_list((struct config_entry_list*)conf->entries, config_sort_compare_func); + list = config_file_merge_sort_linked_list( + (struct config_entry_list*)conf->entries, + config_file_sort_compare_func); else list = (struct config_entry_list*)conf->entries; @@ -1068,20 +1447,23 @@ fprintf(file, "%s = \"%s\"\n", list->key, list->value); list = list->next; } -} - -bool config_entry_exists(config_file_t *conf, const char *entry) -{ - struct config_entry_list *list = conf->entries; - while (list) + /* Config files are read from the top down - if + * duplicate entries are found then the topmost + * one in the list takes precedence. This means + * '#include' directives must go *after* individual + * config entries, otherwise they will override + * any custom-set values */ + while (includes) { - if (string_is_equal(entry, list->key)) - return true; - list = list->next; + fprintf(file, "#include \"%s\"\n", includes->path); + includes = includes->next; } +} - return false; +bool config_entry_exists(config_file_t *conf, const char *entry) +{ + return (bool)RHMAP_HAS_STR(conf->entries_map, entry); } bool config_get_entry_list_head(config_file_t *conf, @@ -1113,70 +1495,11 @@ bool config_file_exists(const char *path) { - config_file_t *config = config_file_new(path); - if (!config) + config_file_t conf; + config_file_initialize(&conf); + if (config_file_load_internal(&conf, path, 0, NULL) == 1) return false; - config_file_free(config); + config_file_deinitialize(&conf); return true; } - -#if 0 -static void test_config_file_parse_contains( - const char * cfgtext, - const char *key, const char *val) -{ - config_file_t *cfg = config_file_new_from_string(cfgtext); - char *out = NULL; - bool ok = false; - - if (!cfg) - abort(); - - ok = config_get_string(cfg, key, &out); - if (ok != (bool)val) - abort(); - if (!val) - return; - - if (out == NULL) - out = strdup(""); - if (strcmp(out, val) != 0) - abort(); - free(out); -} - -static void test_config_file(void) -{ - test_config_file_parse_contains("foo = \"bar\"\n", "foo", "bar"); - test_config_file_parse_contains("foo = \"bar\"", "foo", "bar"); - test_config_file_parse_contains("foo = \"bar\"\r\n", "foo", "bar"); - test_config_file_parse_contains("foo = \"bar\"", "foo", "bar"); - -#if 0 - /* turns out it treats empty as nonexistent - - * should probably be fixed */ - test_config_file_parse_contains("foo = \"\"\n", "foo", ""); - test_config_file_parse_contains("foo = \"\"", "foo", ""); - test_config_file_parse_contains("foo = \"\"\r\n", "foo", ""); - test_config_file_parse_contains("foo = \"\"", "foo", ""); -#endif - - test_config_file_parse_contains("foo = \"\"\n", "bar", NULL); - test_config_file_parse_contains("foo = \"\"", "bar", NULL); - test_config_file_parse_contains("foo = \"\"\r\n", "bar", NULL); - test_config_file_parse_contains("foo = \"\"", "bar", NULL); -} - -/* compile with: - gcc config_file.c -g -I ../include/ \ - ../streams/file_stream.c ../vfs/vfs_implementation.c ../lists/string_list.c \ - ../compat/compat_strl.c file_path.c ../compat/compat_strcasestr.c \ - && ./a.out -*/ - -int main(void) -{ - test_config_file(); -} -#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/config_file_userdata.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/config_file_userdata.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (config_file_userdata.c). @@ -61,6 +61,24 @@ return got; } +int config_userdata_get_hex(void *userdata, const char *key_str, + unsigned *value, unsigned default_value) +{ + bool got; + char key[2][256]; + struct config_file_userdata *usr = (struct config_file_userdata*)userdata; + + fill_pathname_join_delim(key[0], usr->prefix[0], key_str, '_', sizeof(key[0])); + fill_pathname_join_delim(key[1], usr->prefix[1], key_str, '_', sizeof(key[1])); + + got = config_get_hex(usr->conf, key[0], value); + got = got || config_get_hex(usr->conf, key[1], value); + + if (!got) + *value = default_value; + return got; +} + int config_userdata_get_float_array(void *userdata, const char *key_str, float **values, unsigned *out_num_values, const float *default_values, unsigned num_default_values) @@ -76,12 +94,14 @@ config_get_string(usr->conf, key[1], &str)) { unsigned i; - struct string_list *list = string_split(str, " "); - *values = (float*)calloc(list->size, sizeof(float)); - for (i = 0; i < list->size; i++) - (*values)[i] = (float)strtod(list->elems[i].data, NULL); - *out_num_values = (unsigned)list->size; - string_list_free(list); + struct string_list list = {0}; + string_list_initialize(&list); + string_split_noalloc(&list, str, " "); + *values = (float*)calloc(list.size, sizeof(float)); + for (i = 0; i < list.size; i++) + (*values)[i] = (float)strtod(list.elems[i].data, NULL); + *out_num_values = (unsigned)list.size; + string_list_deinitialize(&list); free(str); return true; } @@ -106,12 +126,14 @@ config_get_string(usr->conf, key[1], &str)) { unsigned i; - struct string_list *list = string_split(str, " "); - *values = (int*)calloc(list->size, sizeof(int)); - for (i = 0; i < list->size; i++) - (*values)[i] = (int)strtod(list->elems[i].data, NULL); - *out_num_values = (unsigned)list->size; - string_list_free(list); + struct string_list list = {0}; + string_list_initialize(&list); + string_split_noalloc(&list, str, " "); + *values = (int*)calloc(list.size, sizeof(int)); + for (i = 0; i < list.size; i++) + (*values)[i] = (int)strtod(list.elems[i].data, NULL); + *out_num_values = (unsigned)list.size; + string_list_deinitialize(&list); free(str); return true; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/file_path.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/file_path.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2019 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (file_path.c). @@ -32,8 +32,7 @@ #include <file/file_path.h> #include <retro_assert.h> #include <string/stdstring.h> -#define VFS_FRONTEND -#include <vfs/vfs_implementation.h> +#include <time/rtime.h> /* TODO: There are probably some unnecessary things on this huge include list now but I'm too afraid to touch it */ #ifdef __APPLE__ @@ -46,61 +45,12 @@ #include <compat/strl.h> #include <compat/posix_string.h> #endif -#include <compat/strcasestr.h> #include <retro_miscellaneous.h> #include <encodings/utf.h> -#if defined(_WIN32) -#ifdef _MSC_VER -#define setmode _setmode -#endif -#include <sys/stat.h> -#ifdef _XBOX -#include <xtl.h> -#define INVALID_FILE_ATTRIBUTES -1 -#else -#include <io.h> -#include <fcntl.h> +#ifdef _WIN32 #include <direct.h> -#include <windows.h> -#if defined(_MSC_VER) && _MSC_VER <= 1200 -#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) -#endif -#endif -#elif defined(VITA) -#define SCE_ERROR_ERRNO_EEXIST 0x80010011 -#include <psp2/io/fcntl.h> -#include <psp2/io/dirent.h> -#include <psp2/io/stat.h> #else -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#endif - -#if defined(ORBIS) -#include <orbisFile.h> -#include <sys/fcntl.h> -#include <sys/dirent.h> -#endif -#if defined(PSP) -#include <pspkernel.h> -#endif - -#if defined(PS2) -#include <fileXio_rpc.h> -#include <fileXio.h> -#endif - -#if defined(__CELLOS_LV2__) -#include <cell/cell_fs.h> -#endif - -#if defined(VITA) -#define FIO_S_ISDIR SCE_S_ISDIR -#endif - -#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) #include <unistd.h> /* stat() is defined here */ #endif @@ -119,146 +69,6 @@ #endif -static retro_vfs_stat_t path_stat_cb = NULL; -static retro_vfs_mkdir_t path_mkdir_cb = NULL; - -void path_vfs_init(const struct retro_vfs_interface_info* vfs_info) -{ - const struct retro_vfs_interface* vfs_iface; - - path_stat_cb = NULL; - path_mkdir_cb = NULL; - - vfs_iface = vfs_info->iface; - - if (vfs_info->required_interface_version < PATH_REQUIRED_VFS_VERSION || !vfs_iface) - return; - - path_stat_cb = vfs_iface->stat; - path_mkdir_cb = vfs_iface->mkdir; -} - -static int path_stat(const char *path, int32_t *size) -{ - if (path_stat_cb != NULL) - return path_stat_cb(path, size); - return retro_vfs_stat_impl(path, size); -} - -static int path_mkdir_norecurse(const char *dir) -{ - if (path_mkdir_cb != NULL) - return path_mkdir_cb(dir); - return retro_vfs_mkdir_impl(dir); -} - -/** - * path_is_directory: - * @path : path - * - * Checks if path is a directory. - * - * Returns: true (1) if path is a directory, otherwise false (0). - */ -bool path_is_directory(const char *path) -{ -#ifdef ORBIS - /* TODO: This should be moved to the VFS module */ - int dfd; - if (!path) - return false; - dfd = orbisDopen(path); - if (dfd < 0) - return false; - orbisDclose(dfd); - return true; -#else - return (path_stat(path, NULL) & RETRO_VFS_STAT_IS_DIRECTORY) != 0; -#endif -} - -bool path_is_character_special(const char *path) -{ - return (path_stat(path, NULL) & RETRO_VFS_STAT_IS_CHARACTER_SPECIAL) != 0; -} - -bool path_is_valid(const char *path) -{ - return (path_stat(path, NULL) & RETRO_VFS_STAT_IS_VALID) != 0; -} - -int32_t path_get_size(const char *path) -{ - int32_t filesize = 0; - if (path_stat(path, &filesize) != 0) - return filesize; - - return -1; -} - -/** - * path_mkdir: - * @dir : directory - * - * Create directory on filesystem. - * - * Returns: true (1) if directory could be created, otherwise false (0). - **/ -bool path_mkdir(const char *dir) -{ - /* Use heap. Real chance of stack overflow if we recurse too hard. */ - const char *target = NULL; - bool sret = false; - bool norecurse = false; - char *basedir = NULL; - - if (dir && *dir) - basedir = strdup(dir); - - if (!basedir) - return false; - - path_parent_dir(basedir); - if (!*basedir || !strcmp(basedir, dir)) - goto end; - - if (path_is_directory(basedir)) - { - target = dir; - norecurse = true; - } - else - { - target = basedir; - sret = path_mkdir(basedir); - - if (sret) - { - target = dir; - norecurse = true; - } - } - - if (norecurse) - { - int ret = path_mkdir_norecurse(dir); - - /* Don't treat this as an error. */ - if (ret == -2 && path_is_directory(dir)) - ret = 0; - - if (ret < 0) - printf("mkdir(%s) error: %s.\n", dir, strerror(errno)); - sret = (ret == 0); - } - -end: - if (target && !sret) - printf("Failed to create directory: \"%s\".\n", target); - free(basedir); - return sret; -} - /** * path_get_archive_delim: * @path : path @@ -271,25 +81,48 @@ */ const char *path_get_archive_delim(const char *path) { - const char *last = find_last_slash(path); - const char *delim = NULL; + const char *last_slash = find_last_slash(path); + const char *delim = NULL; + char buf[5]; - if (last) + buf[0] = '\0'; + + if (!last_slash) + return NULL; + + /* Find delimiter position */ + delim = strrchr(last_slash, '#'); + + if (!delim) + return NULL; + + /* Check whether this is a known archive type + * > Note: The code duplication here is + * deliberate, to maximise performance */ + if (delim - last_slash > 4) { - delim = strcasestr(last, ".zip#"); + strlcpy(buf, delim - 4, sizeof(buf)); + buf[4] = '\0'; - if (!delim) - delim = strcasestr(last, ".apk#"); - } + string_to_lower(buf); - if (delim) - return delim + 4; + /* Check if this is a '.zip', '.apk' or '.7z' file */ + if (string_is_equal(buf, ".zip") || + string_is_equal(buf, ".apk") || + string_is_equal(buf + 1, ".7z")) + return delim; + } + else if (delim - last_slash > 3) + { + strlcpy(buf, delim - 3, sizeof(buf)); + buf[3] = '\0'; - if (last) - delim = strcasestr(last, ".7z#"); + string_to_lower(buf); - if (delim) - return delim + 3; + /* Check if this is a '.7z' file */ + if (string_is_equal(buf, ".7z")) + return delim; + } return NULL; } @@ -305,11 +138,10 @@ */ const char *path_get_extension(const char *path) { - const char *ext = !string_is_empty(path) - ? strrchr(path_basename(path), '.') : NULL; - if (!ext) - return ""; - return ext + 1; + const char *ext; + if (!string_is_empty(path) && ((ext = strrchr(path_basename(path), '.')))) + return ext + 1; + return ""; } /** @@ -348,12 +180,11 @@ bool path_is_compressed_file(const char* path) { const char *ext = path_get_extension(path); - - if ( strcasestr(ext, "zip") - || strcasestr(ext, "apk") - || strcasestr(ext, "7z")) - return true; - + if (!string_is_empty(ext)) + if ( string_is_equal_noncase(ext, "zip") || + string_is_equal_noncase(ext, "apk") || + string_is_equal_noncase(ext, "7z")) + return true; return false; } @@ -407,11 +238,11 @@ * present in 'in_path', it will be ignored. * */ -void fill_pathname_noext(char *out_path, const char *in_path, +size_t fill_pathname_noext(char *out_path, const char *in_path, const char *replace, size_t size) { strlcpy(out_path, in_path, size); - strlcat(out_path, replace, size); + return strlcat(out_path, replace, size); } char *find_last_slash(const char *str) @@ -420,10 +251,9 @@ #ifdef _WIN32 const char *backslash = strrchr(str, '\\'); - if (backslash && ((slash && backslash > slash) || !slash)) - slash = backslash; + if (!slash || (backslash > slash)) + return (char*)backslash; #endif - return (char*)slash; } @@ -437,21 +267,22 @@ **/ void fill_pathname_slash(char *path, size_t size) { - size_t path_len = strlen(path); + size_t path_len; const char *last_slash = find_last_slash(path); - /* Try to preserve slash type. */ - if (last_slash && (last_slash != (path + path_len - 1))) + if (!last_slash) { - char join_str[2]; - - join_str[0] = '\0'; + strlcat(path, PATH_DEFAULT_SLASH(), size); + return; + } - strlcpy(join_str, last_slash, sizeof(join_str)); - strlcat(path, join_str, size); + path_len = strlen(path); + /* Try to preserve slash type. */ + if (last_slash != (path + path_len - 1)) + { + path[path_len] = last_slash[0]; + path[path_len+1] = '\0'; } - else if (!last_slash) - strlcat(path, path_default_slash(), size); } /** @@ -471,7 +302,7 @@ * E.g..: in_dir = "/tmp/some_dir", in_basename = "/some_content/foo.c", * replace = ".asm" => in_dir = "/tmp/some_dir/foo.c.asm" **/ -void fill_pathname_dir(char *in_dir, const char *in_basename, +size_t fill_pathname_dir(char *in_dir, const char *in_basename, const char *replace, size_t size) { const char *base = NULL; @@ -479,7 +310,7 @@ fill_pathname_slash(in_dir, size); base = path_basename(in_basename); strlcat(in_dir, base, size); - strlcat(in_dir, replace, size); + return strlcat(in_dir, replace, size); } /** @@ -490,27 +321,29 @@ * * Copies basename of @in_path into @out_path. **/ -void fill_pathname_base(char *out, const char *in_path, size_t size) +size_t fill_pathname_base(char *out, const char *in_path, size_t size) { const char *ptr = path_basename(in_path); if (!ptr) ptr = in_path; - strlcpy(out, ptr, size); + return strlcpy(out, ptr, size); } -void fill_pathname_base_noext(char *out, const char *in_path, size_t size) +void fill_pathname_base_noext(char *out, + const char *in_path, size_t size) { fill_pathname_base(out, in_path, size); path_remove_extension(out); } -void fill_pathname_base_ext(char *out, const char *in_path, const char *ext, +size_t fill_pathname_base_ext(char *out, + const char *in_path, const char *ext, size_t size) { fill_pathname_base_noext(out, in_path, size); - strlcat(out, ext, size); + return strlcat(out, ext, size); } /** @@ -551,25 +384,28 @@ bool fill_pathname_parent_dir_name(char *out_dir, const char *in_dir, size_t size) { - char *temp = strdup(in_dir); - char *last = find_last_slash(temp); - bool ret = false; + bool success = false; + char *temp = strdup(in_dir); + char *last = find_last_slash(temp); + + if (last && last[1] == 0) + { + *last = '\0'; + last = find_last_slash(temp); + } - *last = '\0'; + if (last) + *last = '\0'; - in_dir = find_last_slash(temp); + in_dir = find_last_slash(temp); - if (in_dir && in_dir + 1) - { + success = in_dir && in_dir[1]; + + if (success) strlcpy(out_dir, in_dir + 1, size); - ret = true; - } - else - ret = false; free(temp); - - return ret; + return success; } /** @@ -602,14 +438,17 @@ * E.g.: * out_filename = "RetroArch-{month}{day}-{Hours}{Minutes}.{@ext}" **/ -void fill_dated_filename(char *out_filename, +size_t fill_dated_filename(char *out_filename, const char *ext, size_t size) { time_t cur_time = time(NULL); + struct tm tm_; + + rtime_localtime(&cur_time, &tm_); strftime(out_filename, size, - "RetroArch-%m%d-%H%M%S.", localtime(&cur_time)); - strlcat(out_filename, ext, size); + "RetroArch-%m%d-%H%M%S", &tm_); + return strlcat(out_filename, ext, size); } /** @@ -629,15 +468,26 @@ const char *in_str, const char *ext, size_t size) { char format[256]; + struct tm tm_; time_t cur_time = time(NULL); - format[0] = '\0'; + format[0] = '\0'; - strftime(format, sizeof(format), "-%y%m%d-%H%M%S.", localtime(&cur_time)); + rtime_localtime(&cur_time, &tm_); - fill_pathname_join_concat_noext(out_filename, - in_str, format, ext, - size); + if (string_is_empty(ext)) + { + strftime(format, sizeof(format), "-%y%m%d-%H%M%S", &tm_); + fill_pathname_noext(out_filename, in_str, format, size); + } + else + { + strftime(format, sizeof(format), "-%y%m%d-%H%M%S.", &tm_); + + fill_pathname_join_concat_noext(out_filename, + in_str, format, ext, + size); + } } /** @@ -650,6 +500,7 @@ void path_basedir(char *path) { char *last = NULL; + if (strlen(path) < 2) return; @@ -658,7 +509,7 @@ if (last) last[1] = '\0'; else - snprintf(path, 3, ".%s", path_default_slash()); + strlcpy(path, "." PATH_DEFAULT_SLASH(), 3); } /** @@ -671,12 +522,20 @@ **/ void path_parent_dir(char *path) { - bool path_was_absolute = path_is_absolute(path); - size_t len = strlen(path); - if (len && path_char_is_slash(path[len - 1])) + size_t len = 0; + + if (!path) + return; + + len = strlen(path); + + if (len && PATH_CHAR_IS_SLASH(path[len - 1])) { + bool path_was_absolute = path_is_absolute(path); + path[len - 1] = '\0'; - if (path_was_absolute && find_last_slash(path) == NULL) + + if (path_was_absolute && !find_last_slash(path)) { /* We removed the only slash from what used to be an absolute path. * On Linux, this goes from "/" to an empty string and everything works fine, @@ -700,17 +559,28 @@ **/ const char *path_basename(const char *path) { - /* We cut either at the first compression-related hash - * or the last slash; whichever comes last */ - const char *last = find_last_slash(path); + /* We cut at the first compression-related hash */ const char *delim = path_get_archive_delim(path); - if (delim) return delim + 1; + { + /* We cut at the last slash */ + const char *last = find_last_slash(path); + if (last) + return last + 1; + } + + return path; +} + +/* Specialized version */ +const char *path_basename_nocompression(const char *path) +{ + /* We cut at the last slash */ + const char *last = find_last_slash(path); if (last) return last + 1; - return path; } @@ -724,52 +594,202 @@ **/ bool path_is_absolute(const char *path) { + if (string_is_empty(path)) + return false; + if (path[0] == '/') return true; -#ifdef _WIN32 - /* Many roads lead to Rome ... */ - if (( strstr(path, "\\\\") == path) - || strstr(path, ":/") - || strstr(path, ":\\") - || strstr(path, ":\\\\")) - return true; -#elif defined(__wiiu__) - if (strstr(path, ":/")) + +#if defined(_WIN32) + /* Many roads lead to Rome... + * Note: Drive letter can only be 1 character long */ + if (string_starts_with_size(path, "\\\\", STRLEN_CONST("\\\\")) || + string_starts_with_size(path + 1, ":/", STRLEN_CONST(":/")) || + string_starts_with_size(path + 1, ":\\", STRLEN_CONST(":\\"))) return true; +#elif defined(__wiiu__) || defined(VITA) + { + const char *seperator = strchr(path, ':'); + if (seperator && (seperator[1] == '/')) + return true; + } #endif + return false; } /** * path_resolve_realpath: - * @buf : buffer for path + * @buf : input and output buffer for path * @size : size of buffer + * @resolve_symlinks : whether to resolve symlinks or not + * + * Resolves use of ".", "..", multiple slashes etc in absolute paths. * - * Turns relative paths into absolute path. - * If relative, rebases on current working dir. + * Relative paths are rebased on the current working dir. + * + * Returns: @buf if successful, NULL otherwise. + * Note: Not implemented on consoles + * Note: Symlinks are only resolved on Unix-likes + * Note: The current working dir might not be what you expect, + * e.g. on Android it is "/" + * Use of fill_pathname_resolve_relative() should be prefered **/ -void path_resolve_realpath(char *buf, size_t size) +char *path_resolve_realpath(char *buf, size_t size, bool resolve_symlinks) { #if !defined(RARCH_CONSOLE) && defined(RARCH_INTERNAL) char tmp[PATH_MAX_LENGTH]; - - tmp[0] = '\0'; - - strlcpy(tmp, buf, sizeof(tmp)); - #ifdef _WIN32 + strlcpy(tmp, buf, sizeof(tmp)); if (!_fullpath(buf, tmp, size)) + { strlcpy(buf, tmp, size); + return NULL; + } + return buf; #else + size_t t; + char *p; + const char *next; + const char *buf_end; - /* NOTE: realpath() expects at least PATH_MAX_LENGTH bytes in buf. - * Technically, PATH_MAX_LENGTH needn't be defined, but we rely on it anyways. - * POSIX 2008 can automatically allocate for you, - * but don't rely on that. */ - if (!realpath(tmp, buf)) - strlcpy(buf, tmp, size); + if (resolve_symlinks) + { + strlcpy(tmp, buf, sizeof(tmp)); + + /* NOTE: realpath() expects at least PATH_MAX_LENGTH bytes in buf. + * Technically, PATH_MAX_LENGTH needn't be defined, but we rely on it anyways. + * POSIX 2008 can automatically allocate for you, + * but don't rely on that. */ + if (!realpath(tmp, buf)) + { + strlcpy(buf, tmp, size); + return NULL; + } + + return buf; + } + + t = 0; /* length of output */ + buf_end = buf + strlen(buf); + + if (!path_is_absolute(buf)) + { + size_t len; + /* rebase on working directory */ + if (!getcwd(tmp, PATH_MAX_LENGTH-1)) + return NULL; + + len = strlen(tmp); + t += len; + + if (tmp[len-1] != '/') + tmp[t++] = '/'; + + if (string_is_empty(buf)) + goto end; + + p = buf; + } + else + { + /* UNIX paths can start with multiple '/', copy those */ + for (p = buf; *p == '/'; p++) + tmp[t++] = '/'; + } + + /* p points to just after a slash while 'next' points to the next slash + * if there are no slashes, they point relative to where one would be */ + do + { + next = strchr(p, '/'); + if (!next) + next = buf_end; + + if ((next - p == 2 && p[0] == '.' && p[1] == '.')) + { + p += 3; + + /* fail for illegal /.., //.. etc */ + if (t == 1 || tmp[t-2] == '/') + return NULL; + + /* delete previous segment in tmp by adjusting size t + * tmp[t-1] == '/', find '/' before that */ + t = t-2; + while (tmp[t] != '/') + t--; + t++; + } + else if (next - p == 1 && p[0] == '.') + p += 2; + else if (next - p == 0) + p += 1; + else + { + /* fail when truncating */ + if (t + next-p+1 > PATH_MAX_LENGTH-1) + return NULL; + + while (p <= next) + tmp[t++] = *p++; + } + + } + while (next < buf_end); + +end: + tmp[t] = '\0'; + strlcpy(buf, tmp, size); + return buf; #endif #endif + return NULL; +} + +/** + * path_relative_to: + * @out : buffer to write the relative path to + * @path : path to be expressed relatively + * @base : base directory to start out on + * @size : size of output buffer + * + * Turns @path into a path relative to @base and writes it to @out. + * + * @base is assumed to be a base directory, i.e. a path ending with '/' or '\'. + * Both @path and @base are assumed to be absolute paths without "." or "..". + * + * E.g. path /a/b/e/f.cg with base /a/b/c/d/ turns into ../../e/f.cg + **/ +size_t path_relative_to(char *out, + const char *path, const char *base, size_t size) +{ + size_t i, j; + const char *trimmed_path, *trimmed_base; + +#ifdef _WIN32 + /* For different drives, return absolute path */ + if (strlen(path) >= 2 && strlen(base) >= 2 + && path[1] == ':' && base[1] == ':' + && path[0] != base[0]) + return strlcpy(out, path, size); +#endif + + /* Trim common beginning */ + for (i = 0, j = 0; path[i] && base[i] && path[i] == base[i]; i++) + if (path[i] == PATH_DEFAULT_SLASH_C()) + j = i + 1; + + trimmed_path = path+j; + trimmed_base = base+i; + + /* Each segment of base turns into ".." */ + out[0] = '\0'; + for (i = 0; trimmed_base[i]; i++) + if (trimmed_base[i] == PATH_DEFAULT_SLASH_C()) + strlcat(out, ".." PATH_DEFAULT_SLASH(), size); + + return strlcat(out, trimmed_path, size); } /** @@ -795,6 +815,7 @@ fill_pathname_basedir(out_path, in_refpath, size); strlcat(out_path, in_path, size); + path_resolve_realpath(out_path, size, false); } /** @@ -808,7 +829,7 @@ * Makes sure not to get two consecutive slashes * between directory and path. **/ -void fill_pathname_join(char *out_path, +size_t fill_pathname_join(char *out_path, const char *dir, const char *path, size_t size) { if (out_path != dir) @@ -817,10 +838,10 @@ if (*out_path) fill_pathname_slash(out_path, size); - strlcat(out_path, path, size); + return strlcat(out_path, path, size); } -void fill_pathname_join_special_ext(char *out_path, +size_t fill_pathname_join_special_ext(char *out_path, const char *dir, const char *path, const char *last, const char *ext, size_t size) @@ -830,26 +851,25 @@ fill_pathname_slash(out_path, size); strlcat(out_path, last, size); - strlcat(out_path, ext, size); + return strlcat(out_path, ext, size); } -void fill_pathname_join_concat_noext( - char *out_path, +size_t fill_pathname_join_concat_noext(char *out_path, const char *dir, const char *path, const char *concat, size_t size) { fill_pathname_noext(out_path, dir, path, size); - strlcat(out_path, concat, size); + return strlcat(out_path, concat, size); } -void fill_pathname_join_concat(char *out_path, +size_t fill_pathname_join_concat(char *out_path, const char *dir, const char *path, const char *concat, size_t size) { fill_pathname_join(out_path, dir, path, size); - strlcat(out_path, concat, size); + return strlcat(out_path, concat, size); } void fill_pathname_join_noext(char *out_path, @@ -870,7 +890,7 @@ * Joins a directory (@dir) and path (@path) together * using the given delimiter (@delim). **/ -void fill_pathname_join_delim(char *out_path, const char *dir, +size_t fill_pathname_join_delim(char *out_path, const char *dir, const char *path, const char delim, size_t size) { size_t copied; @@ -884,15 +904,16 @@ out_path[copied+1] = '\0'; if (path) - strlcat(out_path, path, size); + copied = strlcat(out_path, path, size); + return copied; } -void fill_pathname_join_delim_concat(char *out_path, const char *dir, +size_t fill_pathname_join_delim_concat(char *out_path, const char *dir, const char *path, const char delim, const char *concat, size_t size) { fill_pathname_join_delim(out_path, dir, path, delim, size); - strlcat(out_path, concat, size); + return strlcat(out_path, concat, size); } /** @@ -910,7 +931,7 @@ * E.g.: "/path/to/game.img" -> game.img * "/path/to/myarchive.7z#folder/to/game.img" -> game.img */ -void fill_short_pathname_representation(char* out_rep, +size_t fill_short_pathname_representation(char* out_rep, const char *in_path, size_t size) { char path_short[PATH_MAX_LENGTH]; @@ -920,7 +941,7 @@ fill_pathname(path_short, path_basename(in_path), "", sizeof(path_short)); - strlcpy(out_rep, path_short, size); + return strlcpy(out_rep, path_short, size); } void fill_short_pathname_representation_noext(char* out_rep, @@ -951,13 +972,13 @@ out_path += src_size; size -= src_size; - if (!path_char_is_slash(out_path[-1])) + if (!PATH_CHAR_IS_SLASH(out_path[-1])) { - src_size = strlcpy(out_path, path_default_slash(), size); + src_size = strlcpy(out_path, PATH_DEFAULT_SLASH(), size); retro_assert(src_size < size); out_path += src_size; - size -= src_size; + size -= src_size; } in_path += 2; @@ -982,13 +1003,13 @@ out_path += src_size; size -= src_size; - if (!path_char_is_slash(out_path[-1])) + if (!PATH_CHAR_IS_SLASH(out_path[-1])) { - src_size = strlcpy(out_path, path_default_slash(), size); + src_size = strlcpy(out_path, PATH_DEFAULT_SLASH(), size); retro_assert(src_size < size); out_path += src_size; - size -= src_size; + size -= src_size; } in_path += 2; @@ -1008,10 +1029,11 @@ unsigned i; const char *candidates[3]; const char *notations[3]; - char *application_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - char *home_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char application_dir[PATH_MAX_LENGTH]; + char home_dir[PATH_MAX_LENGTH]; application_dir[0] = '\0'; + home_dir[0] = '\0'; /* application_dir could be zero-string. Safeguard against this. * @@ -1028,15 +1050,13 @@ notations [1] = "~"; notations [2] = NULL; - fill_pathname_application_dir(application_dir, - PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_home_dir(home_dir, - PATH_MAX_LENGTH * sizeof(char)); + fill_pathname_application_dir(application_dir, sizeof(application_dir)); + fill_pathname_home_dir(home_dir, sizeof(home_dir)); for (i = 0; candidates[i]; i++) { if (!string_is_empty(candidates[i]) && - strstr(in_path, candidates[i]) == in_path) + string_starts_with(in_path, candidates[i])) { size_t src_size = strlcpy(out_path, notations[i], size); @@ -1046,10 +1066,9 @@ size -= src_size; in_path += strlen(candidates[i]); - if (!path_char_is_slash(*in_path)) + if (!PATH_CHAR_IS_SLASH(*in_path)) { - retro_assert(strlcpy(out_path, - path_default_slash(), size) < size); + strcpy_literal(out_path, PATH_DEFAULT_SLASH()); out_path++; size--; } @@ -1058,13 +1077,103 @@ } } - free(application_dir); - free(home_dir); #endif retro_assert(strlcpy(out_path, in_path, size) < size); } +/* Changes the slashes to the correct kind for the os + * So forward slash on linux and backslash on Windows */ +void pathname_conform_slashes_to_os(char *path) +{ + /* Conform slashes to os standard so we get proper matching */ + char* p; + for (p = path; *p; p++) + if (*p == '/' || *p == '\\') + *p = PATH_DEFAULT_SLASH_C(); +} + +/* Change all shashes to forward so they are more portable between windows and linux */ +void pathname_make_slashes_portable(char *path) +{ + /* Conform slashes to os standard so we get proper matching */ + char* p; + for (p = path; *p; p++) + if (*p == '/' || *p == '\\') + *p = '/'; +} + +/* Get the number of slashes in a path, returns an integer */ +int get_pathname_num_slashes(const char *in_path) +{ + int num_slashes = 0; + int i = 0; + + for (i = 0; i < PATH_MAX_LENGTH; i++) + { + if (PATH_CHAR_IS_SLASH(in_path[i])) + num_slashes++; + if (in_path[i] == '\0') + break; + } + + return num_slashes; +} + +/* Fills the supplied path with either the abbreviated path or the relative path, which ever + * one is has less depth / number of slashes + * If lengths of abbreviated and relative paths are the same the relative path will be used + * in_path can be an absolute, relative or abbreviated path */ +void fill_pathname_abbreviated_or_relative(char *out_path, const char *in_refpath, const char *in_path, size_t size) +{ + char in_path_conformed[PATH_MAX_LENGTH]; + char in_refpath_conformed[PATH_MAX_LENGTH]; + char expanded_path[PATH_MAX_LENGTH]; + char absolute_path[PATH_MAX_LENGTH]; + char relative_path[PATH_MAX_LENGTH]; + char abbreviated_path[PATH_MAX_LENGTH]; + + in_path_conformed[0] = '\0'; + in_refpath_conformed[0] = '\0'; + absolute_path[0] = '\0'; + relative_path[0] = '\0'; + abbreviated_path[0] = '\0'; + + strcpy_literal(in_path_conformed, in_path); + strcpy_literal(in_refpath_conformed, in_refpath); + + pathname_conform_slashes_to_os(in_path_conformed); + pathname_conform_slashes_to_os(in_refpath_conformed); + + /* Expand paths which start with :\ to an absolute path */ + fill_pathname_expand_special(expanded_path, + in_path_conformed, sizeof(expanded_path)); + + /* Get the absolute path if it is not already */ + if (path_is_absolute(expanded_path)) + strlcpy(absolute_path, expanded_path, PATH_MAX_LENGTH); + else + fill_pathname_resolve_relative(absolute_path, + in_refpath_conformed, in_path_conformed, PATH_MAX_LENGTH); + + pathname_conform_slashes_to_os(absolute_path); + + /* Get the relative path and see how many directories long it is */ + path_relative_to(relative_path, absolute_path, + in_refpath_conformed, sizeof(relative_path)); + + /* Get the abbreviated path and see how many directories long it is */ + fill_pathname_abbreviate_special(abbreviated_path, + absolute_path, sizeof(abbreviated_path)); + + /* Use the shortest path, preferring the relative path*/ + if ( get_pathname_num_slashes(relative_path) <= + get_pathname_num_slashes(abbreviated_path)) + retro_assert(strlcpy(out_path, relative_path, size) < size); + else + retro_assert(strlcpy(out_path, abbreviated_path, size) < size); +} + /** * path_basedir: * @path : path @@ -1090,7 +1199,7 @@ if (last) last[1] = '\0'; else - snprintf(path, 3, ".%s", path_default_slash()); + strlcpy(path, "." PATH_DEFAULT_SLASH(), 3); } #if !defined(RARCH_CONSOLE) && defined(RARCH_INTERNAL) @@ -1134,13 +1243,30 @@ #elif defined(__APPLE__) if (bundle) { - CFURLRef bundle_url = CFBundleCopyBundleURL(bundle); + CFURLRef bundle_url = CFBundleCopyBundleURL(bundle); CFStringRef bundle_path = CFURLCopyPath(bundle_url); CFStringGetCString(bundle_path, s, len, kCFStringEncodingUTF8); +#ifdef HAVE_COCOATOUCH + { + /* This needs to be done so that the path becomes + * /private/var/... and this + * is used consistently throughout for the iOS bundle path */ + char resolved_bundle_dir_buf[PATH_MAX_LENGTH] = {0}; + if (realpath(s, resolved_bundle_dir_buf)) + { + strlcpy(s, resolved_bundle_dir_buf, len - 1); + strlcat(s, "/", len); + } + } +#endif + CFRelease(bundle_path); CFRelease(bundle_url); - +#ifndef HAVE_COCOATOUCH + /* Not sure what this does but it breaks + * stuff for iOS, so skipping */ retro_assert(strlcat(s, "nobin", len) < len); +#endif return; } #elif defined(__HAIKU__) @@ -1155,7 +1281,7 @@ #elif defined(__QNX__) char *buff = malloc(len); - if(_cmdname(buff)) + if (_cmdname(buff)) strlcpy(s, buff, len); free(buff); @@ -1200,13 +1326,28 @@ void fill_pathname_home_dir(char *s, size_t len) { #ifdef __WINRT__ - strlcpy(s, uwp_dir_data, len); + const char *home = uwp_dir_data; #else const char *home = getenv("HOME"); +#endif if (home) strlcpy(s, home, len); else *s = 0; -#endif } #endif + +bool is_path_accessible_using_standard_io(const char *path) +{ +#ifdef __WINRT__ + char relative_path_abbrev[PATH_MAX_LENGTH]; + fill_pathname_abbreviate_special(relative_path_abbrev, + path, sizeof(relative_path_abbrev)); + return (strlen(relative_path_abbrev) >= 2 ) + && ( relative_path_abbrev[0] == ':' + || relative_path_abbrev[0] == '~') + && PATH_CHAR_IS_SLASH(relative_path_abbrev[1]); +#else + return true; +#endif +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/file_path_io.c
Added
@@ -0,0 +1,151 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (file_path_io.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <errno.h> + +#include <sys/stat.h> + +#include <boolean.h> +#include <file/file_path.h> +#include <retro_assert.h> +#include <compat/strl.h> +#include <compat/posix_string.h> +#include <retro_miscellaneous.h> +#include <string/stdstring.h> +#define VFS_FRONTEND +#include <vfs/vfs_implementation.h> + +#ifdef _WIN32 +#include <direct.h> +#else +#include <unistd.h> /* stat() is defined here */ +#endif + +/* TODO/FIXME - globals */ +static retro_vfs_stat_t path_stat_cb = retro_vfs_stat_impl; +static retro_vfs_mkdir_t path_mkdir_cb = retro_vfs_mkdir_impl; + +void path_vfs_init(const struct retro_vfs_interface_info* vfs_info) +{ + const struct retro_vfs_interface* + vfs_iface = vfs_info->iface; + + path_stat_cb = retro_vfs_stat_impl; + path_mkdir_cb = retro_vfs_mkdir_impl; + + if (vfs_info->required_interface_version < PATH_REQUIRED_VFS_VERSION || !vfs_iface) + return; + + path_stat_cb = vfs_iface->stat; + path_mkdir_cb = vfs_iface->mkdir; +} + +int path_stat(const char *path) +{ + return path_stat_cb(path, NULL); +} + +/** + * path_is_directory: + * @path : path + * + * Checks if path is a directory. + * + * Returns: true (1) if path is a directory, otherwise false (0). + */ +bool path_is_directory(const char *path) +{ + return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_DIRECTORY) != 0; +} + +bool path_is_character_special(const char *path) +{ + return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_CHARACTER_SPECIAL) != 0; +} + +bool path_is_valid(const char *path) +{ + return (path_stat_cb(path, NULL) & RETRO_VFS_STAT_IS_VALID) != 0; +} + +int32_t path_get_size(const char *path) +{ + int32_t filesize = 0; + if (path_stat_cb(path, &filesize) != 0) + return filesize; + + return -1; +} + +/** + * path_mkdir: + * @dir : directory + * + * Create directory on filesystem. + * + * Returns: true (1) if directory could be created, otherwise false (0). + **/ +bool path_mkdir(const char *dir) +{ + bool norecurse = false; + char *basedir = NULL; + + if (!(dir && *dir)) + return false; + + /* Use heap. Real chance of stack + * overflow if we recurse too hard. */ + basedir = strdup(dir); + + if (!basedir) + return false; + + path_parent_dir(basedir); + + if (!*basedir || !strcmp(basedir, dir)) + { + free(basedir); + return false; + } + + if ( path_is_directory(basedir) + || path_mkdir(basedir)) + norecurse = true; + + free(basedir); + + if (norecurse) + { + int ret = path_mkdir_cb(dir); + + /* Don't treat this as an error. */ + if (ret == -2 && path_is_directory(dir)) + return true; + else if (ret == 0) + return true; + } + return false; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/nbio/nbio_intf.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/nbio/nbio_intf.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio_intf.c). @@ -37,11 +37,29 @@ #endif extern nbio_intf_t nbio_stdio; +#ifndef _XBOX +#if defined(_WIN32) +#if defined(_MSC_VER) && _MSC_VER >= 1500 + +#ifndef HAVE_MMAP_WIN32 +#define HAVE_MMAP_WIN32 +#endif + +#elif !defined(_MSC_VER) + +#ifndef HAVE_MMAP_WIN32 +#define HAVE_MMAP_WIN32 +#endif +#endif +#endif + +#endif + #if defined(_linux__) static nbio_intf_t *internal_nbio = &nbio_linux; #elif defined(HAVE_MMAP) && defined(BSD) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; -#elif defined(_WIN32) && !defined(_XBOX) +#elif defined(HAVE_MMAP_WIN32) static nbio_intf_t *internal_nbio = &nbio_mmap_win32; #elif defined(ORBIS) static nbio_intf_t *internal_nbio = &nbio_orbis;
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/nbio/nbio_linux.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/nbio/nbio_linux.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio_linux.c). @@ -31,6 +31,7 @@ #include <stdlib.h> #include <stdint.h> #include <string.h> +#include <time.h> #include <unistd.h> #include <fcntl.h> @@ -39,14 +40,12 @@ struct nbio_linux_t { - int fd; - bool busy; - + void* ptr; aio_context_t ctx; struct iocb cb; - - void* ptr; size_t len; + int fd; + bool busy; }; /* there's also a Unix AIO thingy, but it's not in glibc @@ -92,10 +91,7 @@ handle->cb.aio_nbytes = handle->len; if (io_submit(handle->ctx, 1, &cbp) != 1) - { - puts("ERROR - io_submit() failed"); abort(); - } handle->busy = true; } @@ -160,21 +156,16 @@ if (!handle) return; + /* This works perfectly fine if this check is removed, but it + * won't work on other nbio implementations */ + /* therefore, it's blocked so nobody accidentally relies on it */ if (len < handle->len) - { - /* this works perfectly fine if this check is removed, but it - * won't work on other nbio implementations */ - /* therefore, it's blocked so nobody accidentally relies on it */ - puts("ERROR - attempted file shrink operation, not implemented"); abort(); - } if (ftruncate(handle->fd, len) != 0) - { - puts("ERROR - couldn't resize file (ftruncate)"); abort(); /* this one returns void and I can't find any other way for it to report failure */ - } + handle->ptr = realloc(handle->ptr, len); handle->len = len; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/nbio/nbio_orbis.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/nbio/nbio_orbis.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio_orbis.c). @@ -31,10 +31,11 @@ struct nbio_orbis_t { - int fd; void* data; size_t progress; size_t len; + int fd; + unsigned int mode; /* * possible values: * NBIO_READ, NBIO_WRITE - obvious @@ -42,7 +43,6 @@ * -2 - the pointer was reallocated since the last operation */ signed char op; - unsigned int mode; }; static void *nbio_orbis_open(const char * filename, unsigned int mode) @@ -54,8 +54,6 @@ size_t len = 0; int fd = orbisOpen(filename, o_flags[mode], 0644); - RARCH_LOG("[NBIO_ORBIS] open %s\n" , filename); - if (fd < 0) return NULL; handle = (struct nbio_orbis_t*)malloc(sizeof(struct nbio_orbis_t)); @@ -81,11 +79,6 @@ if (len) buf = malloc(len); - if (!buf) - { - RARCH_LOG("[NBIO_ORBIS] open error malloc %d bytes\n",len); - } - if (len && !buf) goto error; @@ -99,7 +92,6 @@ error: if (handle) free(handle); - RARCH_LOG("[NBIO_ORBIS] open error closing %s\n" , filename); orbisClose(fd); return NULL; } @@ -110,13 +102,9 @@ struct nbio_orbis_t *handle = (struct nbio_orbis_t*)data; if (!handle) return; - RARCH_LOG("[NBIO_ORBIS] begin read fd=%d\n", handle->fd ); if (handle->op >= 0) - { - RARCH_LOG("[NBIO_ORBIS] ERROR - attempted file read operation while busy\n"); return; - } orbisLseek(handle->fd, 0, SEEK_SET); @@ -129,13 +117,9 @@ struct nbio_orbis_t *handle = (struct nbio_orbis_t*)data; if (!handle) return; - RARCH_LOG("[NBIO_ORBIS] begin write fd=%d\n", handle->fd ); if (handle->op >= 0) - { - RARCH_LOG("[NBIO_ORBIS] ERROR - attempted file write operation while busy\n"); return; - } orbisLseek(handle->fd, 0, SEEK_SET); handle->op = NBIO_WRITE; @@ -149,7 +133,6 @@ if (!handle) return false; - RARCH_LOG("[NBIO_ORBIS] begin iterate fd=%d\n", handle->fd ); if (amount > handle->len - handle->progress) amount = handle->len - handle->progress; @@ -158,16 +141,7 @@ { case NBIO_READ: if (handle->mode == BIO_READ) - { amount = handle->len; - RARCH_LOG("[NBIO_ORBIS] iterate BIO_READ fd=%d readbytes=%d\n", handle->fd, orbisRead(handle->fd, (char*)handle->data, amount)); - - } - else - { - RARCH_LOG("[NBIO_ORBIS] iterate read fd=%d handle->progress=%d readbytes=%d\n", handle->fd, handle->progress, orbisRead(handle->fd, (char*)handle->data + handle->progress, amount)); - - } break; case NBIO_WRITE: if (handle->mode == BIO_WRITE) @@ -175,25 +149,14 @@ size_t written = 0; amount = handle->len; written = orbisWrite(handle->fd, (char*)handle->data, amount); - RARCH_LOG("[NBIO_ORBIS] iterate BIO_WRITE fd=%d writebytes=%d\n", handle->fd, written); if (written != amount) - { - RARCH_LOG("[NBIO_ORBIS] iterate BIO_WRITE error fd=%d amount=%d != writebytes=%d\n", handle->fd, amount, written); - return false; - } - } - else - { - RARCH_LOG("[NBIO_ORBIS] iterate write fd=%d writebytes=%d\n", handle->fd, orbisWrite(handle->fd, (char*)handle->data + handle->progress, amount)); - } break; } handle->progress += amount; - RARCH_LOG("[NBIO_ORBIS] end iterate fd=%d\n", handle->fd ); if (handle->progress == handle->len) handle->op = -1; @@ -207,15 +170,9 @@ return; if (handle->op >= 0) - { - RARCH_LOG("[NBIO_ORBIS] ERROR - attempted file resize operation while busy\n"); return; - } if (len < handle->len) - { - RARCH_LOG("[NBIO_ORBIS] ERROR - attempted file shrink operation, not implemented"); return; - } handle->len = len; handle->data = realloc(handle->data, handle->len); @@ -228,7 +185,6 @@ struct nbio_orbis_t *handle = (struct nbio_orbis_t*)data; if (!handle) return NULL; - RARCH_LOG("[NBIO_ORBIS] get pointer\n"); if (len) *len = handle->len; if (handle->op == -1) @@ -241,7 +197,6 @@ struct nbio_orbis_t *handle = (struct nbio_orbis_t*)data; if (!handle) return; - RARCH_LOG("[NBIO_ORBIS] cancel \n"); handle->op = -1; handle->progress = handle->len; } @@ -251,14 +206,9 @@ struct nbio_orbis_t *handle = (struct nbio_orbis_t*)data; if (!handle) return; - RARCH_LOG("[NBIO_ORBIS] begin free fd=%d\n", handle->fd ); if (handle->op >= 0) - { - RARCH_LOG("[NBIO_ORBIS] ERROR - attempted free() while busy\n"); return; - } - RARCH_LOG("[NBIO_ORBIS] free close fd=%d\n",handle->fd); orbisClose(handle->fd); free(handle->data);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/nbio/nbio_stdio.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/nbio/nbio_stdio.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio_stdio.c). @@ -35,6 +35,18 @@ #endif +#if defined(_WIN32) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#define ATLEAST_VC2005 +#endif +#endif + +#if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0) >= 200112) || (defined(__POSIX_VISIBLE) && __POSIX_VISIBLE >= 200112) || (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112) || __USE_LARGEFILE || (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) +#ifndef HAVE_64BIT_OFFSETS +#define HAVE_64BIT_OFFSETS +#endif +#endif + struct nbio_stdio_t { FILE* f; @@ -57,11 +69,35 @@ static const wchar_t *stdio_modes[] = { L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; #endif +static int64_t fseek_wrap(FILE *f, int64_t offset, int origin) +{ +#ifdef ATLEAST_VC2005 + /* VC2005 and up have a special 64-bit fseek */ + return _fseeki64(f, offset, origin); +#elif defined(HAVE_64BIT_OFFSETS) + return fseeko(f, (off_t)offset, origin); +#else + return fseek(f, (long)offset, origin); +#endif +} + +static int64_t ftell_wrap(FILE *f) +{ +#ifdef ATLEAST_VC2005 + /* VC2005 and up have a special 64-bit ftell */ + return _ftelli64(f); +#elif defined(HAVE_64BIT_OFFSETS) + return ftello(f); +#else + return ftell(f); +#endif +} + static void *nbio_stdio_open(const char * filename, unsigned mode) { void *buf = NULL; struct nbio_stdio_t* handle = NULL; - size_t len = 0; + int64_t len = 0; #if !defined(_WIN32) || defined(LEGACY_WIN32) FILE* f = fopen(filename, stdio_modes[mode]); #else @@ -87,15 +123,15 @@ case BIO_WRITE: break; default: - fseek(handle->f, 0, SEEK_END); - len = ftell(handle->f); + fseek_wrap(handle->f, 0, SEEK_END); + len = ftell_wrap(handle->f); break; } handle->mode = mode; if (len) - buf = malloc(len); + buf = malloc((size_t)len); if (len && !buf) goto error; @@ -121,12 +157,9 @@ return; if (handle->op >= 0) - { - puts("ERROR - attempted file read operation while busy"); abort(); - } - fseek(handle->f, 0, SEEK_SET); + fseek_wrap(handle->f, 0, SEEK_SET); handle->op = NBIO_READ; handle->progress = 0; @@ -139,12 +172,9 @@ return; if (handle->op >= 0) - { - puts("ERROR - attempted file write operation while busy"); abort(); - } - fseek(handle->f, 0, SEEK_SET); + fseek_wrap(handle->f, 0, SEEK_SET); handle->op = NBIO_WRITE; handle->progress = 0; } @@ -200,15 +230,9 @@ return; if (handle->op >= 0) - { - puts("ERROR - attempted file resize operation while busy"); abort(); - } if (len < handle->len) - { - puts("ERROR - attempted file shrink operation, not implemented"); abort(); - } handle->len = len; handle->progress = len; @@ -248,10 +272,7 @@ if (!handle) return; if (handle->op >= 0) - { - puts("ERROR - attempted free() while busy"); abort(); - } fclose(handle->f); free(handle->data);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/nbio/nbio_unixmmap.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/nbio/nbio_unixmmap.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio_unixmmap.c). @@ -55,10 +55,10 @@ struct nbio_mmap_unix_t { + void* ptr; + size_t len; int fd; int map_flags; - size_t len; - void* ptr; }; static void *nbio_mmap_unix_open(const char * filename, unsigned mode) @@ -116,16 +116,12 @@ /* this works perfectly fine if this check is removed, but it * won't work on other nbio implementations */ /* therefore, it's blocked so nobody accidentally relies on it */ - puts("ERROR - attempted file shrink operation, not implemented"); abort(); } if (ftruncate(handle->fd, len) != 0) - { - puts("ERROR - couldn't resize file (ftruncate)"); abort(); /* this one returns void and I can't find any other way for it to report failure */ - } munmap(handle->ptr, handle->len); @@ -133,10 +129,7 @@ handle->len = len; if (handle->ptr == MAP_FAILED) - { - puts("ERROR - couldn't resize file (mmap)"); abort(); - } } static void *nbio_mmap_unix_get_ptr(void *data, size_t* len)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/nbio/nbio_windowsmmap.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/nbio/nbio_windowsmmap.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio_windowsmmap.c). @@ -22,7 +22,23 @@ #include <file/nbio.h> -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) +#if defined(_MSC_VER) && _MSC_VER >= 1500 + +#ifndef HAVE_MMAP_WIN32 +#define HAVE_MMAP_WIN32 +#endif + +#elif !defined(_MSC_VER) + +#ifndef HAVE_MMAP_WIN32 +#define HAVE_MMAP_WIN32 +#endif +#endif + +#endif + +#if defined(HAVE_MMAP_WIN32) #include <stdio.h> #include <stdlib.h> @@ -47,9 +63,9 @@ struct nbio_mmap_win32_t { HANDLE file; - bool is_write; - size_t len; void* ptr; + size_t len; + bool is_write; }; static void *nbio_mmap_win32_open(const char * filename, unsigned mode) @@ -144,7 +160,6 @@ * but it won't work on other nbio implementations */ /* therefore, it's blocked so nobody accidentally * relies on it. */ - puts("ERROR - attempted file shrink operation, not implemented"); abort(); } @@ -158,10 +173,7 @@ #endif if (!SetEndOfFile(handle->file)) - { - puts("ERROR - couldn't resize file (SetEndOfFile)"); abort(); /* this one returns void and I can't find any other way for it to report failure */ - } handle->len = len; UnmapViewOfFile(handle->ptr); @@ -170,10 +182,7 @@ CloseHandle(mem); if (!handle->ptr) - { - puts("ERROR - couldn't resize file (MapViewOfFile)"); abort(); - } } static void *nbio_mmap_win32_get_ptr(void *data, size_t* len)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/file/retro_dirent.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/file/retro_dirent.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2019 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_dirent.c). @@ -31,37 +31,41 @@ #define VFS_FRONTEND #include <vfs/vfs_implementation.h> -static retro_vfs_opendir_t dirent_opendir_cb = NULL; -static retro_vfs_readdir_t dirent_readdir_cb = NULL; +/* TODO/FIXME - static globals */ +static retro_vfs_opendir_t dirent_opendir_cb = NULL; +static retro_vfs_readdir_t dirent_readdir_cb = NULL; static retro_vfs_dirent_get_name_t dirent_dirent_get_name_cb = NULL; -static retro_vfs_dirent_is_dir_t dirent_dirent_is_dir_cb = NULL; -static retro_vfs_closedir_t dirent_closedir_cb = NULL; +static retro_vfs_dirent_is_dir_t dirent_dirent_is_dir_cb = NULL; +static retro_vfs_closedir_t dirent_closedir_cb = NULL; void dirent_vfs_init(const struct retro_vfs_interface_info* vfs_info) { const struct retro_vfs_interface* vfs_iface; - dirent_opendir_cb = NULL; - dirent_readdir_cb = NULL; + dirent_opendir_cb = NULL; + dirent_readdir_cb = NULL; dirent_dirent_get_name_cb = NULL; - dirent_dirent_is_dir_cb = NULL; - dirent_closedir_cb = NULL; + dirent_dirent_is_dir_cb = NULL; + dirent_closedir_cb = NULL; - vfs_iface = vfs_info->iface; + vfs_iface = vfs_info->iface; - if (vfs_info->required_interface_version < DIRENT_REQUIRED_VFS_VERSION || !vfs_iface) + if ( + vfs_info->required_interface_version < DIRENT_REQUIRED_VFS_VERSION || + !vfs_iface) return; - dirent_opendir_cb = vfs_iface->opendir; - dirent_readdir_cb = vfs_iface->readdir; + dirent_opendir_cb = vfs_iface->opendir; + dirent_readdir_cb = vfs_iface->readdir; dirent_dirent_get_name_cb = vfs_iface->dirent_get_name; - dirent_dirent_is_dir_cb = vfs_iface->dirent_is_dir; - dirent_closedir_cb = vfs_iface->closedir; + dirent_dirent_is_dir_cb = vfs_iface->dirent_is_dir; + dirent_closedir_cb = vfs_iface->closedir; } -struct RDIR *retro_opendir_include_hidden(const char *name, bool include_hidden) +struct RDIR *retro_opendir_include_hidden( + const char *name, bool include_hidden) { - if (dirent_opendir_cb != NULL) + if (dirent_opendir_cb) return (struct RDIR *)dirent_opendir_cb(name, include_hidden); return (struct RDIR *)retro_vfs_opendir_impl(name, include_hidden); } @@ -79,14 +83,14 @@ int retro_readdir(struct RDIR *rdir) { - if (dirent_readdir_cb != NULL) + if (dirent_readdir_cb) return dirent_readdir_cb((struct retro_vfs_dir_handle *)rdir); return retro_vfs_readdir_impl((struct retro_vfs_dir_handle *)rdir); } const char *retro_dirent_get_name(struct RDIR *rdir) { - if (dirent_dirent_get_name_cb != NULL) + if (dirent_dirent_get_name_cb) return dirent_dirent_get_name_cb((struct retro_vfs_dir_handle *)rdir); return retro_vfs_dirent_get_name_impl((struct retro_vfs_dir_handle *)rdir); } @@ -104,14 +108,14 @@ */ bool retro_dirent_is_dir(struct RDIR *rdir, const char *unused) { - if (dirent_dirent_is_dir_cb != NULL) + if (dirent_dirent_is_dir_cb) return dirent_dirent_is_dir_cb((struct retro_vfs_dir_handle *)rdir); return retro_vfs_dirent_is_dir_impl((struct retro_vfs_dir_handle *)rdir); } void retro_closedir(struct RDIR *rdir) { - if (dirent_closedir_cb != NULL) + if (dirent_closedir_cb) dirent_closedir_cb((struct retro_vfs_dir_handle *)rdir); else retro_vfs_closedir_impl((struct retro_vfs_dir_handle *)rdir);
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/bmp
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/bmp/rbmp.c
Added
@@ -0,0 +1,785 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rbmp.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Modified version of stb_image's BMP sources. */ + +#include <stdio.h> +#include <stdint.h> +#include <stdarg.h> +#include <stddef.h> /* ptrdiff_t on osx */ +#include <stdlib.h> +#include <string.h> + +#include <retro_inline.h> + +#include <formats/image.h> +#include <formats/rbmp.h> + +/* truncate int to byte without warnings */ +#define RBMP_BYTECAST(x) ((unsigned char) ((x) & 255)) + +#define RBMP_COMPUTE_Y(r, g, b) ((unsigned char) ((((r) * 77) + ((g) * 150) + (29 * (b))) >> 8)) + +typedef struct +{ + unsigned char *img_buffer; + unsigned char *img_buffer_end; + unsigned char *img_buffer_original; + int img_n; + int img_out_n; + int buflen; + uint32_t img_x; + uint32_t img_y; + unsigned char buffer_start[128]; +} rbmp_context; + +struct rbmp +{ + uint8_t *buff_data; + uint32_t *output_image; +}; + +static INLINE unsigned char rbmp_get8(rbmp_context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + + return 0; +} + +static void rbmp_skip(rbmp_context *s, int n) +{ + if (n < 0) + { + s->img_buffer = s->img_buffer_end; + return; + } + + s->img_buffer += n; +} + +static int rbmp_get16le(rbmp_context *s) +{ + return rbmp_get8(s) + (rbmp_get8(s) << 8); +} + +#define RBMP_GET32LE(s) (rbmp_get16le(s) + (rbmp_get16le(s) << 16)) + +static unsigned char *rbmp_convert_format( + unsigned char *data, + int img_n, + int req_comp, + unsigned int x, + unsigned int y) +{ + int i,j; + unsigned char *good = (unsigned char *)malloc(req_comp * x * y); + + if (!good) + return NULL; + + for (j=0; j < (int) y; ++j) + { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + switch (((img_n)*8+(req_comp))) + { + case 10: + for (i = x-1; i >= 0; --i, src += 1, dest += 2) + { + dest[0]=src[0]; + dest[1]=255; + } + break; + case 11: + for (i = x-1; i >= 0; --i, src += 1, dest += 3) + dest[0]=dest[1]=dest[2]=src[0]; + break; + case 12: + for (i = x-1; i >= 0; --i, src += 1, dest += 4) + { + dest[0]=dest[1]=dest[2]=src[0]; + dest[3]=255; + } + break; + case 17: + for (i = x-1; i >= 0; --i, src += 2, dest += 1) + dest[0]=src[0]; + break; + case 19: + for (i = x-1; i >= 0; --i, src += 2, dest += 3) + dest[0]=dest[1]=dest[2]=src[0]; + break; + case 20: + for (i = x-1; i >= 0; --i, src += 2, dest += 4) + { + dest[0]=dest[1]=dest[2]=src[0]; + dest[3]=src[1]; + } + break; + case 28: + for (i = x-1; i >= 0; --i, src += 3, dest += 4) + { + dest[0]=src[0]; + dest[1]=src[1]; + dest[2]=src[2]; + dest[3]=255; + } + break; + case 25: + for (i = x-1; i >= 0; --i, src += 3, dest += 1) + dest[0] = RBMP_COMPUTE_Y(src[0],src[1],src[2]); + break; + case 26: + for (i = x-1; i >= 0; --i, src += 3, dest += 2) + { + dest[0] = RBMP_COMPUTE_Y(src[0],src[1],src[2]); + dest[1] = 255; + } + break; + case 33: + for (i = x-1; i >= 0; --i, src += 4, dest += 1) + dest[0] = RBMP_COMPUTE_Y(src[0],src[1],src[2]); + break; + case 34: + for (i = x-1; i >= 0; --i, src += 4, dest += 2) + { + dest[0] = RBMP_COMPUTE_Y(src[0],src[1],src[2]); + dest[1] = src[3]; + } + break; + case 35: + for (i = x-1; i >= 0; --i, src += 4, dest += 3) + { + dest[0]=src[0]; + dest[1]=src[1]; + dest[2]=src[2]; + } + break; + default: + break; + } + + } + + return good; +} + +/* Microsoft/Windows BMP image */ + +/* returns 0..31 for the highest set bit */ +static int rbmp_high_bit(unsigned int z) +{ + int n=0; + if (z == 0) + return -1; + + if (z >= 0x10000) + { + n += 16; + z >>= 16; + } + if (z >= 0x00100) + { + n += 8; + z >>= 8; + } + if (z >= 0x00010) + { + n += 4; + z >>= 4; + } + if (z >= 0x00004) + { + n += 2; + z >>= 2; + } + if (z >= 0x00002) + n += 1; + return n; +} + +static int rbmp_bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); /* max 2 */ + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); /* max 4 */ + a = (a + (a >> 4)) & 0x0f0f0f0f; /* max 8 per 4, now 8 bits */ + a = (a + (a >> 8)); /* max 16 per 8 bits */ + a = (a + (a >> 16)); /* max 32 per 8 bits */ + return a & 0xff; +} + +static int rbmp_shiftsigned(int v, int shift, int bits) +{ + int result; + int z = bits; + + if (shift < 0) + v <<= -shift; + else + v >>= shift; + + result = v; + + while (z < 8) + { + result += v >> z; + z += bits; + } + return result; +} + +static unsigned char *rbmp_bmp_load(rbmp_context *s, unsigned *x, unsigned *y, + int *comp, int req_comp) +{ + unsigned char *out; + int bpp, flip_vertically, pad, target, offset, hsz; + int psize=0,i,j,width; + unsigned int mr=0,mg=0,mb=0,ma=0; + + /* Corrupt BMP? */ + if (rbmp_get8(s) != 'B' || rbmp_get8(s) != 'M') + return 0; + + /* discard filesize */ + rbmp_get16le(s); + rbmp_get16le(s); + /* discard reserved */ + rbmp_get16le(s); + rbmp_get16le(s); + + offset = (uint32_t)RBMP_GET32LE(s); + hsz = (uint32_t)RBMP_GET32LE(s); + + /* BMP type not supported? */ + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) + return 0; + + if (hsz == 12) + { + s->img_x = rbmp_get16le(s); + s->img_y = rbmp_get16le(s); + } + else + { + s->img_x = (uint32_t)RBMP_GET32LE(s); + s->img_y = (uint32_t)RBMP_GET32LE(s); + } + + /* Bad BMP? */ + if (rbmp_get16le(s) != 1) + return 0; + + bpp = rbmp_get16le(s); + + /* BMP 1-bit type not supported? */ + if (bpp == 1) + return 0; + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (hsz == 12) + { + if (bpp < 24) + psize = (offset - 14 - 24) / 3; + } + else + { + int compress = (uint32_t)RBMP_GET32LE(s); + + /* BMP RLE type not supported? */ + if (compress == 1 || compress == 2) + return 0; + + /* discard sizeof */ + rbmp_get16le(s); + rbmp_get16le(s); + /* discard hres */ + rbmp_get16le(s); + rbmp_get16le(s); + /* discard vres */ + rbmp_get16le(s); + rbmp_get16le(s); + /* discard colors used */ + rbmp_get16le(s); + rbmp_get16le(s); + /* discard max important */ + rbmp_get16le(s); + rbmp_get16le(s); + + if (hsz == 40 || hsz == 56) + { + if (hsz == 56) + { + rbmp_get16le(s); + rbmp_get16le(s); + rbmp_get16le(s); + rbmp_get16le(s); + rbmp_get16le(s); + rbmp_get16le(s); + rbmp_get16le(s); + rbmp_get16le(s); + } + if (bpp == 16 || bpp == 32) + { + switch (compress) + { + case 0: +#if 0 + if (bpp == 32) + { + mr = 0xffu << 16; + mg = 0xffu << 8; + mb = 0xffu << 0; + ma = 0xffu << 24; + } + else + { + mr = 31u << 10; + mg = 31u << 5; + mb = 31u << 0; + } +#endif + break; + case 3: + mr = (uint32_t)RBMP_GET32LE(s); + mg = (uint32_t)RBMP_GET32LE(s); + mb = (uint32_t)RBMP_GET32LE(s); + /* not documented, but generated by + * Photoshop and handled by MS Paint */ + /* Bad BMP ?*/ + if (mr == mg && mg == mb) + return 0; + break; + default: +#if 0 + mr = mg = mb = 0; +#endif + break; + } + + /* Bad BMP? */ + return 0; + } + } + else + { + mr = (uint32_t)RBMP_GET32LE(s); + mg = (uint32_t)RBMP_GET32LE(s); + mb = (uint32_t)RBMP_GET32LE(s); + ma = (uint32_t)RBMP_GET32LE(s); + /* Discard color space */ + rbmp_get16le(s); + rbmp_get16le(s); + for (i = 0; i < 12; ++i) + { + /* Discard color space parameters */ + rbmp_get16le(s); + rbmp_get16le(s); + } + if (hsz == 124) + { + /* Discard rendering intent */ + rbmp_get16le(s); + rbmp_get16le(s); + /* Discard offset of profile data */ + rbmp_get16le(s); + rbmp_get16le(s); + /* Discard size of profile data */ + rbmp_get16le(s); + rbmp_get16le(s); + /* Discard reserved */ + rbmp_get16le(s); + rbmp_get16le(s); + } + } + if (bpp < 16) + psize = (offset - 14 - hsz) >> 2; + } + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) /* We can directly decode 3 or 4 */ + target = req_comp; + else + target = s->img_n; /* If they want monochrome, we'll post-convert */ + + out = (unsigned char *) malloc(target * s->img_x * s->img_y); + + if (!out) + return 0; + + if (bpp < 16) + { + unsigned char pal[256][4]; + int z=0; + + /* Corrupt BMP? */ + if (psize == 0 || psize > 256) + { + free(out); + return 0; + } + + for (i = 0; i < psize; ++i) + { + pal[i][2] = rbmp_get8(s); + pal[i][1] = rbmp_get8(s); + pal[i][0] = rbmp_get8(s); + if (hsz != 12) + rbmp_get8(s); + pal[i][3] = 255; + } + + rbmp_skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); + if (bpp == 4) + width = (s->img_x + 1) >> 1; + else if (bpp == 8) + width = s->img_x; + else + { + /* Corrupt BMP */ + free(out); + return 0; + } + + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) + { + for (i = 0; i < (int) s->img_x; i += 2) + { + int v = rbmp_get8(s); + int v2 = 0; + if (bpp == 4) + { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) + out[z++] = 255; + + if (i+1 == (int)s->img_x) + break; + + v = (bpp == 8) ? rbmp_get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + + if (target == 4) + out[z++] = 255; + } + rbmp_skip(s, pad); + } + } + else + { + int rshift = 0; + int gshift = 0; + int bshift = 0; + int ashift = 0; + int rcount = 0; + int gcount = 0; + int bcount = 0; + int acount = 0; + int z = 0; + int easy = 0; + + rbmp_skip(s, offset - 14 - hsz); + + if (bpp == 24) + width = 3 * s->img_x; + else if (bpp == 16) + width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ + width=0; + + pad = (-width) & 3; + + switch (bpp) + { + case 24: + easy = 1; + break; + case 32: + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + break; + default: + break; + } + + if (!easy) + { + /* Corrupt BMP? */ + if (!mr || !mg || !mb) + { + free(out); + return 0; + } + + /* right shift amt to put high bit in position #7 */ + rshift = rbmp_high_bit(mr)-7; + rcount = rbmp_bitcount(mr); + gshift = rbmp_high_bit(mg)-7; + gcount = rbmp_bitcount(mg); + bshift = rbmp_high_bit(mb)-7; + bcount = rbmp_bitcount(mb); + ashift = rbmp_high_bit(ma)-7; + acount = rbmp_bitcount(ma); + } + + for (j=0; j < (int) s->img_y; ++j) + { + if (easy) + { + if (target == 4) + { + /* Need to apply alpha channel as well */ + if (easy == 2) + { + for (i = 0; i < (int) s->img_x; ++i) + { + out[z+2] = rbmp_get8(s); + out[z+1] = rbmp_get8(s); + out[z+0] = rbmp_get8(s); + z += 3; + out[z++] = rbmp_get8(s); + } + } + else + { + for (i = 0; i < (int) s->img_x; ++i) + { + out[z+2] = rbmp_get8(s); + out[z+1] = rbmp_get8(s); + out[z+0] = rbmp_get8(s); + z += 3; + out[z++] = 255; + } + } + } + else + { + for (i = 0; i < (int) s->img_x; ++i) + { + out[z+2] = rbmp_get8(s); + out[z+1] = rbmp_get8(s); + out[z+0] = rbmp_get8(s); + z += 3; + } + } + } + else + { + if (target == 4) + { + /* Need to apply alpha channel as well */ + if (ma) + { + if (bpp == 16) + { + for (i = 0; i < (int) s->img_x; ++i) + { + uint32_t v = (uint32_t)rbmp_get16le(s); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mr, rshift, rcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mg, gshift, gcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mb, bshift, bcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & ma, ashift, acount)); + } + } + else + { + for (i = 0; i < (int) s->img_x; ++i) + { + uint32_t v = (uint32_t)RBMP_GET32LE(s); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mr, rshift, rcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mg, gshift, gcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mb, bshift, bcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & ma, ashift, acount)); + } + } + } + else + { + if (bpp == 16) + { + for (i = 0; i < (int) s->img_x; ++i) + { + uint32_t v = (uint32_t)rbmp_get16le(s); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mr, rshift, rcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mg, gshift, gcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mb, bshift, bcount)); + out[z++] = RBMP_BYTECAST(255); + } + } + else + { + for (i = 0; i < (int) s->img_x; ++i) + { + uint32_t v = (uint32_t)RBMP_GET32LE(s); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mr, rshift, rcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mg, gshift, gcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mb, bshift, bcount)); + out[z++] = RBMP_BYTECAST(255); + } + } + } + } + else + { + if (bpp == 16) + { + for (i = 0; i < (int) s->img_x; ++i) + { + uint32_t v = (uint32_t)rbmp_get16le(s); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mr, rshift, rcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mg, gshift, gcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mb, bshift, bcount)); + } + } + else + { + for (i = 0; i < (int) s->img_x; ++i) + { + uint32_t v = (uint32_t)RBMP_GET32LE(s); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mr, rshift, rcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mg, gshift, gcount)); + out[z++] = RBMP_BYTECAST(rbmp_shiftsigned(v & mb, bshift, bcount)); + } + } + } + } + rbmp_skip(s, pad); + } + } + + if (flip_vertically) + { + unsigned char t; + for (j=0; j < (int) s->img_y>>1; ++j) + { + unsigned char *p1 = out + j *s->img_x*target; + unsigned char *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i = 0; i < (int) s->img_x*target; ++i) + { + t = p1[i]; + p1[i] = p2[i]; + p2[i] = t; + } + } + } + + if ( + req_comp + && (req_comp >= 1 && req_comp <= 4) + && (req_comp != target)) + { + unsigned char *tmp = rbmp_convert_format(out, target, req_comp, s->img_x, s->img_y); + + free(out); + out = NULL; + + if (!tmp) + return NULL; + + out = tmp; + } + + *x = s->img_x; + *y = s->img_y; + + if (comp) + *comp = s->img_n; + + return out; +} + +static unsigned char *rbmp_load_from_memory(unsigned char const *buffer, int len, + unsigned *x, unsigned *y, int *comp, int req_comp) +{ + rbmp_context s; + + s.img_buffer = (unsigned char*)buffer; + s.img_buffer_original = (unsigned char*)buffer; + s.img_buffer_end = (unsigned char*)buffer+len; + + return rbmp_bmp_load(&s,x,y,comp,req_comp); +} + +static void rbmp_convert_frame(uint32_t *frame, unsigned width, unsigned height) +{ + uint32_t *end = frame + (width * height * sizeof(uint32_t))/4; + + while (frame < end) + { + uint32_t pixel = *frame; + *frame = (pixel & 0xff00ff00) | ((pixel << 16) & 0x00ff0000) | ((pixel >> 16) & 0xff); + frame++; + } +} + +int rbmp_process_image(rbmp_t *rbmp, void **buf_data, + size_t size, unsigned *width, unsigned *height) +{ + int comp; + + if (!rbmp) + return IMAGE_PROCESS_ERROR; + + rbmp->output_image = (uint32_t*)rbmp_load_from_memory(rbmp->buff_data, + (int)size, width, height, &comp, 4); + *buf_data = rbmp->output_image; + + rbmp_convert_frame(rbmp->output_image, *width, *height); + + return IMAGE_PROCESS_END; +} + +bool rbmp_set_buf_ptr(rbmp_t *rbmp, void *data) +{ + if (!rbmp) + return false; + + rbmp->buff_data = (uint8_t*)data; + + return true; +} + +void rbmp_free(rbmp_t *rbmp) +{ + if (!rbmp) + return; + + free(rbmp); +} + +rbmp_t *rbmp_alloc(void) +{ + rbmp_t *rbmp = (rbmp_t*)calloc(1, sizeof(*rbmp)); + if (!rbmp) + return NULL; + return rbmp; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/bmp/rbmp_encode.c
Added
@@ -0,0 +1,237 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rbmp_encode.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> +#include <string.h> + +#include <streams/file_stream.h> +#include <formats/rbmp.h> + +void form_bmp_header(uint8_t *header, + unsigned width, unsigned height, + bool is32bpp) +{ + unsigned line_size = (width * (is32bpp?4:3) + 3) & ~3; + unsigned size = line_size * height + 54; + unsigned size_array = line_size * height; + + /* Generic BMP stuff. */ + /* signature */ + header[0] = 'B'; + header[1] = 'M'; + /* file size */ + header[2] = (uint8_t)(size >> 0); + header[3] = (uint8_t)(size >> 8); + header[4] = (uint8_t)(size >> 16); + header[5] = (uint8_t)(size >> 24); + /* reserved */ + header[6] = 0; + header[7] = 0; + header[8] = 0; + header[9] = 0; + /* offset */ + header[10] = 54; + header[11] = 0; + header[12] = 0; + header[13] = 0; + /* DIB size */ + header[14] = 40; + header[15] = 0; + header[16] = 0; + header[17] = 0; + /* Width */ + header[18] = (uint8_t)(width >> 0); + header[19] = (uint8_t)(width >> 8); + header[20] = (uint8_t)(width >> 16); + header[21] = (uint8_t)(width >> 24); + /* Height */ + header[22] = (uint8_t)(height >> 0); + header[23] = (uint8_t)(height >> 8); + header[24] = (uint8_t)(height >> 16); + header[25] = (uint8_t)(height >> 24); + /* Color planes */ + header[26] = 1; + header[27] = 0; + /* Bits per pixel */ + header[28] = is32bpp ? 32 : 24; + header[29] = 0; + /* Compression method */ + header[30] = 0; + header[31] = 0; + header[32] = 0; + header[33] = 0; + /* Image data size */ + header[34] = (uint8_t)(size_array >> 0); + header[35] = (uint8_t)(size_array >> 8); + header[36] = (uint8_t)(size_array >> 16); + header[37] = (uint8_t)(size_array >> 24); + /* Horizontal resolution */ + header[38] = 19; + header[39] = 11; + header[40] = 0; + header[41] = 0; + /* Vertical resolution */ + header[42] = 19; + header[43] = 11; + header[44] = 0; + header[45] = 0; + /* Palette size */ + header[46] = 0; + header[47] = 0; + header[48] = 0; + header[49] = 0; + /* Important color count */ + header[50] = 0; + header[51] = 0; + header[52] = 0; + header[53] = 0; +} + +static bool write_header_bmp(RFILE *file, unsigned width, unsigned height, bool is32bpp) +{ + uint8_t header[54]; + form_bmp_header(header, width, height, is32bpp); + return filestream_write(file, header, sizeof(header)) == sizeof(header); +} + +static void dump_line_565_to_24(uint8_t *line, const uint16_t *src, unsigned width) +{ + unsigned i; + + for (i = 0; i < width; i++) + { + uint16_t pixel = *src++; + uint8_t b = (pixel >> 0) & 0x1f; + uint8_t g = (pixel >> 5) & 0x3f; + uint8_t r = (pixel >> 11) & 0x1f; + *line++ = (b << 3) | (b >> 2); + *line++ = (g << 2) | (g >> 4); + *line++ = (r << 3) | (r >> 2); + } +} + +static void dump_line_32_to_24(uint8_t *line, const uint32_t *src, unsigned width) +{ + unsigned i; + + for (i = 0; i < width; i++) + { + uint32_t pixel = *src++; + *line++ = (pixel >> 0) & 0xff; + *line++ = (pixel >> 8) & 0xff; + *line++ = (pixel >> 16) & 0xff; + } +} + +static void dump_content(RFILE *file, const void *frame, + int width, int height, int pitch, enum rbmp_source_type type) +{ + int j; + size_t line_size; + uint8_t *line = NULL; + int bytes_per_pixel = (type==RBMP_SOURCE_TYPE_ARGB8888?4:3); + union + { + const uint8_t *u8; + const uint16_t *u16; + const uint32_t *u32; + } u; + + u.u8 = (const uint8_t*)frame; + line_size = (width * bytes_per_pixel + 3) & ~3; + + switch (type) + { + case RBMP_SOURCE_TYPE_BGR24: + { + /* BGR24 byte order input matches output. Can directly copy, but... need to make sure we pad it. */ + uint32_t zeros = 0; + int pad = (int)(line_size-pitch); + for (j = 0; j < height; j++, u.u8 += pitch) + { + filestream_write(file, u.u8, pitch); + if(pad != 0) + filestream_write(file, &zeros, pad); + } + } + break; + case RBMP_SOURCE_TYPE_ARGB8888: + /* ARGB8888 byte order input matches output. Can directly copy. */ + for (j = 0; j < height; j++, u.u8 += pitch) + filestream_write(file, u.u8, line_size); + return; + default: + break; + } + + /* allocate line buffer, and initialize the final four bytes to zero, for deterministic padding */ + line = (uint8_t*)malloc(line_size); + if (!line) + return; + *(uint32_t*)(line + line_size - 4) = 0; + + switch (type) + { + case RBMP_SOURCE_TYPE_XRGB888: + for (j = 0; j < height; j++, u.u8 += pitch) + { + dump_line_32_to_24(line, u.u32, width); + filestream_write(file, line, line_size); + } + break; + case RBMP_SOURCE_TYPE_RGB565: + for (j = 0; j < height; j++, u.u8 += pitch) + { + dump_line_565_to_24(line, u.u16, width); + filestream_write(file, line, line_size); + } + break; + default: + break; + } + + /* Free allocated line buffer */ + free(line); +} + +bool rbmp_save_image( + const char *filename, + const void *frame, + unsigned width, unsigned height, + unsigned pitch, enum rbmp_source_type type) +{ + bool ret = false; + RFILE *file = filestream_open(filename, + RETRO_VFS_FILE_ACCESS_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + if (!file) + return false; + + ret = write_header_bmp(file, width, height, type==RBMP_SOURCE_TYPE_ARGB8888); + + if (ret) + dump_content(file, frame, width, height, pitch, type); + + filestream_close(file); + + return ret; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/cdfs
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/cdfs/cdfs.c
Added
@@ -0,0 +1,631 @@ +#include <formats/cdfs.h> + +#include <retro_miscellaneous.h> +#include <compat/strl.h> +#include <file/file_path.h> +#include <string/stdstring.h> + +#ifdef HAVE_CHD +#include <streams/chd_stream.h> +#endif + +static void cdfs_determine_sector_size(cdfs_track_t* track) +{ + uint8_t buffer[32]; + const int toc_sector = 16; + + /* MODE information is normally found in the CUE sheet, but we can try to determine it from the raw data. + * + * MODE1/2048 - CDROM Mode1 Data (cooked) [no header, no footer] + * MODE1/2352 - CDROM Mode1 Data (raw) [16 byte header, 288 byte footer] + * MODE2/2336 - CDROM-XA Mode2 Data [8 byte header, 280 byte footer] + * MODE2/2352 - CDROM-XA Mode2 Data [24 byte header, 280 byte footer] + * + * Note that MODE is actually a property on each sector and can change between 1 and 2 depending on how much error + * correction the author desired. To support that, the data format must be "/2352" to include the full header and + * data without error correction information, at which point the CUE sheet information becomes just a hint. + */ + + /* The boot record or primary volume descriptor is always at sector 16 and will contain a "CD001" marker */ + intfstream_seek(track->stream, toc_sector * 2352 + track->first_sector_offset, SEEK_SET); + if (intfstream_read(track->stream, buffer, sizeof(buffer)) < sizeof(buffer)) + return; + + /* if this is a CDROM-XA data source, the "CD001" tag will be 25 bytes into the sector */ + if (buffer[25] == 0x43 && buffer[26] == 0x44 && + buffer[27] == 0x30 && buffer[28] == 0x30 && buffer[29] == 0x31) + { + track->stream_sector_size = 2352; + track->stream_sector_header_size = 24; + } + /* otherwise it should be 17 bytes into the sector */ + else if (buffer[17] == 0x43 && buffer[18] == 0x44 && + buffer[19] == 0x30 && buffer[20] == 0x30 && buffer[21] == 0x31) + { + track->stream_sector_size = 2352; + track->stream_sector_header_size = 16; + } + else + { + /* ISO-9660 says the first twelve bytes of a sector should be the sync pattern 00 FF FF FF FF FF FF FF FF FF FF 00 */ + if (buffer[0] == 0 && buffer[1] == 0xFF && buffer[2] == 0xFF && buffer[3] == 0xFF && + buffer[4] == 0xFF && buffer[5] == 0xFF && buffer[6] == 0xFF && buffer[7] == 0xFF && + buffer[8] == 0xFF && buffer[9] == 0xFF && buffer[10] == 0xFF && buffer[11] == 0) + { + /* if we didn't find a CD001 tag, this format may predate ISO-9660 */ + + /* after the 12 byte sync pattern is three bytes identifying the sector and then one byte for the mode (total 16 bytes) */ + track->stream_sector_size = 2352; + track->stream_sector_header_size = 16; + } + else + { + /* attempt to determine stream_sector_size from file size */ + size_t size = intfstream_get_size(track->stream); + + if ((size % 2352) == 0) + { + /* raw tracks use all 2352 bytes and have a 24 byte header */ + track->stream_sector_size = 2352; + track->stream_sector_header_size = 24; + } + else if ((size % 2048) == 0) + { + /* cooked tracks eliminate all header/footer data */ + track->stream_sector_size = 2048; + track->stream_sector_header_size = 0; + } + else if ((size % 2336) == 0) + { + /* MODE 2 format without 16-byte sync data */ + track->stream_sector_size = 2336; + track->stream_sector_header_size = 8; + } + } + } +} + +static void cdfs_seek_track_sector(cdfs_track_t* track, unsigned int sector) +{ + intfstream_seek(track->stream, + sector * track->stream_sector_size + + track->stream_sector_header_size + + track->first_sector_offset, SEEK_SET); +} + +void cdfs_seek_sector(cdfs_file_t* file, unsigned int sector) +{ + /* only allowed if open_file was called with a NULL path */ + if (file->first_sector == 0) + { + if (sector != file->current_sector) + { + file->current_sector = sector; + file->sector_buffer_valid = 0; + } + + file->pos = file->current_sector * 2048; + file->current_sector_offset = 0; + } +} + +static int cdfs_find_file(cdfs_file_t* file, const char* path) +{ + size_t path_length; + int sector; + uint8_t buffer[2048], *tmp; + const char* slash = strrchr(path, '\\'); + + if (slash) + { + /* navigate the path to the directory record for the file */ + const int dir_length = (int)(slash - path); + memcpy(buffer, path, dir_length); + buffer[dir_length] = '\0'; + + sector = cdfs_find_file(file, (const char*)buffer); + if (sector < 0) + return sector; + + path += dir_length + 1; + } + else + { + int offset; + + /* find the CD information (always 16 frames in) */ + cdfs_seek_track_sector(file->track, 16); + intfstream_read(file->track->stream, buffer, sizeof(buffer)); + + /* the directory_record starts at 156 bytes into the sector. + * the sector containing the root directory contents is a + * 3 byte value that is 2 bytes into the directory_record. */ + offset = 156 + 2; + sector = buffer[offset] | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16); + } + + /* process the contents of the directory */ + cdfs_seek_track_sector(file->track, sector); + intfstream_read(file->track->stream, buffer, sizeof(buffer)); + + path_length = strlen(path); + tmp = buffer; + + while (tmp < buffer + sizeof(buffer)) + { + /* The first byte of the record is the length of + * the record - if 0, we reached the end of the data */ + if (!*tmp) + break; + + /* filename is 33 bytes into the record and + * the format is "FILENAME;version" or "DIRECTORY" */ + if ((tmp[33 + path_length] == ';' || tmp[33 + path_length] == '\0') && + strncasecmp((const char*)(tmp + 33), path, path_length) == 0) + { + /* the file size is in bytes 10-13 of the record */ + file->size = tmp[10] | (tmp[11] << 8) + | (tmp[12] << 16) | (tmp[13] << 24); + + /* the file contents are in the sector identified + * in bytes 2-4 of the record */ + sector = tmp[2] | (tmp[3] << 8) | (tmp[4] << 16); + return sector; + } + + /* the first byte of the record is the length of the record */ + tmp += tmp[0]; + } + + return -1; +} + +int cdfs_open_file(cdfs_file_t* file, cdfs_track_t* track, const char* path) +{ + if (!file || !track) + return 0; + + memset(file, 0, sizeof(*file)); + + file->track = track; + file->current_sector = -1; + + if (path) + file->first_sector = cdfs_find_file(file, path); + else if (file->track->stream_sector_size) + { + file->first_sector = 0; + file->size = (intfstream_get_size( + file->track->stream) / file->track->stream_sector_size) + * 2048; + } + else + file->first_sector = -1; + + return (file->first_sector >= 0); +} + +int64_t cdfs_read_file(cdfs_file_t* file, void* buffer, uint64_t len) +{ + int bytes_read = 0; + + if (!file || file->first_sector < 0 || !buffer) + return 0; + + if (len > file->size - file->pos) + len = file->size - file->pos; + + if (len == 0) + return 0; + + if (file->sector_buffer_valid) + { + size_t remaining = 2048 - file->current_sector_offset; + if (remaining > 0) + { + if (remaining >= len) + { + memcpy(buffer, + &file->sector_buffer[file->current_sector_offset], + (size_t)len); + file->current_sector_offset += len; + return len; + } + + memcpy(buffer, + &file->sector_buffer[file->current_sector_offset], remaining); + buffer = (char*)buffer + remaining; + bytes_read += remaining; + len -= remaining; + + file->current_sector_offset += remaining; + } + + ++file->current_sector; + file->current_sector_offset = 0; + file->sector_buffer_valid = 0; + } + else if (file->current_sector < file->first_sector) + { + file->current_sector = file->first_sector; + file->current_sector_offset = 0; + } + + while (len >= 2048) + { + cdfs_seek_track_sector(file->track, file->current_sector); + intfstream_read(file->track->stream, buffer, 2048); + + buffer = (char*)buffer + 2048; + bytes_read += 2048; + + ++file->current_sector; + + len -= 2048; + } + + if (len > 0) + { + cdfs_seek_track_sector(file->track, file->current_sector); + intfstream_read(file->track->stream, file->sector_buffer, 2048); + memcpy(buffer, file->sector_buffer, (size_t)len); + file->current_sector_offset = len; + file->sector_buffer_valid = 1; + + bytes_read += len; + } + + file->pos += bytes_read; + return bytes_read; +} + +void cdfs_close_file(cdfs_file_t* file) +{ + if (file) + { + /* not really anything to do here, just + * clear out the first_sector so read() won't do anything */ + file->first_sector = -1; + } +} + +int64_t cdfs_get_size(cdfs_file_t* file) +{ + if (!file || file->first_sector < 0) + return 0; + + return file->size; +} + +int64_t cdfs_tell(cdfs_file_t* file) +{ + if (!file || file->first_sector < 0) + return -1; + + return file->pos; +} + +int64_t cdfs_seek(cdfs_file_t* file, int64_t offset, int whence) +{ + int64_t new_pos; + int new_sector; + + if (!file || file->first_sector < 0) + return -1; + + switch (whence) + { + case SEEK_SET: + new_pos = offset; + break; + + case SEEK_CUR: + new_pos = file->pos + offset; + break; + + case SEEK_END: + new_pos = file->size - offset; + break; + + default: + return -1; + } + + if (new_pos < 0) + return -1; + else if (new_pos > file->size) + return -1; + + file->pos = (unsigned int)new_pos; + file->current_sector_offset = file->pos % 2048; + + new_sector = file->pos / 2048; + if (new_sector != file->current_sector) + { + file->current_sector = new_sector; + file->sector_buffer_valid = false; + } + + return 0; +} + +static void cdfs_skip_spaces(const char** ptr) +{ + while (**ptr && (**ptr == ' ' || **ptr == '\t')) + ++(*ptr); +} + +static cdfs_track_t* cdfs_wrap_stream( + intfstream_t* stream, unsigned first_sector_offset) +{ + cdfs_track_t* track = NULL; + + if (!stream) + return NULL; + + track = (cdfs_track_t*) + calloc(1, sizeof(*track)); + track->stream = stream; + track->first_sector_offset = first_sector_offset; + + cdfs_determine_sector_size(track); + + return track; +} + +static cdfs_track_t* cdfs_open_cue_track( + const char* path, unsigned int track_index) +{ + char* cue = NULL; + const char* line = NULL; + int found_track = 0; + char current_track_path[PATH_MAX_LENGTH] = {0}; + char track_path[PATH_MAX_LENGTH] = {0}; + unsigned int sector_size = 0; + unsigned int previous_sector_size = 0; + unsigned int previous_index_sector_offset= 0; + unsigned int track_offset = 0; + intfstream_t *cue_stream = intfstream_open_file(path, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE); + int64_t stream_size = intfstream_get_size(cue_stream); + char *cue_contents = (char*)malloc((size_t)(stream_size + 1)); + cdfs_track_t* track = NULL; + + if (!cue_contents) + { + intfstream_close(cue_stream); + return NULL; + } + + intfstream_read(cue_stream, cue_contents, stream_size); + intfstream_close(cue_stream); + + cue_contents[stream_size] = '\0'; + + cue = cue_contents; + while (*cue) + { + cdfs_skip_spaces((const char**)&cue); + line = cue; + + while (*cue && *cue != '\n') + ++cue; + if (*cue) + *cue++ = '\0'; + + if (!strncasecmp(line, "FILE", 4)) + { + const char *file = line + 4; + cdfs_skip_spaces(&file); + + if (file[0]) + { + const char *file_end = cue - 1; + while (file_end > file && *file_end != ' ' && *file_end != '\t') + --file_end; + + if (file[0] == '"' && file_end[-1] == '"') + { + ++file; + --file_end; + } + + memcpy(current_track_path, file, file_end - file); + current_track_path[file_end - file] = '\0'; + } + + previous_sector_size = 0; + previous_index_sector_offset = 0; + track_offset = 0; + } + else if (!strncasecmp(line, "TRACK", 5)) + { + unsigned track_number = 0; + + const char *track = line + 5; + cdfs_skip_spaces(&track); + + sscanf(track, "%d", (int*)&track_number); + while (*track && *track != ' ' && *track != '\n') + ++track; + + previous_sector_size = sector_size; + + cdfs_skip_spaces(&track); + + if (!strncasecmp(track, "MODE", 4)) + { + /* track_index = 0 means find the first data track */ + if (!track_index || track_index == track_number) + found_track = track_number; + + sector_size = atoi(track + 6); + } + else + { + /* assume AUDIO */ + sector_size = 2352; + } + } + else if (!strncasecmp(line, "INDEX", 5)) + { + unsigned min = 0, sec = 0, frame = 0; + unsigned index_number = 0; + unsigned sector_offset; + const char *index = line + 5; + + cdfs_skip_spaces(&index); + sscanf(index, "%u", &index_number); + while (*index && *index != ' ' && *index != '\n') + ++index; + cdfs_skip_spaces(&index); + + sscanf(index, "%u:%u:%u", &min, &sec, &frame); + sector_offset = ((min * 60) + sec) * 75 + frame; + sector_offset -= previous_index_sector_offset; + track_offset += sector_offset * previous_sector_size; + previous_sector_size = sector_size; + previous_index_sector_offset += sector_offset; + + if (found_track && index_number == 1) + { + if ( strstr(current_track_path, "/") || + strstr(current_track_path, "\\")) + strncpy(track_path, current_track_path, sizeof(track_path)); + else + { + fill_pathname_basedir(track_path, path, sizeof(track_path)); + strlcat(track_path, current_track_path, sizeof(track_path)); + } + + break; + } + } + } + + free(cue_contents); + + if (string_is_empty(track_path)) + return NULL; + + track = cdfs_wrap_stream(intfstream_open_file( + track_path, RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE), track_offset); + + if (track && track->stream_sector_size == 0) + { + track->stream_sector_size = sector_size; + + if (sector_size == 2352) + track->stream_sector_header_size = 16; + else if (sector_size == 2336) + track->stream_sector_header_size = 8; + } + + return track; +} + +#ifdef HAVE_CHD +static cdfs_track_t* cdfs_open_chd_track(const char* path, int32_t track_index) +{ + intfstream_t* intf_stream; + cdfs_track_t* track; + + intf_stream = intfstream_open_chd_track(path, + RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE, + track_index); + if (!intf_stream) + return NULL; + + track = cdfs_wrap_stream(intf_stream, + intfstream_get_offset_to_start(intf_stream)); + + if (track && track->stream_sector_header_size == 0) + { + track->stream_sector_size = intfstream_get_frame_size(intf_stream); + + if (track->stream_sector_size == 2352) + track->stream_sector_header_size = 16; + else if (track->stream_sector_size == 2336) + track->stream_sector_header_size = 8; + } + + return track; +} +#endif + +struct cdfs_track_t* cdfs_open_track(const char* path, + unsigned int track_index) +{ + const char* ext = path_get_extension(path); + + if (string_is_equal_noncase(ext, "cue")) + return cdfs_open_cue_track(path, track_index); + +#ifdef HAVE_CHD + if (string_is_equal_noncase(ext, "chd")) + return cdfs_open_chd_track(path, track_index); +#endif + + /* if opening track 1, try opening as a raw track */ + if (track_index == 1) + return cdfs_open_raw_track(path); + + /* unsupported file type */ + return NULL; +} + +struct cdfs_track_t* cdfs_open_data_track(const char* path) +{ + const char* ext = path_get_extension(path); + + if (string_is_equal_noncase(ext, "cue")) + return cdfs_open_cue_track(path, 0); + +#ifdef HAVE_CHD + if (string_is_equal_noncase(ext, "chd")) + return cdfs_open_chd_track(path, CHDSTREAM_TRACK_PRIMARY); +#endif + + /* unsupported file type - try opening as a raw track */ + return cdfs_open_raw_track(path); +} + +cdfs_track_t* cdfs_open_raw_track(const char* path) +{ + const char* ext = path_get_extension(path); + cdfs_track_t* track = NULL; + + if ( string_is_equal_noncase(ext, "bin") || + string_is_equal_noncase(ext, "iso")) + { + intfstream_t* file = intfstream_open_file(path, + RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE); + + track = cdfs_wrap_stream(file, 0); + if (track != NULL && track->stream_sector_size == 0) + { + cdfs_close_track(track); + track = NULL; + } + } + else + { + /* unsupported file type */ + } + + return track; +} + +void cdfs_close_track(cdfs_track_t* track) +{ + if (track) + { + if (track->stream) + { + intfstream_close(track->stream); + free(track->stream); + } + + free(track); + } +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/image_texture.c
Added
@@ -0,0 +1,333 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (image_texture.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <stddef.h> + +#include <boolean.h> +#include <formats/image.h> +#include <file/nbio.h> +#include <string/stdstring.h> + +enum image_type_enum image_texture_get_type(const char *path) +{ + /* We are comparing against a fixed list of file + * extensions, the longest (jpeg) being 4 characters + * in length. We therefore only need to extract the first + * 5 characters from the extension of the input path + * to correctly validate a match */ + const char *ext = NULL; + char ext_lower[6]; + + ext_lower[0] = '\0'; + + if (string_is_empty(path)) + return IMAGE_TYPE_NONE; + + /* Get file extension */ + ext = strrchr(path, '.'); + + if (!ext || (*(++ext) == '\0')) + return IMAGE_TYPE_NONE; + + /* Copy and convert to lower case */ + strlcpy(ext_lower, ext, sizeof(ext_lower)); + string_to_lower(ext_lower); + +#ifdef HAVE_RPNG + if (string_is_equal(ext_lower, "png")) + return IMAGE_TYPE_PNG; +#endif +#ifdef HAVE_RJPEG + if (string_is_equal(ext_lower, "jpg") || + string_is_equal(ext_lower, "jpeg")) + return IMAGE_TYPE_JPEG; +#endif +#ifdef HAVE_RBMP + if (string_is_equal(ext_lower, "bmp")) + return IMAGE_TYPE_BMP; +#endif +#ifdef HAVE_RTGA + if (string_is_equal(ext_lower, "tga")) + return IMAGE_TYPE_TGA; +#endif + + return IMAGE_TYPE_NONE; +} + +bool image_texture_set_color_shifts( + unsigned *r_shift, unsigned *g_shift, unsigned *b_shift, + unsigned *a_shift, + struct texture_image *out_img + ) +{ + *a_shift = 24; + *r_shift = 16; + *g_shift = 8; + *b_shift = 0; + + if (out_img->supports_rgba) + { + *r_shift = 0; + *b_shift = 16; + return true; + } + + return false; +} + +bool image_texture_color_convert(unsigned r_shift, + unsigned g_shift, unsigned b_shift, unsigned a_shift, + struct texture_image *out_img) +{ + /* This is quite uncommon. */ + if (a_shift != 24 || r_shift != 16 || g_shift != 8 || b_shift != 0) + { + uint32_t i; + uint32_t num_pixels = out_img->width * out_img->height; + uint32_t *pixels = (uint32_t*)out_img->pixels; + + for (i = 0; i < num_pixels; i++) + { + uint32_t col = pixels[i]; + uint8_t a = (uint8_t)(col >> 24); + uint8_t r = (uint8_t)(col >> 16); + uint8_t g = (uint8_t)(col >> 8); + uint8_t b = (uint8_t)(col >> 0); + /* Explicitly cast these to uint32_t to prevent + * ASAN runtime error: left shift of 255 by 24 places + * cannot be represented in type 'int' */ + pixels[i] = ((uint32_t)a << a_shift) | + ((uint32_t)r << r_shift) | + ((uint32_t)g << g_shift) | + ((uint32_t)b << b_shift); + } + + return true; + } + + return false; +} + +#ifdef GEKKO + +#define GX_BLIT_LINE_32(off) \ +{ \ + unsigned x; \ + const uint16_t *tmp_src = src; \ + uint16_t *tmp_dst = dst; \ + for (x = 0; x < width2 >> 3; x++, tmp_src += 8, tmp_dst += 32) \ + { \ + tmp_dst[ 0 + off] = tmp_src[0]; \ + tmp_dst[ 16 + off] = tmp_src[1]; \ + tmp_dst[ 1 + off] = tmp_src[2]; \ + tmp_dst[ 17 + off] = tmp_src[3]; \ + tmp_dst[ 2 + off] = tmp_src[4]; \ + tmp_dst[ 18 + off] = tmp_src[5]; \ + tmp_dst[ 3 + off] = tmp_src[6]; \ + tmp_dst[ 19 + off] = tmp_src[7]; \ + } \ + src += tmp_pitch; \ +} + +static bool image_texture_internal_gx_convert_texture32( + struct texture_image *image) +{ + unsigned tmp_pitch, width2, i; + const uint16_t *src = NULL; + uint16_t *dst = NULL; + /* Memory allocation in libogc is extremely primitive so try + * to avoid gaps in memory when converting by copying over to + * a temporary buffer first, then converting over into + * main buffer again. */ + void *tmp = malloc(image->width + * image->height * sizeof(uint32_t)); + + if (!tmp) + return false; + + memcpy(tmp, image->pixels, image->width + * image->height * sizeof(uint32_t)); + tmp_pitch = (image->width * sizeof(uint32_t)) >> 1; + + image->width &= ~3; + image->height &= ~3; + width2 = image->width << 1; + src = (uint16_t*)tmp; + dst = (uint16_t*)image->pixels; + + for (i = 0; i < image->height; i += 4, dst += 4 * width2) + { + GX_BLIT_LINE_32(0) + GX_BLIT_LINE_32(4) + GX_BLIT_LINE_32(8) + GX_BLIT_LINE_32(12) + } + + free(tmp); + return true; +} +#endif + +static bool image_texture_load_internal( + enum image_type_enum type, + void *ptr, + size_t len, + struct texture_image *out_img, + unsigned a_shift, unsigned r_shift, + unsigned g_shift, unsigned b_shift) +{ + int ret; + bool success = false; + void *img = image_transfer_new(type); + + if (!img) + goto end; + + image_transfer_set_buffer_ptr(img, type, (uint8_t*)ptr, len); + + if (!image_transfer_start(img, type)) + goto end; + + while (image_transfer_iterate(img, type)); + + if (!image_transfer_is_valid(img, type)) + goto end; + + do + { + ret = image_transfer_process(img, type, + (uint32_t**)&out_img->pixels, len, &out_img->width, + &out_img->height); + } while (ret == IMAGE_PROCESS_NEXT); + + if (ret == IMAGE_PROCESS_ERROR || ret == IMAGE_PROCESS_ERROR_END) + goto end; + + image_texture_color_convert(r_shift, g_shift, b_shift, + a_shift, out_img); + +#ifdef GEKKO + if (!image_texture_internal_gx_convert_texture32(out_img)) + { + image_texture_free(out_img); + goto end; + } +#endif + + success = true; + +end: + if (img) + image_transfer_free(img, type); + + return success; +} + +void image_texture_free(struct texture_image *img) +{ + if (!img) + return; + + if (img->pixels) + free(img->pixels); + img->width = 0; + img->height = 0; + img->pixels = NULL; +} + +bool image_texture_load_buffer(struct texture_image *out_img, + enum image_type_enum type, void *buffer, size_t buffer_len) +{ + unsigned r_shift, g_shift, b_shift, a_shift; + image_texture_set_color_shifts(&r_shift, &g_shift, &b_shift, + &a_shift, out_img); + + if (type != IMAGE_TYPE_NONE) + { + if (image_texture_load_internal( + type, buffer, buffer_len, out_img, + a_shift, r_shift, g_shift, b_shift)) + { + return true; + } + } + + out_img->supports_rgba = false; + out_img->pixels = NULL; + out_img->width = 0; + out_img->height = 0; + + return false; +} + +bool image_texture_load(struct texture_image *out_img, + const char *path) +{ + unsigned r_shift, g_shift, b_shift, a_shift; + size_t file_len = 0; + struct nbio_t *handle = NULL; + void *ptr = NULL; + enum image_type_enum type = image_texture_get_type(path); + + image_texture_set_color_shifts(&r_shift, &g_shift, &b_shift, + &a_shift, out_img); + + if (type != IMAGE_TYPE_NONE) + { + handle = (struct nbio_t*)nbio_open(path, NBIO_READ); + if (!handle) + goto error; + nbio_begin_read(handle); + + while (!nbio_iterate(handle)); + + ptr = nbio_get_ptr(handle, &file_len); + + if (!ptr) + goto error; + + if (image_texture_load_internal( + type, + ptr, file_len, out_img, + a_shift, r_shift, g_shift, b_shift)) + goto success; + } + +error: + out_img->supports_rgba = false; + out_img->pixels = NULL; + out_img->width = 0; + out_img->height = 0; + if (handle) + nbio_free(handle); + + return false; + +success: + if (handle) + nbio_free(handle); + + return true; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/image_transfer.c
Added
@@ -0,0 +1,284 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (image_transfer.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <string.h> +#include <errno.h> + +#ifdef HAVE_RPNG +#include <formats/rpng.h> +#endif +#ifdef HAVE_RJPEG +#include <formats/rjpeg.h> +#endif +#ifdef HAVE_RTGA +#include <formats/rtga.h> +#endif +#ifdef HAVE_RBMP +#include <formats/rbmp.h> +#endif + +#include <formats/image.h> + +void image_transfer_free(void *data, enum image_type_enum type) +{ + switch (type) + { + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + rtga_free((rtga_t*)data); +#endif + break; + case IMAGE_TYPE_PNG: + { +#ifdef HAVE_RPNG + rpng_t *rpng = (rpng_t*)data; + if (rpng) + rpng_free(rpng); +#endif + } + break; + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + rjpeg_free((rjpeg_t*)data); +#endif + break; + case IMAGE_TYPE_BMP: +#ifdef HAVE_RBMP + rbmp_free((rbmp_t*)data); +#endif + break; + case IMAGE_TYPE_NONE: + break; + } +} + +void *image_transfer_new(enum image_type_enum type) +{ + switch (type) + { + case IMAGE_TYPE_PNG: +#ifdef HAVE_RPNG + return rpng_alloc(); +#else + break; +#endif + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + return rjpeg_alloc(); +#else + break; +#endif + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + return rtga_alloc(); +#else + break; +#endif + case IMAGE_TYPE_BMP: +#ifdef HAVE_RBMP + return rbmp_alloc(); +#else + break; +#endif + default: + break; + } + + return NULL; +} + +bool image_transfer_start(void *data, enum image_type_enum type) +{ + + switch (type) + { + case IMAGE_TYPE_PNG: +#ifdef HAVE_RPNG + if (!rpng_start((rpng_t*)data)) + break; + return true; +#else + break; +#endif + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + return true; +#else + break; +#endif + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + return true; +#else + break; +#endif + case IMAGE_TYPE_BMP: + return true; + case IMAGE_TYPE_NONE: + break; + } + + return false; +} + +bool image_transfer_is_valid( + void *data, + enum image_type_enum type) +{ + switch (type) + { + case IMAGE_TYPE_PNG: +#ifdef HAVE_RPNG + return rpng_is_valid((rpng_t*)data); +#else + break; +#endif + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + return true; +#else + break; +#endif + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + return true; +#else + break; +#endif + case IMAGE_TYPE_BMP: + return true; + case IMAGE_TYPE_NONE: + break; + } + + return false; +} + +void image_transfer_set_buffer_ptr( + void *data, + enum image_type_enum type, + void *ptr, + size_t len) +{ + switch (type) + { + case IMAGE_TYPE_PNG: +#ifdef HAVE_RPNG + rpng_set_buf_ptr((rpng_t*)data, (uint8_t*)ptr, len); +#endif + break; + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + rjpeg_set_buf_ptr((rjpeg_t*)data, (uint8_t*)ptr); +#endif + break; + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + rtga_set_buf_ptr((rtga_t*)data, (uint8_t*)ptr); +#endif + break; + case IMAGE_TYPE_BMP: +#ifdef HAVE_RBMP + rbmp_set_buf_ptr((rbmp_t*)data, (uint8_t*)ptr); +#endif + break; + case IMAGE_TYPE_NONE: + break; + } +} + +int image_transfer_process( + void *data, + enum image_type_enum type, + uint32_t **buf, size_t len, + unsigned *width, unsigned *height) +{ + switch (type) + { + case IMAGE_TYPE_PNG: +#ifdef HAVE_RPNG + return rpng_process_image( + (rpng_t*)data, + (void**)buf, len, width, height); +#else + break; +#endif + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + return rjpeg_process_image((rjpeg_t*)data, + (void**)buf, len, width, height); +#else + break; +#endif + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + return rtga_process_image((rtga_t*)data, + (void**)buf, len, width, height); +#else + break; +#endif + case IMAGE_TYPE_BMP: +#ifdef HAVE_RBMP + return rbmp_process_image((rbmp_t*)data, + (void**)buf, len, width, height); +#else + break; +#endif + case IMAGE_TYPE_NONE: + break; + } + + return 0; +} + +bool image_transfer_iterate(void *data, enum image_type_enum type) +{ + + switch (type) + { + case IMAGE_TYPE_PNG: +#ifdef HAVE_RPNG + if (!rpng_iterate_image((rpng_t*)data)) + return false; +#endif + break; + case IMAGE_TYPE_JPEG: +#ifdef HAVE_RJPEG + return false; +#else + break; +#endif + case IMAGE_TYPE_TGA: +#ifdef HAVE_RTGA + return false; +#else + break; +#endif + case IMAGE_TYPE_BMP: + return false; + case IMAGE_TYPE_NONE: + return false; + } + + return true; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/jpeg
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/jpeg/rjpeg.c
Added
@@ -0,0 +1,2635 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rjpeg.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Modified version of stb_image's JPEG sources. */ + +#include <stdint.h> +#include <stdarg.h> +#include <stddef.h> /* ptrdiff_t on osx */ +#include <stdlib.h> +#include <string.h> + +#include <retro_assert.h> +#include <retro_inline.h> +#include <boolean.h> +#include <formats/image.h> +#include <formats/rjpeg.h> +#include <features/features_cpu.h> + +enum +{ + RJPEG_DEFAULT = 0, /* only used for req_comp */ + RJPEG_GREY, + RJPEG_GREY_ALPHA, + RJPEG_RGB, + RJPEG_RGB_ALPHA +}; + +enum +{ + RJPEG_SCAN_LOAD = 0, + RJPEG_SCAN_TYPE, + RJPEG_SCAN_HEADER +}; + +typedef uint8_t *(*rjpeg_resample_row_func)(uint8_t *out, uint8_t *in0, uint8_t *in1, + int w, int hs); + +typedef struct +{ + rjpeg_resample_row_func resample; + uint8_t *line0; + uint8_t *line1; + int hs,vs; /* expansion factor in each axis */ + int w_lores; /* horizontal pixels pre-expansion */ + int ystep; /* how far through vertical expansion we are */ + int ypos; /* which pre-expansion row we're on */ +} rjpeg_resample; + +struct rjpeg +{ + uint8_t *buff_data; +}; + +#ifdef _MSC_VER +#define RJPEG_HAS_LROTL +#endif + +#ifdef RJPEG_HAS_LROTL + #define RJPEG_LROT(x,y) _lrotl(x,y) +#else + #define RJPEG_LROT(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +/* x86/x64 detection */ +#if defined(__x86_64__) || defined(_M_X64) +#define RJPEG_X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define RJPEG_X86_TARGET +#endif + +#if defined(__GNUC__) && (defined(RJPEG_X86_TARGET) || defined(RJPEG_X64_TARGET)) && !defined(__SSE2__) && !defined(RJPEG_NO_SIMD) +/* NOTE: not clear do we actually need this for the 64-bit path? + * gcc doesn't support sse2 intrinsics unless you compile with -msse2, + * (but compiling with -msse2 allows the compiler to use SSE2 everywhere; + * this is just broken and gcc are jerks for not fixing it properly + * http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) + */ +#define RJPEG_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(RJPEG_X86_TARGET) && !defined(RJPEG_MINGW_ENABLE_SSE2) && !defined(RJPEG_NO_SIMD) +/* Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid RJPEG_X64_TARGET + * + * 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the + * Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. + * As a result, enabling SSE2 on 32-bit MinGW is dangerous when not + * simultaneously enabling "-mstackrealign". + * + * See https://github.com/nothings/stb/issues/81 for more information. + * + * So default to no SSE2 on 32-bit MinGW. If you've read this far and added + * -mstackrealign to your build settings, feel free to #define RJPEG_MINGW_ENABLE_SSE2. + */ +#define RJPEG_NO_SIMD +#endif + +#if defined(__SSE2__) +#include <emmintrin.h> + +#ifdef _MSC_VER +#define RJPEG_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define RJPEG_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#endif + +/* ARM NEON */ +#if defined(RJPEG_NO_SIMD) && defined(RJPEG_NEON) +#undef RJPEG_NEON +#endif + +#ifdef RJPEG_NEON +#include <arm_neon.h> +/* assume GCC or Clang on ARM targets */ +#define RJPEG_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef RJPEG_SIMD_ALIGN +#define RJPEG_SIMD_ALIGN(type, name) type name +#endif + +typedef struct +{ + uint8_t *img_buffer; + uint8_t *img_buffer_end; + uint8_t *img_buffer_original; + int img_n; + int img_out_n; + int buflen; + uint32_t img_x; + uint32_t img_y; + uint8_t buffer_start[128]; +} rjpeg_context; + +static INLINE uint8_t rjpeg_get8(rjpeg_context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + + return 0; +} + +#define RJPEG_AT_EOF(s) ((s)->img_buffer >= (s)->img_buffer_end) + +#define RJPEG_GET16BE(s) ((rjpeg_get8((s)) << 8) + rjpeg_get8((s))) + +/* huffman decoding acceleration */ +#define FAST_BITS 9 /* larger handles more cases; smaller stomps less cache */ + +typedef struct +{ + unsigned int maxcode[18]; + int delta[17]; /* old 'firstsymbol' - old 'firstcode' */ + /* weirdly, repacking this into AoS is a 10% speed loss, instead of a win */ + uint16_t code[256]; + uint8_t fast[1 << FAST_BITS]; + uint8_t values[256]; + uint8_t size[257]; +} rjpeg_huffman; + +typedef struct +{ + rjpeg_context *s; + /* kernels */ + void (*idct_block_kernel)(uint8_t *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(uint8_t *out, const uint8_t *y, const uint8_t *pcb, + const uint8_t *pcr, int count, int step); + uint8_t *(*resample_row_hv_2_kernel)(uint8_t *out, uint8_t *in_near, + uint8_t *in_far, int w, int hs); + + /* definition of jpeg image component */ + struct + { + uint8_t *data; + void *raw_data, *raw_coeff; + uint8_t *linebuf; + short *coeff; /* progressive only */ + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + int coeff_w; /* number of 8x8 coefficient blocks */ + int coeff_h; /* number of 8x8 coefficient blocks */ + } img_comp[4]; + + /* sizes for components, interleaved MCUs */ + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + + int code_bits; /* number of valid bits */ + int nomore; /* flag if we saw a marker so must stop */ + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int scan_n, order[4]; + int restart_interval, todo; + uint32_t code_buffer; /* jpeg entropy-coded buffer */ + rjpeg_huffman huff_dc[4]; /* unsigned int alignment */ + rjpeg_huffman huff_ac[4]; /* unsigned int alignment */ + int16_t fast_ac[4][1 << FAST_BITS]; + unsigned char marker; /* marker seen while filling entropy buffer */ + uint8_t dequant[4][64]; +} rjpeg_jpeg; + +#define RJPEG_F2F(x) ((int) (((x) * 4096 + 0.5))) +#define RJPEG_FSH(x) ((x) << 12) + +#define RJPEG_MARKER_NONE 0xff +/* if there's a pending marker from the entropy stream, return that + * otherwise, fetch from the stream and get a marker. if there's no + * marker, return 0xff, which is never a valid marker value + */ + +/* in each scan, we'll have scan_n components, and the order + * of the components is specified by order[] + */ +#define RJPEG_RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +#define JPEG_MARKER 0xFF +#define JPEG_MARKER_SOI 0xD8 +#define JPEG_MARKER_SOS 0xDA +#define JPEG_MARKER_EOI 0xD9 +#define JPEG_MARKER_APP1 0xE1 +#define JPEG_MARKER_APP2 0xE2 + +/* use comparisons since in some cases we handle more than one case (e.g. SOF) */ +#define RJPEG_SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) + +#define RJPEG_SOF_PROGRESSIVE(x) ((x) == 0xc2) +#define RJPEG_DIV4(x) ((uint8_t) ((x) >> 2)) +#define RJPEG_DIV16(x) ((uint8_t) ((x) >> 4)) + +static int rjpeg_build_huffman(rjpeg_huffman *h, int *count) +{ + int i,j,k = 0,code; + + /* build size list for each symbol (from JPEG spec) */ + for (i = 0; i < 16; ++i) + for (j = 0; j < count[i]; ++j) + h->size[k++] = (uint8_t) (i+1); + + h->size[k] = 0; + /* compute actual symbols (from jpeg spec) */ + code = 0; + k = 0; + + for (j = 1; j <= 16; ++j) + { + /* compute delta to add to code to compute symbol id */ + h->delta[j] = k - code; + if (h->size[k] == j) + { + while (h->size[k] == j) + h->code[k++] = (uint16_t) (code++); + + /* Bad code lengths, corrupt JPEG? */ + if (code-1 >= (1 << j)) + return 0; + } + /* compute largest code + 1 for this size, preshifted as needed later */ + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + /* build non-spec acceleration table; 255 is flag for not-accelerated */ + memset(h->fast, 255, 1 << FAST_BITS); + for (i = 0; i < k; ++i) + { + int s = h->size[i]; + if (s <= FAST_BITS) + { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j = 0; j < m; ++j) + h->fast[c+j] = (uint8_t) i; + } + } + return 1; +} + +/* build a table that decodes both magnitude and value of small ACs in + * one go. */ +static void rjpeg_build_fast_ac(int16_t *fast_ac, rjpeg_huffman *h) +{ + int i; + + for (i = 0; i < (1 << FAST_BITS); ++i) + { + uint8_t fast = h->fast[i]; + + fast_ac[i] = 0; + + if (fast < 255) + { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) + { + /* magnitude code followed by receive_extend code */ + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) + k += (-1 << magbits) + 1; + + /* if the result is small enough, we can fit it in fast_ac table */ + if (k >= -128 && k <= 127) + fast_ac[i] = (int16_t) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + +static void rjpeg_grow_buffer_unsafe(rjpeg_jpeg *j) +{ + do + { + int b = j->nomore ? 0 : rjpeg_get8(j->s); + if (b == 0xff) + { + int c = rjpeg_get8(j->s); + + if (c != 0) + { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +/* (1 << n) - 1 */ +static uint32_t rjpeg_bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +/* decode a JPEG huffman value from the bitstream */ +static INLINE int rjpeg_jpeg_huff_decode(rjpeg_jpeg *j, rjpeg_huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) + rjpeg_grow_buffer_unsafe(j); + + /* look at the top FAST_BITS and determine what symbol ID it is, + * if the code is <= FAST_BITS */ + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + + if (k < 255) + { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + /* naive test is to shift the code_buffer down so k bits are + * valid, then test against maxcode. To speed this up, we've + * preshifted maxcode left so that it has (16-k) 0s at the + * end; in other words, regardless of the number of bits, it + * wants to be compared against something shifted to have 16; + * that way we don't need to shift inside the loop. */ + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + + if (k == 17) + { + /* error! code not found */ + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + /* convert the huffman code to the symbol id */ + c = ((j->code_buffer >> (32 - k)) & rjpeg_bmask[k]) + h->delta[k]; + retro_assert((((j->code_buffer) >> (32 - h->size[c])) & rjpeg_bmask[h->size[c]]) == h->code[c]); + + /* convert the id to a symbol */ + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +/* bias[n] = (-1<<n) + 1 */ +static int const rjpeg_jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767}; + +/* combined JPEG 'receive' and JPEG 'extend', since baseline + * always extends everything it receives. */ +static INLINE int rjpeg_extend_receive(rjpeg_jpeg *j, int n) +{ + unsigned int k; + int sgn; + if (j->code_bits < n) + rjpeg_grow_buffer_unsafe(j); + + sgn = (int32_t)j->code_buffer >> 31; /* sign bit is always in MSB */ + k = RJPEG_LROT(j->code_buffer, n); + retro_assert(n >= 0 && n < (int) (sizeof(rjpeg_bmask)/sizeof(*rjpeg_bmask))); + j->code_buffer = k & ~rjpeg_bmask[n]; + k &= rjpeg_bmask[n]; + j->code_bits -= n; + return k + (rjpeg_jbias[n] & ~sgn); +} + +/* get some unsigned bits */ +static INLINE int rjpeg_jpeg_get_bits(rjpeg_jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) + rjpeg_grow_buffer_unsafe(j); + k = RJPEG_LROT(j->code_buffer, n); + j->code_buffer = k & ~rjpeg_bmask[n]; + k &= rjpeg_bmask[n]; + j->code_bits -= n; + return k; +} + +static INLINE int rjpeg_jpeg_get_bit(rjpeg_jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) + rjpeg_grow_buffer_unsafe(j); + + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +/* given a value that's at position X in the zigzag stream, + * where does it appear in the 8x8 matrix coded as row-major? */ +static uint8_t rjpeg_jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + /* let corrupt input sample past end */ + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +/* decode one 64-entry block-- */ +static int rjpeg_jpeg_decode_block( + rjpeg_jpeg *j, short data[64], + rjpeg_huffman *hdc, + rjpeg_huffman *hac, + int16_t *fac, + int b, + uint8_t *dequant) +{ + int dc,k; + int t; + int diff = 0; + + if (j->code_bits < 16) + rjpeg_grow_buffer_unsafe(j); + t = rjpeg_jpeg_huff_decode(j, hdc); + + /* Bad huffman code. Corrupt JPEG? */ + if (t < 0) + return 0; + + /* 0 all the ac values now so we can do it 32-bits at a time */ + memset(data,0,64*sizeof(data[0])); + + if (t) + diff = rjpeg_extend_receive(j, t); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + /* decode AC components, see JPEG spec */ + k = 1; + do + { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) + rjpeg_grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) + { + /* fast-AC path */ + k += (r >> 4) & 15; /* run */ + s = r & 15; /* combined length */ + j->code_buffer <<= s; + j->code_bits -= s; + /* decode into unzigzag'd location */ + zig = rjpeg_jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } + else + { + int rs = rjpeg_jpeg_huff_decode(j, hac); + + /* Bad huffman code. Corrupt JPEG? */ + if (rs < 0) + return 0; + + s = rs & 15; + r = rs >> 4; + if (s == 0) + { + if (rs != 0xf0) + break; /* end block */ + k += 16; + } + else + { + k += r; + /* decode into unzigzag'd location */ + zig = rjpeg_jpeg_dezigzag[k++]; + data[zig] = (short) (rjpeg_extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int rjpeg_jpeg_decode_block_prog_dc( + rjpeg_jpeg *j, + short data[64], + rjpeg_huffman *hdc, + int b) +{ + /* Can't merge DC and AC. Corrupt JPEG? */ + if (j->spec_end != 0) + return 0; + + if (j->code_bits < 16) + rjpeg_grow_buffer_unsafe(j); + + if (j->succ_high == 0) + { + int t; + int dc; + int diff = 0; + + /* first scan for DC coefficient, must be first */ + memset(data,0,64*sizeof(data[0])); /* 0 all the ac values now */ + t = rjpeg_jpeg_huff_decode(j, hdc); + if (t) + diff = rjpeg_extend_receive(j, t); + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } + else + { + /* refinement scan for DC coefficient */ + if (rjpeg_jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +static int rjpeg_jpeg_decode_block_prog_ac( + rjpeg_jpeg *j, + short data[64], + rjpeg_huffman *hac, + int16_t *fac) +{ + int k; + + /* Can't merge DC and AC. Corrupt JPEG? */ + if (j->spec_start == 0) + return 0; + + if (j->succ_high == 0) + { + int shift = j->succ_low; + + if (j->eob_run) + { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do + { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) + rjpeg_grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) + { + /* fast-AC path */ + k += (r >> 4) & 15; /* run */ + s = r & 15; /* combined length */ + j->code_buffer <<= s; + j->code_bits -= s; + zig = rjpeg_jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } + else + { + int rs = rjpeg_jpeg_huff_decode(j, hac); + + /* Bad huffman code. Corrupt JPEG? */ + if (rs < 0) + return 0; + + s = rs & 15; + r = rs >> 4; + if (s == 0) + { + if (r < 15) + { + j->eob_run = (1 << r); + if (r) + j->eob_run += rjpeg_jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } + else + { + k += r; + zig = rjpeg_jpeg_dezigzag[k++]; + data[zig] = (short) (rjpeg_extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } + else + { + /* refinement scan for these AC coefficients */ + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) + { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) + { + short *p = &data[rjpeg_jpeg_dezigzag[k]]; + if (*p != 0) + if (rjpeg_jpeg_get_bit(j)) + if ((*p & bit) == 0) + { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } + else + { + k = j->spec_start; + do + { + int r,s; + int rs = rjpeg_jpeg_huff_decode(j, hac); + + /* Bad huffman code. Corrupt JPEG? */ + if (rs < 0) + return 0; + + s = rs & 15; + r = rs >> 4; + if (s == 0) + { + if (r < 15) + { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += rjpeg_jpeg_get_bits(j, r); + r = 64; /* force end of block */ + } + else + { + /* r=15 s=0 should write 16 0s, so we just do + * a run of 15 0s and then write s (which is 0), + * so we don't have to do anything special here */ + } + } + else + { + /* Bad huffman code. Corrupt JPEG? */ + if (s != 1) + return 0; + + /* sign bit */ + if (rjpeg_jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + /* advance by r */ + while (k <= j->spec_end) + { + short *p = &data[rjpeg_jpeg_dezigzag[k++]]; + if (*p != 0) + { + if (rjpeg_jpeg_get_bit(j)) + if ((*p & bit) == 0) + { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + else + { + if (r == 0) + { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +/* take a -128..127 value and rjpeg_clamp it and convert to 0..255 */ +static INLINE uint8_t rjpeg_clamp(int x) +{ + /* trick to use a single test to catch both cases */ + if ((unsigned int) x > 255) + return 255; + return (uint8_t) x; +} + +/* derived from jidctint -- DCT_ISLOW */ +#define RJPEG_IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,p4,p5,x0,x1,x2,x3; \ + int p2 = s2; \ + int p3 = s6; \ + int p1 = (p2+p3) * RJPEG_F2F(0.5411961f); \ + int t2 = p1 + p3 * RJPEG_F2F(-1.847759065f);\ + int t3 = p1 + p2 * RJPEG_F2F( 0.765366865f);\ + p2 = s0; \ + p3 = s4; \ + t0 = RJPEG_FSH(p2+p3); \ + t1 = RJPEG_FSH(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4) * RJPEG_F2F( 1.175875602f); \ + t0 = t0 * RJPEG_F2F( 0.298631336f); \ + t1 = t1 * RJPEG_F2F( 2.053119869f); \ + t2 = t2 * RJPEG_F2F( 3.072711026f); \ + t3 = t3 * RJPEG_F2F( 1.501321110f); \ + p1 = p5 + p1 * RJPEG_F2F(-0.899976223f); \ + p2 = p5 + p2 * RJPEG_F2F(-2.562915447f); \ + p3 = p3 * RJPEG_F2F(-1.961570560f); \ + p4 = p4 * RJPEG_F2F(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3 + +static void rjpeg_idct_block(uint8_t *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + uint8_t *o = NULL; + int16_t *d = data; + + /* columns */ + for (i = 0; i < 8; ++i,++d, ++v) + { + /* if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing */ + if ( d[ 8] == 0 + && d[16] == 0 + && d[24] == 0 + && d[32] == 0 + && d[40] == 0 + && d[48] == 0 + && d[56] == 0) + { + /* no shortcut 0 seconds + * (1|2|3|4|5|6|7)==0 0 seconds + * all separate -0.047 seconds + * 1 && 2|3 && 4|5 && 6|7: -0.047 seconds */ + int dcterm = d[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } + else + { + RJPEG_IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]); + + /* constants scaled things up by 1<<12; let's bring them back + * down, but keep 2 extra bits of precision */ + x0 += 512; + x1 += 512; + x2 += 512; + x3 += 512; + + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i = 0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) + { + /* no fast case since the first 1D IDCT spread components out */ + RJPEG_IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]); + + /* constants scaled things up by 1<<12, plus we had 1<<2 from first + * loop, plus horizontal and vertical each scale by sqrt(8) so together + * we've got an extra 1<<3, so 1<<17 total we need to remove. + * so we want to round that, which means adding 0.5 * 1<<17, + * aka 65536. Also, we'll end up with -128 to 127 that we want + * to encode as 0..255 by adding 128, so we'll add that before the shift + */ + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + + /* Tried computing the shifts into temps, or'ing the temps to see + * if any were out of range, but that was slower */ + o[0] = rjpeg_clamp((x0+t3) >> 17); + o[7] = rjpeg_clamp((x0-t3) >> 17); + o[1] = rjpeg_clamp((x1+t2) >> 17); + o[6] = rjpeg_clamp((x1-t2) >> 17); + o[2] = rjpeg_clamp((x2+t1) >> 17); + o[5] = rjpeg_clamp((x2-t1) >> 17); + o[3] = rjpeg_clamp((x3+t0) >> 17); + o[4] = rjpeg_clamp((x3-t0) >> 17); + } +} + +#if defined(__SSE2__) +/* sse2 integer IDCT. not the fastest possible implementation but it + * produces bit-identical results to the generic C version so it's + * fully "transparent". + */ +static void rjpeg_idct_simd(uint8_t *out, int out_stride, short data[64]) +{ + /* This is constructed to match our regular (generic) integer IDCT exactly. */ + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + /* dot product constant: even elems=x, odd elems=y */ + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + /* out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + * out(1) = c1[even]*x + c1[odd]*y + */ + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + /* out = in << 12 (in 16-bit, out 32-bit) */ + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + /* wide add */ + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + /* wide sub */ + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + /* butterfly a/b, add bias, then shift by "s" and pack */ + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + /* 8-bit interleave step (for transposes) */ + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + /* 16-bit interleave step (for transposes) */ + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(RJPEG_F2F(0.5411961f), RJPEG_F2F(0.5411961f) + RJPEG_F2F(-1.847759065f)); + __m128i rot0_1 = dct_const(RJPEG_F2F(0.5411961f) + RJPEG_F2F( 0.765366865f), RJPEG_F2F(0.5411961f)); + __m128i rot1_0 = dct_const(RJPEG_F2F(1.175875602f) + RJPEG_F2F(-0.899976223f), RJPEG_F2F(1.175875602f)); + __m128i rot1_1 = dct_const(RJPEG_F2F(1.175875602f), RJPEG_F2F(1.175875602f) + RJPEG_F2F(-2.562915447f)); + __m128i rot2_0 = dct_const(RJPEG_F2F(-1.961570560f) + RJPEG_F2F( 0.298631336f), RJPEG_F2F(-1.961570560f)); + __m128i rot2_1 = dct_const(RJPEG_F2F(-1.961570560f), RJPEG_F2F(-1.961570560f) + RJPEG_F2F( 3.072711026f)); + __m128i rot3_0 = dct_const(RJPEG_F2F(-0.390180644f) + RJPEG_F2F( 2.053119869f), RJPEG_F2F(-0.390180644f)); + __m128i rot3_1 = dct_const(RJPEG_F2F(-0.390180644f), RJPEG_F2F(-0.390180644f) + RJPEG_F2F( 1.501321110f)); + + /* rounding biases in column/row passes, see rjpeg_idct_block for explanation. */ + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + /* load */ + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + /* column pass */ + dct_pass(bias_0, 10); + + { + /* 16bit 8x8 transpose pass 1 */ + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + /* transpose pass 2 */ + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + /* transpose pass 3 */ + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + /* row pass */ + dct_pass(bias_1, 17); + + { + /* pack */ + __m128i p0 = _mm_packus_epi16(row0, row1); /* a0a1a2a3...a7b0b1b2b3...b7 */ + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + /* 8bit 8x8 transpose pass 1 */ + dct_interleave8(p0, p2); /* a0e0a1e1... */ + dct_interleave8(p1, p3); /* c0g0c1g1... */ + + /* transpose pass 2 */ + dct_interleave8(p0, p1); /* a0c0e0g0... */ + dct_interleave8(p2, p3); /* b0d0f0h0... */ + + /* transpose pass 3 */ + dct_interleave8(p0, p2); /* a0b0c0d0... */ + dct_interleave8(p1, p3); /* a4b4c4d4... */ + + /* store */ + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif + +#ifdef RJPEG_NEON + +/* NEON integer IDCT. should produce bit-identical + * results to the generic C version. */ +static void rjpeg_idct_simd(uint8_t *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(RJPEG_F2F(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(RJPEG_F2F(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(RJPEG_F2F( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(RJPEG_F2F( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(RJPEG_F2F(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(RJPEG_F2F(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(RJPEG_F2F(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(RJPEG_F2F(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(RJPEG_F2F( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(RJPEG_F2F( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(RJPEG_F2F( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(RJPEG_F2F( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +/* wide add */ +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +/* wide sub */ +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +/* butterfly a/b, then shift using "shiftop" by "s" and pack */ +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + /* load */ + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + /* add DC bias */ + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + /* column pass */ + dct_pass(vrshrn_n_s32, 10); + + /* 16bit 8x8 transpose */ + { +/* these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. + * whether compilers actually get this is another story, sadly. */ +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + /* pass 1 */ + dct_trn16(row0, row1); /* a0b0a2b2a4b4a6b6 */ + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + /* pass 2 */ + dct_trn32(row0, row2); /* a0b0c0d0a4b4c4d4 */ + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + /* pass 3 */ + dct_trn64(row0, row4); /* a0b0c0d0e0f0g0h0 */ + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + /* row pass + * vrshrn_n_s32 only supports shifts up to 16, we need + * 17. so do a non-rounding shift of 16 first then follow + * up with a rounding shift by 1. */ + dct_pass(vshrn_n_s32, 16); + + { + /* pack and round */ + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + /* again, these can translate into one instruction, but often don't. */ +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + /* sadly can't use interleaved stores here since we only write + * 8 bytes to each scan line! */ + + /* 8x8 8-bit transpose pass 1 */ + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + /* pass 2 */ + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + /* pass 3 */ + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + /* store */ + vst1_u8(out, p0); + out += out_stride; + vst1_u8(out, p1); + out += out_stride; + vst1_u8(out, p2); + out += out_stride; + vst1_u8(out, p3); + out += out_stride; + vst1_u8(out, p4); + out += out_stride; + vst1_u8(out, p5); + out += out_stride; + vst1_u8(out, p6); + out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif /* RJPEG_NEON */ + +static uint8_t rjpeg_get_marker(rjpeg_jpeg *j) +{ + uint8_t x; + + if (j->marker != RJPEG_MARKER_NONE) + { + x = j->marker; + j->marker = RJPEG_MARKER_NONE; + return x; + } + + x = rjpeg_get8(j->s); + if (x != 0xff) + return RJPEG_MARKER_NONE; + while (x == 0xff) + x = rjpeg_get8(j->s); + return x; +} + +/* after a restart interval, rjpeg_jpeg_reset the entropy decoder and + * the dc prediction + */ +static void rjpeg_jpeg_reset(rjpeg_jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = 0; + j->img_comp[1].dc_pred = 0; + j->img_comp[2].dc_pred = 0; + j->marker = RJPEG_MARKER_NONE; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + + /* no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + * since we don't even allow 1<<30 pixels */ +} + +static int rjpeg_parse_entropy_coded_data(rjpeg_jpeg *z) +{ + rjpeg_jpeg_reset(z); + + if (z->scan_n == 1) + { + int i, j; + int n = z->order[0]; + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + + /* non-interleaved data, we just need to process one block at a time, + * in trivial scanline order + * number of blocks to do just depends on how many actual "pixels" this + * component has, independent of interleaved MCU blocking and such */ + + if (z->progressive) + { + for (j = 0; j < h; ++j) + { + for (i = 0; i < w; ++i) + { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + + if (z->spec_start == 0) + { + if (!rjpeg_jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + else + { + int ha = z->img_comp[n].ha; + if (!rjpeg_jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + + /* every data block is an MCU, so countdown the restart interval */ + if (--z->todo <= 0) + { + if (z->code_bits < 24) + rjpeg_grow_buffer_unsafe(z); + + if (!RJPEG_RESTART(z->marker)) + return 1; + rjpeg_jpeg_reset(z); + } + } + } + } + else + { + RJPEG_SIMD_ALIGN(short, data[64]); + + for (j = 0; j < h; ++j) + { + for (i = 0; i < w; ++i) + { + int ha = z->img_comp[n].ha; + if (!rjpeg_jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, + z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) + return 0; + + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, + z->img_comp[n].w2, data); + + /* every data block is an MCU, so countdown the restart interval */ + if (--z->todo <= 0) + { + if (z->code_bits < 24) + rjpeg_grow_buffer_unsafe(z); + + /* if it's NOT a restart, then just bail, + * so we get corrupt data rather than no data */ + if (!RJPEG_RESTART(z->marker)) + return 1; + rjpeg_jpeg_reset(z); + } + } + } + } + } + else + { + /* interleaved */ + int i,j,k,x,y; + + if (z->progressive) + { + for (j = 0; j < z->img_mcu_y; ++j) + { + for (i = 0; i < z->img_mcu_x; ++i) + { + /* scan an interleaved MCU... process scan_n components in order */ + for (k = 0; k < z->scan_n; ++k) + { + int n = z->order[k]; + /* scan out an MCU's worth of this component; that's just determined + * by the basic H and V specified for the component */ + for (y = 0; y < z->img_comp[n].v; ++y) + { + for (x = 0; x < z->img_comp[n].h; ++x) + { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!rjpeg_jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + + /* after all interleaved components, that's an interleaved MCU, + * so now count down the restart interval */ + if (--z->todo <= 0) + { + if (z->code_bits < 24) + rjpeg_grow_buffer_unsafe(z); + if (!RJPEG_RESTART(z->marker)) + return 1; + rjpeg_jpeg_reset(z); + } + } + } + } + else + { + RJPEG_SIMD_ALIGN(short, data[64]); + + for (j = 0; j < z->img_mcu_y; ++j) + { + for (i = 0; i < z->img_mcu_x; ++i) + { + /* scan an interleaved MCU... process scan_n components in order */ + for (k = 0; k < z->scan_n; ++k) + { + int n = z->order[k]; + /* scan out an MCU's worth of this component; that's just determined + * by the basic H and V specified for the component */ + for (y = 0; y < z->img_comp[n].v; ++y) + { + for (x = 0; x < z->img_comp[n].h; ++x) + { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + + if (!rjpeg_jpeg_decode_block(z, data, + z->huff_dc+z->img_comp[n].hd, + z->huff_ac+ha, z->fast_ac[ha], + n, z->dequant[z->img_comp[n].tq])) + return 0; + + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, + z->img_comp[n].w2, data); + } + } + } + + /* after all interleaved components, that's an interleaved MCU, + * so now count down the restart interval */ + if (--z->todo <= 0) + { + if (z->code_bits < 24) + rjpeg_grow_buffer_unsafe(z); + if (!RJPEG_RESTART(z->marker)) + return 1; + rjpeg_jpeg_reset(z); + } + } + } + } + } + + return 1; +} + +static void rjpeg_jpeg_dequantize(short *data, uint8_t *dequant) +{ + int i; + for (i = 0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void rjpeg_jpeg_finish(rjpeg_jpeg *z) +{ + int i,j,n; + + if (!z->progressive) + return; + + /* dequantize and IDCT the data */ + for (n = 0; n < z->s->img_n; ++n) + { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j = 0; j < h; ++j) + { + for (i = 0; i < w; ++i) + { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + rjpeg_jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, + z->img_comp[n].w2, data); + } + } + } +} + +static int rjpeg_process_marker(rjpeg_jpeg *z, int m) +{ + int L; + switch (m) + { + case RJPEG_MARKER_NONE: /* no marker found */ + /* Expected marker. Corrupt JPEG? */ + return 0; + + case 0xDD: /* DRI - specify restart interval */ + + /* Bad DRI length. Corrupt JPEG? */ + if (RJPEG_GET16BE(z->s) != 4) + return 0; + + z->restart_interval = RJPEG_GET16BE(z->s); + return 1; + + case 0xDB: /* DQT - define quantization table */ + L = RJPEG_GET16BE(z->s)-2; + while (L > 0) + { + int q = rjpeg_get8(z->s); + int p = q >> 4; + int t = q & 15,i; + + /* Bad DQT type. Corrupt JPEG? */ + if (p != 0) + return 0; + + /* Bad DQT table. Corrupt JPEG? */ + if (t > 3) + return 0; + + for (i = 0; i < 64; ++i) + z->dequant[t][rjpeg_jpeg_dezigzag[i]] = rjpeg_get8(z->s); + L -= 65; + } + return L == 0; + + case 0xC4: /* DHT - define huffman table */ + L = RJPEG_GET16BE(z->s)-2; + while (L > 0) + { + int sizes[16],i,n = 0; + uint8_t *v = NULL; + int q = rjpeg_get8(z->s); + int tc = q >> 4; + int th = q & 15; + + /* Bad DHT header. Corrupt JPEG? */ + if (tc > 1 || th > 3) + return 0; + + for (i = 0; i < 16; ++i) + { + sizes[i] = rjpeg_get8(z->s); + n += sizes[i]; + } + L -= 17; + + if (tc == 0) + { + if (!rjpeg_build_huffman(z->huff_dc+th, sizes)) + return 0; + v = z->huff_dc[th].values; + } + else + { + if (!rjpeg_build_huffman(z->huff_ac+th, sizes)) + return 0; + v = z->huff_ac[th].values; + } + for (i = 0; i < n; ++i) + v[i] = rjpeg_get8(z->s); + if (tc != 0) + rjpeg_build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L == 0; + } + + /* check for comment block or APP blocks */ + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) + { + int n = RJPEG_GET16BE(z->s)-2; + + if (n < 0) + z->s->img_buffer = z->s->img_buffer_end; + else + z->s->img_buffer += n; + + return 1; + } + return 0; +} + +/* after we see SOS */ +static int rjpeg_process_scan_header(rjpeg_jpeg *z) +{ + int i; + int aa; + int Ls = RJPEG_GET16BE(z->s); + + z->scan_n = rjpeg_get8(z->s); + + /* Bad SOS component count. Corrupt JPEG? */ + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) + return 0; + + /* Bad SOS length. Corrupt JPEG? */ + if (Ls != 6+2*z->scan_n) + return 0; + + for (i = 0; i < z->scan_n; ++i) + { + int which; + int id = rjpeg_get8(z->s); + int q = rjpeg_get8(z->s); + + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) + return 0; /* no match */ + + /* Bad DC huff. Corrupt JPEG? */ + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) + return 0; + + /* Bad AC huff. Corrupt JPEG? */ + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) + return 0; + + z->order[i] = which; + } + + z->spec_start = rjpeg_get8(z->s); + z->spec_end = rjpeg_get8(z->s); /* should be 63, but might be 0 */ + aa = rjpeg_get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + + if (z->progressive) + { + /* Bad SOS. Corrupt JPEG? */ + if ( z->spec_start > 63 || + z->spec_end > 63 || + z->spec_start > z->spec_end || + z->succ_high > 13 || + z->succ_low > 13) + return 0; + } + else + { + /* Bad SOS. Corrupt JPEG? */ + if (z->spec_start != 0) + return 0; + if (z->succ_high != 0 || z->succ_low != 0) + return 0; + + z->spec_end = 63; + } + + return 1; +} + +static int rjpeg_process_frame_header(rjpeg_jpeg *z, int scan) +{ + rjpeg_context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = RJPEG_GET16BE(s); + + /* JPEG */ + + /* Bad SOF len. Corrupt JPEG? */ + if (Lf < 11) + return 0; + + p = rjpeg_get8(s); + + /* JPEG baseline */ + + /* Only 8-bit. JPEG format not supported? */ + if (p != 8) + return 0; + + s->img_y = RJPEG_GET16BE(s); + + /* Legal, but we don't handle it--but neither does IJG */ + + /* No header height, JPEG format not supported? */ + if (s->img_y == 0) + return 0; + + s->img_x = RJPEG_GET16BE(s); + + /* No header width. Corrupt JPEG? */ + if (s->img_x == 0) + return 0; + + c = rjpeg_get8(s); + + /* JFIF requires */ + + /* Bad component count. Corrupt JPEG? */ + if (c != 3 && c != 1) + return 0; + + s->img_n = c; + + for (i = 0; i < c; ++i) + { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + /* Bad SOF length. Corrupt JPEG? */ + if (Lf != 8+3*s->img_n) + return 0; + + for (i = 0; i < s->img_n; ++i) + { + z->img_comp[i].id = rjpeg_get8(s); + if (z->img_comp[i].id != i+1) /* JFIF requires */ + if (z->img_comp[i].id != i) /* some version of jpegtran outputs non-JFIF-compliant files! */ + return 0; + + q = rjpeg_get8(s); + z->img_comp[i].h = (q >> 4); + + /* Bad H. Corrupt JPEG? */ + if (!z->img_comp[i].h || z->img_comp[i].h > 4) + return 0; + + z->img_comp[i].v = q & 15; + + /* Bad V. Corrupt JPEG? */ + if (!z->img_comp[i].v || z->img_comp[i].v > 4) + return 0; + + z->img_comp[i].tq = rjpeg_get8(s); + + /* Bad TQ. Corrupt JPEG? */ + if (z->img_comp[i].tq > 3) + return 0; + } + + if (scan != RJPEG_SCAN_LOAD) + return 1; + + /* Image too large to decode? */ + if ((1 << 30) / s->img_x / s->img_n < s->img_y) + return 0; + + for (i = 0; i < s->img_n; ++i) + { + if (z->img_comp[i].h > h_max) + h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) + v_max = z->img_comp[i].v; + } + + /* compute interleaved MCU info */ + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + if (z->progressive) + { + for (i = 0; i < s->img_n; ++i) + { + /* number of effective pixels (e.g. for non-interleaved MCU) */ + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + + /* to simplify generation, we'll allocate enough memory to decode + * the bogus oversized data from using interleaved MCUs and their + * big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + * discard the extra data until colorspace conversion */ + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + + /* Out of memory? */ + if (!z->img_comp[i].raw_data) + { + for (--i; i >= 0; --i) + { + free(z->img_comp[i].raw_data); + z->img_comp[i].data = NULL; + } + + return 0; + } + + /* align blocks for IDCT using MMX/SSE */ + z->img_comp[i].data = (uint8_t*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; + z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; + z->img_comp[i].raw_coeff = malloc(z->img_comp[i].coeff_w * + z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + else + { + for (i = 0; i < s->img_n; ++i) + { + /* number of effective pixels (e.g. for non-interleaved MCU) */ + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + + /* to simplify generation, we'll allocate enough memory to decode + * the bogus oversized data from using interleaved MCUs and their + * big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + * discard the extra data until colorspace conversion */ + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + + /* Out of memory? */ + if (!z->img_comp[i].raw_data) + { + for (--i; i >= 0; --i) + { + free(z->img_comp[i].raw_data); + z->img_comp[i].data = NULL; + } + } + + /* align blocks for IDCT using MMX/SSE */ + z->img_comp[i].data = (uint8_t*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + } + } + + return 1; +} + +static int rjpeg_decode_jpeg_header(rjpeg_jpeg *z, int scan) +{ + int m; + z->marker = RJPEG_MARKER_NONE; /* initialize cached marker to empty */ + m = rjpeg_get_marker(z); + + /* No SOI. Corrupt JPEG? */ + if (m != JPEG_MARKER_SOI) + return 0; + + if (scan == RJPEG_SCAN_TYPE) + return 1; + + m = rjpeg_get_marker(z); + while (!RJPEG_SOF(m)) + { + if (!rjpeg_process_marker(z,m)) + return 0; + m = rjpeg_get_marker(z); + while (m == RJPEG_MARKER_NONE) + { + /* some files have extra padding after their blocks, so ok, we'll scan */ + + /* No SOF. Corrupt JPEG? */ + if (RJPEG_AT_EOF(z->s)) + return 0; + + m = rjpeg_get_marker(z); + } + } + z->progressive = RJPEG_SOF_PROGRESSIVE(m); + if (!rjpeg_process_frame_header(z, scan)) + return 0; + return 1; +} + +/* decode image to YCbCr format */ +static int rjpeg_decode_jpeg_image(rjpeg_jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) + { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!rjpeg_decode_jpeg_header(j, RJPEG_SCAN_LOAD)) + return 0; + m = rjpeg_get_marker(j); + + while (m != JPEG_MARKER_EOI) + { + if (m == JPEG_MARKER_SOS) + { + if (!rjpeg_process_scan_header(j)) + return 0; + if (!rjpeg_parse_entropy_coded_data(j)) + return 0; + + if (j->marker == RJPEG_MARKER_NONE ) + { + /* handle 0s at the end of image data from IP Kamera 9060 */ + + while (!RJPEG_AT_EOF(j->s)) + { + int x = rjpeg_get8(j->s); + if (x == 255) + { + j->marker = rjpeg_get8(j->s); + break; + } + else if (x != 0) /* Junk before marker. Corrupt JPEG? */ + return 0; + } + + /* if we reach eof without hitting a marker, + * rjpeg_get_marker() below will fail and we'll eventually return 0 */ + } + } + else + { + if (!rjpeg_process_marker(j, m)) + return 0; + } + m = rjpeg_get_marker(j); + } + + if (j->progressive) + rjpeg_jpeg_finish(j); + return 1; +} + +/* static jfif-centered resampling (across block boundaries) */ + +static uint8_t *rjpeg_resample_row_1(uint8_t *out, uint8_t *in_near, + uint8_t *in_far, int w, int hs) +{ + (void)out; + (void)in_far; + (void)w; + (void)hs; + return in_near; +} + +static uint8_t* rjpeg_resample_row_v_2(uint8_t *out, uint8_t *in_near, + uint8_t *in_far, int w, int hs) +{ + /* need to generate two samples vertically for every one in input */ + int i; + (void)hs; + for (i = 0; i < w; ++i) + out[i] = RJPEG_DIV4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static uint8_t* rjpeg_resample_row_h_2(uint8_t *out, uint8_t *in_near, + uint8_t *in_far, int w, int hs) +{ + /* need to generate two samples horizontally for every one in input */ + int i; + uint8_t *input = in_near; + + if (w == 1) + { + /* if only one sample, can't do any interpolation */ + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = RJPEG_DIV4(input[0]*3 + input[1] + 2); + + for (i=1; i < w-1; ++i) + { + int n = 3 * input[i] + 2; + out[i*2+0] = RJPEG_DIV4(n+input[i-1]); + out[i*2+1] = RJPEG_DIV4(n+input[i+1]); + } + out[i*2+0] = RJPEG_DIV4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + (void)in_far; + (void)hs; + + return out; +} + +static uint8_t *rjpeg_resample_row_hv_2(uint8_t *out, uint8_t *in_near, + uint8_t *in_far, int w, int hs) +{ + /* need to generate 2x2 samples for every one in input */ + int i,t0,t1; + if (w == 1) + { + out[0] = out[1] = RJPEG_DIV4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = RJPEG_DIV4(t1+2); + + for (i = 1; i < w; ++i) + { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = RJPEG_DIV16(3*t0 + t1 + 8); + out[i*2 ] = RJPEG_DIV16(3*t1 + t0 + 8); + } + out[w*2-1] = RJPEG_DIV4(t1+2); + + (void)hs; + + return out; +} + +#if defined(__SSE2__) || defined(RJPEG_NEON) +static uint8_t *rjpeg_resample_row_hv_2_simd(uint8_t *out, uint8_t *in_near, + uint8_t *in_far, int w, int hs) +{ + /* need to generate 2x2 samples for every one in input */ + int i = 0,t0,t1; + + if (w == 1) + { + out[0] = out[1] = RJPEG_DIV4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + /* process groups of 8 pixels for as long as we can. + * note we can't handle the last pixel in a row in this loop + * because we need to handle the filter boundary conditions. + */ + for (; i < ((w-1) & ~7); i += 8) + { +#if defined(__SSE2__) + /* load and perform the vertical filtering pass + * this uses 3*x + y = 4*x + (y - x) */ + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); /* current row */ + + /* horizontal filter works the same based on shifted vers of current + * row. "prev" is current row shifted right by 1 pixel; we need to + * insert the previous pixel value (from t1). + * "next" is current row shifted left by 1 pixel, with first pixel + * of next block of 8 pixels added in. + */ + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + /* horizontal filter, polyphase implementation since it's convenient: + * even pixels = 3*cur + prev = cur*4 + (prev - cur) + * odd pixels = 3*cur + next = cur*4 + (next - cur) + * note the shared term. */ + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + /* interleave even and odd pixels, then undo scaling. */ + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + /* pack and write output */ + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(RJPEG_NEON) + /* load and perform the vertical filtering pass + * this uses 3*x + y = 4*x + (y - x) */ + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); /* current row */ + + /* horizontal filter works the same based on shifted vers of current + * row. "prev" is current row shifted right by 1 pixel; we need to + * insert the previous pixel value (from t1). + * "next" is current row shifted left by 1 pixel, with first pixel + * of next block of 8 pixels added in. */ + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + /* horizontal filter, polyphase implementation since it's convenient: + * even pixels = 3*cur + prev = cur*4 + (prev - cur) + * odd pixels = 3*cur + next = cur*4 + (next - cur) + * note the shared term. + */ + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + /* undo scaling and round, then store with even/odd phases interleaved */ + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + /* "previous" value for next iteration */ + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = RJPEG_DIV16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) + { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = RJPEG_DIV16(3*t0 + t1 + 8); + out[i*2 ] = RJPEG_DIV16(3*t1 + t0 + 8); + } + out[w*2-1] = RJPEG_DIV4(t1+2); + + (void)hs; + + return out; +} +#endif + +static uint8_t *rjpeg_resample_row_generic(uint8_t *out, + uint8_t *in_near, uint8_t *in_far, int w, int hs) +{ + /* resample with nearest-neighbor */ + int i,j; + (void)in_far; + + for (i = 0; i < w; ++i) + for (j = 0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +/* this is a reduced-precision calculation of YCbCr-to-RGB introduced + * to make sure the code produces the same results in both SIMD and scalar */ +#ifndef FLOAT2FIXED +#define FLOAT2FIXED(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +#endif + +static void rjpeg_YCbCr_to_RGB_row(uint8_t *out, const uint8_t *y, + const uint8_t *pcb, const uint8_t *pcr, int count, int step) +{ + int i; + for (i = 0; i < count; ++i) + { + int y_fixed = (y[i] << 20) + (1<<19); /* rounding */ + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + int r = y_fixed + cr* FLOAT2FIXED(1.40200f); + int g = y_fixed + (cr*-FLOAT2FIXED(0.71414f)) + ((cb*-FLOAT2FIXED(0.34414f)) & 0xffff0000); + int b = y_fixed + cb* FLOAT2FIXED(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) + r = 255; + if ((unsigned) g > 255) + g = 255; + if ((unsigned) b > 255) + b = 255; + out[0] = (uint8_t)r; + out[1] = (uint8_t)g; + out[2] = (uint8_t)b; + out[3] = 255; + out += step; + } +} + +#if defined(__SSE2__) || defined(RJPEG_NEON) +static void rjpeg_YCbCr_to_RGB_simd(uint8_t *out, const uint8_t *y, + const uint8_t *pcb, const uint8_t *pcr, int count, int step) +{ + int i = 0; + +#if defined(__SSE2__) + /* step == 3 is pretty ugly on the final interleave, and i'm not convinced + * it's useful in practice (you wouldn't use it for textures, for example). + * so just accelerate step == 4 case. + */ + if (step == 4) + { + /* this is a fairly straightforward implementation and not super-optimized. */ + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); /* alpha channel */ + + for (; i+7 < count; i += 8) + { + /* load */ + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); /* -128 */ + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); /* -128 */ + + /* unpack to short (and left-shift cr, cb by 8) */ + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + /* color transform */ + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + /* descale */ + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + /* back to byte, set up for transpose */ + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + /* transpose to interleave channels */ + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + /* store */ + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef RJPEG_NEON + /* in this version, step=3 support would be easy to add. but is there demand? */ + if (step == 4) + { + /* this is a fairly straightforward implementation and not super-optimized. */ + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) + { + uint8x8x4_t o; + + /* load */ + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + /* expand to s16 */ + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + /* color transform */ + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + /* undo scaling, round, convert to byte */ + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + /* store, interleaving r/g/b/a */ + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) + { + int y_fixed = (y[i] << 20) + (1<<19); /* rounding */ + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + int r = y_fixed + cr* FLOAT2FIXED(1.40200f); + int g = y_fixed + cr*-FLOAT2FIXED(0.71414f) + ((cb*-FLOAT2FIXED(0.34414f)) & 0xffff0000); + int b = y_fixed + cb* FLOAT2FIXED(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) + r = 255; + if ((unsigned) g > 255) + g = 255; + if ((unsigned) b > 255) + b = 255; + out[0] = (uint8_t)r; + out[1] = (uint8_t)g; + out[2] = (uint8_t)b; + out[3] = 255; + out += step; + } +} +#endif + +/* set up the kernels */ +static void rjpeg_setup_jpeg(rjpeg_jpeg *j) +{ + uint64_t mask = cpu_features_get(); + + (void)mask; + + j->idct_block_kernel = rjpeg_idct_block; + j->YCbCr_to_RGB_kernel = rjpeg_YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = rjpeg_resample_row_hv_2; + +#if defined(__SSE2__) + if (mask & RETRO_SIMD_SSE2) + { + j->idct_block_kernel = rjpeg_idct_simd; + j->YCbCr_to_RGB_kernel = rjpeg_YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = rjpeg_resample_row_hv_2_simd; + } +#endif + +#ifdef RJPEG_NEON + j->idct_block_kernel = rjpeg_idct_simd; + j->YCbCr_to_RGB_kernel = rjpeg_YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = rjpeg_resample_row_hv_2_simd; +#endif +} + +/* clean up the temporary component buffers */ +static void rjpeg_cleanup_jpeg(rjpeg_jpeg *j) +{ + int i; + for (i = 0; i < j->s->img_n; ++i) + { + if (j->img_comp[i].raw_data) + { + free(j->img_comp[i].raw_data); + j->img_comp[i].raw_data = NULL; + j->img_comp[i].data = NULL; + } + + if (j->img_comp[i].raw_coeff) + { + free(j->img_comp[i].raw_coeff); + j->img_comp[i].raw_coeff = 0; + j->img_comp[i].coeff = 0; + } + + if (j->img_comp[i].linebuf) + { + free(j->img_comp[i].linebuf); + j->img_comp[i].linebuf = NULL; + } + } +} + +static uint8_t *rjpeg_load_jpeg_image(rjpeg_jpeg *z, + unsigned *out_x, unsigned *out_y, int *comp, int req_comp) +{ + int n, decode_n; + int k; + unsigned int i,j; + rjpeg_resample res_comp[4]; + uint8_t *coutput[4] = {0}; + uint8_t *output = NULL; + z->s->img_n = 0; + + /* load a jpeg image from whichever source, but leave in YCbCr format */ + if (!rjpeg_decode_jpeg_image(z)) + goto error; + + /* determine actual number of components to generate */ + n = req_comp ? req_comp : z->s->img_n; + + if (z->s->img_n == 3 && n < 3) + decode_n = 1; + else + decode_n = z->s->img_n; + + /* resample and color-convert */ + for (k = 0; k < decode_n; ++k) + { + rjpeg_resample *r = &res_comp[k]; + + /* allocate line buffer big enough for upsampling off the edges + * with upsample factor of 4 */ + z->img_comp[k].linebuf = (uint8_t *) malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) + goto error; + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + r->resample = rjpeg_resample_row_generic; + + if (r->hs == 1 && r->vs == 1) + r->resample = rjpeg_resample_row_1; + else if (r->hs == 1 && r->vs == 2) + r->resample = rjpeg_resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) + r->resample = rjpeg_resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) + r->resample = z->resample_row_hv_2_kernel; + } + + /* can't error after this so, this is safe */ + output = (uint8_t *) malloc(n * z->s->img_x * z->s->img_y + 1); + + if (!output) + goto error; + + /* now go ahead and resample */ + for (j = 0; j < z->s->img_y; ++j) + { + uint8_t *out = output + n * z->s->img_x * j; + for (k = 0; k < decode_n; ++k) + { + rjpeg_resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + + if (++r->ystep >= r->vs) + { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + + if (n >= 3) + { + uint8_t *y = coutput[0]; + if (y) + { + if (z->s->img_n == 3) + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + else + for (i = 0; i < z->s->img_x; ++i) + { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; /* not used if n==3 */ + out += n; + } + } + } + else + { + uint8_t *y = coutput[0]; + if (n == 1) + for (i = 0; i < z->s->img_x; ++i) + out[i] = y[i]; + else + for (i = 0; i < z->s->img_x; ++i) + { + *out++ = y[i]; + *out++ = 255; + } + } + } + + rjpeg_cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + + if (comp) + *comp = z->s->img_n; /* report original components, not output */ + return output; + +error: + rjpeg_cleanup_jpeg(z); + return NULL; +} + +int rjpeg_process_image(rjpeg_t *rjpeg, void **buf_data, + size_t size, unsigned *width, unsigned *height) +{ + rjpeg_jpeg j; + rjpeg_context s; + int comp; + uint32_t *img = NULL; + uint32_t *pixels = NULL; + unsigned size_tex = 0; + + if (!rjpeg) + return IMAGE_PROCESS_ERROR; + + s.img_buffer = (uint8_t*)rjpeg->buff_data; + s.img_buffer_original = (uint8_t*)rjpeg->buff_data; + s.img_buffer_end = (uint8_t*)rjpeg->buff_data + (int)size; + + j.s = &s; + + rjpeg_setup_jpeg(&j); + + img = (uint32_t*)rjpeg_load_jpeg_image(&j, width, height, &comp, 4); + + if (!img) + return IMAGE_PROCESS_ERROR; + + size_tex = (*width) * (*height); + pixels = (uint32_t*)malloc(size_tex * sizeof(uint32_t)); + + if (!pixels) + { + free(img); + return IMAGE_PROCESS_ERROR; + } + + *buf_data = pixels; + + /* Convert RGBA to ARGB */ + while (size_tex--) + { + unsigned int texel = img[size_tex]; + unsigned int A = texel & 0xFF000000; + unsigned int B = texel & 0x00FF0000; + unsigned int G = texel & 0x0000FF00; + unsigned int R = texel & 0x000000FF; + ((unsigned int*)pixels)[size_tex] = A | (R << 16) | G | (B >> 16); + } + + free(img); + + return IMAGE_PROCESS_END; +} + +bool rjpeg_set_buf_ptr(rjpeg_t *rjpeg, void *data) +{ + if (!rjpeg) + return false; + + rjpeg->buff_data = (uint8_t*)data; + + return true; +} + +void rjpeg_free(rjpeg_t *rjpeg) +{ + if (!rjpeg) + return; + + free(rjpeg); +} + +rjpeg_t *rjpeg_alloc(void) +{ + rjpeg_t *rjpeg = (rjpeg_t*)calloc(1, sizeof(*rjpeg)); + if (!rjpeg) + return NULL; + return rjpeg; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/json
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/json/jsonsax.c
Added
@@ -0,0 +1,316 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (jsonsax.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <setjmp.h> +#include <string.h> +#include <ctype.h> + +#include <retro_inline.h> +#include <formats/jsonsax.h> + +#ifdef JSONSAX_ERRORS +const char* jsonsax_errors[] = +{ + "Ok", + "Interrupted", + "Missing key", + "Unterminated key", + "Missing value", + "Unterminated object", + "Unterminated array", + "Unterminated string", + "Invalid value" +}; +#endif + +typedef struct +{ + const jsonsax_handlers_t* handlers; + + const char* json; + void* ud; + jmp_buf env; +} +state_t; + +static INLINE void skip_spaces( state_t* state ) +{ + while ( isspace( (unsigned char)*state->json ) ) + state->json++; +} + +static INLINE void skip_digits( state_t* state ) +{ + while ( isdigit( (unsigned char)*state->json ) ) + state->json++; +} + +#define HANDLE_0( event ) \ + do { \ + if ( state->handlers->event && state->handlers->event( state->ud ) ) \ + longjmp( state->env, JSONSAX_INTERRUPTED ); \ + } while ( 0 ) + +#define HANDLE_1( event, arg1 ) \ + do { \ + if ( state->handlers->event && state->handlers->event( state->ud, arg1 ) ) \ + longjmp( state->env, JSONSAX_INTERRUPTED ); \ + } while ( 0 ) + +#define HANDLE_2( event, arg1, arg2 ) \ + do { \ + if ( state->handlers->event && state->handlers->event( state->ud, arg1, arg2 ) ) \ + longjmp( state->env, JSONSAX_INTERRUPTED ); \ + } while ( 0 ) + +static void jsonx_parse_value(state_t* state); + +static void jsonx_parse_object( state_t* state ) +{ + state->json++; /* we're sure the current character is a '{' */ + skip_spaces( state ); + HANDLE_0( start_object ); + + while ( *state->json != '}' ) + { + const char *name = NULL; + if ( *state->json != '"' ) + longjmp( state->env, JSONSAX_MISSING_KEY ); + + name = ++state->json; + + for ( ;; ) + { + const char* quote = strchr( state->json, '"' ); + + if ( !quote ) + longjmp( state->env, JSONSAX_UNTERMINATED_KEY ); + + state->json = quote + 1; + + if ( quote[ -1 ] != '\\' ) + break; + } + + HANDLE_2( key, name, state->json - name - 1 ); + skip_spaces( state ); + + if ( *state->json != ':' ) + longjmp( state->env, JSONSAX_MISSING_VALUE ); + + state->json++; + skip_spaces( state ); + jsonx_parse_value( state ); + skip_spaces( state ); + + if ( *state->json != ',' ) + break; + + state->json++; + skip_spaces( state ); + } + + if ( *state->json != '}' ) + longjmp( state->env, JSONSAX_UNTERMINATED_OBJECT ); + + state->json++; + HANDLE_0( end_object ); +} + +static void jsonx_parse_array(state_t* state) +{ + unsigned int ndx = 0; + + state->json++; /* we're sure the current character is a '[' */ + skip_spaces( state ); + HANDLE_0( start_array ); + + while ( *state->json != ']' ) + { + HANDLE_1( array_index, ndx++ ); + jsonx_parse_value( state ); + skip_spaces( state ); + + if ( *state->json != ',' ) + break; + + state->json++; + skip_spaces( state ); + } + + if ( *state->json != ']' ) + longjmp( state->env, JSONSAX_UNTERMINATED_ARRAY ); + + state->json++; + HANDLE_0( end_array ); +} + +static void jsonx_parse_string(state_t* state) +{ + const char* string = ++state->json; + + for ( ;; ) + { + const char* quote = strchr( state->json, '"' ); + + if ( !quote ) + longjmp( state->env, JSONSAX_UNTERMINATED_STRING ); + + state->json = quote + 1; + + if ( quote[ -1 ] != '\\' ) + break; + } + + HANDLE_2( string, string, state->json - string - 1 ); +} + +static void jsonx_parse_boolean(state_t* state) +{ + if ( !strncmp( state->json, "true", 4 ) ) + { + state->json += 4; + HANDLE_1( boolean, 1 ); + } + else if ( !strncmp( state->json, "false", 5 ) ) + { + state->json += 5; + HANDLE_1( boolean, 0 ); + } + else + longjmp( state->env, JSONSAX_INVALID_VALUE ); +} + +static void jsonx_parse_null(state_t* state) +{ + if ( !strncmp( state->json + 1, "ull", 3 ) ) /* we're sure the current character is a 'n' */ + { + state->json += 4; + HANDLE_0( null ); + } + else + longjmp( state->env, JSONSAX_INVALID_VALUE ); +} + +static void jsonx_parse_number(state_t* state) +{ + const char* number = state->json; + + if ( *state->json == '-' ) + state->json++; + + if ( !isdigit( (unsigned char)*state->json ) ) + longjmp( state->env, JSONSAX_INVALID_VALUE ); + + skip_digits( state ); + + if ( *state->json == '.' ) + { + state->json++; + + if ( !isdigit( (unsigned char)*state->json ) ) + longjmp( state->env, JSONSAX_INVALID_VALUE ); + + skip_digits( state ); + } + + if ( *state->json == 'e' || *state->json == 'E' ) + { + state->json++; + + if ( *state->json == '-' || *state->json == '+' ) + state->json++; + + if ( !isdigit( (unsigned char)*state->json ) ) + longjmp( state->env, JSONSAX_INVALID_VALUE ); + + skip_digits( state ); + } + + HANDLE_2( number, number, state->json - number ); +} + +static void jsonx_parse_value(state_t* state) +{ + skip_spaces( state ); + + switch ( *state->json ) + { + case '{': + jsonx_parse_object(state); + break; + case '[': + jsonx_parse_array( state ); + break; + case '"': + jsonx_parse_string( state ); + break; + case 't': + case 'f': + jsonx_parse_boolean( state ); + break; + case 'n': + jsonx_parse_null( state ); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + jsonx_parse_number( state ); + break; + + default: + longjmp( state->env, JSONSAX_INVALID_VALUE ); + } +} + +int jsonsax_parse( const char* json, const jsonsax_handlers_t* handlers, void* userdata ) +{ + state_t state; + int res; + + state.json = json; + state.handlers = handlers; + state.ud = userdata; + + if ( ( res = setjmp( state.env ) ) == 0 ) + { + if ( handlers->start_document ) + handlers->start_document( userdata ); + + jsonx_parse_value(&state); + + if ( handlers->end_document ) + handlers->end_document( userdata ); + + res = JSONSAX_OK; + } + + return res; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/json/jsonsax_full.c
Added
@@ -0,0 +1,3894 @@ +/* + Copyright (c) 2012 John-Anthony Owens + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ + +#include <stdlib.h> +#include <string.h> + +/* Ensure uint32_t type (compiler-dependent). */ +#if defined(_MSC_VER) +typedef unsigned __int32 uint32_t; +#else +#include <stdint.h> +#endif + +/* Ensure SIZE_MAX defined. */ +#ifndef SIZE_MAX +#define SIZE_MAX ((size_t)-1) +#endif + +/* Mark APIs for export (as opposed to import) when we build this file. */ +#define JSON_BUILDING +#include <formats/jsonsax_full.h> + +/* Default allocation constants. */ +#define DEFAULT_TOKEN_BYTES_LENGTH 64 /* MUST be a power of 2 */ +#define DEFAULT_SYMBOL_STACK_SIZE 32 /* MUST be a power of 2 */ + +/* Types for readability. */ +typedef unsigned char byte; +typedef uint32_t Codepoint; + +/* Especially-relevant Unicode codepoints. */ +#define U_(x) ((Codepoint)(x)) +#define NULL_CODEPOINT U_(0x0000) +#define BACKSPACE_CODEPOINT U_(0x0008) +#define TAB_CODEPOINT U_(0x0009) +#define LINE_FEED_CODEPOINT U_(0x000A) +#define FORM_FEED_CODEPOINT U_(0x000C) +#define CARRIAGE_RETURN_CODEPOINT U_(0x000D) +#define FIRST_NON_CONTROL_CODEPOINT U_(0x0020) +#define DELETE_CODEPOINT U_(0x007F) +#define FIRST_NON_ASCII_CODEPOINT U_(0x0080) +#define FIRST_2_BYTE_UTF8_CODEPOINT U_(0x0080) +#define FIRST_3_BYTE_UTF8_CODEPOINT U_(0x0800) +#define LINE_SEPARATOR_CODEPOINT U_(0x2028) +#define PARAGRAPH_SEPARATOR_CODEPOINT U_(0x2029) +#define BOM_CODEPOINT U_(0xFEFF) +#define REPLACEMENT_CHARACTER_CODEPOINT U_(0xFFFD) +#define FIRST_NON_BMP_CODEPOINT U_(0x10000) +#define FIRST_4_BYTE_UTF8_CODEPOINT U_(0x10000) +#define MAX_CODEPOINT U_(0x10FFFF) +#define EOF_CODEPOINT U_(0xFFFFFFFF) + +/* Bit-masking macros. */ +#define BOTTOM_3_BITS(x) ((x) & 0x7) +#define BOTTOM_4_BITS(x) ((x) & 0xF) +#define BOTTOM_5_BITS(x) ((x) & 0x1F) +#define BOTTOM_6_BITS(x) ((x) & 0x3F) + +/* Bit-flag macros. */ +#define GET_FLAGS(x, f) ((x) & (f)) +#define SET_FLAGS_ON(flagstype, x, f) do { (x) |= (flagstype)(f); } while (0) +#define SET_FLAGS_OFF(flagstype, x, f) do { (x) &= (flagstype)~(f); } while (0) +#define SET_FLAGS(flagstype, x, f, cond) do { if (cond) (x) |= (flagstype)(f); else (x) &= (flagstype)~(f); } while (0) + +/* UTF-8 byte-related macros. */ +#define IS_UTF8_SINGLE_BYTE(b) (((b) & 0x80) == 0) +#define IS_UTF8_CONTINUATION_BYTE(b) (((b) & 0xC0) == 0x80) +#define IS_UTF8_FIRST_BYTE_OF_2(b) (((b) & 0xE0) == 0xC0) +#define IS_UTF8_FIRST_BYTE_OF_3(b) (((b) & 0xF0) == 0xE0) +#define IS_UTF8_FIRST_BYTE_OF_4(b) (((b) & 0xF8) == 0xF0) + +/* Unicode codepoint-related macros. */ +#define IS_NONCHARACTER(c) ((((c) & 0xFE) == 0xFE) || (((c) >= 0xFDD0) && ((c) <= 0xFDEF))) +#define IS_SURROGATE(c) (((c) & 0xFFFFF800) == 0xD800) +#define IS_LEADING_SURROGATE(c) (((c) & 0xFFFFFC00) == 0xD800) +#define IS_TRAILING_SURROGATE(c) (((c) & 0xFFFFFC00) == 0xDC00) +#define CODEPOINT_FROM_SURROGATES(hi_lo) ((((hi_lo) >> 16) << 10) + ((hi_lo) & 0xFFFF) + 0xFCA02400) +#define SURROGATES_FROM_CODEPOINT(c) ((((c) << 6) & 0x7FF0000) + ((c) & 0x3FF) + 0xD7C0DC00) +#define SHORTEST_ENCODING_SEQUENCE(enc) (UINT32_C(1) << ((enc) >> 1)) +#define LONGEST_ENCODING_SEQUENCE 4 + +/* Internal types that alias enum types in the public API. + By using byte to represent these values internally, + we can guarantee minimal storage size and avoid compiler + warnings when using values of the type in switch statements + that don't have (or need) a default case. */ +typedef byte Encoding; +typedef byte Error; +typedef byte TokenAttributes; + +/******************** Default Memory Suite ********************/ + +static void* JSON_CALL DefaultReallocHandler(void* userData, void* ptr, size_t size) +{ + (void)userData; /* unused */ + return realloc(ptr, size); +} + +static void JSON_CALL DefaultFreeHandler(void* userData, void* ptr) +{ + (void)userData; /* unused */ + free(ptr); +} + +static const JSON_MemorySuite defaultMemorySuite = { NULL, &DefaultReallocHandler, &DefaultFreeHandler }; + +static byte* DoubleBuffer(const JSON_MemorySuite* pMemorySuite, byte* pDefaultBuffer, byte* pBuffer, size_t length) +{ + size_t newLength = length * 2; + if (newLength < length) + { + pBuffer = NULL; + } + else if (pBuffer == pDefaultBuffer) + { + pBuffer = (byte*)pMemorySuite->realloc(pMemorySuite->userData, NULL, newLength); + if (pBuffer) + { + memcpy(pBuffer, pDefaultBuffer, length); + } + } + else + { + pBuffer = (byte*)pMemorySuite->realloc(pMemorySuite->userData, pBuffer, newLength); + } + return pBuffer; +} + +/******************** Unicode Decoder ********************/ + +/* Mutually-exclusive decoder states. */ +/* The bits of DecoderState are layed out as follows: + + ---lllnn + + - = unused (3 bits) + l = expected total sequence length (3 bits) + d = number of bytes decoded so far (2 bits) + */ + +#define DECODER_RESET 0x00 +#define DECODED_1_OF_2 0x09 /* 00001001 */ +#define DECODED_1_OF_3 0x0D /* 00001101 */ +#define DECODED_2_OF_3 0x0E /* 00001110 */ +#define DECODED_1_OF_4 0x11 /* 00010001 */ +#define DECODED_2_OF_4 0x12 /* 00010010 */ +#define DECODED_3_OF_4 0x13 /* 00010011 */ +typedef byte DecoderState; + +#define DECODER_STATE_BYTES(s) (size_t)((s) & 0x3) + +/* Decoder data. */ +typedef struct tag_DecoderData +{ + uint32_t bits; + DecoderState state; /* byte alignment */ +} DecoderData; +typedef DecoderData* Decoder; + +/* The bits of DecoderOutput are layed out as follows: + + ------rrlllccccccccccccccccccccc + + - = unused (6 bits) + r = result code (2 bits) + l = sequence length (3 bits) + c = codepoint (21 bits) + */ +#define SEQUENCE_PENDING 0 +#define SEQUENCE_COMPLETE 1 +#define SEQUENCE_INVALID_INCLUSIVE 2 +#define SEQUENCE_INVALID_EXCLUSIVE 3 +typedef uint32_t DecoderResultCode; + +#define DECODER_OUTPUT(r, l, c) (DecoderOutput)(((r) << 24) | ((l) << 21) | (c)) +#define DECODER_RESULT_CODE(o) (DecoderResultCode)((DecoderOutput)(o) >> 24) +#define DECODER_SEQUENCE_LENGTH(o) (size_t)(((DecoderOutput)(o) >> 21) & 0x7) +#define DECODER_CODEPOINT(o) (Codepoint)((DecoderOutput)(o) & 0x001FFFFF) +typedef uint32_t DecoderOutput; + +/* Decoder functions. */ + +static void Decoder_Reset(Decoder decoder) +{ + decoder->state = DECODER_RESET; + decoder->bits = 0; +} + +static int Decoder_SequencePending(Decoder decoder) +{ + return decoder->state != DECODER_RESET; +} + +static DecoderOutput Decoder_ProcessByte(Decoder decoder, Encoding encoding, byte b) +{ + DecoderOutput output = DECODER_OUTPUT(SEQUENCE_PENDING, 0, 0); + switch (encoding) + { + case JSON_UTF8: + /* When the input encoding is UTF-8, the decoded codepoint's bits are + recorded in the bottom 3 bytes of bits as they are decoded. + The top byte is not used. */ + switch (decoder->state) + { + case DECODER_RESET: + if (IS_UTF8_SINGLE_BYTE(b)) + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 1, b); + else if (IS_UTF8_FIRST_BYTE_OF_2(b)) + { + /* UTF-8 2-byte sequences that are overlong encodings can be + detected from just the first byte (C0 or C1). */ + decoder->bits = (uint32_t)BOTTOM_5_BITS(b) << 6; + if (decoder->bits < FIRST_2_BYTE_UTF8_CODEPOINT) + output = DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 1, 0); + else + { + decoder->state = DECODED_1_OF_2; + goto noreset; + } + } + else if (IS_UTF8_FIRST_BYTE_OF_3(b)) + { + decoder->bits = (uint32_t)BOTTOM_4_BITS(b) << 12; + decoder->state = DECODED_1_OF_3; + goto noreset; + } + else if (IS_UTF8_FIRST_BYTE_OF_4(b)) + { + /* Some UTF-8 4-byte sequences that encode out-of-range + codepoints can be detected from the first byte (F5 - FF). */ + decoder->bits = (uint32_t)BOTTOM_3_BITS(b) << 18; + if (decoder->bits > MAX_CODEPOINT) + output = DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 1, 0); + else + { + decoder->state = DECODED_1_OF_4; + goto noreset; + } + } + else + /* The byte is of the form 11111xxx or 10xxxxxx, and is not + a valid first byte for a UTF-8 sequence. */ + output = DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 1, 0); + break; + + case DECODED_1_OF_2: + if (IS_UTF8_CONTINUATION_BYTE(b)) + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 2, decoder->bits | BOTTOM_6_BITS(b)); + else + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 1, 0); + break; + + case DECODED_1_OF_3: + if (IS_UTF8_CONTINUATION_BYTE(b)) + { + /* UTF-8 3-byte sequences that are overlong + * encodings or encode surrogate codepoints + * can be detected after 2 bytes. */ + decoder->bits |= (uint32_t)BOTTOM_6_BITS(b) << 6; + if ((decoder->bits < FIRST_3_BYTE_UTF8_CODEPOINT) || + IS_SURROGATE(decoder->bits)) + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 1, 0); + else + { + decoder->state = DECODED_2_OF_3; + goto noreset; + } + } + else + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 1, 0); + break; + + case DECODED_2_OF_3: + if (IS_UTF8_CONTINUATION_BYTE(b)) + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 3, decoder->bits | BOTTOM_6_BITS(b)); + else + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 2, 0); + break; + + case DECODED_1_OF_4: + if (IS_UTF8_CONTINUATION_BYTE(b)) + { + /* UTF-8 4-byte sequences that are overlong encodings or encode + out-of-range codepoints can be detected after 2 bytes. */ + decoder->bits |= (uint32_t)BOTTOM_6_BITS(b) << 12; + if ( (decoder->bits < FIRST_4_BYTE_UTF8_CODEPOINT) || + (decoder->bits > MAX_CODEPOINT)) + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 1, 0); + else + { + decoder->state = DECODED_2_OF_4; + goto noreset; + } + } + else + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 1, 0); + break; + + case DECODED_2_OF_4: + if (IS_UTF8_CONTINUATION_BYTE(b)) + { + decoder->bits |= (uint32_t)BOTTOM_6_BITS(b) << 6; + decoder->state = DECODED_3_OF_4; + goto noreset; + } + + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 2, 0); + break; + + case DECODED_3_OF_4: + if (IS_UTF8_CONTINUATION_BYTE(b)) + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 4, decoder->bits | BOTTOM_6_BITS(b)); + else + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 3, 0); + break; + } + break; + + case JSON_UTF16LE: + /* When the input encoding is UTF-16, the decoded codepoint's bits are + recorded in the bottom 2 bytes of bits as they are decoded. + If those 2 bytes form a leading surrogate, the decoder treats the + surrogate pair as a single 4-byte sequence, shifts the leading + surrogate into the high 2 bytes of bits, and decodes the + trailing surrogate's bits in the bottom 2 bytes of bits. */ + switch (decoder->state) + { + case DECODER_RESET: + decoder->bits = b; + decoder->state = DECODED_1_OF_2; + goto noreset; + + case DECODED_1_OF_2: + decoder->bits |= (uint32_t)b << 8; + /* A trailing surrogate cannot appear on its own. */ + if (IS_TRAILING_SURROGATE(decoder->bits)) + output = DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 2, 0); + else if (IS_LEADING_SURROGATE(decoder->bits)) + { + /* A leading surrogate implies a 4-byte surrogate pair. */ + decoder->bits <<= 16; + decoder->state = DECODED_2_OF_4; + goto noreset; + } + else + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 2, decoder->bits); + break; + + case DECODED_2_OF_4: + decoder->bits |= b; + decoder->state = DECODED_3_OF_4; + goto noreset; + + case DECODED_3_OF_4: + decoder->bits |= (uint32_t)b << 8; + if (!IS_TRAILING_SURROGATE(decoder->bits & 0xFFFF)) + { + /* A leading surrogate must be followed by a trailing one. + Treat the previous 3 bytes as an invalid 2-byte sequence + followed by the first byte of a new sequence. */ + decoder->bits &= 0xFF; + decoder->state = DECODED_1_OF_2; + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 2, 0); + goto noreset; + } + + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 4, CODEPOINT_FROM_SURROGATES(decoder->bits)); + break; + } + break; + + case JSON_UTF16BE: + /* When the input encoding is UTF-16, the decoded codepoint's bits are + recorded in the bottom 2 bytes of bits as they are decoded. + If those 2 bytes form a leading surrogate, the decoder treats the + surrogate pair as a single 4-byte sequence, shifts the leading + surrogate into the high 2 bytes of bits, and decodes the + trailing surrogate's bits in the bottom 2 bytes of bits. */ + switch (decoder->state) + { + case DECODER_RESET: + decoder->bits = (uint32_t)b << 8; + decoder->state = DECODED_1_OF_2; + goto noreset; + + case DECODED_1_OF_2: + decoder->bits |= b; + /* A trailing surrogate cannot appear on its own. */ + if (IS_TRAILING_SURROGATE(decoder->bits)) + output = DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 2, 0); + else if (IS_LEADING_SURROGATE(decoder->bits)) + { + /* A leading surrogate implies a 4-byte surrogate pair. */ + decoder->bits <<= 16; + decoder->state = DECODED_2_OF_4; + goto noreset; + } + else + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 2, decoder->bits); + break; + + case DECODED_2_OF_4: + decoder->bits |= (uint32_t)b << 8; + decoder->state = DECODED_3_OF_4; + goto noreset; + + case DECODED_3_OF_4: + decoder->bits |= b; + if (!IS_TRAILING_SURROGATE(decoder->bits & 0xFFFF)) + { + /* A leading surrogate must be followed by a trailing one. + Treat the previous 3 bytes as an invalid 2-byte sequence + followed by the first byte of a new sequence. */ + decoder->bits &= 0xFF00; + decoder->state = DECODED_1_OF_2; + output = DECODER_OUTPUT(SEQUENCE_INVALID_EXCLUSIVE, 2, 0); + goto noreset; + } + + output = DECODER_OUTPUT(SEQUENCE_COMPLETE, 4, + CODEPOINT_FROM_SURROGATES(decoder->bits)); + break; + } + break; + + case JSON_UTF32LE: + /* When the input encoding is UTF-32, the decoded codepoint's bits are + recorded in bits as they are decoded. */ + switch (decoder->state) + { + case DECODER_RESET: + decoder->state = DECODED_1_OF_4; + decoder->bits = (uint32_t)b; + goto noreset; + + case DECODED_1_OF_4: + decoder->state = DECODED_2_OF_4; + decoder->bits |= (uint32_t)b << 8; + goto noreset; + + case DECODED_2_OF_4: + decoder->state = DECODED_3_OF_4; + decoder->bits |= (uint32_t)b << 16; + goto noreset; + + case DECODED_3_OF_4: + decoder->bits |= (uint32_t)b << 24; + output = ( + IS_SURROGATE(decoder->bits) || + (decoder->bits > MAX_CODEPOINT)) + ? DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 4, 0) + : DECODER_OUTPUT(SEQUENCE_COMPLETE, 4, decoder->bits); + break; + } + break; + + case JSON_UTF32BE: + /* When the input encoding is UTF-32, the decoded codepoint's bits are + recorded in bits as they are decoded. */ + switch (decoder->state) + { + case DECODER_RESET: + decoder->state = DECODED_1_OF_4; + decoder->bits = (uint32_t)b << 24; + goto noreset; + + case DECODED_1_OF_4: + decoder->state = DECODED_2_OF_4; + decoder->bits |= (uint32_t)b << 16; + goto noreset; + + case DECODED_2_OF_4: + decoder->state = DECODED_3_OF_4; + decoder->bits |= (uint32_t)b << 8; + goto noreset; + + case DECODED_3_OF_4: + decoder->bits |= b; + output = (IS_SURROGATE(decoder->bits) || + (decoder->bits > MAX_CODEPOINT)) + ? DECODER_OUTPUT(SEQUENCE_INVALID_INCLUSIVE, 4, 0) + : DECODER_OUTPUT(SEQUENCE_COMPLETE, 4, decoder->bits); + break; + } + break; + } + + /* Reset the decoder for the next sequence. */ + Decoder_Reset(decoder); + +noreset: + return output; +} + +/******************** Unicode Encoder ********************/ + +/* This function makes the following assumptions about its input: + + 1. The c argument is a valid codepoint (U+0000 - U+10FFFF). + 2. The encoding argument is not JSON_UnknownEncoding. + 3. The pBytes argument points to an array of at least 4 bytes. + */ +static size_t EncodeCodepoint(Codepoint c, Encoding encoding, byte* pBytes) +{ + size_t length = 0; + switch (encoding) + { + case JSON_UTF8: + if (c < FIRST_2_BYTE_UTF8_CODEPOINT) + { + pBytes[0] = (byte)c; + length = 1; + } + else if (c < FIRST_3_BYTE_UTF8_CODEPOINT) + { + pBytes[0] = (byte)(0xC0 | (c >> 6)); + pBytes[1] = (byte)(0x80 | BOTTOM_6_BITS(c)); + length = 2; + } + else if (c < FIRST_4_BYTE_UTF8_CODEPOINT) + { + pBytes[0] = (byte)(0xE0 | (c >> 12)); + pBytes[1] = (byte)(0x80 | BOTTOM_6_BITS(c >> 6)); + pBytes[2] = (byte)(0x80 | BOTTOM_6_BITS(c)); + length = 3; + } + else + { + pBytes[0] = (byte)(0xF0 | (c >> 18)); + pBytes[1] = (byte)(0x80 | BOTTOM_6_BITS(c >> 12)); + pBytes[2] = (byte)(0x80 | BOTTOM_6_BITS(c >> 6)); + pBytes[3] = (byte)(0x80 | BOTTOM_6_BITS(c)); + length = 4; + } + break; + + case JSON_UTF16LE: + if (c < FIRST_NON_BMP_CODEPOINT) + { + pBytes[0] = (byte)(c); + pBytes[1] = (byte)(c >> 8); + length = 2; + } + else + { + uint32_t surrogates = SURROGATES_FROM_CODEPOINT(c); + + /* Leading surrogate. */ + pBytes[0] = (byte)(surrogates >> 16); + pBytes[1] = (byte)(surrogates >> 24); + + /* Trailing surrogate. */ + pBytes[2] = (byte)(surrogates); + pBytes[3] = (byte)(surrogates >> 8); + length = 4; + } + break; + + case JSON_UTF16BE: + if (c < FIRST_NON_BMP_CODEPOINT) + { + pBytes[1] = (byte)(c); + pBytes[0] = (byte)(c >> 8); + length = 2; + } + else + { + /* The codepoint requires a surrogate pair in UTF-16. */ + uint32_t surrogates = SURROGATES_FROM_CODEPOINT(c); + + /* Leading surrogate. */ + pBytes[1] = (byte)(surrogates >> 16); + pBytes[0] = (byte)(surrogates >> 24); + + /* Trailing surrogate. */ + pBytes[3] = (byte)(surrogates); + pBytes[2] = (byte)(surrogates >> 8); + length = 4; + } + break; + + case JSON_UTF32LE: + pBytes[0] = (byte)(c); + pBytes[1] = (byte)(c >> 8); + pBytes[2] = (byte)(c >> 16); + pBytes[3] = (byte)(c >> 24); + length = 4; + break; + + case JSON_UTF32BE: + pBytes[3] = (byte)(c); + pBytes[2] = (byte)(c >> 8); + pBytes[1] = (byte)(c >> 16); + pBytes[0] = (byte)(c >> 24); + length = 4; + break; + } + return length; +} + +/******************** JSON Lexer States ********************/ + +/* Mutually-exclusive lexer states. */ +#define LEXING_WHITESPACE 0 +#define LEXING_LITERAL 1 +#define LEXING_STRING 2 +#define LEXING_STRING_ESCAPE 3 +#define LEXING_STRING_HEX_ESCAPE_BYTE_1 4 +#define LEXING_STRING_HEX_ESCAPE_BYTE_2 5 +#define LEXING_STRING_HEX_ESCAPE_BYTE_3 6 +#define LEXING_STRING_HEX_ESCAPE_BYTE_4 7 +#define LEXING_STRING_HEX_ESCAPE_BYTE_5 8 +#define LEXING_STRING_HEX_ESCAPE_BYTE_6 9 +#define LEXING_STRING_HEX_ESCAPE_BYTE_7 10 +#define LEXING_STRING_HEX_ESCAPE_BYTE_8 11 +#define LEXING_STRING_TRAILING_SURROGATE_HEX_ESCAPE_BACKSLASH 12 +#define LEXING_STRING_TRAILING_SURROGATE_HEX_ESCAPE_U 13 +#define LEXING_NUMBER_AFTER_MINUS 14 +#define LEXING_NUMBER_AFTER_LEADING_ZERO 15 +#define LEXING_NUMBER_AFTER_LEADING_NEGATIVE_ZERO 16 +#define LEXING_NUMBER_AFTER_X 17 +#define LEXING_NUMBER_HEX_DIGITS 18 +#define LEXING_NUMBER_DECIMAL_DIGITS 19 +#define LEXING_NUMBER_AFTER_DOT 20 +#define LEXING_NUMBER_FRACTIONAL_DIGITS 21 +#define LEXING_NUMBER_AFTER_E 22 +#define LEXING_NUMBER_AFTER_EXPONENT_SIGN 23 +#define LEXING_NUMBER_EXPONENT_DIGITS 24 +#define LEXING_COMMENT_AFTER_SLASH 25 +#define LEXING_SINGLE_LINE_COMMENT 26 +#define LEXING_MULTI_LINE_COMMENT 27 +#define LEXING_MULTI_LINE_COMMENT_AFTER_STAR 28 +#define LEXER_ERROR 255 +typedef byte LexerState; + +/******************** JSON Grammarian ********************/ + +/* The JSON grammar comprises the following productions: + + 1. VALUE => null + 2. VALUE => boolean + 3. VALUE => string + 4. VALUE => number + 5. VALUE => specialnumber + 6. VALUE => { MEMBERS } + 7. VALUE => [ ITEMS ] + 8. MEMBERS => MEMBER MORE_MEMBERS + 9. MEMBERS => e + 10. MEMBER => string : VALUE + 11. MORE_MEMBERS => , MEMBER MORE_MEMBERS + 12. MORE_MEMBERS => e + 13. ITEMS => ITEM MORE_ITEMS + 14. ITEMS => e + 15. ITEM => VALUE + 16. MORE_ITEMS => , ITEM MORE_ITEMS + 17. MORE_ITEMS => e + + We implement a simple LL(1) parser based on this grammar, with events + emitted when certain non-terminals are replaced. + */ + +/* Mutually-exclusive grammar tokens and non-terminals. The values are defined + so that the bottom 4 bits of a value can be used as an index into the + grammar production rule table. */ +#define T_NONE 0x00 /* tokens are in the form 0x0X */ +#define T_NULL 0x01 +#define T_TRUE 0x02 +#define T_FALSE 0x03 +#define T_STRING 0x04 +#define T_NUMBER 0x05 +#define T_NAN 0x06 +#define T_INFINITY 0x07 +#define T_NEGATIVE_INFINITY 0x08 +#define T_LEFT_CURLY 0x09 +#define T_RIGHT_CURLY 0x0A +#define T_LEFT_SQUARE 0x0B +#define T_RIGHT_SQUARE 0x0C +#define T_COLON 0x0D +#define T_COMMA 0x0E +#define NT_VALUE 0x10 /* non-terminals are in the form 0x1X */ +#define NT_MEMBERS 0x11 +#define NT_MEMBER 0x12 +#define NT_MORE_MEMBERS 0x13 +#define NT_ITEMS 0x14 +#define NT_ITEM 0x15 +#define NT_MORE_ITEMS 0x16 +typedef byte Symbol; + +#define IS_NONTERMINAL(s) ((s) & 0x10) +#define IS_TOKEN(s) !IS_NONTERMINAL(s) + +/* Grammarian data. */ +typedef struct tag_GrammarianData +{ + Symbol* pStack; /* initially set to defaultStack */ + size_t stackSize; + size_t stackUsed; + Symbol defaultStack[DEFAULT_SYMBOL_STACK_SIZE]; +} GrammarianData; +typedef GrammarianData* Grammarian; + +/* Mutually-exclusive result codes returned by the grammarian + after processing a token. */ +#define ACCEPTED_TOKEN 0 +#define REJECTED_TOKEN 1 +#define SYMBOL_STACK_FULL 2 +typedef uint32_t GrammarianResultCode; + +/* Events emitted by the grammarian as a result of processing a + token. Note that EMIT_ARRAY_ITEM always appears bitwise OR-ed + with one of the other values. */ +#define EMIT_NOTHING 0x00 +#define EMIT_NULL 0x01 +#define EMIT_BOOLEAN 0x02 +#define EMIT_STRING 0x03 +#define EMIT_NUMBER 0x04 +#define EMIT_SPECIAL_NUMBER 0x05 +#define EMIT_START_OBJECT 0x06 +#define EMIT_END_OBJECT 0x07 +#define EMIT_OBJECT_MEMBER 0x08 +#define EMIT_START_ARRAY 0x09 +#define EMIT_END_ARRAY 0x0A +#define EMIT_ARRAY_ITEM 0x10 /* may be combined with other values */ +typedef byte GrammarEvent; + +/* The bits of GrammarianOutput are layed out as follows: + + -rreeeee + + - = unused (1 bit) + r = result code (2 bits) + e = event (5 bits) + */ +#define GRAMMARIAN_OUTPUT(r, e) (GrammarianOutput)(((GrammarianResultCode)(r) << 5) | (GrammarEvent)(e)) +#define GRAMMARIAN_RESULT_CODE(o) (GrammarianResultCode)((GrammarianOutput)(o) >> 5) +#define GRAMMARIAN_EVENT(o) (GrammarEvent)((GrammarianOutput)(o) & 0x1F) +typedef byte GrammarianOutput; + +/* Grammar rule used by the grammarian to process a token. */ +typedef struct tag_GrammarRule +{ + Symbol symbolToPush1; /* byte alignment */ + Symbol symbolToPush2; /* byte alignment */ + byte reprocess; + GrammarEvent emit; /* byte alignment */ +} GrammarRule; + +/* Grammarian functions. */ + +static void Grammarian_Reset(Grammarian grammarian, int isInitialized) +{ + /* When we reset the grammarian, we keep the symbol stack that has + already been allocated, if any. If the client wants to reclaim the + memory used by the that buffer, he needs to free the grammarian + and create a new one. */ + if (!isInitialized) + { + grammarian->pStack = grammarian->defaultStack; + grammarian->stackSize = sizeof(grammarian->defaultStack); + } + + /* The grammarian always starts with NT_VALUE on the symbol stack. */ + grammarian->pStack[0] = NT_VALUE; + grammarian->stackUsed = 1; +} + +static void Grammarian_FreeAllocations(Grammarian grammarian, + const JSON_MemorySuite* pMemorySuite) +{ + if (grammarian->pStack != grammarian->defaultStack) + pMemorySuite->free(pMemorySuite->userData, grammarian->pStack); +} + +static int Grammarian_FinishedDocument(Grammarian grammarian) +{ + return !grammarian->stackUsed; +} + +static GrammarianOutput Grammarian_ProcessToken(Grammarian grammarian, + Symbol token, const JSON_MemorySuite* pMemorySuite) +{ + /* The order and number of the rows and columns in this table must + match the defined token and non-terminal symbol values. + + The row index is the incoming token's Symbol value. + + The column index is the bottom 4 bits of Symbol value of + the non-terminal at the top of the processing stack. + Since non-terminal Symbol values start at 0x10, taking + the bottom 4 bits yields a 0-based index. */ + static const byte ruleLookup[15][7] = + { + /* V MS M MM IS I MI */ + /* ---- */ { 0, 0, 0, 0, 0, 0, 0 }, + /* null */ { 1, 0, 0, 0, 13, 15, 0 }, + /* true */ { 2, 0, 0, 0, 13, 15, 0 }, + /* false */ { 2, 0, 0, 0, 13, 15, 0 }, + /* string */ { 3, 8, 10, 0, 13, 15, 0 }, + /* number */ { 4, 0, 0, 0, 13, 15, 0 }, + /* NaN */ { 5, 0, 0, 0, 13, 15, 0 }, + /* Inf */ { 5, 0, 0, 0, 13, 15, 0 }, + /* -Inf */ { 5, 0, 0, 0, 13, 15, 0 }, + /* { */ { 6, 0, 0, 0, 13, 15, 0 }, + /* } */ { 0, 9, 0, 12, 0, 0, 0 }, + /* [ */ { 7, 0, 0, 0, 13, 15, 0 }, + /* ] */ { 0, 0, 0, 0, 14, 0, 17 }, + /* : */ { 0, 0, 0, 0, 0, 0, 0 }, + /* , */ { 0, 0, 0, 11, 0, 0, 16 } + }; + + static const GrammarRule rules[17] = + { + /* 1. */ { T_NONE, T_NONE, 0, EMIT_NULL }, + /* 2. */ { T_NONE, T_NONE, 0, EMIT_BOOLEAN }, + /* 3. */ { T_NONE, T_NONE, 0, EMIT_STRING }, + /* 4. */ { T_NONE, T_NONE, 0, EMIT_NUMBER }, + /* 5. */ { T_NONE, T_NONE, 0, EMIT_SPECIAL_NUMBER }, + /* 6. */ { T_RIGHT_CURLY, NT_MEMBERS, 0, EMIT_START_OBJECT }, + /* 7. */ { T_RIGHT_SQUARE, NT_ITEMS, 0, EMIT_START_ARRAY }, + /* 8. */ { NT_MORE_MEMBERS, NT_MEMBER, 1, EMIT_NOTHING }, + /* 9. */ { T_NONE, T_NONE, 1, EMIT_END_OBJECT }, + /* 10. */ { NT_VALUE, T_COLON, 0, EMIT_OBJECT_MEMBER }, + /* 11. */ { NT_MORE_MEMBERS, NT_MEMBER, 0, EMIT_NOTHING }, + /* 12. */ { T_NONE, T_NONE, 1, EMIT_END_OBJECT }, + /* 13. */ { NT_MORE_ITEMS, NT_ITEM, 1, EMIT_NOTHING }, + /* 14. */ { T_NONE, T_NONE, 1, EMIT_END_ARRAY }, + /* 15. */ { NT_VALUE, T_NONE, 1, EMIT_ARRAY_ITEM }, + /* 16. */ { NT_MORE_ITEMS, NT_ITEM, 0, EMIT_NOTHING }, + /* 17. */ { T_NONE, T_NONE, 1, EMIT_END_ARRAY } + }; + + GrammarEvent emit = EMIT_NOTHING; + + /* If the stack is empty, no more tokens were expected. */ + if (Grammarian_FinishedDocument(grammarian)) + return GRAMMARIAN_OUTPUT(REJECTED_TOKEN, EMIT_NOTHING); + + for (;;) + { + Symbol topSymbol = grammarian->pStack[grammarian->stackUsed - 1]; + if (IS_TOKEN(topSymbol)) + { + if (topSymbol != token) + return GRAMMARIAN_OUTPUT(REJECTED_TOKEN, EMIT_NOTHING); + grammarian->stackUsed--; + break; + } + else + { + const GrammarRule* pRule = NULL; + byte ruleNumber = ruleLookup[token][BOTTOM_4_BITS(topSymbol)]; + + if (ruleNumber == 0) + return GRAMMARIAN_OUTPUT(REJECTED_TOKEN, EMIT_NOTHING); + + pRule = &rules[ruleNumber - 1]; + + /* The rule removes the top symbol and does not replace it. */ + if (pRule->symbolToPush1 == T_NONE) + grammarian->stackUsed--; + else + { + /* The rule replaces the top symbol with 1 or 2 symbols. */ + grammarian->pStack[grammarian->stackUsed - 1] = pRule->symbolToPush1; + if (pRule->symbolToPush2 != T_NONE) + { + /* The rule replaces the top symbol with 2 symbols. + Make sure the stack has room for the second one. */ + if (grammarian->stackUsed == grammarian->stackSize) + { + Symbol* pBiggerStack = DoubleBuffer(pMemorySuite, + grammarian->defaultStack, grammarian->pStack, + grammarian->stackSize); + + if (!pBiggerStack) + return GRAMMARIAN_OUTPUT(SYMBOL_STACK_FULL, EMIT_NOTHING); + + grammarian->pStack = pBiggerStack; + grammarian->stackSize *= 2; + } + grammarian->pStack[grammarian->stackUsed] = pRule->symbolToPush2; + grammarian->stackUsed++; + } + } + emit |= pRule->emit; + if (!pRule->reprocess) + break; + } + } + + return GRAMMARIAN_OUTPUT(ACCEPTED_TOKEN, emit); +} + +/******************** JSON Parser ********************/ + +#ifndef JSON_NO_PARSER + +/* Combinable parser state flags. */ +#define PARSER_RESET 0x00 +#define PARSER_STARTED 0x01 +#define PARSER_FINISHED 0x02 +#define PARSER_IN_PROTECTED_API 0x04 +#define PARSER_IN_TOKEN_HANDLER 0x08 +#define PARSER_AFTER_CARRIAGE_RETURN 0x10 +typedef byte ParserState; + +/* Combinable parser settings flags. */ +#define PARSER_DEFAULT_FLAGS 0x00 +#define PARSER_ALLOW_BOM 0x01 +#define PARSER_ALLOW_COMMENTS 0x02 +#define PARSER_ALLOW_SPECIAL_NUMBERS 0x04 +#define PARSER_ALLOW_HEX_NUMBERS 0x08 +#define PARSER_REPLACE_INVALID 0x10 +#define PARSER_TRACK_OBJECT_MEMBERS 0x20 +#define PARSER_ALLOW_CONTROL_CHARS 0x40 +#define PARSER_EMBEDDED_DOCUMENT 0x80 +typedef byte ParserFlags; + +/* Sentinel value for parser error location offset. */ +#define ERROR_LOCATION_IS_TOKEN_START 0xFF + +/* An object member name stored in an unordered, singly-linked-list, used for + detecting duplicate member names. Note that the name string is not null- + terminated. */ +typedef struct tag_MemberName +{ + struct tag_MemberName* pNextName; + size_t length; + byte pBytes[1]; /* variable-size buffer */ +} MemberName; + +/* An object's list of member names, and a pointer to the object's + nearest ancestor object, if any. This is used as a stack. Because arrays + do not have named items, they do not need to be recorded in the stack. */ +typedef struct tag_MemberNames +{ + struct tag_MemberNames* pAncestor; + MemberName* pFirstName; +} MemberNames; + +/* A parser instance. */ +struct JSON_Parser_Data +{ + JSON_MemorySuite memorySuite; /* ptr alignment */ + void* userData; + byte* pTokenBytes; + MemberNames* pMemberNames; + GrammarianData grammarianData; /* ptr alignment */ + JSON_Parser_EncodingDetectedHandler encodingDetectedHandler; /* ptr alignment */ + JSON_Parser_NullHandler nullHandler; + JSON_Parser_BooleanHandler booleanHandler; + JSON_Parser_StringHandler stringHandler; + JSON_Parser_NumberHandler numberHandler; + JSON_Parser_SpecialNumberHandler specialNumberHandler; + JSON_Parser_StartObjectHandler startObjectHandler; + JSON_Parser_EndObjectHandler endObjectHandler; + JSON_Parser_ObjectMemberHandler objectMemberHandler; + JSON_Parser_StartArrayHandler startArrayHandler; + JSON_Parser_EndArrayHandler endArrayHandler; + JSON_Parser_ArrayItemHandler arrayItemHandler; + uint32_t lexerBits; + DecoderData decoderData; + /* uint32 alignment */ + size_t codepointLocationByte; + size_t codepointLocationLine; + size_t codepointLocationColumn; + size_t tokenLocationByte; + size_t tokenLocationLine; + size_t tokenLocationColumn; + size_t depth; + size_t tokenBytesLength; + size_t tokenBytesUsed; + size_t maxStringLength; + size_t maxNumberLength; + ParserState state; /* byte alignment */ + ParserFlags flags; /* byte alignment */ + Encoding inputEncoding; /* byte alignment */ + Encoding stringEncoding; /* byte alignment */ + Encoding numberEncoding; /* byte alignment */ + Symbol token; /* byte alignment */ + TokenAttributes tokenAttributes; /* byte alignment */ + Error error; /* byte alignment */ + byte errorOffset; + LexerState lexerState; /* byte alignment */ + byte defaultTokenBytes[DEFAULT_TOKEN_BYTES_LENGTH]; +}; + +/* Parser internal functions. */ + +static void JSON_Parser_SetErrorAtCodepoint(JSON_Parser parser, Error error) +{ + parser->error = error; +} + +static void JSON_Parser_SetErrorAtStringEscapeSequenceStart( + JSON_Parser parser, Error error, int codepointsAgo) +{ + /* Note that backtracking from the current codepoint requires us to make + three assumptions, which are always valid in the context of a string + escape sequence: + + 1. The input encoding is not JSON_UnknownEncoding. + + 2 The codepoints we are backing up across are all in the range + U+0000 - U+007F, aka ASCII, so we can assume the number of + bytes comprising them based on the input encoding. + + 3. The codepoints we are backing up across do not include any + line breaks, so we can assume that the line number stays the + same and the column number can simply be decremented. + */ + parser->error = error; + parser->errorOffset = (byte)codepointsAgo; +} + +static void JSON_Parser_SetErrorAtToken(JSON_Parser parser, Error error) +{ + parser->error = error; + parser->errorOffset = ERROR_LOCATION_IS_TOKEN_START; +} + +static JSON_Status JSON_Parser_PushMemberNameList(JSON_Parser parser) +{ + MemberNames* pNames = (MemberNames*)parser->memorySuite.realloc( + parser->memorySuite.userData, NULL, sizeof(MemberNames)); + + if (!pNames) + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_OutOfMemory); + return JSON_Failure; + } + + pNames->pAncestor = parser->pMemberNames; + pNames->pFirstName = NULL; + parser->pMemberNames = pNames; + return JSON_Success; +} + +static void JSON_Parser_PopMemberNameList(JSON_Parser parser) +{ + MemberNames* pAncestor = parser->pMemberNames->pAncestor; + while (parser->pMemberNames->pFirstName) + { + MemberName* pNextName = parser->pMemberNames->pFirstName->pNextName; + parser->memorySuite.free(parser->memorySuite.userData, parser->pMemberNames->pFirstName); + parser->pMemberNames->pFirstName = pNextName; + } + parser->memorySuite.free(parser->memorySuite.userData, parser->pMemberNames); + parser->pMemberNames = pAncestor; +} + +static JSON_Status JSON_Parser_StartContainer(JSON_Parser parser, int isObject) +{ + if (isObject && GET_FLAGS(parser->flags, PARSER_TRACK_OBJECT_MEMBERS) && + !JSON_Parser_PushMemberNameList(parser)) + { + return JSON_Failure; + } + parser->depth++; + return JSON_Success; +} + +static void JSON_Parser_EndContainer(JSON_Parser parser, int isObject) +{ + parser->depth--; + if (isObject && GET_FLAGS(parser->flags, PARSER_TRACK_OBJECT_MEMBERS)) + { + JSON_Parser_PopMemberNameList(parser); + } +} + +static JSON_Status JSON_Parser_AddMemberNameToList(JSON_Parser parser) +{ + if (GET_FLAGS(parser->flags, PARSER_TRACK_OBJECT_MEMBERS)) + { + MemberName* pName; + for (pName = parser->pMemberNames->pFirstName; pName; pName = pName->pNextName) + { + if (pName->length == parser->tokenBytesUsed && !memcmp(pName->pBytes, parser->pTokenBytes, pName->length)) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_DuplicateObjectMember); + return JSON_Failure; + } + } + pName = (MemberName*)parser->memorySuite.realloc(parser->memorySuite.userData, NULL, sizeof(MemberName) + parser->tokenBytesUsed - 1); + if (!pName) + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_OutOfMemory); + return JSON_Failure; + } + pName->pNextName = parser->pMemberNames->pFirstName; + pName->length = parser->tokenBytesUsed; + memcpy(pName->pBytes, parser->pTokenBytes, parser->tokenBytesUsed); + parser->pMemberNames->pFirstName = pName; + } + return JSON_Success; +} + +static void JSON_Parser_ResetData(JSON_Parser parser, int isInitialized) +{ + parser->userData = NULL; + parser->flags = PARSER_DEFAULT_FLAGS; + parser->inputEncoding = JSON_UnknownEncoding; + parser->stringEncoding = JSON_UTF8; + parser->numberEncoding = JSON_UTF8; + parser->token = T_NONE; + parser->tokenAttributes = 0; + parser->error = JSON_Error_None; + parser->errorOffset = 0; + parser->lexerState = LEXING_WHITESPACE; + parser->lexerBits = 0; + parser->codepointLocationByte = 0; + parser->codepointLocationLine = 0; + parser->codepointLocationColumn = 0; + parser->tokenLocationByte = 0; + parser->tokenLocationLine = 0; + parser->tokenLocationColumn = 0; + parser->depth = 0; + + if (!isInitialized) + { + parser->pTokenBytes = parser->defaultTokenBytes; + parser->tokenBytesLength = sizeof(parser->defaultTokenBytes); + } + else + { + /* When we reset the parser, we keep the output buffer and the symbol + stack that have already been allocated, if any. If the client wants + to reclaim the memory used by the those buffers, he needs to free + the parser and create a new one. */ + } + parser->tokenBytesUsed = 0; + parser->maxStringLength = SIZE_MAX; + parser->maxNumberLength = SIZE_MAX; + if (!isInitialized) + parser->pMemberNames = NULL; + else + { + while (parser->pMemberNames) + JSON_Parser_PopMemberNameList(parser); + } + Decoder_Reset(&parser->decoderData); + Grammarian_Reset(&parser->grammarianData, isInitialized); + parser->encodingDetectedHandler = NULL; + parser->nullHandler = NULL; + parser->booleanHandler = NULL; + parser->stringHandler = NULL; + parser->numberHandler = NULL; + parser->specialNumberHandler = NULL; + parser->startObjectHandler = NULL; + parser->endObjectHandler = NULL; + parser->objectMemberHandler = NULL; + parser->startArrayHandler = NULL; + parser->endArrayHandler = NULL; + parser->arrayItemHandler = NULL; + parser->state = PARSER_RESET; /* do this last! */ +} + +static void JSON_Parser_NullTerminateToken(JSON_Parser parser) +{ + /* Because we always ensure that there are LONGEST_ENCODING_SEQUENCE bytes + available at the end of the token buffer when we record codepoints, we + can write the null terminator to the buffer with impunity. */ + static const byte nullTerminatorBytes[LONGEST_ENCODING_SEQUENCE] = { 0 }; + Encoding encoding = (Encoding)((parser->token == T_NUMBER) ? parser->numberEncoding : parser->stringEncoding); + memcpy(parser->pTokenBytes + parser->tokenBytesUsed, nullTerminatorBytes, (size_t)SHORTEST_ENCODING_SEQUENCE(encoding)); +} + +static JSON_Status JSON_Parser_FlushParser(JSON_Parser parser) +{ + /* The symbol stack should be empty when parsing finishes. */ + if (!Grammarian_FinishedDocument(&parser->grammarianData)) + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_ExpectedMoreTokens); + return JSON_Failure; + } + return JSON_Success; +} + +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_SimpleTokenHandler)(JSON_Parser parser); +static JSON_Status JSON_Parser_CallSimpleTokenHandler(JSON_Parser parser, JSON_Parser_SimpleTokenHandler handler) +{ + if (handler) + { + JSON_Parser_HandlerResult result; + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + result = handler(parser); + SET_FLAGS_OFF(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + if (result != JSON_Parser_Continue) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_AbortedByHandler); + return JSON_Failure; + } + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_CallBooleanHandler(JSON_Parser parser) +{ + if (parser->booleanHandler) + { + JSON_Parser_HandlerResult result; + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + result = parser->booleanHandler(parser, parser->token == T_TRUE ? JSON_True : JSON_False); + SET_FLAGS_OFF(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + if (result != JSON_Parser_Continue) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_AbortedByHandler); + return JSON_Failure; + } + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_CallStringHandler(JSON_Parser parser, int isObjectMember) +{ + JSON_Parser_StringHandler handler = isObjectMember ? parser->objectMemberHandler : parser->stringHandler; + if (handler) + { + JSON_Parser_HandlerResult result; + JSON_Parser_NullTerminateToken(parser); + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + result = handler(parser, (char*)parser->pTokenBytes, parser->tokenBytesUsed, parser->tokenAttributes); + SET_FLAGS_OFF(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + + if (result != JSON_Parser_Continue) + { + JSON_Parser_SetErrorAtToken(parser, + (isObjectMember && result == JSON_Parser_TreatAsDuplicateObjectMember) + ? JSON_Error_DuplicateObjectMember + : JSON_Error_AbortedByHandler); + return JSON_Failure; + } + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_CallNumberHandler(JSON_Parser parser) +{ + if (parser->numberHandler) + { + JSON_Parser_HandlerResult result; + JSON_Parser_NullTerminateToken(parser); + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + result = parser->numberHandler(parser, (char*)parser->pTokenBytes, + parser->tokenBytesUsed, parser->tokenAttributes); + + SET_FLAGS_OFF(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + + if (result != JSON_Parser_Continue) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_AbortedByHandler); + return JSON_Failure; + } + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_CallSpecialNumberHandler(JSON_Parser parser) +{ + if (parser->specialNumberHandler) + { + JSON_Parser_HandlerResult result; + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + result = parser->specialNumberHandler(parser, parser->token == T_NAN ? JSON_NaN : + (parser->token == T_INFINITY ? JSON_Infinity : JSON_NegativeInfinity)); + SET_FLAGS_OFF(ParserState, parser->state, PARSER_IN_TOKEN_HANDLER); + + if (result != JSON_Parser_Continue) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_AbortedByHandler); + return JSON_Failure; + } + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_HandleGrammarEvents(JSON_Parser parser, byte emit) +{ + if (GET_FLAGS(emit, EMIT_ARRAY_ITEM)) + { + if (!JSON_Parser_CallSimpleTokenHandler(parser, parser->arrayItemHandler)) + { + return JSON_Failure; + } + SET_FLAGS_OFF(byte, emit, EMIT_ARRAY_ITEM); + } + switch (emit) + { + case EMIT_NULL: + if (!JSON_Parser_CallSimpleTokenHandler(parser, parser->nullHandler)) + return JSON_Failure; + break; + + case EMIT_BOOLEAN: + if (!JSON_Parser_CallBooleanHandler(parser)) + return JSON_Failure; + break; + + case EMIT_STRING: + if (!JSON_Parser_CallStringHandler(parser, 0/* isObjectMember */)) + return JSON_Failure; + break; + + case EMIT_NUMBER: + if (!JSON_Parser_CallNumberHandler(parser)) + return JSON_Failure; + break; + + case EMIT_SPECIAL_NUMBER: + if (!JSON_Parser_CallSpecialNumberHandler(parser)) + return JSON_Failure; + break; + + case EMIT_START_OBJECT: + if (!JSON_Parser_CallSimpleTokenHandler(parser, parser->startObjectHandler) || + !JSON_Parser_StartContainer(parser, 1/*isObject*/)) + return JSON_Failure; + break; + + case EMIT_END_OBJECT: + JSON_Parser_EndContainer(parser, 1/*isObject*/); + if (!JSON_Parser_CallSimpleTokenHandler(parser, parser->endObjectHandler)) + return JSON_Failure; + break; + case EMIT_OBJECT_MEMBER: + if (!JSON_Parser_AddMemberNameToList(parser) || /* will fail if member is duplicate */ + !JSON_Parser_CallStringHandler(parser, 1 /* isObjectMember */)) + return JSON_Failure; + break; + + case EMIT_START_ARRAY: + if (!JSON_Parser_CallSimpleTokenHandler(parser, parser->startArrayHandler) || + !JSON_Parser_StartContainer(parser, 0/*isObject*/)) + return JSON_Failure; + break; + + case EMIT_END_ARRAY: + JSON_Parser_EndContainer(parser, 0/*isObject*/); + if (!JSON_Parser_CallSimpleTokenHandler(parser, parser->endArrayHandler)) + return JSON_Failure; + break; + } + + if (!parser->depth && GET_FLAGS(parser->flags, PARSER_EMBEDDED_DOCUMENT)) + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_StoppedAfterEmbeddedDocument); + return JSON_Failure; + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_ProcessToken(JSON_Parser parser) +{ + GrammarianOutput output; + output = Grammarian_ProcessToken(&parser->grammarianData, parser->token, &parser->memorySuite); + switch (GRAMMARIAN_RESULT_CODE(output)) + { + case ACCEPTED_TOKEN: + if (!JSON_Parser_HandleGrammarEvents(parser, GRAMMARIAN_EVENT(output))) + return JSON_Failure; + break; + + case REJECTED_TOKEN: + JSON_Parser_SetErrorAtToken(parser, JSON_Error_UnexpectedToken); + return JSON_Failure; + + case SYMBOL_STACK_FULL: + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_OutOfMemory); + return JSON_Failure; + } + + /* Reset the lexer to prepare for the next token. */ + parser->lexerState = LEXING_WHITESPACE; + parser->lexerBits = 0; + parser->token = T_NONE; + parser->tokenAttributes = 0; + parser->tokenBytesUsed = 0; + return JSON_Success; +} + +/* Lexer functions. */ + +static const byte expectedLiteralChars[] = { 'u', 'l', 'l', 0, 'r', 'u', 'e', 0, 'a', 'l', 's', 'e', 0, 'a', 'N', 0, 'n', 'f', 'i', 'n', 'i', 't', 'y', 0 }; + +#define NULL_LITERAL_EXPECTED_CHARS_START_INDEX 0 +#define TRUE_LITERAL_EXPECTED_CHARS_START_INDEX 4 +#define FALSE_LITERAL_EXPECTED_CHARS_START_INDEX 8 +#define NAN_LITERAL_EXPECTED_CHARS_START_INDEX 13 +#define INFINITY_LITERAL_EXPECTED_CHARS_START_INDEX 16 + +/* Forward declaration. */ +static JSON_Status JSON_Parser_FlushLexer(JSON_Parser parser); +static JSON_Status JSON_Parser_ProcessCodepoint( + JSON_Parser parser, Codepoint c, size_t encodedLength); + +static JSON_Status JSON_Parser_HandleInvalidEncodingSequence( + JSON_Parser parser, size_t encodedLength) +{ + if (parser->token == T_STRING && GET_FLAGS(parser->flags, PARSER_REPLACE_INVALID)) + { + /* Since we're inside a string token, replacing the invalid sequence + with the Unicode replacement character as requested by the client + is a viable way to avoid a parse failure. Outside a string token, + such a replacement would simply trigger JSON_Error_UnknownToken + when we tried to process the replacement character, so it's less + confusing to stick with JSON_Error_InvalidEncodingSequence in that + case. */ + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsReplacedCharacter); + return JSON_Parser_ProcessCodepoint(parser, REPLACEMENT_CHARACTER_CODEPOINT, encodedLength); + } + else if (!parser->depth && GET_FLAGS(parser->flags, PARSER_EMBEDDED_DOCUMENT)) + { + /* Since we're parsing the top-level value of an embedded + document, assume that the invalid encoding sequence we've + encountered does not actually belong to the document, and + finish parsing by pretending that we've encountered EOF + instead of an invalid sequence. If the content is valid, + this will fail with JSON_Error_StoppedAfterEmbeddedDocument; + otherwise, it will fail with an appropriate error. */ + return (JSON_Status)(JSON_Parser_FlushLexer(parser) && JSON_Parser_FlushParser(parser)); + } + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_InvalidEncodingSequence); + return JSON_Failure; +} + +static JSON_Status JSON_Parser_HandleInvalidNumber(JSON_Parser parser, + Codepoint c, int codepointsSinceValidNumber, TokenAttributes attributesToRemove) +{ + SET_FLAGS_OFF(TokenAttributes, parser->tokenAttributes, attributesToRemove); + if (!parser->depth && GET_FLAGS(parser->flags, PARSER_EMBEDDED_DOCUMENT)) + { + /* The invalid number is the top-level value of an embedded document, + and it has a prefix that can be interpreted as a valid number. + We want to backtrack so that we are at the end of that prefix, + and then process the valid token. + + Note that backtracking requires us to make three assumptions, which + are always valid in the context of a number token: + + 1. The input encoding is not JSON_UnknownEncoding. + + 2 The codepoints we are backing up across are all in the range + U+0000 - U+007F, aka ASCII, so we can assume the number of + bytes comprising them based on the input encoding. + + 3. The codepoints we are backing up across do not include any + line breaks, so we can assume that the line number stays the + same and the column number can simply be decremented. + + For example: + + "01" => "0" + "123.!" => "123" + "123e!" => "123" + "123e+!" => "123" + "123e-!" => "123" + "1.2e!" => "1.2" + "1.2e+!" => "1.2" + "1.2e-!" => "1.2" + */ + parser->codepointLocationByte -= (size_t)codepointsSinceValidNumber + * (size_t)SHORTEST_ENCODING_SEQUENCE(parser->inputEncoding); + parser->codepointLocationColumn -= (size_t)codepointsSinceValidNumber; + parser->tokenBytesUsed -= (size_t)codepointsSinceValidNumber + * (size_t)SHORTEST_ENCODING_SEQUENCE(parser->numberEncoding); + return JSON_Parser_ProcessToken(parser); /* always fails */ + } + /* Allow JSON_Parser_FlushLexer() to fail. */ + else if (c == EOF_CODEPOINT) + return JSON_Success; + + JSON_Parser_SetErrorAtToken(parser, JSON_Error_InvalidNumber); + return JSON_Failure; +} + +static void JSON_Parser_StartToken(JSON_Parser parser, Symbol token) +{ + parser->token = token; + parser->tokenLocationByte = parser->codepointLocationByte; + parser->tokenLocationLine = parser->codepointLocationLine; + parser->tokenLocationColumn = parser->codepointLocationColumn; +} + +static JSON_Status JSON_Parser_ProcessCodepoint(JSON_Parser parser, Codepoint c, size_t encodedLength) +{ + Encoding tokenEncoding; + size_t maxTokenLength; + int tokenFinished = 0; + Codepoint codepointToRecord = EOF_CODEPOINT; + + /* If the previous codepoint was U+000D (CARRIAGE RETURN), and the current + codepoint is U+000A (LINE FEED), then treat the 2 codepoints as a single + line break. */ + if (GET_FLAGS(parser->state, PARSER_AFTER_CARRIAGE_RETURN)) + { + if (c == LINE_FEED_CODEPOINT) + parser->codepointLocationLine--; + SET_FLAGS_OFF(ParserState, parser->state, PARSER_AFTER_CARRIAGE_RETURN); + } + +reprocess: + + switch (parser->lexerState) + { + case LEXING_WHITESPACE: + if (c == '{') + { + JSON_Parser_StartToken(parser, T_LEFT_CURLY); + tokenFinished = 1; + } + else if (c == '}') + { + JSON_Parser_StartToken(parser, T_RIGHT_CURLY); + tokenFinished = 1; + } + else if (c == '[') + { + JSON_Parser_StartToken(parser, T_LEFT_SQUARE); + tokenFinished = 1; + } + else if (c == ']') + { + JSON_Parser_StartToken(parser, T_RIGHT_SQUARE); + tokenFinished = 1; + } + else if (c == ':') + { + JSON_Parser_StartToken(parser, T_COLON); + tokenFinished = 1; + } + else if (c == ',') + { + JSON_Parser_StartToken(parser, T_COMMA); + tokenFinished = 1; + } + else if (c == 'n') + { + JSON_Parser_StartToken(parser, T_NULL); + parser->lexerBits = NULL_LITERAL_EXPECTED_CHARS_START_INDEX; + parser->lexerState = LEXING_LITERAL; + } + else if (c == 't') + { + JSON_Parser_StartToken(parser, T_TRUE); + parser->lexerBits = TRUE_LITERAL_EXPECTED_CHARS_START_INDEX; + parser->lexerState = LEXING_LITERAL; + } + else if (c == 'f') + { + JSON_Parser_StartToken(parser, T_FALSE); + parser->lexerBits = FALSE_LITERAL_EXPECTED_CHARS_START_INDEX; + parser->lexerState = LEXING_LITERAL; + } + else if (c == '"') + { + JSON_Parser_StartToken(parser, T_STRING); + parser->lexerState = LEXING_STRING; + } + else if (c == '-') + { + JSON_Parser_StartToken(parser, T_NUMBER); + parser->tokenAttributes = JSON_IsNegative; + codepointToRecord = '-'; + parser->lexerState = LEXING_NUMBER_AFTER_MINUS; + goto recordNumberCodepointAndAdvance; + } + else if (c == '0') + { + JSON_Parser_StartToken(parser, T_NUMBER); + codepointToRecord = '0'; + parser->lexerState = LEXING_NUMBER_AFTER_LEADING_ZERO; + goto recordNumberCodepointAndAdvance; + } + else if (c >= '1' && c <= '9') + { + JSON_Parser_StartToken(parser, T_NUMBER); + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_DECIMAL_DIGITS; + goto recordNumberCodepointAndAdvance; + } + else if (c == ' ' || c == TAB_CODEPOINT || c == LINE_FEED_CODEPOINT || + c == CARRIAGE_RETURN_CODEPOINT || c == EOF_CODEPOINT) + { + /* Ignore whitespace between tokens. */ + } + else if (c == BOM_CODEPOINT && parser->codepointLocationByte == 0) + { + /* OK, we'll allow the BOM. */ + if (GET_FLAGS(parser->flags, PARSER_ALLOW_BOM)) { } + else + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_BOMNotAllowed); + return JSON_Failure; + } + } + else if (c == '/' && GET_FLAGS(parser->flags, PARSER_ALLOW_COMMENTS)) + { + /* Comments are not real tokens, but we save the location + of the comment as the token location in case of an error. */ + parser->tokenLocationByte = parser->codepointLocationByte; + parser->tokenLocationLine = parser->codepointLocationLine; + parser->tokenLocationColumn = parser->codepointLocationColumn; + parser->lexerState = LEXING_COMMENT_AFTER_SLASH; + } + else if (c == 'N' && GET_FLAGS(parser->flags, PARSER_ALLOW_SPECIAL_NUMBERS)) + { + JSON_Parser_StartToken(parser, T_NAN); + parser->lexerBits = NAN_LITERAL_EXPECTED_CHARS_START_INDEX; + parser->lexerState = LEXING_LITERAL; + } + else if (c == 'I' && GET_FLAGS(parser->flags, PARSER_ALLOW_SPECIAL_NUMBERS)) + { + JSON_Parser_StartToken(parser, T_INFINITY); + parser->lexerBits = INFINITY_LITERAL_EXPECTED_CHARS_START_INDEX; + parser->lexerState = LEXING_LITERAL; + } + else + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_UnknownToken); + return JSON_Failure; + } + goto advance; + + case LEXING_LITERAL: + /* While lexing a literal we store an index into expectedLiteralChars + in lexerBits. */ + if (expectedLiteralChars[parser->lexerBits]) + { + /* The codepoint should match the next character in the literal. */ + if (c != expectedLiteralChars[parser->lexerBits]) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_UnknownToken); + return JSON_Failure; + } + parser->lexerBits++; + + /* If the literal is the top-level value of an embedded document, + process it as soon as we consume its last expected codepoint. + Normally we defer processing until the following codepoint + has been examined, so that we can treat sequences like "nullx" + as a single, unknown token rather than a null literal followed + by an unknown token. */ + if (!parser->depth && GET_FLAGS(parser->flags, PARSER_EMBEDDED_DOCUMENT) && + !expectedLiteralChars[parser->lexerBits]) + tokenFinished = 1; + } + else + { + /* The literal should be finished, so the codepoint should not be + a plausible JSON literal character, but rather EOF, whitespace, + or the first character of the next token. */ + if ((c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || + (c == '_')) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_UnknownToken); + return JSON_Failure; + } + if (!JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + goto reprocess; + } + goto advance; + + case LEXING_STRING: + /* Allow JSON_Parser_FlushLexer() to fail. */ + if (c == EOF_CODEPOINT) { } + else if (c == '"') + tokenFinished = 1; + else if (c == '\\') + parser->lexerState = LEXING_STRING_ESCAPE; + else if (c < 0x20 && !GET_FLAGS(parser->flags, PARSER_ALLOW_CONTROL_CHARS)) + { + /* ASCII control characters (U+0000 - U+001F) are not allowed to + appear unescaped in string values unless specifically allowed. */ + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_UnescapedControlCharacter); + return JSON_Failure; + } + else + { + codepointToRecord = c; + goto recordStringCodepointAndAdvance; + } + goto advance; + + case LEXING_STRING_ESCAPE: + if (c == EOF_CODEPOINT) + { + /* Allow JSON_Parser_FlushLexer() to fail. */ + } + else + { + if (c == 'u') + parser->lexerState = LEXING_STRING_HEX_ESCAPE_BYTE_1; + else + { + if (c == '"' || c == '\\' || c == '/') + codepointToRecord = c; + else if (c == 'b') + codepointToRecord = BACKSPACE_CODEPOINT; + else if (c == 't') + codepointToRecord = TAB_CODEPOINT; + else if (c == 'n') + codepointToRecord = LINE_FEED_CODEPOINT; + else if (c == 'f') + codepointToRecord = FORM_FEED_CODEPOINT; + else if (c == 'r') + codepointToRecord = CARRIAGE_RETURN_CODEPOINT; + else + { + /* The current codepoint location is the first character after + the backslash that started the escape sequence. The error + location should be the beginning of the escape sequence, 1 + character earlier. */ + JSON_Parser_SetErrorAtStringEscapeSequenceStart(parser, JSON_Error_InvalidEscapeSequence, 1); + return JSON_Failure; + } + parser->lexerState = LEXING_STRING; + goto recordStringCodepointAndAdvance; + } + } + goto advance; + + case LEXING_STRING_HEX_ESCAPE_BYTE_1: + case LEXING_STRING_HEX_ESCAPE_BYTE_2: + case LEXING_STRING_HEX_ESCAPE_BYTE_3: + case LEXING_STRING_HEX_ESCAPE_BYTE_4: + case LEXING_STRING_HEX_ESCAPE_BYTE_5: + case LEXING_STRING_HEX_ESCAPE_BYTE_6: + case LEXING_STRING_HEX_ESCAPE_BYTE_7: + case LEXING_STRING_HEX_ESCAPE_BYTE_8: + /* Allow JSON_Parser_FlushLexer() to fail. */ + if (c != EOF_CODEPOINT) + { + /* While lexing a string hex escape sequence we store the bytes + of the escaped codepoint in the low 2 bytes of lexerBits. If + the escape sequence represents a leading surrogate, we shift + the leading surrogate into the high 2 bytes and lex a second + hex escape sequence (which should be a trailing surrogate). */ + int byteNumber = (parser->lexerState - LEXING_STRING_HEX_ESCAPE_BYTE_1) & 0x3; + uint32_t nibble; + if (c >= '0' && c <= '9') + nibble = c - '0'; + else if (c >= 'A' && c <= 'F') + nibble = c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + nibble = c - 'a' + 10; + else + { + /* The current codepoint location is one of the 4 hex digit + character slots in the hex escape sequence. The error + location should be the beginning of the hex escape + sequence, between 2 and 5 bytes earlier. */ + int codepointsAgo = 2 /* for "\u" */ + byteNumber; + JSON_Parser_SetErrorAtStringEscapeSequenceStart( + parser, JSON_Error_InvalidEscapeSequence, codepointsAgo); + return JSON_Failure; + } + /* Store the hex digit's bits in the appropriate byte of lexerBits. */ + nibble <<= (3 - byteNumber) * 4 /* shift left by 12, 8, 4, 0 */ ; + parser->lexerBits |= nibble; + if (parser->lexerState == LEXING_STRING_HEX_ESCAPE_BYTE_4) + { + /* The escape sequence is complete. We need to check whether + it represents a leading surrogate (which implies that it + will be immediately followed by a hex-escaped trailing + surrogate), a trailing surrogate (which is invalid), or a + valid codepoint (which should simply be appended to the + string token value). */ + if (IS_LEADING_SURROGATE(parser->lexerBits)) + { + /* Shift the leading surrogate into the high 2 bytes of + lexerBits so that the trailing surrogate can be stored + in the low 2 bytes. */ + parser->lexerBits <<= 16; + parser->lexerState = LEXING_STRING_TRAILING_SURROGATE_HEX_ESCAPE_BACKSLASH; + } + else if (IS_TRAILING_SURROGATE(parser->lexerBits)) + { + /* The current codepoint location is the last hex digit + of the hex escape sequence. The error location should + be the beginning of the hex escape sequence, 5 + characters earlier. */ + JSON_Parser_SetErrorAtStringEscapeSequenceStart( + parser, JSON_Error_UnpairedSurrogateEscapeSequence, 5); + return JSON_Failure; + } + else + { + /* The escape sequence represents a BMP codepoint. */ + codepointToRecord = parser->lexerBits; + parser->lexerBits = 0; + parser->lexerState = LEXING_STRING; + goto recordStringCodepointAndAdvance; + } + } + else if (parser->lexerState == LEXING_STRING_HEX_ESCAPE_BYTE_8) + { + /* The second hex escape sequence is complete. We need to + check whether it represents a trailing surrogate as + expected. If so, the surrogate pair represents a single + non-BMP codepoint. */ + if (!IS_TRAILING_SURROGATE(parser->lexerBits & 0xFFFF)) + { + /* The current codepoint location is the last hex digit of + the second hex escape sequence. The error location + should be the beginning of the leading surrogate + hex escape sequence, 11 characters earlier. */ + JSON_Parser_SetErrorAtStringEscapeSequenceStart( + parser, JSON_Error_UnpairedSurrogateEscapeSequence, 11); + return JSON_Failure; + } + /* The escape sequence represents a non-BMP codepoint. */ + codepointToRecord = CODEPOINT_FROM_SURROGATES(parser->lexerBits); + parser->lexerBits = 0; + parser->lexerState = LEXING_STRING; + goto recordStringCodepointAndAdvance; + } + else + parser->lexerState++; + } + goto advance; + + case LEXING_STRING_TRAILING_SURROGATE_HEX_ESCAPE_BACKSLASH: + if (c != EOF_CODEPOINT) + { + if (c != '\\') + { + /* The current codepoint location is the first character after + the leading surrogate hex escape sequence. The error + location should be the beginning of the leading surrogate + hex escape sequence, 6 characters earlier. */ + JSON_Parser_SetErrorAtStringEscapeSequenceStart( + parser, JSON_Error_UnpairedSurrogateEscapeSequence, 6); + return JSON_Failure; + } + parser->lexerState = LEXING_STRING_TRAILING_SURROGATE_HEX_ESCAPE_U; + } + goto advance; + + case LEXING_STRING_TRAILING_SURROGATE_HEX_ESCAPE_U: + if (c != EOF_CODEPOINT) + { + if (c != 'u') + { + /* Distinguish between a totally bogus escape sequence + and a valid one that just isn't the hex escape kind + that we require for a trailing surrogate. The current + codepoint location is the first character after the + backslash that should have introduced the trailing + surrogate hex escape sequence. */ + if (c == '"' || c == '\\' || c == '/' || c == 'b' || + c == 't' || c == 'n' || c == 'f' || c == 'r') + { + /* The error location should be at that beginning of the + leading surrogate's hex escape sequence, 7 characters + earlier. */ + JSON_Parser_SetErrorAtStringEscapeSequenceStart( + parser, JSON_Error_UnpairedSurrogateEscapeSequence, 7); + } + else + { + /* The error location should be at that backslash, 1 + character earlier. */ + JSON_Parser_SetErrorAtStringEscapeSequenceStart( + parser, JSON_Error_InvalidEscapeSequence, 1); + } + return JSON_Failure; + } + parser->lexerState = LEXING_STRING_HEX_ESCAPE_BYTE_5; + } + goto advance; + + case LEXING_NUMBER_AFTER_MINUS: + if (c == EOF_CODEPOINT) + { + /* Allow JSON_Parser_FlushLexer() to fail. */ + } + else if (c == 'I' && GET_FLAGS(parser->flags, PARSER_ALLOW_SPECIAL_NUMBERS)) + { + parser->token = T_NEGATIVE_INFINITY; /* changing horses mid-stream, so to speak */ + parser->lexerBits = INFINITY_LITERAL_EXPECTED_CHARS_START_INDEX; + parser->lexerState = LEXING_LITERAL; + } + else + { + if (c == '0') + { + codepointToRecord = '0'; + parser->lexerState = LEXING_NUMBER_AFTER_LEADING_NEGATIVE_ZERO; + goto recordNumberCodepointAndAdvance; + } + else if (c >= '1' && c <= '9') + { + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_DECIMAL_DIGITS; + goto recordNumberCodepointAndAdvance; + } + else + { + /* We trigger an unknown token error rather than an invalid number + error so that "Foo" and "-Foo" trigger the same error. */ + JSON_Parser_SetErrorAtToken(parser, JSON_Error_UnknownToken); + return JSON_Failure; + } + } + goto advance; + + case LEXING_NUMBER_AFTER_LEADING_ZERO: + case LEXING_NUMBER_AFTER_LEADING_NEGATIVE_ZERO: + if (c == '.') + { + codepointToRecord = '.'; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsDecimalPoint); + parser->lexerState = LEXING_NUMBER_AFTER_DOT; + goto recordNumberCodepointAndAdvance; + } + else if (c == 'e' || c == 'E') + { + codepointToRecord = c; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsExponent); + parser->lexerState = LEXING_NUMBER_AFTER_E; + goto recordNumberCodepointAndAdvance; + } + else if (c >= '0' && c <= '9') + { + /* JSON does not allow the integer part of a number to have any + digits after a leading zero. */ + if (!JSON_Parser_HandleInvalidNumber(parser, c, 0, 0)) + return JSON_Failure; + } + else if ((c == 'x' || c == 'X') && + parser->lexerState == LEXING_NUMBER_AFTER_LEADING_ZERO && + GET_FLAGS(parser->flags, PARSER_ALLOW_HEX_NUMBERS)) + { + codepointToRecord = c; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_IsHex); + parser->lexerState = LEXING_NUMBER_AFTER_X; + goto recordNumberCodepointAndAdvance; + } + else + { + /* The number is finished. */ + if (!JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + goto reprocess; + } + goto advance; + + case LEXING_NUMBER_AFTER_X: + if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) + { + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_HEX_DIGITS; + goto recordNumberCodepointAndAdvance; + } + else if (!JSON_Parser_HandleInvalidNumber(parser, c, 1, JSON_IsHex)) + return JSON_Failure; + goto advance; + + case LEXING_NUMBER_HEX_DIGITS: + if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) + { + codepointToRecord = c; + goto recordNumberCodepointAndAdvance; + } + /* The number is finished. */ + if (!JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + goto reprocess; + + case LEXING_NUMBER_DECIMAL_DIGITS: + if (c >= '0' && c <= '9') + { + codepointToRecord = c; + goto recordNumberCodepointAndAdvance; + } + else if (c == '.') + { + codepointToRecord = '.'; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsDecimalPoint); + parser->lexerState = LEXING_NUMBER_AFTER_DOT; + goto recordNumberCodepointAndAdvance; + } + else if (c == 'e' || c == 'E') + { + codepointToRecord = c; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsExponent); + parser->lexerState = LEXING_NUMBER_AFTER_E; + goto recordNumberCodepointAndAdvance; + } + /* The number is finished. */ + if (!JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + goto reprocess; + + case LEXING_NUMBER_AFTER_DOT: + if (c >= '0' && c <= '9') + { + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_FRACTIONAL_DIGITS; + goto recordNumberCodepointAndAdvance; + } + else if (!JSON_Parser_HandleInvalidNumber(parser, c, 1, JSON_ContainsDecimalPoint)) + return JSON_Failure; + goto advance; + + case LEXING_NUMBER_FRACTIONAL_DIGITS: + if (c >= '0' && c <= '9') + { + codepointToRecord = c; + goto recordNumberCodepointAndAdvance; + } + else if (c == 'e' || c == 'E') + { + codepointToRecord = c; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsExponent); + parser->lexerState = LEXING_NUMBER_AFTER_E; + goto recordNumberCodepointAndAdvance; + } + /* The number is finished. */ + if (!JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + goto reprocess; + + case LEXING_NUMBER_AFTER_E: + if (c == '+') + { + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_AFTER_EXPONENT_SIGN; + goto recordNumberCodepointAndAdvance; + } + else if (c == '-') + { + codepointToRecord = c; + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsNegativeExponent); + parser->lexerState = LEXING_NUMBER_AFTER_EXPONENT_SIGN; + goto recordNumberCodepointAndAdvance; + } + else if (c >= '0' && c <= '9') + { + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_EXPONENT_DIGITS; + goto recordNumberCodepointAndAdvance; + } + else if (!JSON_Parser_HandleInvalidNumber(parser, c, 1, JSON_ContainsExponent)) + return JSON_Failure; + goto advance; + + case LEXING_NUMBER_AFTER_EXPONENT_SIGN: + if (c >= '0' && c <= '9') + { + codepointToRecord = c; + parser->lexerState = LEXING_NUMBER_EXPONENT_DIGITS; + goto recordNumberCodepointAndAdvance; + } + else if (!JSON_Parser_HandleInvalidNumber(parser, c, 2, JSON_ContainsExponent | JSON_ContainsNegativeExponent)) + return JSON_Failure; + goto advance; + + case LEXING_NUMBER_EXPONENT_DIGITS: + if (c >= '0' && c <= '9') + { + codepointToRecord = c; + goto recordNumberCodepointAndAdvance; + } + /* The number is finished. */ + if (!JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + goto reprocess; + + case LEXING_COMMENT_AFTER_SLASH: + if (c == '/') + parser->lexerState = LEXING_SINGLE_LINE_COMMENT; + else if (c == '*') + parser->lexerState = LEXING_MULTI_LINE_COMMENT; + else + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_UnknownToken); + return JSON_Failure; + } + goto advance; + + case LEXING_SINGLE_LINE_COMMENT: + if (c == CARRIAGE_RETURN_CODEPOINT || c == LINE_FEED_CODEPOINT || c == EOF_CODEPOINT) + parser->lexerState = LEXING_WHITESPACE; + goto advance; + + case LEXING_MULTI_LINE_COMMENT: + if (c == '*') + parser->lexerState = LEXING_MULTI_LINE_COMMENT_AFTER_STAR; + goto advance; + + case LEXING_MULTI_LINE_COMMENT_AFTER_STAR: + if (c == '/') + parser->lexerState = LEXING_WHITESPACE; + else if (c != '*') + parser->lexerState = LEXING_MULTI_LINE_COMMENT; + goto advance; + } + +recordStringCodepointAndAdvance: + + tokenEncoding = parser->stringEncoding; + maxTokenLength = parser->maxStringLength; + if (!codepointToRecord) + { + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsNullCharacter | JSON_ContainsControlCharacter); + } + else if (codepointToRecord < FIRST_NON_CONTROL_CODEPOINT) + { + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsControlCharacter); + } + else if (codepointToRecord >= FIRST_NON_BMP_CODEPOINT) + { + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsNonASCIICharacter | JSON_ContainsNonBMPCharacter); + } + else if (codepointToRecord >= FIRST_NON_ASCII_CODEPOINT) + { + SET_FLAGS_ON(TokenAttributes, parser->tokenAttributes, JSON_ContainsNonASCIICharacter); + } + goto recordCodepointAndAdvance; + +recordNumberCodepointAndAdvance: + + tokenEncoding = parser->numberEncoding; + maxTokenLength = parser->maxNumberLength; + goto recordCodepointAndAdvance; + +recordCodepointAndAdvance: + + /* We always ensure that there are LONGEST_ENCODING_SEQUENCE bytes + available in the buffer for the next codepoint, so we don't have to + check whether there is room when we decode a new codepoint, and if + there isn't another codepoint, we have space already allocated for + the encoded null terminator.*/ + parser->tokenBytesUsed += EncodeCodepoint(codepointToRecord, tokenEncoding, parser->pTokenBytes + parser->tokenBytesUsed); + if (parser->tokenBytesUsed > maxTokenLength) + { + JSON_Parser_SetErrorAtToken(parser, parser->token == T_NUMBER ? JSON_Error_TooLongNumber : JSON_Error_TooLongString); + return JSON_Failure; + } + if (parser->tokenBytesUsed > parser->tokenBytesLength - LONGEST_ENCODING_SEQUENCE) + { + byte* pBiggerBuffer = DoubleBuffer(&parser->memorySuite, parser->defaultTokenBytes, parser->pTokenBytes, parser->tokenBytesLength); + if (!pBiggerBuffer) + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_OutOfMemory); + return JSON_Failure; + } + parser->pTokenBytes = pBiggerBuffer; + parser->tokenBytesLength *= 2; + } + goto advance; + +advance: + + /* The current codepoint has been accepted, so advance the codepoint + location counters accordingly. Note that the one time we don't + do this is when the codepoint is EOF, which doesn't actually + appear in the input stream. */ + if (c == CARRIAGE_RETURN_CODEPOINT) + { + SET_FLAGS_ON(ParserState, parser->state, PARSER_AFTER_CARRIAGE_RETURN); + } + if (c != EOF_CODEPOINT) + { + parser->codepointLocationByte += encodedLength; + if (c == CARRIAGE_RETURN_CODEPOINT || c == LINE_FEED_CODEPOINT) + { + /* The next character will begin a new line. */ + parser->codepointLocationLine++; + parser->codepointLocationColumn = 0; + } + else + { + /* The next character will be on the same line. */ + parser->codepointLocationColumn++; + } + } + + if (tokenFinished && !JSON_Parser_ProcessToken(parser)) + return JSON_Failure; + + return JSON_Success; +} + +static JSON_Status JSON_Parser_FlushLexer(JSON_Parser parser) +{ + /* Push the EOF codepoint to the lexer so that it can finish the pending + token, if any. The EOF codepoint is never emitted by the decoder + itself, since it is outside the Unicode range and therefore cannot + be encoded in any of the possible input encodings. */ + if (!JSON_Parser_ProcessCodepoint(parser, EOF_CODEPOINT, 0)) + return JSON_Failure; + + /* The lexer should be idle when parsing finishes. */ + if (parser->lexerState != LEXING_WHITESPACE) + { + JSON_Parser_SetErrorAtToken(parser, JSON_Error_IncompleteToken); + return JSON_Failure; + } + return JSON_Success; +} + +/* Parser's decoder functions. */ + +static JSON_Status JSON_Parser_CallEncodingDetectedHandler(JSON_Parser parser) +{ + if (parser->encodingDetectedHandler && parser->encodingDetectedHandler(parser) != JSON_Parser_Continue) + { + JSON_Parser_SetErrorAtCodepoint(parser, JSON_Error_AbortedByHandler); + return JSON_Failure; + } + return JSON_Success; +} + +/* Forward declaration. */ +static JSON_Status JSON_Parser_ProcessInputBytes(JSON_Parser parser, const byte* pBytes, size_t length); + +static JSON_Status JSON_Parser_ProcessUnknownByte(JSON_Parser parser, byte b) +{ + /* When the input encoding is unknown, the first 4 bytes of input are + recorded in decoder.bits. */ + byte bytes[LONGEST_ENCODING_SEQUENCE]; + + switch (parser->decoderData.state) + { + case DECODER_RESET: + parser->decoderData.state = DECODED_1_OF_4; + parser->decoderData.bits = (uint32_t)b << 24; + break; + + case DECODED_1_OF_4: + parser->decoderData.state = DECODED_2_OF_4; + parser->decoderData.bits |= (uint32_t)b << 16; + break; + + case DECODED_2_OF_4: + parser->decoderData.state = DECODED_3_OF_4; + parser->decoderData.bits |= (uint32_t)b << 8; + break; + + case DECODED_3_OF_4: + bytes[0] = (byte)(parser->decoderData.bits >> 24); + bytes[1] = (byte)(parser->decoderData.bits >> 16); + bytes[2] = (byte)(parser->decoderData.bits >> 8); + bytes[3] = (byte)(b); + + /* We try to match the following patterns in order, where .. is any + byte value and nz is any non-zero byte value: + EF BB BF .. => UTF-8 with BOM + FF FE 00 00 => UTF-32LE with BOM + FF FE nz 00 => UTF-16LE with BOM + 00 00 FE FF -> UTF-32BE with BOM + FE FF .. .. => UTF-16BE with BOM + nz nz .. .. => UTF-8 + nz 00 nz .. => UTF-16LE + nz 00 00 00 => UTF-32LE + 00 nz .. .. => UTF-16BE + 00 00 00 nz => UTF-32BE + .. .. .. .. => unknown encoding */ + if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) + { + /* EF BB BF .. */ + parser->inputEncoding = JSON_UTF8; + } + else if (bytes[0] == 0xFF && bytes[1] == 0xFE && bytes[3] == 0x00) + { + /* FF FE 00 00 or + FF FE nz 00 */ + parser->inputEncoding = (bytes[2] == 0x00) ? JSON_UTF32LE : JSON_UTF16LE; + } + else if (bytes[0] == 0x00 && bytes[1] == 0x00 && bytes[2] == 0xFE && bytes[3] == 0xFF) + { + /* 00 00 FE FF */ + parser->inputEncoding = JSON_UTF32BE; + } + else if (bytes[0] == 0xFE && bytes[1] == 0xFF) + { + /* FE FF .. .. */ + parser->inputEncoding = JSON_UTF16BE; + } + else if (bytes[0] != 0x00) + { + /* nz .. .. .. */ + if (bytes[1] != 0x00) + { + /* nz nz .. .. */ + parser->inputEncoding = JSON_UTF8; + } + else if (bytes[2] != 0x00) + { + /* nz 00 nz .. */ + parser->inputEncoding = JSON_UTF16LE; + } + else if (bytes[3] == 0x00) + { + /* nz 00 00 00 */ + parser->inputEncoding = JSON_UTF32LE; + } + else + { + /* nz 00 00 nz => error */ + } + } + else if (bytes[1] != 0x00) + { + /* 00 nz .. .. */ + parser->inputEncoding = JSON_UTF16BE; + } + else if (bytes[2] == 0x00 && bytes[3] != 0x00) + { + /* 00 00 00 nz */ + parser->inputEncoding = JSON_UTF32BE; + } + else + { + /* 00 00 nz .. or + 00 00 00 00 => error */ + } + + if (parser->inputEncoding == JSON_UnknownEncoding) + return JSON_Parser_HandleInvalidEncodingSequence(parser, 4); + + if (!JSON_Parser_CallEncodingDetectedHandler(parser)) + return JSON_Failure; + + /* Reset the decoder before reprocessing the bytes. */ + Decoder_Reset(&parser->decoderData); + return JSON_Parser_ProcessInputBytes(parser, bytes, 4); + } + + /* We don't have 4 bytes yet. */ + return JSON_Success; +} + +JSON_Status JSON_Parser_ProcessInputBytes(JSON_Parser parser, const byte* pBytes, size_t length) +{ + /* Note that if length is 0, pBytes is allowed to be NULL. */ + size_t i = 0; + while (parser->inputEncoding == JSON_UnknownEncoding && i < length) + { + if (!JSON_Parser_ProcessUnknownByte(parser, pBytes[i])) + return JSON_Failure; + i++; + } + while (i < length) + { + DecoderOutput output = Decoder_ProcessByte( + &parser->decoderData, parser->inputEncoding, pBytes[i]); + DecoderResultCode result = DECODER_RESULT_CODE(output); + switch (result) + { + case SEQUENCE_PENDING: + i++; + break; + + case SEQUENCE_COMPLETE: + if (!JSON_Parser_ProcessCodepoint( + parser, DECODER_CODEPOINT(output), + DECODER_SEQUENCE_LENGTH(output))) + return JSON_Failure; + i++; + break; + + case SEQUENCE_INVALID_INCLUSIVE: + i++; + /* fallthrough */ + case SEQUENCE_INVALID_EXCLUSIVE: + if (!JSON_Parser_HandleInvalidEncodingSequence( + parser, DECODER_SEQUENCE_LENGTH(output))) + return JSON_Failure; + break; + } + } + return JSON_Success; +} + +static JSON_Status JSON_Parser_FlushDecoder(JSON_Parser parser) +{ + /* If the input was 1, 2, or 3 bytes long, and the input encoding was not + explicitly specified by the client, we can sometimes make a reasonable + guess. If the input was 1 or 3 bytes long, the only encoding that could + possibly be valid JSON is UF-8. If the input was 2 bytes long, we try + to match the following patterns in order, where .. is any byte value + and nz is any non-zero byte value: + FF FE => UTF-16LE with BOM + FE FF => UTF-16BE with BOM + nz nz => UTF-8 + nz 00 => UTF-16LE + 00 nz => UTF-16BE + .. .. => unknown encoding + */ + if (parser->inputEncoding == JSON_UnknownEncoding && + parser->decoderData.state != DECODER_RESET) + { + byte bytes[3]; + size_t length = 0; + bytes[0] = (byte)(parser->decoderData.bits >> 24); + bytes[1] = (byte)(parser->decoderData.bits >> 16); + bytes[2] = (byte)(parser->decoderData.bits >> 8); + + switch (parser->decoderData.state) + { + case DECODED_1_OF_4: + parser->inputEncoding = JSON_UTF8; + length = 1; + break; + + case DECODED_2_OF_4: + /* FF FE */ + if (bytes[0] == 0xFF && bytes[1] == 0xFE) + parser->inputEncoding = JSON_UTF16LE; + /* FE FF */ + else if (bytes[0] == 0xFE && bytes[1] == 0xFF) + parser->inputEncoding = JSON_UTF16BE; + else if (bytes[0] != 0x00) + { + /* nz nz or + nz 00 */ + parser->inputEncoding = bytes[1] ? JSON_UTF8 : JSON_UTF16LE; + } + /* 00 nz */ + else if (bytes[1] != 0x00) + parser->inputEncoding = JSON_UTF16BE; + /* 00 00 */ + else + return JSON_Parser_HandleInvalidEncodingSequence(parser, 2); + length = 2; + break; + + case DECODED_3_OF_4: + parser->inputEncoding = JSON_UTF8; + length = 3; + break; + } + + if (!JSON_Parser_CallEncodingDetectedHandler(parser)) + return JSON_Failure; + + /* Reset the decoder before reprocessing the bytes. */ + parser->decoderData.state = DECODER_RESET; + parser->decoderData.bits = 0; + if (!JSON_Parser_ProcessInputBytes(parser, bytes, length)) + return JSON_Failure; + } + + /* The decoder should be idle when parsing finishes. */ + if (Decoder_SequencePending(&parser->decoderData)) + return JSON_Parser_HandleInvalidEncodingSequence( + parser, DECODER_STATE_BYTES(parser->decoderData.state)); + return JSON_Success; +} + +/* Parser API functions. */ + +JSON_Parser JSON_CALL JSON_Parser_Create(const JSON_MemorySuite* pMemorySuite) +{ + JSON_Parser parser; + JSON_MemorySuite memorySuite; + + if (pMemorySuite) + { + memorySuite = *pMemorySuite; + + /* The full memory suite must be specified. */ + if (!memorySuite.realloc || !memorySuite.free) + return NULL; + } + else + memorySuite = defaultMemorySuite; + + parser = (JSON_Parser)memorySuite.realloc(memorySuite.userData, NULL, sizeof(struct JSON_Parser_Data)); + + if (!parser) + return NULL; + + parser->memorySuite = memorySuite; + JSON_Parser_ResetData(parser, 0/* isInitialized */); + return parser; +} + +JSON_Status JSON_CALL JSON_Parser_Free(JSON_Parser parser) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_IN_PROTECTED_API)) + return JSON_Failure; + + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_PROTECTED_API); + + if (parser->pTokenBytes != parser->defaultTokenBytes) + parser->memorySuite.free(parser->memorySuite.userData, parser->pTokenBytes); + + while (parser->pMemberNames) + JSON_Parser_PopMemberNameList(parser); + + Grammarian_FreeAllocations(&parser->grammarianData, &parser->memorySuite); + parser->memorySuite.free(parser->memorySuite.userData, parser); + return JSON_Success; +} + +JSON_Status JSON_CALL JSON_Parser_Reset(JSON_Parser parser) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_IN_PROTECTED_API)) + return JSON_Failure; + SET_FLAGS_ON(ParserState, parser->state, PARSER_IN_PROTECTED_API); + JSON_Parser_ResetData(parser, 1/* isInitialized */); + /* Note that JSON_Parser_ResetData() unset PARSER_IN_PROTECTED_API for us. */ + return JSON_Success; +} + +void* JSON_CALL JSON_Parser_GetUserData(JSON_Parser parser) +{ + return parser ? parser->userData : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetUserData(JSON_Parser parser, void* userData) +{ + if (!parser) + return JSON_Failure; + parser->userData = userData; + return JSON_Success; +} + +JSON_Encoding JSON_CALL JSON_Parser_GetInputEncoding(JSON_Parser parser) +{ + return parser ? (JSON_Encoding)parser->inputEncoding : JSON_UnknownEncoding; +} + +JSON_Status JSON_CALL JSON_Parser_SetInputEncoding(JSON_Parser parser, JSON_Encoding encoding) +{ + if ( !parser + || encoding < JSON_UnknownEncoding + || encoding > JSON_UTF32BE + || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + parser->inputEncoding = (Encoding)encoding; + return JSON_Success; +} + +JSON_Encoding JSON_CALL JSON_Parser_GetStringEncoding(JSON_Parser parser) +{ + return parser ? (JSON_Encoding)parser->stringEncoding : JSON_UTF8; +} + +JSON_Status JSON_CALL JSON_Parser_SetStringEncoding(JSON_Parser parser, JSON_Encoding encoding) +{ + if ( + !parser + || encoding <= JSON_UnknownEncoding + || encoding > JSON_UTF32BE + || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + parser->stringEncoding = (Encoding)encoding; + return JSON_Success; +} + +size_t JSON_CALL JSON_Parser_GetMaxStringLength(JSON_Parser parser) +{ + return parser ? parser->maxStringLength : SIZE_MAX; +} + +JSON_Status JSON_CALL JSON_Parser_SetMaxStringLength(JSON_Parser parser, size_t maxLength) +{ + if ( !parser + || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + parser->maxStringLength = maxLength; + return JSON_Success; +} + +JSON_Encoding JSON_CALL JSON_Parser_GetNumberEncoding(JSON_Parser parser) +{ + return parser ? (JSON_Encoding)parser->numberEncoding : JSON_UTF8; +} + +JSON_Status JSON_CALL JSON_Parser_SetNumberEncoding(JSON_Parser parser, JSON_Encoding encoding) +{ + if (!parser || encoding <= JSON_UnknownEncoding || encoding > JSON_UTF32BE || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + parser->numberEncoding = (Encoding)encoding; + return JSON_Success; +} + +size_t JSON_CALL JSON_Parser_GetMaxNumberLength(JSON_Parser parser) +{ + return parser ? parser->maxNumberLength : SIZE_MAX; +} + +JSON_Status JSON_CALL JSON_Parser_SetMaxNumberLength(JSON_Parser parser, size_t maxLength) +{ + if ( !parser + || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + parser->maxNumberLength = maxLength; + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetAllowBOM(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_ALLOW_BOM)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetAllowBOM(JSON_Parser parser, JSON_Boolean allowBOM) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + SET_FLAGS(ParserFlags, parser->flags, PARSER_ALLOW_BOM, allowBOM); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetAllowComments(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_ALLOW_COMMENTS)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetAllowComments(JSON_Parser parser, JSON_Boolean allowComments) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + SET_FLAGS(ParserFlags, parser->flags, PARSER_ALLOW_COMMENTS, allowComments); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetAllowSpecialNumbers(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_ALLOW_SPECIAL_NUMBERS)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetAllowSpecialNumbers(JSON_Parser parser, JSON_Boolean allowSpecialNumbers) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + SET_FLAGS(ParserFlags, parser->flags, PARSER_ALLOW_SPECIAL_NUMBERS, allowSpecialNumbers); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetAllowHexNumbers(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_ALLOW_HEX_NUMBERS)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetAllowHexNumbers(JSON_Parser parser, JSON_Boolean allowHexNumbers) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + SET_FLAGS(ParserFlags, parser->flags, PARSER_ALLOW_HEX_NUMBERS, allowHexNumbers); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetAllowUnescapedControlCharacters(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_ALLOW_CONTROL_CHARS)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetAllowUnescapedControlCharacters(JSON_Parser parser, JSON_Boolean allowUnescapedControlCharacters) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + SET_FLAGS(ParserFlags, parser->flags, PARSER_ALLOW_CONTROL_CHARS, allowUnescapedControlCharacters); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetReplaceInvalidEncodingSequences(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_REPLACE_INVALID)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetReplaceInvalidEncodingSequences( + JSON_Parser parser, JSON_Boolean replaceInvalidEncodingSequences) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + return JSON_Failure; + SET_FLAGS(ParserFlags, parser->flags, PARSER_REPLACE_INVALID, replaceInvalidEncodingSequences); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetTrackObjectMembers(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_TRACK_OBJECT_MEMBERS)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetTrackObjectMembers(JSON_Parser parser, JSON_Boolean trackObjectMembers) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + { + return JSON_Failure; + } + SET_FLAGS(ParserFlags, parser->flags, PARSER_TRACK_OBJECT_MEMBERS, trackObjectMembers); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Parser_GetStopAfterEmbeddedDocument(JSON_Parser parser) +{ + return (parser && GET_FLAGS(parser->flags, PARSER_EMBEDDED_DOCUMENT)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Parser_SetStopAfterEmbeddedDocument( + JSON_Parser parser, JSON_Boolean stopAfterEmbeddedDocument) +{ + if (!parser || GET_FLAGS(parser->state, PARSER_STARTED)) + { + return JSON_Failure; + } + SET_FLAGS(ParserFlags, parser->flags, PARSER_EMBEDDED_DOCUMENT, stopAfterEmbeddedDocument); + return JSON_Success; +} + +JSON_Error JSON_CALL JSON_Parser_GetError(JSON_Parser parser) +{ + return parser ? (JSON_Error)parser->error : JSON_Error_None; +} + +JSON_Status JSON_CALL JSON_Parser_GetErrorLocation( + JSON_Parser parser, JSON_Location* pLocation) +{ + if (!pLocation || !parser || parser->error == JSON_Error_None) + return JSON_Failure; + + if (parser->errorOffset == ERROR_LOCATION_IS_TOKEN_START) + { + pLocation->byte = parser->tokenLocationByte; + pLocation->line = parser->tokenLocationLine; + pLocation->column = parser->tokenLocationColumn; + } + else + { + pLocation->byte = parser->codepointLocationByte - (SHORTEST_ENCODING_SEQUENCE(parser->inputEncoding) * parser->errorOffset); + pLocation->line = parser->codepointLocationLine; + pLocation->column = parser->codepointLocationColumn - parser->errorOffset; + } + pLocation->depth = parser->depth; + return JSON_Success; +} + +JSON_Status JSON_CALL JSON_Parser_GetTokenLocation( + JSON_Parser parser, JSON_Location* pLocation) +{ + if (!parser || !pLocation || !GET_FLAGS(parser->state, PARSER_IN_TOKEN_HANDLER)) + return JSON_Failure; + + pLocation->byte = parser->tokenLocationByte; + pLocation->line = parser->tokenLocationLine; + pLocation->column = parser->tokenLocationColumn; + pLocation->depth = parser->depth; + return JSON_Success; +} + +JSON_Status JSON_CALL JSON_Parser_GetAfterTokenLocation( + JSON_Parser parser, JSON_Location* pLocation) +{ + if (!parser || !pLocation || !GET_FLAGS(parser->state, PARSER_IN_TOKEN_HANDLER)) + return JSON_Failure; + + pLocation->byte = parser->codepointLocationByte; + pLocation->line = parser->codepointLocationLine; + pLocation->column = parser->codepointLocationColumn; + pLocation->depth = parser->depth; + return JSON_Success; +} + +JSON_Parser_NullHandler JSON_CALL JSON_Parser_GetEncodingDetectedHandler(JSON_Parser parser) +{ + return parser ? parser->encodingDetectedHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetEncodingDetectedHandler( + JSON_Parser parser, JSON_Parser_EncodingDetectedHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->encodingDetectedHandler = handler; + return JSON_Success; +} + +JSON_Parser_NullHandler JSON_CALL JSON_Parser_GetNullHandler(JSON_Parser parser) +{ + return parser ? parser->nullHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetNullHandler( + JSON_Parser parser, JSON_Parser_NullHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->nullHandler = handler; + return JSON_Success; +} + +JSON_Parser_BooleanHandler JSON_CALL JSON_Parser_GetBooleanHandler(JSON_Parser parser) +{ + return parser ? parser->booleanHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetBooleanHandler( + JSON_Parser parser, JSON_Parser_BooleanHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->booleanHandler = handler; + return JSON_Success; +} + +JSON_Parser_StringHandler JSON_CALL JSON_Parser_GetStringHandler(JSON_Parser parser) +{ + return parser ? parser->stringHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetStringHandler( + JSON_Parser parser, JSON_Parser_StringHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->stringHandler = handler; + return JSON_Success; +} + +JSON_Parser_NumberHandler JSON_CALL JSON_Parser_GetNumberHandler(JSON_Parser parser) +{ + return parser ? parser->numberHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetNumberHandler( + JSON_Parser parser, JSON_Parser_NumberHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->numberHandler = handler; + return JSON_Success; +} + +JSON_Parser_SpecialNumberHandler JSON_CALL JSON_Parser_GetSpecialNumberHandler(JSON_Parser parser) +{ + return parser ? parser->specialNumberHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetSpecialNumberHandler( + JSON_Parser parser, JSON_Parser_SpecialNumberHandler handler) +{ + if (!parser) + return JSON_Failure; + parser->specialNumberHandler = handler; + return JSON_Success; +} + +JSON_Parser_StartObjectHandler JSON_CALL JSON_Parser_GetStartObjectHandler(JSON_Parser parser) +{ + return parser ? parser->startObjectHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetStartObjectHandler( + JSON_Parser parser, JSON_Parser_StartObjectHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->startObjectHandler = handler; + return JSON_Success; +} + +JSON_Parser_EndObjectHandler JSON_CALL JSON_Parser_GetEndObjectHandler(JSON_Parser parser) +{ + return parser ? parser->endObjectHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetEndObjectHandler( + JSON_Parser parser, JSON_Parser_EndObjectHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->endObjectHandler = handler; + return JSON_Success; +} + +JSON_Parser_ObjectMemberHandler JSON_CALL JSON_Parser_GetObjectMemberHandler(JSON_Parser parser) +{ + return parser ? parser->objectMemberHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetObjectMemberHandler( + JSON_Parser parser, JSON_Parser_ObjectMemberHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->objectMemberHandler = handler; + return JSON_Success; +} + +JSON_Parser_StartArrayHandler JSON_CALL JSON_Parser_GetStartArrayHandler(JSON_Parser parser) +{ + return parser ? parser->startArrayHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetStartArrayHandler( + JSON_Parser parser, JSON_Parser_StartArrayHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->startArrayHandler = handler; + return JSON_Success; +} + +JSON_Parser_EndArrayHandler JSON_CALL JSON_Parser_GetEndArrayHandler(JSON_Parser parser) +{ + return parser ? parser->endArrayHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetEndArrayHandler( + JSON_Parser parser, JSON_Parser_EndArrayHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->endArrayHandler = handler; + return JSON_Success; +} + +JSON_Parser_ArrayItemHandler JSON_CALL JSON_Parser_GetArrayItemHandler(JSON_Parser parser) +{ + return parser ? parser->arrayItemHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Parser_SetArrayItemHandler( + JSON_Parser parser, JSON_Parser_ArrayItemHandler handler) +{ + if (!parser) + return JSON_Failure; + + parser->arrayItemHandler = handler; + return JSON_Success; +} + +JSON_Status JSON_CALL JSON_Parser_Parse(JSON_Parser parser, const char* pBytes, size_t length, JSON_Boolean isFinal) +{ + JSON_Status status = JSON_Failure; + if (parser && (pBytes || !length) && !GET_FLAGS(parser->state, PARSER_FINISHED | PARSER_IN_PROTECTED_API)) + { + int finishedParsing = 0; + SET_FLAGS_ON(ParserState, parser->state, PARSER_STARTED | PARSER_IN_PROTECTED_API); + if (JSON_Parser_ProcessInputBytes(parser, (const byte*)pBytes, length)) + { + /* New input was parsed successfully. */ + if (isFinal) + { + /* Make sure there is nothing pending in the decoder, lexer, + or parser. */ + if (JSON_Parser_FlushDecoder(parser) && + JSON_Parser_FlushLexer(parser) && + JSON_Parser_FlushParser(parser)) + status = JSON_Success; + + finishedParsing = 1; + } + else + status = JSON_Success; + } + else + { + /* New input failed to parse. */ + finishedParsing = 1; + } + if (finishedParsing) + { + SET_FLAGS_ON(ParserState, parser->state, PARSER_FINISHED); + } + SET_FLAGS_OFF(ParserState, parser->state, PARSER_IN_PROTECTED_API); + } + return status; +} + +#endif /* JSON_NO_PARSER */ + +/******************** JSON Writer ********************/ + +#ifndef JSON_NO_WRITER + +/* Combinable writer state flags. */ +#define WRITER_RESET 0x0 +#define WRITER_STARTED 0x1 +#define WRITER_IN_PROTECTED_API 0x2 +typedef byte WriterState; + +/* Combinable writer settings flags. */ +#define WRITER_DEFAULT_FLAGS 0x0 +#define WRITER_USE_CRLF 0x1 +#define WRITER_REPLACE_INVALID 0x2 +#define WRITER_ESCAPE_NON_ASCII 0x4 +typedef byte WriterFlags; + +/* A writer instance. */ +struct JSON_Writer_Data +{ + JSON_MemorySuite memorySuite; + void* userData; + WriterState state; + WriterFlags flags; + Encoding outputEncoding; + Error error; + GrammarianData grammarianData; + JSON_Writer_OutputHandler outputHandler; +}; + +/* Writer internal functions. */ + +static void JSON_Writer_ResetData(JSON_Writer writer, int isInitialized) +{ + writer->userData = NULL; + writer->flags = WRITER_DEFAULT_FLAGS; + writer->outputEncoding = JSON_UTF8; + writer->error = JSON_Error_None; + Grammarian_Reset(&writer->grammarianData, isInitialized); + writer->outputHandler = NULL; + writer->state = WRITER_RESET; /* do this last! */ +} + +static void JSON_Writer_SetError(JSON_Writer writer, Error error) +{ + writer->error = error; +} + +static JSON_Status JSON_Writer_ProcessToken(JSON_Writer writer, Symbol token) +{ + GrammarianOutput output = Grammarian_ProcessToken(&writer->grammarianData, token, &writer->memorySuite); + switch (GRAMMARIAN_RESULT_CODE(output)) + { + case REJECTED_TOKEN: + JSON_Writer_SetError(writer, JSON_Error_UnexpectedToken); + return JSON_Failure; + + case SYMBOL_STACK_FULL: + JSON_Writer_SetError(writer, JSON_Error_OutOfMemory); + return JSON_Failure; + } + return JSON_Success; +} + +static JSON_Status JSON_Writer_OutputBytes(JSON_Writer writer, const byte* pBytes, size_t length) +{ + if (writer->outputHandler && length) + { + if (writer->outputHandler(writer, (const char*)pBytes, length) != JSON_Writer_Continue) + { + JSON_Writer_SetError(writer, JSON_Error_AbortedByHandler); + return JSON_Failure; + } + } + return JSON_Success; +} + +static Codepoint JSON_Writer_GetCodepointEscapeCharacter(JSON_Writer writer, Codepoint c) +{ + switch (c) + { + case BACKSPACE_CODEPOINT: + return 'b'; + + case TAB_CODEPOINT: + return 't'; + + case LINE_FEED_CODEPOINT: + return 'n'; + + case FORM_FEED_CODEPOINT: + return 'f'; + + case CARRIAGE_RETURN_CODEPOINT: + return 'r'; + + case '"': + return '"'; + /* Don't escape forward slashes */ + /*case '/': + return '/';*/ + + case '\\': + return '\\'; + + case DELETE_CODEPOINT: + case LINE_SEPARATOR_CODEPOINT: + case PARAGRAPH_SEPARATOR_CODEPOINT: + return 'u'; + + default: + if (c < FIRST_NON_CONTROL_CODEPOINT || IS_NONCHARACTER(c) || + (GET_FLAGS(writer->flags, WRITER_ESCAPE_NON_ASCII) && c > FIRST_NON_ASCII_CODEPOINT)) + return 'u'; + break; + } + return 0; +} + +typedef struct tag_WriteBufferData +{ + size_t used; + byte bytes[256]; +} WriteBufferData; +typedef WriteBufferData* WriteBuffer; + +static void WriteBuffer_Reset(WriteBuffer buffer) +{ + buffer->used = 0; +} + +static JSON_Status WriteBuffer_Flush(WriteBuffer buffer, JSON_Writer writer) +{ + JSON_Status status = JSON_Writer_OutputBytes(writer, buffer->bytes, buffer->used); + buffer->used = 0; + return status; +} + +static JSON_Status WriteBuffer_WriteBytes(WriteBuffer buffer, JSON_Writer writer, const byte* pBytes, size_t length) +{ + if (buffer->used + length > sizeof(buffer->bytes) && + !WriteBuffer_Flush(buffer, writer)) + return JSON_Failure; + + memcpy(&buffer->bytes[buffer->used], pBytes, length); + buffer->used += length; + return JSON_Success; +} + +static JSON_Status WriteBuffer_WriteCodepoint(WriteBuffer buffer, JSON_Writer writer, Codepoint c) +{ + if (buffer->used + LONGEST_ENCODING_SEQUENCE > sizeof(buffer->bytes) && + !WriteBuffer_Flush(buffer, writer)) + return JSON_Failure; + + buffer->used += EncodeCodepoint(c, writer->outputEncoding, &buffer->bytes[buffer->used]); + return JSON_Success; +} + +static JSON_Status WriteBuffer_WriteHexEscapeSequence(WriteBuffer buffer, JSON_Writer writer, Codepoint c) +{ + if (c >= FIRST_NON_BMP_CODEPOINT) + { + /* Non-BMP codepoints must be hex-escaped by escaping the UTF-16 + surrogate pair for the codepoint. We put the leading surrogate + in the low 16 bits of c so that it gets written first, then + the second pass through the loop will write out the trailing + surrogate. x*/ + c = SURROGATES_FROM_CODEPOINT(c); + c = (c << 16) | (c >> 16); + } + do + { + static const byte hexDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + byte escapeSequence[6]; + int i; + escapeSequence[0] = '\\'; + escapeSequence[1] = 'u'; + escapeSequence[2] = hexDigits[(c >> 12) & 0xF]; + escapeSequence[3] = hexDigits[(c >> 8) & 0xF]; + escapeSequence[4] = hexDigits[(c >> 4) & 0xF]; + escapeSequence[5] = hexDigits[c & 0xF]; + for (i = 0; i < sizeof(escapeSequence); i++) + { + if (!WriteBuffer_WriteCodepoint(buffer, writer, escapeSequence[i])) + return JSON_Failure; + } + c >>= 16; + } while (c); + return JSON_Success; +} + +static JSON_Status JSON_Writer_OutputString(JSON_Writer writer, const byte* pBytes, size_t length, Encoding encoding) +{ + static const byte quoteUTF[] = { 0, 0, 0, '"', 0, 0, 0 }; + static const byte* const quoteEncodings[5] = { quoteUTF + 3, quoteUTF + 3, quoteUTF + 2, quoteUTF + 3, quoteUTF }; + + const byte* pQuoteEncoded = quoteEncodings[writer->outputEncoding - 1]; + size_t minSequenceLength = (size_t)SHORTEST_ENCODING_SEQUENCE(writer->outputEncoding); + DecoderData decoderData; + WriteBufferData bufferData; + size_t i = 0; + + WriteBuffer_Reset(&bufferData); + + /* Start quote. */ + if (!WriteBuffer_WriteBytes(&bufferData, writer, pQuoteEncoded, minSequenceLength)) + return JSON_Failure; + + /* String contents. */ + Decoder_Reset(&decoderData); + while (i < length) + { + DecoderOutput output = Decoder_ProcessByte(&decoderData, encoding, pBytes[i]); + DecoderResultCode result = DECODER_RESULT_CODE(output); + Codepoint c; + Codepoint escapeCharacter; + switch (result) + { + case SEQUENCE_PENDING: + i++; + break; + + case SEQUENCE_COMPLETE: + c = DECODER_CODEPOINT(output); + escapeCharacter = JSON_Writer_GetCodepointEscapeCharacter(writer, c); + switch (escapeCharacter) + { + case 0: + /* Output the codepoint as a normal encoding sequence. */ + if (!WriteBuffer_WriteCodepoint(&bufferData, writer, c)) + return JSON_Failure; + break; + + case 'u': + /* Output the codepoint as 1 or 2 hex escape sequences. */ + if (!WriteBuffer_WriteHexEscapeSequence(&bufferData, writer, c)) + return JSON_Failure; + break; + + default: + /* Output the codepoint as a simple escape sequence. */ + if (!WriteBuffer_WriteCodepoint(&bufferData, writer, '\\') || + !WriteBuffer_WriteCodepoint(&bufferData, writer, escapeCharacter)) + return JSON_Failure; + break; + } + i++; + break; + + case SEQUENCE_INVALID_INCLUSIVE: + i++; + /* fallthrough */ + case SEQUENCE_INVALID_EXCLUSIVE: + if (GET_FLAGS(writer->flags, WRITER_REPLACE_INVALID)) + { + if (!WriteBuffer_WriteHexEscapeSequence(&bufferData, writer, REPLACEMENT_CHARACTER_CODEPOINT)) + return JSON_Failure; + } + else + { + /* Output whatever valid bytes we've accumulated before failing. */ + if (WriteBuffer_Flush(&bufferData, writer)) + JSON_Writer_SetError(writer, JSON_Error_InvalidEncodingSequence); + return JSON_Failure; + } + break; + } + } + if (Decoder_SequencePending(&decoderData)) + { + if (GET_FLAGS(writer->flags, WRITER_REPLACE_INVALID)) + { + if (!WriteBuffer_WriteHexEscapeSequence(&bufferData, writer, REPLACEMENT_CHARACTER_CODEPOINT)) + return JSON_Failure; + } + else + { + /* Output whatever valid bytes we've accumulated before failing. */ + if (WriteBuffer_Flush(&bufferData, writer)) + JSON_Writer_SetError(writer, JSON_Error_InvalidEncodingSequence); + return JSON_Failure; + } + } + + /* End quote. */ + if (!WriteBuffer_WriteBytes(&bufferData, writer, pQuoteEncoded, minSequenceLength) || + !WriteBuffer_Flush(&bufferData, writer)) + return JSON_Failure; + return JSON_Success; +} + +static LexerState LexNumberCharacter(LexerState state, Codepoint c) +{ + switch (state) + { + case LEXING_WHITESPACE: + if (c == '-') + state = LEXING_NUMBER_AFTER_MINUS; + else if (c == '0') + state = LEXING_NUMBER_AFTER_LEADING_ZERO; + else if (c >= '1' && c <= '9') + state = LEXING_NUMBER_DECIMAL_DIGITS; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_AFTER_MINUS: + if (c == '0') + state = LEXING_NUMBER_AFTER_LEADING_NEGATIVE_ZERO; + else if (c >= '1' && c <= '9') + state = LEXING_NUMBER_DECIMAL_DIGITS; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_AFTER_LEADING_ZERO: + case LEXING_NUMBER_AFTER_LEADING_NEGATIVE_ZERO: + if (c == '.') + state = LEXING_NUMBER_AFTER_DOT; + else if (c == 'e' || c == 'E') + state = LEXING_NUMBER_AFTER_E; + else if ((c == 'x' || c == 'X') && state == LEXING_NUMBER_AFTER_LEADING_ZERO) + state = LEXING_NUMBER_AFTER_X; + else if (c == EOF_CODEPOINT) + state = LEXING_WHITESPACE; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_AFTER_X: + if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) + state = LEXING_NUMBER_HEX_DIGITS; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_HEX_DIGITS: + if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) + { + /* Still LEXING_NUMBER_HEX_DIGITS. */ + } + else if (c == EOF_CODEPOINT) + state = LEXING_WHITESPACE; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_DECIMAL_DIGITS: + if (c >= '0' && c <= '9') + { + /* Still LEXING_NUMBER_DECIMAL_DIGITS. */ + } + else if (c == '.') + state = LEXING_NUMBER_AFTER_DOT; + else if (c == 'e' || c == 'E') + state = LEXING_NUMBER_AFTER_E; + else if (c == EOF_CODEPOINT) + state = LEXING_WHITESPACE; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_AFTER_DOT: + if (c >= '0' && c <= '9') + state = LEXING_NUMBER_FRACTIONAL_DIGITS; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_FRACTIONAL_DIGITS: + if (c >= '0' && c <= '9') + { + /* Still LEXING_NUMBER_FRACTIONAL_DIGITS. */ + } + else if (c == 'e' || c == 'E') + state = LEXING_NUMBER_AFTER_E; + else if (c == EOF_CODEPOINT) + state = LEXING_WHITESPACE; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_AFTER_E: + if (c == '+' || c == '-') + state = LEXING_NUMBER_AFTER_EXPONENT_SIGN; + else if (c >= '0' && c <= '9') + state = LEXING_NUMBER_EXPONENT_DIGITS; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_AFTER_EXPONENT_SIGN: + if (c >= '0' && c <= '9') + state = LEXING_NUMBER_EXPONENT_DIGITS; + else + state = LEXER_ERROR; + break; + + case LEXING_NUMBER_EXPONENT_DIGITS: + if (c >= '0' && c <= '9') + { + /* Still LEXING_NUMBER_EXPONENT_DIGITS. */ + } + else if (c == EOF_CODEPOINT) + state = LEXING_WHITESPACE; + else + state = LEXER_ERROR; + break; + } + return state; +} + +static JSON_Status JSON_Writer_OutputNumber(JSON_Writer writer, const byte* pBytes, size_t length, Encoding encoding) +{ + DecoderData decoderData; + WriteBufferData bufferData; + LexerState lexerState = LEXING_WHITESPACE; + size_t i; + Decoder_Reset(&decoderData); + WriteBuffer_Reset(&bufferData); + for (i = 0; i < length; i++) + { + DecoderOutput output = Decoder_ProcessByte(&decoderData, encoding, pBytes[i]); + DecoderResultCode result = DECODER_RESULT_CODE(output); + Codepoint c; + switch (result) + { + case SEQUENCE_PENDING: + break; + + case SEQUENCE_COMPLETE: + c = DECODER_CODEPOINT(output); + lexerState = LexNumberCharacter(lexerState, c); + if (lexerState == LEXER_ERROR) + { + /* Output whatever valid bytes we've accumulated before failing. */ + if (WriteBuffer_Flush(&bufferData, writer)) + JSON_Writer_SetError(writer, JSON_Error_InvalidNumber); + return JSON_Failure; + } + if (!WriteBuffer_WriteCodepoint(&bufferData, writer, c)) + return JSON_Failure; + break; + + case SEQUENCE_INVALID_INCLUSIVE: + case SEQUENCE_INVALID_EXCLUSIVE: + /* Output whatever valid bytes we've accumulated before failing. */ + if (WriteBuffer_Flush(&bufferData, writer)) + JSON_Writer_SetError(writer, JSON_Error_InvalidEncodingSequence); + return JSON_Failure; + } + } + if (!WriteBuffer_Flush(&bufferData, writer)) + return JSON_Failure; + if (Decoder_SequencePending(&decoderData)) + { + JSON_Writer_SetError(writer, JSON_Error_InvalidEncodingSequence); + return JSON_Failure; + } + if (LexNumberCharacter(lexerState, EOF_CODEPOINT) == LEXER_ERROR) + { + JSON_Writer_SetError(writer, JSON_Error_InvalidNumber); + return JSON_Failure; + } + return JSON_Success; +} + +#define SPACES_PER_CHUNK 8 +static JSON_Status JSON_Writer_OutputSpaces(JSON_Writer writer, size_t numberOfSpaces) +{ + static const byte spacesUTF8[SPACES_PER_CHUNK] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }; + static const byte spacesUTF16[SPACES_PER_CHUNK * 2 + 1] = { 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0 }; + static const byte spacesUTF32[SPACES_PER_CHUNK * 4 + 3] = { 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0, ' ', 0, 0, 0 }; + static const byte* const spacesEncodings[5] = { spacesUTF8, spacesUTF16 + 1, spacesUTF16, spacesUTF32 + 3, spacesUTF32 }; + + size_t encodedLength = (size_t)SHORTEST_ENCODING_SEQUENCE(writer->outputEncoding); + const byte* encoded = spacesEncodings[writer->outputEncoding - 1]; + while (numberOfSpaces > SPACES_PER_CHUNK) + { + if (!JSON_Writer_OutputBytes(writer, encoded, SPACES_PER_CHUNK * encodedLength)) + return JSON_Failure; + numberOfSpaces -= SPACES_PER_CHUNK; + } + + if (!JSON_Writer_OutputBytes(writer, encoded, numberOfSpaces * encodedLength)) + return JSON_Failure; + return JSON_Success; +} + +static JSON_Status JSON_Writer_WriteSimpleToken(JSON_Writer writer, Symbol token, const byte* const* encodings, size_t length) +{ + JSON_Status status = JSON_Failure; + if (writer && !GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API) && writer->error == JSON_Error_None) + { + size_t encodedLength = length * (size_t)SHORTEST_ENCODING_SEQUENCE(writer->outputEncoding); + SET_FLAGS_ON(WriterState, writer->state, WRITER_STARTED | WRITER_IN_PROTECTED_API); + if (JSON_Writer_ProcessToken(writer, token) && + JSON_Writer_OutputBytes(writer, encodings[writer->outputEncoding - 1], encodedLength)) + status = JSON_Success; + SET_FLAGS_OFF(WriterState, writer->state, WRITER_IN_PROTECTED_API); + } + return status; +} + +/* Writer API functions. */ + +JSON_Writer JSON_CALL JSON_Writer_Create(const JSON_MemorySuite* pMemorySuite) +{ + JSON_Writer writer; + JSON_MemorySuite memorySuite; + if (pMemorySuite) + { + memorySuite = *pMemorySuite; + /* The full memory suite must be specified. */ + if (!memorySuite.realloc || !memorySuite.free) + return NULL; + } + else + memorySuite = defaultMemorySuite; + + writer = (JSON_Writer)memorySuite.realloc(memorySuite.userData, NULL, sizeof(struct JSON_Writer_Data)); + + if (!writer) + return NULL; + + writer->memorySuite = memorySuite; + JSON_Writer_ResetData(writer, 0/* isInitialized */); + return writer; +} + +JSON_Status JSON_CALL JSON_Writer_Free(JSON_Writer writer) +{ + if (!writer || GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API)) + return JSON_Failure; + + SET_FLAGS_ON(WriterState, writer->state, WRITER_IN_PROTECTED_API); + Grammarian_FreeAllocations(&writer->grammarianData, &writer->memorySuite); + writer->memorySuite.free(writer->memorySuite.userData, writer); + return JSON_Success; +} + +JSON_Status JSON_CALL JSON_Writer_Reset(JSON_Writer writer) +{ + if (!writer || GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API)) + return JSON_Failure; + + SET_FLAGS_ON(WriterState, writer->state, WRITER_IN_PROTECTED_API); + JSON_Writer_ResetData(writer, 1/* isInitialized */); + /* Note that JSON_Writer_ResetData() unset WRITER_IN_PROTECTED_API for us. */ + return JSON_Success; +} + +void* JSON_CALL JSON_Writer_GetUserData(JSON_Writer writer) +{ + return writer ? writer->userData : NULL; +} + +JSON_Status JSON_CALL JSON_Writer_SetUserData(JSON_Writer writer, void* userData) +{ + if (!writer) + return JSON_Failure; + + writer->userData = userData; + return JSON_Success; +} + +JSON_Encoding JSON_CALL JSON_Writer_GetOutputEncoding(JSON_Writer writer) +{ + return writer ? (JSON_Encoding)writer->outputEncoding : JSON_UTF8; +} + +JSON_Status JSON_CALL JSON_Writer_SetOutputEncoding(JSON_Writer writer, JSON_Encoding encoding) +{ + if (!writer || GET_FLAGS(writer->state, WRITER_STARTED) || encoding <= JSON_UnknownEncoding || encoding > JSON_UTF32BE) + return JSON_Failure; + + writer->outputEncoding = (Encoding)encoding; + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Writer_GetUseCRLF(JSON_Writer writer) +{ + return (writer && GET_FLAGS(writer->flags, WRITER_USE_CRLF)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Writer_SetUseCRLF(JSON_Writer writer, JSON_Boolean useCRLF) +{ + if (!writer || GET_FLAGS(writer->state, WRITER_STARTED)) + return JSON_Failure; + + SET_FLAGS(WriterFlags, writer->flags, WRITER_USE_CRLF, useCRLF); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Writer_GetReplaceInvalidEncodingSequences(JSON_Writer writer) +{ + return (writer && GET_FLAGS(writer->flags, WRITER_REPLACE_INVALID)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Writer_SetReplaceInvalidEncodingSequences(JSON_Writer writer, JSON_Boolean replaceInvalidEncodingSequences) +{ + if (!writer || GET_FLAGS(writer->state, WRITER_STARTED)) + return JSON_Failure; + + SET_FLAGS(WriterFlags, writer->flags, WRITER_REPLACE_INVALID, replaceInvalidEncodingSequences); + return JSON_Success; +} + +JSON_Boolean JSON_CALL JSON_Writer_GetEscapeAllNonASCIICharacters(JSON_Writer writer) +{ + return (writer && GET_FLAGS(writer->flags, WRITER_ESCAPE_NON_ASCII)) ? JSON_True : JSON_False; +} + +JSON_Status JSON_CALL JSON_Writer_SetEscapeAllNonASCIICharacters(JSON_Writer writer, JSON_Boolean escapeAllNonASCIICharacters) +{ + if (!writer || GET_FLAGS(writer->state, WRITER_STARTED)) + return JSON_Failure; + + SET_FLAGS(WriterFlags, writer->flags, WRITER_ESCAPE_NON_ASCII, escapeAllNonASCIICharacters); + return JSON_Success; +} + +JSON_Error JSON_CALL JSON_Writer_GetError(JSON_Writer writer) +{ + return writer ? (JSON_Error)writer->error : JSON_Error_None; +} + +JSON_Writer_OutputHandler JSON_CALL JSON_Writer_GetOutputHandler(JSON_Writer writer) +{ + return writer ? writer->outputHandler : NULL; +} + +JSON_Status JSON_CALL JSON_Writer_SetOutputHandler(JSON_Writer writer, JSON_Writer_OutputHandler handler) +{ + if (!writer) + return JSON_Failure; + + writer->outputHandler = handler; + return JSON_Success; +} + +JSON_Status JSON_CALL JSON_Writer_WriteNull(JSON_Writer writer) +{ + static const byte nullUTF8[] = { 'n', 'u', 'l', 'l' }; + static const byte nullUTF16[] = { 0, 'n', 0, 'u', 0, 'l', 0, 'l', 0 }; + static const byte nullUTF32[] = { 0, 0, 0, 'n', 0, 0, 0, 'u', 0, 0, 0, 'l', 0, 0, 0, 'l', 0, 0, 0 }; + static const byte* const nullEncodings[5] = { nullUTF8, nullUTF16 + 1, nullUTF16, nullUTF32 + 3, nullUTF32 }; + + return JSON_Writer_WriteSimpleToken(writer, T_NULL, nullEncodings, sizeof(nullUTF8)); +} + +JSON_Status JSON_CALL JSON_Writer_WriteBoolean(JSON_Writer writer, JSON_Boolean value) +{ + static const byte trueUTF8[] = { 't', 'r', 'u', 'e' }; + static const byte trueUTF16[] = { 0, 't', 0, 'r', 0, 'u', 0, 'e', 0 }; + static const byte trueUTF32[] = { 0, 0, 0, 't', 0, 0, 0, 'r', 0, 0, 0, 'u', 0, 0, 0, 'e', 0, 0, 0 }; + static const byte* const trueEncodings[5] = { trueUTF8, trueUTF16 + 1, trueUTF16, trueUTF32 + 3, trueUTF32 }; + + static const byte falseUTF8[] = { 'f', 'a', 'l', 's', 'e' }; + static const byte falseUTF16[] = { 0, 'f', 0, 'a', 0, 'l', 0, 's', 0, 'e', 0 }; + static const byte falseUTF32[] = { 0, 0, 0, 'f', 0, 0, 0, 'a', 0, 0, 0, 'l', 0, 0, 0, 's', 0, 0, 0, 'e', 0, 0, 0 }; + static const byte* const falseEncodings[5] = { falseUTF8, falseUTF16 + 1, falseUTF16, falseUTF32 + 3, falseUTF32 }; + + Symbol token; + const byte* const* encodings; + size_t length; + if (value) + { + token = T_TRUE; + encodings = trueEncodings; + length = sizeof(trueUTF8); + } + else + { + token = T_FALSE; + encodings = falseEncodings; + length = sizeof(falseUTF8); + } + return JSON_Writer_WriteSimpleToken(writer, token, encodings, length); +} + +JSON_Status JSON_CALL JSON_Writer_WriteString(JSON_Writer writer, const char* pValue, size_t length, JSON_Encoding encoding) +{ + JSON_Status status = JSON_Failure; + if (writer && (pValue || !length) && encoding > JSON_UnknownEncoding && encoding <= JSON_UTF32BE && + !GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API) && writer->error == JSON_Error_None) + { + SET_FLAGS_ON(WriterState, writer->state, WRITER_STARTED | WRITER_IN_PROTECTED_API); + if (JSON_Writer_ProcessToken(writer, T_STRING)) + status = JSON_Writer_OutputString(writer, (const byte*)pValue, length, (Encoding)encoding); + + SET_FLAGS_OFF(WriterState, writer->state, WRITER_IN_PROTECTED_API); + } + return status; +} + +JSON_Status JSON_CALL JSON_Writer_WriteNumber(JSON_Writer writer, const char* pValue, size_t length, JSON_Encoding encoding) +{ + JSON_Status status = JSON_Failure; + if (writer && pValue && length && encoding > JSON_UnknownEncoding && encoding <= JSON_UTF32BE && + !GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API) && writer->error == JSON_Error_None) + { + SET_FLAGS_ON(WriterState, writer->state, WRITER_STARTED | WRITER_IN_PROTECTED_API); + if (JSON_Writer_ProcessToken(writer, T_NUMBER)) + status = JSON_Writer_OutputNumber(writer, (const byte*)pValue, length, (Encoding)encoding); + + SET_FLAGS_OFF(WriterState, writer->state, WRITER_IN_PROTECTED_API); + } + return status; +} + +JSON_Status JSON_CALL JSON_Writer_WriteSpecialNumber(JSON_Writer writer, JSON_SpecialNumber value) +{ + static const byte nanUTF8[] = { 'N', 'a', 'N' }; + static const byte nanUTF16[] = { 0, 'N', 0, 'a', 0, 'N', 0 }; + static const byte nanUTF32[] = { 0, 0, 0, 'N', 0, 0, 0, 'a', 0, 0, 0, 'N', 0, 0, 0 }; + static const byte* const nanEncodings[5] = { nanUTF8, nanUTF16 + 1, nanUTF16, nanUTF32 + 3, nanUTF32 }; + + static const byte ninfUTF8[] = { '-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y' }; + static const byte ninfUTF16[] = { 0, '-', 0, 'I', 0, 'n', 0, 'f', 0, 'i', 0, 'n', 0, 'i', 0, 't', 0, 'y', 0 }; + static const byte ninfUTF32[] = { 0, 0, 0, '-', 0, 0, 0, 'I', 0, 0, 0, 'n', 0, 0, 0, 'f', 0, 0, 0, 'i', 0, 0, 0, 'n', 0, 0, 0, 'i', 0, 0, 0, 't', 0, 0, 0, 'y', 0, 0, 0 }; + static const byte* const infinityEncodings[5] = { ninfUTF8 + 1, ninfUTF16 + 3, ninfUTF16 + 2, ninfUTF32 + 7, ninfUTF32 + 4 }; + static const byte* const negativeInfinityEncodings[5] = { ninfUTF8, ninfUTF16 + 1, ninfUTF16, ninfUTF32 + 3, ninfUTF32 }; + + Symbol token; + const byte* const* encodings; + size_t length; + if (value == JSON_Infinity) + { + token = T_INFINITY; + encodings = infinityEncodings; + length = sizeof(ninfUTF8) - 1/* - */; + } + else if (value == JSON_NegativeInfinity) + { + token = T_NEGATIVE_INFINITY; + encodings = negativeInfinityEncodings; + length = sizeof(ninfUTF8); + } + else + { + token = T_NAN; + encodings = nanEncodings; + length = sizeof(nanUTF8); + } + return JSON_Writer_WriteSimpleToken(writer, token, encodings, length); +} + +JSON_Status JSON_CALL JSON_Writer_WriteStartObject(JSON_Writer writer) +{ + static const byte utf[] = { 0, 0, 0, '{', 0, 0, 0 }; + static const byte* const encodings[5] = { utf + 3, utf + 3, utf + 2, utf + 3, utf }; + + return JSON_Writer_WriteSimpleToken(writer, T_LEFT_CURLY, encodings, 1); +} + +JSON_Status JSON_CALL JSON_Writer_WriteEndObject(JSON_Writer writer) +{ + static const byte utf[] = { 0, 0, 0, '}', 0, 0, 0 }; + static const byte* const encodings[5] = { utf + 3, utf + 3, utf + 2, utf + 3, utf }; + + return JSON_Writer_WriteSimpleToken(writer, T_RIGHT_CURLY, encodings, 1); +} + +JSON_Status JSON_CALL JSON_Writer_WriteStartArray(JSON_Writer writer) +{ + static const byte utf[] = { 0, 0, 0, '[', 0, 0, 0 }; + static const byte* const encodings[5] = { utf + 3, utf + 3, utf + 2, utf + 3, utf }; + + return JSON_Writer_WriteSimpleToken(writer, T_LEFT_SQUARE, encodings, 1); +} + +JSON_Status JSON_CALL JSON_Writer_WriteEndArray(JSON_Writer writer) +{ + static const byte utf[] = { 0, 0, 0, ']', 0, 0, 0 }; + static const byte* const encodings[5] = { utf + 3, utf + 3, utf + 2, utf + 3, utf }; + + return JSON_Writer_WriteSimpleToken(writer, T_RIGHT_SQUARE, encodings, 1); +} + +JSON_Status JSON_CALL JSON_Writer_WriteColon(JSON_Writer writer) +{ + static const byte utf[] = { 0, 0, 0, ':', 0, 0, 0 }; + static const byte* const encodings[5] = { utf + 3, utf + 3, utf + 2, utf + 3, utf }; + + return JSON_Writer_WriteSimpleToken(writer, T_COLON, encodings, 1); +} + +JSON_Status JSON_CALL JSON_Writer_WriteComma(JSON_Writer writer) +{ + static const byte utf[] = { 0, 0, 0, ',', 0, 0, 0 }; + static const byte* const encodings[5] = { utf + 3, utf + 3, utf + 2, utf + 3, utf }; + + return JSON_Writer_WriteSimpleToken(writer, T_COMMA, encodings, 1); +} + +JSON_Status JSON_CALL JSON_Writer_WriteSpace(JSON_Writer writer, size_t numberOfSpaces) +{ + JSON_Status status = JSON_Failure; + if (writer && !GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API) && writer->error == JSON_Error_None) + { + SET_FLAGS_ON(WriterState, writer->state, WRITER_STARTED | WRITER_IN_PROTECTED_API); + status = JSON_Writer_OutputSpaces(writer, numberOfSpaces); + SET_FLAGS_OFF(WriterState, writer->state, WRITER_IN_PROTECTED_API); + } + return status; +} + +JSON_Status JSON_CALL JSON_Writer_WriteNewLine(JSON_Writer writer) +{ + static const byte lfUTF[] = { 0, 0, 0, LINE_FEED_CODEPOINT, 0, 0, 0 }; + static const byte* const lfEncodings[5] = { lfUTF + 3, lfUTF + 3, lfUTF + 2, lfUTF + 3, lfUTF }; + + static const byte crlfUTF8[] = { CARRIAGE_RETURN_CODEPOINT, LINE_FEED_CODEPOINT }; + static const byte crlfUTF16[] = { 0, CARRIAGE_RETURN_CODEPOINT, 0, LINE_FEED_CODEPOINT, 0 }; + static const byte crlfUTF32[] = { 0, 0, 0, CARRIAGE_RETURN_CODEPOINT, 0, 0, 0, LINE_FEED_CODEPOINT, 0, 0, 0 }; + static const byte* const crlfEncodings[5] = { crlfUTF8, crlfUTF16 + 1, crlfUTF16, crlfUTF32 + 3, crlfUTF32 }; + + JSON_Status status = JSON_Failure; + if (writer && !GET_FLAGS(writer->state, WRITER_IN_PROTECTED_API) && writer->error == JSON_Error_None) + { + const byte* const* encodings; + size_t length; + size_t encodedLength; + SET_FLAGS_ON(WriterState, writer->state, WRITER_STARTED | WRITER_IN_PROTECTED_API); + if (GET_FLAGS(writer->flags, WRITER_USE_CRLF)) + { + encodings = crlfEncodings; + length = 2; + } + else + { + encodings = lfEncodings; + length = 1; + } + encodedLength = length * (size_t)SHORTEST_ENCODING_SEQUENCE(writer->outputEncoding); + if (JSON_Writer_OutputBytes(writer, encodings[writer->outputEncoding - 1], encodedLength)) + status = JSON_Success; + SET_FLAGS_OFF(WriterState, writer->state, WRITER_IN_PROTECTED_API); + } + return status; +} + +#endif /* JSON_NO_WRITER */ + +/******************** Miscellaneous API ********************/ + +const JSON_Version* JSON_CALL JSON_LibraryVersion(void) +{ + static JSON_Version version = { JSON_MAJOR_VERSION, JSON_MINOR_VERSION, JSON_MICRO_VERSION }; + return &version; +} + +const char* JSON_CALL JSON_ErrorString(JSON_Error error) +{ + /* This array must match the order and number of the JSON_Error enum. */ + static const char* errorStrings[] = + { + /* JSON_Error_None */ "no error", + /* JSON_Error_OutOfMemory */ "could not allocate enough memory", + /* JSON_Error_AbortedByHandler */ "the operation was aborted by a handler", + /* JSON_Error_BOMNotAllowed */ "the input begins with a byte-order mark (BOM), which is not allowed by RFC 4627", + /* JSON_Error_InvalidEncodingSequence */ "the input contains a byte or sequence of bytes that is not valid for the input encoding", + /* JSON_Error_UnknownToken */ "the input contains an unknown token", + /* JSON_Error_UnexpectedToken */ "the input contains an unexpected token", + /* JSON_Error_IncompleteToken */ "the input ends in the middle of a token", + /* JSON_Error_MoreTokensExpected */ "the input ends when more tokens are expected", + /* JSON_Error_UnescapedControlCharacter */ "the input contains a string containing an unescaped control character (U+0000 - U+001F)", + /* JSON_Error_InvalidEscapeSequence */ "the input contains a string containing an invalid escape sequence", + /* JSON_Error_UnpairedSurrogateEscapeSequence */ "the input contains a string containing an unmatched UTF-16 surrogate codepoint", + /* JSON_Error_TooLongString */ "the input contains a string that is too long", + /* JSON_Error_InvalidNumber */ "the input contains an invalid number", + /* JSON_Error_TooLongNumber */ "the input contains a number that is too long", + /* JSON_Error_DuplicateObjectMember */ "the input contains an object with duplicate members", + /* JSON_Error_StoppedAfterEmbeddedDocument */ "the end of the embedded document was reached" + }; + return ((unsigned int)error < (sizeof(errorStrings) / sizeof(errorStrings[0]))) + ? errorStrings[error] + : ""; +} + +static const uint32_t endianEncodings = (((uint32_t)JSON_UTF32BE) << 24) | (((uint32_t)JSON_UTF16BE) << 16) | (((uint32_t)JSON_UTF16LE) << 8) | ((uint32_t)JSON_UTF32LE); + +JSON_Encoding JSON_CALL JSON_NativeUTF16Encoding(void) +{ + return (JSON_Encoding)(((byte*)&endianEncodings)[1]); +} + +JSON_Encoding JSON_CALL JSON_NativeUTF32Encoding(void) +{ + return (JSON_Encoding)(((byte*)&endianEncodings)[0]); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/json/rjson.c
Added
@@ -0,0 +1,1447 @@ +/* Copyright (C) 2010-2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rjson.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* The parser is based on Public Domain JSON Parser for C by Christopher Wellons - https://github.com/skeeto/pdjson */ + +#include <stdio.h> /* snprintf, vsnprintf */ +#include <stdarg.h> /* va_list */ +#include <string.h> /* memcpy, strlen */ +#include <stdint.h> /* int64_t */ +#include <stdlib.h> /* malloc, realloc, atof, atoi */ + +#include <formats/rjson.h> +#include <compat/posix_string.h> +#include <streams/interface_stream.h> +#include <streams/file_stream.h> + +struct _rjson_stack { enum rjson_type type; size_t count; }; + +struct rjson +{ + /* Order of the top few struct elements have an impact on performance */ + /* Place most frequently accessed things on top */ + const unsigned char *input_p; + struct _rjson_stack *stack_top; + const unsigned char *input_end; + const unsigned char* source_column_p; + size_t source_line; + + char *string, *string_pass_through; + size_t string_len, string_cap; + + struct _rjson_stack inline_stack[10]; + struct _rjson_stack *stack; + + rjson_io_t io; + void *user_data; + + unsigned int stack_cap, stack_max; + int input_len; + + char option_flags; + char decimal_sep; + char error_text[80]; + char inline_string[512]; + + /* Must be at the end of the struct, can be allocated with custom size */ + unsigned char input_buf[512]; +}; + +enum _rjson_token +{ + _rJSON_TOK_WHITESPACE, _rJSON_TOK_NEWLINE, _rJSON_TOK_OPTIONAL_SKIP, + _rJSON_TOK_OBJECT, _rJSON_TOK_ARRAY, _rJSON_TOK_STRING, _rJSON_TOK_NUMBER, + _rJSON_TOK_TRUE, _rJSON_TOK_FALSE, _rJSON_TOK_NULL, + _rJSON_TOK_OBJECT_END, _rJSON_TOK_ARRAY_END, _rJSON_TOK_COLON, + _rJSON_TOK_COMMA, _rJSON_TOK_ERROR, _rJSON_TOK_EOF, _rJSON_TOKCOUNT +}; + +/* The used char type is int and not short for better performance */ +typedef unsigned int _rjson_char_t; +#define _rJSON_EOF ((_rjson_char_t)256) + +/* Compiler branching hint for expression with high probability + * Explicitly only have likely (and no unlikely) because compilers + * that don't support it expect likely branches to come first. */ +#if defined(__GNUC__) || defined(__clang__) +#define _rJSON_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define _rJSON_LIKELY(x) (x) +#endif + +/* These 3 error functions return RJSON_ERROR for convenience */ +static enum rjson_type _rjson_error(rjson_t *json, const char *fmt, ...) +{ + va_list ap; + if (json->stack_top->type == RJSON_ERROR) return RJSON_ERROR; + json->stack_top->type = RJSON_ERROR; + va_start(ap, fmt); + vsnprintf(json->error_text, sizeof(json->error_text), fmt, ap); + va_end(ap); + return RJSON_ERROR; +} + +static enum rjson_type _rjson_error_char(rjson_t *json, + const char *fmt, _rjson_char_t chr) +{ + char buf[16]; + if (json->stack_top->type == RJSON_ERROR) return RJSON_ERROR; + snprintf(buf, sizeof(buf), + (chr == _rJSON_EOF ? "end of stream" : + (chr >= ' ' && chr <= '~' ? "'%c'" : "byte 0x%02X")), chr); + return _rjson_error(json, fmt, buf); +} + +static enum rjson_type _rjson_error_token(rjson_t *json, + const char *fmt, enum _rjson_token tok) +{ + return _rjson_error_char(json, fmt, + (tok == _rJSON_TOK_EOF ? _rJSON_EOF : json->input_p[-1])); +} + +static bool _rjson_io_input(rjson_t *json) +{ + if (json->input_end == json->input_buf) return false; + json->source_column_p -= (json->input_end - json->input_buf); + json->input_p = json->input_buf; + json->input_end = json->input_buf + + json->io(json->input_buf, json->input_len, json->user_data); + if (json->input_end < json->input_buf) + { + _rjson_error(json, "input stream read error"); + json->input_end = json->input_buf; + } + return (json->input_end != json->input_p); +} + +static bool _rjson_grow_string(rjson_t *json) +{ + char *string; + size_t new_string_cap = json->string_cap * 2; + if (json->string != json->inline_string) + string = (char*)realloc(json->string, new_string_cap); + else if ((string = (char*)malloc(new_string_cap)) != NULL) + memcpy(string, json->inline_string, sizeof(json->inline_string)); + if (string == NULL) + { + _rjson_error(json, "out of memory"); + return false; + } + json->string_cap = new_string_cap; + json->string = string; + return true; +} + +static INLINE bool _rjson_pushchar(rjson_t *json, _rjson_char_t c) +{ + json->string[json->string_len++] = (char)c; + return (json->string_len != json->string_cap || _rjson_grow_string(json)); +} + +static INLINE bool _rjson_pushchars(rjson_t *json, + const unsigned char *from, const unsigned char *to) +{ + size_t len = json->string_len, new_len = len + (to - from); + unsigned char* string; + while (new_len >= json->string_cap) + if (!_rjson_grow_string(json)) + return false; + string = (unsigned char *)json->string; + while (len != new_len) string[len++] = *(from++); + json->string_len = new_len; + return true; +} + +static INLINE _rjson_char_t _rjson_char_get(rjson_t *json) +{ + return (json->input_p != json->input_end || _rjson_io_input(json) + ? *json->input_p++ : _rJSON_EOF); +} + +static unsigned int _rjson_get_unicode_cp(rjson_t *json) +{ + unsigned int cp = 0, shift = 16; + for (;;) + { + _rjson_char_t c = _rjson_char_get(json); + switch (c) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + c -= '0'; break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + c -= ('a' - 10); break; + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + c -= ('A' - 10); break; + case _rJSON_EOF: + _rjson_error(json, "unterminated string literal in Unicode"); + return (unsigned int)-1; + default: + _rjson_error_char(json, "invalid Unicode escape hexadecimal %s", c); + return (unsigned int)-1; + } + shift -= 4; + cp |= ((unsigned int)c << shift); + if (!shift) return cp; + } +} + +static bool _rjson_read_unicode(rjson_t *json) +{ + #define _rJSON_READ_UNICODE_REPLACE_OR_IGNORE \ + if (json->option_flags & (RJSON_OPTION_IGNORE_INVALID_ENCODING \ + | RJSON_OPTION_REPLACE_INVALID_ENCODING)) goto replace_or_ignore; + + unsigned int cp; + + if ((cp = _rjson_get_unicode_cp(json)) == (unsigned int)-1) + return false; + + if (cp >= 0xd800 && cp <= 0xdbff) + { + /* This is the high portion of a surrogate pair; we need to read the + * lower portion to get the codepoint */ + unsigned int l, h = cp; + + _rjson_char_t c = _rjson_char_get(json); + if (c == _rJSON_EOF) + { + _rjson_error(json, "unterminated string literal in Unicode"); + return false; + } + if (c != '\\') + { + _rjson_error_char(json, "invalid continuation %s" + " for surrogate pair, expected '\\'", c); + return false; + } + + c = _rjson_char_get(json); + if (c == _rJSON_EOF) + { + _rjson_error(json, "unterminated string literal in Unicode"); + return false; + } + if (c != 'u') + { + _rjson_error_char(json, "invalid continuation %s" + " for surrogate pair, expected 'u'", c); + return false; + } + if ((l = _rjson_get_unicode_cp(json)) == (unsigned int)-1) + return false; + if (l < 0xdc00 || l > 0xdfff) + { + _rJSON_READ_UNICODE_REPLACE_OR_IGNORE + _rjson_error(json, "surrogate pair continuation \\u%04x out " + "of range (dc00-dfff)", l); + return false; + } + cp = ((h - 0xd800) * 0x400) + ((l - 0xdc00) + 0x10000); + } + else if (cp >= 0xdc00 && cp <= 0xdfff) + { + _rJSON_READ_UNICODE_REPLACE_OR_IGNORE + _rjson_error(json, "dangling surrogate \\u%04x", cp); + return false; + } + + if (cp < 0x80UL) + return _rjson_pushchar(json, cp); + + if (cp < 0x0800UL) + return (_rjson_pushchar(json, (cp >> 6 & 0x1F) | 0xC0) && + _rjson_pushchar(json, (cp >> 0 & 0x3F) | 0x80)); + + if (cp < 0x010000UL) + { + if (cp >= 0xd800 && cp <= 0xdfff) + { + _rJSON_READ_UNICODE_REPLACE_OR_IGNORE + _rjson_error(json, "invalid codepoint %04x", cp); + return false; + } + return (_rjson_pushchar(json, (cp >> 12 & 0x0F) | 0xE0) && + _rjson_pushchar(json, (cp >> 6 & 0x3F) | 0x80) && + _rjson_pushchar(json, (cp >> 0 & 0x3F) | 0x80)); + } + if (cp < 0x110000UL) + return (_rjson_pushchar(json, (cp >> 18 & 0x07) | 0xF0) && + _rjson_pushchar(json, (cp >> 12 & 0x3F) | 0x80) && + _rjson_pushchar(json, (cp >> 6 & 0x3F) | 0x80) && + _rjson_pushchar(json, (cp >> 0 & 0x3F) | 0x80)); + + _rJSON_READ_UNICODE_REPLACE_OR_IGNORE + _rjson_error(json, "unable to encode %04x as UTF-8", cp); + return false; + replace_or_ignore: + return ((json->option_flags & RJSON_OPTION_IGNORE_INVALID_ENCODING) || + _rjson_pushchar(json, '?')); + #undef _rJSON_READ_UNICODE_REPLACE_OR_IGNORE +} + +static bool _rjson_validate_utf8(rjson_t *json) +{ + unsigned char first, c; + unsigned char *p; + unsigned char *from = (unsigned char *) + (json->string_pass_through ? json->string_pass_through : json->string); + unsigned char *to = from + json->string_len; + + if (json->option_flags & RJSON_OPTION_IGNORE_INVALID_ENCODING) + return true; + + for (;;) + { + if (from == to) return true; + first = *from; + if (first <= 0x7F) { from++; continue; } /* ascii */ + p = from; + if (first <= 0xC1) + { + /* continuation or overlong encoding of an ASCII byte */ + goto invalid_utf8; + } + if (first <= 0xDF) + { + if ((from = p + 2) > to) goto invalid_utf8; + continue_length_2: + c = p[1]; + switch (first) + { + case 0xE0: c = (c < 0xA0 || c > 0xBF); break; + case 0xED: c = (c < 0x80 || c > 0x9F); break; + case 0xF0: c = (c < 0x90 || c > 0xBF); break; + case 0xF4: c = (c < 0x80 || c > 0x8F); break; + default: c = (c < 0x80 || c > 0xBF); break; + } + if (c) goto invalid_utf8; + } + else if (first <= 0xEF) + { + if ((from = p + 3) > to) goto invalid_utf8; + continue_length_3: + if ((c = p[2]) < 0x80 || c > 0xBF) goto invalid_utf8; + goto continue_length_2; + } + else if (first <= 0xF4) + { + if ((from = p + 4) > to) goto invalid_utf8; + if ((c = p[3]) < 0x80 || c > 0xBF) goto invalid_utf8; + goto continue_length_3; + } + else goto invalid_utf8; /* length 5 or 6 or invalid UTF-8 */ + continue; + invalid_utf8: + if (!(json->option_flags & RJSON_OPTION_REPLACE_INVALID_ENCODING)) + { + _rjson_error(json, "invalid UTF-8 character in string"); + return false; + } + from = p; + *from++ = '?'; + while (from != to && (*from & 0x80)) *from++ = '?'; + } +} + +static enum rjson_type _rjson_read_string(rjson_t *json) +{ + const unsigned char *p = json->input_p, *raw = p; + const unsigned char *end = json->input_end; + unsigned char utf8mask = 0; + json->string_pass_through = NULL; + json->string_len = 0; + for (;;) + { + if (_rJSON_LIKELY(p != end)) + { + unsigned char c = *p; + if (_rJSON_LIKELY(c != '"' && c != '\\' && c >= 0x20)) + { + /* handle most common case first, it's faster */ + utf8mask |= c; + p++; + } + else if (c == '"') + { + json->input_p = p + 1; + if (json->string_len == 0 && p + 1 != end) + { + /* raw string fully inside input buffer, pass through */ + json->string_len = p - raw; + json->string_pass_through = (char*)raw; + } + else if (raw != p && !_rjson_pushchars(json, raw, p)) + { + /* out of memory */ + return RJSON_ERROR; + } + if ((utf8mask & 0x80) && !_rjson_validate_utf8(json)) + { + /* contains invalid UTF-8 byte sequences */ + return RJSON_ERROR; + } + return RJSON_STRING; + } + else if (c == '\\') + { + _rjson_char_t esc; + if (raw != p) + { + /* can't pass through string with escapes, use string buffer */ + if (!_rjson_pushchars(json, raw, p)) return RJSON_ERROR; + } + json->input_p = p + 1; + esc = _rjson_char_get(json); + switch (esc) + { + case 'u': + if (!_rjson_read_unicode(json)) + return RJSON_ERROR; + break; + + case 'b': esc = '\b'; goto escape_pushchar; + case 'f': esc = '\f'; goto escape_pushchar; + case 'n': esc = '\n'; goto escape_pushchar; + case 'r': + if (!(json->option_flags & RJSON_OPTION_IGNORE_STRING_CARRIAGE_RETURN)) + { + esc = '\r'; + goto escape_pushchar; + } + break; + case 't': esc = '\t'; goto escape_pushchar; + + case '/': case '"': case '\\': + escape_pushchar: + if (!_rjson_pushchar(json, esc)) + return RJSON_ERROR; + break; + + case _rJSON_EOF: + return _rjson_error(json, "unterminated string literal in escape"); + + default: + return _rjson_error_char(json, "invalid escaped %s", esc); + } + raw = p = json->input_p; + end = json->input_end; + } + else if (!(json->option_flags & RJSON_OPTION_ALLOW_UNESCAPED_CONTROL_CHARACTERS)) + return _rjson_error_char(json, "unescaped control character %s in string", c); + else + p++; + } + else + { + if (raw != p) + { + /* not fully inside input buffer, copy to string buffer */ + if (!_rjson_pushchars(json, raw, p)) return RJSON_ERROR; + } + if (!_rjson_io_input(json)) + return _rjson_error(json, "unterminated string literal"); + raw = p = json->input_p; + end = json->input_end; + } + } +} + +static enum rjson_type _rjson_read_number(rjson_t *json) +{ + const unsigned char *p = json->input_p - 1; + const unsigned char *end = json->input_end; + const unsigned char *start = p; + + json->string_len = 0; + json->string_pass_through = NULL; + for (;;) + { + if (_rJSON_LIKELY(p != end)) + { + switch (*p++) + { + case '+': case '-': case '.': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'E': case 'e': + continue; + } + p--; + json->input_p = p; + if (!_rjson_pushchars(json, start, p)) + return RJSON_ERROR; /* out of memory */ + break; + } + else + { + /* number sequences are always copied to the string buffer */ + if (!_rjson_pushchars(json, start, p)) return RJSON_ERROR; + if (!_rjson_io_input(json)) + { + /* EOF here is not an error for a number */ + json->input_p = json->input_end; + break; + } + start = p = json->input_p; + end = json->input_end; + } + } + + p = (const unsigned char *)json->string; + end = (p + json->string_len); + + /* validate json number */ + if (*p == '-' && ++p == end) goto invalid_number; + if (*p == '0') + { + if (++p == end) return RJSON_NUMBER; + } + else + { + if (*p < '1' || *p > '9') goto invalid_number; + do { if (++p == end) return RJSON_NUMBER; } + while (*p >= '0' && *p <= '9'); + } + if (*p == '.') + { + if (++p == end) goto invalid_number; + if (*p < '0' || *p > '9') goto invalid_number; + do { if (++p == end) return RJSON_NUMBER; } + while (*p >= '0' && *p <= '9'); + } + if (((*p)|0x20) == 'e') + { + if (++p == end) goto invalid_number; + if ((*p == '-' || *p == '+') && ++p == end) goto invalid_number; + if (*p < '0' || *p > '9') goto invalid_number; + do { if (++p == end) return RJSON_NUMBER; } + while (*p >= '0' && *p <= '9'); + } + invalid_number: + return _rjson_error_char(json, "unexpected %s in number", + (p == json->input_end ? _rJSON_EOF : p[p == end ? -1 : 0])); +} + +static enum rjson_type _rjson_push_stack(rjson_t *json, enum _rjson_token t) +{ + if (json->stack_top + 1 == json->stack + json->stack_cap) + { + /* reached allocated stack size, either reallocate or abort */ + unsigned int new_stack_cap; + struct _rjson_stack *new_stack; + size_t stack_alloc; + if (json->stack_cap == json->stack_max) + return _rjson_error(json, "maximum depth of nesting reached"); + + new_stack_cap = json->stack_cap + 4; + if (new_stack_cap > json->stack_max) + new_stack_cap = json->stack_max; + stack_alloc = new_stack_cap * sizeof(struct _rjson_stack); + if (json->stack != json->inline_stack) + new_stack = (struct _rjson_stack *)realloc(json->stack, stack_alloc); + else if ((new_stack = (struct _rjson_stack*)malloc(stack_alloc)) != NULL) + memcpy(new_stack, json->inline_stack, sizeof(json->inline_stack)); + if (new_stack == NULL) + return _rjson_error(json, "out of memory"); + + json->stack = new_stack; + json->stack_top = new_stack + json->stack_cap - 1; + json->stack_cap = new_stack_cap; + } + json->stack_top++; + json->stack_top->count = 0; + return (json->stack_top->type = + (t == _rJSON_TOK_ARRAY ? RJSON_ARRAY : RJSON_OBJECT)); +} + +static enum rjson_type _rjson_read_name(rjson_t *json, const char *pattern, enum rjson_type type) +{ + _rjson_char_t c; + const char *p; + for (p = pattern; *p; p++) + if ((_rjson_char_t)*p != (c = _rjson_char_get(json))) + return _rjson_error_char(json, "unexpected %s in value", c); + return type; +} + +static bool _rjson_optional_skip(rjson_t *json, const unsigned char **p, const unsigned char **end) +{ + unsigned char c, skip = (*p)[-1]; + int state = 0; + + if (skip == '/' && !(json->option_flags & RJSON_OPTION_ALLOW_COMMENTS)) + return false; + + if (skip == 0xEF && (!(json->option_flags & RJSON_OPTION_ALLOW_UTF8BOM) || + json->source_line != 1 || json->source_column_p != json->input_p)) + return false; + + for (;;) + { + if (*p == *end) + { + if (!_rjson_io_input(json)) + { + _rjson_error(json, "unfinished %s", + (skip == '/' ? "comment" : "utf8 byte order mark")); + return false; + } + *p = json->input_p; + *end = json->input_end; + } + c = *(*p)++; + if (skip == '/') + { + if (state == 0 && c == '/') state = 1; + else if (state == 0 && c == '*') state = 2; + else if (state == 0) return false; + else if (state == 1 && c == '\n') return true; + else if (state == 2 && c == '*') state = 3; + else if (state == 3 && c == '/') return true; + else if (state == 3 && c != '*') state = 2; + } + else if (skip == 0xEF) + { + if (state == 0 && c == 0xBB) state = 1; + else if (state == 1 && c == 0xBF) return true; + else return false; + } + } + return false; +} + +enum rjson_type rjson_next(rjson_t *json) +{ + struct _rjson_stack *stack = json->stack_top; + const unsigned char *p = json->input_p; + const unsigned char *end = json->input_end; + unsigned char tok; + unsigned char passed_token = false; + + /* JSON token look-up-table */ + static const unsigned char token_lut[256] = + { + #define i _rJSON_TOK_ERROR + /* 0 | 0x00 | */ i,i,i,i,i,i,i,i,i, + /* 9 | 0x09 |\t */ _rJSON_TOK_WHITESPACE, + /* 10 | 0x0A |\n */ _rJSON_TOK_NEWLINE, i,i, + /* 13 | 0x0D |\r */ _rJSON_TOK_WHITESPACE, i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, + /* 32 | 0x20 | */ _rJSON_TOK_WHITESPACE, i, + /* 34 | 0x22 | " */ _rJSON_TOK_STRING, i,i,i,i,i,i,i,i,i, + /* 44 | 0x2C | , */ _rJSON_TOK_COMMA, + /* 45 | 0x2D | - */ _rJSON_TOK_NUMBER, i, + /* 47 | 0x2F | / */ _rJSON_TOK_OPTIONAL_SKIP, + /* 48 | 0x30 | 0 */ _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, + /* 53 | 0x35 | 5 */ _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, _rJSON_TOK_NUMBER, + /* 58 | 0x3A | : */ _rJSON_TOK_COLON, i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, + /* 91 | 0x5B | [ */ _rJSON_TOK_ARRAY, i, + /* 93 | 0x5D | ] */ _rJSON_TOK_ARRAY_END, i,i,i,i,i,i,i,i, + /* 102 | 0x66 | f */ _rJSON_TOK_FALSE, i,i,i,i,i,i,i, + /* 110 | 0x6E | n */ _rJSON_TOK_NULL, i,i,i,i,i, + /* 116 | 0x74 | t */ _rJSON_TOK_TRUE, i,i,i,i,i,i, + /* 123 | 0x7B | { */ _rJSON_TOK_OBJECT, i, + /* 125 | 0x7D | } */ _rJSON_TOK_OBJECT_END, + /* 126 | 0x7E | ~ */ i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, + /* 164 | 0xA4 | */ i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, + /* 202 | 0xCA | */ i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, + /* 239 | 0xEF | */ _rJSON_TOK_OPTIONAL_SKIP, i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i + #undef i + }; + + if (_rJSON_LIKELY(stack->type != RJSON_ERROR)) + { + for (;;) + { + if (_rJSON_LIKELY(p != end)) + { + tok = token_lut[*p++]; + if (_rJSON_LIKELY(tok > _rJSON_TOK_OPTIONAL_SKIP)) + { + /* actual JSON token, process below */ + } + else if (_rJSON_LIKELY(tok == _rJSON_TOK_WHITESPACE)) + { + continue; + } + else if (tok == _rJSON_TOK_NEWLINE) + { + json->source_line++; + json->source_column_p = p; + continue; + } + else if (tok == _rJSON_TOK_OPTIONAL_SKIP) + { + if (_rjson_optional_skip(json, &p, &end)) + continue; + } + } + else if (_rJSON_LIKELY(_rjson_io_input(json))) + { + p = json->input_p; + end = json->input_end; + continue; + } + else + { + p = json->input_end; + tok = _rJSON_TOK_EOF; + } + + if (stack->type == RJSON_OBJECT) + { + if (stack->count & 1) + { + /* Expecting colon followed by value. */ + if (passed_token) + goto read_value; + if (_rJSON_LIKELY(tok == _rJSON_TOK_COLON)) + { + passed_token = true; + continue; + } + json->input_p = p; + return _rjson_error_token(json, + "expected ':' not %s after member name", (enum _rjson_token)tok); + } + if (passed_token) + { + if (_rJSON_LIKELY(tok == _rJSON_TOK_STRING)) + goto read_value; + json->input_p = p; + return _rjson_error(json, "expected member name after ','"); + } + if (tok == _rJSON_TOK_OBJECT_END) + { + json->input_p = p; + json->stack_top--; + return RJSON_OBJECT_END; + } + if (stack->count == 0) + { + /* No member name/value pairs yet. */ + if (_rJSON_LIKELY(tok == _rJSON_TOK_STRING)) + goto read_value; + json->input_p = p; + return _rjson_error(json, "expected member name or '}'"); + } + /* Expecting comma followed by member name. */ + if (_rJSON_LIKELY(tok == _rJSON_TOK_COMMA)) + { + passed_token = true; + continue; + } + json->input_p = p; + return _rjson_error_token(json, + "expected ',' or '}' not %s after member value", (enum _rjson_token)tok); + } + else if (stack->type == RJSON_ARRAY) + { + if (passed_token) + goto read_value; + if (tok == _rJSON_TOK_ARRAY_END) + { + json->input_p = p; + json->stack_top--; + return RJSON_ARRAY_END; + } + if (stack->count == 0) + goto read_value; + if (_rJSON_LIKELY(tok == _rJSON_TOK_COMMA)) + { + passed_token = true; + continue; + } + json->input_p = p; + return _rjson_error_token(json, + "expected ',' or ']' not %s in array", (enum _rjson_token)tok); + } + else + { + if (_rJSON_LIKELY(!stack->count && tok != _rJSON_TOK_EOF)) + goto read_value; + json->input_p = p; + if (!stack->count) + return _rjson_error(json, "reached end without any data"); + if (tok == _rJSON_TOK_EOF) + return RJSON_DONE; + if (!(json->option_flags & RJSON_OPTION_ALLOW_TRAILING_DATA)) + return _rjson_error_token(json, + "expected end of stream instead of %s", (enum _rjson_token)tok); + json->input_p--; + return RJSON_DONE; + } + + /* read value for current token */ + read_value: + json->input_p = p; + stack->count++; + /* This is optimal when there are many strings, otherwise a switch statement + * or a function pointer table is better (depending on compiler/cpu) */ + if (tok == _rJSON_TOK_STRING) + return _rjson_read_string(json); + else if (tok == _rJSON_TOK_NUMBER) + return _rjson_read_number(json); + else if (tok == _rJSON_TOK_OBJECT) + return _rjson_push_stack(json, _rJSON_TOK_OBJECT); + else if (tok == _rJSON_TOK_ARRAY) + return _rjson_push_stack(json, _rJSON_TOK_ARRAY); + else if (tok == _rJSON_TOK_TRUE) + return _rjson_read_name(json, "rue", RJSON_TRUE); + else if (tok == _rJSON_TOK_FALSE) + return _rjson_read_name(json, "alse", RJSON_FALSE); + else if (tok == _rJSON_TOK_NULL) + return _rjson_read_name(json, "ull", RJSON_NULL); + else return _rjson_error_token(json, + "unexpected %s in value", (enum _rjson_token)tok); + } + } + return RJSON_ERROR; +} + +void _rjson_setup(rjson_t *json, rjson_io_t io, void *user_data, int input_len) +{ + json->io = io; + json->user_data = user_data; + json->input_len = input_len; + json->input_p = json->input_end = json->input_buf + input_len; + + json->stack = json->inline_stack; + json->stack_top = json->stack; + json->stack_top->type = RJSON_DONE; + json->stack_top->count = 0; + json->stack_cap = (unsigned int)(sizeof(json->inline_stack) / sizeof(json->inline_stack[0])); + json->stack_max = (unsigned int)50; + + json->string = json->inline_string; + json->string_pass_through = NULL; + json->string_len = 0; + json->string_cap = sizeof(json->inline_string); + + json->source_line = 1; + json->source_column_p = json->input_p; + json->option_flags = 0; + json->decimal_sep = 0; +} + +rjson_t *rjson_open_user(rjson_io_t io, void *user_data, int io_block_size) +{ + rjson_t* json = (rjson_t*)malloc( + sizeof(rjson_t) - sizeof(((rjson_t*)0)->input_buf) + io_block_size); + if (json) _rjson_setup(json, io, user_data, io_block_size); + return json; +} + +static int _rjson_buffer_io(void* buf, int len, void *user) +{ + const char **ud = (const char **)user; + if (ud[1] - ud[0] < len) len = (int)(ud[1] - ud[0]); + memcpy(buf, ud[0], len); + ud[0] += len; + return len; +} + +rjson_t *rjson_open_buffer(const void *buffer, size_t size) +{ + rjson_t *json = (rjson_t *)malloc(sizeof(rjson_t) + sizeof(const char *)*2); + const char **ud = (const char **)(json + 1); + if (!json) return NULL; + ud[0] = (const char *)buffer; + ud[1] = ud[0] + size; + _rjson_setup(json, _rjson_buffer_io, (void*)ud, sizeof(json->input_buf)); + return json; +} + +rjson_t *rjson_open_string(const char *string) +{ + return rjson_open_buffer(string, strlen(string)); +} + +static int _rjson_stream_io(void* buf, int len, void *user) +{ + return (int)intfstream_read((intfstream_t*)user, buf, (uint64_t)len); +} + +rjson_t *rjson_open_stream(struct intfstream_internal *stream) +{ + /* Allocate an input buffer based on the file size */ + int64_t size = intfstream_get_size(stream); + int io_size = + (size > 1024*1024 ? 4096 : + (size > 256*1024 ? 2048 : 1024)); + return rjson_open_user(_rjson_stream_io, stream, io_size); +} + +static int _rjson_rfile_io(void* buf, int len, void *user) +{ + return (int)filestream_read((RFILE*)user, buf, (int64_t)len); +} + +rjson_t *rjson_open_rfile(RFILE *rfile) +{ + /* Allocate an input buffer based on the file size */ + int64_t size = filestream_get_size(rfile); + int io_size = + (size > 1024*1024 ? 4096 : + (size > 256*1024 ? 2048 : 1024)); + return rjson_open_user(_rjson_rfile_io, rfile, io_size); +} + +void rjson_set_options(rjson_t *json, char rjson_option_flags) +{ + json->option_flags = rjson_option_flags; +} + +void rjson_set_max_depth(rjson_t *json, unsigned int max_depth) +{ + json->stack_max = max_depth; +} + +const char *rjson_get_string(rjson_t *json, size_t *length) +{ + char* str = (json->string_pass_through ? json->string_pass_through : json->string); + if (length != NULL) + *length = json->string_len; + str[json->string_len] = '\0'; + return str; +} + +double rjson_get_double(rjson_t *json) +{ + char* str = (json->string_pass_through ? json->string_pass_through : json->string); + str[json->string_len] = '\0'; + if (json->decimal_sep != '.') + { + /* handle locale that uses a non-standard decimal separator */ + char *p; + if (json->decimal_sep == 0) + { + char test[4]; + snprintf(test, sizeof(test), "%.1f", 0.0f); + json->decimal_sep = test[1]; + } + if (json->decimal_sep != '.' && (p = strchr(str, '.')) != NULL) + { + double res; + *p = json->decimal_sep; + res = atof(str); + *p = '.'; + return res; + } + } + return atof(str); +} + +int rjson_get_int(rjson_t *json) +{ + char* str = (json->string_pass_through ? json->string_pass_through : json->string); + str[json->string_len] = '\0'; + return atoi(str); +} + +const char *rjson_get_error(rjson_t *json) +{ + return (json->stack_top->type == RJSON_ERROR ? json->error_text : ""); +} + +void rjson_set_error(rjson_t *json, const char* error) +{ + _rjson_error(json, "%s", error); +} + +size_t rjson_get_source_line(rjson_t *json) +{ + return json->source_line; +} + +size_t rjson_get_source_column(rjson_t *json) +{ + return (json->input_p == json->source_column_p ? 1 : + json->input_p - json->source_column_p); +} + +int rjson_get_source_context_len(rjson_t *json) +{ + const unsigned char *from = json->input_buf, *to = json->input_end, *p = json->input_p; + return ((p + 256 < to ? p + 256 : to) - (p > from + 256 ? p - 256 : from)); +} + +const char* rjson_get_source_context_buf(rjson_t *json) +{ + /* inside the input buffer, some " may have been replaced with \0. */ + const unsigned char *p = json->input_p, *from = json->input_buf; + unsigned char *i = json->input_buf; + for (; i != json->input_end; i++) if (*i == '\0') *i = '"'; + return (const char*)(p > from + 256 ? p - 256 : from); +} + +bool rjson_check_context(rjson_t *json, unsigned int depth, ...) +{ + va_list ap; + const struct _rjson_stack *stack = json->stack, *stack_top = json->stack_top; + if ((unsigned int)(stack_top - stack) != depth) + return false; + va_start(ap, depth); + while (++stack <= stack_top) + { + if (va_arg(ap, int) == (int)stack->type) continue; + va_end(ap); + return false; + } + va_end(ap); + return true; +} + +unsigned int rjson_get_context_depth(rjson_t *json) +{ + return json->stack_top - json->stack; +} + +size_t rjson_get_context_count(rjson_t *json) +{ + return json->stack_top->count; +} + +enum rjson_type rjson_get_context_type(rjson_t *json) +{ + return json->stack_top->type; +} + +void rjson_free(rjson_t *json) +{ + if (json->stack != json->inline_stack) + free(json->stack); + if (json->string != json->inline_string) + free(json->string); + free(json); +} + +static bool _rjson_nop_default(void *context) { return true; } +static bool _rjson_nop_string(void *context, const char *value, size_t length) { return true; } +static bool _rjson_nop_bool(void *context, bool value) { return true; } + +enum rjson_type rjson_parse(rjson_t *json, void* context, + bool (*object_member_handler)(void *context, const char *str, size_t len), + bool (*string_handler )(void *context, const char *str, size_t len), + bool (*number_handler )(void *context, const char *str, size_t len), + bool (*start_object_handler )(void *context), + bool (*end_object_handler )(void *context), + bool (*start_array_handler )(void *context), + bool (*end_array_handler )(void *context), + bool (*boolean_handler )(void *context, bool value), + bool (*null_handler )(void *context)) +{ + bool in_object = false; + size_t len; + const char* string; + if (!object_member_handler) object_member_handler = _rjson_nop_string; + if (!string_handler ) string_handler = _rjson_nop_string; + if (!number_handler ) number_handler = _rjson_nop_string; + if (!start_object_handler ) start_object_handler = _rjson_nop_default; + if (!end_object_handler ) end_object_handler = _rjson_nop_default; + if (!start_array_handler ) start_array_handler = _rjson_nop_default; + if (!end_array_handler ) end_array_handler = _rjson_nop_default; + if (!boolean_handler ) boolean_handler = _rjson_nop_bool; + if (!null_handler ) null_handler = _rjson_nop_default; + for (;;) + { + switch (rjson_next(json)) + { + case RJSON_STRING: + string = rjson_get_string(json, &len); + if (_rJSON_LIKELY( + (in_object && (json->stack_top->count & 1) ? + object_member_handler : string_handler) + (context, string, len))) + continue; + return RJSON_STRING; + case RJSON_NUMBER: + string = rjson_get_string(json, &len); + if (_rJSON_LIKELY(number_handler(context, string, len))) + continue; + return RJSON_NUMBER; + case RJSON_OBJECT: + in_object = true; + if (_rJSON_LIKELY(start_object_handler(context))) + continue; + return RJSON_OBJECT; + case RJSON_ARRAY: + in_object = false; + if (_rJSON_LIKELY(start_array_handler(context))) + continue; + return RJSON_ARRAY; + case RJSON_OBJECT_END: + if (_rJSON_LIKELY(end_object_handler(context))) + { + in_object = (json->stack_top->type == RJSON_OBJECT); + continue; + } + return RJSON_OBJECT_END; + case RJSON_ARRAY_END: + if (_rJSON_LIKELY(end_array_handler(context))) + { + in_object = (json->stack_top->type == RJSON_OBJECT); + continue; + } + return RJSON_ARRAY_END; + case RJSON_TRUE: + if (_rJSON_LIKELY(boolean_handler(context, true))) + continue; + return RJSON_TRUE; + case RJSON_FALSE: + if (_rJSON_LIKELY(boolean_handler(context, false))) + continue; + return RJSON_FALSE; + case RJSON_NULL: + if (_rJSON_LIKELY(null_handler(context))) + continue; + return RJSON_NULL; + case RJSON_ERROR: + return RJSON_ERROR; + case RJSON_DONE: + return RJSON_DONE; + } + } +} + +bool rjson_parse_quick(const char *string, void* context, char option_flags, + bool (*object_member_handler)(void *context, const char *str, size_t len), + bool (*string_handler )(void *context, const char *str, size_t len), + bool (*number_handler )(void *context, const char *str, size_t len), + bool (*start_object_handler )(void *context), + bool (*end_object_handler )(void *context), + bool (*start_array_handler )(void *context), + bool (*end_array_handler )(void *context), + bool (*boolean_handler )(void *context, bool value), + bool (*null_handler )(void *context), + void (*error_handler )(void *context, int line, int col, const char* error)) +{ + const char *user_data[2]; + rjson_t json; + user_data[0] = string; + user_data[1] = string + strlen(string); + _rjson_setup(&json, _rjson_buffer_io, (void*)user_data, sizeof(json.input_buf)); + rjson_set_options(&json, option_flags); + if (rjson_parse(&json, context, + object_member_handler, string_handler, number_handler, + start_object_handler, end_object_handler, + start_array_handler, end_array_handler, + boolean_handler, null_handler) == RJSON_DONE) + return true; + if (error_handler) + error_handler(context, + (int)rjson_get_source_line(&json), + (int)rjson_get_source_column(&json), + rjson_get_error(&json)); + return false; +} + +struct rjsonwriter +{ + char* buf; + int buf_num, buf_cap; + + rjsonwriter_io_t io; + void *user_data; + + const char* error_text; + char option_flags, decimal_sep; + bool buf_is_output, final_flush; + + char inline_buf[1024]; +}; + +rjsonwriter_t *rjsonwriter_open_user(rjsonwriter_io_t io, void *user_data) +{ + rjsonwriter_t* writer = (rjsonwriter_t*)malloc(sizeof(rjsonwriter_t)); + if (!writer) return NULL; + + writer->buf = writer->inline_buf; + writer->buf_num = 0; + writer->buf_cap = sizeof(writer->inline_buf); + + writer->error_text = NULL; + writer->option_flags = writer->decimal_sep = 0; + writer->buf_is_output = writer->final_flush = false; + + writer->io = io; + writer->user_data = user_data; + + return writer; +} + +static int _rjsonwriter_stream_io(const void* buf, int len, void *user) +{ + return (int)intfstream_write((intfstream_t*)user, buf, (uint64_t)len); +} + +rjsonwriter_t *rjsonwriter_open_stream(struct intfstream_internal *stream) +{ + return rjsonwriter_open_user(_rjsonwriter_stream_io, stream); +} + +static int _rjsonwriter_rfile_io(const void* buf, int len, void *user) +{ + return (int)filestream_write((RFILE*)user, buf, (int64_t)len); +} + +rjsonwriter_t *rjsonwriter_open_rfile(RFILE *rfile) +{ + return rjsonwriter_open_user(_rjsonwriter_rfile_io, rfile); +} + +static int _rjsonwriter_memory_io(const void* buf, int len, void *user) +{ + rjsonwriter_t *writer = (rjsonwriter_t *)user; + bool is_append = (buf != writer->buf); + bool can_realloc = (writer->buf != writer->inline_buf); + int new_cap = writer->buf_num + (is_append ? len : 0) + 512; + if (!writer->final_flush && (is_append || new_cap > writer->buf_cap)) + { + char* new_buf = (char*)(can_realloc ? realloc(writer->buf, new_cap) : malloc(new_cap)); + if (!new_buf) return 0; + if (!can_realloc) memcpy(new_buf, writer->buf, writer->buf_num); + if (is_append) + { + memcpy(new_buf + writer->buf_num, buf, len); + writer->buf_num += len; + } + writer->buf = new_buf; + writer->buf_cap = new_cap; + } + return len; +} + +rjsonwriter_t *rjsonwriter_open_memory() +{ + rjsonwriter_t *writer = rjsonwriter_open_user(_rjsonwriter_memory_io, NULL); + if (!writer) return NULL; + writer->user_data = writer; + writer->buf_is_output = true; + return writer; +} + +char* rjsonwriter_get_memory_buffer(rjsonwriter_t *writer, int* len) +{ + if (writer->io != _rjsonwriter_memory_io || writer->error_text) + return NULL; + if (writer->buf_num == writer->buf_cap) + rjsonwriter_flush(writer); + writer->buf[writer->buf_num] = '\0'; + if (len) *len = writer->buf_num; + return writer->buf; +} + +bool rjsonwriter_free(rjsonwriter_t *writer) +{ + bool res; + writer->final_flush = true; + res = rjsonwriter_flush(writer); + if (writer->buf != writer->inline_buf) + free(writer->buf); + free(writer); + return res; +} + +void rjsonwriter_set_options(rjsonwriter_t *writer, int rjsonwriter_option_flags) +{ + writer->option_flags = rjsonwriter_option_flags; +} + +bool rjsonwriter_flush(rjsonwriter_t *writer) +{ + if (writer->buf_num && !writer->error_text && writer->io(writer->buf, + writer->buf_num, writer->user_data) != writer->buf_num) + writer->error_text = "output error"; + if (!writer->buf_is_output || writer->error_text) + writer->buf_num = 0; + return !writer->error_text; +} + +const char *rjsonwriter_get_error(rjsonwriter_t *writer) +{ + return (writer->error_text ? writer->error_text : ""); +} + +void rjsonwriter_raw(rjsonwriter_t *writer, const char *buf, int len) +{ + if (writer->buf_num + len > writer->buf_cap) + rjsonwriter_flush(writer); + if (len == 1) + { + if (buf[0] > ' ' || + !(writer->option_flags & RJSONWRITER_OPTION_SKIP_WHITESPACE)) + writer->buf[writer->buf_num++] = buf[0]; + } + else + { + int add = writer->buf_cap - writer->buf_num; + if (add > len) add = len; + memcpy(writer->buf + writer->buf_num, buf, add); + writer->buf_num += add; + if (len == add) return; + rjsonwriter_flush(writer); + len -= add; + buf += add; + if (writer->buf_num + len <= writer->buf_cap) + { + memcpy(writer->buf + writer->buf_num, buf, len); + writer->buf_num += len; + } + else if (writer->io(buf, len, writer->user_data) != len) + writer->error_text = "output error"; + } +} + +void rjsonwriter_rawf(rjsonwriter_t *writer, const char *fmt, ...) +{ + int available, need; + va_list ap, ap2; + if (writer->buf_num >= writer->buf_cap - 16) + rjsonwriter_flush(writer); + available = (writer->buf_cap - writer->buf_num); + va_start(ap, fmt); + need = vsnprintf(writer->buf + writer->buf_num, available, fmt, ap); + va_end(ap); + if (need <= 0) return; + if (need < available) + { + writer->buf_num += need; + return; + } + rjsonwriter_flush(writer); + if (writer->buf_num + need >= writer->buf_cap) + { + int newcap = writer->buf_num + need + 1; + char* newbuf = (char*)malloc(newcap); + if (!newbuf) + { + if (!writer->error_text) writer->error_text = "out of memory"; + return; + } + if (writer->buf_num) memcpy(newbuf, writer->buf, writer->buf_num); + if (writer->buf != writer->inline_buf) + free(writer->buf); + writer->buf = newbuf; + writer->buf_cap = newcap; + } + va_start(ap2, fmt); + vsnprintf(writer->buf + writer->buf_num, writer->buf_cap - writer->buf_num, fmt, ap2); + va_end(ap2); + writer->buf_num += need; +} + +void _rjsonwriter_add_escaped(rjsonwriter_t *writer, unsigned char c) +{ + char esc_buf[8], esc_len = 2; + const char* esc; + switch (c) + { + case '\b': esc = "\\b"; break; + case '\t': esc = "\\t"; break; + case '\n': esc = "\\n"; break; + case '\f': esc = "\\f"; break; + case '\r': esc = "\\r"; break; + case '\"': esc = "\\\""; break; + case '\\': esc = "\\\\"; break; + case '/': esc = "\\/"; break; + default: + snprintf(esc_buf, sizeof(esc_buf), "\\u%04x", c); + esc = esc_buf; + esc_len = 6; + } + rjsonwriter_raw(writer, esc, esc_len); +} + +void rjsonwriter_add_string(rjsonwriter_t *writer, const char *value) +{ + const char *p = (const char*)value, *raw = p; + unsigned char c; + rjsonwriter_raw(writer, "\"", 1); + if (!p) goto string_end; + while ((c = (unsigned char)*p++) != '\0') + { + /* forward slash is special, it should be escaped if the previous character + * was a < (intended to avoid having </script> html tags in JSON files) */ + if (c >= 0x20 && c != '\"' && c != '\\' && + (c != '/' || p < value + 2 || p[-2] != '<')) continue; + if (raw != p - 1) rjsonwriter_raw(writer, raw, (int)(p - 1 - raw)); + _rjsonwriter_add_escaped(writer, c); + raw = p; + } + if (raw != p - 1) rjsonwriter_raw(writer, raw, (int)(p - 1 - raw)); + string_end: + rjsonwriter_raw(writer, "\"", 1); +} + +void rjsonwriter_add_string_len(rjsonwriter_t *writer, const char *value, int len) +{ + const char *p = (const char*)value, *raw = p, *end = p + len; + rjsonwriter_raw(writer, "\"", 1); + while (p != end) + { + unsigned char c = (unsigned char)*p++; + if (c >= 0x20 && c != '\"' && c != '\\' && + (c != '/' || p < value + 2 || p[-2] != '<')) continue; + if (raw != p - 1) rjsonwriter_raw(writer, raw, (int)(p - 1 - raw)); + _rjsonwriter_add_escaped(writer, c); + raw = p; + } + if (raw != end) rjsonwriter_raw(writer, raw, (int)(end - raw)); + rjsonwriter_raw(writer, "\"", 1); +} + +void rjsonwriter_add_double(rjsonwriter_t *writer, double value) +{ + int old_buf_num = writer->buf_num; + rjsonwriter_rawf(writer, "%G", value); + if (writer->decimal_sep != '.') + { + /* handle locale that uses a non-standard decimal separator */ + char *p, *str; + if (writer->decimal_sep == 0) + { + char test[4]; + snprintf(test, sizeof(test), "%.1f", 0.0f); + if ((writer->decimal_sep = test[1]) == '.') return; + } + str = writer->buf + (old_buf_num > writer->buf_num ? 0 : old_buf_num); + if ((p = strchr(str, writer->decimal_sep)) != NULL) *p = '.'; + } +} + +void rjsonwriter_add_spaces(rjsonwriter_t *writer, int count) +{ + if (!(writer->option_flags & RJSONWRITER_OPTION_SKIP_WHITESPACE)) + for (; count > 0; count -= 8) + rjsonwriter_raw(writer, " ", (count > 8 ? 8 : count)); +} + +void rjsonwriter_add_tabs(rjsonwriter_t *writer, int count) +{ + if (!(writer->option_flags & RJSONWRITER_OPTION_SKIP_WHITESPACE)) + for (; count > 0; count -= 8) + rjsonwriter_raw(writer, "\t\t\t\t\t\t\t\t", (count > 8 ? 8 : count)); +} + +#undef _rJSON_EOF +#undef _rJSON_LIKELY
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_bitstream.c
Added
@@ -0,0 +1,119 @@ +/* license:BSD-3-Clause + * copyright-holders:Aaron Giles +*************************************************************************** + + bitstream.c + + Helper classes for reading/writing at the bit level. + +***************************************************************************/ + +#include <stdlib.h> +#include <libchdr/bitstream.h> + +/*************************************************************************** + * INLINE FUNCTIONS + *************************************************************************** + */ + +int bitstream_overflow(struct bitstream* bitstream) { return ((bitstream->doffset - bitstream->bits / 8) > bitstream->dlength); } + +/*------------------------------------------------- + * create_bitstream - constructor + *------------------------------------------------- + */ + +struct bitstream* create_bitstream(const void *src, uint32_t srclength) +{ + struct bitstream* bitstream = (struct bitstream*)malloc(sizeof(struct bitstream)); + bitstream->buffer = 0; + bitstream->bits = 0; + bitstream->read = (const uint8_t*)src; + bitstream->doffset = 0; + bitstream->dlength = srclength; + return bitstream; +} + +/*----------------------------------------------------- + * bitstream_peek - fetch the requested number of bits + * but don't advance the input pointer + *----------------------------------------------------- + */ + +uint32_t bitstream_peek(struct bitstream* bitstream, int numbits) +{ + if (numbits == 0) + return 0; + + /* fetch data if we need more */ + if (numbits > bitstream->bits) + { + while (bitstream->bits <= 24) + { + if (bitstream->doffset < bitstream->dlength) + bitstream->buffer |= bitstream->read[bitstream->doffset] << (24 - bitstream->bits); + bitstream->doffset++; + bitstream->bits += 8; + } + } + + /* return the data */ + return bitstream->buffer >> (32 - numbits); +} + +/*----------------------------------------------------- + * bitstream_remove - advance the input pointer by the + * specified number of bits + *----------------------------------------------------- + */ + +void bitstream_remove(struct bitstream* bitstream, int numbits) +{ + bitstream->buffer <<= numbits; + bitstream->bits -= numbits; +} + +/*----------------------------------------------------- + * bitstream_read - fetch the requested number of bits + *----------------------------------------------------- + */ + +uint32_t bitstream_read(struct bitstream* bitstream, int numbits) +{ + uint32_t result = bitstream_peek(bitstream, numbits); + bitstream_remove(bitstream, numbits); + return result; +} + +/*------------------------------------------------- + * read_offset - return the current read offset + *------------------------------------------------- + */ + +uint32_t bitstream_read_offset(struct bitstream* bitstream) +{ + uint32_t result = bitstream->doffset; + int bits = bitstream->bits; + while (bits >= 8) + { + result--; + bits -= 8; + } + return result; +} + +/*------------------------------------------------- + * flush - flush to the nearest byte + *------------------------------------------------- + */ + +uint32_t bitstream_flush(struct bitstream* bitstream) +{ + while (bitstream->bits >= 8) + { + bitstream->doffset--; + bitstream->bits -= 8; + } + bitstream->bits = bitstream->buffer = 0; + return bitstream->doffset; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_cdrom.c
Added
@@ -0,0 +1,417 @@ +/* license:BSD-3-Clause + * copyright-holders:Aaron Giles +*************************************************************************** + + cdrom.c + + Generic MAME CD-ROM utilties - build IDE and SCSI CD-ROMs on top of this + +**************************************************************************** + + IMPORTANT: + "physical" block addresses are the actual addresses on the emulated CD. + "chd" block addresses are the block addresses in the CHD file. + Because we pad each track to a 4-frame boundary, these addressing + schemes will differ after track 1! + +***************************************************************************/ +#ifdef WANT_RAW_DATA_SECTOR + +#include <assert.h> +#include <string.h> + +#include <retro_inline.h> + +#include <libchdr/cdrom.h> + +/*************************************************************************** + DEBUGGING +***************************************************************************/ + +/** @brief The verbose. */ +#define VERBOSE (0) +#if VERBOSE + +/** + * @def LOG(x) do + * + * @brief A macro that defines log. + * + * @param x The void to process. + */ + +#define LOG(x) do { if (VERBOSE) logerror x; } while (0) + +/** + * @fn void CLIB_DECL logerror(const char *text, ...) ATTR_PRINTF(1,2); + * + * @brief Logerrors the given text. + * + * @param text The text. + * + * @return A CLIB_DECL. + */ + +void CLIB_DECL logerror(const char *text, ...) ATTR_PRINTF(1,2); +#else + +/** + * @def LOG(x); + * + * @brief A macro that defines log. + * + * @param x The void to process. + */ + +#define LOG(x) +#endif + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +/** @brief offset within sector. */ +#define SYNC_OFFSET 0x000 +/** @brief 12 bytes. */ +#define SYNC_NUM_BYTES 12 + +/** @brief offset within sector. */ +#define MODE_OFFSET 0x00f + +/** @brief offset within sector. */ +#define ECC_P_OFFSET 0x81c +/** @brief 2 lots of 86. */ +#define ECC_P_NUM_BYTES 86 +/** @brief 24 bytes each. */ +#define ECC_P_COMP 24 + +/** @brief The ECC q offset. */ +#define ECC_Q_OFFSET (ECC_P_OFFSET + 2 * ECC_P_NUM_BYTES) +/** @brief 2 lots of 52. */ +#define ECC_Q_NUM_BYTES 52 +/** @brief 43 bytes each. */ +#define ECC_Q_COMP 43 + +/** + * @brief ------------------------------------------------- + * ECC lookup tables pre-calculated tables for ECC data calcs + * -------------------------------------------------. + */ + +static const uint8_t ecclow[256] = +{ + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, + 0x1d, 0x1f, 0x19, 0x1b, 0x15, 0x17, 0x11, 0x13, 0x0d, 0x0f, 0x09, 0x0b, 0x05, 0x07, 0x01, 0x03, + 0x3d, 0x3f, 0x39, 0x3b, 0x35, 0x37, 0x31, 0x33, 0x2d, 0x2f, 0x29, 0x2b, 0x25, 0x27, 0x21, 0x23, + 0x5d, 0x5f, 0x59, 0x5b, 0x55, 0x57, 0x51, 0x53, 0x4d, 0x4f, 0x49, 0x4b, 0x45, 0x47, 0x41, 0x43, + 0x7d, 0x7f, 0x79, 0x7b, 0x75, 0x77, 0x71, 0x73, 0x6d, 0x6f, 0x69, 0x6b, 0x65, 0x67, 0x61, 0x63, + 0x9d, 0x9f, 0x99, 0x9b, 0x95, 0x97, 0x91, 0x93, 0x8d, 0x8f, 0x89, 0x8b, 0x85, 0x87, 0x81, 0x83, + 0xbd, 0xbf, 0xb9, 0xbb, 0xb5, 0xb7, 0xb1, 0xb3, 0xad, 0xaf, 0xa9, 0xab, 0xa5, 0xa7, 0xa1, 0xa3, + 0xdd, 0xdf, 0xd9, 0xdb, 0xd5, 0xd7, 0xd1, 0xd3, 0xcd, 0xcf, 0xc9, 0xcb, 0xc5, 0xc7, 0xc1, 0xc3, + 0xfd, 0xff, 0xf9, 0xfb, 0xf5, 0xf7, 0xf1, 0xf3, 0xed, 0xef, 0xe9, 0xeb, 0xe5, 0xe7, 0xe1, 0xe3 +}; + +/** @brief The ecchigh[ 256]. */ +static const uint8_t ecchigh[256] = +{ + 0x00, 0xf4, 0xf5, 0x01, 0xf7, 0x03, 0x02, 0xf6, 0xf3, 0x07, 0x06, 0xf2, 0x04, 0xf0, 0xf1, 0x05, + 0xfb, 0x0f, 0x0e, 0xfa, 0x0c, 0xf8, 0xf9, 0x0d, 0x08, 0xfc, 0xfd, 0x09, 0xff, 0x0b, 0x0a, 0xfe, + 0xeb, 0x1f, 0x1e, 0xea, 0x1c, 0xe8, 0xe9, 0x1d, 0x18, 0xec, 0xed, 0x19, 0xef, 0x1b, 0x1a, 0xee, + 0x10, 0xe4, 0xe5, 0x11, 0xe7, 0x13, 0x12, 0xe6, 0xe3, 0x17, 0x16, 0xe2, 0x14, 0xe0, 0xe1, 0x15, + 0xcb, 0x3f, 0x3e, 0xca, 0x3c, 0xc8, 0xc9, 0x3d, 0x38, 0xcc, 0xcd, 0x39, 0xcf, 0x3b, 0x3a, 0xce, + 0x30, 0xc4, 0xc5, 0x31, 0xc7, 0x33, 0x32, 0xc6, 0xc3, 0x37, 0x36, 0xc2, 0x34, 0xc0, 0xc1, 0x35, + 0x20, 0xd4, 0xd5, 0x21, 0xd7, 0x23, 0x22, 0xd6, 0xd3, 0x27, 0x26, 0xd2, 0x24, 0xd0, 0xd1, 0x25, + 0xdb, 0x2f, 0x2e, 0xda, 0x2c, 0xd8, 0xd9, 0x2d, 0x28, 0xdc, 0xdd, 0x29, 0xdf, 0x2b, 0x2a, 0xde, + 0x8b, 0x7f, 0x7e, 0x8a, 0x7c, 0x88, 0x89, 0x7d, 0x78, 0x8c, 0x8d, 0x79, 0x8f, 0x7b, 0x7a, 0x8e, + 0x70, 0x84, 0x85, 0x71, 0x87, 0x73, 0x72, 0x86, 0x83, 0x77, 0x76, 0x82, 0x74, 0x80, 0x81, 0x75, + 0x60, 0x94, 0x95, 0x61, 0x97, 0x63, 0x62, 0x96, 0x93, 0x67, 0x66, 0x92, 0x64, 0x90, 0x91, 0x65, + 0x9b, 0x6f, 0x6e, 0x9a, 0x6c, 0x98, 0x99, 0x6d, 0x68, 0x9c, 0x9d, 0x69, 0x9f, 0x6b, 0x6a, 0x9e, + 0x40, 0xb4, 0xb5, 0x41, 0xb7, 0x43, 0x42, 0xb6, 0xb3, 0x47, 0x46, 0xb2, 0x44, 0xb0, 0xb1, 0x45, + 0xbb, 0x4f, 0x4e, 0xba, 0x4c, 0xb8, 0xb9, 0x4d, 0x48, 0xbc, 0xbd, 0x49, 0xbf, 0x4b, 0x4a, 0xbe, + 0xab, 0x5f, 0x5e, 0xaa, 0x5c, 0xa8, 0xa9, 0x5d, 0x58, 0xac, 0xad, 0x59, 0xaf, 0x5b, 0x5a, 0xae, + 0x50, 0xa4, 0xa5, 0x51, 0xa7, 0x53, 0x52, 0xa6, 0xa3, 0x57, 0x56, 0xa2, 0x54, 0xa0, 0xa1, 0x55 +}; + +/** + * @brief ------------------------------------------------- + * poffsets - each row represents the addresses used to calculate a byte of the ECC P + * data 86 (*2) ECC P bytes, 24 values represented by each + * -------------------------------------------------. + */ + +static const uint16_t poffsets[ECC_P_NUM_BYTES][ECC_P_COMP] = +{ + { 0x000,0x056,0x0ac,0x102,0x158,0x1ae,0x204,0x25a,0x2b0,0x306,0x35c,0x3b2,0x408,0x45e,0x4b4,0x50a,0x560,0x5b6,0x60c,0x662,0x6b8,0x70e,0x764,0x7ba }, + { 0x001,0x057,0x0ad,0x103,0x159,0x1af,0x205,0x25b,0x2b1,0x307,0x35d,0x3b3,0x409,0x45f,0x4b5,0x50b,0x561,0x5b7,0x60d,0x663,0x6b9,0x70f,0x765,0x7bb }, + { 0x002,0x058,0x0ae,0x104,0x15a,0x1b0,0x206,0x25c,0x2b2,0x308,0x35e,0x3b4,0x40a,0x460,0x4b6,0x50c,0x562,0x5b8,0x60e,0x664,0x6ba,0x710,0x766,0x7bc }, + { 0x003,0x059,0x0af,0x105,0x15b,0x1b1,0x207,0x25d,0x2b3,0x309,0x35f,0x3b5,0x40b,0x461,0x4b7,0x50d,0x563,0x5b9,0x60f,0x665,0x6bb,0x711,0x767,0x7bd }, + { 0x004,0x05a,0x0b0,0x106,0x15c,0x1b2,0x208,0x25e,0x2b4,0x30a,0x360,0x3b6,0x40c,0x462,0x4b8,0x50e,0x564,0x5ba,0x610,0x666,0x6bc,0x712,0x768,0x7be }, + { 0x005,0x05b,0x0b1,0x107,0x15d,0x1b3,0x209,0x25f,0x2b5,0x30b,0x361,0x3b7,0x40d,0x463,0x4b9,0x50f,0x565,0x5bb,0x611,0x667,0x6bd,0x713,0x769,0x7bf }, + { 0x006,0x05c,0x0b2,0x108,0x15e,0x1b4,0x20a,0x260,0x2b6,0x30c,0x362,0x3b8,0x40e,0x464,0x4ba,0x510,0x566,0x5bc,0x612,0x668,0x6be,0x714,0x76a,0x7c0 }, + { 0x007,0x05d,0x0b3,0x109,0x15f,0x1b5,0x20b,0x261,0x2b7,0x30d,0x363,0x3b9,0x40f,0x465,0x4bb,0x511,0x567,0x5bd,0x613,0x669,0x6bf,0x715,0x76b,0x7c1 }, + { 0x008,0x05e,0x0b4,0x10a,0x160,0x1b6,0x20c,0x262,0x2b8,0x30e,0x364,0x3ba,0x410,0x466,0x4bc,0x512,0x568,0x5be,0x614,0x66a,0x6c0,0x716,0x76c,0x7c2 }, + { 0x009,0x05f,0x0b5,0x10b,0x161,0x1b7,0x20d,0x263,0x2b9,0x30f,0x365,0x3bb,0x411,0x467,0x4bd,0x513,0x569,0x5bf,0x615,0x66b,0x6c1,0x717,0x76d,0x7c3 }, + { 0x00a,0x060,0x0b6,0x10c,0x162,0x1b8,0x20e,0x264,0x2ba,0x310,0x366,0x3bc,0x412,0x468,0x4be,0x514,0x56a,0x5c0,0x616,0x66c,0x6c2,0x718,0x76e,0x7c4 }, + { 0x00b,0x061,0x0b7,0x10d,0x163,0x1b9,0x20f,0x265,0x2bb,0x311,0x367,0x3bd,0x413,0x469,0x4bf,0x515,0x56b,0x5c1,0x617,0x66d,0x6c3,0x719,0x76f,0x7c5 }, + { 0x00c,0x062,0x0b8,0x10e,0x164,0x1ba,0x210,0x266,0x2bc,0x312,0x368,0x3be,0x414,0x46a,0x4c0,0x516,0x56c,0x5c2,0x618,0x66e,0x6c4,0x71a,0x770,0x7c6 }, + { 0x00d,0x063,0x0b9,0x10f,0x165,0x1bb,0x211,0x267,0x2bd,0x313,0x369,0x3bf,0x415,0x46b,0x4c1,0x517,0x56d,0x5c3,0x619,0x66f,0x6c5,0x71b,0x771,0x7c7 }, + { 0x00e,0x064,0x0ba,0x110,0x166,0x1bc,0x212,0x268,0x2be,0x314,0x36a,0x3c0,0x416,0x46c,0x4c2,0x518,0x56e,0x5c4,0x61a,0x670,0x6c6,0x71c,0x772,0x7c8 }, + { 0x00f,0x065,0x0bb,0x111,0x167,0x1bd,0x213,0x269,0x2bf,0x315,0x36b,0x3c1,0x417,0x46d,0x4c3,0x519,0x56f,0x5c5,0x61b,0x671,0x6c7,0x71d,0x773,0x7c9 }, + { 0x010,0x066,0x0bc,0x112,0x168,0x1be,0x214,0x26a,0x2c0,0x316,0x36c,0x3c2,0x418,0x46e,0x4c4,0x51a,0x570,0x5c6,0x61c,0x672,0x6c8,0x71e,0x774,0x7ca }, + { 0x011,0x067,0x0bd,0x113,0x169,0x1bf,0x215,0x26b,0x2c1,0x317,0x36d,0x3c3,0x419,0x46f,0x4c5,0x51b,0x571,0x5c7,0x61d,0x673,0x6c9,0x71f,0x775,0x7cb }, + { 0x012,0x068,0x0be,0x114,0x16a,0x1c0,0x216,0x26c,0x2c2,0x318,0x36e,0x3c4,0x41a,0x470,0x4c6,0x51c,0x572,0x5c8,0x61e,0x674,0x6ca,0x720,0x776,0x7cc }, + { 0x013,0x069,0x0bf,0x115,0x16b,0x1c1,0x217,0x26d,0x2c3,0x319,0x36f,0x3c5,0x41b,0x471,0x4c7,0x51d,0x573,0x5c9,0x61f,0x675,0x6cb,0x721,0x777,0x7cd }, + { 0x014,0x06a,0x0c0,0x116,0x16c,0x1c2,0x218,0x26e,0x2c4,0x31a,0x370,0x3c6,0x41c,0x472,0x4c8,0x51e,0x574,0x5ca,0x620,0x676,0x6cc,0x722,0x778,0x7ce }, + { 0x015,0x06b,0x0c1,0x117,0x16d,0x1c3,0x219,0x26f,0x2c5,0x31b,0x371,0x3c7,0x41d,0x473,0x4c9,0x51f,0x575,0x5cb,0x621,0x677,0x6cd,0x723,0x779,0x7cf }, + { 0x016,0x06c,0x0c2,0x118,0x16e,0x1c4,0x21a,0x270,0x2c6,0x31c,0x372,0x3c8,0x41e,0x474,0x4ca,0x520,0x576,0x5cc,0x622,0x678,0x6ce,0x724,0x77a,0x7d0 }, + { 0x017,0x06d,0x0c3,0x119,0x16f,0x1c5,0x21b,0x271,0x2c7,0x31d,0x373,0x3c9,0x41f,0x475,0x4cb,0x521,0x577,0x5cd,0x623,0x679,0x6cf,0x725,0x77b,0x7d1 }, + { 0x018,0x06e,0x0c4,0x11a,0x170,0x1c6,0x21c,0x272,0x2c8,0x31e,0x374,0x3ca,0x420,0x476,0x4cc,0x522,0x578,0x5ce,0x624,0x67a,0x6d0,0x726,0x77c,0x7d2 }, + { 0x019,0x06f,0x0c5,0x11b,0x171,0x1c7,0x21d,0x273,0x2c9,0x31f,0x375,0x3cb,0x421,0x477,0x4cd,0x523,0x579,0x5cf,0x625,0x67b,0x6d1,0x727,0x77d,0x7d3 }, + { 0x01a,0x070,0x0c6,0x11c,0x172,0x1c8,0x21e,0x274,0x2ca,0x320,0x376,0x3cc,0x422,0x478,0x4ce,0x524,0x57a,0x5d0,0x626,0x67c,0x6d2,0x728,0x77e,0x7d4 }, + { 0x01b,0x071,0x0c7,0x11d,0x173,0x1c9,0x21f,0x275,0x2cb,0x321,0x377,0x3cd,0x423,0x479,0x4cf,0x525,0x57b,0x5d1,0x627,0x67d,0x6d3,0x729,0x77f,0x7d5 }, + { 0x01c,0x072,0x0c8,0x11e,0x174,0x1ca,0x220,0x276,0x2cc,0x322,0x378,0x3ce,0x424,0x47a,0x4d0,0x526,0x57c,0x5d2,0x628,0x67e,0x6d4,0x72a,0x780,0x7d6 }, + { 0x01d,0x073,0x0c9,0x11f,0x175,0x1cb,0x221,0x277,0x2cd,0x323,0x379,0x3cf,0x425,0x47b,0x4d1,0x527,0x57d,0x5d3,0x629,0x67f,0x6d5,0x72b,0x781,0x7d7 }, + { 0x01e,0x074,0x0ca,0x120,0x176,0x1cc,0x222,0x278,0x2ce,0x324,0x37a,0x3d0,0x426,0x47c,0x4d2,0x528,0x57e,0x5d4,0x62a,0x680,0x6d6,0x72c,0x782,0x7d8 }, + { 0x01f,0x075,0x0cb,0x121,0x177,0x1cd,0x223,0x279,0x2cf,0x325,0x37b,0x3d1,0x427,0x47d,0x4d3,0x529,0x57f,0x5d5,0x62b,0x681,0x6d7,0x72d,0x783,0x7d9 }, + { 0x020,0x076,0x0cc,0x122,0x178,0x1ce,0x224,0x27a,0x2d0,0x326,0x37c,0x3d2,0x428,0x47e,0x4d4,0x52a,0x580,0x5d6,0x62c,0x682,0x6d8,0x72e,0x784,0x7da }, + { 0x021,0x077,0x0cd,0x123,0x179,0x1cf,0x225,0x27b,0x2d1,0x327,0x37d,0x3d3,0x429,0x47f,0x4d5,0x52b,0x581,0x5d7,0x62d,0x683,0x6d9,0x72f,0x785,0x7db }, + { 0x022,0x078,0x0ce,0x124,0x17a,0x1d0,0x226,0x27c,0x2d2,0x328,0x37e,0x3d4,0x42a,0x480,0x4d6,0x52c,0x582,0x5d8,0x62e,0x684,0x6da,0x730,0x786,0x7dc }, + { 0x023,0x079,0x0cf,0x125,0x17b,0x1d1,0x227,0x27d,0x2d3,0x329,0x37f,0x3d5,0x42b,0x481,0x4d7,0x52d,0x583,0x5d9,0x62f,0x685,0x6db,0x731,0x787,0x7dd }, + { 0x024,0x07a,0x0d0,0x126,0x17c,0x1d2,0x228,0x27e,0x2d4,0x32a,0x380,0x3d6,0x42c,0x482,0x4d8,0x52e,0x584,0x5da,0x630,0x686,0x6dc,0x732,0x788,0x7de }, + { 0x025,0x07b,0x0d1,0x127,0x17d,0x1d3,0x229,0x27f,0x2d5,0x32b,0x381,0x3d7,0x42d,0x483,0x4d9,0x52f,0x585,0x5db,0x631,0x687,0x6dd,0x733,0x789,0x7df }, + { 0x026,0x07c,0x0d2,0x128,0x17e,0x1d4,0x22a,0x280,0x2d6,0x32c,0x382,0x3d8,0x42e,0x484,0x4da,0x530,0x586,0x5dc,0x632,0x688,0x6de,0x734,0x78a,0x7e0 }, + { 0x027,0x07d,0x0d3,0x129,0x17f,0x1d5,0x22b,0x281,0x2d7,0x32d,0x383,0x3d9,0x42f,0x485,0x4db,0x531,0x587,0x5dd,0x633,0x689,0x6df,0x735,0x78b,0x7e1 }, + { 0x028,0x07e,0x0d4,0x12a,0x180,0x1d6,0x22c,0x282,0x2d8,0x32e,0x384,0x3da,0x430,0x486,0x4dc,0x532,0x588,0x5de,0x634,0x68a,0x6e0,0x736,0x78c,0x7e2 }, + { 0x029,0x07f,0x0d5,0x12b,0x181,0x1d7,0x22d,0x283,0x2d9,0x32f,0x385,0x3db,0x431,0x487,0x4dd,0x533,0x589,0x5df,0x635,0x68b,0x6e1,0x737,0x78d,0x7e3 }, + { 0x02a,0x080,0x0d6,0x12c,0x182,0x1d8,0x22e,0x284,0x2da,0x330,0x386,0x3dc,0x432,0x488,0x4de,0x534,0x58a,0x5e0,0x636,0x68c,0x6e2,0x738,0x78e,0x7e4 }, + { 0x02b,0x081,0x0d7,0x12d,0x183,0x1d9,0x22f,0x285,0x2db,0x331,0x387,0x3dd,0x433,0x489,0x4df,0x535,0x58b,0x5e1,0x637,0x68d,0x6e3,0x739,0x78f,0x7e5 }, + { 0x02c,0x082,0x0d8,0x12e,0x184,0x1da,0x230,0x286,0x2dc,0x332,0x388,0x3de,0x434,0x48a,0x4e0,0x536,0x58c,0x5e2,0x638,0x68e,0x6e4,0x73a,0x790,0x7e6 }, + { 0x02d,0x083,0x0d9,0x12f,0x185,0x1db,0x231,0x287,0x2dd,0x333,0x389,0x3df,0x435,0x48b,0x4e1,0x537,0x58d,0x5e3,0x639,0x68f,0x6e5,0x73b,0x791,0x7e7 }, + { 0x02e,0x084,0x0da,0x130,0x186,0x1dc,0x232,0x288,0x2de,0x334,0x38a,0x3e0,0x436,0x48c,0x4e2,0x538,0x58e,0x5e4,0x63a,0x690,0x6e6,0x73c,0x792,0x7e8 }, + { 0x02f,0x085,0x0db,0x131,0x187,0x1dd,0x233,0x289,0x2df,0x335,0x38b,0x3e1,0x437,0x48d,0x4e3,0x539,0x58f,0x5e5,0x63b,0x691,0x6e7,0x73d,0x793,0x7e9 }, + { 0x030,0x086,0x0dc,0x132,0x188,0x1de,0x234,0x28a,0x2e0,0x336,0x38c,0x3e2,0x438,0x48e,0x4e4,0x53a,0x590,0x5e6,0x63c,0x692,0x6e8,0x73e,0x794,0x7ea }, + { 0x031,0x087,0x0dd,0x133,0x189,0x1df,0x235,0x28b,0x2e1,0x337,0x38d,0x3e3,0x439,0x48f,0x4e5,0x53b,0x591,0x5e7,0x63d,0x693,0x6e9,0x73f,0x795,0x7eb }, + { 0x032,0x088,0x0de,0x134,0x18a,0x1e0,0x236,0x28c,0x2e2,0x338,0x38e,0x3e4,0x43a,0x490,0x4e6,0x53c,0x592,0x5e8,0x63e,0x694,0x6ea,0x740,0x796,0x7ec }, + { 0x033,0x089,0x0df,0x135,0x18b,0x1e1,0x237,0x28d,0x2e3,0x339,0x38f,0x3e5,0x43b,0x491,0x4e7,0x53d,0x593,0x5e9,0x63f,0x695,0x6eb,0x741,0x797,0x7ed }, + { 0x034,0x08a,0x0e0,0x136,0x18c,0x1e2,0x238,0x28e,0x2e4,0x33a,0x390,0x3e6,0x43c,0x492,0x4e8,0x53e,0x594,0x5ea,0x640,0x696,0x6ec,0x742,0x798,0x7ee }, + { 0x035,0x08b,0x0e1,0x137,0x18d,0x1e3,0x239,0x28f,0x2e5,0x33b,0x391,0x3e7,0x43d,0x493,0x4e9,0x53f,0x595,0x5eb,0x641,0x697,0x6ed,0x743,0x799,0x7ef }, + { 0x036,0x08c,0x0e2,0x138,0x18e,0x1e4,0x23a,0x290,0x2e6,0x33c,0x392,0x3e8,0x43e,0x494,0x4ea,0x540,0x596,0x5ec,0x642,0x698,0x6ee,0x744,0x79a,0x7f0 }, + { 0x037,0x08d,0x0e3,0x139,0x18f,0x1e5,0x23b,0x291,0x2e7,0x33d,0x393,0x3e9,0x43f,0x495,0x4eb,0x541,0x597,0x5ed,0x643,0x699,0x6ef,0x745,0x79b,0x7f1 }, + { 0x038,0x08e,0x0e4,0x13a,0x190,0x1e6,0x23c,0x292,0x2e8,0x33e,0x394,0x3ea,0x440,0x496,0x4ec,0x542,0x598,0x5ee,0x644,0x69a,0x6f0,0x746,0x79c,0x7f2 }, + { 0x039,0x08f,0x0e5,0x13b,0x191,0x1e7,0x23d,0x293,0x2e9,0x33f,0x395,0x3eb,0x441,0x497,0x4ed,0x543,0x599,0x5ef,0x645,0x69b,0x6f1,0x747,0x79d,0x7f3 }, + { 0x03a,0x090,0x0e6,0x13c,0x192,0x1e8,0x23e,0x294,0x2ea,0x340,0x396,0x3ec,0x442,0x498,0x4ee,0x544,0x59a,0x5f0,0x646,0x69c,0x6f2,0x748,0x79e,0x7f4 }, + { 0x03b,0x091,0x0e7,0x13d,0x193,0x1e9,0x23f,0x295,0x2eb,0x341,0x397,0x3ed,0x443,0x499,0x4ef,0x545,0x59b,0x5f1,0x647,0x69d,0x6f3,0x749,0x79f,0x7f5 }, + { 0x03c,0x092,0x0e8,0x13e,0x194,0x1ea,0x240,0x296,0x2ec,0x342,0x398,0x3ee,0x444,0x49a,0x4f0,0x546,0x59c,0x5f2,0x648,0x69e,0x6f4,0x74a,0x7a0,0x7f6 }, + { 0x03d,0x093,0x0e9,0x13f,0x195,0x1eb,0x241,0x297,0x2ed,0x343,0x399,0x3ef,0x445,0x49b,0x4f1,0x547,0x59d,0x5f3,0x649,0x69f,0x6f5,0x74b,0x7a1,0x7f7 }, + { 0x03e,0x094,0x0ea,0x140,0x196,0x1ec,0x242,0x298,0x2ee,0x344,0x39a,0x3f0,0x446,0x49c,0x4f2,0x548,0x59e,0x5f4,0x64a,0x6a0,0x6f6,0x74c,0x7a2,0x7f8 }, + { 0x03f,0x095,0x0eb,0x141,0x197,0x1ed,0x243,0x299,0x2ef,0x345,0x39b,0x3f1,0x447,0x49d,0x4f3,0x549,0x59f,0x5f5,0x64b,0x6a1,0x6f7,0x74d,0x7a3,0x7f9 }, + { 0x040,0x096,0x0ec,0x142,0x198,0x1ee,0x244,0x29a,0x2f0,0x346,0x39c,0x3f2,0x448,0x49e,0x4f4,0x54a,0x5a0,0x5f6,0x64c,0x6a2,0x6f8,0x74e,0x7a4,0x7fa }, + { 0x041,0x097,0x0ed,0x143,0x199,0x1ef,0x245,0x29b,0x2f1,0x347,0x39d,0x3f3,0x449,0x49f,0x4f5,0x54b,0x5a1,0x5f7,0x64d,0x6a3,0x6f9,0x74f,0x7a5,0x7fb }, + { 0x042,0x098,0x0ee,0x144,0x19a,0x1f0,0x246,0x29c,0x2f2,0x348,0x39e,0x3f4,0x44a,0x4a0,0x4f6,0x54c,0x5a2,0x5f8,0x64e,0x6a4,0x6fa,0x750,0x7a6,0x7fc }, + { 0x043,0x099,0x0ef,0x145,0x19b,0x1f1,0x247,0x29d,0x2f3,0x349,0x39f,0x3f5,0x44b,0x4a1,0x4f7,0x54d,0x5a3,0x5f9,0x64f,0x6a5,0x6fb,0x751,0x7a7,0x7fd }, + { 0x044,0x09a,0x0f0,0x146,0x19c,0x1f2,0x248,0x29e,0x2f4,0x34a,0x3a0,0x3f6,0x44c,0x4a2,0x4f8,0x54e,0x5a4,0x5fa,0x650,0x6a6,0x6fc,0x752,0x7a8,0x7fe }, + { 0x045,0x09b,0x0f1,0x147,0x19d,0x1f3,0x249,0x29f,0x2f5,0x34b,0x3a1,0x3f7,0x44d,0x4a3,0x4f9,0x54f,0x5a5,0x5fb,0x651,0x6a7,0x6fd,0x753,0x7a9,0x7ff }, + { 0x046,0x09c,0x0f2,0x148,0x19e,0x1f4,0x24a,0x2a0,0x2f6,0x34c,0x3a2,0x3f8,0x44e,0x4a4,0x4fa,0x550,0x5a6,0x5fc,0x652,0x6a8,0x6fe,0x754,0x7aa,0x800 }, + { 0x047,0x09d,0x0f3,0x149,0x19f,0x1f5,0x24b,0x2a1,0x2f7,0x34d,0x3a3,0x3f9,0x44f,0x4a5,0x4fb,0x551,0x5a7,0x5fd,0x653,0x6a9,0x6ff,0x755,0x7ab,0x801 }, + { 0x048,0x09e,0x0f4,0x14a,0x1a0,0x1f6,0x24c,0x2a2,0x2f8,0x34e,0x3a4,0x3fa,0x450,0x4a6,0x4fc,0x552,0x5a8,0x5fe,0x654,0x6aa,0x700,0x756,0x7ac,0x802 }, + { 0x049,0x09f,0x0f5,0x14b,0x1a1,0x1f7,0x24d,0x2a3,0x2f9,0x34f,0x3a5,0x3fb,0x451,0x4a7,0x4fd,0x553,0x5a9,0x5ff,0x655,0x6ab,0x701,0x757,0x7ad,0x803 }, + { 0x04a,0x0a0,0x0f6,0x14c,0x1a2,0x1f8,0x24e,0x2a4,0x2fa,0x350,0x3a6,0x3fc,0x452,0x4a8,0x4fe,0x554,0x5aa,0x600,0x656,0x6ac,0x702,0x758,0x7ae,0x804 }, + { 0x04b,0x0a1,0x0f7,0x14d,0x1a3,0x1f9,0x24f,0x2a5,0x2fb,0x351,0x3a7,0x3fd,0x453,0x4a9,0x4ff,0x555,0x5ab,0x601,0x657,0x6ad,0x703,0x759,0x7af,0x805 }, + { 0x04c,0x0a2,0x0f8,0x14e,0x1a4,0x1fa,0x250,0x2a6,0x2fc,0x352,0x3a8,0x3fe,0x454,0x4aa,0x500,0x556,0x5ac,0x602,0x658,0x6ae,0x704,0x75a,0x7b0,0x806 }, + { 0x04d,0x0a3,0x0f9,0x14f,0x1a5,0x1fb,0x251,0x2a7,0x2fd,0x353,0x3a9,0x3ff,0x455,0x4ab,0x501,0x557,0x5ad,0x603,0x659,0x6af,0x705,0x75b,0x7b1,0x807 }, + { 0x04e,0x0a4,0x0fa,0x150,0x1a6,0x1fc,0x252,0x2a8,0x2fe,0x354,0x3aa,0x400,0x456,0x4ac,0x502,0x558,0x5ae,0x604,0x65a,0x6b0,0x706,0x75c,0x7b2,0x808 }, + { 0x04f,0x0a5,0x0fb,0x151,0x1a7,0x1fd,0x253,0x2a9,0x2ff,0x355,0x3ab,0x401,0x457,0x4ad,0x503,0x559,0x5af,0x605,0x65b,0x6b1,0x707,0x75d,0x7b3,0x809 }, + { 0x050,0x0a6,0x0fc,0x152,0x1a8,0x1fe,0x254,0x2aa,0x300,0x356,0x3ac,0x402,0x458,0x4ae,0x504,0x55a,0x5b0,0x606,0x65c,0x6b2,0x708,0x75e,0x7b4,0x80a }, + { 0x051,0x0a7,0x0fd,0x153,0x1a9,0x1ff,0x255,0x2ab,0x301,0x357,0x3ad,0x403,0x459,0x4af,0x505,0x55b,0x5b1,0x607,0x65d,0x6b3,0x709,0x75f,0x7b5,0x80b }, + { 0x052,0x0a8,0x0fe,0x154,0x1aa,0x200,0x256,0x2ac,0x302,0x358,0x3ae,0x404,0x45a,0x4b0,0x506,0x55c,0x5b2,0x608,0x65e,0x6b4,0x70a,0x760,0x7b6,0x80c }, + { 0x053,0x0a9,0x0ff,0x155,0x1ab,0x201,0x257,0x2ad,0x303,0x359,0x3af,0x405,0x45b,0x4b1,0x507,0x55d,0x5b3,0x609,0x65f,0x6b5,0x70b,0x761,0x7b7,0x80d }, + { 0x054,0x0aa,0x100,0x156,0x1ac,0x202,0x258,0x2ae,0x304,0x35a,0x3b0,0x406,0x45c,0x4b2,0x508,0x55e,0x5b4,0x60a,0x660,0x6b6,0x70c,0x762,0x7b8,0x80e }, + { 0x055,0x0ab,0x101,0x157,0x1ad,0x203,0x259,0x2af,0x305,0x35b,0x3b1,0x407,0x45d,0x4b3,0x509,0x55f,0x5b5,0x60b,0x661,0x6b7,0x70d,0x763,0x7b9,0x80f } +}; + +/** + * @brief ------------------------------------------------- + * qoffsets - each row represents the addresses used to calculate a byte of the ECC Q + * data 52 (*2) ECC Q bytes, 43 values represented by each + * -------------------------------------------------. + */ + +static const uint16_t qoffsets[ECC_Q_NUM_BYTES][ECC_Q_COMP] = +{ + { 0x000,0x058,0x0b0,0x108,0x160,0x1b8,0x210,0x268,0x2c0,0x318,0x370,0x3c8,0x420,0x478,0x4d0,0x528,0x580,0x5d8,0x630,0x688,0x6e0,0x738,0x790,0x7e8,0x840,0x898,0x034,0x08c,0x0e4,0x13c,0x194,0x1ec,0x244,0x29c,0x2f4,0x34c,0x3a4,0x3fc,0x454,0x4ac,0x504,0x55c,0x5b4 }, + { 0x001,0x059,0x0b1,0x109,0x161,0x1b9,0x211,0x269,0x2c1,0x319,0x371,0x3c9,0x421,0x479,0x4d1,0x529,0x581,0x5d9,0x631,0x689,0x6e1,0x739,0x791,0x7e9,0x841,0x899,0x035,0x08d,0x0e5,0x13d,0x195,0x1ed,0x245,0x29d,0x2f5,0x34d,0x3a5,0x3fd,0x455,0x4ad,0x505,0x55d,0x5b5 }, + { 0x056,0x0ae,0x106,0x15e,0x1b6,0x20e,0x266,0x2be,0x316,0x36e,0x3c6,0x41e,0x476,0x4ce,0x526,0x57e,0x5d6,0x62e,0x686,0x6de,0x736,0x78e,0x7e6,0x83e,0x896,0x032,0x08a,0x0e2,0x13a,0x192,0x1ea,0x242,0x29a,0x2f2,0x34a,0x3a2,0x3fa,0x452,0x4aa,0x502,0x55a,0x5b2,0x60a }, + { 0x057,0x0af,0x107,0x15f,0x1b7,0x20f,0x267,0x2bf,0x317,0x36f,0x3c7,0x41f,0x477,0x4cf,0x527,0x57f,0x5d7,0x62f,0x687,0x6df,0x737,0x78f,0x7e7,0x83f,0x897,0x033,0x08b,0x0e3,0x13b,0x193,0x1eb,0x243,0x29b,0x2f3,0x34b,0x3a3,0x3fb,0x453,0x4ab,0x503,0x55b,0x5b3,0x60b }, + { 0x0ac,0x104,0x15c,0x1b4,0x20c,0x264,0x2bc,0x314,0x36c,0x3c4,0x41c,0x474,0x4cc,0x524,0x57c,0x5d4,0x62c,0x684,0x6dc,0x734,0x78c,0x7e4,0x83c,0x894,0x030,0x088,0x0e0,0x138,0x190,0x1e8,0x240,0x298,0x2f0,0x348,0x3a0,0x3f8,0x450,0x4a8,0x500,0x558,0x5b0,0x608,0x660 }, + { 0x0ad,0x105,0x15d,0x1b5,0x20d,0x265,0x2bd,0x315,0x36d,0x3c5,0x41d,0x475,0x4cd,0x525,0x57d,0x5d5,0x62d,0x685,0x6dd,0x735,0x78d,0x7e5,0x83d,0x895,0x031,0x089,0x0e1,0x139,0x191,0x1e9,0x241,0x299,0x2f1,0x349,0x3a1,0x3f9,0x451,0x4a9,0x501,0x559,0x5b1,0x609,0x661 }, + { 0x102,0x15a,0x1b2,0x20a,0x262,0x2ba,0x312,0x36a,0x3c2,0x41a,0x472,0x4ca,0x522,0x57a,0x5d2,0x62a,0x682,0x6da,0x732,0x78a,0x7e2,0x83a,0x892,0x02e,0x086,0x0de,0x136,0x18e,0x1e6,0x23e,0x296,0x2ee,0x346,0x39e,0x3f6,0x44e,0x4a6,0x4fe,0x556,0x5ae,0x606,0x65e,0x6b6 }, + { 0x103,0x15b,0x1b3,0x20b,0x263,0x2bb,0x313,0x36b,0x3c3,0x41b,0x473,0x4cb,0x523,0x57b,0x5d3,0x62b,0x683,0x6db,0x733,0x78b,0x7e3,0x83b,0x893,0x02f,0x087,0x0df,0x137,0x18f,0x1e7,0x23f,0x297,0x2ef,0x347,0x39f,0x3f7,0x44f,0x4a7,0x4ff,0x557,0x5af,0x607,0x65f,0x6b7 }, + { 0x158,0x1b0,0x208,0x260,0x2b8,0x310,0x368,0x3c0,0x418,0x470,0x4c8,0x520,0x578,0x5d0,0x628,0x680,0x6d8,0x730,0x788,0x7e0,0x838,0x890,0x02c,0x084,0x0dc,0x134,0x18c,0x1e4,0x23c,0x294,0x2ec,0x344,0x39c,0x3f4,0x44c,0x4a4,0x4fc,0x554,0x5ac,0x604,0x65c,0x6b4,0x70c }, + { 0x159,0x1b1,0x209,0x261,0x2b9,0x311,0x369,0x3c1,0x419,0x471,0x4c9,0x521,0x579,0x5d1,0x629,0x681,0x6d9,0x731,0x789,0x7e1,0x839,0x891,0x02d,0x085,0x0dd,0x135,0x18d,0x1e5,0x23d,0x295,0x2ed,0x345,0x39d,0x3f5,0x44d,0x4a5,0x4fd,0x555,0x5ad,0x605,0x65d,0x6b5,0x70d }, + { 0x1ae,0x206,0x25e,0x2b6,0x30e,0x366,0x3be,0x416,0x46e,0x4c6,0x51e,0x576,0x5ce,0x626,0x67e,0x6d6,0x72e,0x786,0x7de,0x836,0x88e,0x02a,0x082,0x0da,0x132,0x18a,0x1e2,0x23a,0x292,0x2ea,0x342,0x39a,0x3f2,0x44a,0x4a2,0x4fa,0x552,0x5aa,0x602,0x65a,0x6b2,0x70a,0x762 }, + { 0x1af,0x207,0x25f,0x2b7,0x30f,0x367,0x3bf,0x417,0x46f,0x4c7,0x51f,0x577,0x5cf,0x627,0x67f,0x6d7,0x72f,0x787,0x7df,0x837,0x88f,0x02b,0x083,0x0db,0x133,0x18b,0x1e3,0x23b,0x293,0x2eb,0x343,0x39b,0x3f3,0x44b,0x4a3,0x4fb,0x553,0x5ab,0x603,0x65b,0x6b3,0x70b,0x763 }, + { 0x204,0x25c,0x2b4,0x30c,0x364,0x3bc,0x414,0x46c,0x4c4,0x51c,0x574,0x5cc,0x624,0x67c,0x6d4,0x72c,0x784,0x7dc,0x834,0x88c,0x028,0x080,0x0d8,0x130,0x188,0x1e0,0x238,0x290,0x2e8,0x340,0x398,0x3f0,0x448,0x4a0,0x4f8,0x550,0x5a8,0x600,0x658,0x6b0,0x708,0x760,0x7b8 }, + { 0x205,0x25d,0x2b5,0x30d,0x365,0x3bd,0x415,0x46d,0x4c5,0x51d,0x575,0x5cd,0x625,0x67d,0x6d5,0x72d,0x785,0x7dd,0x835,0x88d,0x029,0x081,0x0d9,0x131,0x189,0x1e1,0x239,0x291,0x2e9,0x341,0x399,0x3f1,0x449,0x4a1,0x4f9,0x551,0x5a9,0x601,0x659,0x6b1,0x709,0x761,0x7b9 }, + { 0x25a,0x2b2,0x30a,0x362,0x3ba,0x412,0x46a,0x4c2,0x51a,0x572,0x5ca,0x622,0x67a,0x6d2,0x72a,0x782,0x7da,0x832,0x88a,0x026,0x07e,0x0d6,0x12e,0x186,0x1de,0x236,0x28e,0x2e6,0x33e,0x396,0x3ee,0x446,0x49e,0x4f6,0x54e,0x5a6,0x5fe,0x656,0x6ae,0x706,0x75e,0x7b6,0x80e }, + { 0x25b,0x2b3,0x30b,0x363,0x3bb,0x413,0x46b,0x4c3,0x51b,0x573,0x5cb,0x623,0x67b,0x6d3,0x72b,0x783,0x7db,0x833,0x88b,0x027,0x07f,0x0d7,0x12f,0x187,0x1df,0x237,0x28f,0x2e7,0x33f,0x397,0x3ef,0x447,0x49f,0x4f7,0x54f,0x5a7,0x5ff,0x657,0x6af,0x707,0x75f,0x7b7,0x80f }, + { 0x2b0,0x308,0x360,0x3b8,0x410,0x468,0x4c0,0x518,0x570,0x5c8,0x620,0x678,0x6d0,0x728,0x780,0x7d8,0x830,0x888,0x024,0x07c,0x0d4,0x12c,0x184,0x1dc,0x234,0x28c,0x2e4,0x33c,0x394,0x3ec,0x444,0x49c,0x4f4,0x54c,0x5a4,0x5fc,0x654,0x6ac,0x704,0x75c,0x7b4,0x80c,0x864 }, + { 0x2b1,0x309,0x361,0x3b9,0x411,0x469,0x4c1,0x519,0x571,0x5c9,0x621,0x679,0x6d1,0x729,0x781,0x7d9,0x831,0x889,0x025,0x07d,0x0d5,0x12d,0x185,0x1dd,0x235,0x28d,0x2e5,0x33d,0x395,0x3ed,0x445,0x49d,0x4f5,0x54d,0x5a5,0x5fd,0x655,0x6ad,0x705,0x75d,0x7b5,0x80d,0x865 }, + { 0x306,0x35e,0x3b6,0x40e,0x466,0x4be,0x516,0x56e,0x5c6,0x61e,0x676,0x6ce,0x726,0x77e,0x7d6,0x82e,0x886,0x022,0x07a,0x0d2,0x12a,0x182,0x1da,0x232,0x28a,0x2e2,0x33a,0x392,0x3ea,0x442,0x49a,0x4f2,0x54a,0x5a2,0x5fa,0x652,0x6aa,0x702,0x75a,0x7b2,0x80a,0x862,0x8ba }, + { 0x307,0x35f,0x3b7,0x40f,0x467,0x4bf,0x517,0x56f,0x5c7,0x61f,0x677,0x6cf,0x727,0x77f,0x7d7,0x82f,0x887,0x023,0x07b,0x0d3,0x12b,0x183,0x1db,0x233,0x28b,0x2e3,0x33b,0x393,0x3eb,0x443,0x49b,0x4f3,0x54b,0x5a3,0x5fb,0x653,0x6ab,0x703,0x75b,0x7b3,0x80b,0x863,0x8bb }, + { 0x35c,0x3b4,0x40c,0x464,0x4bc,0x514,0x56c,0x5c4,0x61c,0x674,0x6cc,0x724,0x77c,0x7d4,0x82c,0x884,0x020,0x078,0x0d0,0x128,0x180,0x1d8,0x230,0x288,0x2e0,0x338,0x390,0x3e8,0x440,0x498,0x4f0,0x548,0x5a0,0x5f8,0x650,0x6a8,0x700,0x758,0x7b0,0x808,0x860,0x8b8,0x054 }, + { 0x35d,0x3b5,0x40d,0x465,0x4bd,0x515,0x56d,0x5c5,0x61d,0x675,0x6cd,0x725,0x77d,0x7d5,0x82d,0x885,0x021,0x079,0x0d1,0x129,0x181,0x1d9,0x231,0x289,0x2e1,0x339,0x391,0x3e9,0x441,0x499,0x4f1,0x549,0x5a1,0x5f9,0x651,0x6a9,0x701,0x759,0x7b1,0x809,0x861,0x8b9,0x055 }, + { 0x3b2,0x40a,0x462,0x4ba,0x512,0x56a,0x5c2,0x61a,0x672,0x6ca,0x722,0x77a,0x7d2,0x82a,0x882,0x01e,0x076,0x0ce,0x126,0x17e,0x1d6,0x22e,0x286,0x2de,0x336,0x38e,0x3e6,0x43e,0x496,0x4ee,0x546,0x59e,0x5f6,0x64e,0x6a6,0x6fe,0x756,0x7ae,0x806,0x85e,0x8b6,0x052,0x0aa }, + { 0x3b3,0x40b,0x463,0x4bb,0x513,0x56b,0x5c3,0x61b,0x673,0x6cb,0x723,0x77b,0x7d3,0x82b,0x883,0x01f,0x077,0x0cf,0x127,0x17f,0x1d7,0x22f,0x287,0x2df,0x337,0x38f,0x3e7,0x43f,0x497,0x4ef,0x547,0x59f,0x5f7,0x64f,0x6a7,0x6ff,0x757,0x7af,0x807,0x85f,0x8b7,0x053,0x0ab }, + { 0x408,0x460,0x4b8,0x510,0x568,0x5c0,0x618,0x670,0x6c8,0x720,0x778,0x7d0,0x828,0x880,0x01c,0x074,0x0cc,0x124,0x17c,0x1d4,0x22c,0x284,0x2dc,0x334,0x38c,0x3e4,0x43c,0x494,0x4ec,0x544,0x59c,0x5f4,0x64c,0x6a4,0x6fc,0x754,0x7ac,0x804,0x85c,0x8b4,0x050,0x0a8,0x100 }, + { 0x409,0x461,0x4b9,0x511,0x569,0x5c1,0x619,0x671,0x6c9,0x721,0x779,0x7d1,0x829,0x881,0x01d,0x075,0x0cd,0x125,0x17d,0x1d5,0x22d,0x285,0x2dd,0x335,0x38d,0x3e5,0x43d,0x495,0x4ed,0x545,0x59d,0x5f5,0x64d,0x6a5,0x6fd,0x755,0x7ad,0x805,0x85d,0x8b5,0x051,0x0a9,0x101 }, + { 0x45e,0x4b6,0x50e,0x566,0x5be,0x616,0x66e,0x6c6,0x71e,0x776,0x7ce,0x826,0x87e,0x01a,0x072,0x0ca,0x122,0x17a,0x1d2,0x22a,0x282,0x2da,0x332,0x38a,0x3e2,0x43a,0x492,0x4ea,0x542,0x59a,0x5f2,0x64a,0x6a2,0x6fa,0x752,0x7aa,0x802,0x85a,0x8b2,0x04e,0x0a6,0x0fe,0x156 }, + { 0x45f,0x4b7,0x50f,0x567,0x5bf,0x617,0x66f,0x6c7,0x71f,0x777,0x7cf,0x827,0x87f,0x01b,0x073,0x0cb,0x123,0x17b,0x1d3,0x22b,0x283,0x2db,0x333,0x38b,0x3e3,0x43b,0x493,0x4eb,0x543,0x59b,0x5f3,0x64b,0x6a3,0x6fb,0x753,0x7ab,0x803,0x85b,0x8b3,0x04f,0x0a7,0x0ff,0x157 }, + { 0x4b4,0x50c,0x564,0x5bc,0x614,0x66c,0x6c4,0x71c,0x774,0x7cc,0x824,0x87c,0x018,0x070,0x0c8,0x120,0x178,0x1d0,0x228,0x280,0x2d8,0x330,0x388,0x3e0,0x438,0x490,0x4e8,0x540,0x598,0x5f0,0x648,0x6a0,0x6f8,0x750,0x7a8,0x800,0x858,0x8b0,0x04c,0x0a4,0x0fc,0x154,0x1ac }, + { 0x4b5,0x50d,0x565,0x5bd,0x615,0x66d,0x6c5,0x71d,0x775,0x7cd,0x825,0x87d,0x019,0x071,0x0c9,0x121,0x179,0x1d1,0x229,0x281,0x2d9,0x331,0x389,0x3e1,0x439,0x491,0x4e9,0x541,0x599,0x5f1,0x649,0x6a1,0x6f9,0x751,0x7a9,0x801,0x859,0x8b1,0x04d,0x0a5,0x0fd,0x155,0x1ad }, + { 0x50a,0x562,0x5ba,0x612,0x66a,0x6c2,0x71a,0x772,0x7ca,0x822,0x87a,0x016,0x06e,0x0c6,0x11e,0x176,0x1ce,0x226,0x27e,0x2d6,0x32e,0x386,0x3de,0x436,0x48e,0x4e6,0x53e,0x596,0x5ee,0x646,0x69e,0x6f6,0x74e,0x7a6,0x7fe,0x856,0x8ae,0x04a,0x0a2,0x0fa,0x152,0x1aa,0x202 }, + { 0x50b,0x563,0x5bb,0x613,0x66b,0x6c3,0x71b,0x773,0x7cb,0x823,0x87b,0x017,0x06f,0x0c7,0x11f,0x177,0x1cf,0x227,0x27f,0x2d7,0x32f,0x387,0x3df,0x437,0x48f,0x4e7,0x53f,0x597,0x5ef,0x647,0x69f,0x6f7,0x74f,0x7a7,0x7ff,0x857,0x8af,0x04b,0x0a3,0x0fb,0x153,0x1ab,0x203 }, + { 0x560,0x5b8,0x610,0x668,0x6c0,0x718,0x770,0x7c8,0x820,0x878,0x014,0x06c,0x0c4,0x11c,0x174,0x1cc,0x224,0x27c,0x2d4,0x32c,0x384,0x3dc,0x434,0x48c,0x4e4,0x53c,0x594,0x5ec,0x644,0x69c,0x6f4,0x74c,0x7a4,0x7fc,0x854,0x8ac,0x048,0x0a0,0x0f8,0x150,0x1a8,0x200,0x258 }, + { 0x561,0x5b9,0x611,0x669,0x6c1,0x719,0x771,0x7c9,0x821,0x879,0x015,0x06d,0x0c5,0x11d,0x175,0x1cd,0x225,0x27d,0x2d5,0x32d,0x385,0x3dd,0x435,0x48d,0x4e5,0x53d,0x595,0x5ed,0x645,0x69d,0x6f5,0x74d,0x7a5,0x7fd,0x855,0x8ad,0x049,0x0a1,0x0f9,0x151,0x1a9,0x201,0x259 }, + { 0x5b6,0x60e,0x666,0x6be,0x716,0x76e,0x7c6,0x81e,0x876,0x012,0x06a,0x0c2,0x11a,0x172,0x1ca,0x222,0x27a,0x2d2,0x32a,0x382,0x3da,0x432,0x48a,0x4e2,0x53a,0x592,0x5ea,0x642,0x69a,0x6f2,0x74a,0x7a2,0x7fa,0x852,0x8aa,0x046,0x09e,0x0f6,0x14e,0x1a6,0x1fe,0x256,0x2ae }, + { 0x5b7,0x60f,0x667,0x6bf,0x717,0x76f,0x7c7,0x81f,0x877,0x013,0x06b,0x0c3,0x11b,0x173,0x1cb,0x223,0x27b,0x2d3,0x32b,0x383,0x3db,0x433,0x48b,0x4e3,0x53b,0x593,0x5eb,0x643,0x69b,0x6f3,0x74b,0x7a3,0x7fb,0x853,0x8ab,0x047,0x09f,0x0f7,0x14f,0x1a7,0x1ff,0x257,0x2af }, + { 0x60c,0x664,0x6bc,0x714,0x76c,0x7c4,0x81c,0x874,0x010,0x068,0x0c0,0x118,0x170,0x1c8,0x220,0x278,0x2d0,0x328,0x380,0x3d8,0x430,0x488,0x4e0,0x538,0x590,0x5e8,0x640,0x698,0x6f0,0x748,0x7a0,0x7f8,0x850,0x8a8,0x044,0x09c,0x0f4,0x14c,0x1a4,0x1fc,0x254,0x2ac,0x304 }, + { 0x60d,0x665,0x6bd,0x715,0x76d,0x7c5,0x81d,0x875,0x011,0x069,0x0c1,0x119,0x171,0x1c9,0x221,0x279,0x2d1,0x329,0x381,0x3d9,0x431,0x489,0x4e1,0x539,0x591,0x5e9,0x641,0x699,0x6f1,0x749,0x7a1,0x7f9,0x851,0x8a9,0x045,0x09d,0x0f5,0x14d,0x1a5,0x1fd,0x255,0x2ad,0x305 }, + { 0x662,0x6ba,0x712,0x76a,0x7c2,0x81a,0x872,0x00e,0x066,0x0be,0x116,0x16e,0x1c6,0x21e,0x276,0x2ce,0x326,0x37e,0x3d6,0x42e,0x486,0x4de,0x536,0x58e,0x5e6,0x63e,0x696,0x6ee,0x746,0x79e,0x7f6,0x84e,0x8a6,0x042,0x09a,0x0f2,0x14a,0x1a2,0x1fa,0x252,0x2aa,0x302,0x35a }, + { 0x663,0x6bb,0x713,0x76b,0x7c3,0x81b,0x873,0x00f,0x067,0x0bf,0x117,0x16f,0x1c7,0x21f,0x277,0x2cf,0x327,0x37f,0x3d7,0x42f,0x487,0x4df,0x537,0x58f,0x5e7,0x63f,0x697,0x6ef,0x747,0x79f,0x7f7,0x84f,0x8a7,0x043,0x09b,0x0f3,0x14b,0x1a3,0x1fb,0x253,0x2ab,0x303,0x35b }, + { 0x6b8,0x710,0x768,0x7c0,0x818,0x870,0x00c,0x064,0x0bc,0x114,0x16c,0x1c4,0x21c,0x274,0x2cc,0x324,0x37c,0x3d4,0x42c,0x484,0x4dc,0x534,0x58c,0x5e4,0x63c,0x694,0x6ec,0x744,0x79c,0x7f4,0x84c,0x8a4,0x040,0x098,0x0f0,0x148,0x1a0,0x1f8,0x250,0x2a8,0x300,0x358,0x3b0 }, + { 0x6b9,0x711,0x769,0x7c1,0x819,0x871,0x00d,0x065,0x0bd,0x115,0x16d,0x1c5,0x21d,0x275,0x2cd,0x325,0x37d,0x3d5,0x42d,0x485,0x4dd,0x535,0x58d,0x5e5,0x63d,0x695,0x6ed,0x745,0x79d,0x7f5,0x84d,0x8a5,0x041,0x099,0x0f1,0x149,0x1a1,0x1f9,0x251,0x2a9,0x301,0x359,0x3b1 }, + { 0x70e,0x766,0x7be,0x816,0x86e,0x00a,0x062,0x0ba,0x112,0x16a,0x1c2,0x21a,0x272,0x2ca,0x322,0x37a,0x3d2,0x42a,0x482,0x4da,0x532,0x58a,0x5e2,0x63a,0x692,0x6ea,0x742,0x79a,0x7f2,0x84a,0x8a2,0x03e,0x096,0x0ee,0x146,0x19e,0x1f6,0x24e,0x2a6,0x2fe,0x356,0x3ae,0x406 }, + { 0x70f,0x767,0x7bf,0x817,0x86f,0x00b,0x063,0x0bb,0x113,0x16b,0x1c3,0x21b,0x273,0x2cb,0x323,0x37b,0x3d3,0x42b,0x483,0x4db,0x533,0x58b,0x5e3,0x63b,0x693,0x6eb,0x743,0x79b,0x7f3,0x84b,0x8a3,0x03f,0x097,0x0ef,0x147,0x19f,0x1f7,0x24f,0x2a7,0x2ff,0x357,0x3af,0x407 }, + { 0x764,0x7bc,0x814,0x86c,0x008,0x060,0x0b8,0x110,0x168,0x1c0,0x218,0x270,0x2c8,0x320,0x378,0x3d0,0x428,0x480,0x4d8,0x530,0x588,0x5e0,0x638,0x690,0x6e8,0x740,0x798,0x7f0,0x848,0x8a0,0x03c,0x094,0x0ec,0x144,0x19c,0x1f4,0x24c,0x2a4,0x2fc,0x354,0x3ac,0x404,0x45c }, + { 0x765,0x7bd,0x815,0x86d,0x009,0x061,0x0b9,0x111,0x169,0x1c1,0x219,0x271,0x2c9,0x321,0x379,0x3d1,0x429,0x481,0x4d9,0x531,0x589,0x5e1,0x639,0x691,0x6e9,0x741,0x799,0x7f1,0x849,0x8a1,0x03d,0x095,0x0ed,0x145,0x19d,0x1f5,0x24d,0x2a5,0x2fd,0x355,0x3ad,0x405,0x45d }, + { 0x7ba,0x812,0x86a,0x006,0x05e,0x0b6,0x10e,0x166,0x1be,0x216,0x26e,0x2c6,0x31e,0x376,0x3ce,0x426,0x47e,0x4d6,0x52e,0x586,0x5de,0x636,0x68e,0x6e6,0x73e,0x796,0x7ee,0x846,0x89e,0x03a,0x092,0x0ea,0x142,0x19a,0x1f2,0x24a,0x2a2,0x2fa,0x352,0x3aa,0x402,0x45a,0x4b2 }, + { 0x7bb,0x813,0x86b,0x007,0x05f,0x0b7,0x10f,0x167,0x1bf,0x217,0x26f,0x2c7,0x31f,0x377,0x3cf,0x427,0x47f,0x4d7,0x52f,0x587,0x5df,0x637,0x68f,0x6e7,0x73f,0x797,0x7ef,0x847,0x89f,0x03b,0x093,0x0eb,0x143,0x19b,0x1f3,0x24b,0x2a3,0x2fb,0x353,0x3ab,0x403,0x45b,0x4b3 }, + { 0x810,0x868,0x004,0x05c,0x0b4,0x10c,0x164,0x1bc,0x214,0x26c,0x2c4,0x31c,0x374,0x3cc,0x424,0x47c,0x4d4,0x52c,0x584,0x5dc,0x634,0x68c,0x6e4,0x73c,0x794,0x7ec,0x844,0x89c,0x038,0x090,0x0e8,0x140,0x198,0x1f0,0x248,0x2a0,0x2f8,0x350,0x3a8,0x400,0x458,0x4b0,0x508 }, + { 0x811,0x869,0x005,0x05d,0x0b5,0x10d,0x165,0x1bd,0x215,0x26d,0x2c5,0x31d,0x375,0x3cd,0x425,0x47d,0x4d5,0x52d,0x585,0x5dd,0x635,0x68d,0x6e5,0x73d,0x795,0x7ed,0x845,0x89d,0x039,0x091,0x0e9,0x141,0x199,0x1f1,0x249,0x2a1,0x2f9,0x351,0x3a9,0x401,0x459,0x4b1,0x509 }, + { 0x866,0x002,0x05a,0x0b2,0x10a,0x162,0x1ba,0x212,0x26a,0x2c2,0x31a,0x372,0x3ca,0x422,0x47a,0x4d2,0x52a,0x582,0x5da,0x632,0x68a,0x6e2,0x73a,0x792,0x7ea,0x842,0x89a,0x036,0x08e,0x0e6,0x13e,0x196,0x1ee,0x246,0x29e,0x2f6,0x34e,0x3a6,0x3fe,0x456,0x4ae,0x506,0x55e }, + { 0x867,0x003,0x05b,0x0b3,0x10b,0x163,0x1bb,0x213,0x26b,0x2c3,0x31b,0x373,0x3cb,0x423,0x47b,0x4d3,0x52b,0x583,0x5db,0x633,0x68b,0x6e3,0x73b,0x793,0x7eb,0x843,0x89b,0x037,0x08f,0x0e7,0x13f,0x197,0x1ef,0x247,0x29f,0x2f7,0x34f,0x3a7,0x3ff,0x457,0x4af,0x507,0x55f } +}; + +/*------------------------------------------------- + * ecc_source_byte - return data from the sector + * at the given offset, masking anything + * particular to a mode + *------------------------------------------------- + */ + +static INLINE uint8_t ecc_source_byte(const uint8_t *sector, uint32_t offset) +{ + /* in mode 2 always treat these as 0 bytes */ + return (sector[MODE_OFFSET] == 2 && offset < 4) ? 0x00 : sector[SYNC_OFFSET + SYNC_NUM_BYTES + offset]; +} + +/** + * @fn void ecc_compute_bytes(const uint8_t *sector, const uint16_t *row, int rowlen, uint8_t &val1, uint8_t &val2) + * + * @brief ------------------------------------------------- + * ecc_compute_bytes - calculate an ECC value (P or Q) + * -------------------------------------------------. + * + * @param sector The sector. + * @param row The row. + * @param rowlen The rowlen. + * @param [in,out] val1 The first value. + * @param [in,out] val2 The second value. + */ + +void ecc_compute_bytes(const uint8_t *sector, const uint16_t *row, int rowlen, uint8_t *val1, uint8_t *val2) +{ + int component; + *val1 = *val2 = 0; + for (component = 0; component < rowlen; component++) + { + *val1 ^= ecc_source_byte(sector, row[component]); + *val2 ^= ecc_source_byte(sector, row[component]); + *val1 = ecclow[*val1]; + } + *val1 = ecchigh[ecclow[*val1] ^ *val2]; + *val2 ^= *val1; +} + +/** + * @fn int ecc_verify(const uint8_t *sector) + * + * @brief ------------------------------------------------- + * ecc_verify - verify the P and Q ECC codes in a sector + * -------------------------------------------------. + * + * @param sector The sector. + * + * @return true if it succeeds, false if it fails. + */ + +int ecc_verify(const uint8_t *sector) +{ + int byte; + /* first verify P bytes */ + for (byte = 0; byte < ECC_P_NUM_BYTES; byte++) + { + uint8_t val1, val2; + ecc_compute_bytes(sector, poffsets[byte], ECC_P_COMP, &val1, &val2); + if (sector[ECC_P_OFFSET + byte] != val1 || sector[ECC_P_OFFSET + ECC_P_NUM_BYTES + byte] != val2) + return 0; + } + + /* then verify Q bytes */ + for (byte = 0; byte < ECC_Q_NUM_BYTES; byte++) + { + uint8_t val1, val2; + ecc_compute_bytes(sector, qoffsets[byte], ECC_Q_COMP, &val1, &val2); + if (sector[ECC_Q_OFFSET + byte] != val1 || sector[ECC_Q_OFFSET + ECC_Q_NUM_BYTES + byte] != val2) + return 0; + } + return 1; +} + +/** + * @fn void ecc_generate(uint8_t *sector) + * + * @brief ------------------------------------------------- + * ecc_generate - generate the P and Q ECC codes for a sector, overwriting any + * existing codes + * -------------------------------------------------. + * + * @param [in,out] sector If non-null, the sector. + */ + +void ecc_generate(uint8_t *sector) +{ + int byte; + /* first verify P bytes */ + for (byte = 0; byte < ECC_P_NUM_BYTES; byte++) + ecc_compute_bytes(sector, poffsets[byte], ECC_P_COMP, §or[ECC_P_OFFSET + byte], §or[ECC_P_OFFSET + ECC_P_NUM_BYTES + byte]); + + /* then verify Q bytes */ + for (byte = 0; byte < ECC_Q_NUM_BYTES; byte++) + ecc_compute_bytes(sector, qoffsets[byte], ECC_Q_COMP, §or[ECC_Q_OFFSET + byte], §or[ECC_Q_OFFSET + ECC_Q_NUM_BYTES + byte]); +} + +/** + * @fn void ecc_clear(uint8_t *sector) + * + * @brief ------------------------------------------------- + * ecc_clear - erase the ECC P and Q cods to 0 within a sector + * -------------------------------------------------. + * + * @param [in,out] sector If non-null, the sector. + */ + +void ecc_clear(uint8_t *sector) +{ + memset(§or[ECC_P_OFFSET], 0, 2 * ECC_P_NUM_BYTES); + memset(§or[ECC_Q_OFFSET], 0, 2 * ECC_Q_NUM_BYTES); +} + +#endif /* WANT_RAW_DATA_SECTOR */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_chd.c
Added
@@ -0,0 +1,1935 @@ +/*************************************************************************** + + chd.c + + MAME Compressed Hunks of Data file format + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <libchdr/chd.h> +#include <libchdr/minmax.h> +#include <libchdr/cdrom.h> +#include <libchdr/huffman.h> + +#ifdef HAVE_FLAC +#include <libchdr/flac.h> +#endif + +#ifdef HAVE_7ZIP +#include <libchdr/lzma.h> +#endif + +#ifdef HAVE_ZLIB +#include <libchdr/libchdr_zlib.h> +#endif + +#include <retro_inline.h> +#include <streams/file_stream.h> + +#define TRUE 1 +#define FALSE 0 + +/*************************************************************************** + DEBUGGING +***************************************************************************/ + +#define PRINTF_MAX_HUNK (0) + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define MAP_STACK_ENTRIES 512 /* max number of entries to use on the stack */ +#define MAP_ENTRY_SIZE 16 /* V3 and later */ +#define OLD_MAP_ENTRY_SIZE 8 /* V1-V2 */ +#define METADATA_HEADER_SIZE 16 /* metadata header size */ + +#define CRCMAP_HASH_SIZE 4095 /* number of CRC hashtable entries */ + +#define MAP_ENTRY_FLAG_TYPE_MASK 0x0f /* what type of hunk */ +#define MAP_ENTRY_FLAG_NO_CRC 0x10 /* no CRC is present */ + +#define CHD_V1_SECTOR_SIZE 512 /* size of a "sector" in the V1 header */ + +#define COOKIE_VALUE 0xbaadf00d + +#define END_OF_LIST_COOKIE "EndOfListCookie" + +#define NO_MATCH (~0) + +#ifdef WANT_RAW_DATA_SECTOR +const uint8_t s_cd_sync_header[12] = { 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 }; +#endif + +/* V3-V4 entry types */ +enum +{ + V34_MAP_ENTRY_TYPE_INVALID = 0, /* invalid type */ + V34_MAP_ENTRY_TYPE_COMPRESSED = 1, /* standard compression */ + V34_MAP_ENTRY_TYPE_UNCOMPRESSED = 2, /* uncompressed data */ + V34_MAP_ENTRY_TYPE_MINI = 3, /* mini: use offset as raw data */ + V34_MAP_ENTRY_TYPE_SELF_HUNK = 4, /* same as another hunk in this file */ + V34_MAP_ENTRY_TYPE_PARENT_HUNK = 5, /* same as a hunk in the parent file */ + V34_MAP_ENTRY_TYPE_2ND_COMPRESSED = 6 /* compressed with secondary algorithm (usually FLAC CDDA) */ +}; + +/* V5 compression types */ +enum +{ + /* codec #0 + * these types are live when running */ + COMPRESSION_TYPE_0 = 0, + /* codec #1 */ + COMPRESSION_TYPE_1 = 1, + /* codec #2 */ + COMPRESSION_TYPE_2 = 2, + /* codec #3 */ + COMPRESSION_TYPE_3 = 3, + /* no compression; implicit length = hunkbytes */ + COMPRESSION_NONE = 4, + /* same as another block in this chd */ + COMPRESSION_SELF = 5, + /* same as a hunk's worth of units in the parent chd */ + COMPRESSION_PARENT = 6, + + /* start of small RLE run (4-bit length) + * these additional pseudo-types are used for compressed encodings: */ + COMPRESSION_RLE_SMALL, + /* start of large RLE run (8-bit length) */ + COMPRESSION_RLE_LARGE, + /* same as the last COMPRESSION_SELF block */ + COMPRESSION_SELF_0, + /* same as the last COMPRESSION_SELF block + 1 */ + COMPRESSION_SELF_1, + /* same block in the parent */ + COMPRESSION_PARENT_SELF, + /* same as the last COMPRESSION_PARENT block */ + COMPRESSION_PARENT_0, + /* same as the last COMPRESSION_PARENT block + 1 */ + COMPRESSION_PARENT_1 +}; + +/*************************************************************************** + MACROS +***************************************************************************/ + +#define EARLY_EXIT(x) do { (void)(x); goto cleanup; } while (0) + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +/* interface to a codec */ +typedef struct _codec_interface codec_interface; +struct _codec_interface +{ + UINT32 compression; /* type of compression */ + const char *compname; /* name of the algorithm */ + UINT8 lossy; /* is this a lossy algorithm? */ + chd_error (*init)(void *codec, UINT32 hunkbytes); /* codec initialize */ + void (*free)(void *codec); /* codec free */ + chd_error (*decompress)(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen); /* decompress data */ + chd_error (*config)(void *codec, int param, void *config); /* configure */ +}; + +/* a single map entry */ +typedef struct _map_entry map_entry; +struct _map_entry +{ + UINT64 offset; /* offset within the file of the data */ + UINT32 crc; /* 32-bit CRC of the data */ + UINT32 length; /* length of the data */ + UINT8 flags; /* misc flags */ +}; + +/* a single metadata entry */ +typedef struct _metadata_entry metadata_entry; +struct _metadata_entry +{ + UINT64 offset; /* offset within the file of the header */ + UINT64 next; /* offset within the file of the next header */ + UINT64 prev; /* offset within the file of the previous header */ + UINT32 length; /* length of the metadata */ + UINT32 metatag; /* metadata tag */ + UINT8 flags; /* flag bits */ +}; + +/* internal representation of an open CHD file */ +struct _chd_file +{ + UINT32 cookie; /* cookie, should equal COOKIE_VALUE */ + + RFILE * file; /* handle to the open core file */ + UINT8 owns_file; /* flag indicating if this file should be closed on chd_close() */ + chd_header header; /* header, extracted from file */ + + chd_file * parent; /* pointer to parent file, or NULL */ + + map_entry * map; /* array of map entries */ + +#ifdef NEED_CACHE_HUNK + UINT8 * cache; /* hunk cache pointer */ + UINT32 cachehunk; /* index of currently cached hunk */ + + UINT8 * compare; /* hunk compare pointer */ + UINT32 comparehunk; /* index of current compare data */ +#endif + + UINT8 * compressed; /* pointer to buffer for compressed data */ + const codec_interface * codecintf[4]; /* interface to the codec */ + +#ifdef HAVE_ZLIB + zlib_codec_data zlib_codec_data; /* zlib codec data */ + cdzl_codec_data cdzl_codec_data; /* cdzl codec data */ +#endif +#ifdef HAVE_7ZIP + cdlz_codec_data cdlz_codec_data; /* cdlz codec data */ +#endif +#ifdef HAVE_FLAC + cdfl_codec_data cdfl_codec_data; /* cdfl codec data */ +#endif + +#ifdef NEED_CACHE_HUNK + UINT32 maxhunk; /* maximum hunk accessed */ +#endif + UINT8 * file_cache; /* cache of underlying file */ +}; + +/*************************************************************************** + GLOBAL VARIABLES +***************************************************************************/ + +static const UINT8 nullmd5[CHD_MD5_BYTES] = { 0 }; +static const UINT8 nullsha1[CHD_SHA1_BYTES] = { 0 }; + +/*************************************************************************** + PROTOTYPES +***************************************************************************/ + +/* internal header operations */ +static chd_error header_validate(const chd_header *header); +static chd_error header_read(chd_file *chd, chd_header *header); + +/* internal hunk read/write */ +#ifdef NEED_CACHE_HUNK +static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum); +#endif +static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest); + +/* internal map access */ +static chd_error map_read(chd_file *chd); + +/* metadata management */ +static chd_error metadata_find_entry(chd_file *chd, UINT32 metatag, UINT32 metaindex, metadata_entry *metaentry); + +/*************************************************************************** + CODEC INTERFACES +***************************************************************************/ + +static const codec_interface codec_interfaces[] = +{ + /* "none" or no compression */ + { + CHDCOMPRESSION_NONE, + "none", + FALSE, + NULL, + NULL, + NULL, + NULL + }, + +#ifdef HAVE_ZLIB + /* standard zlib compression */ + { + CHDCOMPRESSION_ZLIB, + "zlib", + FALSE, + zlib_codec_init, + zlib_codec_free, + zlib_codec_decompress, + NULL + }, + + /* zlib+ compression */ + { + CHDCOMPRESSION_ZLIB_PLUS, + "zlib+", + FALSE, + zlib_codec_init, + zlib_codec_free, + zlib_codec_decompress, + NULL + }, + + /* V5 zlib compression */ + { + CHD_CODEC_ZLIB, + "zlib (Deflate)", + FALSE, + zlib_codec_init, + zlib_codec_free, + zlib_codec_decompress, + NULL + }, + + /* V5 CD zlib compression */ + { + CHD_CODEC_CD_ZLIB, + "cdzl (CD Deflate)", + FALSE, + cdzl_codec_init, + cdzl_codec_free, + cdzl_codec_decompress, + NULL + }, +#endif + +#ifdef HAVE_7ZIP + /* V5 CD lzma compression */ + { + CHD_CODEC_CD_LZMA, + "cdlz (CD LZMA)", + FALSE, + cdlz_codec_init, + cdlz_codec_free, + cdlz_codec_decompress, + NULL + }, +#endif + +#ifdef HAVE_FLAC + /* V5 CD flac compression */ + { + CHD_CODEC_CD_FLAC, + "cdfl (CD FLAC)", + FALSE, + cdfl_codec_init, + cdfl_codec_free, + cdfl_codec_decompress, + NULL + }, +#endif +}; + +/*************************************************************************** + INLINE FUNCTIONS +***************************************************************************/ + +/*------------------------------------------------- + get_bigendian_uint64 - fetch a UINT64 from + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE UINT64 get_bigendian_uint64(const UINT8 *base) +{ + return ((UINT64)base[0] << 56) | ((UINT64)base[1] << 48) | ((UINT64)base[2] << 40) | ((UINT64)base[3] << 32) | + ((UINT64)base[4] << 24) | ((UINT64)base[5] << 16) | ((UINT64)base[6] << 8) | (UINT64)base[7]; +} + +/*------------------------------------------------- + put_bigendian_uint64 - write a UINT64 to + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE void put_bigendian_uint64(UINT8 *base, UINT64 value) +{ + base[0] = value >> 56; + base[1] = value >> 48; + base[2] = value >> 40; + base[3] = value >> 32; + base[4] = value >> 24; + base[5] = value >> 16; + base[6] = value >> 8; + base[7] = value; +} + +/*------------------------------------------------- + get_bigendian_uint48 - fetch a UINT48 from + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE UINT64 get_bigendian_uint48(const UINT8 *base) +{ + return ((UINT64)base[0] << 40) | ((UINT64)base[1] << 32) | + ((UINT64)base[2] << 24) | ((UINT64)base[3] << 16) | ((UINT64)base[4] << 8) | (UINT64)base[5]; +} + +/*------------------------------------------------- + put_bigendian_uint48 - write a UINT48 to + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE void put_bigendian_uint48(UINT8 *base, UINT64 value) +{ + value &= 0xffffffffffff; + base[0] = value >> 40; + base[1] = value >> 32; + base[2] = value >> 24; + base[3] = value >> 16; + base[4] = value >> 8; + base[5] = value; +} +/*------------------------------------------------- + get_bigendian_uint32 - fetch a UINT32 from + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE UINT32 get_bigendian_uint32(const UINT8 *base) +{ + return (base[0] << 24) | (base[1] << 16) | (base[2] << 8) | base[3]; +} + +/*------------------------------------------------- + put_bigendian_uint32 - write a UINT32 to + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE void put_bigendian_uint32(UINT8 *base, UINT32 value) +{ + base[0] = value >> 24; + base[1] = value >> 16; + base[2] = value >> 8; + base[3] = value; +} + +/*------------------------------------------------- + put_bigendian_uint24 - write a UINT24 to + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE void put_bigendian_uint24(UINT8 *base, UINT32 value) +{ + value &= 0xffffff; + base[0] = value >> 16; + base[1] = value >> 8; + base[2] = value; +} + +/*------------------------------------------------- + get_bigendian_uint24 - fetch a UINT24 from + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE UINT32 get_bigendian_uint24(const UINT8 *base) +{ + return (base[0] << 16) | (base[1] << 8) | base[2]; +} + +/*------------------------------------------------- + get_bigendian_uint16 - fetch a UINT16 from + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE UINT16 get_bigendian_uint16(const UINT8 *base) +{ + return (base[0] << 8) | base[1]; +} + +/*------------------------------------------------- + put_bigendian_uint16 - write a UINT16 to + the data stream in bigendian order +-------------------------------------------------*/ + +static INLINE void put_bigendian_uint16(UINT8 *base, UINT16 value) +{ + base[0] = value >> 8; + base[1] = value; +} + +/*------------------------------------------------- + map_extract - extract a single map + entry from the datastream +-------------------------------------------------*/ + +static INLINE void map_extract(const UINT8 *base, map_entry *entry) +{ + entry->offset = get_bigendian_uint64(&base[0]); + entry->crc = get_bigendian_uint32(&base[8]); + entry->length = get_bigendian_uint16(&base[12]) | (base[14] << 16); + entry->flags = base[15]; +} + +/*------------------------------------------------- + map_assemble - write a single map + entry to the datastream +-------------------------------------------------*/ + +static INLINE void map_assemble(UINT8 *base, map_entry *entry) +{ + put_bigendian_uint64(&base[0], entry->offset); + put_bigendian_uint32(&base[8], entry->crc); + put_bigendian_uint16(&base[12], entry->length); + base[14] = entry->length >> 16; + base[15] = entry->flags; +} + +/*------------------------------------------------- + map_size_v5 - calculate CHDv5 map size +-------------------------------------------------*/ +static INLINE int map_size_v5(chd_header* header) +{ + return header->hunkcount * header->mapentrybytes; +} + +/*------------------------------------------------- + crc16 - calculate CRC16 (from hashing.cpp) +-------------------------------------------------*/ +uint16_t crc16(const void *data, uint32_t length) +{ + uint16_t crc = 0xffff; + + static const uint16_t s_table[256] = + { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 + }; + + const uint8_t *src = (uint8_t*)data; + + /* fetch the current value into a local and rip through the source data */ + while (length-- != 0) + crc = (crc << 8) ^ s_table[(crc >> 8) ^ *src++]; + return crc; +} + +/*------------------------------------------------- + decompress_v5_map - decompress the v5 map +-------------------------------------------------*/ + +static chd_error decompress_v5_map(chd_file* chd, chd_header* header) +{ + uint8_t rawbuf[16]; + uint16_t mapcrc; + uint32_t mapbytes; + uint64_t firstoffs; + uint32_t last_self = 0; + uint64_t last_parent = 0; + uint8_t lastcomp = 0; + int hunknum, repcount = 0; + enum huffman_error err; + uint8_t lengthbits, selfbits, parentbits; + uint8_t* compressed; + struct bitstream* bitbuf; + struct huffman_decoder* decoder; + uint64_t curoffset; + if (header->mapoffset == 0) + { +#if 0 + memset(header->rawmap, 0xff,map_size_v5(header)); +#endif + return CHDERR_READ_ERROR; + } + + /* read the reader */ + filestream_seek(chd->file, header->mapoffset, SEEK_SET); + filestream_read(chd->file, rawbuf, sizeof(rawbuf)); + mapbytes = get_bigendian_uint32(&rawbuf[0]); + firstoffs = get_bigendian_uint48(&rawbuf[4]); + mapcrc = get_bigendian_uint16(&rawbuf[10]); + lengthbits = rawbuf[12]; + selfbits = rawbuf[13]; + parentbits = rawbuf[14]; + + /* now read the map */ + compressed = (uint8_t*)malloc(sizeof(uint8_t) * mapbytes); + if (compressed == NULL) + return CHDERR_OUT_OF_MEMORY; + + filestream_seek(chd->file, header->mapoffset + 16, SEEK_SET); + filestream_read(chd->file, compressed, mapbytes); + bitbuf = create_bitstream(compressed, sizeof(uint8_t) * mapbytes); + if (bitbuf == NULL) + { + free(compressed); + return CHDERR_OUT_OF_MEMORY; + } + + header->rawmap = (uint8_t*)malloc(sizeof(uint8_t) * map_size_v5(header)); + if (header->rawmap == NULL) + { + free(compressed); + free(bitbuf); + return CHDERR_OUT_OF_MEMORY; + } + + /* first decode the compression types */ + decoder = create_huffman_decoder(16, 8); + if (decoder == NULL) + { + free(compressed); + free(bitbuf); + return CHDERR_OUT_OF_MEMORY; + } + + err = huffman_import_tree_rle(decoder, bitbuf); + if (err != HUFFERR_NONE) + { + free(compressed); + free(bitbuf); + delete_huffman_decoder(decoder); + return CHDERR_DECOMPRESSION_ERROR; + } + + for (hunknum = 0; hunknum < header->hunkcount; hunknum++) + { + uint8_t *rawmap = header->rawmap + (hunknum * 12); + if (repcount > 0) + { + rawmap[0] = lastcomp; + repcount--; + } + else + { + uint8_t val = huffman_decode_one(decoder, bitbuf); + if (val == COMPRESSION_RLE_SMALL) + { + rawmap[0] = lastcomp; + repcount = 2 + huffman_decode_one(decoder, bitbuf); + } + else if (val == COMPRESSION_RLE_LARGE) + { + rawmap[0] = lastcomp; + repcount = 2 + 16 + (huffman_decode_one(decoder, bitbuf) << 4); + repcount += huffman_decode_one(decoder, bitbuf); + } + else + rawmap[0] = lastcomp = val; + } + } + + /* then iterate through the hunks and extract the needed data */ + curoffset = firstoffs; + for (hunknum = 0; hunknum < header->hunkcount; hunknum++) + { + uint8_t *rawmap = header->rawmap + (hunknum * 12); + uint64_t offset = curoffset; + uint32_t length = 0; + uint16_t crc = 0; + switch (rawmap[0]) + { + /* base types */ + case COMPRESSION_TYPE_0: + case COMPRESSION_TYPE_1: + case COMPRESSION_TYPE_2: + case COMPRESSION_TYPE_3: + curoffset += length = bitstream_read(bitbuf, lengthbits); + crc = bitstream_read(bitbuf, 16); + break; + + case COMPRESSION_NONE: + curoffset += length = header->hunkbytes; + crc = bitstream_read(bitbuf, 16); + break; + + case COMPRESSION_SELF: + last_self = offset = bitstream_read(bitbuf, selfbits); + break; + + case COMPRESSION_PARENT: + offset = bitstream_read(bitbuf, parentbits); + last_parent = offset; + break; + + /* pseudo-types; convert into base types */ + case COMPRESSION_SELF_1: + last_self++; + case COMPRESSION_SELF_0: + rawmap[0] = COMPRESSION_SELF; + offset = last_self; + break; + + case COMPRESSION_PARENT_SELF: + rawmap[0] = COMPRESSION_PARENT; + last_parent = offset = ( ((uint64_t)hunknum) * ((uint64_t)header->hunkbytes) ) / header->unitbytes; + break; + + case COMPRESSION_PARENT_1: + last_parent += header->hunkbytes / header->unitbytes; + case COMPRESSION_PARENT_0: + rawmap[0] = COMPRESSION_PARENT; + offset = last_parent; + break; + } + /* UINT24 length */ + put_bigendian_uint24(&rawmap[1], length); + + /* UINT48 offset */ + put_bigendian_uint48(&rawmap[4], offset); + + /* crc16 */ + put_bigendian_uint16(&rawmap[10], crc); + } + + /* free memory */ + free(compressed); + free(bitbuf); + delete_huffman_decoder(decoder); + + /* verify the final CRC */ + if (crc16(&header->rawmap[0], header->hunkcount * 12) != mapcrc) + return CHDERR_DECOMPRESSION_ERROR; + + return CHDERR_NONE; +} + +/*------------------------------------------------- + map_extract_old - extract a single map + entry in old format from the datastream +-------------------------------------------------*/ + +static INLINE void map_extract_old(const UINT8 *base, map_entry *entry, UINT32 hunkbytes) +{ + entry->offset = get_bigendian_uint64(&base[0]); + entry->crc = 0; + entry->length = entry->offset >> 44; + entry->flags = MAP_ENTRY_FLAG_NO_CRC | ((entry->length == hunkbytes) ? V34_MAP_ENTRY_TYPE_UNCOMPRESSED : V34_MAP_ENTRY_TYPE_COMPRESSED); +#ifdef __MWERKS__ + entry->offset = entry->offset & 0x00000FFFFFFFFFFFLL; +#else + entry->offset = (entry->offset << 20) >> 20; +#endif +} + +/*************************************************************************** + CHD FILE MANAGEMENT +***************************************************************************/ + +/*------------------------------------------------- + chd_open_file - open a CHD file for access +-------------------------------------------------*/ + +chd_error chd_open_file(RFILE *file, int mode, chd_file *parent, chd_file **chd) +{ + chd_file *newchd = NULL; + chd_error err; + int intfnum; + + /* verify parameters */ + if (file == NULL) + EARLY_EXIT(err = CHDERR_INVALID_PARAMETER); + + /* punt if invalid parent */ + if (parent != NULL && parent->cookie != COOKIE_VALUE) + EARLY_EXIT(err = CHDERR_INVALID_PARAMETER); + + /* allocate memory for the final result */ + newchd = (chd_file *)malloc(sizeof(**chd)); + if (newchd == NULL) + EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); + memset(newchd, 0, sizeof(*newchd)); + newchd->cookie = COOKIE_VALUE; + newchd->parent = parent; + newchd->file = file; + + /* now attempt to read the header */ + err = header_read(newchd, &newchd->header); + if (err != CHDERR_NONE) + EARLY_EXIT(err); + + /* validate the header */ + err = header_validate(&newchd->header); + if (err != CHDERR_NONE) + EARLY_EXIT(err); + + /* make sure we don't open a read-only file writeable */ + if (mode == CHD_OPEN_READWRITE && !(newchd->header.flags & CHDFLAGS_IS_WRITEABLE)) + EARLY_EXIT(err = CHDERR_FILE_NOT_WRITEABLE); + + /* also, never open an older version writeable */ + if (mode == CHD_OPEN_READWRITE && newchd->header.version < CHD_HEADER_VERSION) + EARLY_EXIT(err = CHDERR_UNSUPPORTED_VERSION); + + /* if we need a parent, make sure we have one */ + if (parent == NULL && (newchd->header.flags & CHDFLAGS_HAS_PARENT)) + EARLY_EXIT(err = CHDERR_REQUIRES_PARENT); + + /* make sure we have a valid parent */ + if (parent != NULL) + { + /* check MD5 if it isn't empty */ + if (memcmp(nullmd5, newchd->header.parentmd5, sizeof(newchd->header.parentmd5)) != 0 && + memcmp(nullmd5, newchd->parent->header.md5, sizeof(newchd->parent->header.md5)) != 0 && + memcmp(newchd->parent->header.md5, newchd->header.parentmd5, sizeof(newchd->header.parentmd5)) != 0) + EARLY_EXIT(err = CHDERR_INVALID_PARENT); + + /* check SHA1 if it isn't empty */ + if (memcmp(nullsha1, newchd->header.parentsha1, sizeof(newchd->header.parentsha1)) != 0 && + memcmp(nullsha1, newchd->parent->header.sha1, sizeof(newchd->parent->header.sha1)) != 0 && + memcmp(newchd->parent->header.sha1, newchd->header.parentsha1, sizeof(newchd->header.parentsha1)) != 0) + EARLY_EXIT(err = CHDERR_INVALID_PARENT); + } + + /* now read the hunk map */ + if (newchd->header.version < 5) + { + err = map_read(newchd); + } + else + { + err = decompress_v5_map(newchd, &(newchd->header)); + } + if (err != CHDERR_NONE) + EARLY_EXIT(err); + +#ifdef NEED_CACHE_HUNK + /* allocate and init the hunk cache */ + newchd->cache = (UINT8 *)malloc(newchd->header.hunkbytes); + newchd->compare = (UINT8 *)malloc(newchd->header.hunkbytes); + if (newchd->cache == NULL || newchd->compare == NULL) + EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); + newchd->cachehunk = ~0; + newchd->comparehunk = ~0; +#endif + + /* allocate the temporary compressed buffer */ + newchd->compressed = (UINT8 *)malloc(newchd->header.hunkbytes); + if (newchd->compressed == NULL) + EARLY_EXIT(err = CHDERR_OUT_OF_MEMORY); + + /* find the codec interface */ + if (newchd->header.version < 5) + { + for (intfnum = 0; intfnum < ARRAY_SIZE(codec_interfaces); intfnum++) + if (codec_interfaces[intfnum].compression == newchd->header.compression[0]) + { + newchd->codecintf[0] = &codec_interfaces[intfnum]; + break; + } + if (intfnum == ARRAY_SIZE(codec_interfaces)) + EARLY_EXIT(err = CHDERR_UNSUPPORTED_FORMAT); + +#ifdef HAVE_ZLIB + /* initialize the codec */ + if (newchd->codecintf[0]->init != NULL) + { + err = (*newchd->codecintf[0]->init)(&newchd->zlib_codec_data, newchd->header.hunkbytes); + (void)err; + } +#endif + } + else + { + int i, decompnum; + /* verify the compression types and initialize the codecs */ + for (decompnum = 0; decompnum < ARRAY_SIZE(newchd->header.compression); decompnum++) + { + for (i = 0 ; i < ARRAY_SIZE(codec_interfaces) ; i++) + { + if (codec_interfaces[i].compression == newchd->header.compression[decompnum]) + { + newchd->codecintf[decompnum] = &codec_interfaces[i]; + if (newchd->codecintf[decompnum] == NULL && newchd->header.compression[decompnum] != 0) + { + err = CHDERR_UNSUPPORTED_FORMAT; + (void)err; + } + + /* initialize the codec */ + if (newchd->codecintf[decompnum]->init != NULL) + { + void* codec = NULL; + switch (newchd->header.compression[decompnum]) + { + case CHD_CODEC_ZLIB: +#ifdef HAVE_ZLIB + codec = &newchd->zlib_codec_data; +#endif + break; + + case CHD_CODEC_CD_ZLIB: +#ifdef HAVE_ZLIB + codec = &newchd->cdzl_codec_data; +#endif + break; + + case CHD_CODEC_CD_LZMA: +#ifdef HAVE_7ZIP + codec = &newchd->cdlz_codec_data; +#endif + break; + + case CHD_CODEC_CD_FLAC: +#ifdef HAVE_FLAC + codec = &newchd->cdfl_codec_data; +#endif + break; + } + if (codec != NULL) + { + err = (*newchd->codecintf[decompnum]->init)(codec, newchd->header.hunkbytes); + (void)err; + } + } + + } + } + } + } + +#if 0 + /* HACK */ + if (err != CHDERR_NONE) + EARLY_EXIT(err); +#endif + + /* all done */ + *chd = newchd; + return CHDERR_NONE; + +cleanup: + if (newchd != NULL) + chd_close(newchd); + return err; +} + +/*------------------------------------------------- + chd_precache - precache underlying file in + memory +-------------------------------------------------*/ + +chd_error chd_precache(chd_file *chd) +{ + int64_t size, count; + + if (!chd->file_cache) + { + filestream_seek(chd->file, 0, SEEK_END); + size = filestream_tell(chd->file); + if (size <= 0) + return CHDERR_INVALID_DATA; + chd->file_cache = (UINT8*)malloc(size); + if (chd->file_cache == NULL) + return CHDERR_OUT_OF_MEMORY; + filestream_seek(chd->file, 0, SEEK_SET); + count = filestream_read(chd->file, chd->file_cache, size); + if (count != size) + { + free(chd->file_cache); + chd->file_cache = NULL; + return CHDERR_READ_ERROR; + } + } + + return CHDERR_NONE; +} + + +/*------------------------------------------------- + chd_open - open a CHD file by + filename +-------------------------------------------------*/ + +chd_error chd_open(const char *filename, int mode, chd_file *parent, chd_file **chd) +{ + chd_error err; + RFILE *file = NULL; + + /* choose the proper mode */ + switch(mode) + { + case CHD_OPEN_READ: + break; + + default: + err = CHDERR_INVALID_PARAMETER; + goto cleanup; + } + + /* open the file */ + file = filestream_open(filename, + RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + if (!file) + { + err = CHDERR_FILE_NOT_FOUND; + goto cleanup; + } + + /* now open the CHD */ + err = chd_open_file(file, mode, parent, chd); + if (err != CHDERR_NONE) + goto cleanup; + + /* we now own this file */ + (*chd)->owns_file = TRUE; + +cleanup: + if ((err != CHDERR_NONE) && (file != NULL)) + filestream_close(file); + return err; +} + +/*------------------------------------------------- + chd_close - close a CHD file for access +-------------------------------------------------*/ + +void chd_close(chd_file *chd) +{ + /* punt if NULL or invalid */ + if (chd == NULL || chd->cookie != COOKIE_VALUE) + return; + + /* deinit the codec */ + if (chd->header.version < 5) + { +#ifdef HAVE_ZLIB + if (chd->codecintf[0] != NULL && chd->codecintf[0]->free != NULL) + (*chd->codecintf[0]->free)(&chd->zlib_codec_data); +#endif + } + else + { + int i; + /* Free the codecs */ + for (i = 0 ; i < 4 ; i++) + { + void* codec = NULL; + if (!chd->codecintf[i]) + continue; + + switch (chd->codecintf[i]->compression) + { + case CHD_CODEC_CD_LZMA: +#ifdef HAVE_7ZIP + codec = &chd->cdlz_codec_data; +#endif + break; + + case CHD_CODEC_ZLIB: +#ifdef HAVE_ZLIB + codec = &chd->zlib_codec_data; +#endif + break; + + case CHD_CODEC_CD_ZLIB: +#ifdef HAVE_ZLIB + codec = &chd->cdzl_codec_data; +#endif + break; + + case CHD_CODEC_CD_FLAC: +#ifdef HAVE_FLAC + codec = &chd->cdfl_codec_data; +#endif + break; + } + if (codec) + (*chd->codecintf[i]->free)(codec); + } + + /* Free the raw map */ + if (chd->header.rawmap != NULL) + free(chd->header.rawmap); + } + + /* free the compressed data buffer */ + if (chd->compressed != NULL) + free(chd->compressed); + +#ifdef NEED_CACHE_HUNK + /* free the hunk cache and compare data */ + if (chd->compare != NULL) + free(chd->compare); + if (chd->cache != NULL) + free(chd->cache); +#endif + + /* free the hunk map */ + if (chd->map != NULL) + free(chd->map); + + /* close the file */ + if (chd->owns_file && chd->file != NULL) + filestream_close(chd->file); + +#ifdef NEED_CACHE_HUNK + if (PRINTF_MAX_HUNK) printf("Max hunk = %d/%d\n", chd->maxhunk, chd->header.totalhunks); +#endif + + if (chd->file_cache) + free(chd->file_cache); + + /* free our memory */ + free(chd); +} + +/*------------------------------------------------- + chd_core_file - return the associated + core_file +-------------------------------------------------*/ + +RFILE *chd_core_file(chd_file *chd) +{ + return chd->file; +} + +/*------------------------------------------------- + chd_error_string - return an error string for + the given CHD error +-------------------------------------------------*/ + +const char *chd_error_string(chd_error err) +{ + switch (err) + { + case CHDERR_NONE: return "no error"; + case CHDERR_NO_INTERFACE: return "no drive interface"; + case CHDERR_OUT_OF_MEMORY: return "out of memory"; + case CHDERR_INVALID_FILE: return "invalid file"; + case CHDERR_INVALID_PARAMETER: return "invalid parameter"; + case CHDERR_INVALID_DATA: return "invalid data"; + case CHDERR_FILE_NOT_FOUND: return "file not found"; + case CHDERR_REQUIRES_PARENT: return "requires parent"; + case CHDERR_FILE_NOT_WRITEABLE: return "file not writeable"; + case CHDERR_READ_ERROR: return "read error"; + case CHDERR_WRITE_ERROR: return "write error"; + case CHDERR_CODEC_ERROR: return "codec error"; + case CHDERR_INVALID_PARENT: return "invalid parent"; + case CHDERR_HUNK_OUT_OF_RANGE: return "hunk out of range"; + case CHDERR_DECOMPRESSION_ERROR: return "decompression error"; + case CHDERR_COMPRESSION_ERROR: return "compression error"; + case CHDERR_CANT_CREATE_FILE: return "can't create file"; + case CHDERR_CANT_VERIFY: return "can't verify file"; + case CHDERR_NOT_SUPPORTED: return "operation not supported"; + case CHDERR_METADATA_NOT_FOUND: return "can't find metadata"; + case CHDERR_INVALID_METADATA_SIZE: return "invalid metadata size"; + case CHDERR_UNSUPPORTED_VERSION: return "unsupported CHD version"; + case CHDERR_VERIFY_INCOMPLETE: return "incomplete verify"; + case CHDERR_INVALID_METADATA: return "invalid metadata"; + case CHDERR_INVALID_STATE: return "invalid state"; + case CHDERR_OPERATION_PENDING: return "operation pending"; + case CHDERR_NO_ASYNC_OPERATION: return "no async operation in progress"; + case CHDERR_UNSUPPORTED_FORMAT: return "unsupported format"; + default: return "undocumented error"; + } +} + +/*************************************************************************** + CHD HEADER MANAGEMENT +***************************************************************************/ + +/*------------------------------------------------- + chd_get_header - return a pointer to the + extracted header data +-------------------------------------------------*/ + +const chd_header *chd_get_header(chd_file *chd) +{ + /* punt if NULL or invalid */ + if (chd == NULL || chd->cookie != COOKIE_VALUE) + return NULL; + + return &chd->header; +} + +/*************************************************************************** + CORE DATA READ/WRITE +***************************************************************************/ + +/*------------------------------------------------- + chd_read - read a single hunk from the CHD + file +-------------------------------------------------*/ + +chd_error chd_read(chd_file *chd, UINT32 hunknum, void *buffer) +{ + /* punt if NULL or invalid */ + if (chd == NULL || chd->cookie != COOKIE_VALUE) + return CHDERR_INVALID_PARAMETER; + + /* perform the read */ + return hunk_read_into_memory(chd, hunknum, (UINT8 *)buffer); +} + +/*************************************************************************** + METADATA MANAGEMENT +***************************************************************************/ + +/*------------------------------------------------- + chd_get_metadata - get the indexed metadata + of the given type +-------------------------------------------------*/ + +chd_error chd_get_metadata(chd_file *chd, UINT32 searchtag, UINT32 searchindex, void *output, UINT32 outputlen, UINT32 *resultlen, UINT32 *resulttag, UINT8 *resultflags) +{ + metadata_entry metaentry; + chd_error err; + int64_t count; + + /* if we didn't find it, just return */ + err = metadata_find_entry(chd, searchtag, searchindex, &metaentry); + if (err != CHDERR_NONE) + { + /* unless we're an old version and they are requesting hard disk metadata */ + if (chd->header.version < 3 && (searchtag == HARD_DISK_METADATA_TAG || searchtag == CHDMETATAG_WILDCARD) && searchindex == 0) + { + char faux_metadata[256]; + UINT32 faux_length; + + /* fill in the faux metadata */ + snprintf(faux_metadata, + sizeof(faux_metadata), + HARD_DISK_METADATA_FORMAT, + chd->header.obsolete_cylinders, + chd->header.obsolete_heads, + chd->header.obsolete_sectors, + chd->header.hunkbytes / chd->header.obsolete_hunksize); + faux_length = (UINT32)strlen(faux_metadata) + 1; + + /* copy the metadata itself */ + memcpy(output, faux_metadata, MIN(outputlen, faux_length)); + + /* return the length of the data and the tag */ + if (resultlen != NULL) + *resultlen = faux_length; + if (resulttag != NULL) + *resulttag = HARD_DISK_METADATA_TAG; + return CHDERR_NONE; + } + return err; + } + + /* read the metadata */ + outputlen = MIN(outputlen, metaentry.length); + filestream_seek(chd->file, metaentry.offset + METADATA_HEADER_SIZE, SEEK_SET); + count = filestream_read(chd->file, output, outputlen); + if (count != outputlen) + return CHDERR_READ_ERROR; + + /* return the length of the data and the tag */ + if (resultlen != NULL) + *resultlen = metaentry.length; + if (resulttag != NULL) + *resulttag = metaentry.metatag; + if (resultflags != NULL) + *resultflags = metaentry.flags; + return CHDERR_NONE; +} + +/*************************************************************************** + CODEC INTERFACES +***************************************************************************/ + +/*------------------------------------------------- + chd_codec_config - set internal codec + parameters +-------------------------------------------------*/ + +chd_error chd_codec_config(chd_file *chd, int param, void *config) +{ + return CHDERR_INVALID_PARAMETER; +} + +/*------------------------------------------------- + chd_get_codec_name - get the name of a + particular codec +-------------------------------------------------*/ + +const char *chd_get_codec_name(UINT32 codec) +{ + return "Unknown"; +} + +/*************************************************************************** + INTERNAL HEADER OPERATIONS +***************************************************************************/ + +/*------------------------------------------------- + header_validate - check the validity of a + CHD header +-------------------------------------------------*/ + +static chd_error header_validate(const chd_header *header) +{ + int intfnum; + + /* require a valid version */ + if (header->version == 0 || header->version > CHD_HEADER_VERSION) + return CHDERR_UNSUPPORTED_VERSION; + + /* require a valid length */ + if ((header->version == 1 && header->length != CHD_V1_HEADER_SIZE) || + (header->version == 2 && header->length != CHD_V2_HEADER_SIZE) || + (header->version == 3 && header->length != CHD_V3_HEADER_SIZE) || + (header->version == 4 && header->length != CHD_V4_HEADER_SIZE) || + (header->version == 5 && header->length != CHD_V5_HEADER_SIZE)) + return CHDERR_INVALID_PARAMETER; + + /* Do not validate v5 header */ + if (header->version <= 4) + { + /* require valid flags */ + if (header->flags & CHDFLAGS_UNDEFINED) + return CHDERR_INVALID_PARAMETER; + + /* require a supported compression mechanism */ + for (intfnum = 0; intfnum < ARRAY_SIZE(codec_interfaces); intfnum++) + if (codec_interfaces[intfnum].compression == header->compression[0]) + break; + + if (intfnum == ARRAY_SIZE(codec_interfaces)) + return CHDERR_INVALID_PARAMETER; + + /* require a valid hunksize */ + if (header->hunkbytes == 0 || header->hunkbytes >= 65536 * 256) + return CHDERR_INVALID_PARAMETER; + + /* require a valid hunk count */ + if (header->totalhunks == 0) + return CHDERR_INVALID_PARAMETER; + + /* require a valid MD5 and/or SHA1 if we're using a parent */ + if ((header->flags & CHDFLAGS_HAS_PARENT) && memcmp(header->parentmd5, nullmd5, sizeof(nullmd5)) == 0 && memcmp(header->parentsha1, nullsha1, sizeof(nullsha1)) == 0) + return CHDERR_INVALID_PARAMETER; + + /* if we're V3 or later, the obsolete fields must be 0 */ + if (header->version >= 3 && + (header->obsolete_cylinders != 0 || header->obsolete_sectors != 0 || + header->obsolete_heads != 0 || header->obsolete_hunksize != 0)) + return CHDERR_INVALID_PARAMETER; + + /* if we're pre-V3, the obsolete fields must NOT be 0 */ + if (header->version < 3 && + (header->obsolete_cylinders == 0 || header->obsolete_sectors == 0 || + header->obsolete_heads == 0 || header->obsolete_hunksize == 0)) + return CHDERR_INVALID_PARAMETER; + } + + return CHDERR_NONE; +} + +/*------------------------------------------------- + header_guess_unitbytes - for older CHD formats, + guess at the bytes/unit based on metadata +-------------------------------------------------*/ + +static UINT32 header_guess_unitbytes(chd_file *chd) +{ + /* look for hard disk metadata; if found, then the unit size == sector size */ + char metadata[512]; + unsigned int i0, i1, i2, i3; + if (chd_get_metadata(chd, HARD_DISK_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE && + sscanf(metadata, HARD_DISK_METADATA_FORMAT, &i0, &i1, &i2, &i3) == 4) + return i3; + + /* look for CD-ROM metadata; if found, then the unit size == CD frame size */ + if (chd_get_metadata(chd, CDROM_OLD_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE || + chd_get_metadata(chd, CDROM_TRACK_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE || + chd_get_metadata(chd, CDROM_TRACK_METADATA2_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE || + chd_get_metadata(chd, GDROM_OLD_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE || + chd_get_metadata(chd, GDROM_TRACK_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL) == CHDERR_NONE) + return CD_FRAME_SIZE; + + /* otherwise, just map 1:1 with the hunk size */ + return chd->header.hunkbytes; +} + +/*------------------------------------------------- + header_read - read a CHD header into the + internal data structure +-------------------------------------------------*/ + +static chd_error header_read(chd_file *chd, chd_header *header) +{ + UINT8 rawheader[CHD_MAX_HEADER_SIZE]; + int64_t count; + + /* punt if NULL */ + if (header == NULL) + return CHDERR_INVALID_PARAMETER; + + /* punt if invalid file */ + if (chd->file == NULL) + return CHDERR_INVALID_FILE; + + /* seek and read */ + filestream_seek(chd->file, 0, SEEK_SET); + count = filestream_read(chd->file, rawheader, sizeof(rawheader)); + if (count != sizeof(rawheader)) + return CHDERR_READ_ERROR; + + /* verify the tag */ + if (strncmp((char *)rawheader, "MComprHD", 8) != 0) + return CHDERR_INVALID_DATA; + + /* extract the direct data */ + memset(header, 0, sizeof(*header)); + header->length = get_bigendian_uint32(&rawheader[8]); + header->version = get_bigendian_uint32(&rawheader[12]); + + /* make sure it's a version we understand */ + if (header->version == 0 || header->version > CHD_HEADER_VERSION) + return CHDERR_UNSUPPORTED_VERSION; + + /* make sure the length is expected */ + if ((header->version == 1 && header->length != CHD_V1_HEADER_SIZE) || + (header->version == 2 && header->length != CHD_V2_HEADER_SIZE) || + (header->version == 3 && header->length != CHD_V3_HEADER_SIZE) || + (header->version == 4 && header->length != CHD_V4_HEADER_SIZE) || + (header->version == 5 && header->length != CHD_V5_HEADER_SIZE)) + + return CHDERR_INVALID_DATA; + + /* extract the common data */ + header->flags = get_bigendian_uint32(&rawheader[16]); + header->compression[0] = get_bigendian_uint32(&rawheader[20]); + + /* extract the V1/V2-specific data */ + if (header->version < 3) + { + int seclen = (header->version == 1) ? CHD_V1_SECTOR_SIZE : get_bigendian_uint32(&rawheader[76]); + header->obsolete_hunksize = get_bigendian_uint32(&rawheader[24]); + header->totalhunks = get_bigendian_uint32(&rawheader[28]); + header->obsolete_cylinders = get_bigendian_uint32(&rawheader[32]); + header->obsolete_heads = get_bigendian_uint32(&rawheader[36]); + header->obsolete_sectors = get_bigendian_uint32(&rawheader[40]); + memcpy(header->md5, &rawheader[44], CHD_MD5_BYTES); + memcpy(header->parentmd5, &rawheader[60], CHD_MD5_BYTES); + header->logicalbytes = (UINT64)header->obsolete_cylinders * (UINT64)header->obsolete_heads * (UINT64)header->obsolete_sectors * (UINT64)seclen; + header->hunkbytes = seclen * header->obsolete_hunksize; + header->unitbytes = header_guess_unitbytes(chd); + header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; + header->metaoffset = 0; + } + + /* extract the V3-specific data */ + else if (header->version == 3) + { + header->totalhunks = get_bigendian_uint32(&rawheader[24]); + header->logicalbytes = get_bigendian_uint64(&rawheader[28]); + header->metaoffset = get_bigendian_uint64(&rawheader[36]); + memcpy(header->md5, &rawheader[44], CHD_MD5_BYTES); + memcpy(header->parentmd5, &rawheader[60], CHD_MD5_BYTES); + header->hunkbytes = get_bigendian_uint32(&rawheader[76]); + header->unitbytes = header_guess_unitbytes(chd); + header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; + memcpy(header->sha1, &rawheader[80], CHD_SHA1_BYTES); + memcpy(header->parentsha1, &rawheader[100], CHD_SHA1_BYTES); + } + + /* extract the V4-specific data */ + else if (header->version == 4) + { + header->totalhunks = get_bigendian_uint32(&rawheader[24]); + header->logicalbytes = get_bigendian_uint64(&rawheader[28]); + header->metaoffset = get_bigendian_uint64(&rawheader[36]); + header->hunkbytes = get_bigendian_uint32(&rawheader[44]); + header->unitbytes = header_guess_unitbytes(chd); + header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; + memcpy(header->sha1, &rawheader[48], CHD_SHA1_BYTES); + memcpy(header->parentsha1, &rawheader[68], CHD_SHA1_BYTES); + memcpy(header->rawsha1, &rawheader[88], CHD_SHA1_BYTES); + } + + /* extract the V5-specific data */ + else if (header->version == 5) + { + /* TODO */ + header->compression[0] = get_bigendian_uint32(&rawheader[16]); + header->compression[1] = get_bigendian_uint32(&rawheader[20]); + header->compression[2] = get_bigendian_uint32(&rawheader[24]); + header->compression[3] = get_bigendian_uint32(&rawheader[28]); + header->logicalbytes = get_bigendian_uint64(&rawheader[32]); + header->mapoffset = get_bigendian_uint64(&rawheader[40]); + header->metaoffset = get_bigendian_uint64(&rawheader[48]); + header->hunkbytes = get_bigendian_uint32(&rawheader[56]); + header->hunkcount = (UINT32)((header->logicalbytes + header->hunkbytes - 1) / header->hunkbytes); + header->unitbytes = get_bigendian_uint32(&rawheader[60]); + header->unitcount = (header->logicalbytes + header->unitbytes - 1) / header->unitbytes; + memcpy(header->sha1, &rawheader[84], CHD_SHA1_BYTES); + memcpy(header->parentsha1, &rawheader[104], CHD_SHA1_BYTES); + memcpy(header->rawsha1, &rawheader[64], CHD_SHA1_BYTES); + + /* determine properties of map entries */ + header->mapentrybytes = 12; /* TODO compressed() ? 12 : 4; */ + + /* hack */ + header->totalhunks = header->hunkcount; + } + + /* Unknown version */ + else + { + /* TODO */ + } + + /* guess it worked */ + return CHDERR_NONE; +} + +/*************************************************************************** + INTERNAL HUNK READ/WRITE +***************************************************************************/ + +#ifdef NEED_CACHE_HUNK +/*------------------------------------------------- + hunk_read_into_cache - read a hunk into + the CHD's hunk cache +-------------------------------------------------*/ + +static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum) +{ + chd_error err; + + /* track the max */ + if (hunknum > chd->maxhunk) + chd->maxhunk = hunknum; + + /* if we're already in the cache, we're done */ + if (chd->cachehunk == hunknum) + return CHDERR_NONE; + chd->cachehunk = ~0; + + /* otherwise, read the data */ + err = hunk_read_into_memory(chd, hunknum, chd->cache); + if (err != CHDERR_NONE) + return err; + + /* mark the hunk successfully cached in */ + chd->cachehunk = hunknum; + return CHDERR_NONE; +} +#endif + +/*------------------------------------------------- + hunk_read_compressed - read a compressed + hunk +-------------------------------------------------*/ + +static UINT8* hunk_read_compressed(chd_file *chd, UINT64 offset, size_t size) +{ + int64_t bytes; + if (chd->file_cache) + return chd->file_cache + offset; + filestream_seek(chd->file, offset, SEEK_SET); + bytes = filestream_read(chd->file, chd->compressed, size); + if (bytes != size) + return NULL; + return chd->compressed; +} + +/*------------------------------------------------- + hunk_read_uncompressed - read an uncompressed + hunk +-------------------------------------------------*/ + +static chd_error hunk_read_uncompressed(chd_file *chd, UINT64 offset, size_t size, UINT8 *dest) +{ + int64_t bytes; + if (chd->file_cache) + { + memcpy(dest, chd->file_cache + offset, size); + return CHDERR_NONE; + } + filestream_seek(chd->file, offset, SEEK_SET); + bytes = filestream_read(chd->file, dest, size); + if (bytes != size) + return CHDERR_READ_ERROR; + return CHDERR_NONE; +} + +/*------------------------------------------------- + hunk_read_into_memory - read a hunk into + memory at the given location +-------------------------------------------------*/ + +static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest) +{ + chd_error err; + + /* punt if no file */ + if (chd->file == NULL) + return CHDERR_INVALID_FILE; + + /* return an error if out of range */ + if (hunknum >= chd->header.totalhunks) + return CHDERR_HUNK_OUT_OF_RANGE; + + if (dest == NULL) + return CHDERR_INVALID_PARAMETER; + + if (chd->header.version < 5) + { + map_entry *entry = &chd->map[hunknum]; + UINT32 bytes; + UINT8* compressed_bytes; + + /* switch off the entry type */ + switch (entry->flags & MAP_ENTRY_FLAG_TYPE_MASK) + { + /* compressed data */ + case V34_MAP_ENTRY_TYPE_COMPRESSED: + { + /* read it into the decompression buffer */ + + void *codec; + compressed_bytes = hunk_read_compressed(chd, entry->offset, + entry->length); + if (compressed_bytes == NULL) + return CHDERR_READ_ERROR; + +#ifdef HAVE_ZLIB + /* now decompress using the codec */ + err = CHDERR_NONE; + codec = &chd->zlib_codec_data; + if (chd->codecintf[0]->decompress != NULL) + err = (*chd->codecintf[0]->decompress)(codec, compressed_bytes, entry->length, dest, chd->header.hunkbytes); + if (err != CHDERR_NONE) + return err; +#endif + } + break; + + /* uncompressed data */ + case V34_MAP_ENTRY_TYPE_UNCOMPRESSED: + err = hunk_read_uncompressed(chd, entry->offset, chd->header.hunkbytes, dest); + if (err != CHDERR_NONE) + return err; + break; + + /* mini-compressed data */ + case V34_MAP_ENTRY_TYPE_MINI: + put_bigendian_uint64(&dest[0], entry->offset); + for (bytes = 8; bytes < chd->header.hunkbytes; bytes++) + dest[bytes] = dest[bytes - 8]; + break; + + /* self-referenced data */ + case V34_MAP_ENTRY_TYPE_SELF_HUNK: +#ifdef NEED_CACHE_HUNK + if (chd->cachehunk == entry->offset && dest == chd->cache) + break; +#endif + return hunk_read_into_memory(chd, (UINT32)entry->offset, dest); + + /* parent-referenced data */ + case V34_MAP_ENTRY_TYPE_PARENT_HUNK: + err = hunk_read_into_memory(chd->parent, (UINT32)entry->offset, dest); + if (err != CHDERR_NONE) + return err; + break; + } + return CHDERR_NONE; + } + else + { + void* codec = NULL; + /* get a pointer to the map entry */ + uint64_t blockoffs; + uint32_t blocklen; +#ifdef VERIFY_BLOCK_CRC + uint16_t blockcrc; +#endif + uint8_t *rawmap = &chd->header.rawmap[chd->header.mapentrybytes * hunknum]; + UINT8 *compressed_bytes; + +#if 0 + /* uncompressed case - TODO */ + if (!compressed()) + { + blockoffs = uint64_t(be_read(rawmap, 4)) * uint64_t(m_hunkbytes); + if (blockoffs != 0) + file_read(blockoffs, dest, m_hunkbytes); + else if (m_parent_missing) + throw CHDERR_REQUIRES_PARENT; + else if (m_parent != nullptr) + m_parent->read_hunk(hunknum, dest); + else + memset(dest, 0, m_hunkbytes); + return CHDERR_NONE; + } +#endif + + /* compressed case */ + blocklen = get_bigendian_uint24(&rawmap[1]); + blockoffs = get_bigendian_uint48(&rawmap[4]); +#ifdef VERIFY_BLOCK_CRC + blockcrc = get_bigendian_uint16(&rawmap[10]); +#endif + switch (rawmap[0]) + { + case COMPRESSION_TYPE_0: + case COMPRESSION_TYPE_1: + case COMPRESSION_TYPE_2: + case COMPRESSION_TYPE_3: + compressed_bytes = hunk_read_compressed(chd, blockoffs, blocklen); + if (compressed_bytes == NULL) + return CHDERR_READ_ERROR; + if (!chd->codecintf[rawmap[0]]) + return CHDERR_UNSUPPORTED_FORMAT; + switch (chd->codecintf[rawmap[0]]->compression) + { + case CHD_CODEC_CD_LZMA: +#ifdef HAVE_7ZIP + codec = &chd->cdlz_codec_data; +#endif + break; + + case CHD_CODEC_ZLIB: +#ifdef HAVE_ZLIB + codec = &chd->zlib_codec_data; +#endif + break; + + case CHD_CODEC_CD_ZLIB: +#ifdef HAVE_ZLIB + codec = &chd->cdzl_codec_data; +#endif + break; + + case CHD_CODEC_CD_FLAC: +#ifdef HAVE_FLAC + codec = &chd->cdfl_codec_data; +#endif + break; + } + if (codec==NULL) + return CHDERR_CODEC_ERROR; + err = (*chd->codecintf[rawmap[0]]->decompress)(codec, compressed_bytes, blocklen, dest, chd->header.hunkbytes); + if (err != CHDERR_NONE) + return err; +#ifdef VERIFY_BLOCK_CRC + if (crc16(dest, chd->header.hunkbytes) != blockcrc) + return CHDERR_DECOMPRESSION_ERROR; +#endif + return CHDERR_NONE; + + case COMPRESSION_NONE: + err = hunk_read_uncompressed(chd, blockoffs, blocklen, dest); + if (err != CHDERR_NONE) + return err; +#ifdef VERIFY_BLOCK_CRC + if (crc16(dest, chd->header.hunkbytes) != blockcrc) + return CHDERR_DECOMPRESSION_ERROR; +#endif + return CHDERR_NONE; + + case COMPRESSION_SELF: + return hunk_read_into_memory(chd, (UINT32)blockoffs, dest); + + case COMPRESSION_PARENT: +#if 0 + /* TODO */ + if (m_parent_missing) + return CHDERR_REQUIRES_PARENT; + return m_parent->read_bytes(uint64_t(blockoffs) * uint64_t(m_parent->unit_bytes()), dest, m_hunkbytes); +#endif + return CHDERR_DECOMPRESSION_ERROR; + } + return CHDERR_NONE; + } + + /* We should not reach this code */ + return CHDERR_DECOMPRESSION_ERROR; +} + +/*************************************************************************** + INTERNAL MAP ACCESS +***************************************************************************/ + +static size_t core_fsize(RFILE *f) +{ + int64_t rv, p = filestream_tell(f); + filestream_seek(f, 0, SEEK_END); + rv = filestream_tell(f); + filestream_seek(f, p, SEEK_SET); + return rv; +} + +/*------------------------------------------------- + map_read - read the initial sector map +-------------------------------------------------*/ + +static chd_error map_read(chd_file *chd) +{ + UINT32 entrysize = (chd->header.version < 3) ? OLD_MAP_ENTRY_SIZE : MAP_ENTRY_SIZE; + UINT8 raw_map_entries[MAP_STACK_ENTRIES * MAP_ENTRY_SIZE]; + UINT64 fileoffset, maxoffset = 0; + UINT8 cookie[MAP_ENTRY_SIZE]; + int64_t count; + chd_error err; + int i; + + /* first allocate memory */ + chd->map = (map_entry *)malloc(sizeof(chd->map[0]) * chd->header.totalhunks); + if (!chd->map) + return CHDERR_OUT_OF_MEMORY; + + /* read the map entries in in chunks and extract to the map list */ + fileoffset = chd->header.length; + for (i = 0; i < chd->header.totalhunks; i += MAP_STACK_ENTRIES) + { + /* compute how many entries this time */ + int entries = chd->header.totalhunks - i, j; + if (entries > MAP_STACK_ENTRIES) + entries = MAP_STACK_ENTRIES; + + /* read that many */ + filestream_seek(chd->file, fileoffset, SEEK_SET); + count = filestream_read(chd->file, raw_map_entries, entries * entrysize); + if (count != entries * entrysize) + { + err = CHDERR_READ_ERROR; + goto cleanup; + } + fileoffset += entries * entrysize; + + /* process that many */ + if (entrysize == MAP_ENTRY_SIZE) + { + for (j = 0; j < entries; j++) + map_extract(&raw_map_entries[j * MAP_ENTRY_SIZE], &chd->map[i + j]); + } + else + { + for (j = 0; j < entries; j++) + map_extract_old(&raw_map_entries[j * OLD_MAP_ENTRY_SIZE], &chd->map[i + j], chd->header.hunkbytes); + } + + /* track the maximum offset */ + for (j = 0; j < entries; j++) + if ((chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == V34_MAP_ENTRY_TYPE_COMPRESSED || + (chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == V34_MAP_ENTRY_TYPE_UNCOMPRESSED) + maxoffset = MAX(maxoffset, chd->map[i + j].offset + chd->map[i + j].length); + } + + /* verify the cookie */ + filestream_seek(chd->file, fileoffset, SEEK_SET); + count = filestream_read(chd->file, &cookie, entrysize); + if (count != entrysize || memcmp(&cookie, END_OF_LIST_COOKIE, entrysize)) + { + err = CHDERR_INVALID_FILE; + goto cleanup; + } + + /* verify the length */ + if (maxoffset > core_fsize(chd->file)) + { + err = CHDERR_INVALID_FILE; + goto cleanup; + } + return CHDERR_NONE; + +cleanup: + if (chd->map) + free(chd->map); + chd->map = NULL; + return err; +} + +/*************************************************************************** + INTERNAL METADATA ACCESS +***************************************************************************/ + +/*------------------------------------------------- + metadata_find_entry - find a metadata entry +-------------------------------------------------*/ + +static chd_error metadata_find_entry(chd_file *chd, UINT32 metatag, UINT32 metaindex, metadata_entry *metaentry) +{ + /* start at the beginning */ + metaentry->offset = chd->header.metaoffset; + metaentry->prev = 0; + + /* loop until we run out of options */ + while (metaentry->offset != 0) + { + UINT8 raw_meta_header[METADATA_HEADER_SIZE]; + int64_t count; + + /* read the raw header */ + filestream_seek(chd->file, metaentry->offset, SEEK_SET); + count = filestream_read(chd->file, raw_meta_header, sizeof(raw_meta_header)); + if (count != sizeof(raw_meta_header)) + break; + + /* extract the data */ + metaentry->metatag = get_bigendian_uint32(&raw_meta_header[0]); + metaentry->length = get_bigendian_uint32(&raw_meta_header[4]); + metaentry->next = get_bigendian_uint64(&raw_meta_header[8]); + + /* flags are encoded in the high byte of length */ + metaentry->flags = metaentry->length >> 24; + metaentry->length &= 0x00ffffff; + + /* if we got a match, proceed */ + if (metatag == CHDMETATAG_WILDCARD || metaentry->metatag == metatag) + if (metaindex-- == 0) + return CHDERR_NONE; + + /* no match, fetch the next link */ + metaentry->prev = metaentry->offset; + metaentry->offset = metaentry->next; + } + + /* if we get here, we didn't find it */ + return CHDERR_METADATA_NOT_FOUND; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_flac.c
Added
@@ -0,0 +1,324 @@ +/* license:BSD-3-Clause + * copyright-holders:Aaron Giles +*************************************************************************** + + flac.c + + FLAC compression wrappers + +***************************************************************************/ + +#include <assert.h> +#include <string.h> +#include <libchdr/flac.h> +#include <libchdr/minmax.h> +#include <retro_miscellaneous.h> + +/*************************************************************************** + * FLAC DECODER + *************************************************************************** + */ + +static FLAC__StreamDecoderReadStatus flac_decoder_read_callback_static(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +FLAC__StreamDecoderReadStatus flac_decoder_read_callback(void* client_data, FLAC__byte buffer[], size_t *bytes); +static void flac_decoder_metadata_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); +static FLAC__StreamDecoderTellStatus flac_decoder_tell_callback_static(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +static FLAC__StreamDecoderWriteStatus flac_decoder_write_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(void* client_data, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); +static void flac_decoder_error_callback_static(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +/*------------------------------------------------- + * flac_decoder - constructor + *------------------------------------------------- + */ + +void flac_decoder_init(flac_decoder *decoder) +{ + decoder->decoder = FLAC__stream_decoder_new(); + decoder->sample_rate = 0; + decoder->channels = 0; + decoder->bits_per_sample = 0; + decoder->compressed_offset = 0; + decoder->compressed_start = NULL; + decoder->compressed_length = 0; + decoder->compressed2_start = NULL; + decoder->compressed2_length = 0; + decoder->uncompressed_offset = 0; + decoder->uncompressed_length = 0; + decoder->uncompressed_swap = 0; +} + +/*------------------------------------------------- + * flac_decoder - destructor + *------------------------------------------------- + */ + +void flac_decoder_free(flac_decoder* decoder) +{ + if ((decoder != NULL) && (decoder->decoder != NULL)) + FLAC__stream_decoder_delete(decoder->decoder); +} + +/*------------------------------------------------- + * reset - reset state with the original + * parameters + *------------------------------------------------- + */ + +static int flac_decoder_internal_reset(flac_decoder* decoder) +{ + decoder->compressed_offset = 0; + if (FLAC__stream_decoder_init_stream(decoder->decoder, + &flac_decoder_read_callback_static, + NULL, + &flac_decoder_tell_callback_static, + NULL, + NULL, + &flac_decoder_write_callback_static, + &flac_decoder_metadata_callback_static, + &flac_decoder_error_callback_static, decoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + return 0; + return FLAC__stream_decoder_process_until_end_of_metadata(decoder->decoder); +} + +/*------------------------------------------------- + * reset - reset state with new memory parameters + * and a custom-generated header + *------------------------------------------------- + */ + +int flac_decoder_reset(flac_decoder* decoder, uint32_t sample_rate, uint8_t num_channels, uint32_t block_size, const void *buffer, uint32_t length) +{ + /* modify the template header with our parameters */ + static const uint8_t s_header_template[0x2a] = + { + 0x66, 0x4C, 0x61, 0x43, /* +00: 'fLaC' stream header */ + 0x80, /* +04: metadata block type 0 (STREAMINFO), */ + /* flagged as last block */ + 0x00, 0x00, 0x22, /* +05: metadata block length = 0x22 */ + 0x00, 0x00, /* +08: minimum block size */ + 0x00, 0x00, /* +0A: maximum block size */ + 0x00, 0x00, 0x00, /* +0C: minimum frame size (0 == unknown) */ + 0x00, 0x00, 0x00, /* +0F: maximum frame size (0 == unknown) */ + 0x0A, 0xC4, 0x42, 0xF0, 0x00, 0x00, 0x00, 0x00, /* +12: sample rate (0x0ac44 == 44100), */ + /* numchannels (2), sample bits (16), */ + /* samples in stream (0 == unknown) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* +1A: MD5 signature (0 == none) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* +2A: start of stream data */ + }; + memcpy(decoder->custom_header, s_header_template, sizeof(s_header_template)); + decoder->custom_header[0x08] = decoder->custom_header[0x0a] = block_size >> 8; + decoder->custom_header[0x09] = decoder->custom_header[0x0b] = block_size & 0xff; + decoder->custom_header[0x12] = sample_rate >> 12; + decoder->custom_header[0x13] = sample_rate >> 4; + decoder->custom_header[0x14] = (sample_rate << 4) | ((num_channels - 1) << 1); + + /* configure the header ahead of the provided buffer */ + decoder->compressed_start = (const FLAC__byte *)(decoder->custom_header); + decoder->compressed_length = sizeof(decoder->custom_header); + decoder->compressed2_start = (const FLAC__byte *)(buffer); + decoder->compressed2_length = length; + return flac_decoder_internal_reset(decoder); +} + +/*------------------------------------------------- + * decode_interleaved - decode to an interleaved + * sound stream + *------------------------------------------------- + */ + +int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uint32_t num_samples, int swap_endian) +{ + /* configure the uncompressed buffer */ + memset(decoder->uncompressed_start, 0, sizeof(decoder->uncompressed_start)); + decoder->uncompressed_start[0] = samples; + decoder->uncompressed_offset = 0; + decoder->uncompressed_length = num_samples; + decoder->uncompressed_swap = swap_endian; + + /* loop until we get everything we want */ + while (decoder->uncompressed_offset < decoder->uncompressed_length) + if (!FLAC__stream_decoder_process_single(decoder->decoder)) + return 0; + return 1; +} + +#if 0 +/*------------------------------------------------- + * decode - decode to an multiple independent + * data streams + *------------------------------------------------- + */ + +bool flac_decoder::decode(int16_t **samples, uint32_t num_samples, bool swap_endian) +{ + /* make sure we don't have too many channels */ + int chans = channels(); + if (chans > ARRAY_SIZE(m_uncompressed_start)) + return false; + + /* configure the uncompressed buffer */ + memset(m_uncompressed_start, 0, sizeof(m_uncompressed_start)); + for (int curchan = 0; curchan < chans; curchan++) + m_uncompressed_start[curchan] = samples[curchan]; + m_uncompressed_offset = 0; + m_uncompressed_length = num_samples; + m_uncompressed_swap = swap_endian; + + /* loop until we get everything we want */ + while (m_uncompressed_offset < m_uncompressed_length) + if (!FLAC__stream_decoder_process_single(m_decoder)) + return false; + return true; +} +#endif + +/*------------------------------------------------- + * finish - finish up the decode + *------------------------------------------------- + */ + +uint32_t flac_decoder_finish(flac_decoder* decoder) +{ + /* get the final decoding position and move forward */ + FLAC__uint64 position = 0; + FLAC__stream_decoder_get_decode_position(decoder->decoder, &position); + FLAC__stream_decoder_finish(decoder->decoder); + + /* adjust position if we provided the header */ + if (position == 0) + return 0; + if (decoder->compressed_start == (const FLAC__byte *)(decoder->custom_header)) + position -= decoder->compressed_length; + return (uint32_t)position; +} + +/*------------------------------------------------- + * read_callback - handle reads from the input + * stream + *------------------------------------------------- + */ + +FLAC__StreamDecoderReadStatus flac_decoder_read_callback_static(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + return flac_decoder_read_callback(client_data, buffer, bytes); +} + +FLAC__StreamDecoderReadStatus flac_decoder_read_callback(void* client_data, FLAC__byte buffer[], size_t *bytes) +{ + flac_decoder* decoder = (flac_decoder*)client_data; + + uint32_t expected = (uint32_t)*bytes; + + /* copy from primary buffer first */ + uint32_t outputpos = 0; + + if (outputpos < *bytes && decoder->compressed_offset < decoder->compressed_length) + { + uint32_t bytes_to_copy = (uint32_t)MIN(*bytes - outputpos, decoder->compressed_length - decoder->compressed_offset); + memcpy(&buffer[outputpos], decoder->compressed_start + decoder->compressed_offset, bytes_to_copy); + outputpos += bytes_to_copy; + decoder->compressed_offset += bytes_to_copy; + } + + /* once we're out of that, copy from the secondary buffer */ + if (outputpos < *bytes && decoder->compressed_offset < decoder->compressed_length + decoder->compressed2_length) + { + uint32_t bytes_to_copy = (uint32_t)MIN(*bytes - outputpos, decoder->compressed2_length - (decoder->compressed_offset - decoder->compressed_length)); + memcpy(&buffer[outputpos], decoder->compressed2_start + decoder->compressed_offset - decoder->compressed_length, bytes_to_copy); + outputpos += bytes_to_copy; + decoder->compressed_offset += bytes_to_copy; + } + *bytes = outputpos; + + /* return based on whether we ran out of data */ + return (*bytes < expected) ? FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM : FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + +/*------------------------------------------------- + * metadata_callback - handle STREAMINFO metadata + *------------------------------------------------- + */ + +void flac_decoder_metadata_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + flac_decoder *fldecoder; + /* ignore all but STREAMINFO metadata */ + if (metadata->type != FLAC__METADATA_TYPE_STREAMINFO) + return; + + /* parse out the data we care about */ + fldecoder = (flac_decoder *)(client_data); + fldecoder->sample_rate = metadata->data.stream_info.sample_rate; + fldecoder->bits_per_sample = metadata->data.stream_info.bits_per_sample; + fldecoder->channels = metadata->data.stream_info.channels; +} + +/*------------------------------------------------- + * tell_callback - handle requests to find out + * where in the input stream we are + *------------------------------------------------- + */ + +FLAC__StreamDecoderTellStatus flac_decoder_tell_callback_static(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + *absolute_byte_offset = ((flac_decoder *)client_data)->compressed_offset; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +} + +/*------------------------------------------------- + * write_callback - handle writes to the output + * stream + *------------------------------------------------- + */ + +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback_static(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +{ + return flac_decoder_write_callback(client_data, frame, buffer); +} + +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(void *client_data, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) +{ + int sampnum, chan; + int shift, blocksize; + flac_decoder * decoder = (flac_decoder *)client_data; + + assert(frame->header.channels == decoder->channels); + + /* interleaved case */ + shift = decoder->uncompressed_swap ? 8 : 0; + blocksize = frame->header.blocksize; + if (decoder->uncompressed_start[1] == NULL) + { + int16_t *dest = decoder->uncompressed_start[0] + decoder->uncompressed_offset * frame->header.channels; + for (sampnum = 0; sampnum < blocksize && decoder->uncompressed_offset < decoder->uncompressed_length; sampnum++, decoder->uncompressed_offset++) + for (chan = 0; chan < frame->header.channels; chan++) + *dest++ = (int16_t)((((uint16_t)buffer[chan][sampnum]) << shift) | (((uint16_t)buffer[chan][sampnum]) >> shift)); + } + + /* non-interleaved case */ + else + { + for (sampnum = 0; sampnum < blocksize && decoder->uncompressed_offset < decoder->uncompressed_length; sampnum++, decoder->uncompressed_offset++) + for (chan = 0; chan < frame->header.channels; chan++) + if (decoder->uncompressed_start[chan] != NULL) + decoder->uncompressed_start[chan][decoder->uncompressed_offset] = (int16_t) ( (((uint16_t)(buffer[chan][sampnum])) << shift) | ( ((uint16_t)(buffer[chan][sampnum])) >> shift) ); + } + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +/** + * @fn void flac_decoder::error_callback_static(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) + * + * @brief ------------------------------------------------- + * error_callback - handle errors (ignore them) + * -------------------------------------------------. + * + * @param decoder The decoder. + * @param status The status. + * @param [in,out] client_data If non-null, information describing the client. + */ + +void flac_decoder_error_callback_static(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_flac_codec.c
Added
@@ -0,0 +1,163 @@ +/*************************************************************************** + + libchdr_flac_codec.c + + MAME Compressed Hunks of Data file format + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <libchdr/chd.h> +#include <libchdr/minmax.h> +#include <libchdr/cdrom.h> +#include <libchdr/flac.h> +#include <libchdr/huffman.h> +#include <zlib.h> + +#include <retro_inline.h> +#include <streams/file_stream.h> + +#define TRUE 1 +#define FALSE 0 + +/*************************************************************************** + * CD FLAC DECOMPRESSOR + *************************************************************************** + */ + +/*------------------------------------------------------ + * cdfl_codec_blocksize - return the optimal block size + *------------------------------------------------------ + */ + +static uint32_t cdfl_codec_blocksize(uint32_t bytes) +{ + /* determine FLAC block size, which must be 16-65535 + * clamp to 2k since that's supposed to be the sweet spot */ + uint32_t hunkbytes = bytes / 4; + while (hunkbytes > 2048) + hunkbytes /= 2; + return hunkbytes; +} + +chd_error cdfl_codec_init(void *codec, uint32_t hunkbytes) +{ +#ifdef WANT_SUBCODE + chd_error ret; +#endif + uint16_t native_endian = 0; + cdfl_codec_data *cdfl = (cdfl_codec_data*)codec; + + /* make sure the CHD's hunk size is an even multiple of the frame size */ + if (hunkbytes % CD_FRAME_SIZE != 0) + return CHDERR_CODEC_ERROR; + + cdfl->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); + if (cdfl->buffer == NULL) + return CHDERR_OUT_OF_MEMORY; + + /* determine whether we want native or swapped samples */ + *(uint8_t *)(&native_endian) = 1; + cdfl->swap_endian = (native_endian & 1); + +#ifdef WANT_SUBCODE + /* init zlib inflater */ + ret = zlib_codec_init(&cdfl->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; +#endif + + /* flac decoder init */ + flac_decoder_init(&cdfl->decoder); + if (cdfl->decoder.decoder == NULL) + return CHDERR_OUT_OF_MEMORY; + + return CHDERR_NONE; +} + +void cdfl_codec_free(void *codec) +{ + cdfl_codec_data *cdfl = (cdfl_codec_data*)codec; + flac_decoder_free(&cdfl->decoder); +#ifdef WANT_SUBCODE + zlib_codec_free(&cdfl->subcode_decompressor); +#endif + if (cdfl->buffer) + free(cdfl->buffer); +} + +chd_error cdfl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + uint32_t framenum; + uint8_t *buffer; +#ifdef WANT_SUBCODE + uint32_t offset; + chd_error ret; +#endif + cdfl_codec_data *cdfl = (cdfl_codec_data*)codec; + + /* reset and decode */ + uint32_t frames = destlen / CD_FRAME_SIZE; + + if (!flac_decoder_reset(&cdfl->decoder, 44100, 2, cdfl_codec_blocksize(frames * CD_MAX_SECTOR_DATA), src, complen)) + return CHDERR_DECOMPRESSION_ERROR; + buffer = &cdfl->buffer[0]; + if (!flac_decoder_decode_interleaved(&cdfl->decoder, (int16_t *)(buffer), frames * CD_MAX_SECTOR_DATA/4, cdfl->swap_endian)) + return CHDERR_DECOMPRESSION_ERROR; + +#ifdef WANT_SUBCODE + /* inflate the subcode data */ + offset = flac_decoder_finish(&cdfl->decoder); + ret = zlib_codec_decompress(&cdfl->subcode_decompressor, src + offset, complen - offset, &cdfl->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); + if (ret != CHDERR_NONE) + return ret; +#else + flac_decoder_finish(&cdfl->decoder); +#endif + + /* reassemble the data */ + for (framenum = 0; framenum < frames; framenum++) + { + memcpy(&dest[framenum * CD_FRAME_SIZE], &cdfl->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdfl->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); +#endif + } + + return CHDERR_NONE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_huffman.c
Added
@@ -0,0 +1,563 @@ +/* license:BSD-3-Clause + * copyright-holders:Aaron Giles +**************************************************************************** + + huffman.c + + Static Huffman compression and decompression helpers. + +**************************************************************************** + + Maximum codelength is officially (alphabetsize - 1). This would be 255 bits + (since we use 1 byte values). However, it is also dependent upon the number + of samples used, as follows: + + 2 bits -> 3..4 samples + 3 bits -> 5..7 samples + 4 bits -> 8..12 samples + 5 bits -> 13..20 samples + 6 bits -> 21..33 samples + 7 bits -> 34..54 samples + 8 bits -> 55..88 samples + 9 bits -> 89..143 samples + 10 bits -> 144..232 samples + 11 bits -> 233..376 samples + 12 bits -> 377..609 samples + 13 bits -> 610..986 samples + 14 bits -> 987..1596 samples + 15 bits -> 1597..2583 samples + 16 bits -> 2584..4180 samples -> note that a 4k data size guarantees codelength <= 16 bits + 17 bits -> 4181..6764 samples + 18 bits -> 6765..10945 samples + 19 bits -> 10946..17710 samples + 20 bits -> 17711..28656 samples + 21 bits -> 28657..46367 samples + 22 bits -> 46368..75024 samples + 23 bits -> 75025..121392 samples + 24 bits -> 121393..196417 samples + 25 bits -> 196418..317810 samples + 26 bits -> 317811..514228 samples + 27 bits -> 514229..832039 samples + 28 bits -> 832040..1346268 samples + 29 bits -> 1346269..2178308 samples + 30 bits -> 2178309..3524577 samples + 31 bits -> 3524578..5702886 samples + 32 bits -> 5702887..9227464 samples + + Looking at it differently, here is where powers of 2 fall into these buckets: + + 256 samples -> 11 bits max + 512 samples -> 12 bits max + 1k samples -> 14 bits max + 2k samples -> 15 bits max + 4k samples -> 16 bits max + 8k samples -> 18 bits max + 16k samples -> 19 bits max + 32k samples -> 21 bits max + 64k samples -> 22 bits max + 128k samples -> 24 bits max + 256k samples -> 25 bits max + 512k samples -> 27 bits max + 1M samples -> 28 bits max + 2M samples -> 29 bits max + 4M samples -> 31 bits max + 8M samples -> 32 bits max + +**************************************************************************** + + Delta-RLE encoding works as follows: + + Starting value is assumed to be 0. All data is encoded as a delta + from the previous value, such that final[i] = final[i - 1] + delta. + Long runs of 0s are RLE-encoded as follows: + + 0x100 = repeat count of 8 + 0x101 = repeat count of 9 + 0x102 = repeat count of 10 + 0x103 = repeat count of 11 + 0x104 = repeat count of 12 + 0x105 = repeat count of 13 + 0x106 = repeat count of 14 + 0x107 = repeat count of 15 + 0x108 = repeat count of 16 + 0x109 = repeat count of 32 + 0x10a = repeat count of 64 + 0x10b = repeat count of 128 + 0x10c = repeat count of 256 + 0x10d = repeat count of 512 + 0x10e = repeat count of 1024 + 0x10f = repeat count of 2048 + + Note that repeat counts are reset at the end of a row, so if a 0 run + extends to the end of a row, a large repeat count may be used. + + The reason for starting the run counts at 8 is that 0 is expected to + be the most common symbol, and is typically encoded in 1 or 2 bits. + +***************************************************************************/ + +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> +#include <string.h> + +#include <libchdr/huffman.h> +#include <libchdr/minmax.h> + +/*************************************************************************** + * MACROS + *************************************************************************** + */ + +#define MAKE_LOOKUP(code,bits) (((code) << 5) | ((bits) & 0x1f)) + +/*************************************************************************** + * IMPLEMENTATION + *************************************************************************** + */ + +/*------------------------------------------------- + * huffman_context_base - create an encoding/ + * decoding context + *------------------------------------------------- + */ + +struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits) +{ + struct huffman_decoder* decoder; + /* limit to 24 bits */ + if (maxbits > 24) + return NULL; + + decoder = (struct huffman_decoder*)malloc(sizeof(struct huffman_decoder)); + decoder->numcodes = numcodes; + decoder->maxbits = maxbits; + decoder->lookup = (lookup_value*)malloc(sizeof(lookup_value) * (1 << maxbits)); + decoder->huffnode = (struct node_t*)malloc(sizeof(struct node_t) * numcodes); + decoder->datahisto = NULL; + decoder->prevdata = 0; + decoder->rleremaining = 0; + return decoder; +} + +void delete_huffman_decoder(struct huffman_decoder* decoder) +{ + if (decoder != NULL) + { + if (decoder->lookup != NULL) + free(decoder->lookup); + if (decoder->huffnode != NULL) + free(decoder->huffnode); + free(decoder); + } +} + +/*------------------------------------------------- + * decode_one - decode a single code from the + * huffman stream + *------------------------------------------------- + */ + +uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf) +{ + /* peek ahead to get maxbits worth of data */ + uint32_t bits = bitstream_peek(bitbuf, decoder->maxbits); + + /* look it up, then remove the actual number of bits for this code */ + lookup_value lookup = decoder->lookup[bits]; + bitstream_remove(bitbuf, lookup & 0x1f); + + /* return the value */ + return lookup >> 5; +} + +/*------------------------------------------------- + * import_tree_rle - import an RLE-encoded + * huffman tree from a source data stream + *------------------------------------------------- + */ + +enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf) +{ + enum huffman_error error; + /* bits per entry depends on the maxbits */ + int numbits; + int curnode; + if (decoder->maxbits >= 16) + numbits = 5; + else if (decoder->maxbits >= 8) + numbits = 4; + else + numbits = 3; + + /* loop until we read all the nodes */ + for (curnode = 0; curnode < decoder->numcodes; ) + { + /* a non-one value is just raw */ + int nodebits = bitstream_read(bitbuf, numbits); + if (nodebits != 1) + decoder->huffnode[curnode++].numbits = nodebits; + + /* a one value is an escape code */ + else + { + /* a double 1 is just a single 1 */ + nodebits = bitstream_read(bitbuf, numbits); + if (nodebits == 1) + decoder->huffnode[curnode++].numbits = nodebits; + + /* otherwise, we need one for value for the repeat count */ + else + { + int repcount = bitstream_read(bitbuf, numbits) + 3; + while (repcount--) + decoder->huffnode[curnode++].numbits = nodebits; + } + } + } + + /* make sure we ended up with the right number */ + if (curnode != decoder->numcodes) + return HUFFERR_INVALID_DATA; + + /* assign canonical codes for all nodes based on their code lengths */ + error = huffman_assign_canonical_codes(decoder); + if (error != HUFFERR_NONE) + return error; + + /* build the lookup table */ + huffman_build_lookup_table(decoder); + + /* determine final input length and report errors */ + return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE; +} + +/*------------------------------------------------- + * import_tree_huffman - import a huffman-encoded + * huffman tree from a source data stream + *------------------------------------------------- + */ + +enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf) +{ + int last = 0; + int curcode; + uint32_t temp; + enum huffman_error error; + uint8_t rlefullbits = 0; + int index, count = 0; + int start; + /* start by parsing the lengths for the small tree */ + struct huffman_decoder* smallhuff = create_huffman_decoder(24, 6); + + smallhuff->huffnode[0].numbits = bitstream_read(bitbuf, 3); + start = bitstream_read(bitbuf, 3) + 1; + + for (index = 1; index < 24; index++) + { + if (index < start || count == 7) + smallhuff->huffnode[index].numbits = 0; + else + { + count = bitstream_read(bitbuf, 3); + smallhuff->huffnode[index].numbits = (count == 7) ? 0 : count; + } + } + + /* then regenerate the tree */ + error = huffman_assign_canonical_codes(smallhuff); + if (error != HUFFERR_NONE) + return error; + huffman_build_lookup_table(smallhuff); + + /* determine the maximum length of an RLE count */ + temp = decoder->numcodes - 9; + while (temp != 0) + { + temp >>= 1; + rlefullbits++; + } + + /* now process the rest of the data */ + for (curcode = 0; curcode < decoder->numcodes; ) + { + int value = huffman_decode_one(smallhuff, bitbuf); + if (value != 0) + decoder->huffnode[curcode++].numbits = last = value - 1; + else + { + int count = bitstream_read(bitbuf, 3) + 2; + if (count == 7+2) + count += bitstream_read(bitbuf, rlefullbits); + for ( ; count != 0 && curcode < decoder->numcodes; count--) + decoder->huffnode[curcode++].numbits = last; + } + } + + /* make sure we ended up with the right number */ + if (curcode != decoder->numcodes) + { + delete_huffman_decoder(smallhuff); + return HUFFERR_INVALID_DATA; + } + + /* assign canonical codes for all nodes based on their code lengths */ + error = huffman_assign_canonical_codes(decoder); + if (error != HUFFERR_NONE) + { + delete_huffman_decoder(smallhuff); + return error; + } + + /* build the lookup table */ + huffman_build_lookup_table(decoder); + delete_huffman_decoder(smallhuff); + + /* determine final input length and report errors */ + return bitstream_overflow(bitbuf) ? HUFFERR_INPUT_BUFFER_TOO_SMALL : HUFFERR_NONE; +} + +/*------------------------------------------------- + * compute_tree_from_histo - common backend for + * computing a tree based on the data histogram + *------------------------------------------------- + */ + +enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder) +{ + /* compute the number of data items in the histogram */ + int i; + uint32_t upperweight; + uint32_t lowerweight = 0; + uint32_t sdatacount = 0; + for (i = 0; i < decoder->numcodes; i++) + sdatacount += decoder->datahisto[i]; + + /* binary search to achieve the optimum encoding */ + upperweight = sdatacount * 2; + + for (;;) + { + /* build a tree using the current weight */ + uint32_t curweight = (upperweight + lowerweight) / 2; + int curmaxbits = huffman_build_tree(decoder, sdatacount, curweight); + + /* apply binary search here */ + if (curmaxbits <= decoder->maxbits) + { + lowerweight = curweight; + + /* early out if it worked with the raw weights, or if we're done searching */ + if (curweight == sdatacount || (upperweight - lowerweight) <= 1) + break; + } + else + upperweight = curweight; + } + + /* assign canonical codes for all nodes based on their code lengths */ + return huffman_assign_canonical_codes(decoder); +} + +/*************************************************************************** + * INTERNAL FUNCTIONS + *************************************************************************** + */ + +/*------------------------------------------------- + * tree_node_compare - compare two tree nodes + * by weight + *------------------------------------------------- + */ + +static int huffman_tree_node_compare(const void *item1, const void *item2) +{ + const struct node_t *node1 = *(const struct node_t **)item1; + const struct node_t *node2 = *(const struct node_t **)item2; + if (node2->weight != node1->weight) + return node2->weight - node1->weight; + if (node2->bits - node1->bits == 0) + fprintf(stderr, "identical node sort keys, should not happen!\n"); + return (int)node1->bits - (int)node2->bits; +} + +/*------------------------------------------------- + * build_tree - build a huffman tree based on the + * data distribution + *------------------------------------------------- + */ + +int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight) +{ + int nextalloc; + int maxbits = 0; + /* make a list of all non-zero nodes */ + struct node_t** list = (struct node_t**) + malloc(sizeof(struct node_t*) * decoder->numcodes * 2); + int curcode, listitems = 0; + + memset(decoder->huffnode, 0, + decoder->numcodes * sizeof(decoder->huffnode[0])); + + for (curcode = 0; curcode < decoder->numcodes; curcode++) + if (decoder->datahisto[curcode] != 0) + { + list[listitems++] = &decoder->huffnode[curcode]; + decoder->huffnode[curcode].count = decoder->datahisto[curcode]; + decoder->huffnode[curcode].bits = curcode; + + /* scale the weight by the current effective length, ensuring we don't go to 0 */ + decoder->huffnode[curcode].weight = ((uint64_t)decoder->datahisto[curcode]) * ((uint64_t)totalweight) / ((uint64_t)totaldata); + if (decoder->huffnode[curcode].weight == 0) + decoder->huffnode[curcode].weight = 1; + } + +#if 0 + { + unsigned i; + fprintf(stderr, "Pre-sort:\n"); + for (i = 0; i < listitems; i++) + fprintf(stderr, "weight: %d code: %d\n", + list[i]->m_weight, list[i]->m_bits); + } +#endif + + /* sort the list by weight, largest weight first */ + qsort(&list[0], listitems, sizeof(list[0]), huffman_tree_node_compare); + +#if 0 + fprintf(stderr, "Post-sort:\n"); + for (int i = 0; i < listitems; i++) { + fprintf(stderr, "weight: %d code: %d\n", list[i]->m_weight, list[i]->m_bits); + } + fprintf(stderr, "===================\n"); +#endif + + /* now build the tree */ + nextalloc = decoder->numcodes; + + while (listitems > 1) + { + int curitem; + /* remove lowest two items */ + struct node_t* node1 = &(*list[--listitems]); + struct node_t* node0 = &(*list[--listitems]); + + /* create new node */ + struct node_t* newnode = &decoder->huffnode[nextalloc++]; + newnode->parent = NULL; + node0->parent = + node1->parent = newnode; + newnode->weight = + node0->weight + node1->weight; + + /* insert into list at appropriate location */ + for (curitem = 0; curitem < listitems; curitem++) + if (newnode->weight > list[curitem]->weight) + { + memmove(&list[curitem+1], + &list[curitem], + (listitems - curitem) * sizeof(list[0])); + break; + } + list[curitem] = newnode; + listitems++; + } + + /* compute the number of bits in each code, + * and fill in another histogram */ + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + struct node_t *curnode; + struct node_t* node = &decoder->huffnode[curcode]; + node->numbits = 0; + node->bits = 0; + + /* if we have a non-zero weight, compute the number of bits */ + if (node->weight > 0) + { + /* determine the number of bits for this node */ + for (curnode = node; + curnode->parent != NULL; curnode = curnode->parent) + node->numbits++; + if (node->numbits == 0) + node->numbits = 1; + + /* keep track of the max */ + maxbits = MAX(maxbits, ((int)node->numbits)); + } + } + free(list); + return maxbits; +} + +/*------------------------------------------------- + * assign_canonical_codes - assign canonical codes + * to all the nodes based on the number of bits + * in each + *------------------------------------------------- + */ + +enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder) +{ + uint32_t curstart = 0; + /* build up a histogram of bit lengths */ + int curcode, codelen; + uint32_t bithisto[33] = { 0 }; + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + struct node_t* node = &decoder->huffnode[curcode]; + if (node->numbits > decoder->maxbits) + return HUFFERR_INTERNAL_INCONSISTENCY; + if (node->numbits <= 32) + bithisto[node->numbits]++; + } + + /* for each code length, determine the starting code number */ + for (codelen = 32; codelen > 0; codelen--) + { + uint32_t nextstart = (curstart + bithisto[codelen]) >> 1; + if (codelen != 1 && nextstart * 2 != (curstart + bithisto[codelen])) + return HUFFERR_INTERNAL_INCONSISTENCY; + bithisto[codelen] = curstart; + curstart = nextstart; + } + + /* now assign canonical codes */ + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + struct node_t* node = &decoder->huffnode[curcode]; + if (node->numbits > 0) + node->bits = bithisto[node->numbits]++; + } + return HUFFERR_NONE; +} + +/*------------------------------------------------- + * build_lookup_table - build a lookup table for + * fast decoding + *------------------------------------------------- + */ + +void huffman_build_lookup_table(struct huffman_decoder* decoder) +{ + /* iterate over all codes */ + int curcode; + for (curcode = 0; curcode < decoder->numcodes; curcode++) + { + /* process all nodes which have non-zero bits */ + struct node_t* node = &decoder->huffnode[curcode]; + if (node->numbits > 0) + { + /* set up the entry */ + lookup_value value = MAKE_LOOKUP(curcode, node->numbits); + + /* fill all matching entries */ + int shift = decoder->maxbits - node->numbits; + lookup_value *dest = &decoder->lookup[node->bits << shift]; + lookup_value *destend = &decoder->lookup[((node->bits + 1) << shift) - 1]; + while (dest <= destend) + *dest++ = value; + } + } +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_lzma.c
Added
@@ -0,0 +1,366 @@ +/*************************************************************************** + + libchdr_lzma_codec.c + + MAME Compressed Hunks of Data file format + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <zlib.h> +#include <libchdr/chd.h> +#include <libchdr/minmax.h> +#include <libchdr/cdrom.h> +#include <libchdr/lzma.h> +#include <libchdr/huffman.h> + +#include <retro_inline.h> +#include <streams/file_stream.h> + +#define TRUE 1 +#define FALSE 0 + +/*************************************************************************** + * LZMA ALLOCATOR HELPER + *************************************************************************** + */ + +/*------------------------------------------------- + * lzma_fast_alloc - fast malloc for lzma, which + * allocates and frees memory frequently + *------------------------------------------------- + */ + +/* Huge alignment values for possible SIMD optimization by compiler (NEON, SSE, AVX) */ +#define LZMA_MIN_ALIGNMENT_BITS 512 +#define LZMA_MIN_ALIGNMENT_BYTES (LZMA_MIN_ALIGNMENT_BITS / 8) + +static void *lzma_fast_alloc(void *p, size_t size) +{ + int scan; + uint32_t *addr = NULL; + lzma_allocator *codec = (lzma_allocator *)(p); + uintptr_t vaddr = 0; + + /* compute the size, rounding to the nearest 1k */ + size = (size + 0x3ff) & ~0x3ff; + + /* reuse a hunk if we can */ + for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++) + { + uint32_t *ptr = codec->allocptr[scan]; + if (ptr != NULL && size == *ptr) + { + /* set the low bit of the size so we don't match next time */ + *ptr |= 1; + + /* return aligned address of the block */ + return codec->allocptr2[scan]; + } + } + + /* alloc a new one and put it into the list */ + addr = (uint32_t *)malloc(size + sizeof(uint32_t) + LZMA_MIN_ALIGNMENT_BYTES); + if (addr==NULL) + return NULL; + for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++) + { + if (codec->allocptr[scan] == NULL) + { + /* store block address */ + codec->allocptr[scan] = addr; + + /* compute aligned address, store it */ + vaddr = (uintptr_t)addr; + vaddr = (vaddr + sizeof(uint32_t) + (LZMA_MIN_ALIGNMENT_BYTES-1)) & (~(LZMA_MIN_ALIGNMENT_BYTES-1)); + codec->allocptr2[scan] = (uint32_t*)vaddr; + break; + } + } + + /* set the low bit of the size so we don't match next time */ + *addr = size | 1; + + /* return aligned address */ + return (void*)vaddr; +} + +/*------------------------------------------------- + * lzma_fast_free - fast free for lzma, which + * allocates and frees memory frequently + *------------------------------------------------- + */ +static void lzma_fast_free(void *p, void *address) +{ + int scan; + uint32_t *ptr = NULL; + lzma_allocator *codec = NULL; + + if (address == NULL) + return; + + codec = (lzma_allocator *)(p); + + /* find the hunk */ + ptr = (uint32_t *)address; + for (scan = 0; scan < MAX_LZMA_ALLOCS; scan++) + { + if (ptr == codec->allocptr2[scan]) + { + /* clear the low bit of the size to allow matches */ + *codec->allocptr[scan] &= ~1; + return; + } + } +} + +/*------------------------------------------------- + * lzma_allocator_init + *------------------------------------------------- + */ + +void lzma_allocator_init(void* p) +{ + lzma_allocator *codec = (lzma_allocator *)(p); + + /* reset pointer list */ + memset(codec->allocptr, 0, sizeof(codec->allocptr)); + codec->Alloc = lzma_fast_alloc; + codec->Free = lzma_fast_free; +} + +/*------------------------------------------------- + * lzma_allocator_free + *------------------------------------------------- + */ + +void lzma_allocator_free(void* p ) +{ + lzma_allocator *codec = (lzma_allocator *)(p); + + /* free our memory */ + int i; + for (i = 0 ; i < MAX_LZMA_ALLOCS ; i++) + { + if (codec->allocptr[i] != NULL) + free(codec->allocptr[i]); + } +} + +/*************************************************************************** + * LZMA DECOMPRESSOR + *************************************************************************** + */ + +/*------------------------------------------------- + * lzma_codec_init - constructor + *------------------------------------------------- + */ + +chd_error lzma_codec_init(void* codec, uint32_t hunkbytes) +{ + CLzmaEncProps encoder_props; + CLzmaEncHandle enc; + uint8_t decoder_props[LZMA_PROPS_SIZE]; + lzma_allocator* alloc; + size_t props_size; + lzma_codec_data* lzma_codec = (lzma_codec_data*) codec; + + /* construct the decoder */ + LzmaDec_Construct(&lzma_codec->decoder); + + /* FIXME: this code is written in a way that makes it impossible to safely upgrade the LZMA SDK + * This code assumes that the current version of the encoder imposes the same requirements on the + * decoder as the encoder used to produce the file. This is not necessarily true. The format + * needs to be changed so the encoder properties are written to the file. + + * configure the properties like the compressor did */ + LzmaEncProps_Init(&encoder_props); + encoder_props.level = 9; + encoder_props.reduceSize = hunkbytes; + LzmaEncProps_Normalize(&encoder_props); + + /* convert to decoder properties */ + alloc = &lzma_codec->allocator; + lzma_allocator_init(alloc); + enc = LzmaEnc_Create((ISzAlloc*)alloc); + if (!enc) + return CHDERR_DECOMPRESSION_ERROR; + if (LzmaEnc_SetProps(enc, &encoder_props) != SZ_OK) + { + LzmaEnc_Destroy(enc, (ISzAlloc*)&alloc, (ISzAlloc*)&alloc); + return CHDERR_DECOMPRESSION_ERROR; + } + props_size = sizeof(decoder_props); + if (LzmaEnc_WriteProperties(enc, decoder_props, &props_size) != SZ_OK) + { + LzmaEnc_Destroy(enc, (ISzAlloc*)alloc, (ISzAlloc*)alloc); + return CHDERR_DECOMPRESSION_ERROR; + } + LzmaEnc_Destroy(enc, (ISzAlloc*)alloc, (ISzAlloc*)alloc); + + /* do memory allocations */ + if (LzmaDec_Allocate(&lzma_codec->decoder, decoder_props, LZMA_PROPS_SIZE, (ISzAlloc*)alloc) != SZ_OK) + return CHDERR_DECOMPRESSION_ERROR; + + /* Okay */ + return CHDERR_NONE; +} + +/*------------------------------------------------- + * lzma_codec_free + *------------------------------------------------- + */ + +void lzma_codec_free(void* codec) +{ + lzma_codec_data* lzma_codec = (lzma_codec_data*) codec; + lzma_allocator* alloc = &lzma_codec->allocator; + + /* free memory */ + LzmaDec_Free(&lzma_codec->decoder, (ISzAlloc*)&lzma_codec->allocator); + lzma_allocator_free(alloc); +} + +/*------------------------------------------------- + * decompress - decompress data using the LZMA + * codec + *------------------------------------------------- + */ + +chd_error lzma_codec_decompress(void* codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + ELzmaStatus status; + SRes res; + size_t consumedlen, decodedlen; + /* initialize */ + lzma_codec_data* lzma_codec = (lzma_codec_data*) codec; + LzmaDec_Init(&lzma_codec->decoder); + + /* decode */ + consumedlen = complen; + decodedlen = destlen; + res = LzmaDec_DecodeToBuf(&lzma_codec->decoder, dest, &decodedlen, src, &consumedlen, LZMA_FINISH_END, &status); + if ((res != SZ_OK && res != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) || consumedlen != complen || decodedlen != destlen) + return CHDERR_DECOMPRESSION_ERROR; + return CHDERR_NONE; +} + +/* cdlz */ +chd_error cdlz_codec_init(void* codec, uint32_t hunkbytes) +{ + chd_error ret; + cdlz_codec_data* cdlz = (cdlz_codec_data*) codec; + + /* allocate buffer */ + cdlz->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); + if (cdlz->buffer == NULL) + return CHDERR_OUT_OF_MEMORY; + + ret = lzma_codec_init(&cdlz->base_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; + +#ifdef WANT_SUBCODE + ret = zlib_codec_init(&cdlz->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; +#endif + + return CHDERR_NONE; +} + +void cdlz_codec_free(void* codec) +{ + cdlz_codec_data* cdlz = (cdlz_codec_data*) codec; + + lzma_codec_free(&cdlz->base_decompressor); +#ifdef WANT_SUBCODE + zlib_codec_free(&cdlz->subcode_decompressor); +#endif + if (cdlz->buffer) + free(cdlz->buffer); +} + +chd_error cdlz_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ +#ifdef WANT_RAW_DATA_SECTOR + uint8_t *sector; +#endif + uint32_t framenum; + cdlz_codec_data* cdlz = (cdlz_codec_data*)codec; + + /* determine header bytes */ + uint32_t frames = destlen / CD_FRAME_SIZE; + uint32_t complen_bytes = (destlen < 65536) ? 2 : 3; + uint32_t ecc_bytes = (frames + 7) / 8; + uint32_t header_bytes = ecc_bytes + complen_bytes; + + /* extract compressed length of base */ + uint32_t complen_base = (src[ecc_bytes + 0] << 8) | src[ecc_bytes + 1]; + if (complen_bytes > 2) + complen_base = (complen_base << 8) | src[ecc_bytes + 2]; + + /* reset and decode */ + lzma_codec_decompress(&cdlz->base_decompressor, &src[header_bytes], complen_base, &cdlz->buffer[0], frames * CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + if (header_bytes + complen_base >= complen) + return CHDERR_DECOMPRESSION_ERROR; + zlib_codec_decompress(&cdlz->subcode_decompressor, &src[header_bytes + complen_base], complen - complen_base - header_bytes, &cdlz->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); +#endif + + /* reassemble the data */ + for (framenum = 0; framenum < frames; framenum++) + { + memcpy(&dest[framenum * CD_FRAME_SIZE], &cdlz->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdlz->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); +#endif + +#ifdef WANT_RAW_DATA_SECTOR + /* reconstitute the ECC data and sync header */ + sector = (uint8_t *)&dest[framenum * CD_FRAME_SIZE]; + if ((src[framenum / 8] & (1 << (framenum % 8))) != 0) + { + memcpy(sector, s_cd_sync_header, sizeof(s_cd_sync_header)); + ecc_generate(sector); + } +#endif + } + return CHDERR_NONE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/libchdr/libchdr_zlib.c
Added
@@ -0,0 +1,313 @@ +/*************************************************************************** + + libchdr_zlib.c + + MAME Compressed Hunks of Data file format + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <libchdr/chd.h> +#include <libchdr/minmax.h> +#include <libchdr/cdrom.h> +#include <libchdr/huffman.h> +#include <libchdr/libchdr_zlib.h> +#include <zlib.h> + +#include <retro_inline.h> +#include <streams/file_stream.h> + +#define TRUE 1 +#define FALSE 0 + +/* cdzl */ + +chd_error cdzl_codec_init(void *codec, uint32_t hunkbytes) +{ + chd_error ret; + cdzl_codec_data* cdzl = (cdzl_codec_data*)codec; + + /* make sure the CHD's hunk size is an even multiple of the frame size */ + if (hunkbytes % CD_FRAME_SIZE != 0) + return CHDERR_CODEC_ERROR; + + cdzl->buffer = (uint8_t*)malloc(sizeof(uint8_t) * hunkbytes); + if (cdzl->buffer == NULL) + return CHDERR_OUT_OF_MEMORY; + + ret = zlib_codec_init(&cdzl->base_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; + +#ifdef WANT_SUBCODE + ret = zlib_codec_init(&cdzl->subcode_decompressor, (hunkbytes / CD_FRAME_SIZE) * CD_MAX_SECTOR_DATA); + if (ret != CHDERR_NONE) + return ret; +#endif + + return CHDERR_NONE; +} + +void cdzl_codec_free(void *codec) +{ + cdzl_codec_data* cdzl = (cdzl_codec_data*)codec; + + zlib_codec_free(&cdzl->base_decompressor); +#ifdef WANT_SUBCODE + zlib_codec_free(&cdzl->subcode_decompressor); +#endif + if (cdzl->buffer) + free(cdzl->buffer); +} + +chd_error cdzl_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ +#ifdef WANT_RAW_DATA_SECTOR + uint8_t *sector; +#endif + uint32_t framenum; + cdzl_codec_data* cdzl = (cdzl_codec_data*)codec; + + /* determine header bytes */ + uint32_t frames = destlen / CD_FRAME_SIZE; + uint32_t complen_bytes = (destlen < 65536) ? 2 : 3; + uint32_t ecc_bytes = (frames + 7) / 8; + uint32_t header_bytes = ecc_bytes + complen_bytes; + + /* extract compressed length of base */ + uint32_t complen_base = (src[ecc_bytes + 0] << 8) | src[ecc_bytes + 1]; + if (complen_bytes > 2) + complen_base = (complen_base << 8) | src[ecc_bytes + 2]; + + /* reset and decode */ + zlib_codec_decompress(&cdzl->base_decompressor, &src[header_bytes], complen_base, &cdzl->buffer[0], frames * CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + zlib_codec_decompress(&cdzl->subcode_decompressor, &src[header_bytes + complen_base], complen - complen_base - header_bytes, &cdzl->buffer[frames * CD_MAX_SECTOR_DATA], frames * CD_MAX_SUBCODE_DATA); +#endif + + /* reassemble the data */ + for (framenum = 0; framenum < frames; framenum++) + { + memcpy(&dest[framenum * CD_FRAME_SIZE], &cdzl->buffer[framenum * CD_MAX_SECTOR_DATA], CD_MAX_SECTOR_DATA); +#ifdef WANT_SUBCODE + memcpy(&dest[framenum * CD_FRAME_SIZE + CD_MAX_SECTOR_DATA], &cdzl->buffer[frames * CD_MAX_SECTOR_DATA + framenum * CD_MAX_SUBCODE_DATA], CD_MAX_SUBCODE_DATA); +#endif + +#ifdef WANT_RAW_DATA_SECTOR + /* reconstitute the ECC data and sync header */ + sector = (uint8_t *)&dest[framenum * CD_FRAME_SIZE]; + if ((src[framenum / 8] & (1 << (framenum % 8))) != 0) + { + memcpy(sector, s_cd_sync_header, sizeof(s_cd_sync_header)); + ecc_generate(sector); + } +#endif + } + return CHDERR_NONE; +} + +/*************************************************************************** + ZLIB COMPRESSION CODEC +***************************************************************************/ + +/*------------------------------------------------- + zlib_codec_init - initialize the ZLIB codec +-------------------------------------------------*/ + +chd_error zlib_codec_init(void *codec, uint32_t hunkbytes) +{ + int zerr; + chd_error err; + zlib_codec_data *data = (zlib_codec_data*)codec; + + /* clear the buffers */ + memset(data, 0, sizeof(zlib_codec_data)); + + /* init the inflater first */ + data->inflater.next_in = (Bytef *)data; /* bogus, but that's ok */ + data->inflater.avail_in = 0; + data->inflater.zalloc = zlib_fast_alloc; + data->inflater.zfree = zlib_fast_free; + data->inflater.opaque = &data->allocator; + zerr = inflateInit2(&data->inflater, -MAX_WBITS); + + /* convert errors */ + if (zerr == Z_MEM_ERROR) + err = CHDERR_OUT_OF_MEMORY; + else if (zerr != Z_OK) + err = CHDERR_CODEC_ERROR; + else + err = CHDERR_NONE; + + /* handle an error */ + if (err != CHDERR_NONE) + free(data); + + return err; +} + +/*------------------------------------------------- + zlib_codec_free - free data for the ZLIB + codec +-------------------------------------------------*/ + +void zlib_codec_free(void *codec) +{ + zlib_codec_data *data = (zlib_codec_data *)codec; + + /* deinit the streams */ + if (data != NULL) + { + int i; + zlib_allocator alloc; + + inflateEnd(&data->inflater); + + /* free our fast memory */ + alloc = data->allocator; + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + if (alloc.allocptr[i]) + free(alloc.allocptr[i]); + } +} + +/*------------------------------------------------- + zlib_codec_decompress - decomrpess data using + the ZLIB codec +-------------------------------------------------*/ + +chd_error zlib_codec_decompress(void *codec, const uint8_t *src, uint32_t complen, uint8_t *dest, uint32_t destlen) +{ + zlib_codec_data *data = (zlib_codec_data *)codec; + int zerr; + + /* reset the decompressor */ + data->inflater.next_in = (Bytef *)src; + data->inflater.avail_in = complen; + data->inflater.total_in = 0; + data->inflater.next_out = (Bytef *)dest; + data->inflater.avail_out = destlen; + data->inflater.total_out = 0; + zerr = inflateReset(&data->inflater); + if (zerr != Z_OK) + return CHDERR_DECOMPRESSION_ERROR; + + /* do it */ + zerr = inflate(&data->inflater, Z_FINISH); + (void)zerr; + if (data->inflater.total_out != destlen) + return CHDERR_DECOMPRESSION_ERROR; + + return CHDERR_NONE; +} + +/*------------------------------------------------- + zlib_fast_alloc - fast malloc for ZLIB, which + allocates and frees memory frequently +-------------------------------------------------*/ + +/* Huge alignment values for possible SIMD optimization by compiler (NEON, SSE, AVX) */ +#define ZLIB_MIN_ALIGNMENT_BITS 512 +#define ZLIB_MIN_ALIGNMENT_BYTES (ZLIB_MIN_ALIGNMENT_BITS / 8) + +voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size) +{ + zlib_allocator *alloc = (zlib_allocator *)opaque; + uintptr_t paddr = 0; + UINT32 *ptr; + int i; + + /* compute the size, rounding to the nearest 1k */ + size = (size * items + 0x3ff) & ~0x3ff; + + /* reuse a hunk if we can */ + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + { + ptr = alloc->allocptr[i]; + if (ptr && size == *ptr) + { + /* set the low bit of the size so we don't match next time */ + *ptr |= 1; + + /* return aligned block address */ + return (voidpf)(alloc->allocptr2[i]); + } + } + + /* alloc a new one */ + ptr = (UINT32 *)malloc(size + sizeof(UINT32) + ZLIB_MIN_ALIGNMENT_BYTES); + if (!ptr) + return NULL; + + /* put it into the list */ + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + if (!alloc->allocptr[i]) + { + alloc->allocptr[i] = ptr; + paddr = (((uintptr_t)ptr) + sizeof(UINT32) + (ZLIB_MIN_ALIGNMENT_BYTES-1)) & (~(ZLIB_MIN_ALIGNMENT_BYTES-1)); + alloc->allocptr2[i] = (uint32_t*)paddr; + break; + } + + /* set the low bit of the size so we don't match next time */ + *ptr = size | 1; + + /* return aligned block address */ + return (voidpf)paddr; +} + +/*------------------------------------------------- + zlib_fast_free - fast free for ZLIB, which + allocates and frees memory frequently +-------------------------------------------------*/ + +void zlib_fast_free(voidpf opaque, voidpf address) +{ + zlib_allocator *alloc = (zlib_allocator *)opaque; + UINT32 *ptr = (UINT32 *)address; + int i; + + /* find the hunk */ + for (i = 0; i < MAX_ZLIB_ALLOCS; i++) + if (ptr == alloc->allocptr2[i]) + { + /* clear the low bit of the size to allow matches */ + *(alloc->allocptr[i]) &= ~1; + return; + } +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/logiqx_dat
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/logiqx_dat/logiqx_dat.c
Added
@@ -0,0 +1,455 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (logiqx_dat.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <file/file_path.h> +#include <string/stdstring.h> +#include <formats/rxml.h> + +#include <formats/logiqx_dat.h> + +/* Holds all internal DAT file data */ +struct logiqx_dat +{ + rxml_document_t *data; + rxml_node_t *current_node; +}; + +/* List of HTML formatting codes that must + * be replaced when parsing XML data */ +const char *logiqx_dat_html_code_list[][2] = { + {"&", "&"}, + {"'", "'"}, + {">", ">"}, + {"<", "<"}, + {""", "\""} +}; + +#define LOGIQX_DAT_HTML_CODE_LIST_SIZE 5 + +/* Validation */ + +/* Performs rudimentary validation of the specified + * Logiqx XML DAT file path (not rigorous - just + * enough to prevent obvious errors). + * Also provides access to file size (DAT files can + * be very large, so it is useful to have this information + * on hand - i.e. so we can check that the system has + * enough free memory to load the file). */ +bool logiqx_dat_path_is_valid(const char *path, uint64_t *file_size) +{ + const char *file_ext = NULL; + int32_t file_size_int; + + if (string_is_empty(path)) + return false; + + /* Check file extension */ + file_ext = path_get_extension(path); + + if (string_is_empty(file_ext)) + return false; + + if (!string_is_equal_noncase(file_ext, "dat") && + !string_is_equal_noncase(file_ext, "xml")) + return false; + + /* Ensure file exists */ + if (!path_is_valid(path)) + return false; + + /* Get file size */ + file_size_int = path_get_size(path); + + if (file_size_int <= 0) + return false; + + if (file_size) + *file_size = (uint64_t)file_size_int; + + return true; +} + +/* File initialisation/de-initialisation */ + +/* Loads specified Logiqx XML DAT file from disk. + * Returned logiqx_dat_t object must be free'd using + * logiqx_dat_free(). + * Returns NULL if file is invalid or a read error + * occurs. */ +logiqx_dat_t *logiqx_dat_init(const char *path) +{ + logiqx_dat_t *dat_file = NULL; + rxml_node_t *root_node = NULL; + + /* Check file path */ + if (!logiqx_dat_path_is_valid(path, NULL)) + goto error; + + /* Create logiqx_dat_t object */ + dat_file = (logiqx_dat_t*)calloc(1, sizeof(*dat_file)); + + if (!dat_file) + goto error; + + /* Read file from disk */ + dat_file->data = rxml_load_document(path); + + if (!dat_file->data) + goto error; + + /* Ensure root node has the correct name */ + root_node = rxml_root_node(dat_file->data); + + if (!root_node) + goto error; + + if (string_is_empty(root_node->name)) + goto error; + + /* > Logiqx XML uses: 'datafile' + * > MAME List XML uses: 'mame' + * > MAME 'Software List' uses: 'softwarelist' */ + if (!string_is_equal(root_node->name, "datafile") && + !string_is_equal(root_node->name, "mame") && + !string_is_equal(root_node->name, "softwarelist")) + goto error; + + /* Get pointer to initial child node */ + dat_file->current_node = root_node->children; + + if (!dat_file->current_node) + goto error; + + /* All is well - return logiqx_dat_t object */ + return dat_file; + +error: + logiqx_dat_free(dat_file); + return NULL; +} + +/* Frees specified DAT file */ +void logiqx_dat_free(logiqx_dat_t *dat_file) +{ + if (!dat_file) + return; + + dat_file->current_node = NULL; + + if (dat_file->data) + { + rxml_free_document(dat_file->data); + dat_file->data = NULL; + } + + free(dat_file); + dat_file = NULL; +} + +/* Game information access */ + +/* Returns true if specified node is a 'game' entry */ +static bool logiqx_dat_is_game_node(rxml_node_t *node) +{ + const char *node_name = NULL; + + if (!node) + return false; + + /* Check node name */ + node_name = node->name; + + if (string_is_empty(node_name)) + return false; + + /* > Logiqx XML uses: 'game' + * > MAME List XML uses: 'machine' + * > MAME 'Software List' uses: 'software' */ + return string_is_equal(node_name, "game") || + string_is_equal(node_name, "machine") || + string_is_equal(node_name, "software"); +} + +/* Returns true if specified node is a game + * node containing information for a game with + * the specified name */ +static bool logiqx_dat_game_node_matches_name( + rxml_node_t *node, const char *game_name) +{ + const char *node_game_name = NULL; + + if (!logiqx_dat_is_game_node(node) || + string_is_empty(game_name)) + return false; + + /* Get 'name' attribute of XML node */ + node_game_name = rxml_node_attrib(node, "name"); + + if (string_is_empty(node_game_name)) + return false; + + return string_is_equal(node_game_name, game_name); +} + +/* The XML element data strings returned from + * DAT files are very 'messy'. This function + * removes all cruft, replaces formatting strings + * and copies the result (if valid) to 'str' */ +static void logiqx_dat_sanitise_element_data( + const char *data, char *str, size_t len) +{ + char sanitised_data[PATH_MAX_LENGTH]; + size_t i; + + sanitised_data[0] = '\0'; + + if (string_is_empty(data)) + return; + + strlcpy(sanitised_data, data, sizeof(sanitised_data)); + + /* Element data includes leading/trailing + * newline characters - trim them away */ + string_trim_whitespace(sanitised_data); + + if (string_is_empty(sanitised_data)) + return; + + /* XML has a number of special characters that + * are handled using a HTML formatting codes. + * All of these have to be replaced... + * & -> & + * ' -> ' + * > -> > + * < -> < + * " -> " + */ + for (i = 0; i < LOGIQX_DAT_HTML_CODE_LIST_SIZE; i++) + { + const char *find_string = logiqx_dat_html_code_list[i][0]; + const char *replace_string = logiqx_dat_html_code_list[i][1]; + + /* string_replace_substring() is expensive + * > only invoke if element string contains + * HTML code */ + if (strstr(sanitised_data, find_string)) + { + char *tmp = string_replace_substring( + sanitised_data, find_string, replace_string); + + if (!string_is_empty(tmp)) + strlcpy(sanitised_data, tmp, sizeof(sanitised_data)); + + if (tmp) + free(tmp); + } + } + + if (string_is_empty(sanitised_data)) + return; + + /* All is well - can copy result */ + strlcpy(str, sanitised_data, len); +} + +/* Extracts game information from specified node. + * Returns false if node is invalid */ +static bool logiqx_dat_parse_game_node( + rxml_node_t *node, logiqx_dat_game_info_t *game_info) +{ + const char *game_name = NULL; + const char *is_bios = NULL; + const char *is_runnable = NULL; + rxml_node_t *info_node = NULL; + bool description_found = false; + bool year_found = false; + bool manufacturer_found = false; + + if (!logiqx_dat_is_game_node(node)) + return false; + + if (!game_info) + return false; + + /* Initialise logiqx_dat_game_info_t object */ + game_info->name[0] = '\0'; + game_info->description[0] = '\0'; + game_info->year[0] = '\0'; + game_info->manufacturer[0] = '\0'; + game_info->is_bios = false; + game_info->is_runnable = true; + + /* Get game name */ + game_name = rxml_node_attrib(node, "name"); + + if (!string_is_empty(game_name)) + strlcpy(game_info->name, game_name, sizeof(game_info->name)); + + /* Get 'is bios' status */ + is_bios = rxml_node_attrib(node, "isbios"); + + if (!string_is_empty(is_bios)) + game_info->is_bios = string_is_equal(is_bios, "yes"); + + /* Get 'is runnable' status + * > Note: This attribute only exists in MAME List + * XML files, but there is no harm in checking for + * it generally. For normal Logiqx XML files, + * 'is runnable' is just the inverse of 'is bios' */ + is_runnable = rxml_node_attrib(node, "runnable"); + + if (!string_is_empty(is_runnable)) + game_info->is_runnable = string_is_equal(is_runnable, "yes"); + else + game_info->is_runnable = !game_info->is_bios; + + /* Loop over all game info nodes */ + for (info_node = node->children; info_node; info_node = info_node->next) + { + const char *info_node_name = info_node->name; + const char *info_node_data = info_node->data; + + if (string_is_empty(info_node_name)) + continue; + + /* Check description */ + if (string_is_equal(info_node_name, "description")) + { + logiqx_dat_sanitise_element_data( + info_node_data, game_info->description, + sizeof(game_info->description)); + description_found = true; + } + /* Check year */ + else if (string_is_equal(info_node_name, "year")) + { + logiqx_dat_sanitise_element_data( + info_node_data, game_info->year, + sizeof(game_info->year)); + year_found = true; + } + /* Check manufacturer */ + else if (string_is_equal(info_node_name, "manufacturer")) + { + logiqx_dat_sanitise_element_data( + info_node_data, game_info->manufacturer, + sizeof(game_info->manufacturer)); + manufacturer_found = true; + } + + /* If all required entries have been found, + * can end loop */ + if (description_found && year_found && manufacturer_found) + break; + } + + return true; +} + +/* Sets/resets internal node pointer to the first + * entry in the DAT file */ +void logiqx_dat_set_first(logiqx_dat_t *dat_file) +{ + rxml_node_t *root_node = NULL; + + if (!dat_file) + return; + + if (!dat_file->data) + return; + + /* Get root node */ + root_node = rxml_root_node(dat_file->data); + + if (!root_node) + { + dat_file->current_node = NULL; + return; + } + + /* Get pointer to initial child node */ + dat_file->current_node = root_node->children; +} + +/* Fetches game information for the current entry + * in the DAT file and increments the internal node + * pointer. + * Returns false if the end of the DAT file has been + * reached (in which case 'game_info' will be invalid) */ +bool logiqx_dat_get_next( + logiqx_dat_t *dat_file, logiqx_dat_game_info_t *game_info) +{ + if (!dat_file || !game_info) + return false; + + if (!dat_file->data) + return false; + + while (dat_file->current_node) + { + rxml_node_t *current_node = dat_file->current_node; + + /* Whatever happens, internal node pointer must + * be 'incremented' */ + dat_file->current_node = dat_file->current_node->next; + + /* If this is a game node, extract info + * and return */ + if (logiqx_dat_is_game_node(current_node)) + return logiqx_dat_parse_game_node(current_node, game_info); + } + + return false; +} + +/* Fetches information for the specified game. + * Returns false if game does not exist, or arguments + * are invalid. */ +bool logiqx_dat_search( + logiqx_dat_t *dat_file, const char *game_name, + logiqx_dat_game_info_t *game_info) +{ + rxml_node_t *root_node = NULL; + rxml_node_t *game_node = NULL; + + if (!dat_file || !game_info || string_is_empty(game_name)) + return false; + + if (!dat_file->data) + return false; + + /* Get root node */ + root_node = rxml_root_node(dat_file->data); + + if (!root_node) + return false; + + /* Loop over all child nodes of the DAT file */ + for (game_node = root_node->children; game_node; game_node = game_node->next) + { + /* If this is the requested game, fetch info and return */ + if (logiqx_dat_game_node_matches_name(game_node, game_name)) + return logiqx_dat_parse_game_node(game_node, game_info); + } + + return false; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/m3u
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/m3u/m3u_file.c
Added
@@ -0,0 +1,633 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (m3u_file.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <retro_miscellaneous.h> + +#include <string/stdstring.h> +#include <lists/string_list.h> +#include <file/file_path.h> +#include <streams/file_stream.h> +#include <array/rbuf.h> + +#include <formats/m3u_file.h> + +/* We parse the following types of entry label: + * - '#LABEL:<label>' non-standard, but used by + * some cores + * - '#EXTINF:<runtime>,<label>' standard extended + * M3U directive + * - '<content path>|<label>' non-standard, but + * used by some cores + * All other comments/directives are ignored */ +#define M3U_FILE_COMMENT '#' +#define M3U_FILE_NONSTD_LABEL "#LABEL:" +#define M3U_FILE_EXTSTD_LABEL "#EXTINF:" +#define M3U_FILE_EXTSTD_LABEL_TOKEN ',' +#define M3U_FILE_RETRO_LABEL_TOKEN '|' + +/* Holds all internal M3U file data + * > Note the awkward name: 'content_m3u_file' + * If we used just 'm3u_file' here, it would + * lead to conflicts elsewhere... */ +struct content_m3u_file +{ + char *path; + m3u_file_entry_t *entries; +}; + +/* File Initialisation / De-Initialisation */ + +/* Reads M3U file contents from disk + * - Does nothing if file does not exist + * - Returns false in the event of an error */ +static bool m3u_file_load(m3u_file_t *m3u_file) +{ + const char *file_ext = NULL; + int64_t file_len = 0; + uint8_t *file_buf = NULL; + struct string_list *lines = NULL; + bool success = false; + size_t i; + char entry_path[PATH_MAX_LENGTH]; + char entry_label[PATH_MAX_LENGTH]; + + entry_path[0] = '\0'; + entry_label[0] = '\0'; + + if (!m3u_file) + goto end; + + /* Check whether file exists + * > If path is empty, then an error + * has occurred... */ + if (string_is_empty(m3u_file->path)) + goto end; + + /* > File must have the correct extension */ + file_ext = path_get_extension(m3u_file->path); + + if (string_is_empty(file_ext) || + !string_is_equal_noncase(file_ext, M3U_FILE_EXT)) + goto end; + + /* > If file does not exist, no action + * is required */ + if (!path_is_valid(m3u_file->path)) + { + success = true; + goto end; + } + + /* Read file from disk */ + if (filestream_read_file(m3u_file->path, (void**)&file_buf, &file_len) >= 0) + { + /* Split file into lines */ + if (file_len > 0) + lines = string_split((const char*)file_buf, "\n"); + + /* File buffer no longer required */ + if (file_buf) + { + free(file_buf); + file_buf = NULL; + } + } + /* File IO error... */ + else + goto end; + + /* If file was empty, no action is required */ + if (!lines) + { + success = true; + goto end; + } + + /* Parse lines of file */ + for (i = 0; i < lines->size; i++) + { + const char *line = lines->elems[i].data; + + if (string_is_empty(line)) + continue; + + /* Determine line 'type' */ + + /* > '#LABEL:' */ + if (string_starts_with_size(line, M3U_FILE_NONSTD_LABEL, + STRLEN_CONST(M3U_FILE_NONSTD_LABEL))) + { + /* Label is the string to the right + * of '#LABEL:' */ + const char *label = line + STRLEN_CONST(M3U_FILE_NONSTD_LABEL); + + if (!string_is_empty(label)) + { + strlcpy( + entry_label, line + STRLEN_CONST(M3U_FILE_NONSTD_LABEL), + sizeof(entry_label)); + string_trim_whitespace(entry_label); + } + } + /* > '#EXTINF:' */ + else if (string_starts_with_size(line, M3U_FILE_EXTSTD_LABEL, + STRLEN_CONST(M3U_FILE_EXTSTD_LABEL))) + { + /* Label is the string to the right + * of the first comma */ + const char* label_ptr = strchr( + line + STRLEN_CONST(M3U_FILE_EXTSTD_LABEL), + M3U_FILE_EXTSTD_LABEL_TOKEN); + + if (!string_is_empty(label_ptr)) + { + label_ptr++; + if (!string_is_empty(label_ptr)) + { + strlcpy(entry_label, label_ptr, sizeof(entry_label)); + string_trim_whitespace(entry_label); + } + } + } + /* > Ignore other comments/directives */ + else if (line[0] == M3U_FILE_COMMENT) + continue; + /* > An actual 'content' line */ + else + { + /* This is normally a file name/path, but may + * have the format <content path>|<label> */ + const char *token_ptr = strchr(line, M3U_FILE_RETRO_LABEL_TOKEN); + + if (token_ptr) + { + size_t len = (size_t)(1 + token_ptr - line); + + /* Get entry_path segment */ + if (len > 0) + { + memset(entry_path, 0, sizeof(entry_path)); + strlcpy( + entry_path, line, + ((len < PATH_MAX_LENGTH ? + len : PATH_MAX_LENGTH) * sizeof(char))); + string_trim_whitespace(entry_path); + } + + /* Get entry_label segment */ + token_ptr++; + if (*token_ptr != '\0') + { + strlcpy(entry_label, token_ptr, sizeof(entry_label)); + string_trim_whitespace(entry_label); + } + } + else + { + /* Just a normal file name/path */ + strlcpy(entry_path, line, sizeof(entry_path)); + string_trim_whitespace(entry_path); + } + + /* Add entry to file + * > Note: The only way that m3u_file_add_entry() + * can fail here is if we run out of memory. + * This is a critical error, and m3u_file must + * be considered invalid in this case */ + if (!string_is_empty(entry_path) && + !m3u_file_add_entry(m3u_file, entry_path, entry_label)) + goto end; + + /* Reset entry_path/entry_label */ + entry_path[0] = '\0'; + entry_label[0] = '\0'; + } + } + + success = true; + +end: + /* Clean up */ + if (lines) + { + string_list_free(lines); + lines = NULL; + } + + if (file_buf) + { + free(file_buf); + file_buf = NULL; + } + + return success; +} + +/* Creates and initialises an M3U file + * - If 'path' refers to an existing file, + * contents is parsed + * - If path does not exist, an empty M3U file + * is created + * - Returned m3u_file_t object must be free'd using + * m3u_file_free() + * - Returns NULL in the event of an error */ +m3u_file_t *m3u_file_init(const char *path) +{ + m3u_file_t *m3u_file = NULL; + char m3u_path[PATH_MAX_LENGTH]; + + m3u_path[0] = '\0'; + + /* Sanity check */ + if (string_is_empty(path)) + return NULL; + + /* Get 'real' file path */ + strlcpy(m3u_path, path, sizeof(m3u_path)); + path_resolve_realpath(m3u_path, sizeof(m3u_path), false); + + if (string_is_empty(m3u_path)) + return NULL; + + /* Create m3u_file_t object */ + m3u_file = (m3u_file_t*)malloc(sizeof(*m3u_file)); + + if (!m3u_file) + return NULL; + + /* Initialise members */ + m3u_file->path = NULL; + m3u_file->entries = NULL; + + /* Copy file path */ + m3u_file->path = strdup(m3u_path); + + /* Read existing file contents from + * disk, if required */ + if (!m3u_file_load(m3u_file)) + { + m3u_file_free(m3u_file); + return NULL; + } + + return m3u_file; +} + +/* Frees specified M3U file entry */ +static void m3u_file_free_entry(m3u_file_entry_t *entry) +{ + if (!entry) + return; + + if (entry->path) + free(entry->path); + + if (entry->full_path) + free(entry->full_path); + + if (entry->label) + free(entry->label); + + entry->path = NULL; + entry->full_path = NULL; + entry->label = NULL; +} + +/* Frees specified M3U file */ +void m3u_file_free(m3u_file_t *m3u_file) +{ + size_t i; + + if (!m3u_file) + return; + + if (m3u_file->path) + free(m3u_file->path); + + m3u_file->path = NULL; + + /* Free entries */ + if (m3u_file->entries) + { + for (i = 0; i < RBUF_LEN(m3u_file->entries); i++) + { + m3u_file_entry_t *entry = &m3u_file->entries[i]; + m3u_file_free_entry(entry); + } + + RBUF_FREE(m3u_file->entries); + } + + free(m3u_file); +} + +/* Getters */ + +/* Returns M3U file path */ +char *m3u_file_get_path(m3u_file_t *m3u_file) +{ + if (!m3u_file) + return NULL; + + return m3u_file->path; +} + +/* Returns number of entries in M3U file */ +size_t m3u_file_get_size(m3u_file_t *m3u_file) +{ + if (!m3u_file) + return 0; + + return RBUF_LEN(m3u_file->entries); +} + +/* Fetches specified M3U file entry + * - Returns false if 'idx' is invalid, or internal + * entry is NULL */ +bool m3u_file_get_entry( + m3u_file_t *m3u_file, size_t idx, m3u_file_entry_t **entry) +{ + if (!m3u_file || + !entry || + (idx >= RBUF_LEN(m3u_file->entries))) + return false; + + *entry = &m3u_file->entries[idx]; + + if (!*entry) + return false; + + return true; +} + +/* Setters */ + +/* Adds specified entry to the M3U file + * - Returns false if path is invalid, or + * memory could not be allocated for the + * entry */ +bool m3u_file_add_entry( + m3u_file_t *m3u_file, const char *path, const char *label) +{ + m3u_file_entry_t *entry = NULL; + size_t num_entries; + char full_path[PATH_MAX_LENGTH]; + + full_path[0] = '\0'; + + if (!m3u_file || string_is_empty(path)) + return false; + + /* Get current number of file entries */ + num_entries = RBUF_LEN(m3u_file->entries); + + /* Attempt to allocate memory for new entry */ + if (!RBUF_TRYFIT(m3u_file->entries, num_entries + 1)) + return false; + + /* Allocation successful - increment array size */ + RBUF_RESIZE(m3u_file->entries, num_entries + 1); + + /* Fetch entry at end of list, and zero-initialise + * members */ + entry = &m3u_file->entries[num_entries]; + memset(entry, 0, sizeof(*entry)); + + /* Copy path and label */ + entry->path = strdup(path); + + if (!string_is_empty(label)) + entry->label = strdup(label); + + /* Populate 'full_path' field */ + if (path_is_absolute(path)) + { + strlcpy(full_path, path, sizeof(full_path)); + path_resolve_realpath(full_path, sizeof(full_path), false); + } + else + fill_pathname_resolve_relative( + full_path, m3u_file->path, path, + sizeof(full_path)); + + /* Handle unforeseen errors... */ + if (string_is_empty(full_path)) + { + m3u_file_free_entry(entry); + return false; + } + + entry->full_path = strdup(full_path); + + return true; +} + +/* Removes all entries in M3U file */ +void m3u_file_clear(m3u_file_t *m3u_file) +{ + size_t i; + + if (!m3u_file) + return; + + if (m3u_file->entries) + { + for (i = 0; i < RBUF_LEN(m3u_file->entries); i++) + { + m3u_file_entry_t *entry = &m3u_file->entries[i]; + m3u_file_free_entry(entry); + } + + RBUF_FREE(m3u_file->entries); + } +} + +/* Saving */ + +/* Saves M3U file to disk + * - Setting 'label_type' to M3U_FILE_LABEL_NONE + * just outputs entry paths - this the most + * common format supported by most cores + * - Returns false in the event of an error */ +bool m3u_file_save( + m3u_file_t *m3u_file, enum m3u_file_label_type label_type) +{ + RFILE *file = NULL; + size_t i; + char base_dir[PATH_MAX_LENGTH]; + + base_dir[0] = '\0'; + + if (!m3u_file || !m3u_file->entries) + return false; + + /* This should never happen */ + if (string_is_empty(m3u_file->path)) + return false; + + /* Get M3U file base directory */ + if (find_last_slash(m3u_file->path)) + { + strlcpy(base_dir, m3u_file->path, sizeof(base_dir)); + path_basedir(base_dir); + } + + /* Open file for writing */ + file = filestream_open( + m3u_file->path, + RETRO_VFS_FILE_ACCESS_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + if (!file) + return false; + + /* Loop over entries */ + for (i = 0; i < RBUF_LEN(m3u_file->entries); i++) + { + m3u_file_entry_t *entry = &m3u_file->entries[i]; + char entry_path[PATH_MAX_LENGTH]; + + entry_path[0] = '\0'; + + if (!entry || string_is_empty(entry->full_path)) + continue; + + /* When writing M3U files, entry paths are + * always relative */ + if (string_is_empty(base_dir)) + strlcpy( + entry_path, entry->full_path, + sizeof(entry_path)); + else + path_relative_to( + entry_path, entry->full_path, base_dir, + sizeof(entry_path)); + + if (string_is_empty(entry_path)) + continue; + + /* Check if we need to write a label */ + if (!string_is_empty(entry->label)) + { + switch (label_type) + { + case M3U_FILE_LABEL_NONSTD: + filestream_printf( + file, "%s%s\n%s\n", + M3U_FILE_NONSTD_LABEL, entry->label, + entry_path); + break; + case M3U_FILE_LABEL_EXTSTD: + filestream_printf( + file, "%s%c%s\n%s\n", + M3U_FILE_EXTSTD_LABEL, M3U_FILE_EXTSTD_LABEL_TOKEN, entry->label, + entry_path); + break; + case M3U_FILE_LABEL_RETRO: + filestream_printf( + file, "%s%c%s\n", + entry_path, M3U_FILE_RETRO_LABEL_TOKEN, entry->label); + break; + case M3U_FILE_LABEL_NONE: + default: + filestream_printf( + file, "%s\n", entry_path); + break; + } + } + /* No label - just write entry path */ + else + filestream_printf( + file, "%s\n", entry_path); + } + + /* Close file */ + filestream_close(file); + + return true; +} + +/* Utilities */ + +/* Internal qsort function */ +static int m3u_file_qsort_func( + const m3u_file_entry_t *a, const m3u_file_entry_t *b) +{ + if (!a || !b) + return 0; + + if (string_is_empty(a->full_path) || string_is_empty(b->full_path)) + return 0; + + return strcasecmp(a->full_path, b->full_path); +} + +/* Sorts M3U file entries in alphabetical order */ +void m3u_file_qsort(m3u_file_t *m3u_file) +{ + size_t num_entries; + + if (!m3u_file) + return; + + num_entries = RBUF_LEN(m3u_file->entries); + + if (num_entries < 2) + return; + + qsort( + m3u_file->entries, num_entries, + sizeof(m3u_file_entry_t), + (int (*)(const void *, const void *))m3u_file_qsort_func); +} + +/* Returns true if specified path corresponds + * to an M3U file (simple convenience function) */ +bool m3u_file_is_m3u(const char *path) +{ + const char *file_ext = NULL; + int32_t file_size; + + if (string_is_empty(path)) + return false; + + /* Check file extension */ + file_ext = path_get_extension(path); + + if (string_is_empty(file_ext)) + return false; + + if (!string_is_equal_noncase(file_ext, M3U_FILE_EXT)) + return false; + + /* Ensure file exists */ + if (!path_is_valid(path)) + return false; + + /* Ensure we have non-zero file size */ + file_size = path_get_size(path); + + if (file_size <= 0) + return false; + + return true; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/png
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/png/rpng.c
Added
@@ -0,0 +1,1249 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rpng.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef DEBUG +#include <stdio.h> +#endif +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#ifdef GEKKO +#include <malloc.h> +#endif + +#include <boolean.h> +#include <formats/image.h> +#include <formats/rpng.h> +#include <streams/trans_stream.h> +#include <string/stdstring.h> + +#include "rpng_internal.h" + +enum png_ihdr_color_type +{ + PNG_IHDR_COLOR_GRAY = 0, + PNG_IHDR_COLOR_RGB = 2, + PNG_IHDR_COLOR_PLT = 3, + PNG_IHDR_COLOR_GRAY_ALPHA = 4, + PNG_IHDR_COLOR_RGBA = 6 +}; + +enum png_line_filter +{ + PNG_FILTER_NONE = 0, + PNG_FILTER_SUB, + PNG_FILTER_UP, + PNG_FILTER_AVERAGE, + PNG_FILTER_PAETH +}; + +enum png_chunk_type +{ + PNG_CHUNK_NOOP = 0, + PNG_CHUNK_ERROR, + PNG_CHUNK_IHDR, + PNG_CHUNK_IDAT, + PNG_CHUNK_PLTE, + PNG_CHUNK_tRNS, + PNG_CHUNK_IEND +}; + +struct adam7_pass +{ + unsigned x; + unsigned y; + unsigned stride_x; + unsigned stride_y; +}; + +struct idat_buffer +{ + uint8_t *data; + size_t size; +}; + +struct rpng_process +{ + uint32_t *data; + uint32_t *palette; + void *stream; + const struct trans_stream_backend *stream_backend; + uint8_t *prev_scanline; + uint8_t *decoded_scanline; + uint8_t *inflate_buf; + size_t restore_buf_size; + size_t adam7_restore_buf_size; + size_t data_restore_buf_size; + size_t inflate_buf_size; + size_t avail_in; + size_t avail_out; + size_t total_out; + size_t pass_size; + struct png_ihdr ihdr; /* uint32_t alignment */ + unsigned bpp; + unsigned pitch; + unsigned h; + unsigned pass_width; + unsigned pass_height; + unsigned pass_pos; + bool inflate_initialized; + bool adam7_pass_initialized; + bool pass_initialized; +}; + +struct rpng +{ + struct rpng_process *process; + uint8_t *buff_data; + uint8_t *buff_end; + struct idat_buffer idat_buf; /* ptr alignment */ + struct png_ihdr ihdr; /* uint32 alignment */ + uint32_t palette[256]; + bool has_ihdr; + bool has_idat; + bool has_iend; + bool has_plte; + bool has_trns; +}; + +static const struct adam7_pass passes[] = { + { 0, 0, 8, 8 }, + { 4, 0, 8, 8 }, + { 0, 4, 4, 8 }, + { 2, 0, 4, 4 }, + { 0, 2, 2, 4 }, + { 1, 0, 2, 2 }, + { 0, 1, 1, 2 }, +}; + +static INLINE uint32_t dword_be(const uint8_t *buf) +{ + return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | (buf[3] << 0); +} + +#if defined(DEBUG) || defined(RPNG_TEST) +static bool png_process_ihdr(struct png_ihdr *ihdr) +{ + uint8_t ihdr_depth = ihdr->depth; + + switch (ihdr->color_type) + { + case PNG_IHDR_COLOR_RGB: + case PNG_IHDR_COLOR_GRAY_ALPHA: + case PNG_IHDR_COLOR_RGBA: + if (ihdr_depth != 8 && ihdr_depth != 16) + { + fprintf(stderr, "[RPNG]: Error in line %d.\n", __LINE__); + return false; + } + break; + case PNG_IHDR_COLOR_GRAY: + /* Valid bitdepths are: 1, 2, 4, 8, 16 */ + if (ihdr_depth > 16 || (0x977F7FFF << ihdr_depth) & 0x80000000) + { + fprintf(stderr, "[RPNG]: Error in line %d.\n", __LINE__); + return false; + } + break; + case PNG_IHDR_COLOR_PLT: + /* Valid bitdepths are: 1, 2, 4, 8 */ + if (ihdr_depth > 8 || (0x977F7FFF << ihdr_depth) & 0x80000000) + { + fprintf(stderr, "[RPNG]: Error in line %d.\n", __LINE__); + return false; + } + break; + default: + fprintf(stderr, "[RPNG]: Error in line %d.\n", __LINE__); + return false; + } + +#ifdef RPNG_TEST + fprintf(stderr, "IHDR: (%u x %u), bpc = %u, palette = %s, color = %s, alpha = %s, adam7 = %s.\n", + ihdr->width, ihdr->height, + ihdr_depth, (ihdr->color_type == PNG_IHDR_COLOR_PLT) ? "yes" : "no", + (ihdr->color_type & PNG_IHDR_COLOR_RGB) ? "yes" : "no", + (ihdr->color_type & PNG_IHDR_COLOR_GRAY_ALPHA) ? "yes" : "no", + ihdr->interlace == 1 ? "yes" : "no"); +#endif + + return true; +} +#else +static bool png_process_ihdr(struct png_ihdr *ihdr) +{ + uint8_t ihdr_depth = ihdr->depth; + + switch (ihdr->color_type) + { + case PNG_IHDR_COLOR_RGB: + case PNG_IHDR_COLOR_GRAY_ALPHA: + case PNG_IHDR_COLOR_RGBA: + if (ihdr_depth != 8 && ihdr_depth != 16) + return false; + break; + case PNG_IHDR_COLOR_GRAY: + /* Valid bitdepths are: 1, 2, 4, 8, 16 */ + if (ihdr_depth > 16 || (0x977F7FFF << ihdr_depth) & 0x80000000) + return false; + break; + case PNG_IHDR_COLOR_PLT: + /* Valid bitdepths are: 1, 2, 4, 8 */ + if (ihdr_depth > 8 || (0x977F7FFF << ihdr_depth) & 0x80000000) + return false; + break; + default: + return false; + } + + return true; +} +#endif + +static void png_reverse_filter_copy_line_rgb(uint32_t *data, + const uint8_t *decoded, unsigned width, unsigned bpp) +{ + unsigned i; + + bpp /= 8; + + for (i = 0; i < width; i++) + { + uint32_t r, g, b; + + r = *decoded; + decoded += bpp; + g = *decoded; + decoded += bpp; + b = *decoded; + decoded += bpp; + data[i] = (0xffu << 24) | (r << 16) | (g << 8) | (b << 0); + } +} + +static void png_reverse_filter_copy_line_rgba(uint32_t *data, + const uint8_t *decoded, unsigned width, unsigned bpp) +{ + unsigned i; + + bpp /= 8; + + for (i = 0; i < width; i++) + { + uint32_t r, g, b, a; + r = *decoded; + decoded += bpp; + g = *decoded; + decoded += bpp; + b = *decoded; + decoded += bpp; + a = *decoded; + decoded += bpp; + data[i] = (a << 24) | (r << 16) | (g << 8) | (b << 0); + } +} + +static void png_reverse_filter_copy_line_bw(uint32_t *data, + const uint8_t *decoded, unsigned width, unsigned depth) +{ + unsigned i, bit; + static const unsigned mul_table[] = { 0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01 }; + unsigned mul, mask; + + if (depth == 16) + { + for (i = 0; i < width; i++) + { + uint32_t val = decoded[i << 1]; + data[i] = (val * 0x010101) | (0xffu << 24); + } + return; + } + + mul = mul_table[depth]; + mask = (1 << depth) - 1; + bit = 0; + + for (i = 0; i < width; i++, bit += depth) + { + unsigned byte = bit >> 3; + unsigned val = decoded[byte] >> (8 - depth - (bit & 7)); + + val &= mask; + val *= mul; + data[i] = (val * 0x010101) | (0xffu << 24); + } +} + +static void png_reverse_filter_copy_line_gray_alpha(uint32_t *data, + const uint8_t *decoded, unsigned width, + unsigned bpp) +{ + unsigned i; + + bpp /= 8; + + for (i = 0; i < width; i++) + { + uint32_t gray, alpha; + + gray = *decoded; + decoded += bpp; + alpha = *decoded; + decoded += bpp; + + data[i] = (gray * 0x010101) | (alpha << 24); + } +} + +static void png_reverse_filter_copy_line_plt(uint32_t *data, + const uint8_t *decoded, unsigned width, + unsigned depth, const uint32_t *palette) +{ + switch (depth) + { + case 1: + { + unsigned w = width / 8; + unsigned i; + + for (i = 0; i < w; i++, decoded++) + { + *data++ = palette[(*decoded >> 7) & 1]; + *data++ = palette[(*decoded >> 6) & 1]; + *data++ = palette[(*decoded >> 5) & 1]; + *data++ = palette[(*decoded >> 4) & 1]; + *data++ = palette[(*decoded >> 3) & 1]; + *data++ = palette[(*decoded >> 2) & 1]; + *data++ = palette[(*decoded >> 1) & 1]; + *data++ = palette[*decoded & 1]; + } + + switch (width & 7) + { + case 7: + data[6] = palette[(*decoded >> 1) & 1]; + case 6: + data[5] = palette[(*decoded >> 2) & 1]; + case 5: + data[4] = palette[(*decoded >> 3) & 1]; + case 4: + data[3] = palette[(*decoded >> 4) & 1]; + case 3: + data[2] = palette[(*decoded >> 5) & 1]; + case 2: + data[1] = palette[(*decoded >> 6) & 1]; + case 1: + data[0] = palette[(*decoded >> 7) & 1]; + break; + } + } + break; + + case 2: + { + unsigned w = width / 4; + unsigned i; + + for (i = 0; i < w; i++, decoded++) + { + *data++ = palette[(*decoded >> 6) & 3]; + *data++ = palette[(*decoded >> 4) & 3]; + *data++ = palette[(*decoded >> 2) & 3]; + *data++ = palette[*decoded & 3]; + } + + switch (width & 3) + { + case 3: + data[2] = palette[(*decoded >> 2) & 3]; + case 2: + data[1] = palette[(*decoded >> 4) & 3]; + case 1: + data[0] = palette[(*decoded >> 6) & 3]; + break; + } + } + break; + + case 4: + { + unsigned w = width / 2; + unsigned i; + + for (i = 0; i < w; i++, decoded++) + { + *data++ = palette[*decoded >> 4]; + *data++ = palette[*decoded & 0x0f]; + } + + if (width & 1) + *data = palette[*decoded >> 4]; + } + break; + + case 8: + { + unsigned i; + + for (i = 0; i < width; i++, decoded++, data++) + *data = palette[*decoded]; + } + break; + } +} + +static void png_pass_geom(const struct png_ihdr *ihdr, + unsigned width, unsigned height, + unsigned *bpp_out, unsigned *pitch_out, size_t *pass_size) +{ + unsigned bpp = 0; + unsigned pitch = 0; + + switch (ihdr->color_type) + { + case PNG_IHDR_COLOR_GRAY: + bpp = (ihdr->depth + 7) / 8; + pitch = (ihdr->width * ihdr->depth + 7) / 8; + break; + case PNG_IHDR_COLOR_RGB: + bpp = (ihdr->depth * 3 + 7) / 8; + pitch = (ihdr->width * ihdr->depth * 3 + 7) / 8; + break; + case PNG_IHDR_COLOR_PLT: + bpp = (ihdr->depth + 7) / 8; + pitch = (ihdr->width * ihdr->depth + 7) / 8; + break; + case PNG_IHDR_COLOR_GRAY_ALPHA: + bpp = (ihdr->depth * 2 + 7) / 8; + pitch = (ihdr->width * ihdr->depth * 2 + 7) / 8; + break; + case PNG_IHDR_COLOR_RGBA: + bpp = (ihdr->depth * 4 + 7) / 8; + pitch = (ihdr->width * ihdr->depth * 4 + 7) / 8; + break; + default: + break; + } + + if (pass_size) + *pass_size = (pitch + 1) * ihdr->height; + if (bpp_out) + *bpp_out = bpp; + if (pitch_out) + *pitch_out = pitch; +} + +static void png_reverse_filter_adam7_deinterlace_pass(uint32_t *data, + const struct png_ihdr *ihdr, + const uint32_t *input, unsigned pass_width, unsigned pass_height, + const struct adam7_pass *pass) +{ + unsigned x, y; + + data += pass->y * ihdr->width + pass->x; + + for (y = 0; y < pass_height; + y++, data += ihdr->width * pass->stride_y, input += pass_width) + { + uint32_t *out = data; + + for (x = 0; x < pass_width; x++, out += pass->stride_x) + *out = input[x]; + } +} + +static void png_reverse_filter_deinit(struct rpng_process *pngp) +{ + if (!pngp) + return; + if (pngp->decoded_scanline) + free(pngp->decoded_scanline); + pngp->decoded_scanline = NULL; + if (pngp->prev_scanline) + free(pngp->prev_scanline); + pngp->prev_scanline = NULL; + + pngp->pass_initialized = false; + pngp->h = 0; +} + +static int png_reverse_filter_init(const struct png_ihdr *ihdr, + struct rpng_process *pngp) +{ + size_t pass_size; + + if (!pngp->adam7_pass_initialized && ihdr->interlace) + { + if (ihdr->width <= passes[pngp->pass_pos].x || + ihdr->height <= passes[pngp->pass_pos].y) /* Empty pass */ + return 1; + + pngp->pass_width = (ihdr->width - + passes[pngp->pass_pos].x + passes[pngp->pass_pos].stride_x - 1) / passes[pngp->pass_pos].stride_x; + pngp->pass_height = (ihdr->height - passes[pngp->pass_pos].y + + passes[pngp->pass_pos].stride_y - 1) / passes[pngp->pass_pos].stride_y; + + pngp->data = (uint32_t*)malloc( + pngp->pass_width * pngp->pass_height * sizeof(uint32_t)); + + if (!pngp->data) + return -1; + + pngp->ihdr = *ihdr; + pngp->ihdr.width = pngp->pass_width; + pngp->ihdr.height = pngp->pass_height; + + png_pass_geom(&pngp->ihdr, pngp->pass_width, + pngp->pass_height, NULL, NULL, &pngp->pass_size); + + if (pngp->pass_size > pngp->total_out) + { + free(pngp->data); + pngp->data = NULL; + return -1; + } + + pngp->adam7_pass_initialized = true; + + return 0; + } + + if (pngp->pass_initialized) + return 0; + + png_pass_geom(ihdr, ihdr->width, ihdr->height, &pngp->bpp, &pngp->pitch, &pass_size); + + if (pngp->total_out < pass_size) + return -1; + + pngp->restore_buf_size = 0; + pngp->data_restore_buf_size = 0; + pngp->prev_scanline = (uint8_t*)calloc(1, pngp->pitch); + pngp->decoded_scanline = (uint8_t*)calloc(1, pngp->pitch); + + if (!pngp->prev_scanline || !pngp->decoded_scanline) + goto error; + + pngp->h = 0; + pngp->pass_initialized = true; + + return 0; + +error: + png_reverse_filter_deinit(pngp); + return -1; +} + +static int png_reverse_filter_copy_line(uint32_t *data, const struct png_ihdr *ihdr, + struct rpng_process *pngp, unsigned filter) +{ + unsigned i; + + switch (filter) + { + case PNG_FILTER_NONE: + memcpy(pngp->decoded_scanline, pngp->inflate_buf, pngp->pitch); + break; + case PNG_FILTER_SUB: + for (i = 0; i < pngp->bpp; i++) + pngp->decoded_scanline[i] = pngp->inflate_buf[i]; + for (i = pngp->bpp; i < pngp->pitch; i++) + pngp->decoded_scanline[i] = pngp->decoded_scanline[i - pngp->bpp] + pngp->inflate_buf[i]; + break; + case PNG_FILTER_UP: + for (i = 0; i < pngp->pitch; i++) + pngp->decoded_scanline[i] = pngp->prev_scanline[i] + pngp->inflate_buf[i]; + break; + case PNG_FILTER_AVERAGE: + for (i = 0; i < pngp->bpp; i++) + { + uint8_t avg = pngp->prev_scanline[i] >> 1; + pngp->decoded_scanline[i] = avg + pngp->inflate_buf[i]; + } + for (i = pngp->bpp; i < pngp->pitch; i++) + { + uint8_t avg = (pngp->decoded_scanline[i - pngp->bpp] + pngp->prev_scanline[i]) >> 1; + pngp->decoded_scanline[i] = avg + pngp->inflate_buf[i]; + } + break; + case PNG_FILTER_PAETH: + for (i = 0; i < pngp->bpp; i++) + pngp->decoded_scanline[i] = paeth(0, pngp->prev_scanline[i], 0) + pngp->inflate_buf[i]; + for (i = pngp->bpp; i < pngp->pitch; i++) + pngp->decoded_scanline[i] = paeth(pngp->decoded_scanline[i - pngp->bpp], + pngp->prev_scanline[i], pngp->prev_scanline[i - pngp->bpp]) + pngp->inflate_buf[i]; + break; + + default: + return IMAGE_PROCESS_ERROR_END; + } + + switch (ihdr->color_type) + { + case PNG_IHDR_COLOR_GRAY: + png_reverse_filter_copy_line_bw(data, pngp->decoded_scanline, ihdr->width, ihdr->depth); + break; + case PNG_IHDR_COLOR_RGB: + png_reverse_filter_copy_line_rgb(data, pngp->decoded_scanline, ihdr->width, ihdr->depth); + break; + case PNG_IHDR_COLOR_PLT: + png_reverse_filter_copy_line_plt(data, pngp->decoded_scanline, ihdr->width, + ihdr->depth, pngp->palette); + break; + case PNG_IHDR_COLOR_GRAY_ALPHA: + png_reverse_filter_copy_line_gray_alpha(data, pngp->decoded_scanline, ihdr->width, + ihdr->depth); + break; + case PNG_IHDR_COLOR_RGBA: + png_reverse_filter_copy_line_rgba(data, pngp->decoded_scanline, ihdr->width, ihdr->depth); + break; + } + + memcpy(pngp->prev_scanline, pngp->decoded_scanline, pngp->pitch); + + return IMAGE_PROCESS_NEXT; +} + +static int png_reverse_filter_regular_iterate(uint32_t **data, const struct png_ihdr *ihdr, + struct rpng_process *pngp) +{ + int ret = IMAGE_PROCESS_END; + + if (pngp->h < ihdr->height) + { + unsigned filter = *pngp->inflate_buf++; + pngp->restore_buf_size += 1; + ret = png_reverse_filter_copy_line(*data, + ihdr, pngp, filter); + } + + if (ret == IMAGE_PROCESS_END || ret == IMAGE_PROCESS_ERROR_END) + goto end; + + pngp->h++; + pngp->inflate_buf += pngp->pitch; + pngp->restore_buf_size += pngp->pitch; + + *data += ihdr->width; + pngp->data_restore_buf_size += ihdr->width; + + return IMAGE_PROCESS_NEXT; + +end: + png_reverse_filter_deinit(pngp); + + pngp->inflate_buf -= pngp->restore_buf_size; + *data -= pngp->data_restore_buf_size; + pngp->data_restore_buf_size = 0; + return ret; +} + +static int png_reverse_filter_adam7_iterate(uint32_t **data_, + const struct png_ihdr *ihdr, + struct rpng_process *pngp) +{ + int ret = 0; + bool to_next = pngp->pass_pos < ARRAY_SIZE(passes); + uint32_t *data = *data_; + + if (!to_next) + return IMAGE_PROCESS_END; + + ret = png_reverse_filter_init(ihdr, pngp); + + if (ret == 1) + return IMAGE_PROCESS_NEXT; + if (ret == -1) + return IMAGE_PROCESS_ERROR_END; + + if (png_reverse_filter_init(&pngp->ihdr, pngp) == -1) + return IMAGE_PROCESS_ERROR; + + do + { + ret = png_reverse_filter_regular_iterate(&pngp->data, + &pngp->ihdr, pngp); + } while (ret == IMAGE_PROCESS_NEXT); + + if (ret == IMAGE_PROCESS_ERROR || ret == IMAGE_PROCESS_ERROR_END) + return IMAGE_PROCESS_ERROR; + + pngp->inflate_buf += pngp->pass_size; + pngp->adam7_restore_buf_size += pngp->pass_size; + + pngp->total_out -= pngp->pass_size; + + png_reverse_filter_adam7_deinterlace_pass(data, + ihdr, pngp->data, pngp->pass_width, pngp->pass_height, &passes[pngp->pass_pos]); + + free(pngp->data); + + pngp->data = NULL; + pngp->pass_width = 0; + pngp->pass_height = 0; + pngp->pass_size = 0; + pngp->adam7_pass_initialized = false; + + return IMAGE_PROCESS_NEXT; +} + +static int png_reverse_filter_adam7(uint32_t **data_, + const struct png_ihdr *ihdr, + struct rpng_process *pngp) +{ + int ret = png_reverse_filter_adam7_iterate(data_, + ihdr, pngp); + + switch (ret) + { + case IMAGE_PROCESS_ERROR_END: + case IMAGE_PROCESS_END: + break; + case IMAGE_PROCESS_NEXT: + pngp->pass_pos++; + return 0; + case IMAGE_PROCESS_ERROR: + if (pngp->data) + { + free(pngp->data); + pngp->data = NULL; + } + pngp->inflate_buf -= pngp->adam7_restore_buf_size; + pngp->adam7_restore_buf_size = 0; + return -1; + } + + pngp->inflate_buf -= pngp->adam7_restore_buf_size; + pngp->adam7_restore_buf_size = 0; + return ret; +} + +static int png_reverse_filter_iterate(rpng_t *rpng, uint32_t **data) +{ + if (!rpng) + return false; + + if (rpng->ihdr.interlace && rpng->process) + return png_reverse_filter_adam7(data, &rpng->ihdr, rpng->process); + + return png_reverse_filter_regular_iterate(data, &rpng->ihdr, rpng->process); +} + +static int rpng_load_image_argb_process_inflate_init(rpng_t *rpng, uint32_t **data) +{ + bool zstatus; + enum trans_stream_error terror; + uint32_t rd, wn; + struct rpng_process *process = (struct rpng_process*)rpng->process; + bool to_continue = (process->avail_in > 0 + && process->avail_out > 0); + + if (!to_continue) + goto end; + + zstatus = process->stream_backend->trans(process->stream, false, &rd, &wn, &terror); + + if (!zstatus && terror != TRANS_STREAM_ERROR_BUFFER_FULL) + goto error; + + process->avail_in -= rd; + process->avail_out -= wn; + process->total_out += wn; + + if (terror) + return 0; + +end: + process->stream_backend->stream_free(process->stream); + process->stream = NULL; + +#ifdef GEKKO + /* we often use these in textures, make sure they're 32-byte aligned */ + *data = (uint32_t*)memalign(32, rpng->ihdr.width * + rpng->ihdr.height * sizeof(uint32_t)); +#else + *data = (uint32_t*)malloc(rpng->ihdr.width * + rpng->ihdr.height * sizeof(uint32_t)); +#endif + if (!*data) + goto false_end; + + process->adam7_restore_buf_size = 0; + process->restore_buf_size = 0; + process->palette = rpng->palette; + + if (rpng->ihdr.interlace != 1) + if (png_reverse_filter_init(&rpng->ihdr, process) == -1) + goto false_end; + + process->inflate_initialized = true; + return 1; + +error: +false_end: + process->inflate_initialized = false; + return -1; +} + +static bool png_read_plte(uint8_t *buf, + uint32_t *buffer, unsigned entries) +{ + unsigned i; + + for (i = 0; i < entries; i++) + { + uint32_t r = buf[3 * i + 0]; + uint32_t g = buf[3 * i + 1]; + uint32_t b = buf[3 * i + 2]; + buffer[i] = (r << 16) | (g << 8) | (b << 0) | (0xffu << 24); + } + + return true; +} + +static bool png_read_trns(uint8_t *buf, uint32_t *palette, unsigned entries) +{ + unsigned i; + + for (i = 0; i < entries; i++, buf++, palette++) + *palette = (*palette & 0x00ffffff) | (unsigned)*buf << 24; + + return true; +} + +bool png_realloc_idat(struct idat_buffer *buf, uint32_t chunk_size) +{ + uint8_t *new_buffer = (uint8_t*)realloc(buf->data, buf->size + chunk_size); + + if (!new_buffer) + return false; + + buf->data = new_buffer; + return true; +} + +static struct rpng_process *rpng_process_init(rpng_t *rpng) +{ + uint8_t *inflate_buf = NULL; + struct rpng_process *process = (struct rpng_process*)malloc(sizeof(*process)); + + if (!process) + return NULL; + + process->inflate_initialized = false; + process->adam7_pass_initialized = false; + process->pass_initialized = false; + process->prev_scanline = NULL; + process->decoded_scanline = NULL; + process->inflate_buf = NULL; + + process->ihdr.width = 0; + process->ihdr.height = 0; + process->ihdr.depth = 0; + process->ihdr.color_type = 0; + process->ihdr.compression = 0; + process->ihdr.filter = 0; + process->ihdr.interlace = 0; + + process->restore_buf_size = 0; + process->adam7_restore_buf_size = 0; + process->data_restore_buf_size = 0; + process->inflate_buf_size = 0; + process->avail_in = 0; + process->avail_out = 0; + process->total_out = 0; + process->pass_size = 0; + process->bpp = 0; + process->pitch = 0; + process->h = 0; + process->pass_width = 0; + process->pass_height = 0; + process->pass_pos = 0; + process->data = 0; + process->palette = 0; + process->stream = NULL; + process->stream_backend = trans_stream_get_zlib_inflate_backend(); + + png_pass_geom(&rpng->ihdr, rpng->ihdr.width, + rpng->ihdr.height, NULL, NULL, &process->inflate_buf_size); + if (rpng->ihdr.interlace == 1) /* To be sure. */ + process->inflate_buf_size *= 2; + + process->stream = process->stream_backend->stream_new(); + + if (!process->stream) + { + free(process); + return NULL; + } + + inflate_buf = (uint8_t*)malloc(process->inflate_buf_size); + if (!inflate_buf) + goto error; + + process->inflate_buf = inflate_buf; + process->avail_in = rpng->idat_buf.size; + process->avail_out = process->inflate_buf_size; + + process->stream_backend->set_in( + process->stream, + rpng->idat_buf.data, + (uint32_t)rpng->idat_buf.size); + process->stream_backend->set_out( + process->stream, + process->inflate_buf, + (uint32_t)process->inflate_buf_size); + + return process; + +error: + if (process) + { + if (process->stream) + process->stream_backend->stream_free(process->stream); + free(process); + } + return NULL; +} + +static enum png_chunk_type read_chunk_header( + uint8_t *buf, uint32_t chunk_size) +{ + unsigned i; + char type[4]; + + for (i = 0; i < 4; i++) + { + uint8_t byte = buf[i + 4]; + + /* All four bytes of the chunk type must be + * ASCII letters (codes 65-90 and 97-122) */ + if ((byte < 65) || ((byte > 90) && (byte < 97)) || (byte > 122)) + return PNG_CHUNK_ERROR; + type[i] = byte; + } + + if ( + type[0] == 'I' + && type[1] == 'H' + && type[2] == 'D' + && type[3] == 'R' + ) + return PNG_CHUNK_IHDR; + else if + ( + type[0] == 'I' + && type[1] == 'D' + && type[2] == 'A' + && type[3] == 'T' + ) + return PNG_CHUNK_IDAT; + else if + ( + type[0] == 'I' + && type[1] == 'E' + && type[2] == 'N' + && type[3] == 'D' + ) + return PNG_CHUNK_IEND; + else if + ( + type[0] == 'P' + && type[1] == 'L' + && type[2] == 'T' + && type[3] == 'E' + ) + return PNG_CHUNK_PLTE; + else if + ( + type[0] == 't' + && type[1] == 'R' + && type[2] == 'N' + && type[3] == 'S' + ) + return PNG_CHUNK_tRNS; + + return PNG_CHUNK_NOOP; +} + +bool rpng_iterate_image(rpng_t *rpng) +{ + unsigned i; + uint8_t *buf = (uint8_t*)rpng->buff_data; + uint32_t chunk_size = 0; + + /* Check whether data buffer pointer is valid */ + if (buf > rpng->buff_end) + return false; + + /* Check whether reading the header will overflow + * the data buffer */ + if (rpng->buff_end - buf < 8) + return false; + + chunk_size = dword_be(buf); + + /* Check whether chunk will overflow the data buffer */ + if (buf + 8 + chunk_size > rpng->buff_end) + return false; + + switch (read_chunk_header(buf, chunk_size)) + { + case PNG_CHUNK_NOOP: + default: + break; + + case PNG_CHUNK_ERROR: + return false; + + case PNG_CHUNK_IHDR: + if (rpng->has_ihdr || rpng->has_idat || rpng->has_iend) + return false; + + if (chunk_size != 13) + return false; + + buf += 4 + 4; + + rpng->ihdr.width = dword_be(buf + 0); + rpng->ihdr.height = dword_be(buf + 4); + rpng->ihdr.depth = buf[8]; + rpng->ihdr.color_type = buf[9]; + rpng->ihdr.compression = buf[10]; + rpng->ihdr.filter = buf[11]; + rpng->ihdr.interlace = buf[12]; + + if ( rpng->ihdr.width == 0 + || rpng->ihdr.height == 0 + /* ensure multiplications don't overflow and wrap around, that'd give buffer overflow crashes */ + || (uint64_t)rpng->ihdr.width*rpng->ihdr.height*sizeof(uint32_t) >= 0x80000000) + return false; + + if (!png_process_ihdr(&rpng->ihdr)) + return false; + + if (rpng->ihdr.compression != 0) + { +#if defined(DEBUG) || defined(RPNG_TEST) + fprintf(stderr, "[RPNG]: Error in line %d.\n", __LINE__); +#endif + return false; + } + + rpng->has_ihdr = true; + break; + + case PNG_CHUNK_PLTE: + { + unsigned entries = chunk_size / 3; + + if ( !rpng->has_ihdr + || rpng->has_plte + || rpng->has_iend + || rpng->has_idat + || rpng->has_trns) + return false; + + if (chunk_size % 3) + return false; + + if (entries > 256) + return false; + + buf += 8; + + if (!png_read_plte(buf, rpng->palette, entries)) + return false; + + rpng->has_plte = true; + } + break; + + case PNG_CHUNK_tRNS: + if (rpng->has_idat) + return false; + + if (rpng->ihdr.color_type == PNG_IHDR_COLOR_PLT) + { + /* we should compare with the number of palette entries */ + if (chunk_size > 256) + return false; + + buf += 8; + + if (!png_read_trns(buf, rpng->palette, chunk_size)) + return false; + } + /* TODO: support colorkey in grayscale and truecolor images */ + + rpng->has_trns = true; + break; + + case PNG_CHUNK_IDAT: + if (!(rpng->has_ihdr) || rpng->has_iend || (rpng->ihdr.color_type == PNG_IHDR_COLOR_PLT && !(rpng->has_plte))) + return false; + + if (!png_realloc_idat(&rpng->idat_buf, chunk_size)) + return false; + + buf += 8; + + for (i = 0; i < chunk_size; i++) + rpng->idat_buf.data[i + rpng->idat_buf.size] = buf[i]; + + rpng->idat_buf.size += chunk_size; + + rpng->has_idat = true; + break; + + case PNG_CHUNK_IEND: + if (!(rpng->has_ihdr) || !(rpng->has_idat)) + return false; + + rpng->has_iend = true; + return false; + } + + rpng->buff_data += chunk_size + 12; + + /* Check whether data buffer pointer is valid */ + if (rpng->buff_data > rpng->buff_end) + return false; + return true; +} + +int rpng_process_image(rpng_t *rpng, + void **_data, size_t size, unsigned *width, unsigned *height) +{ + uint32_t **data = (uint32_t**)_data; + + (void)size; + + if (!rpng->process) + { + struct rpng_process *process = rpng_process_init(rpng); + + if (!process) + goto error; + + rpng->process = process; + return IMAGE_PROCESS_NEXT; + } + + if (!rpng->process->inflate_initialized) + { + if (rpng_load_image_argb_process_inflate_init(rpng, data) == -1) + goto error; + return IMAGE_PROCESS_NEXT; + } + + *width = rpng->ihdr.width; + *height = rpng->ihdr.height; + + return png_reverse_filter_iterate(rpng, data); + +error: + if (rpng->process) + { + if (rpng->process->inflate_buf) + free(rpng->process->inflate_buf); + if (rpng->process->stream) + rpng->process->stream_backend->stream_free(rpng->process->stream); + free(rpng->process); + rpng->process = NULL; + } + return IMAGE_PROCESS_ERROR; +} + +void rpng_free(rpng_t *rpng) +{ + if (!rpng) + return; + + if (rpng->idat_buf.data) + free(rpng->idat_buf.data); + if (rpng->process) + { + if (rpng->process->inflate_buf) + free(rpng->process->inflate_buf); + if (rpng->process->stream) + { + if (rpng->process->stream_backend && rpng->process->stream_backend->stream_free) + rpng->process->stream_backend->stream_free(rpng->process->stream); + else + free(rpng->process->stream); + } + free(rpng->process); + } + + free(rpng); +} + +bool rpng_start(rpng_t *rpng) +{ + if (!rpng) + return false; + + /* Check whether reading the header will overflow + * the data buffer */ + if (rpng->buff_end - rpng->buff_data < 8) + return false; + + if (string_is_not_equal_fast( + rpng->buff_data, png_magic, sizeof(png_magic))) + return false; + + rpng->buff_data += 8; + + return true; +} + +bool rpng_is_valid(rpng_t *rpng) +{ + /* A valid PNG image must contain an IHDR chunk, + * one or more IDAT chunks, and an IEND chunk */ + if (rpng && rpng->has_ihdr && rpng->has_idat && rpng->has_iend) + return true; + + return false; +} + +bool rpng_set_buf_ptr(rpng_t *rpng, void *data, size_t len) +{ + if (!rpng || (len < 1)) + return false; + + rpng->buff_data = (uint8_t*)data; + rpng->buff_end = rpng->buff_data + (len - 1); + + return true; +} + +rpng_t *rpng_alloc(void) +{ + rpng_t *rpng = (rpng_t*)calloc(1, sizeof(*rpng)); + if (!rpng) + return NULL; + return rpng; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/png/rpng_encode.c
Added
@@ -0,0 +1,448 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rpng_encode.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <libretro.h> +#include <encodings/crc32.h> +#include <streams/interface_stream.h> +#include <streams/trans_stream.h> + +#include "rpng_internal.h" + +#undef GOTO_END_ERROR +#define GOTO_END_ERROR() do { \ + fprintf(stderr, "[RPNG]: Error in line %d.\n", __LINE__); \ + ret = false; \ + goto end; \ +} while (0) + +double DEFLATE_PADDING = 1.1; +int PNG_ROUGH_HEADER = 100; + +static void dword_write_be(uint8_t *buf, uint32_t val) +{ + *buf++ = (uint8_t)(val >> 24); + *buf++ = (uint8_t)(val >> 16); + *buf++ = (uint8_t)(val >> 8); + *buf++ = (uint8_t)(val >> 0); +} + +static bool png_write_crc_string(intfstream_t *intf_s, const uint8_t *data, size_t size) +{ + uint8_t crc_raw[4] = {0}; + uint32_t crc = encoding_crc32(0, data, size); + + dword_write_be(crc_raw, crc); + return intfstream_write(intf_s, crc_raw, sizeof(crc_raw)) == sizeof(crc_raw); +} + +static bool png_write_ihdr_string(intfstream_t *intf_s, const struct png_ihdr *ihdr) +{ + uint8_t ihdr_raw[21]; + + ihdr_raw[0] = '0'; /* Size */ + ihdr_raw[1] = '0'; + ihdr_raw[2] = '0'; + ihdr_raw[3] = '0'; + ihdr_raw[4] = 'I'; + ihdr_raw[5] = 'H'; + ihdr_raw[6] = 'D'; + ihdr_raw[7] = 'R'; + ihdr_raw[8] = 0; /* Width */ + ihdr_raw[9] = 0; + ihdr_raw[10] = 0; + ihdr_raw[11] = 0; + ihdr_raw[12] = 0; /* Height */ + ihdr_raw[13] = 0; + ihdr_raw[14] = 0; + ihdr_raw[15] = 0; + ihdr_raw[16] = ihdr->depth; /* Depth */ + ihdr_raw[17] = ihdr->color_type; + ihdr_raw[18] = ihdr->compression; + ihdr_raw[19] = ihdr->filter; + ihdr_raw[20] = ihdr->interlace; + + dword_write_be(ihdr_raw + 0, sizeof(ihdr_raw) - 8); + dword_write_be(ihdr_raw + 8, ihdr->width); + dword_write_be(ihdr_raw + 12, ihdr->height); + if (intfstream_write(intf_s, ihdr_raw, sizeof(ihdr_raw)) != sizeof(ihdr_raw)) + return false; + + return png_write_crc_string(intf_s, ihdr_raw + sizeof(uint32_t), + sizeof(ihdr_raw) - sizeof(uint32_t)); +} + +static bool png_write_idat_string(intfstream_t* intf_s, const uint8_t *data, size_t size) +{ + if (intfstream_write(intf_s, data, size) != (ssize_t)size) + return false; + + return png_write_crc_string(intf_s, data + sizeof(uint32_t), size - sizeof(uint32_t)); +} + +static bool png_write_iend_string(intfstream_t* intf_s) +{ + const uint8_t data[] = { + 0, 0, 0, 0, + 'I', 'E', 'N', 'D', + }; + + if (intfstream_write(intf_s, data, sizeof(data)) != sizeof(data)) + return false; + + return png_write_crc_string(intf_s, data + sizeof(uint32_t), + sizeof(data) - sizeof(uint32_t)); +} + +static void copy_argb_line(uint8_t *dst, const uint32_t *src, unsigned width) +{ + unsigned i; + for (i = 0; i < width; i++) + { + uint32_t col = src[i]; + *dst++ = (uint8_t)(col >> 16); + *dst++ = (uint8_t)(col >> 8); + *dst++ = (uint8_t)(col >> 0); + *dst++ = (uint8_t)(col >> 24); + } +} + +static void copy_bgr24_line(uint8_t *dst, const uint8_t *src, unsigned width) +{ + unsigned i; + for (i = 0; i < width; i++, dst += 3, src += 3) + { + dst[2] = src[0]; + dst[1] = src[1]; + dst[0] = src[2]; + } +} + +static unsigned count_sad(const uint8_t *data, size_t size) +{ + size_t i; + unsigned cnt = 0; + for (i = 0; i < size; i++) + { + if (data[i]) + cnt += abs((int8_t)data[i]); + } + return cnt; +} + +static unsigned filter_up(uint8_t *target, const uint8_t *line, + const uint8_t *prev, unsigned width, unsigned bpp) +{ + unsigned i; + width *= bpp; + for (i = 0; i < width; i++) + target[i] = line[i] - prev[i]; + + return count_sad(target, width); +} + +static unsigned filter_sub(uint8_t *target, const uint8_t *line, + unsigned width, unsigned bpp) +{ + unsigned i; + width *= bpp; + for (i = 0; i < bpp; i++) + target[i] = line[i]; + for (i = bpp; i < width; i++) + target[i] = line[i] - line[i - bpp]; + + return count_sad(target, width); +} + +static unsigned filter_avg(uint8_t *target, const uint8_t *line, + const uint8_t *prev, unsigned width, unsigned bpp) +{ + unsigned i; + width *= bpp; + for (i = 0; i < bpp; i++) + target[i] = line[i] - (prev[i] >> 1); + for (i = bpp; i < width; i++) + target[i] = line[i] - ((line[i - bpp] + prev[i]) >> 1); + + return count_sad(target, width); +} + +static unsigned filter_paeth(uint8_t *target, + const uint8_t *line, const uint8_t *prev, + unsigned width, unsigned bpp) +{ + unsigned i; + width *= bpp; + for (i = 0; i < bpp; i++) + target[i] = line[i] - paeth(0, prev[i], 0); + for (i = bpp; i < width; i++) + target[i] = line[i] - paeth(line[i - bpp], prev[i], prev[i - bpp]); + + return count_sad(target, width); +} + +bool rpng_save_image_stream(const uint8_t *data, intfstream_t* intf_s, + unsigned width, unsigned height, signed pitch, unsigned bpp) +{ + unsigned h; + struct png_ihdr ihdr = {0}; + bool ret = true; + const struct trans_stream_backend *stream_backend = NULL; + size_t encode_buf_size = 0; + uint8_t *encode_buf = NULL; + uint8_t *deflate_buf = NULL; + uint8_t *rgba_line = NULL; + uint8_t *up_filtered = NULL; + uint8_t *sub_filtered = NULL; + uint8_t *avg_filtered = NULL; + uint8_t *paeth_filtered = NULL; + uint8_t *prev_encoded = NULL; + uint8_t *encode_target = NULL; + void *stream = NULL; + uint32_t total_in = 0; + uint32_t total_out = 0; + + if (!intf_s) + GOTO_END_ERROR(); + + stream_backend = trans_stream_get_zlib_deflate_backend(); + + if (intfstream_write(intf_s, png_magic, sizeof(png_magic)) != sizeof(png_magic)) + GOTO_END_ERROR(); + + ihdr.width = width; + ihdr.height = height; + ihdr.depth = 8; + ihdr.color_type = bpp == sizeof(uint32_t) ? 6 : 2; /* RGBA or RGB */ + if (!png_write_ihdr_string(intf_s, &ihdr)) + GOTO_END_ERROR(); + + encode_buf_size = (width * bpp + 1) * height; + encode_buf = (uint8_t*)malloc(encode_buf_size); + if (!encode_buf) + GOTO_END_ERROR(); + + prev_encoded = (uint8_t*)calloc(1, width * bpp); + if (!prev_encoded) + GOTO_END_ERROR(); + + rgba_line = (uint8_t*)malloc(width * bpp); + up_filtered = (uint8_t*)malloc(width * bpp); + sub_filtered = (uint8_t*)malloc(width * bpp); + avg_filtered = (uint8_t*)malloc(width * bpp); + paeth_filtered = (uint8_t*)malloc(width * bpp); + if (!rgba_line || !up_filtered || !sub_filtered || !avg_filtered || !paeth_filtered) + GOTO_END_ERROR(); + + encode_target = encode_buf; + for (h = 0; h < height; + h++, encode_target += width * bpp, data += pitch) + { + if (bpp == sizeof(uint32_t)) + copy_argb_line(rgba_line, (const uint32_t*)data, width); + else + copy_bgr24_line(rgba_line, data, width); + + /* Try every filtering method, and choose the method + * which has most entries as zero. + * + * This is probably not very optimal, but it's very + * simple to implement. + */ + { + unsigned none_score = count_sad(rgba_line, width * bpp); + unsigned up_score = filter_up(up_filtered, rgba_line, prev_encoded, width, bpp); + unsigned sub_score = filter_sub(sub_filtered, rgba_line, width, bpp); + unsigned avg_score = filter_avg(avg_filtered, rgba_line, prev_encoded, width, bpp); + unsigned paeth_score = filter_paeth(paeth_filtered, rgba_line, prev_encoded, width, bpp); + + uint8_t filter = 0; + unsigned min_sad = none_score; + const uint8_t *chosen_filtered = rgba_line; + + if (sub_score < min_sad) + { + filter = 1; + chosen_filtered = sub_filtered; + min_sad = sub_score; + } + + if (up_score < min_sad) + { + filter = 2; + chosen_filtered = up_filtered; + min_sad = up_score; + } + + if (avg_score < min_sad) + { + filter = 3; + chosen_filtered = avg_filtered; + min_sad = avg_score; + } + + if (paeth_score < min_sad) + { + filter = 4; + chosen_filtered = paeth_filtered; + } + + *encode_target++ = filter; + memcpy(encode_target, chosen_filtered, width * bpp); + + memcpy(prev_encoded, rgba_line, width * bpp); + } + } + + deflate_buf = (uint8_t*)malloc(encode_buf_size * 2); /* Just to be sure. */ + if (!deflate_buf) + GOTO_END_ERROR(); + + stream = stream_backend->stream_new(); + + if (!stream) + GOTO_END_ERROR(); + + stream_backend->set_in( + stream, + encode_buf, + (unsigned)encode_buf_size); + stream_backend->set_out( + stream, + deflate_buf + 8, + (unsigned)(encode_buf_size * 2)); + + if (!stream_backend->trans(stream, true, &total_in, &total_out, NULL)) + GOTO_END_ERROR(); + + memcpy(deflate_buf + 4, "IDAT", 4); + dword_write_be(deflate_buf + 0, ((uint32_t)total_out)); + if (!png_write_idat_string(intf_s, deflate_buf, ((size_t)total_out + 8))) + GOTO_END_ERROR(); + + if (!png_write_iend_string(intf_s)) + GOTO_END_ERROR(); +end: + free(encode_buf); + free(deflate_buf); + free(rgba_line); + free(prev_encoded); + free(up_filtered); + free(sub_filtered); + free(avg_filtered); + free(paeth_filtered); + + if (stream_backend) + { + if (stream) + { + if (stream_backend->stream_free) + stream_backend->stream_free(stream); + } + } + return ret; +} + +bool rpng_save_image_argb(const char *path, const uint32_t *data, + unsigned width, unsigned height, unsigned pitch) +{ + bool ret = false; + intfstream_t* intf_s = NULL; + + intf_s = intfstream_open_file(path, + RETRO_VFS_FILE_ACCESS_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + ret = rpng_save_image_stream((const uint8_t*) data, intf_s, + width, height, + (signed) pitch, sizeof(uint32_t)); + intfstream_close(intf_s); + free(intf_s); + return ret; +} + +bool rpng_save_image_bgr24(const char *path, const uint8_t *data, + unsigned width, unsigned height, unsigned pitch) +{ + bool ret = false; + intfstream_t* intf_s = NULL; + + intf_s = intfstream_open_file(path, + RETRO_VFS_FILE_ACCESS_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + ret = rpng_save_image_stream(data, intf_s, width, height, + (signed) pitch, 3); + intfstream_close(intf_s); + free(intf_s); + return ret; +} + + +uint8_t* rpng_save_image_bgr24_string(const uint8_t *data, + unsigned width, unsigned height, signed pitch, uint64_t* bytes) +{ + bool ret = false; + uint8_t* buf = NULL; + uint8_t* output = NULL; + int buf_length = 0; + intfstream_t* intf_s = NULL; + + buf_length = (int)(width*height*3*DEFLATE_PADDING)+PNG_ROUGH_HEADER; + buf = (uint8_t*)malloc(buf_length*sizeof(uint8_t)); + if (!buf) + GOTO_END_ERROR(); + + intf_s = intfstream_open_writable_memory(buf, + RETRO_VFS_FILE_ACCESS_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE, + buf_length); + + ret = rpng_save_image_stream((const uint8_t*)data, + intf_s, width, height, pitch, 3); + + *bytes = intfstream_get_ptr(intf_s); + intfstream_rewind(intf_s); + output = (uint8_t*)malloc((size_t)((*bytes)*sizeof(uint8_t))); + if (!output) + GOTO_END_ERROR(); + intfstream_read(intf_s, output, *bytes); + +end: + if (buf) + free(buf); + if (intf_s) + { + intfstream_close(intf_s); + free(intf_s); + } + if (ret == false) + { + if (output) + free(output); + return NULL; + } + return output; +} +
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/png/rpng_internal.h
Added
@@ -0,0 +1,49 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rpng_internal.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _RPNG_COMMON_H +#define _RPNG_COMMON_H + +#include <stdint.h> +#include <filters.h> +#include <formats/rpng.h> + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + +static const uint8_t png_magic[8] = { + 0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a, +}; + +struct png_ihdr +{ + uint32_t width; + uint32_t height; + uint8_t depth; + uint8_t color_type; + uint8_t compression; + uint8_t filter; + uint8_t interlace; +}; + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/tga
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/tga/rtga.c
Added
@@ -0,0 +1,474 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rtga.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Modified version of stb_image's TGA sources. */ + +#include <stdio.h> +#include <stdint.h> +#include <stdarg.h> +#include <stddef.h> /* ptrdiff_t on osx */ +#include <stdlib.h> +#include <string.h> + +#include <retro_assert.h> +#include <retro_inline.h> + +#include <formats/image.h> +#include <formats/rtga.h> + +#define RTGA_COMPUTE_Y(r, g, b) ((uint8_t)((((r) * 77) + ((g) * 150) + (29 * (b))) >> 8)) + +struct rtga +{ + uint8_t *buff_data; + uint32_t *output_image; +}; + +typedef struct +{ + uint8_t *img_buffer; + uint8_t *img_buffer_end; + uint8_t *img_buffer_original; + int buflen; + int img_n, img_out_n; + uint32_t img_x, img_y; + uint8_t buffer_start[128]; +} rtga_context; + +static INLINE uint8_t rtga_get8(rtga_context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + return 0; +} + +static void rtga_skip(rtga_context *s, int n) +{ + if (n < 0) + { + s->img_buffer = s->img_buffer_end; + return; + } + s->img_buffer += n; +} + +static int rtga_get16le(rtga_context *s) +{ + return rtga_get8(s) + (rtga_get8(s) << 8); +} + +static unsigned char *rtga_convert_format( + unsigned char *data, + int img_n, + int req_comp, + unsigned int x, + unsigned int y) +{ + int i,j; + unsigned char *good = (unsigned char *) malloc(req_comp * x * y); + + if (!good) + { + free(data); + return NULL; + } + + for (j=0; j < (int) y; ++j) + { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + switch (((img_n)*8+(req_comp))) + { + case ((1)*8+(2)): + for (i=x-1; i >= 0; --i, src += 1, dest += 2) + { + dest[0]=src[0]; + dest[1]=255; + } + break; + case ((1)*8+(3)): + for (i=x-1; i >= 0; --i, src += 1, dest += 3) + dest[0]=dest[1]=dest[2]=src[0]; + break; + case ((1)*8+(4)): + for (i=x-1; i >= 0; --i, src += 1, dest += 4) + { + dest[0]=dest[1]=dest[2]=src[0]; + dest[3]=255; + } + break; + case ((2)*8+(1)): + for (i=x-1; i >= 0; --i, src += 2, dest += 1) + dest[0]=src[0]; + break; + case ((2)*8+(3)): + for (i=x-1; i >= 0; --i, src += 2, dest += 3) + dest[0]=dest[1]=dest[2]=src[0]; + break; + case ((2)*8+(4)): + for (i=x-1; i >= 0; --i, src += 2, dest += 4) + { + dest[0]=dest[1]=dest[2]=src[0]; + dest[3]=src[1]; + } + break; + case ((3)*8+(4)): + for (i=x-1; i >= 0; --i, src += 3, dest += 4) + { + dest[0]=src[0]; + dest[1]=src[1]; + dest[2]=src[2]; + dest[3]=255; + } + break; + case ((3)*8+(1)): + for (i=x-1; i >= 0; --i, src += 3, dest += 1) + dest[0] = RTGA_COMPUTE_Y(src[0],src[1],src[2]); + break; + case ((3)*8+(2)): + for (i=x-1; i >= 0; --i, src += 3, dest += 2) + { + dest[0] = RTGA_COMPUTE_Y(src[0],src[1],src[2]); + dest[1] = 255; + } + break; + case ((4)*8+(1)): + for (i=x-1; i >= 0; --i, src += 4, dest += 1) + dest[0] = RTGA_COMPUTE_Y(src[0],src[1],src[2]); + break; + case ((4)*8+(2)): + for (i=x-1; i >= 0; --i, src += 4, dest += 2) + { + dest[0] = RTGA_COMPUTE_Y(src[0],src[1],src[2]); + dest[1] = src[3]; + } + break; + case ((4)*8+(3)): + for (i=x-1; i >= 0; --i, src += 4, dest += 3) + { + dest[0]=src[0]; + dest[1]=src[1]; + dest[2]=src[2]; + } + break; + default: + break; + } + } + + free(data); + return good; +} + +static uint8_t *rtga_tga_load(rtga_context *s, + unsigned *x, unsigned *y, int *comp, int req_comp) +{ + /* Read in the TGA header stuff */ + int tga_offset = rtga_get8(s); + int tga_indexed = rtga_get8(s); + int tga_image_type = rtga_get8(s); + int tga_is_RLE = 0; + int tga_palette_start = rtga_get16le(s); + int tga_palette_len = rtga_get16le(s); + int tga_palette_bits = rtga_get8(s); + int tga_x_origin = rtga_get16le(s); + int tga_y_origin = rtga_get16le(s); + int tga_width = rtga_get16le(s); + int tga_height = rtga_get16le(s); + int tga_bits_per_pixel = rtga_get8(s); + int tga_comp = tga_bits_per_pixel / 8; + int tga_inverted = rtga_get8(s); + + /* image data */ + unsigned char *tga_data = NULL; + + (void)tga_palette_start; + (void)tga_x_origin; + (void)tga_y_origin; + + /* do a tiny bit of precessing */ + if (tga_image_type >= 8) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + + /* int tga_alpha_bits = tga_inverted & 15; */ + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + /* error check */ + if ( + (tga_width < 1) || (tga_height < 1) || + (tga_image_type < 1) || (tga_image_type > 3) || + ( + (tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && + (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32) + ) + ) + return NULL; /* we don't report this as a bad TGA because we don't even know if it's TGA */ + + /* If paletted, then we will use the number of bits from the palette */ + if (tga_indexed) + tga_comp = tga_palette_bits / 8; + + /* TGA info */ + *x = tga_width; + *y = tga_height; + if (comp) + *comp = tga_comp; + + tga_data = (unsigned char*)malloc((size_t)tga_width * tga_height * tga_comp); + if (!tga_data) + return NULL; + + /* skip to the data's starting position (offset usually = 0) */ + rtga_skip(s, tga_offset ); + + if (!tga_indexed && !tga_is_RLE) + { + int i; + for (i=0; i < tga_height; ++i) + { + int _y = tga_inverted ? (tga_height -i - 1) : i; + uint8_t *tga_row = tga_data + _y * tga_width * tga_comp; + int n = tga_width * tga_comp; + + if (s->img_buffer + n <= s->img_buffer_end) + { + memcpy(tga_row, s->img_buffer, n); + s->img_buffer += n; + } + } + } + else + { + int i, j; + int RLE_repeating = 0; + int RLE_count = 0; + int read_next_pixel = 1; + /* Needs to be at least 18 bytes to silence a GCC warning, + * only 4 are actually used */ + unsigned char raw_data[18] = {0}; + unsigned char *tga_palette = NULL; + + /* Do I need to load a palette? */ + if (tga_indexed) + { + int n; + /* Any data to skip? (offset usually = 0) */ + rtga_skip(s, tga_palette_start ); + /* Load the palette */ + tga_palette = (unsigned char*)malloc(tga_palette_len * tga_palette_bits / 8); + + if (!tga_palette) + { + free(tga_data); + return NULL; + } + + n = tga_palette_len * tga_palette_bits / 8; + + if (s->img_buffer+n <= s->img_buffer_end) + { + memcpy(tga_palette, s->img_buffer, n); + s->img_buffer += n; + } + else + { + free(tga_data); + free(tga_palette); + return NULL; + } + } + + /* load the data */ + for (i=0; i < tga_width * tga_height; ++i) + { + /* if I'm in RLE mode, do I need to get a RLE rtga_png chunk? */ + if (tga_is_RLE) + { + if (RLE_count == 0) + { + /* yep, get the next byte as a RLE command */ + int RLE_cmd = rtga_get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } + else if (!RLE_repeating) + read_next_pixel = 1; + } + else + read_next_pixel = 1; + + /* OK, if I need to read a pixel, do it now */ + if (read_next_pixel) + { + /* load however much data we did have */ + if (tga_indexed) + { + /* read in 1 byte, then perform the lookup */ + int pal_idx = rtga_get8(s); + if (pal_idx >= tga_palette_len) /* invalid index */ + pal_idx = 0; + pal_idx *= tga_bits_per_pixel / 8; + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + raw_data[j] = tga_palette[pal_idx+j]; + } + else + { + /* read in the data raw */ + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + raw_data[j] = rtga_get8(s); + } + + /* clear the reading flag for the next pixel */ + read_next_pixel = 0; + } /* end of reading a pixel */ + + /* copy data */ + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + /* in case we're in RLE mode, keep counting down */ + --RLE_count; + } + + /* do I need to invert the image? */ + if (tga_inverted) + { + if (tga_data) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + } + + /* Clear my palette, if I had one */ + if (tga_palette) + free(tga_palette); + } + + /* swap RGB */ + if (tga_comp >= 3) + { + int i; + unsigned char* tga_pixel = tga_data; + + for (i = 0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + /* convert to target component count */ + if ( (req_comp) + && (req_comp >= 1 && req_comp <= 4) + && (req_comp != tga_comp)) + { + tga_data = rtga_convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + } + + return tga_data; +} + +static uint8_t *rtga_load_from_memory(uint8_t const *buffer, int len, + unsigned *x, unsigned *y, int *comp, int req_comp) +{ + rtga_context s; + + s.img_buffer = (uint8_t *)buffer; + s.img_buffer_original = (uint8_t *) buffer; + s.img_buffer_end = (uint8_t *) buffer+len; + + return rtga_tga_load(&s,x,y,comp,req_comp); +} + +int rtga_process_image(rtga_t *rtga, void **buf_data, + size_t size, unsigned *width, unsigned *height) +{ + int comp; + unsigned size_tex = 0; + + if (!rtga) + return IMAGE_PROCESS_ERROR; + + rtga->output_image = (uint32_t*)rtga_load_from_memory(rtga->buff_data, + (int)size, width, height, &comp, 4); + *buf_data = rtga->output_image; + size_tex = (*width) * (*height); + + /* Convert RGBA to ARGB */ + while (size_tex--) + { + unsigned int texel = rtga->output_image[size_tex]; + unsigned int A = texel & 0xFF000000; + unsigned int B = texel & 0x00FF0000; + unsigned int G = texel & 0x0000FF00; + unsigned int R = texel & 0x000000FF; + ((unsigned int*)rtga->output_image)[size_tex] = A | (R << 16) | G | (B >> 16); + }; + + return IMAGE_PROCESS_END; +} + +bool rtga_set_buf_ptr(rtga_t *rtga, void *data) +{ + if (!rtga) + return false; + + rtga->buff_data = (uint8_t*)data; + + return true; +} + +void rtga_free(rtga_t *rtga) +{ + if (!rtga) + return; + + free(rtga); +} + +rtga_t *rtga_alloc(void) +{ + rtga_t *rtga = (rtga_t*)calloc(1, sizeof(*rtga)); + if (!rtga) + return NULL; + return rtga; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/wav
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/wav/rwav.c
Added
@@ -0,0 +1,187 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rwav.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdarg.h> +#include <stddef.h> /* ptrdiff_t on osx */ +#include <stdlib.h> +#include <string.h> + +#include <formats/rwav.h> + +enum +{ + ITER_BEGIN, + ITER_COPY_SAMPLES, + ITER_COPY_SAMPLES_8, + ITER_COPY_SAMPLES_16 +}; + +struct rwav_iterator +{ + rwav_t *out; + const uint8_t *data; + size_t size; + size_t i, j; + int step; +}; + +void rwav_init(rwav_iterator_t* iter, rwav_t* out, const void* buf, size_t size) +{ + iter->out = out; + iter->data = (const uint8_t*)buf; + iter->size = size; + iter->step = ITER_BEGIN; + + out->samples = NULL; +} + +enum rwav_state rwav_iterate(rwav_iterator_t *iter) +{ + size_t s; + uint16_t *u16 = NULL; + void *samples = NULL; + rwav_t *rwav = iter->out; + const uint8_t *data = iter->data; + + switch (iter->step) + { + case ITER_BEGIN: + if (iter->size < 44) + return RWAV_ITERATE_ERROR; /* buffer is smaller than an empty wave file */ + + if (data[0] != 'R' || data[1] != 'I' || data[2] != 'F' || data[3] != 'F') + return RWAV_ITERATE_ERROR; + + if (data[8] != 'W' || data[9] != 'A' || data[10] != 'V' || data[11] != 'E') + return RWAV_ITERATE_ERROR; + + if (data[12] != 'f' || data[13] != 'm' || data[14] != 't' || data[15] != ' ') + return RWAV_ITERATE_ERROR; /* we don't support non-PCM or compressed data */ + + if (data[16] != 16 || data[17] != 0 || data[18] != 0 || data[19] != 0) + return RWAV_ITERATE_ERROR; + + if (data[20] != 1 || data[21] != 0) + return RWAV_ITERATE_ERROR; /* we don't support non-PCM or compressed data */ + + if (data[36] != 'd' || data[37] != 'a' || data[38] != 't' || data[39] != 'a') + return RWAV_ITERATE_ERROR; + + rwav->bitspersample = data[34] | data[35] << 8; + + if (rwav->bitspersample != 8 && rwav->bitspersample != 16) + return RWAV_ITERATE_ERROR; /* we only support 8 and 16 bps */ + + rwav->subchunk2size = data[40] | data[41] << 8 | data[42] << 16 | data[43] << 24; + + if ((rwav->subchunk2size < 1) || + (rwav->subchunk2size > iter->size - 44)) + return RWAV_ITERATE_ERROR; /* too few bytes in buffer */ + + samples = malloc(rwav->subchunk2size); + + if (!samples) + return RWAV_ITERATE_ERROR; + + rwav->numchannels = data[22] | data[23] << 8; + rwav->numsamples = rwav->subchunk2size * 8 / rwav->bitspersample / rwav->numchannels; + rwav->samplerate = data[24] | data[25] << 8 | data[26] << 16 | data[27] << 24; + rwav->samples = samples; + + iter->step = ITER_COPY_SAMPLES; + return RWAV_ITERATE_MORE; + + case ITER_COPY_SAMPLES: + iter->i = 0; + + if (rwav->bitspersample == 8) + { + iter->step = ITER_COPY_SAMPLES_8; + + /* TODO/FIXME - what is going on here? */ + case ITER_COPY_SAMPLES_8: + s = rwav->subchunk2size - iter->i; + + if (s > RWAV_ITERATE_BUF_SIZE) + s = RWAV_ITERATE_BUF_SIZE; + + memcpy((void*)((uint8_t*)rwav->samples + iter->i), (void *)(iter->data + 44 + iter->i), s); + iter->i += s; + } + else + { + iter->step = ITER_COPY_SAMPLES_16; + iter->j = 0; + + /* TODO/FIXME - what is going on here? */ + case ITER_COPY_SAMPLES_16: + s = rwav->subchunk2size - iter->i; + + if (s > RWAV_ITERATE_BUF_SIZE) + s = RWAV_ITERATE_BUF_SIZE; + + u16 = (uint16_t *)rwav->samples; + + while (s != 0) + { + u16[iter->j++] = iter->data[44 + iter->i] | iter->data[45 + iter->i] << 8; + iter->i += 2; + s -= 2; + } + } + + if (iter->i < rwav->subchunk2size) + return RWAV_ITERATE_MORE; + return RWAV_ITERATE_DONE; + } + + return RWAV_ITERATE_ERROR; +} + +enum rwav_state rwav_load(rwav_t* out, const void* buf, size_t size) +{ + enum rwav_state res; + rwav_iterator_t iter; + + iter.out = NULL; + iter.data = NULL; + iter.size = 0; + iter.i = 0; + iter.j = 0; + iter.step = 0; + + rwav_init(&iter, out, buf, size); + + do + { + res = rwav_iterate(&iter); + }while (res == RWAV_ITERATE_MORE); + + return res; +} + +void rwav_free(rwav_t *rwav) +{ + free((void*)rwav->samples); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/xml
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/xml/rxml.c
Added
@@ -0,0 +1,320 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rxml.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <boolean.h> +#include <streams/file_stream.h> +#include <compat/posix_string.h> +#include <string/stdstring.h> + +#include <formats/rxml.h> + +#include "../../deps/yxml/yxml.h" + +#define BUFSIZE 4096 + +struct rxml_parse_buffer +{ + rxml_node_t *stack[32]; + char xml[BUFSIZE]; + char val[BUFSIZE]; +}; + +struct rxml_document +{ + struct rxml_node *root_node; +}; + +struct rxml_node *rxml_root_node(rxml_document_t *doc) +{ + if (doc) + return doc->root_node; + return NULL; +} + +static void rxml_free_node(struct rxml_node *node) +{ + struct rxml_node *head = NULL; + struct rxml_attrib_node *attrib_node_head = NULL; + + if (!node) + return; + + for (head = node->children; head; ) + { + struct rxml_node *next_node = (struct rxml_node*)head->next; + rxml_free_node(head); + head = next_node; + } + + for (attrib_node_head = node->attrib; attrib_node_head; ) + { + struct rxml_attrib_node *next_attrib = + (struct rxml_attrib_node*)attrib_node_head->next; + + if (attrib_node_head->attrib) + free(attrib_node_head->attrib); + if (attrib_node_head->value) + free(attrib_node_head->value); + if (attrib_node_head) + free(attrib_node_head); + + attrib_node_head = next_attrib; + } + + if (node->name) + free(node->name); + if (node->data) + free(node->data); + if (node) + free(node); +} + +rxml_document_t *rxml_load_document(const char *path) +{ + rxml_document_t *doc = NULL; + char *memory_buffer = NULL; + int64_t len = 0; + RFILE *file = filestream_open(path, + RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + if (!file) + return NULL; + + len = filestream_get_size(file); + memory_buffer = (char*)malloc((size_t)(len + 1)); + if (!memory_buffer) + goto error; + + memory_buffer[len] = '\0'; + if (filestream_read(file, memory_buffer, len) != (size_t)len) + goto error; + + filestream_close(file); + file = NULL; + + doc = rxml_load_document_string(memory_buffer); + + free(memory_buffer); + return doc; + +error: + free(memory_buffer); + if(file) + filestream_close(file); + return NULL; +} + +rxml_document_t *rxml_load_document_string(const char *str) +{ + yxml_t x; + rxml_document_t *doc = NULL; + size_t stack_i = 0; + size_t level = 0; + int c = 0; + char *valptr = NULL; + rxml_node_t *node = NULL; + struct rxml_attrib_node *attr = NULL; + struct rxml_parse_buffer *buf = (struct rxml_parse_buffer*) + malloc(sizeof(*buf)); + if (!buf) + return NULL; + + valptr = buf->val; + doc = (rxml_document_t*)malloc(sizeof(*doc)); + if (!doc) + goto error; + + yxml_init(&x, buf->xml, BUFSIZE); + + for (; *str; ++str) + { + yxml_ret_t r = yxml_parse(&x, *str); + + if (r < 0) + goto error; + + switch (r) + { + + case YXML_ELEMSTART: + if (node) + { + if (level > stack_i) + { + buf->stack[stack_i] = node; + ++stack_i; + + node->children = (rxml_node_t*) + malloc(sizeof(*node)); + + node->children->name = NULL; + node->children->data = NULL; + node->children->attrib = NULL; + node->children->children = NULL; + node->children->next = NULL; + + node = node->children; + } + else + { + node->next = (rxml_node_t*) + malloc(sizeof(*node)); + + node->next->name = NULL; + node->next->data = NULL; + node->next->attrib = NULL; + node->next->children = NULL; + node->next->next = NULL; + + node = node->next; + } + } + else + node = doc->root_node = (rxml_node_t*) + calloc(1, sizeof(*node)); + + if (node->name) + free(node->name); + node->name = strdup(x.elem); + + attr = NULL; + + ++level; + break; + + case YXML_ELEMEND: + --level; + + if (valptr > buf->val) + { + *valptr = '\0'; + + /* Original code was broken here: + * > If an element ended on two successive + * iterations, on the second iteration + * the 'data' for the *previous* node would + * get overwritten + * > This effectively erased the data for the + * previous node, *and* caused a memory leak + * (due to the double strdup()) + * It seems the correct thing to do here is + * only copy the data if the current 'level' + * and 'stack index' are the same... */ + if (level == stack_i) + { + if (node->data) + free(node->data); + node->data = strdup(buf->val); + } + + valptr = buf->val; + } + + if (level < stack_i) + { + --stack_i; + node = buf->stack[stack_i]; + } + break; + + case YXML_CONTENT: + for (c = 0; c < sizeof(x.data) && x.data[c]; ++c) + { + *valptr = x.data[c]; + ++valptr; + } + break; + + case YXML_ATTRSTART: + if (attr) + attr = attr->next = (struct rxml_attrib_node*) + calloc(1, sizeof(*attr)); + else + attr = node->attrib = (struct rxml_attrib_node*)calloc(1, sizeof(*attr)); + + if (attr->attrib) + free(attr->attrib); + attr->attrib = strdup(x.attr); + + valptr = buf->val; + break; + + case YXML_ATTRVAL: + for (c = 0; c < sizeof(x.data) && x.data[c]; ++c) + { + *valptr = x.data[c]; + ++valptr; + } + break; + + case YXML_ATTREND: + if (valptr > buf->val) + { + *valptr = '\0'; + + if (attr) + { + if (attr->value) + free(attr->value); + attr->value = strdup(buf->val); + } + + valptr = buf->val; + } + break; + + default: + break; + } + } + + free(buf); + return doc; + +error: + rxml_free_document(doc); + free(buf); + return NULL; +} + +void rxml_free_document(rxml_document_t *doc) +{ + if (!doc) + return; + + if (doc->root_node) + rxml_free_node(doc->root_node); + + free(doc); +} + +const char *rxml_node_attrib(struct rxml_node *node, const char *attrib) +{ + struct rxml_attrib_node *attribs = NULL; + for (attribs = node->attrib; attribs; attribs = attribs->next) + { + if (string_is_equal(attrib, attribs->attrib)) + return attribs->value; + } + + return NULL; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/xml/test
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/xml/test/Makefile
Added
@@ -0,0 +1,28 @@ +TARGET := rxml + +LIBRETRO_XML_DIR := .. +LIBRETRO_COMM_DIR := ../../.. +LIBRETRO_DEPS_DIR := ../../../../deps + +SOURCES := \ + rxml_test.c \ + $(LIBRETRO_XML_DIR)/rxml.c \ + $(LIBRETRO_DEPS_DIR)/yxml/yxml.c \ + $(LIBRETRO_COMM_DIR)/streams/file_stream.c + +OBJS := $(SOURCES:.c=.o) + +CFLAGS += -DRXML_TEST -Wall -pedantic -std=gnu99 -g -I$(LIBRETRO_COMM_DIR)/include + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/formats/xml/test/rxml_test.c
Added
@@ -0,0 +1,66 @@ +/* Copyright (C) 2010-2018 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rxml_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <formats/rxml.h> +#include <stdio.h> + +static void print_siblings(struct rxml_node *node, unsigned level) +{ + fprintf(stderr, "\n%*sName: %s\n", level * 4, "", node->name); + if (node->data) + fprintf(stderr, "%*sData: %s\n", level * 4, "", node->data); + + for (const struct rxml_attrib_node *attrib = + node->attrib; attrib; attrib = attrib->next) + fprintf(stderr, "%*s Attrib: %s = %s\n", level * 4, "", + attrib->attrib, attrib->value); + + if (node->children) + print_siblings(node->children, level + 1); + + if (node->next) + print_siblings(node->next, level); +} + +static void rxml_log_document(const char *path) +{ + rxml_document_t *doc = rxml_load_document(path); + if (!doc) + { + fprintf(stderr, "rxml: Failed to load document: %s\n", path); + return; + } + + print_siblings(rxml_root_node(doc), 0); + rxml_free_document(doc); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: %s <path>\n", argv[0]); + return 1; + } + + rxml_log_document(argv[1]); +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/gfx/gl_capabilities.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/gfx/gl_capabilities.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (gl_capabilities.c). @@ -300,7 +300,7 @@ case GL_CAPS_BGRA8888: #ifdef HAVE_OPENGLES /* There are both APPLE and EXT variants. */ - if (gl_query_extension("BGRA8888") && !strstr(renderer, "VideoCore")) + if (gl_query_extension("BGRA8888")) return true; #else return true;
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/gfx/scaler/pixconv.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/gfx/scaler/pixconv.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (pixconv.c). @@ -29,12 +29,18 @@ #include <gfx/scaler/pixconv.h> +#if _MSC_VER && _MSC_VER <= 1800 +#define SCALER_NO_SIMD +#endif + #ifdef SCALER_NO_SIMD #undef __SSE2__ #endif #if defined(__SSE2__) #include <emmintrin.h> +#elif defined(__MMX__) +#include <mmintrin.h> #endif void conv_rgb565_0rgb1555(void *output_, const void *input_, @@ -45,7 +51,7 @@ const uint16_t *input = (const uint16_t*)input_; uint16_t *output = (uint16_t*)output_; -#if defined(__SSE2_) +#if defined(__SSE2__) int max_width = width - 7; const __m128i hi_mask = _mm_set1_epi16(0x7fe0); const __m128i lo_mask = _mm_set1_epi16(0x1f); @@ -55,7 +61,7 @@ h++, output += out_stride >> 1, input += in_stride >> 1) { int w = 0; -#if defined(__SSE2_) +#if defined(__SSE2__) for (; w < max_width; w += 8) { const __m128i in = _mm_loadu_si128((const __m128i*)(input + w)); @@ -204,6 +210,16 @@ const __m128i a = _mm_set1_epi16(0x00ff); int max_width = width - 7; +#elif defined(__MMX__) + const __m64 pix_mask_r = _mm_set1_pi16(0x1f << 10); + const __m64 pix_mask_g = _mm_set1_pi16(0x3f << 5); + const __m64 pix_mask_b = _mm_set1_pi16(0x1f << 5); + const __m64 mul16_r = _mm_set1_pi16(0x0210); + const __m64 mul16_g = _mm_set1_pi16(0x2080); + const __m64 mul16_b = _mm_set1_pi16(0x4200); + const __m64 a = _mm_set1_pi16(0x00ff); + + int max_width = width - 3; #endif for (h = 0; h < height; @@ -237,6 +253,35 @@ _mm_storeu_si128((__m128i*)(output + w + 0), res_lo); _mm_storeu_si128((__m128i*)(output + w + 4), res_hi); } +#elif defined(__MMX__) + for (; w < max_width; w += 4) + { + __m64 res_lo, res_hi; + __m64 res_lo_bg, res_hi_bg, res_lo_ra, res_hi_ra; + const __m64 in = *((__m64*)(input + w)); + __m64 r = _mm_and_si64(_mm_srli_pi16(in, 1), pix_mask_r); + __m64 g = _mm_and_si64(in, pix_mask_g); + __m64 b = _mm_and_si64(_mm_slli_pi16(in, 5), pix_mask_b); + + r = _mm_mulhi_pi16(r, mul16_r); + g = _mm_mulhi_pi16(g, mul16_g); + b = _mm_mulhi_pi16(b, mul16_b); + + res_lo_bg = _mm_unpacklo_pi8(b, g); + res_hi_bg = _mm_unpackhi_pi8(b, g); + res_lo_ra = _mm_unpacklo_pi8(r, a); + res_hi_ra = _mm_unpackhi_pi8(r, a); + + res_lo = _mm_or_si64(res_lo_bg, + _mm_slli_si64(res_lo_ra, 16)); + res_hi = _mm_or_si64(res_hi_bg, + _mm_slli_si64(res_hi_ra, 16)); + + *((__m64*)(output + w + 0)) = res_lo; + *((__m64*)(output + w + 2)) = res_hi; + } + + _mm_empty(); #endif for (; w < width; w++) @@ -284,18 +329,18 @@ __m128i r = _mm_and_si128(_mm_srli_epi16(in, 1), pix_mask_r); __m128i g = _mm_and_si128(in, pix_mask_g); __m128i b = _mm_and_si128(_mm_slli_epi16(in, 5), pix_mask_b); - r = _mm_mulhi_epi16(r, mul16_r); + r = _mm_mulhi_epi16(r, mul16_r); g = _mm_mulhi_epi16(g, mul16_g); b = _mm_mulhi_epi16(b, mul16_b); - res_lo_bg = _mm_unpacklo_epi8(b, g); + res_lo_bg = _mm_unpacklo_epi8(b, g); res_hi_bg = _mm_unpackhi_epi8(b, g); res_lo_ra = _mm_unpacklo_epi8(r, a); res_hi_ra = _mm_unpackhi_epi8(r, a); - res_lo = _mm_or_si128(res_lo_bg, + res_lo = _mm_or_si128(res_lo_bg, _mm_slli_si128(res_lo_ra, 2)); res_hi = _mm_or_si128(res_hi_bg, _mm_slli_si128(res_hi_ra, 2)); - _mm_storeu_si128((__m128i*)(output + w + 0), res_lo); + _mm_storeu_si128((__m128i*)(output + w + 0), res_lo); _mm_storeu_si128((__m128i*)(output + w + 4), res_hi); } #endif @@ -345,14 +390,58 @@ int width, int height, int out_stride, int in_stride) { - int h, w; + int h; const uint16_t *input = (const uint16_t*)input_; uint32_t *output = (uint32_t*)output_; +#if defined(__MMX__) + const __m64 pix_mask_r = _mm_set1_pi16(0xf << 10); + const __m64 pix_mask_g = _mm_set1_pi16(0xf << 8); + const __m64 pix_mask_b = _mm_set1_pi16(0xf << 8); + const __m64 mul16_r = _mm_set1_pi16(0x0440); + const __m64 mul16_g = _mm_set1_pi16(0x1100); + const __m64 mul16_b = _mm_set1_pi16(0x1100); + const __m64 a = _mm_set1_pi16(0x00ff); + + int max_width = width - 3; +#endif + for (h = 0; h < height; h++, output += out_stride >> 2, input += in_stride >> 1) { - for (w = 0; w < width; w++) + int w = 0; +#if defined(__MMX__) + for (; w < max_width; w += 4) + { + __m64 res_lo, res_hi; + __m64 res_lo_bg, res_hi_bg, res_lo_ra, res_hi_ra; + const __m64 in = *((__m64*)(input + w)); + __m64 r = _mm_and_si64(_mm_srli_pi16(in, 2), pix_mask_r); + __m64 g = _mm_and_si64(in, pix_mask_g); + __m64 b = _mm_and_si64(_mm_slli_pi16(in, 4), pix_mask_b); + + r = _mm_mulhi_pi16(r, mul16_r); + g = _mm_mulhi_pi16(g, mul16_g); + b = _mm_mulhi_pi16(b, mul16_b); + + res_lo_bg = _mm_unpacklo_pi8(b, g); + res_hi_bg = _mm_unpackhi_pi8(b, g); + res_lo_ra = _mm_unpacklo_pi8(r, a); + res_hi_ra = _mm_unpackhi_pi8(r, a); + + res_lo = _mm_or_si64(res_lo_bg, + _mm_slli_si64(res_lo_ra, 16)); + res_hi = _mm_or_si64(res_hi_bg, + _mm_slli_si64(res_hi_ra, 16)); + + *((__m64*)(output + w + 0)) = res_lo; + *((__m64*)(output + w + 2)) = res_hi; + } + + _mm_empty(); +#endif + + for (; w < width; w++) { uint32_t col = input[w]; uint32_t r = (col >> 12) & 0xf; @@ -632,6 +721,28 @@ } } +void conv_bgr24_rgb565(void *output_, const void *input_, + int width, int height, + int out_stride, int in_stride) +{ + int h, w; + const uint8_t *input = (const uint8_t*)input_; + uint16_t *output = (uint16_t*)output_; + for (h = 0; h < height; + h++, output += out_stride, input += in_stride) + { + const uint8_t *inp = input; + for (w = 0; w < width; w++) + { + uint16_t b = *inp++; + uint16_t g = *inp++; + uint16_t r = *inp++; + + output[w] = ((r & 0x00F8) << 8) | ((g&0x00FC) << 3) | ((b&0x00F8) >> 3); + } + } +} + void conv_argb8888_0rgb1555(void *output_, const void *input_, int width, int height, int out_stride, int in_stride) @@ -674,11 +785,11 @@ #if defined(__SSE2__) for (; w < max_width; w += 16, out += 48) { - store_bgr24_sse2(out, - _mm_loadu_si128((const __m128i*)(input + w + 0)), - _mm_loadu_si128((const __m128i*)(input + w + 4)), - _mm_loadu_si128((const __m128i*)(input + w + 8)), - _mm_loadu_si128((const __m128i*)(input + w + 12))); + __m128i l0 = _mm_loadu_si128((const __m128i*)(input + w + 0)); + __m128i l1 = _mm_loadu_si128((const __m128i*)(input + w + 4)); + __m128i l2 = _mm_loadu_si128((const __m128i*)(input + w + 8)); + __m128i l3 = _mm_loadu_si128((const __m128i*)(input + w + 12)); + store_bgr24_sse2(out, l0, l1, l2, l3); } #endif @@ -692,6 +803,63 @@ } } +#if defined(__SSE2__) +static INLINE __m128i conv_shuffle_rb_epi32(__m128i c) +{ + /* SSSE3 plz */ + const __m128i b_mask = _mm_set1_epi32(0x000000ff); + const __m128i g_mask = _mm_set1_epi32(0x0000ff00); + const __m128i r_mask = _mm_set1_epi32(0x00ff0000); + __m128i sl = _mm_and_si128(_mm_slli_epi32(c, 16), r_mask); + __m128i sr = _mm_and_si128(_mm_srli_epi32(c, 16), b_mask); + __m128i g = _mm_and_si128(c, g_mask); + __m128i rb = _mm_or_si128(sl, sr); + return _mm_or_si128(g, rb); +} +#endif + +void conv_abgr8888_bgr24(void *output_, const void *input_, + int width, int height, + int out_stride, int in_stride) +{ + int h; + const uint32_t *input = (const uint32_t*)input_; + uint8_t *output = (uint8_t*)output_; + +#if defined(__SSE2__) + int max_width = width - 15; +#endif + + for (h = 0; h < height; + h++, output += out_stride, input += in_stride >> 2) + { + uint8_t *out = output; + int w = 0; +#if defined(__SSE2__) + for (; w < max_width; w += 16, out += 48) + { + __m128i a = _mm_loadu_si128((const __m128i*)(input + w + 0)); + __m128i b = _mm_loadu_si128((const __m128i*)(input + w + 4)); + __m128i c = _mm_loadu_si128((const __m128i*)(input + w + 8)); + __m128i d = _mm_loadu_si128((const __m128i*)(input + w + 12)); + a = conv_shuffle_rb_epi32(a); + b = conv_shuffle_rb_epi32(b); + c = conv_shuffle_rb_epi32(c); + d = conv_shuffle_rb_epi32(d); + store_bgr24_sse2(out, a, b, c, d); + } +#endif + + for (; w < width; w++) + { + uint32_t col = input[w]; + *out++ = (uint8_t)(col >> 16); + *out++ = (uint8_t)(col >> 8); + *out++ = (uint8_t)(col >> 0); + } + } +} + void conv_argb8888_abgr8888(void *output_, const void *input_, int width, int height, int out_stride, int in_stride)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/gfx/scaler/scaler.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/gfx/scaler/scaler.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (scaler.c). @@ -138,6 +138,8 @@ case SCALER_FMT_ARGB8888: ctx->direct_pixconv = conv_bgr24_argb8888; break; + case SCALER_FMT_RGB565: + ctx->direct_pixconv = conv_bgr24_rgb565; default: break; } @@ -185,7 +187,14 @@ } break; case SCALER_FMT_ABGR8888: - /* FIXME/TODO */ + switch (ctx->out_fmt) + { + case SCALER_FMT_BGR24: + ctx->direct_pixconv = conv_abgr8888_bgr24; + break; + default: + break; + } break; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/gfx/scaler/scaler_filter.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/gfx/scaler/scaler_filter.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (scaler_filter.c). @@ -85,7 +85,9 @@ { if (ctx->horiz.filter_pos[i] > max_w_pos || ctx->horiz.filter_pos[i] < 0) { +#ifndef NDEBUG fprintf(stderr, "Out X = %d => In X = %d\n", i, ctx->horiz.filter_pos[i]); +#endif return false; } } @@ -96,7 +98,9 @@ { if (ctx->vert.filter_pos[i] > max_h_pos || ctx->vert.filter_pos[i] < 0) { +#ifndef NDEBUG fprintf(stderr, "Out Y = %d => In Y = %d\n", i, ctx->vert.filter_pos[i]); +#endif return false; } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/gfx/scaler/scaler_int.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/gfx/scaler/scaler_int.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (scaler_int.c).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/README.md
Added
@@ -0,0 +1,11 @@ +# Autogenerate GL extension loaders + +## OpenGL desktop + +Use Khronos' recent [header](www.opengl.org/registry/api/glext.h). + + ./glgen.py /usr/include/GL/glext.h glsym_gl.h glsym_gl.c + +## OpenGL ES + + ./glgen.py /usr/include/GLES2/gl2ext.h glsym_es2.h glsym_es2.c
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/glgen.py
Added
@@ -0,0 +1,155 @@ +#!/usr/bin/env python3 + +""" + License statement applies to this file (glgen.py) only. + + Permission is hereby granted, free of charge, + to any person obtaining a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import sys +import os +import re + +banned_ext = [ 'AMD', 'APPLE', 'NV', 'NVX', 'ATI', '3DLABS', 'SUN', 'SGI', 'SGIX', 'SGIS', 'INTEL', '3DFX', 'IBM', 'MESA', 'GREMEDY', 'OML', 'PGI', 'I3D', 'INGL', 'MTX', 'QCOM', 'IMG', 'ANGLE', 'SUNX', 'INGR' ] + +def noext(sym): + for ext in banned_ext: + if sym.endswith(ext): + return False + return True + +def fix_multiline_functions(lines): + fixed_lines = [] + temp_lines = [] + for line in lines: + if line.count('(') > line.count(')'): + temp_lines.append(line) + else: + if len(temp_lines) > 0: + if line.count(')') > line.count('('): + temp_lines.append(line) + fixed_line = re.sub(' +',' ', ''.join(temp_lines).replace('\n','').replace('\t','')) + fixed_lines.append(fixed_line) + temp_lines = [] + else: + temp_lines.append(line) + else: + fixed_lines.append(line) + return fixed_lines + +def find_gl_symbols(lines): + typedefs = [] + syms = [] + for line in lines: + m = re.search(r'^typedef.+PFN(\S+)PROC.+$', line) + g = re.search(r'^.+(gl\S+)\W*\(.+\).*$', line) + if m and noext(m.group(1)): + typedefs.append(m.group(0).replace('PFN', 'RGLSYM').replace('GLDEBUGPROC', 'RGLGENGLDEBUGPROC')) + if g and noext(g.group(1)): + syms.append(g.group(1)) + return (typedefs, syms) + +def generate_defines(gl_syms): + res = [] + for line in gl_syms: + res.append('#define {} __rglgen_{}'.format(line, line)) + return res + +def generate_declarations(gl_syms): + return ['RGLSYM' + x.upper() + 'PROC ' + '__rglgen_' + x + ';' for x in gl_syms] + +def generate_macros(gl_syms): + return [' SYM(' + x.replace('gl', '') + '),' for x in gl_syms] + +def dump(f, lines): + f.write('\n'.join(lines)) + f.write('\n\n') + +if __name__ == '__main__': + + if len(sys.argv) > 4: + for banned in sys.argv[4:]: + banned_ext.append(banned) + + with open(sys.argv[1], 'r') as f: + lines = fix_multiline_functions(f.readlines()) + typedefs, syms = find_gl_symbols(lines) + + overrides = generate_defines(syms) + declarations = generate_declarations(syms) + externs = ['extern ' + x for x in declarations] + + macros = generate_macros(syms) + + with open(sys.argv[2], 'w') as f: + f.write('#ifndef RGLGEN_DECL_H__\n') + f.write('#define RGLGEN_DECL_H__\n') + + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + + f.write('#ifdef GL_APIENTRY\n') + f.write('typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('typedef void (GL_APIENTRY *RGLGENGLDEBUGPROCKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('#else\n') + f.write('#ifndef APIENTRY\n') + f.write('#define APIENTRY\n') + f.write('#endif\n') + f.write('#ifndef APIENTRYP\n') + f.write('#define APIENTRYP APIENTRY *\n') + f.write('#endif\n') + f.write('typedef void (APIENTRY *RGLGENGLDEBUGPROCARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('typedef void (APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('#endif\n') + + f.write('#ifndef GL_OES_EGL_image\n') + f.write('typedef void *GLeglImageOES;\n') + f.write('#endif\n') + + f.write('#if !defined(GL_OES_fixed_point) && !defined(HAVE_OPENGLES2)\n') + f.write('typedef GLint GLfixed;\n') + f.write('#endif\n') + + f.write('#if defined(OSX) && !defined(MAC_OS_X_VERSION_10_7)\n') + f.write('typedef long long int GLint64;\n') + f.write('typedef unsigned long long int GLuint64;\n') + f.write('typedef unsigned long long int GLuint64EXT;\n') + f.write('typedef struct __GLsync *GLsync;\n') + f.write('#endif\n') + + dump(f, typedefs) + dump(f, overrides) + dump(f, externs) + + f.write('struct rglgen_sym_map { const char *sym; void *ptr; };\n') + f.write('extern const struct rglgen_sym_map rglgen_symbol_map[];\n') + + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + + f.write('#endif\n') + + with open(sys.argv[3], 'w') as f: + f.write('#include "glsym/glsym.h"\n') + f.write('#include <stddef.h>\n') + f.write('#define SYM(x) { "gl" #x, &(gl##x) }\n') + f.write('const struct rglgen_sym_map rglgen_symbol_map[] = {\n') + dump(f, macros) + f.write(' { NULL, NULL },\n') + f.write('};\n') + dump(f, declarations)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/glsym_es2.c
Added
@@ -0,0 +1,409 @@ +#include "glsym/glsym.h" +#include <stddef.h> +#define SYM(x) { "gl" #x, &(gl##x) } +const struct rglgen_sym_map rglgen_symbol_map[] = { + SYM(BlendBarrierKHR), + SYM(DebugMessageControlKHR), + SYM(DebugMessageInsertKHR), + SYM(DebugMessageCallbackKHR), + SYM(GetDebugMessageLogKHR), + SYM(PushDebugGroupKHR), + SYM(PopDebugGroupKHR), + SYM(ObjectLabelKHR), + SYM(GetObjectLabelKHR), + SYM(ObjectPtrLabelKHR), + SYM(GetObjectPtrLabelKHR), + SYM(GetPointervKHR), + SYM(GetGraphicsResetStatusKHR), + SYM(ReadnPixelsKHR), + SYM(GetnUniformfvKHR), + SYM(GetnUniformivKHR), + SYM(GetnUniformuivKHR), + SYM(EGLImageTargetTexture2DOES), + SYM(EGLImageTargetRenderbufferStorageOES), + SYM(CopyImageSubDataOES), + SYM(EnableiOES), + SYM(DisableiOES), + SYM(BlendEquationiOES), + SYM(BlendEquationSeparateiOES), + SYM(BlendFunciOES), + SYM(BlendFuncSeparateiOES), + SYM(ColorMaskiOES), + SYM(IsEnablediOES), + SYM(DrawElementsBaseVertexOES), + SYM(DrawRangeElementsBaseVertexOES), + SYM(DrawElementsInstancedBaseVertexOES), + SYM(MultiDrawElementsBaseVertexOES), + SYM(FramebufferTextureOES), + SYM(GetProgramBinaryOES), + SYM(ProgramBinaryOES), + SYM(MapBufferOES), + SYM(UnmapBufferOES), + SYM(GetBufferPointervOES), + SYM(PrimitiveBoundingBoxOES), + SYM(MinSampleShadingOES), + SYM(PatchParameteriOES), + SYM(TexImage3DOES), + SYM(TexSubImage3DOES), + SYM(CopyTexSubImage3DOES), + SYM(CompressedTexImage3DOES), + SYM(CompressedTexSubImage3DOES), + SYM(FramebufferTexture3DOES), + SYM(TexParameterIivOES), + SYM(TexParameterIuivOES), + SYM(GetTexParameterIivOES), + SYM(GetTexParameterIuivOES), + SYM(SamplerParameterIivOES), + SYM(SamplerParameterIuivOES), + SYM(GetSamplerParameterIivOES), + SYM(GetSamplerParameterIuivOES), + SYM(TexBufferOES), + SYM(TexBufferRangeOES), + SYM(TexStorage3DMultisampleOES), + SYM(TextureViewOES), + SYM(BindVertexArrayOES), + SYM(DeleteVertexArraysOES), + SYM(GenVertexArraysOES), + SYM(IsVertexArrayOES), + SYM(ViewportArrayvOES), + SYM(ViewportIndexedfOES), + SYM(ViewportIndexedfvOES), + SYM(ScissorArrayvOES), + SYM(ScissorIndexedOES), + SYM(ScissorIndexedvOES), + SYM(DepthRangeArrayfvOES), + SYM(DepthRangeIndexedfOES), + SYM(GetFloati_vOES), + SYM(DrawArraysInstancedBaseInstanceEXT), + SYM(DrawElementsInstancedBaseInstanceEXT), + SYM(DrawElementsInstancedBaseVertexBaseInstanceEXT), + SYM(BindFragDataLocationIndexedEXT), + SYM(BindFragDataLocationEXT), + SYM(GetProgramResourceLocationIndexEXT), + SYM(GetFragDataIndexEXT), + SYM(BufferStorageEXT), + SYM(ClearTexImageEXT), + SYM(ClearTexSubImageEXT), + SYM(CopyImageSubDataEXT), + SYM(LabelObjectEXT), + SYM(GetObjectLabelEXT), + SYM(InsertEventMarkerEXT), + SYM(PushGroupMarkerEXT), + SYM(PopGroupMarkerEXT), + SYM(DiscardFramebufferEXT), + SYM(GenQueriesEXT), + SYM(DeleteQueriesEXT), + SYM(IsQueryEXT), + SYM(BeginQueryEXT), + SYM(EndQueryEXT), + SYM(QueryCounterEXT), + SYM(GetQueryivEXT), + SYM(GetQueryObjectivEXT), + SYM(GetQueryObjectuivEXT), + SYM(DrawBuffersEXT), + SYM(EnableiEXT), + SYM(DisableiEXT), + SYM(BlendEquationiEXT), + SYM(BlendEquationSeparateiEXT), + SYM(BlendFunciEXT), + SYM(BlendFuncSeparateiEXT), + SYM(ColorMaskiEXT), + SYM(IsEnablediEXT), + SYM(DrawElementsBaseVertexEXT), + SYM(DrawRangeElementsBaseVertexEXT), + SYM(DrawElementsInstancedBaseVertexEXT), + SYM(MultiDrawElementsBaseVertexEXT), + SYM(DrawArraysInstancedEXT), + SYM(DrawElementsInstancedEXT), + SYM(FramebufferTextureEXT), + SYM(VertexAttribDivisorEXT), + SYM(MapBufferRangeEXT), + SYM(FlushMappedBufferRangeEXT), + SYM(MultiDrawArraysEXT), + SYM(MultiDrawElementsEXT), + SYM(MultiDrawArraysIndirectEXT), + SYM(MultiDrawElementsIndirectEXT), + SYM(RenderbufferStorageMultisampleEXT), + SYM(FramebufferTexture2DMultisampleEXT), + SYM(ReadBufferIndexedEXT), + SYM(DrawBuffersIndexedEXT), + SYM(GetIntegeri_vEXT), + SYM(PolygonOffsetClampEXT), + SYM(PrimitiveBoundingBoxEXT), + SYM(RasterSamplesEXT), + SYM(GetGraphicsResetStatusEXT), + SYM(ReadnPixelsEXT), + SYM(GetnUniformfvEXT), + SYM(GetnUniformivEXT), + SYM(ActiveShaderProgramEXT), + SYM(BindProgramPipelineEXT), + SYM(CreateShaderProgramvEXT), + SYM(DeleteProgramPipelinesEXT), + SYM(GenProgramPipelinesEXT), + SYM(GetProgramPipelineInfoLogEXT), + SYM(GetProgramPipelineivEXT), + SYM(IsProgramPipelineEXT), + SYM(ProgramParameteriEXT), + SYM(ProgramUniform1fEXT), + SYM(ProgramUniform1fvEXT), + SYM(ProgramUniform1iEXT), + SYM(ProgramUniform1ivEXT), + SYM(ProgramUniform2fEXT), + SYM(ProgramUniform2fvEXT), + SYM(ProgramUniform2iEXT), + SYM(ProgramUniform2ivEXT), + SYM(ProgramUniform3fEXT), + SYM(ProgramUniform3fvEXT), + SYM(ProgramUniform3iEXT), + SYM(ProgramUniform3ivEXT), + SYM(ProgramUniform4fEXT), + SYM(ProgramUniform4fvEXT), + SYM(ProgramUniform4iEXT), + SYM(ProgramUniform4ivEXT), + SYM(ProgramUniformMatrix2fvEXT), + SYM(ProgramUniformMatrix3fvEXT), + SYM(ProgramUniformMatrix4fvEXT), + SYM(UseProgramStagesEXT), + SYM(ValidateProgramPipelineEXT), + SYM(ProgramUniform1uiEXT), + SYM(ProgramUniform2uiEXT), + SYM(ProgramUniform3uiEXT), + SYM(ProgramUniform4uiEXT), + SYM(ProgramUniform1uivEXT), + SYM(ProgramUniform2uivEXT), + SYM(ProgramUniform3uivEXT), + SYM(ProgramUniform4uivEXT), + SYM(ProgramUniformMatrix2x3fvEXT), + SYM(ProgramUniformMatrix3x2fvEXT), + SYM(ProgramUniformMatrix2x4fvEXT), + SYM(ProgramUniformMatrix4x2fvEXT), + SYM(ProgramUniformMatrix3x4fvEXT), + SYM(ProgramUniformMatrix4x3fvEXT), + SYM(FramebufferPixelLocalStorageSizeEXT), + SYM(GetFramebufferPixelLocalStorageSizeEXT), + SYM(ClearPixelLocalStorageuiEXT), + SYM(TexPageCommitmentEXT), + SYM(PatchParameteriEXT), + SYM(TexParameterIivEXT), + SYM(TexParameterIuivEXT), + SYM(GetTexParameterIivEXT), + SYM(GetTexParameterIuivEXT), + SYM(SamplerParameterIivEXT), + SYM(SamplerParameterIuivEXT), + SYM(GetSamplerParameterIivEXT), + SYM(GetSamplerParameterIuivEXT), + SYM(TexBufferEXT), + SYM(TexBufferRangeEXT), + SYM(TexStorage1DEXT), + SYM(TexStorage2DEXT), + SYM(TexStorage3DEXT), + SYM(TextureStorage1DEXT), + SYM(TextureStorage2DEXT), + SYM(TextureStorage3DEXT), + SYM(TextureViewEXT), + SYM(FramebufferTextureMultiviewOVR), + SYM(FramebufferTextureMultisampleMultiviewOVR), + + { NULL, NULL }, +}; +RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; +RGLSYMGLDEBUGMESSAGECONTROLKHRPROC __rglgen_glDebugMessageControlKHR; +RGLSYMGLDEBUGMESSAGEINSERTKHRPROC __rglgen_glDebugMessageInsertKHR; +RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC __rglgen_glDebugMessageCallbackKHR; +RGLSYMGLGETDEBUGMESSAGELOGKHRPROC __rglgen_glGetDebugMessageLogKHR; +RGLSYMGLPUSHDEBUGGROUPKHRPROC __rglgen_glPushDebugGroupKHR; +RGLSYMGLPOPDEBUGGROUPKHRPROC __rglgen_glPopDebugGroupKHR; +RGLSYMGLOBJECTLABELKHRPROC __rglgen_glObjectLabelKHR; +RGLSYMGLGETOBJECTLABELKHRPROC __rglgen_glGetObjectLabelKHR; +RGLSYMGLOBJECTPTRLABELKHRPROC __rglgen_glObjectPtrLabelKHR; +RGLSYMGLGETOBJECTPTRLABELKHRPROC __rglgen_glGetObjectPtrLabelKHR; +RGLSYMGLGETPOINTERVKHRPROC __rglgen_glGetPointervKHR; +RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC __rglgen_glGetGraphicsResetStatusKHR; +RGLSYMGLREADNPIXELSKHRPROC __rglgen_glReadnPixelsKHR; +RGLSYMGLGETNUNIFORMFVKHRPROC __rglgen_glGetnUniformfvKHR; +RGLSYMGLGETNUNIFORMIVKHRPROC __rglgen_glGetnUniformivKHR; +RGLSYMGLGETNUNIFORMUIVKHRPROC __rglgen_glGetnUniformuivKHR; +RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC __rglgen_glEGLImageTargetTexture2DOES; +RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __rglgen_glEGLImageTargetRenderbufferStorageOES; +RGLSYMGLCOPYIMAGESUBDATAOESPROC __rglgen_glCopyImageSubDataOES; +RGLSYMGLENABLEIOESPROC __rglgen_glEnableiOES; +RGLSYMGLDISABLEIOESPROC __rglgen_glDisableiOES; +RGLSYMGLBLENDEQUATIONIOESPROC __rglgen_glBlendEquationiOES; +RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC __rglgen_glBlendEquationSeparateiOES; +RGLSYMGLBLENDFUNCIOESPROC __rglgen_glBlendFunciOES; +RGLSYMGLBLENDFUNCSEPARATEIOESPROC __rglgen_glBlendFuncSeparateiOES; +RGLSYMGLCOLORMASKIOESPROC __rglgen_glColorMaskiOES; +RGLSYMGLISENABLEDIOESPROC __rglgen_glIsEnablediOES; +RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glDrawElementsBaseVertexOES; +RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC __rglgen_glDrawRangeElementsBaseVertexOES; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC __rglgen_glDrawElementsInstancedBaseVertexOES; +RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glMultiDrawElementsBaseVertexOES; +RGLSYMGLFRAMEBUFFERTEXTUREOESPROC __rglgen_glFramebufferTextureOES; +RGLSYMGLGETPROGRAMBINARYOESPROC __rglgen_glGetProgramBinaryOES; +RGLSYMGLPROGRAMBINARYOESPROC __rglgen_glProgramBinaryOES; +RGLSYMGLMAPBUFFEROESPROC __rglgen_glMapBufferOES; +RGLSYMGLUNMAPBUFFEROESPROC __rglgen_glUnmapBufferOES; +RGLSYMGLGETBUFFERPOINTERVOESPROC __rglgen_glGetBufferPointervOES; +RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC __rglgen_glPrimitiveBoundingBoxOES; +RGLSYMGLMINSAMPLESHADINGOESPROC __rglgen_glMinSampleShadingOES; +RGLSYMGLPATCHPARAMETERIOESPROC __rglgen_glPatchParameteriOES; +RGLSYMGLTEXIMAGE3DOESPROC __rglgen_glTexImage3DOES; +RGLSYMGLTEXSUBIMAGE3DOESPROC __rglgen_glTexSubImage3DOES; +RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC __rglgen_glCopyTexSubImage3DOES; +RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC __rglgen_glCompressedTexImage3DOES; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __rglgen_glCompressedTexSubImage3DOES; +RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC __rglgen_glFramebufferTexture3DOES; +RGLSYMGLTEXPARAMETERIIVOESPROC __rglgen_glTexParameterIivOES; +RGLSYMGLTEXPARAMETERIUIVOESPROC __rglgen_glTexParameterIuivOES; +RGLSYMGLGETTEXPARAMETERIIVOESPROC __rglgen_glGetTexParameterIivOES; +RGLSYMGLGETTEXPARAMETERIUIVOESPROC __rglgen_glGetTexParameterIuivOES; +RGLSYMGLSAMPLERPARAMETERIIVOESPROC __rglgen_glSamplerParameterIivOES; +RGLSYMGLSAMPLERPARAMETERIUIVOESPROC __rglgen_glSamplerParameterIuivOES; +RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC __rglgen_glGetSamplerParameterIivOES; +RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC __rglgen_glGetSamplerParameterIuivOES; +RGLSYMGLTEXBUFFEROESPROC __rglgen_glTexBufferOES; +RGLSYMGLTEXBUFFERRANGEOESPROC __rglgen_glTexBufferRangeOES; +RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC __rglgen_glTexStorage3DMultisampleOES; +RGLSYMGLTEXTUREVIEWOESPROC __rglgen_glTextureViewOES; +RGLSYMGLBINDVERTEXARRAYOESPROC __rglgen_glBindVertexArrayOES; +RGLSYMGLDELETEVERTEXARRAYSOESPROC __rglgen_glDeleteVertexArraysOES; +RGLSYMGLGENVERTEXARRAYSOESPROC __rglgen_glGenVertexArraysOES; +RGLSYMGLISVERTEXARRAYOESPROC __rglgen_glIsVertexArrayOES; +RGLSYMGLVIEWPORTARRAYVOESPROC __rglgen_glViewportArrayvOES; +RGLSYMGLVIEWPORTINDEXEDFOESPROC __rglgen_glViewportIndexedfOES; +RGLSYMGLVIEWPORTINDEXEDFVOESPROC __rglgen_glViewportIndexedfvOES; +RGLSYMGLSCISSORARRAYVOESPROC __rglgen_glScissorArrayvOES; +RGLSYMGLSCISSORINDEXEDOESPROC __rglgen_glScissorIndexedOES; +RGLSYMGLSCISSORINDEXEDVOESPROC __rglgen_glScissorIndexedvOES; +RGLSYMGLDEPTHRANGEARRAYFVOESPROC __rglgen_glDepthRangeArrayfvOES; +RGLSYMGLDEPTHRANGEINDEXEDFOESPROC __rglgen_glDepthRangeIndexedfOES; +RGLSYMGLGETFLOATI_VOESPROC __rglgen_glGetFloati_vOES; +RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawArraysInstancedBaseInstanceEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseInstanceEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT; +RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __rglgen_glBindFragDataLocationIndexedEXT; +RGLSYMGLBINDFRAGDATALOCATIONEXTPROC __rglgen_glBindFragDataLocationEXT; +RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __rglgen_glGetProgramResourceLocationIndexEXT; +RGLSYMGLGETFRAGDATAINDEXEXTPROC __rglgen_glGetFragDataIndexEXT; +RGLSYMGLBUFFERSTORAGEEXTPROC __rglgen_glBufferStorageEXT; +RGLSYMGLCLEARTEXIMAGEEXTPROC __rglgen_glClearTexImageEXT; +RGLSYMGLCLEARTEXSUBIMAGEEXTPROC __rglgen_glClearTexSubImageEXT; +RGLSYMGLCOPYIMAGESUBDATAEXTPROC __rglgen_glCopyImageSubDataEXT; +RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; +RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; +RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; +RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; +RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; +RGLSYMGLDISCARDFRAMEBUFFEREXTPROC __rglgen_glDiscardFramebufferEXT; +RGLSYMGLGENQUERIESEXTPROC __rglgen_glGenQueriesEXT; +RGLSYMGLDELETEQUERIESEXTPROC __rglgen_glDeleteQueriesEXT; +RGLSYMGLISQUERYEXTPROC __rglgen_glIsQueryEXT; +RGLSYMGLBEGINQUERYEXTPROC __rglgen_glBeginQueryEXT; +RGLSYMGLENDQUERYEXTPROC __rglgen_glEndQueryEXT; +RGLSYMGLQUERYCOUNTEREXTPROC __rglgen_glQueryCounterEXT; +RGLSYMGLGETQUERYIVEXTPROC __rglgen_glGetQueryivEXT; +RGLSYMGLGETQUERYOBJECTIVEXTPROC __rglgen_glGetQueryObjectivEXT; +RGLSYMGLGETQUERYOBJECTUIVEXTPROC __rglgen_glGetQueryObjectuivEXT; +RGLSYMGLDRAWBUFFERSEXTPROC __rglgen_glDrawBuffersEXT; +RGLSYMGLENABLEIEXTPROC __rglgen_glEnableiEXT; +RGLSYMGLDISABLEIEXTPROC __rglgen_glDisableiEXT; +RGLSYMGLBLENDEQUATIONIEXTPROC __rglgen_glBlendEquationiEXT; +RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC __rglgen_glBlendEquationSeparateiEXT; +RGLSYMGLBLENDFUNCIEXTPROC __rglgen_glBlendFunciEXT; +RGLSYMGLBLENDFUNCSEPARATEIEXTPROC __rglgen_glBlendFuncSeparateiEXT; +RGLSYMGLCOLORMASKIEXTPROC __rglgen_glColorMaskiEXT; +RGLSYMGLISENABLEDIEXTPROC __rglgen_glIsEnablediEXT; +RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawElementsBaseVertexEXT; +RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawRangeElementsBaseVertexEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __rglgen_glDrawElementsInstancedBaseVertexEXT; +RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glMultiDrawElementsBaseVertexEXT; +RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; +RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC __rglgen_glFramebufferTextureEXT; +RGLSYMGLVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexAttribDivisorEXT; +RGLSYMGLMAPBUFFERRANGEEXTPROC __rglgen_glMapBufferRangeEXT; +RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedBufferRangeEXT; +RGLSYMGLMULTIDRAWARRAYSEXTPROC __rglgen_glMultiDrawArraysEXT; +RGLSYMGLMULTIDRAWELEMENTSEXTPROC __rglgen_glMultiDrawElementsEXT; +RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC __rglgen_glMultiDrawArraysIndirectEXT; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC __rglgen_glMultiDrawElementsIndirectEXT; +RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glRenderbufferStorageMultisampleEXT; +RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __rglgen_glFramebufferTexture2DMultisampleEXT; +RGLSYMGLREADBUFFERINDEXEDEXTPROC __rglgen_glReadBufferIndexedEXT; +RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC __rglgen_glDrawBuffersIndexedEXT; +RGLSYMGLGETINTEGERI_VEXTPROC __rglgen_glGetIntegeri_vEXT; +RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; +RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC __rglgen_glPrimitiveBoundingBoxEXT; +RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; +RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC __rglgen_glGetGraphicsResetStatusEXT; +RGLSYMGLREADNPIXELSEXTPROC __rglgen_glReadnPixelsEXT; +RGLSYMGLGETNUNIFORMFVEXTPROC __rglgen_glGetnUniformfvEXT; +RGLSYMGLGETNUNIFORMIVEXTPROC __rglgen_glGetnUniformivEXT; +RGLSYMGLACTIVESHADERPROGRAMEXTPROC __rglgen_glActiveShaderProgramEXT; +RGLSYMGLBINDPROGRAMPIPELINEEXTPROC __rglgen_glBindProgramPipelineEXT; +RGLSYMGLCREATESHADERPROGRAMVEXTPROC __rglgen_glCreateShaderProgramvEXT; +RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC __rglgen_glDeleteProgramPipelinesEXT; +RGLSYMGLGENPROGRAMPIPELINESEXTPROC __rglgen_glGenProgramPipelinesEXT; +RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC __rglgen_glGetProgramPipelineInfoLogEXT; +RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC __rglgen_glGetProgramPipelineivEXT; +RGLSYMGLISPROGRAMPIPELINEEXTPROC __rglgen_glIsProgramPipelineEXT; +RGLSYMGLPROGRAMPARAMETERIEXTPROC __rglgen_glProgramParameteriEXT; +RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; +RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; +RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; +RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; +RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; +RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; +RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; +RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; +RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; +RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; +RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; +RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; +RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; +RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; +RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; +RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; +RGLSYMGLUSEPROGRAMSTAGESEXTPROC __rglgen_glUseProgramStagesEXT; +RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC __rglgen_glValidateProgramPipelineEXT; +RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; +RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; +RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; +RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; +RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; +RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; +RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; +RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; +RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glFramebufferPixelLocalStorageSizeEXT; +RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glGetFramebufferPixelLocalStorageSizeEXT; +RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC __rglgen_glClearPixelLocalStorageuiEXT; +RGLSYMGLTEXPAGECOMMITMENTEXTPROC __rglgen_glTexPageCommitmentEXT; +RGLSYMGLPATCHPARAMETERIEXTPROC __rglgen_glPatchParameteriEXT; +RGLSYMGLTEXPARAMETERIIVEXTPROC __rglgen_glTexParameterIivEXT; +RGLSYMGLTEXPARAMETERIUIVEXTPROC __rglgen_glTexParameterIuivEXT; +RGLSYMGLGETTEXPARAMETERIIVEXTPROC __rglgen_glGetTexParameterIivEXT; +RGLSYMGLGETTEXPARAMETERIUIVEXTPROC __rglgen_glGetTexParameterIuivEXT; +RGLSYMGLSAMPLERPARAMETERIIVEXTPROC __rglgen_glSamplerParameterIivEXT; +RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC __rglgen_glSamplerParameterIuivEXT; +RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC __rglgen_glGetSamplerParameterIivEXT; +RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC __rglgen_glGetSamplerParameterIuivEXT; +RGLSYMGLTEXBUFFEREXTPROC __rglgen_glTexBufferEXT; +RGLSYMGLTEXBUFFERRANGEEXTPROC __rglgen_glTexBufferRangeEXT; +RGLSYMGLTEXSTORAGE1DEXTPROC __rglgen_glTexStorage1DEXT; +RGLSYMGLTEXSTORAGE2DEXTPROC __rglgen_glTexStorage2DEXT; +RGLSYMGLTEXSTORAGE3DEXTPROC __rglgen_glTexStorage3DEXT; +RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; +RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; +RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; +RGLSYMGLTEXTUREVIEWEXTPROC __rglgen_glTextureViewEXT; +RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; +RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultisampleMultiviewOVR;
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/glsym_es3.c
Added
@@ -0,0 +1,413 @@ +#include "glsym/glsym.h" +#include <stddef.h> +#define SYM(x) { "gl" #x, &(gl##x) } +const struct rglgen_sym_map rglgen_symbol_map[] = { + SYM(BlendBarrierKHR), + SYM(DebugMessageControlKHR), + SYM(DebugMessageInsertKHR), + SYM(DebugMessageCallbackKHR), + SYM(GetDebugMessageLogKHR), + SYM(PushDebugGroupKHR), + SYM(PopDebugGroupKHR), + SYM(ObjectLabelKHR), + SYM(GetObjectLabelKHR), + SYM(ObjectPtrLabelKHR), + SYM(GetObjectPtrLabelKHR), + SYM(GetPointervKHR), + SYM(GetGraphicsResetStatusKHR), + SYM(ReadnPixelsKHR), + SYM(GetnUniformfvKHR), + SYM(GetnUniformivKHR), + SYM(GetnUniformuivKHR), + SYM(EGLImageTargetTexture2DOES), + SYM(EGLImageTargetRenderbufferStorageOES), + SYM(CopyImageSubDataOES), + SYM(EnableiOES), + SYM(DisableiOES), + SYM(BlendEquationiOES), + SYM(BlendEquationSeparateiOES), + SYM(BlendFunciOES), + SYM(BlendFuncSeparateiOES), + SYM(ColorMaskiOES), + SYM(IsEnablediOES), + SYM(DrawElementsBaseVertexOES), + SYM(DrawRangeElementsBaseVertexOES), + SYM(DrawElementsInstancedBaseVertexOES), + SYM(MultiDrawElementsBaseVertexOES), + SYM(FramebufferTextureOES), + SYM(GetProgramBinaryOES), + SYM(ProgramBinaryOES), + SYM(MapBufferOES), + SYM(UnmapBufferOES), + SYM(GetBufferPointervOES), + SYM(PrimitiveBoundingBoxOES), + SYM(MinSampleShadingOES), + SYM(PatchParameteriOES), + SYM(TexImage3DOES), + SYM(TexSubImage3DOES), + SYM(CopyTexSubImage3DOES), + SYM(CompressedTexImage3DOES), + SYM(CompressedTexSubImage3DOES), + SYM(FramebufferTexture3DOES), + SYM(TexParameterIivOES), + SYM(TexParameterIuivOES), + SYM(GetTexParameterIivOES), + SYM(GetTexParameterIuivOES), + SYM(SamplerParameterIivOES), + SYM(SamplerParameterIuivOES), + SYM(GetSamplerParameterIivOES), + SYM(GetSamplerParameterIuivOES), + SYM(TexBufferOES), + SYM(TexBufferRangeOES), + SYM(TexStorage3DMultisampleOES), + SYM(TextureViewOES), + SYM(BindVertexArrayOES), + SYM(DeleteVertexArraysOES), + SYM(GenVertexArraysOES), + SYM(IsVertexArrayOES), + SYM(ViewportArrayvOES), + SYM(ViewportIndexedfOES), + SYM(ViewportIndexedfvOES), + SYM(ScissorArrayvOES), + SYM(ScissorIndexedOES), + SYM(ScissorIndexedvOES), + SYM(DepthRangeArrayfvOES), + SYM(DepthRangeIndexedfOES), + SYM(GetFloati_vOES), + SYM(DrawArraysInstancedBaseInstanceEXT), + SYM(DrawElementsInstancedBaseInstanceEXT), + SYM(DrawElementsInstancedBaseVertexBaseInstanceEXT), + SYM(BindFragDataLocationIndexedEXT), + SYM(BindFragDataLocationEXT), + SYM(GetProgramResourceLocationIndexEXT), + SYM(GetFragDataIndexEXT), + SYM(BufferStorageEXT), + SYM(ClearTexImageEXT), + SYM(ClearTexSubImageEXT), + SYM(CopyImageSubDataEXT), + SYM(LabelObjectEXT), + SYM(GetObjectLabelEXT), + SYM(InsertEventMarkerEXT), + SYM(PushGroupMarkerEXT), + SYM(PopGroupMarkerEXT), + SYM(DiscardFramebufferEXT), + SYM(GenQueriesEXT), + SYM(DeleteQueriesEXT), + SYM(IsQueryEXT), + SYM(BeginQueryEXT), + SYM(EndQueryEXT), + SYM(QueryCounterEXT), + SYM(GetQueryivEXT), + SYM(GetQueryObjectivEXT), + SYM(GetQueryObjectuivEXT), + SYM(GetQueryObjecti64vEXT), + SYM(GetQueryObjectui64vEXT), + SYM(DrawBuffersEXT), + SYM(EnableiEXT), + SYM(DisableiEXT), + SYM(BlendEquationiEXT), + SYM(BlendEquationSeparateiEXT), + SYM(BlendFunciEXT), + SYM(BlendFuncSeparateiEXT), + SYM(ColorMaskiEXT), + SYM(IsEnablediEXT), + SYM(DrawElementsBaseVertexEXT), + SYM(DrawRangeElementsBaseVertexEXT), + SYM(DrawElementsInstancedBaseVertexEXT), + SYM(MultiDrawElementsBaseVertexEXT), + SYM(DrawArraysInstancedEXT), + SYM(DrawElementsInstancedEXT), + SYM(FramebufferTextureEXT), + SYM(VertexAttribDivisorEXT), + SYM(MapBufferRangeEXT), + SYM(FlushMappedBufferRangeEXT), + SYM(MultiDrawArraysEXT), + SYM(MultiDrawElementsEXT), + SYM(MultiDrawArraysIndirectEXT), + SYM(MultiDrawElementsIndirectEXT), + SYM(RenderbufferStorageMultisampleEXT), + SYM(FramebufferTexture2DMultisampleEXT), + SYM(ReadBufferIndexedEXT), + SYM(DrawBuffersIndexedEXT), + SYM(GetIntegeri_vEXT), + SYM(PolygonOffsetClampEXT), + SYM(PrimitiveBoundingBoxEXT), + SYM(RasterSamplesEXT), + SYM(GetGraphicsResetStatusEXT), + SYM(ReadnPixelsEXT), + SYM(GetnUniformfvEXT), + SYM(GetnUniformivEXT), + SYM(ActiveShaderProgramEXT), + SYM(BindProgramPipelineEXT), + SYM(CreateShaderProgramvEXT), + SYM(DeleteProgramPipelinesEXT), + SYM(GenProgramPipelinesEXT), + SYM(GetProgramPipelineInfoLogEXT), + SYM(GetProgramPipelineivEXT), + SYM(IsProgramPipelineEXT), + SYM(ProgramParameteriEXT), + SYM(ProgramUniform1fEXT), + SYM(ProgramUniform1fvEXT), + SYM(ProgramUniform1iEXT), + SYM(ProgramUniform1ivEXT), + SYM(ProgramUniform2fEXT), + SYM(ProgramUniform2fvEXT), + SYM(ProgramUniform2iEXT), + SYM(ProgramUniform2ivEXT), + SYM(ProgramUniform3fEXT), + SYM(ProgramUniform3fvEXT), + SYM(ProgramUniform3iEXT), + SYM(ProgramUniform3ivEXT), + SYM(ProgramUniform4fEXT), + SYM(ProgramUniform4fvEXT), + SYM(ProgramUniform4iEXT), + SYM(ProgramUniform4ivEXT), + SYM(ProgramUniformMatrix2fvEXT), + SYM(ProgramUniformMatrix3fvEXT), + SYM(ProgramUniformMatrix4fvEXT), + SYM(UseProgramStagesEXT), + SYM(ValidateProgramPipelineEXT), + SYM(ProgramUniform1uiEXT), + SYM(ProgramUniform2uiEXT), + SYM(ProgramUniform3uiEXT), + SYM(ProgramUniform4uiEXT), + SYM(ProgramUniform1uivEXT), + SYM(ProgramUniform2uivEXT), + SYM(ProgramUniform3uivEXT), + SYM(ProgramUniform4uivEXT), + SYM(ProgramUniformMatrix2x3fvEXT), + SYM(ProgramUniformMatrix3x2fvEXT), + SYM(ProgramUniformMatrix2x4fvEXT), + SYM(ProgramUniformMatrix4x2fvEXT), + SYM(ProgramUniformMatrix3x4fvEXT), + SYM(ProgramUniformMatrix4x3fvEXT), + SYM(FramebufferPixelLocalStorageSizeEXT), + SYM(GetFramebufferPixelLocalStorageSizeEXT), + SYM(ClearPixelLocalStorageuiEXT), + SYM(TexPageCommitmentEXT), + SYM(PatchParameteriEXT), + SYM(TexParameterIivEXT), + SYM(TexParameterIuivEXT), + SYM(GetTexParameterIivEXT), + SYM(GetTexParameterIuivEXT), + SYM(SamplerParameterIivEXT), + SYM(SamplerParameterIuivEXT), + SYM(GetSamplerParameterIivEXT), + SYM(GetSamplerParameterIuivEXT), + SYM(TexBufferEXT), + SYM(TexBufferRangeEXT), + SYM(TexStorage1DEXT), + SYM(TexStorage2DEXT), + SYM(TexStorage3DEXT), + SYM(TextureStorage1DEXT), + SYM(TextureStorage2DEXT), + SYM(TextureStorage3DEXT), + SYM(TextureViewEXT), + SYM(FramebufferTextureMultiviewOVR), + SYM(FramebufferTextureMultisampleMultiviewOVR), + + { NULL, NULL }, +}; +RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; +RGLSYMGLDEBUGMESSAGECONTROLKHRPROC __rglgen_glDebugMessageControlKHR; +RGLSYMGLDEBUGMESSAGEINSERTKHRPROC __rglgen_glDebugMessageInsertKHR; +RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC __rglgen_glDebugMessageCallbackKHR; +RGLSYMGLGETDEBUGMESSAGELOGKHRPROC __rglgen_glGetDebugMessageLogKHR; +RGLSYMGLPUSHDEBUGGROUPKHRPROC __rglgen_glPushDebugGroupKHR; +RGLSYMGLPOPDEBUGGROUPKHRPROC __rglgen_glPopDebugGroupKHR; +RGLSYMGLOBJECTLABELKHRPROC __rglgen_glObjectLabelKHR; +RGLSYMGLGETOBJECTLABELKHRPROC __rglgen_glGetObjectLabelKHR; +RGLSYMGLOBJECTPTRLABELKHRPROC __rglgen_glObjectPtrLabelKHR; +RGLSYMGLGETOBJECTPTRLABELKHRPROC __rglgen_glGetObjectPtrLabelKHR; +RGLSYMGLGETPOINTERVKHRPROC __rglgen_glGetPointervKHR; +RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC __rglgen_glGetGraphicsResetStatusKHR; +RGLSYMGLREADNPIXELSKHRPROC __rglgen_glReadnPixelsKHR; +RGLSYMGLGETNUNIFORMFVKHRPROC __rglgen_glGetnUniformfvKHR; +RGLSYMGLGETNUNIFORMIVKHRPROC __rglgen_glGetnUniformivKHR; +RGLSYMGLGETNUNIFORMUIVKHRPROC __rglgen_glGetnUniformuivKHR; +RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC __rglgen_glEGLImageTargetTexture2DOES; +RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __rglgen_glEGLImageTargetRenderbufferStorageOES; +RGLSYMGLCOPYIMAGESUBDATAOESPROC __rglgen_glCopyImageSubDataOES; +RGLSYMGLENABLEIOESPROC __rglgen_glEnableiOES; +RGLSYMGLDISABLEIOESPROC __rglgen_glDisableiOES; +RGLSYMGLBLENDEQUATIONIOESPROC __rglgen_glBlendEquationiOES; +RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC __rglgen_glBlendEquationSeparateiOES; +RGLSYMGLBLENDFUNCIOESPROC __rglgen_glBlendFunciOES; +RGLSYMGLBLENDFUNCSEPARATEIOESPROC __rglgen_glBlendFuncSeparateiOES; +RGLSYMGLCOLORMASKIOESPROC __rglgen_glColorMaskiOES; +RGLSYMGLISENABLEDIOESPROC __rglgen_glIsEnablediOES; +RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glDrawElementsBaseVertexOES; +RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC __rglgen_glDrawRangeElementsBaseVertexOES; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC __rglgen_glDrawElementsInstancedBaseVertexOES; +RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glMultiDrawElementsBaseVertexOES; +RGLSYMGLFRAMEBUFFERTEXTUREOESPROC __rglgen_glFramebufferTextureOES; +RGLSYMGLGETPROGRAMBINARYOESPROC __rglgen_glGetProgramBinaryOES; +RGLSYMGLPROGRAMBINARYOESPROC __rglgen_glProgramBinaryOES; +RGLSYMGLMAPBUFFEROESPROC __rglgen_glMapBufferOES; +RGLSYMGLUNMAPBUFFEROESPROC __rglgen_glUnmapBufferOES; +RGLSYMGLGETBUFFERPOINTERVOESPROC __rglgen_glGetBufferPointervOES; +RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC __rglgen_glPrimitiveBoundingBoxOES; +RGLSYMGLMINSAMPLESHADINGOESPROC __rglgen_glMinSampleShadingOES; +RGLSYMGLPATCHPARAMETERIOESPROC __rglgen_glPatchParameteriOES; +RGLSYMGLTEXIMAGE3DOESPROC __rglgen_glTexImage3DOES; +RGLSYMGLTEXSUBIMAGE3DOESPROC __rglgen_glTexSubImage3DOES; +RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC __rglgen_glCopyTexSubImage3DOES; +RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC __rglgen_glCompressedTexImage3DOES; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __rglgen_glCompressedTexSubImage3DOES; +RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC __rglgen_glFramebufferTexture3DOES; +RGLSYMGLTEXPARAMETERIIVOESPROC __rglgen_glTexParameterIivOES; +RGLSYMGLTEXPARAMETERIUIVOESPROC __rglgen_glTexParameterIuivOES; +RGLSYMGLGETTEXPARAMETERIIVOESPROC __rglgen_glGetTexParameterIivOES; +RGLSYMGLGETTEXPARAMETERIUIVOESPROC __rglgen_glGetTexParameterIuivOES; +RGLSYMGLSAMPLERPARAMETERIIVOESPROC __rglgen_glSamplerParameterIivOES; +RGLSYMGLSAMPLERPARAMETERIUIVOESPROC __rglgen_glSamplerParameterIuivOES; +RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC __rglgen_glGetSamplerParameterIivOES; +RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC __rglgen_glGetSamplerParameterIuivOES; +RGLSYMGLTEXBUFFEROESPROC __rglgen_glTexBufferOES; +RGLSYMGLTEXBUFFERRANGEOESPROC __rglgen_glTexBufferRangeOES; +RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC __rglgen_glTexStorage3DMultisampleOES; +RGLSYMGLTEXTUREVIEWOESPROC __rglgen_glTextureViewOES; +RGLSYMGLBINDVERTEXARRAYOESPROC __rglgen_glBindVertexArrayOES; +RGLSYMGLDELETEVERTEXARRAYSOESPROC __rglgen_glDeleteVertexArraysOES; +RGLSYMGLGENVERTEXARRAYSOESPROC __rglgen_glGenVertexArraysOES; +RGLSYMGLISVERTEXARRAYOESPROC __rglgen_glIsVertexArrayOES; +RGLSYMGLVIEWPORTARRAYVOESPROC __rglgen_glViewportArrayvOES; +RGLSYMGLVIEWPORTINDEXEDFOESPROC __rglgen_glViewportIndexedfOES; +RGLSYMGLVIEWPORTINDEXEDFVOESPROC __rglgen_glViewportIndexedfvOES; +RGLSYMGLSCISSORARRAYVOESPROC __rglgen_glScissorArrayvOES; +RGLSYMGLSCISSORINDEXEDOESPROC __rglgen_glScissorIndexedOES; +RGLSYMGLSCISSORINDEXEDVOESPROC __rglgen_glScissorIndexedvOES; +RGLSYMGLDEPTHRANGEARRAYFVOESPROC __rglgen_glDepthRangeArrayfvOES; +RGLSYMGLDEPTHRANGEINDEXEDFOESPROC __rglgen_glDepthRangeIndexedfOES; +RGLSYMGLGETFLOATI_VOESPROC __rglgen_glGetFloati_vOES; +RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawArraysInstancedBaseInstanceEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseInstanceEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT; +RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __rglgen_glBindFragDataLocationIndexedEXT; +RGLSYMGLBINDFRAGDATALOCATIONEXTPROC __rglgen_glBindFragDataLocationEXT; +RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __rglgen_glGetProgramResourceLocationIndexEXT; +RGLSYMGLGETFRAGDATAINDEXEXTPROC __rglgen_glGetFragDataIndexEXT; +RGLSYMGLBUFFERSTORAGEEXTPROC __rglgen_glBufferStorageEXT; +RGLSYMGLCLEARTEXIMAGEEXTPROC __rglgen_glClearTexImageEXT; +RGLSYMGLCLEARTEXSUBIMAGEEXTPROC __rglgen_glClearTexSubImageEXT; +RGLSYMGLCOPYIMAGESUBDATAEXTPROC __rglgen_glCopyImageSubDataEXT; +RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; +RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; +RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; +RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; +RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; +RGLSYMGLDISCARDFRAMEBUFFEREXTPROC __rglgen_glDiscardFramebufferEXT; +RGLSYMGLGENQUERIESEXTPROC __rglgen_glGenQueriesEXT; +RGLSYMGLDELETEQUERIESEXTPROC __rglgen_glDeleteQueriesEXT; +RGLSYMGLISQUERYEXTPROC __rglgen_glIsQueryEXT; +RGLSYMGLBEGINQUERYEXTPROC __rglgen_glBeginQueryEXT; +RGLSYMGLENDQUERYEXTPROC __rglgen_glEndQueryEXT; +RGLSYMGLQUERYCOUNTEREXTPROC __rglgen_glQueryCounterEXT; +RGLSYMGLGETQUERYIVEXTPROC __rglgen_glGetQueryivEXT; +RGLSYMGLGETQUERYOBJECTIVEXTPROC __rglgen_glGetQueryObjectivEXT; +RGLSYMGLGETQUERYOBJECTUIVEXTPROC __rglgen_glGetQueryObjectuivEXT; +RGLSYMGLGETQUERYOBJECTI64VEXTPROC __rglgen_glGetQueryObjecti64vEXT; +RGLSYMGLGETQUERYOBJECTUI64VEXTPROC __rglgen_glGetQueryObjectui64vEXT; +RGLSYMGLDRAWBUFFERSEXTPROC __rglgen_glDrawBuffersEXT; +RGLSYMGLENABLEIEXTPROC __rglgen_glEnableiEXT; +RGLSYMGLDISABLEIEXTPROC __rglgen_glDisableiEXT; +RGLSYMGLBLENDEQUATIONIEXTPROC __rglgen_glBlendEquationiEXT; +RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC __rglgen_glBlendEquationSeparateiEXT; +RGLSYMGLBLENDFUNCIEXTPROC __rglgen_glBlendFunciEXT; +RGLSYMGLBLENDFUNCSEPARATEIEXTPROC __rglgen_glBlendFuncSeparateiEXT; +RGLSYMGLCOLORMASKIEXTPROC __rglgen_glColorMaskiEXT; +RGLSYMGLISENABLEDIEXTPROC __rglgen_glIsEnablediEXT; +RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawElementsBaseVertexEXT; +RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawRangeElementsBaseVertexEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __rglgen_glDrawElementsInstancedBaseVertexEXT; +RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glMultiDrawElementsBaseVertexEXT; +RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; +RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; +RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC __rglgen_glFramebufferTextureEXT; +RGLSYMGLVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexAttribDivisorEXT; +RGLSYMGLMAPBUFFERRANGEEXTPROC __rglgen_glMapBufferRangeEXT; +RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedBufferRangeEXT; +RGLSYMGLMULTIDRAWARRAYSEXTPROC __rglgen_glMultiDrawArraysEXT; +RGLSYMGLMULTIDRAWELEMENTSEXTPROC __rglgen_glMultiDrawElementsEXT; +RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC __rglgen_glMultiDrawArraysIndirectEXT; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC __rglgen_glMultiDrawElementsIndirectEXT; +RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glRenderbufferStorageMultisampleEXT; +RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __rglgen_glFramebufferTexture2DMultisampleEXT; +RGLSYMGLREADBUFFERINDEXEDEXTPROC __rglgen_glReadBufferIndexedEXT; +RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC __rglgen_glDrawBuffersIndexedEXT; +RGLSYMGLGETINTEGERI_VEXTPROC __rglgen_glGetIntegeri_vEXT; +RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; +RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC __rglgen_glPrimitiveBoundingBoxEXT; +RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; +RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC __rglgen_glGetGraphicsResetStatusEXT; +RGLSYMGLREADNPIXELSEXTPROC __rglgen_glReadnPixelsEXT; +RGLSYMGLGETNUNIFORMFVEXTPROC __rglgen_glGetnUniformfvEXT; +RGLSYMGLGETNUNIFORMIVEXTPROC __rglgen_glGetnUniformivEXT; +RGLSYMGLACTIVESHADERPROGRAMEXTPROC __rglgen_glActiveShaderProgramEXT; +RGLSYMGLBINDPROGRAMPIPELINEEXTPROC __rglgen_glBindProgramPipelineEXT; +RGLSYMGLCREATESHADERPROGRAMVEXTPROC __rglgen_glCreateShaderProgramvEXT; +RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC __rglgen_glDeleteProgramPipelinesEXT; +RGLSYMGLGENPROGRAMPIPELINESEXTPROC __rglgen_glGenProgramPipelinesEXT; +RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC __rglgen_glGetProgramPipelineInfoLogEXT; +RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC __rglgen_glGetProgramPipelineivEXT; +RGLSYMGLISPROGRAMPIPELINEEXTPROC __rglgen_glIsProgramPipelineEXT; +RGLSYMGLPROGRAMPARAMETERIEXTPROC __rglgen_glProgramParameteriEXT; +RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; +RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; +RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; +RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; +RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; +RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; +RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; +RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; +RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; +RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; +RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; +RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; +RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; +RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; +RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; +RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; +RGLSYMGLUSEPROGRAMSTAGESEXTPROC __rglgen_glUseProgramStagesEXT; +RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC __rglgen_glValidateProgramPipelineEXT; +RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; +RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; +RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; +RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; +RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; +RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; +RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; +RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; +RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glFramebufferPixelLocalStorageSizeEXT; +RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glGetFramebufferPixelLocalStorageSizeEXT; +RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC __rglgen_glClearPixelLocalStorageuiEXT; +RGLSYMGLTEXPAGECOMMITMENTEXTPROC __rglgen_glTexPageCommitmentEXT; +RGLSYMGLPATCHPARAMETERIEXTPROC __rglgen_glPatchParameteriEXT; +RGLSYMGLTEXPARAMETERIIVEXTPROC __rglgen_glTexParameterIivEXT; +RGLSYMGLTEXPARAMETERIUIVEXTPROC __rglgen_glTexParameterIuivEXT; +RGLSYMGLGETTEXPARAMETERIIVEXTPROC __rglgen_glGetTexParameterIivEXT; +RGLSYMGLGETTEXPARAMETERIUIVEXTPROC __rglgen_glGetTexParameterIuivEXT; +RGLSYMGLSAMPLERPARAMETERIIVEXTPROC __rglgen_glSamplerParameterIivEXT; +RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC __rglgen_glSamplerParameterIuivEXT; +RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC __rglgen_glGetSamplerParameterIivEXT; +RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC __rglgen_glGetSamplerParameterIuivEXT; +RGLSYMGLTEXBUFFEREXTPROC __rglgen_glTexBufferEXT; +RGLSYMGLTEXBUFFERRANGEEXTPROC __rglgen_glTexBufferRangeEXT; +RGLSYMGLTEXSTORAGE1DEXTPROC __rglgen_glTexStorage1DEXT; +RGLSYMGLTEXSTORAGE2DEXTPROC __rglgen_glTexStorage2DEXT; +RGLSYMGLTEXSTORAGE3DEXTPROC __rglgen_glTexStorage3DEXT; +RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; +RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; +RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; +RGLSYMGLTEXTUREVIEWEXTPROC __rglgen_glTextureViewEXT; +RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; +RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultisampleMultiviewOVR;
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/glsym_gl.c
Added
@@ -0,0 +1,2541 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stddef.h> + +#include <glsym/glsym.h> + +#define SYM(x) { "gl" #x, (void*)&(gl##x) } + +const struct rglgen_sym_map rglgen_symbol_map[] = { +#ifdef HAVE_LIBNX + SYM(ClearIndex), + SYM(ClearColor), + SYM(Clear), + SYM(IndexMask), + SYM(ColorMask), + SYM(AlphaFunc), + SYM(BlendFunc), + SYM(LogicOp), + SYM(CullFace), + SYM(FrontFace), + SYM(PointSize), + SYM(LineWidth), + SYM(LineStipple), + SYM(PolygonMode), + SYM(PolygonOffset), + SYM(PolygonStipple), + SYM(GetPolygonStipple), + SYM(EdgeFlag), + SYM(EdgeFlagv), + SYM(Scissor), + SYM(ClipPlane), + SYM(GetClipPlane), + SYM(DrawBuffer), + SYM(ReadBuffer), + SYM(Enable), + SYM(Disable), + SYM(IsEnabled), + SYM(EnableClientState), + SYM(DisableClientState), + SYM(GetBooleanv), + SYM(GetDoublev), + SYM(GetFloatv), + SYM(GetIntegerv), + SYM(PushAttrib), + SYM(PopAttrib), + SYM(PushClientAttrib), + SYM(PopClientAttrib), + SYM(RenderMode), + SYM(GetError), + SYM(GetString), + SYM(Finish), + SYM(Flush), + SYM(Hint), + SYM(ClearDepth), + SYM(DepthFunc), + SYM(DepthMask), + SYM(DepthRange), + SYM(ClearAccum), + SYM(Accum), + SYM(MatrixMode), + SYM(Ortho), + SYM(Frustum), + SYM(Viewport), + SYM(PushMatrix), + SYM(PopMatrix), + SYM(LoadIdentity), + SYM(LoadMatrixd), + SYM(LoadMatrixf), + SYM(MultMatrixd), + SYM(MultMatrixf), + SYM(Rotated), + SYM(Rotatef), + SYM(Scaled), + SYM(Scalef), + SYM(Translated), + SYM(Translatef), + SYM(IsList), + SYM(DeleteLists), + SYM(GenLists), + SYM(NewList), + SYM(EndList), + SYM(CallList), + SYM(CallLists), + SYM(ListBase), + SYM(Begin), + SYM(End), + SYM(Vertex2d), + SYM(Vertex2f), + SYM(Vertex2i), + SYM(Vertex2s), + SYM(Vertex3d), + SYM(Vertex3f), + SYM(Vertex3i), + SYM(Vertex3s), + SYM(Vertex4d), + SYM(Vertex4f), + SYM(Vertex4i), + SYM(Vertex4s), + SYM(Vertex2dv), + SYM(Vertex2fv), + SYM(Vertex2iv), + SYM(Vertex2sv), + SYM(Vertex3dv), + SYM(Vertex3fv), + SYM(Vertex3iv), + SYM(Vertex3sv), + SYM(Vertex4dv), + SYM(Vertex4fv), + SYM(Vertex4iv), + SYM(Vertex4sv), + SYM(Normal3b), + SYM(Normal3d), + SYM(Normal3f), + SYM(Normal3i), + SYM(Normal3s), + SYM(Normal3bv), + SYM(Normal3dv), + SYM(Normal3fv), + SYM(Normal3iv), + SYM(Normal3sv), + SYM(Indexd), + SYM(Indexf), + SYM(Indexi), + SYM(Indexs), + SYM(Indexub), + SYM(Indexdv), + SYM(Indexfv), + SYM(Indexiv), + SYM(Indexsv), + SYM(Indexubv), + SYM(Color3b), + SYM(Color3d), + SYM(Color3f), + SYM(Color3i), + SYM(Color3s), + SYM(Color3ub), + SYM(Color3ui), + SYM(Color3us), + SYM(Color4b), + SYM(Color4d), + SYM(Color4f), + SYM(Color4i), + SYM(Color4s), + SYM(Color4ub), + SYM(Color4ui), + SYM(Color4us), + SYM(Color3bv), + SYM(Color3dv), + SYM(Color3fv), + SYM(Color3iv), + SYM(Color3sv), + SYM(Color3ubv), + SYM(Color3uiv), + SYM(Color3usv), + SYM(Color4bv), + SYM(Color4dv), + SYM(Color4fv), + SYM(Color4iv), + SYM(Color4sv), + SYM(Color4ubv), + SYM(Color4uiv), + SYM(Color4usv), + SYM(TexCoord1d), + SYM(TexCoord1f), + SYM(TexCoord1i), + SYM(TexCoord1s), + SYM(TexCoord2d), + SYM(TexCoord2f), + SYM(TexCoord2i), + SYM(TexCoord2s), + SYM(TexCoord3d), + SYM(TexCoord3f), + SYM(TexCoord3i), + SYM(TexCoord3s), + SYM(TexCoord4d), + SYM(TexCoord4f), + SYM(TexCoord4i), + SYM(TexCoord4s), + SYM(TexCoord1dv), + SYM(TexCoord1fv), + SYM(TexCoord1iv), + SYM(TexCoord1sv), + SYM(TexCoord2dv), + SYM(TexCoord2fv), + SYM(TexCoord2iv), + SYM(TexCoord2sv), + SYM(TexCoord3dv), + SYM(TexCoord3fv), + SYM(TexCoord3iv), + SYM(TexCoord3sv), + SYM(TexCoord4dv), + SYM(TexCoord4fv), + SYM(TexCoord4iv), + SYM(TexCoord4sv), + SYM(RasterPos2d), + SYM(RasterPos2f), + SYM(RasterPos2i), + SYM(RasterPos2s), + SYM(RasterPos3d), + SYM(RasterPos3f), + SYM(RasterPos3i), + SYM(RasterPos3s), + SYM(RasterPos4d), + SYM(RasterPos4f), + SYM(RasterPos4i), + SYM(RasterPos4s), + SYM(RasterPos2dv), + SYM(RasterPos2fv), + SYM(RasterPos2iv), + SYM(RasterPos2sv), + SYM(RasterPos3dv), + SYM(RasterPos3fv), + SYM(RasterPos3iv), + SYM(RasterPos3sv), + SYM(RasterPos4dv), + SYM(RasterPos4fv), + SYM(RasterPos4iv), + SYM(RasterPos4sv), + SYM(Rectd), + SYM(Rectf), + SYM(Recti), + SYM(Rects), + SYM(Rectdv), + SYM(Rectfv), + SYM(Rectiv), + SYM(Rectsv), + SYM(VertexPointer), + SYM(NormalPointer), + SYM(ColorPointer), + SYM(IndexPointer), + SYM(TexCoordPointer), + SYM(EdgeFlagPointer), + SYM(GetPointerv), + SYM(ArrayElement), + SYM(DrawArrays), + SYM(DrawElements), + SYM(InterleavedArrays), + SYM(ShadeModel), + SYM(Lightf), + SYM(Lighti), + SYM(Lightfv), + SYM(Lightiv), + SYM(GetLightfv), + SYM(GetLightiv), + SYM(LightModelf), + SYM(LightModeli), + SYM(LightModelfv), + SYM(LightModeliv), + SYM(Materialf), + SYM(Materiali), + SYM(Materialfv), + SYM(Materialiv), + SYM(GetMaterialfv), + SYM(GetMaterialiv), + SYM(ColorMaterial), + SYM(PixelZoom), + SYM(PixelStoref), + SYM(PixelStorei), + SYM(PixelTransferf), + SYM(PixelTransferi), + SYM(PixelMapfv), + SYM(PixelMapuiv), + SYM(PixelMapusv), + SYM(GetPixelMapfv), + SYM(GetPixelMapuiv), + SYM(GetPixelMapusv), + SYM(Bitmap), + SYM(ReadPixels), + SYM(DrawPixels), + SYM(CopyPixels), + SYM(StencilFunc), + SYM(StencilMask), + SYM(StencilOp), + SYM(ClearStencil), + SYM(TexGend), + SYM(TexGenf), + SYM(TexGeni), + SYM(TexGendv), + SYM(TexGenfv), + SYM(TexGeniv), + SYM(GetTexGendv), + SYM(GetTexGenfv), + SYM(GetTexGeniv), + SYM(TexEnvf), + SYM(TexEnvi), + SYM(TexEnvfv), + SYM(TexEnviv), + SYM(GetTexEnvfv), + SYM(GetTexEnviv), + SYM(TexParameterf), + SYM(TexParameteri), + SYM(TexParameterfv), + SYM(TexParameteriv), + SYM(GetTexParameterfv), + SYM(GetTexParameteriv), + SYM(GetTexLevelParameterfv), + SYM(GetTexLevelParameteriv), + SYM(TexImage1D), + SYM(TexImage2D), + SYM(GetTexImage), + SYM(GenTextures), + SYM(DeleteTextures), + SYM(BindTexture), + SYM(PrioritizeTextures), + SYM(AreTexturesResident), + SYM(IsTexture), + SYM(TexSubImage1D), + SYM(TexSubImage2D), + SYM(CopyTexImage1D), + SYM(CopyTexImage2D), + SYM(CopyTexSubImage1D), + SYM(CopyTexSubImage2D), + SYM(Map1d), + SYM(Map1f), + SYM(Map2d), + SYM(Map2f), + SYM(GetMapdv), + SYM(GetMapfv), + SYM(GetMapiv), + SYM(EvalCoord1d), + SYM(EvalCoord1f), + SYM(EvalCoord1dv), + SYM(EvalCoord1fv), + SYM(EvalCoord2d), + SYM(EvalCoord2f), + SYM(EvalCoord2dv), + SYM(EvalCoord2fv), + SYM(MapGrid1d), + SYM(MapGrid1f), + SYM(MapGrid2d), + SYM(MapGrid2f), + SYM(EvalPoint1), + SYM(EvalPoint2), + SYM(EvalMesh1), + SYM(EvalMesh2), + SYM(Fogf), + SYM(Fogi), + SYM(Fogfv), + SYM(Fogiv), + SYM(FeedbackBuffer), + SYM(PassThrough), + SYM(SelectBuffer), + SYM(InitNames), + SYM(LoadName), + SYM(PushName), + SYM(PopName), + SYM(DrawRangeElements), + SYM(TexImage3D), + SYM(TexSubImage3D), + SYM(CopyTexSubImage3D), + SYM(ColorTable), + SYM(ColorSubTable), + SYM(ColorTableParameteriv), + SYM(ColorTableParameterfv), + SYM(CopyColorSubTable), + SYM(CopyColorTable), + SYM(GetColorTable), + SYM(GetColorTableParameterfv), + SYM(GetColorTableParameteriv), + SYM(BlendEquation), + SYM(BlendColor), + SYM(Histogram), + SYM(ResetHistogram), + SYM(GetHistogram), + SYM(GetHistogramParameterfv), + SYM(GetHistogramParameteriv), + SYM(Minmax), + SYM(ResetMinmax), + SYM(GetMinmax), + SYM(GetMinmaxParameterfv), + SYM(GetMinmaxParameteriv), + SYM(ConvolutionFilter1D), + SYM(ConvolutionFilter2D), + SYM(ConvolutionParameterf), + SYM(ConvolutionParameterfv), + SYM(ConvolutionParameteri), + SYM(ConvolutionParameteriv), + SYM(CopyConvolutionFilter1D), + SYM(CopyConvolutionFilter2D), + SYM(GetConvolutionFilter), + SYM(GetConvolutionParameterfv), + SYM(GetConvolutionParameteriv), + SYM(SeparableFilter2D), + SYM(GetSeparableFilter), + SYM(ActiveTexture), + SYM(ClientActiveTexture), + SYM(CompressedTexImage1D), + SYM(CompressedTexImage2D), + SYM(CompressedTexImage3D), + SYM(CompressedTexSubImage1D), + SYM(CompressedTexSubImage2D), + SYM(CompressedTexSubImage3D), + SYM(GetCompressedTexImage), + SYM(MultiTexCoord1d), + SYM(MultiTexCoord1dv), + SYM(MultiTexCoord1f), + SYM(MultiTexCoord1fv), + SYM(MultiTexCoord1i), + SYM(MultiTexCoord1iv), + SYM(MultiTexCoord1s), + SYM(MultiTexCoord1sv), + SYM(MultiTexCoord2d), + SYM(MultiTexCoord2dv), + SYM(MultiTexCoord2f), + SYM(MultiTexCoord2fv), + SYM(MultiTexCoord2i), + SYM(MultiTexCoord2iv), + SYM(MultiTexCoord2s), + SYM(MultiTexCoord2sv), + SYM(MultiTexCoord3d), + SYM(MultiTexCoord3dv), + SYM(MultiTexCoord3f), + SYM(MultiTexCoord3fv), + SYM(MultiTexCoord3i), + SYM(MultiTexCoord3iv), + SYM(MultiTexCoord3s), + SYM(MultiTexCoord3sv), + SYM(MultiTexCoord4d), + SYM(MultiTexCoord4dv), + SYM(MultiTexCoord4f), + SYM(MultiTexCoord4fv), + SYM(MultiTexCoord4i), + SYM(MultiTexCoord4iv), + SYM(MultiTexCoord4s), + SYM(MultiTexCoord4sv), + SYM(LoadTransposeMatrixd), + SYM(LoadTransposeMatrixf), + SYM(MultTransposeMatrixd), + SYM(MultTransposeMatrixf), + SYM(SampleCoverage), + SYM(ActiveTextureARB), + SYM(ClientActiveTextureARB), + SYM(MultiTexCoord1dARB), + SYM(MultiTexCoord1dvARB), + SYM(MultiTexCoord1fARB), + SYM(MultiTexCoord1fvARB), + SYM(MultiTexCoord1iARB), + SYM(MultiTexCoord1ivARB), + SYM(MultiTexCoord1sARB), + SYM(MultiTexCoord1svARB), + SYM(MultiTexCoord2dARB), + SYM(MultiTexCoord2dvARB), + SYM(MultiTexCoord2fARB), + SYM(MultiTexCoord2fvARB), + SYM(MultiTexCoord2iARB), + SYM(MultiTexCoord2ivARB), + SYM(MultiTexCoord2sARB), + SYM(MultiTexCoord2svARB), + SYM(MultiTexCoord3dARB), + SYM(MultiTexCoord3dvARB), + SYM(MultiTexCoord3fARB), + SYM(MultiTexCoord3fvARB), + SYM(MultiTexCoord3iARB), + SYM(MultiTexCoord3ivARB), + SYM(MultiTexCoord3sARB), + SYM(MultiTexCoord3svARB), + SYM(MultiTexCoord4dARB), + SYM(MultiTexCoord4dvARB), + SYM(MultiTexCoord4fARB), + SYM(MultiTexCoord4fvARB), + SYM(MultiTexCoord4iARB), + SYM(MultiTexCoord4ivARB), + SYM(MultiTexCoord4sARB), + SYM(MultiTexCoord4svARB), + SYM(EGLImageTargetTexture2DOES), + SYM(EGLImageTargetRenderbufferStorageOES), +#endif + + SYM(DrawRangeElements), + SYM(TexImage3D), + SYM(TexSubImage3D), + SYM(CopyTexSubImage3D), + SYM(ActiveTexture), + SYM(SampleCoverage), + SYM(CompressedTexImage3D), + SYM(CompressedTexImage2D), + SYM(CompressedTexImage1D), + SYM(CompressedTexSubImage3D), + SYM(CompressedTexSubImage2D), + SYM(CompressedTexSubImage1D), + SYM(GetCompressedTexImage), + SYM(ClientActiveTexture), + SYM(MultiTexCoord1d), + SYM(MultiTexCoord1dv), + SYM(MultiTexCoord1f), + SYM(MultiTexCoord1fv), + SYM(MultiTexCoord1i), + SYM(MultiTexCoord1iv), + SYM(MultiTexCoord1s), + SYM(MultiTexCoord1sv), + SYM(MultiTexCoord2d), + SYM(MultiTexCoord2dv), + SYM(MultiTexCoord2f), + SYM(MultiTexCoord2fv), + SYM(MultiTexCoord2i), + SYM(MultiTexCoord2iv), + SYM(MultiTexCoord2s), + SYM(MultiTexCoord2sv), + SYM(MultiTexCoord3d), + SYM(MultiTexCoord3dv), + SYM(MultiTexCoord3f), + SYM(MultiTexCoord3fv), + SYM(MultiTexCoord3i), + SYM(MultiTexCoord3iv), + SYM(MultiTexCoord3s), + SYM(MultiTexCoord3sv), + SYM(MultiTexCoord4d), + SYM(MultiTexCoord4dv), + SYM(MultiTexCoord4f), + SYM(MultiTexCoord4fv), + SYM(MultiTexCoord4i), + SYM(MultiTexCoord4iv), + SYM(MultiTexCoord4s), + SYM(MultiTexCoord4sv), + SYM(LoadTransposeMatrixf), + SYM(LoadTransposeMatrixd), + SYM(MultTransposeMatrixf), + SYM(MultTransposeMatrixd), + SYM(BlendFuncSeparate), + SYM(MultiDrawArrays), + SYM(MultiDrawElements), + SYM(PointParameterf), + SYM(PointParameterfv), + SYM(PointParameteri), + SYM(PointParameteriv), + SYM(FogCoordf), + SYM(FogCoordfv), + SYM(FogCoordd), + SYM(FogCoorddv), + SYM(FogCoordPointer), + SYM(SecondaryColor3b), + SYM(SecondaryColor3bv), + SYM(SecondaryColor3d), + SYM(SecondaryColor3dv), + SYM(SecondaryColor3f), + SYM(SecondaryColor3fv), + SYM(SecondaryColor3i), + SYM(SecondaryColor3iv), + SYM(SecondaryColor3s), + SYM(SecondaryColor3sv), + SYM(SecondaryColor3ub), + SYM(SecondaryColor3ubv), + SYM(SecondaryColor3ui), + SYM(SecondaryColor3uiv), + SYM(SecondaryColor3us), + SYM(SecondaryColor3usv), + SYM(SecondaryColorPointer), + SYM(WindowPos2d), + SYM(WindowPos2dv), + SYM(WindowPos2f), + SYM(WindowPos2fv), + SYM(WindowPos2i), + SYM(WindowPos2iv), + SYM(WindowPos2s), + SYM(WindowPos2sv), + SYM(WindowPos3d), + SYM(WindowPos3dv), + SYM(WindowPos3f), + SYM(WindowPos3fv), + SYM(WindowPos3i), + SYM(WindowPos3iv), + SYM(WindowPos3s), + SYM(WindowPos3sv), + SYM(BlendColor), + SYM(BlendEquation), + SYM(GenQueries), + SYM(DeleteQueries), + SYM(IsQuery), + SYM(BeginQuery), + SYM(EndQuery), + SYM(GetQueryiv), + SYM(GetQueryObjectiv), + SYM(GetQueryObjectuiv), + SYM(BindBuffer), + SYM(DeleteBuffers), + SYM(GenBuffers), + SYM(IsBuffer), + SYM(BufferData), + SYM(BufferSubData), + SYM(GetBufferSubData), + SYM(MapBuffer), + SYM(UnmapBuffer), + SYM(GetBufferParameteriv), + SYM(GetBufferPointerv), + SYM(BlendEquationSeparate), + SYM(DrawBuffers), + SYM(StencilOpSeparate), + SYM(StencilFuncSeparate), + SYM(StencilMaskSeparate), + SYM(AttachShader), + SYM(BindAttribLocation), + SYM(CompileShader), + SYM(CreateProgram), + SYM(CreateShader), + SYM(DeleteProgram), + SYM(DeleteShader), + SYM(DetachShader), + SYM(DisableVertexAttribArray), + SYM(EnableVertexAttribArray), + SYM(GetActiveAttrib), + SYM(GetActiveUniform), + SYM(GetAttachedShaders), + SYM(GetAttribLocation), + SYM(GetProgramiv), + SYM(GetProgramInfoLog), + SYM(GetShaderiv), + SYM(GetShaderInfoLog), + SYM(GetShaderSource), + SYM(GetUniformLocation), + SYM(GetUniformfv), + SYM(GetUniformiv), + SYM(GetVertexAttribdv), + SYM(GetVertexAttribfv), + SYM(GetVertexAttribiv), + SYM(GetVertexAttribPointerv), + SYM(IsProgram), + SYM(IsShader), + SYM(LinkProgram), + SYM(ShaderSource), + SYM(UseProgram), + SYM(Uniform1f), + SYM(Uniform2f), + SYM(Uniform3f), + SYM(Uniform4f), + SYM(Uniform1i), + SYM(Uniform2i), + SYM(Uniform3i), + SYM(Uniform4i), + SYM(Uniform1fv), + SYM(Uniform2fv), + SYM(Uniform3fv), + SYM(Uniform4fv), + SYM(Uniform1iv), + SYM(Uniform2iv), + SYM(Uniform3iv), + SYM(Uniform4iv), + SYM(UniformMatrix2fv), + SYM(UniformMatrix3fv), + SYM(UniformMatrix4fv), + SYM(ValidateProgram), + SYM(VertexAttrib1d), + SYM(VertexAttrib1dv), + SYM(VertexAttrib1f), + SYM(VertexAttrib1fv), + SYM(VertexAttrib1s), + SYM(VertexAttrib1sv), + SYM(VertexAttrib2d), + SYM(VertexAttrib2dv), + SYM(VertexAttrib2f), + SYM(VertexAttrib2fv), + SYM(VertexAttrib2s), + SYM(VertexAttrib2sv), + SYM(VertexAttrib3d), + SYM(VertexAttrib3dv), + SYM(VertexAttrib3f), + SYM(VertexAttrib3fv), + SYM(VertexAttrib3s), + SYM(VertexAttrib3sv), + SYM(VertexAttrib4Nbv), + SYM(VertexAttrib4Niv), + SYM(VertexAttrib4Nsv), + SYM(VertexAttrib4Nub), + SYM(VertexAttrib4Nubv), + SYM(VertexAttrib4Nuiv), + SYM(VertexAttrib4Nusv), + SYM(VertexAttrib4bv), + SYM(VertexAttrib4d), + SYM(VertexAttrib4dv), + SYM(VertexAttrib4f), + SYM(VertexAttrib4fv), + SYM(VertexAttrib4iv), + SYM(VertexAttrib4s), + SYM(VertexAttrib4sv), + SYM(VertexAttrib4ubv), + SYM(VertexAttrib4uiv), + SYM(VertexAttrib4usv), + SYM(VertexAttribPointer), + SYM(UniformMatrix2x3fv), + SYM(UniformMatrix3x2fv), + SYM(UniformMatrix2x4fv), + SYM(UniformMatrix4x2fv), + SYM(UniformMatrix3x4fv), + SYM(UniformMatrix4x3fv), + SYM(ColorMaski), + SYM(GetBooleani_v), + SYM(GetIntegeri_v), + SYM(Enablei), + SYM(Disablei), + SYM(IsEnabledi), + SYM(BeginTransformFeedback), + SYM(EndTransformFeedback), + SYM(BindBufferRange), + SYM(BindBufferBase), + SYM(TransformFeedbackVaryings), + SYM(GetTransformFeedbackVarying), + SYM(ClampColor), + SYM(BeginConditionalRender), + SYM(EndConditionalRender), + SYM(VertexAttribIPointer), + SYM(GetVertexAttribIiv), + SYM(GetVertexAttribIuiv), + SYM(VertexAttribI1i), + SYM(VertexAttribI2i), + SYM(VertexAttribI3i), + SYM(VertexAttribI4i), + SYM(VertexAttribI1ui), + SYM(VertexAttribI2ui), + SYM(VertexAttribI3ui), + SYM(VertexAttribI4ui), + SYM(VertexAttribI1iv), + SYM(VertexAttribI2iv), + SYM(VertexAttribI3iv), + SYM(VertexAttribI4iv), + SYM(VertexAttribI1uiv), + SYM(VertexAttribI2uiv), + SYM(VertexAttribI3uiv), + SYM(VertexAttribI4uiv), + SYM(VertexAttribI4bv), + SYM(VertexAttribI4sv), + SYM(VertexAttribI4ubv), + SYM(VertexAttribI4usv), + SYM(GetUniformuiv), + SYM(BindFragDataLocation), + SYM(GetFragDataLocation), + SYM(Uniform1ui), + SYM(Uniform2ui), + SYM(Uniform3ui), + SYM(Uniform4ui), + SYM(Uniform1uiv), + SYM(Uniform2uiv), + SYM(Uniform3uiv), + SYM(Uniform4uiv), + SYM(TexParameterIiv), + SYM(TexParameterIuiv), + SYM(GetTexParameterIiv), + SYM(GetTexParameterIuiv), + SYM(ClearBufferiv), + SYM(ClearBufferuiv), + SYM(ClearBufferfv), + SYM(ClearBufferfi), + SYM(GetStringi), + SYM(IsRenderbuffer), + SYM(BindRenderbuffer), + SYM(DeleteRenderbuffers), + SYM(GenRenderbuffers), + SYM(RenderbufferStorage), + SYM(GetRenderbufferParameteriv), + SYM(IsFramebuffer), + SYM(BindFramebuffer), + SYM(DeleteFramebuffers), + SYM(GenFramebuffers), + SYM(CheckFramebufferStatus), + SYM(FramebufferTexture1D), + SYM(FramebufferTexture2D), + SYM(FramebufferTexture3D), + SYM(FramebufferRenderbuffer), + SYM(GetFramebufferAttachmentParameteriv), + SYM(GenerateMipmap), + SYM(BlitFramebuffer), + SYM(RenderbufferStorageMultisample), + SYM(FramebufferTextureLayer), + SYM(MapBufferRange), + SYM(FlushMappedBufferRange), + SYM(BindVertexArray), + SYM(DeleteVertexArrays), + SYM(GenVertexArrays), + SYM(IsVertexArray), + SYM(DrawArraysInstanced), + SYM(DrawElementsInstanced), + SYM(TexBuffer), + SYM(PrimitiveRestartIndex), + SYM(CopyBufferSubData), + SYM(GetUniformIndices), + SYM(GetActiveUniformsiv), + SYM(GetActiveUniformName), + SYM(GetUniformBlockIndex), + SYM(GetActiveUniformBlockiv), + SYM(GetActiveUniformBlockName), + SYM(UniformBlockBinding), + SYM(DrawElementsBaseVertex), + SYM(DrawRangeElementsBaseVertex), + SYM(DrawElementsInstancedBaseVertex), + SYM(MultiDrawElementsBaseVertex), + SYM(ProvokingVertex), + SYM(FenceSync), + SYM(IsSync), + SYM(DeleteSync), + SYM(ClientWaitSync), + SYM(WaitSync), + SYM(GetInteger64v), + SYM(GetSynciv), + SYM(GetInteger64i_v), + SYM(GetBufferParameteri64v), + SYM(FramebufferTexture), + SYM(TexImage2DMultisample), + SYM(TexImage3DMultisample), + SYM(GetMultisamplefv), + SYM(SampleMaski), + SYM(BindFragDataLocationIndexed), + SYM(GetFragDataIndex), + SYM(GenSamplers), + SYM(DeleteSamplers), + SYM(IsSampler), + SYM(BindSampler), + SYM(SamplerParameteri), + SYM(SamplerParameteriv), + SYM(SamplerParameterf), + SYM(SamplerParameterfv), + SYM(SamplerParameterIiv), + SYM(SamplerParameterIuiv), + SYM(GetSamplerParameteriv), + SYM(GetSamplerParameterIiv), + SYM(GetSamplerParameterfv), + SYM(GetSamplerParameterIuiv), + SYM(QueryCounter), + SYM(GetQueryObjecti64v), + SYM(GetQueryObjectui64v), + SYM(VertexAttribDivisor), + SYM(VertexAttribP1ui), + SYM(VertexAttribP1uiv), + SYM(VertexAttribP2ui), + SYM(VertexAttribP2uiv), + SYM(VertexAttribP3ui), + SYM(VertexAttribP3uiv), + SYM(VertexAttribP4ui), + SYM(VertexAttribP4uiv), + SYM(VertexP2ui), + SYM(VertexP2uiv), + SYM(VertexP3ui), + SYM(VertexP3uiv), + SYM(VertexP4ui), + SYM(VertexP4uiv), + SYM(TexCoordP1ui), + SYM(TexCoordP1uiv), + SYM(TexCoordP2ui), + SYM(TexCoordP2uiv), + SYM(TexCoordP3ui), + SYM(TexCoordP3uiv), + SYM(TexCoordP4ui), + SYM(TexCoordP4uiv), + SYM(MultiTexCoordP1ui), + SYM(MultiTexCoordP1uiv), + SYM(MultiTexCoordP2ui), + SYM(MultiTexCoordP2uiv), + SYM(MultiTexCoordP3ui), + SYM(MultiTexCoordP3uiv), + SYM(MultiTexCoordP4ui), + SYM(MultiTexCoordP4uiv), + SYM(NormalP3ui), + SYM(NormalP3uiv), + SYM(ColorP3ui), + SYM(ColorP3uiv), + SYM(ColorP4ui), + SYM(ColorP4uiv), + SYM(SecondaryColorP3ui), + SYM(SecondaryColorP3uiv), + SYM(MinSampleShading), + SYM(BlendEquationi), + SYM(BlendEquationSeparatei), + SYM(BlendFunci), + SYM(BlendFuncSeparatei), + SYM(DrawArraysIndirect), + SYM(DrawElementsIndirect), + SYM(Uniform1d), + SYM(Uniform2d), + SYM(Uniform3d), + SYM(Uniform4d), + SYM(Uniform1dv), + SYM(Uniform2dv), + SYM(Uniform3dv), + SYM(Uniform4dv), + SYM(UniformMatrix2dv), + SYM(UniformMatrix3dv), + SYM(UniformMatrix4dv), + SYM(UniformMatrix2x3dv), + SYM(UniformMatrix2x4dv), + SYM(UniformMatrix3x2dv), + SYM(UniformMatrix3x4dv), + SYM(UniformMatrix4x2dv), + SYM(UniformMatrix4x3dv), + SYM(GetUniformdv), + SYM(GetSubroutineUniformLocation), + SYM(GetSubroutineIndex), + SYM(GetActiveSubroutineUniformiv), + SYM(GetActiveSubroutineUniformName), + SYM(GetActiveSubroutineName), + SYM(UniformSubroutinesuiv), + SYM(GetUniformSubroutineuiv), + SYM(GetProgramStageiv), + SYM(PatchParameteri), + SYM(PatchParameterfv), + SYM(BindTransformFeedback), + SYM(DeleteTransformFeedbacks), + SYM(GenTransformFeedbacks), + SYM(IsTransformFeedback), + SYM(PauseTransformFeedback), + SYM(ResumeTransformFeedback), + SYM(DrawTransformFeedback), + SYM(DrawTransformFeedbackStream), + SYM(BeginQueryIndexed), + SYM(EndQueryIndexed), + SYM(GetQueryIndexediv), + SYM(ReleaseShaderCompiler), + SYM(ShaderBinary), + SYM(GetShaderPrecisionFormat), + SYM(DepthRangef), + SYM(ClearDepthf), + SYM(GetProgramBinary), + SYM(ProgramBinary), + SYM(ProgramParameteri), + SYM(UseProgramStages), + SYM(ActiveShaderProgram), + SYM(CreateShaderProgramv), + SYM(BindProgramPipeline), + SYM(DeleteProgramPipelines), + SYM(GenProgramPipelines), + SYM(IsProgramPipeline), + SYM(GetProgramPipelineiv), + SYM(ProgramUniform1i), + SYM(ProgramUniform1iv), + SYM(ProgramUniform1f), + SYM(ProgramUniform1fv), + SYM(ProgramUniform1d), + SYM(ProgramUniform1dv), + SYM(ProgramUniform1ui), + SYM(ProgramUniform1uiv), + SYM(ProgramUniform2i), + SYM(ProgramUniform2iv), + SYM(ProgramUniform2f), + SYM(ProgramUniform2fv), + SYM(ProgramUniform2d), + SYM(ProgramUniform2dv), + SYM(ProgramUniform2ui), + SYM(ProgramUniform2uiv), + SYM(ProgramUniform3i), + SYM(ProgramUniform3iv), + SYM(ProgramUniform3f), + SYM(ProgramUniform3fv), + SYM(ProgramUniform3d), + SYM(ProgramUniform3dv), + SYM(ProgramUniform3ui), + SYM(ProgramUniform3uiv), + SYM(ProgramUniform4i), + SYM(ProgramUniform4iv), + SYM(ProgramUniform4f), + SYM(ProgramUniform4fv), + SYM(ProgramUniform4d), + SYM(ProgramUniform4dv), + SYM(ProgramUniform4ui), + SYM(ProgramUniform4uiv), + SYM(ProgramUniformMatrix2fv), + SYM(ProgramUniformMatrix3fv), + SYM(ProgramUniformMatrix4fv), + SYM(ProgramUniformMatrix2dv), + SYM(ProgramUniformMatrix3dv), + SYM(ProgramUniformMatrix4dv), + SYM(ProgramUniformMatrix2x3fv), + SYM(ProgramUniformMatrix3x2fv), + SYM(ProgramUniformMatrix2x4fv), + SYM(ProgramUniformMatrix4x2fv), + SYM(ProgramUniformMatrix3x4fv), + SYM(ProgramUniformMatrix4x3fv), + SYM(ProgramUniformMatrix2x3dv), + SYM(ProgramUniformMatrix3x2dv), + SYM(ProgramUniformMatrix2x4dv), + SYM(ProgramUniformMatrix4x2dv), + SYM(ProgramUniformMatrix3x4dv), + SYM(ProgramUniformMatrix4x3dv), + SYM(ValidateProgramPipeline), + SYM(GetProgramPipelineInfoLog), + SYM(VertexAttribL1d), + SYM(VertexAttribL2d), + SYM(VertexAttribL3d), + SYM(VertexAttribL4d), + SYM(VertexAttribL1dv), + SYM(VertexAttribL2dv), + SYM(VertexAttribL3dv), + SYM(VertexAttribL4dv), + SYM(VertexAttribLPointer), + SYM(GetVertexAttribLdv), + SYM(ViewportArrayv), + SYM(ViewportIndexedf), + SYM(ViewportIndexedfv), + SYM(ScissorArrayv), + SYM(ScissorIndexed), + SYM(ScissorIndexedv), + SYM(DepthRangeArrayv), + SYM(DepthRangeIndexed), + SYM(GetFloati_v), + SYM(GetDoublei_v), + SYM(DrawArraysInstancedBaseInstance), + SYM(DrawElementsInstancedBaseInstance), + SYM(DrawElementsInstancedBaseVertexBaseInstance), + SYM(GetInternalformativ), + SYM(GetActiveAtomicCounterBufferiv), + SYM(BindImageTexture), + SYM(MemoryBarrier), + SYM(TexStorage1D), + SYM(TexStorage2D), + SYM(TexStorage3D), + SYM(DrawTransformFeedbackInstanced), + SYM(DrawTransformFeedbackStreamInstanced), + SYM(ClearBufferData), + SYM(ClearBufferSubData), + SYM(DispatchCompute), + SYM(DispatchComputeIndirect), + SYM(CopyImageSubData), + SYM(FramebufferParameteri), + SYM(GetFramebufferParameteriv), + SYM(GetInternalformati64v), + SYM(InvalidateTexSubImage), + SYM(InvalidateTexImage), + SYM(InvalidateBufferSubData), + SYM(InvalidateBufferData), + SYM(InvalidateFramebuffer), + SYM(InvalidateSubFramebuffer), + SYM(MultiDrawArraysIndirect), + SYM(MultiDrawElementsIndirect), + SYM(GetProgramInterfaceiv), + SYM(GetProgramResourceIndex), + SYM(GetProgramResourceName), + SYM(GetProgramResourceiv), + SYM(GetProgramResourceLocation), + SYM(GetProgramResourceLocationIndex), + SYM(ShaderStorageBlockBinding), + SYM(TexBufferRange), + SYM(TexStorage2DMultisample), + SYM(TexStorage3DMultisample), + SYM(TextureView), + SYM(BindVertexBuffer), + SYM(VertexAttribFormat), + SYM(VertexAttribIFormat), + SYM(VertexAttribLFormat), + SYM(VertexAttribBinding), + SYM(VertexBindingDivisor), + SYM(DebugMessageControl), + SYM(DebugMessageInsert), + SYM(DebugMessageCallback), + SYM(GetDebugMessageLog), + SYM(PushDebugGroup), + SYM(PopDebugGroup), + SYM(ObjectLabel), + SYM(GetObjectLabel), + SYM(ObjectPtrLabel), + SYM(GetObjectPtrLabel), + SYM(BufferStorage), + SYM(ClearTexImage), + SYM(ClearTexSubImage), + SYM(BindBuffersBase), + SYM(BindBuffersRange), + SYM(BindTextures), + SYM(BindSamplers), + SYM(BindImageTextures), + SYM(BindVertexBuffers), + SYM(GetTextureHandleARB), + SYM(GetTextureSamplerHandleARB), + SYM(MakeTextureHandleResidentARB), + SYM(MakeTextureHandleNonResidentARB), + SYM(GetImageHandleARB), + SYM(MakeImageHandleResidentARB), + SYM(MakeImageHandleNonResidentARB), + SYM(UniformHandleui64ARB), + SYM(UniformHandleui64vARB), + SYM(ProgramUniformHandleui64ARB), + SYM(ProgramUniformHandleui64vARB), + SYM(IsTextureHandleResidentARB), + SYM(IsImageHandleResidentARB), + SYM(VertexAttribL1ui64ARB), + SYM(VertexAttribL1ui64vARB), + SYM(GetVertexAttribLui64vARB), + SYM(CreateSyncFromCLeventARB), + SYM(ClampColorARB), + SYM(DispatchComputeGroupSizeARB), + SYM(DebugMessageControlARB), + SYM(DebugMessageInsertARB), + SYM(DebugMessageCallbackARB), + SYM(GetDebugMessageLogARB), + SYM(DrawBuffersARB), + SYM(BlendEquationiARB), + SYM(BlendEquationSeparateiARB), + SYM(BlendFunciARB), + SYM(BlendFuncSeparateiARB), + SYM(DrawArraysInstancedARB), + SYM(DrawElementsInstancedARB), + SYM(ProgramStringARB), + SYM(BindProgramARB), + SYM(DeleteProgramsARB), + SYM(GenProgramsARB), + SYM(ProgramEnvParameter4dARB), + SYM(ProgramEnvParameter4dvARB), + SYM(ProgramEnvParameter4fARB), + SYM(ProgramEnvParameter4fvARB), + SYM(ProgramLocalParameter4dARB), + SYM(ProgramLocalParameter4dvARB), + SYM(ProgramLocalParameter4fARB), + SYM(ProgramLocalParameter4fvARB), + SYM(GetProgramEnvParameterdvARB), + SYM(GetProgramEnvParameterfvARB), + SYM(GetProgramLocalParameterdvARB), + SYM(GetProgramLocalParameterfvARB), + SYM(GetProgramivARB), + SYM(GetProgramStringARB), + SYM(IsProgramARB), + SYM(ProgramParameteriARB), + SYM(FramebufferTextureARB), + SYM(FramebufferTextureLayerARB), + SYM(FramebufferTextureFaceARB), + SYM(ColorTable), + SYM(ColorTableParameterfv), + SYM(ColorTableParameteriv), + SYM(CopyColorTable), + SYM(GetColorTable), + SYM(GetColorTableParameterfv), + SYM(GetColorTableParameteriv), + SYM(ColorSubTable), + SYM(CopyColorSubTable), + SYM(ConvolutionFilter1D), + SYM(ConvolutionFilter2D), + SYM(ConvolutionParameterf), + SYM(ConvolutionParameterfv), + SYM(ConvolutionParameteri), + SYM(ConvolutionParameteriv), + SYM(CopyConvolutionFilter1D), + SYM(CopyConvolutionFilter2D), + SYM(GetConvolutionFilter), + SYM(GetConvolutionParameterfv), + SYM(GetConvolutionParameteriv), + SYM(GetSeparableFilter), + SYM(SeparableFilter2D), + SYM(GetHistogram), + SYM(GetHistogramParameterfv), + SYM(GetHistogramParameteriv), + SYM(GetMinmax), + SYM(GetMinmaxParameterfv), + SYM(GetMinmaxParameteriv), + SYM(Histogram), + SYM(Minmax), + SYM(ResetHistogram), + SYM(ResetMinmax), + SYM(MultiDrawArraysIndirectCountARB), + SYM(MultiDrawElementsIndirectCountARB), + SYM(VertexAttribDivisorARB), + SYM(CurrentPaletteMatrixARB), + SYM(MatrixIndexubvARB), + SYM(MatrixIndexusvARB), + SYM(MatrixIndexuivARB), + SYM(MatrixIndexPointerARB), + SYM(SampleCoverageARB), + SYM(ActiveTextureARB), + SYM(ClientActiveTextureARB), + SYM(MultiTexCoord1dARB), + SYM(MultiTexCoord1dvARB), + SYM(MultiTexCoord1fARB), + SYM(MultiTexCoord1fvARB), + SYM(MultiTexCoord1iARB), + SYM(MultiTexCoord1ivARB), + SYM(MultiTexCoord1sARB), + SYM(MultiTexCoord1svARB), + SYM(MultiTexCoord2dARB), + SYM(MultiTexCoord2dvARB), + SYM(MultiTexCoord2fARB), + SYM(MultiTexCoord2fvARB), + SYM(MultiTexCoord2iARB), + SYM(MultiTexCoord2ivARB), + SYM(MultiTexCoord2sARB), + SYM(MultiTexCoord2svARB), + SYM(MultiTexCoord3dARB), + SYM(MultiTexCoord3dvARB), + SYM(MultiTexCoord3fARB), + SYM(MultiTexCoord3fvARB), + SYM(MultiTexCoord3iARB), + SYM(MultiTexCoord3ivARB), + SYM(MultiTexCoord3sARB), + SYM(MultiTexCoord3svARB), + SYM(MultiTexCoord4dARB), + SYM(MultiTexCoord4dvARB), + SYM(MultiTexCoord4fARB), + SYM(MultiTexCoord4fvARB), + SYM(MultiTexCoord4iARB), + SYM(MultiTexCoord4ivARB), + SYM(MultiTexCoord4sARB), + SYM(MultiTexCoord4svARB), + SYM(GenQueriesARB), + SYM(DeleteQueriesARB), + SYM(IsQueryARB), + SYM(BeginQueryARB), + SYM(EndQueryARB), + SYM(GetQueryivARB), + SYM(GetQueryObjectivARB), + SYM(GetQueryObjectuivARB), + SYM(PointParameterfARB), + SYM(PointParameterfvARB), + SYM(GetGraphicsResetStatusARB), + SYM(GetnTexImageARB), + SYM(ReadnPixelsARB), + SYM(GetnCompressedTexImageARB), + SYM(GetnUniformfvARB), + SYM(GetnUniformivARB), + SYM(GetnUniformuivARB), + SYM(GetnUniformdvARB), + SYM(GetnMapdvARB), + SYM(GetnMapfvARB), + SYM(GetnMapivARB), + SYM(GetnPixelMapfvARB), + SYM(GetnPixelMapuivARB), + SYM(GetnPixelMapusvARB), + SYM(GetnPolygonStippleARB), + SYM(GetnColorTableARB), + SYM(GetnConvolutionFilterARB), + SYM(GetnSeparableFilterARB), + SYM(GetnHistogramARB), + SYM(GetnMinmaxARB), + SYM(MinSampleShadingARB), + SYM(DeleteObjectARB), + SYM(GetHandleARB), + SYM(DetachObjectARB), + SYM(CreateShaderObjectARB), + SYM(ShaderSourceARB), + SYM(CompileShaderARB), + SYM(CreateProgramObjectARB), + SYM(AttachObjectARB), + SYM(LinkProgramARB), + SYM(UseProgramObjectARB), + SYM(ValidateProgramARB), + SYM(Uniform1fARB), + SYM(Uniform2fARB), + SYM(Uniform3fARB), + SYM(Uniform4fARB), + SYM(Uniform1iARB), + SYM(Uniform2iARB), + SYM(Uniform3iARB), + SYM(Uniform4iARB), + SYM(Uniform1fvARB), + SYM(Uniform2fvARB), + SYM(Uniform3fvARB), + SYM(Uniform4fvARB), + SYM(Uniform1ivARB), + SYM(Uniform2ivARB), + SYM(Uniform3ivARB), + SYM(Uniform4ivARB), + SYM(UniformMatrix2fvARB), + SYM(UniformMatrix3fvARB), + SYM(UniformMatrix4fvARB), + SYM(GetObjectParameterfvARB), + SYM(GetObjectParameterivARB), + SYM(GetInfoLogARB), + SYM(GetAttachedObjectsARB), + SYM(GetUniformLocationARB), + SYM(GetActiveUniformARB), + SYM(GetUniformfvARB), + SYM(GetUniformivARB), + SYM(GetShaderSourceARB), + SYM(NamedStringARB), + SYM(DeleteNamedStringARB), + SYM(CompileShaderIncludeARB), + SYM(IsNamedStringARB), + SYM(GetNamedStringARB), + SYM(GetNamedStringivARB), + SYM(TexPageCommitmentARB), + SYM(TexBufferARB), + SYM(CompressedTexImage3DARB), + SYM(CompressedTexImage2DARB), + SYM(CompressedTexImage1DARB), + SYM(CompressedTexSubImage3DARB), + SYM(CompressedTexSubImage2DARB), + SYM(CompressedTexSubImage1DARB), + SYM(GetCompressedTexImageARB), + SYM(LoadTransposeMatrixfARB), + SYM(LoadTransposeMatrixdARB), + SYM(MultTransposeMatrixfARB), + SYM(MultTransposeMatrixdARB), + SYM(WeightbvARB), + SYM(WeightsvARB), + SYM(WeightivARB), + SYM(WeightfvARB), + SYM(WeightdvARB), + SYM(WeightubvARB), + SYM(WeightusvARB), + SYM(WeightuivARB), + SYM(WeightPointerARB), + SYM(VertexBlendARB), + SYM(BindBufferARB), + SYM(DeleteBuffersARB), + SYM(GenBuffersARB), + SYM(IsBufferARB), + SYM(BufferDataARB), + SYM(BufferSubDataARB), + SYM(GetBufferSubDataARB), + SYM(MapBufferARB), + SYM(UnmapBufferARB), + SYM(GetBufferParameterivARB), + SYM(GetBufferPointervARB), + SYM(VertexAttrib1dARB), + SYM(VertexAttrib1dvARB), + SYM(VertexAttrib1fARB), + SYM(VertexAttrib1fvARB), + SYM(VertexAttrib1sARB), + SYM(VertexAttrib1svARB), + SYM(VertexAttrib2dARB), + SYM(VertexAttrib2dvARB), + SYM(VertexAttrib2fARB), + SYM(VertexAttrib2fvARB), + SYM(VertexAttrib2sARB), + SYM(VertexAttrib2svARB), + SYM(VertexAttrib3dARB), + SYM(VertexAttrib3dvARB), + SYM(VertexAttrib3fARB), + SYM(VertexAttrib3fvARB), + SYM(VertexAttrib3sARB), + SYM(VertexAttrib3svARB), + SYM(VertexAttrib4NbvARB), + SYM(VertexAttrib4NivARB), + SYM(VertexAttrib4NsvARB), + SYM(VertexAttrib4NubARB), + SYM(VertexAttrib4NubvARB), + SYM(VertexAttrib4NuivARB), + SYM(VertexAttrib4NusvARB), + SYM(VertexAttrib4bvARB), + SYM(VertexAttrib4dARB), + SYM(VertexAttrib4dvARB), + SYM(VertexAttrib4fARB), + SYM(VertexAttrib4fvARB), + SYM(VertexAttrib4ivARB), + SYM(VertexAttrib4sARB), + SYM(VertexAttrib4svARB), + SYM(VertexAttrib4ubvARB), + SYM(VertexAttrib4uivARB), + SYM(VertexAttrib4usvARB), + SYM(VertexAttribPointerARB), + SYM(EnableVertexAttribArrayARB), + SYM(DisableVertexAttribArrayARB), + SYM(GetVertexAttribdvARB), + SYM(GetVertexAttribfvARB), + SYM(GetVertexAttribivARB), + SYM(GetVertexAttribPointervARB), + SYM(BindAttribLocationARB), + SYM(GetActiveAttribARB), + SYM(GetAttribLocationARB), + SYM(WindowPos2dARB), + SYM(WindowPos2dvARB), + SYM(WindowPos2fARB), + SYM(WindowPos2fvARB), + SYM(WindowPos2iARB), + SYM(WindowPos2ivARB), + SYM(WindowPos2sARB), + SYM(WindowPos2svARB), + SYM(WindowPos3dARB), + SYM(WindowPos3dvARB), + SYM(WindowPos3fARB), + SYM(WindowPos3fvARB), + SYM(WindowPos3iARB), + SYM(WindowPos3ivARB), + SYM(WindowPos3sARB), + SYM(WindowPos3svARB), + SYM(MultiTexCoord1bOES), + SYM(MultiTexCoord1bvOES), + SYM(MultiTexCoord2bOES), + SYM(MultiTexCoord2bvOES), + SYM(MultiTexCoord3bOES), + SYM(MultiTexCoord3bvOES), + SYM(MultiTexCoord4bOES), + SYM(MultiTexCoord4bvOES), + SYM(TexCoord1bOES), + SYM(TexCoord1bvOES), + SYM(TexCoord2bOES), + SYM(TexCoord2bvOES), + SYM(TexCoord3bOES), + SYM(TexCoord3bvOES), + SYM(TexCoord4bOES), + SYM(TexCoord4bvOES), + SYM(Vertex2bOES), + SYM(Vertex2bvOES), + SYM(Vertex3bOES), + SYM(Vertex3bvOES), + SYM(Vertex4bOES), + SYM(Vertex4bvOES), + SYM(AlphaFuncxOES), + SYM(ClearColorxOES), + SYM(ClearDepthxOES), + SYM(ClipPlanexOES), + SYM(Color4xOES), + SYM(DepthRangexOES), + SYM(FogxOES), + SYM(FogxvOES), + SYM(FrustumxOES), + SYM(GetClipPlanexOES), + SYM(GetFixedvOES), + SYM(GetTexEnvxvOES), + SYM(GetTexParameterxvOES), + SYM(LightModelxOES), + SYM(LightModelxvOES), + SYM(LightxOES), + SYM(LightxvOES), + SYM(LineWidthxOES), + SYM(LoadMatrixxOES), + SYM(MaterialxOES), + SYM(MaterialxvOES), + SYM(MultMatrixxOES), + SYM(MultiTexCoord4xOES), + SYM(Normal3xOES), + SYM(OrthoxOES), + SYM(PointParameterxvOES), + SYM(PointSizexOES), + SYM(PolygonOffsetxOES), + SYM(RotatexOES), + SYM(SampleCoverageOES), + SYM(ScalexOES), + SYM(TexEnvxOES), + SYM(TexEnvxvOES), + SYM(TexParameterxOES), + SYM(TexParameterxvOES), + SYM(TranslatexOES), + SYM(AccumxOES), + SYM(BitmapxOES), + SYM(BlendColorxOES), + SYM(ClearAccumxOES), + SYM(Color3xOES), + SYM(Color3xvOES), + SYM(Color4xvOES), + SYM(ConvolutionParameterxOES), + SYM(ConvolutionParameterxvOES), + SYM(EvalCoord1xOES), + SYM(EvalCoord1xvOES), + SYM(EvalCoord2xOES), + SYM(EvalCoord2xvOES), + SYM(FeedbackBufferxOES), + SYM(GetConvolutionParameterxvOES), + SYM(GetHistogramParameterxvOES), + SYM(GetLightxOES), + SYM(GetMapxvOES), + SYM(GetMaterialxOES), + SYM(GetPixelMapxv), + SYM(GetTexGenxvOES), + SYM(GetTexLevelParameterxvOES), + SYM(IndexxOES), + SYM(IndexxvOES), + SYM(LoadTransposeMatrixxOES), + SYM(Map1xOES), + SYM(Map2xOES), + SYM(MapGrid1xOES), + SYM(MapGrid2xOES), + SYM(MultTransposeMatrixxOES), + SYM(MultiTexCoord1xOES), + SYM(MultiTexCoord1xvOES), + SYM(MultiTexCoord2xOES), + SYM(MultiTexCoord2xvOES), + SYM(MultiTexCoord3xOES), + SYM(MultiTexCoord3xvOES), + SYM(MultiTexCoord4xvOES), + SYM(Normal3xvOES), + SYM(PassThroughxOES), + SYM(PixelMapx), + SYM(PixelStorex), + SYM(PixelTransferxOES), + SYM(PixelZoomxOES), + SYM(PrioritizeTexturesxOES), + SYM(RasterPos2xOES), + SYM(RasterPos2xvOES), + SYM(RasterPos3xOES), + SYM(RasterPos3xvOES), + SYM(RasterPos4xOES), + SYM(RasterPos4xvOES), + SYM(RectxOES), + SYM(RectxvOES), + SYM(TexCoord1xOES), + SYM(TexCoord1xvOES), + SYM(TexCoord2xOES), + SYM(TexCoord2xvOES), + SYM(TexCoord3xOES), + SYM(TexCoord3xvOES), + SYM(TexCoord4xOES), + SYM(TexCoord4xvOES), + SYM(TexGenxOES), + SYM(TexGenxvOES), + SYM(Vertex2xOES), + SYM(Vertex2xvOES), + SYM(Vertex3xOES), + SYM(Vertex3xvOES), + SYM(Vertex4xOES), + SYM(Vertex4xvOES), + SYM(QueryMatrixxOES), + SYM(ClearDepthfOES), + SYM(ClipPlanefOES), + SYM(DepthRangefOES), + SYM(FrustumfOES), + SYM(GetClipPlanefOES), + SYM(OrthofOES), + SYM(ImageTransformParameteriHP), + SYM(ImageTransformParameterfHP), + SYM(ImageTransformParameterivHP), + SYM(ImageTransformParameterfvHP), + SYM(GetImageTransformParameterivHP), + SYM(GetImageTransformParameterfvHP), + + { NULL, NULL }, +}; +RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; +RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; +RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; +RGLSYMGLCOPYTEXSUBIMAGE3DPROC __rglgen_glCopyTexSubImage3D; +RGLSYMGLACTIVETEXTUREPROC __rglgen_glActiveTexture; +RGLSYMGLSAMPLECOVERAGEPROC __rglgen_glSampleCoverage; +RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC __rglgen_glCompressedTexImage3D; +RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC __rglgen_glCompressedTexImage2D; +RGLSYMGLCOMPRESSEDTEXIMAGE1DPROC __rglgen_glCompressedTexImage1D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC __rglgen_glCompressedTexSubImage1D; +RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC __rglgen_glGetCompressedTexImage; +RGLSYMGLCLIENTACTIVETEXTUREPROC __rglgen_glClientActiveTexture; +RGLSYMGLMULTITEXCOORD1DPROC __rglgen_glMultiTexCoord1d; +RGLSYMGLMULTITEXCOORD1DVPROC __rglgen_glMultiTexCoord1dv; +RGLSYMGLMULTITEXCOORD1FPROC __rglgen_glMultiTexCoord1f; +RGLSYMGLMULTITEXCOORD1FVPROC __rglgen_glMultiTexCoord1fv; +RGLSYMGLMULTITEXCOORD1IPROC __rglgen_glMultiTexCoord1i; +RGLSYMGLMULTITEXCOORD1IVPROC __rglgen_glMultiTexCoord1iv; +RGLSYMGLMULTITEXCOORD1SPROC __rglgen_glMultiTexCoord1s; +RGLSYMGLMULTITEXCOORD1SVPROC __rglgen_glMultiTexCoord1sv; +RGLSYMGLMULTITEXCOORD2DPROC __rglgen_glMultiTexCoord2d; +RGLSYMGLMULTITEXCOORD2DVPROC __rglgen_glMultiTexCoord2dv; +RGLSYMGLMULTITEXCOORD2FPROC __rglgen_glMultiTexCoord2f; +RGLSYMGLMULTITEXCOORD2FVPROC __rglgen_glMultiTexCoord2fv; +RGLSYMGLMULTITEXCOORD2IPROC __rglgen_glMultiTexCoord2i; +RGLSYMGLMULTITEXCOORD2IVPROC __rglgen_glMultiTexCoord2iv; +RGLSYMGLMULTITEXCOORD2SPROC __rglgen_glMultiTexCoord2s; +RGLSYMGLMULTITEXCOORD2SVPROC __rglgen_glMultiTexCoord2sv; +RGLSYMGLMULTITEXCOORD3DPROC __rglgen_glMultiTexCoord3d; +RGLSYMGLMULTITEXCOORD3DVPROC __rglgen_glMultiTexCoord3dv; +RGLSYMGLMULTITEXCOORD3FPROC __rglgen_glMultiTexCoord3f; +RGLSYMGLMULTITEXCOORD3FVPROC __rglgen_glMultiTexCoord3fv; +RGLSYMGLMULTITEXCOORD3IPROC __rglgen_glMultiTexCoord3i; +RGLSYMGLMULTITEXCOORD3IVPROC __rglgen_glMultiTexCoord3iv; +RGLSYMGLMULTITEXCOORD3SPROC __rglgen_glMultiTexCoord3s; +RGLSYMGLMULTITEXCOORD3SVPROC __rglgen_glMultiTexCoord3sv; +RGLSYMGLMULTITEXCOORD4DPROC __rglgen_glMultiTexCoord4d; +RGLSYMGLMULTITEXCOORD4DVPROC __rglgen_glMultiTexCoord4dv; +RGLSYMGLMULTITEXCOORD4FPROC __rglgen_glMultiTexCoord4f; +RGLSYMGLMULTITEXCOORD4FVPROC __rglgen_glMultiTexCoord4fv; +RGLSYMGLMULTITEXCOORD4IPROC __rglgen_glMultiTexCoord4i; +RGLSYMGLMULTITEXCOORD4IVPROC __rglgen_glMultiTexCoord4iv; +RGLSYMGLMULTITEXCOORD4SPROC __rglgen_glMultiTexCoord4s; +RGLSYMGLMULTITEXCOORD4SVPROC __rglgen_glMultiTexCoord4sv; +RGLSYMGLLOADTRANSPOSEMATRIXFPROC __rglgen_glLoadTransposeMatrixf; +RGLSYMGLLOADTRANSPOSEMATRIXDPROC __rglgen_glLoadTransposeMatrixd; +RGLSYMGLMULTTRANSPOSEMATRIXFPROC __rglgen_glMultTransposeMatrixf; +RGLSYMGLMULTTRANSPOSEMATRIXDPROC __rglgen_glMultTransposeMatrixd; +RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; +RGLSYMGLMULTIDRAWARRAYSPROC __rglgen_glMultiDrawArrays; +RGLSYMGLMULTIDRAWELEMENTSPROC __rglgen_glMultiDrawElements; +RGLSYMGLPOINTPARAMETERFPROC __rglgen_glPointParameterf; +RGLSYMGLPOINTPARAMETERFVPROC __rglgen_glPointParameterfv; +RGLSYMGLPOINTPARAMETERIPROC __rglgen_glPointParameteri; +RGLSYMGLPOINTPARAMETERIVPROC __rglgen_glPointParameteriv; +RGLSYMGLFOGCOORDFPROC __rglgen_glFogCoordf; +RGLSYMGLFOGCOORDFVPROC __rglgen_glFogCoordfv; +RGLSYMGLFOGCOORDDPROC __rglgen_glFogCoordd; +RGLSYMGLFOGCOORDDVPROC __rglgen_glFogCoorddv; +RGLSYMGLFOGCOORDPOINTERPROC __rglgen_glFogCoordPointer; +RGLSYMGLSECONDARYCOLOR3BPROC __rglgen_glSecondaryColor3b; +RGLSYMGLSECONDARYCOLOR3BVPROC __rglgen_glSecondaryColor3bv; +RGLSYMGLSECONDARYCOLOR3DPROC __rglgen_glSecondaryColor3d; +RGLSYMGLSECONDARYCOLOR3DVPROC __rglgen_glSecondaryColor3dv; +RGLSYMGLSECONDARYCOLOR3FPROC __rglgen_glSecondaryColor3f; +RGLSYMGLSECONDARYCOLOR3FVPROC __rglgen_glSecondaryColor3fv; +RGLSYMGLSECONDARYCOLOR3IPROC __rglgen_glSecondaryColor3i; +RGLSYMGLSECONDARYCOLOR3IVPROC __rglgen_glSecondaryColor3iv; +RGLSYMGLSECONDARYCOLOR3SPROC __rglgen_glSecondaryColor3s; +RGLSYMGLSECONDARYCOLOR3SVPROC __rglgen_glSecondaryColor3sv; +RGLSYMGLSECONDARYCOLOR3UBPROC __rglgen_glSecondaryColor3ub; +RGLSYMGLSECONDARYCOLOR3UBVPROC __rglgen_glSecondaryColor3ubv; +RGLSYMGLSECONDARYCOLOR3UIPROC __rglgen_glSecondaryColor3ui; +RGLSYMGLSECONDARYCOLOR3UIVPROC __rglgen_glSecondaryColor3uiv; +RGLSYMGLSECONDARYCOLOR3USPROC __rglgen_glSecondaryColor3us; +RGLSYMGLSECONDARYCOLOR3USVPROC __rglgen_glSecondaryColor3usv; +RGLSYMGLSECONDARYCOLORPOINTERPROC __rglgen_glSecondaryColorPointer; +RGLSYMGLWINDOWPOS2DPROC __rglgen_glWindowPos2d; +RGLSYMGLWINDOWPOS2DVPROC __rglgen_glWindowPos2dv; +RGLSYMGLWINDOWPOS2FPROC __rglgen_glWindowPos2f; +RGLSYMGLWINDOWPOS2FVPROC __rglgen_glWindowPos2fv; +RGLSYMGLWINDOWPOS2IPROC __rglgen_glWindowPos2i; +RGLSYMGLWINDOWPOS2IVPROC __rglgen_glWindowPos2iv; +RGLSYMGLWINDOWPOS2SPROC __rglgen_glWindowPos2s; +RGLSYMGLWINDOWPOS2SVPROC __rglgen_glWindowPos2sv; +RGLSYMGLWINDOWPOS3DPROC __rglgen_glWindowPos3d; +RGLSYMGLWINDOWPOS3DVPROC __rglgen_glWindowPos3dv; +RGLSYMGLWINDOWPOS3FPROC __rglgen_glWindowPos3f; +RGLSYMGLWINDOWPOS3FVPROC __rglgen_glWindowPos3fv; +RGLSYMGLWINDOWPOS3IPROC __rglgen_glWindowPos3i; +RGLSYMGLWINDOWPOS3IVPROC __rglgen_glWindowPos3iv; +RGLSYMGLWINDOWPOS3SPROC __rglgen_glWindowPos3s; +RGLSYMGLWINDOWPOS3SVPROC __rglgen_glWindowPos3sv; +RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; +RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; +RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; +RGLSYMGLDELETEQUERIESPROC __rglgen_glDeleteQueries; +RGLSYMGLISQUERYPROC __rglgen_glIsQuery; +RGLSYMGLBEGINQUERYPROC __rglgen_glBeginQuery; +RGLSYMGLENDQUERYPROC __rglgen_glEndQuery; +RGLSYMGLGETQUERYIVPROC __rglgen_glGetQueryiv; +RGLSYMGLGETQUERYOBJECTIVPROC __rglgen_glGetQueryObjectiv; +RGLSYMGLGETQUERYOBJECTUIVPROC __rglgen_glGetQueryObjectuiv; +RGLSYMGLBINDBUFFERPROC __rglgen_glBindBuffer; +RGLSYMGLDELETEBUFFERSPROC __rglgen_glDeleteBuffers; +RGLSYMGLGENBUFFERSPROC __rglgen_glGenBuffers; +RGLSYMGLISBUFFERPROC __rglgen_glIsBuffer; +RGLSYMGLBUFFERDATAPROC __rglgen_glBufferData; +RGLSYMGLBUFFERSUBDATAPROC __rglgen_glBufferSubData; +RGLSYMGLGETBUFFERSUBDATAPROC __rglgen_glGetBufferSubData; +RGLSYMGLMAPBUFFERPROC __rglgen_glMapBuffer; +RGLSYMGLUNMAPBUFFERPROC __rglgen_glUnmapBuffer; +RGLSYMGLGETBUFFERPARAMETERIVPROC __rglgen_glGetBufferParameteriv; +RGLSYMGLGETBUFFERPOINTERVPROC __rglgen_glGetBufferPointerv; +RGLSYMGLBLENDEQUATIONSEPARATEPROC __rglgen_glBlendEquationSeparate; +RGLSYMGLDRAWBUFFERSPROC __rglgen_glDrawBuffers; +RGLSYMGLSTENCILOPSEPARATEPROC __rglgen_glStencilOpSeparate; +RGLSYMGLSTENCILFUNCSEPARATEPROC __rglgen_glStencilFuncSeparate; +RGLSYMGLSTENCILMASKSEPARATEPROC __rglgen_glStencilMaskSeparate; +RGLSYMGLATTACHSHADERPROC __rglgen_glAttachShader; +RGLSYMGLBINDATTRIBLOCATIONPROC __rglgen_glBindAttribLocation; +RGLSYMGLCOMPILESHADERPROC __rglgen_glCompileShader; +RGLSYMGLCREATEPROGRAMPROC __rglgen_glCreateProgram; +RGLSYMGLCREATESHADERPROC __rglgen_glCreateShader; +RGLSYMGLDELETEPROGRAMPROC __rglgen_glDeleteProgram; +RGLSYMGLDELETESHADERPROC __rglgen_glDeleteShader; +RGLSYMGLDETACHSHADERPROC __rglgen_glDetachShader; +RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC __rglgen_glDisableVertexAttribArray; +RGLSYMGLENABLEVERTEXATTRIBARRAYPROC __rglgen_glEnableVertexAttribArray; +RGLSYMGLGETACTIVEATTRIBPROC __rglgen_glGetActiveAttrib; +RGLSYMGLGETACTIVEUNIFORMPROC __rglgen_glGetActiveUniform; +RGLSYMGLGETATTACHEDSHADERSPROC __rglgen_glGetAttachedShaders; +RGLSYMGLGETATTRIBLOCATIONPROC __rglgen_glGetAttribLocation; +RGLSYMGLGETPROGRAMIVPROC __rglgen_glGetProgramiv; +RGLSYMGLGETPROGRAMINFOLOGPROC __rglgen_glGetProgramInfoLog; +RGLSYMGLGETSHADERIVPROC __rglgen_glGetShaderiv; +RGLSYMGLGETSHADERINFOLOGPROC __rglgen_glGetShaderInfoLog; +RGLSYMGLGETSHADERSOURCEPROC __rglgen_glGetShaderSource; +RGLSYMGLGETUNIFORMLOCATIONPROC __rglgen_glGetUniformLocation; +RGLSYMGLGETUNIFORMFVPROC __rglgen_glGetUniformfv; +RGLSYMGLGETUNIFORMIVPROC __rglgen_glGetUniformiv; +RGLSYMGLGETVERTEXATTRIBDVPROC __rglgen_glGetVertexAttribdv; +RGLSYMGLGETVERTEXATTRIBFVPROC __rglgen_glGetVertexAttribfv; +RGLSYMGLGETVERTEXATTRIBIVPROC __rglgen_glGetVertexAttribiv; +RGLSYMGLGETVERTEXATTRIBPOINTERVPROC __rglgen_glGetVertexAttribPointerv; +RGLSYMGLISPROGRAMPROC __rglgen_glIsProgram; +RGLSYMGLISSHADERPROC __rglgen_glIsShader; +RGLSYMGLLINKPROGRAMPROC __rglgen_glLinkProgram; +RGLSYMGLSHADERSOURCEPROC __rglgen_glShaderSource; +RGLSYMGLUSEPROGRAMPROC __rglgen_glUseProgram; +RGLSYMGLUNIFORM1FPROC __rglgen_glUniform1f; +RGLSYMGLUNIFORM2FPROC __rglgen_glUniform2f; +RGLSYMGLUNIFORM3FPROC __rglgen_glUniform3f; +RGLSYMGLUNIFORM4FPROC __rglgen_glUniform4f; +RGLSYMGLUNIFORM1IPROC __rglgen_glUniform1i; +RGLSYMGLUNIFORM2IPROC __rglgen_glUniform2i; +RGLSYMGLUNIFORM3IPROC __rglgen_glUniform3i; +RGLSYMGLUNIFORM4IPROC __rglgen_glUniform4i; +RGLSYMGLUNIFORM1FVPROC __rglgen_glUniform1fv; +RGLSYMGLUNIFORM2FVPROC __rglgen_glUniform2fv; +RGLSYMGLUNIFORM3FVPROC __rglgen_glUniform3fv; +RGLSYMGLUNIFORM4FVPROC __rglgen_glUniform4fv; +RGLSYMGLUNIFORM1IVPROC __rglgen_glUniform1iv; +RGLSYMGLUNIFORM2IVPROC __rglgen_glUniform2iv; +RGLSYMGLUNIFORM3IVPROC __rglgen_glUniform3iv; +RGLSYMGLUNIFORM4IVPROC __rglgen_glUniform4iv; +RGLSYMGLUNIFORMMATRIX2FVPROC __rglgen_glUniformMatrix2fv; +RGLSYMGLUNIFORMMATRIX3FVPROC __rglgen_glUniformMatrix3fv; +RGLSYMGLUNIFORMMATRIX4FVPROC __rglgen_glUniformMatrix4fv; +RGLSYMGLVALIDATEPROGRAMPROC __rglgen_glValidateProgram; +RGLSYMGLVERTEXATTRIB1DPROC __rglgen_glVertexAttrib1d; +RGLSYMGLVERTEXATTRIB1DVPROC __rglgen_glVertexAttrib1dv; +RGLSYMGLVERTEXATTRIB1FPROC __rglgen_glVertexAttrib1f; +RGLSYMGLVERTEXATTRIB1FVPROC __rglgen_glVertexAttrib1fv; +RGLSYMGLVERTEXATTRIB1SPROC __rglgen_glVertexAttrib1s; +RGLSYMGLVERTEXATTRIB1SVPROC __rglgen_glVertexAttrib1sv; +RGLSYMGLVERTEXATTRIB2DPROC __rglgen_glVertexAttrib2d; +RGLSYMGLVERTEXATTRIB2DVPROC __rglgen_glVertexAttrib2dv; +RGLSYMGLVERTEXATTRIB2FPROC __rglgen_glVertexAttrib2f; +RGLSYMGLVERTEXATTRIB2FVPROC __rglgen_glVertexAttrib2fv; +RGLSYMGLVERTEXATTRIB2SPROC __rglgen_glVertexAttrib2s; +RGLSYMGLVERTEXATTRIB2SVPROC __rglgen_glVertexAttrib2sv; +RGLSYMGLVERTEXATTRIB3DPROC __rglgen_glVertexAttrib3d; +RGLSYMGLVERTEXATTRIB3DVPROC __rglgen_glVertexAttrib3dv; +RGLSYMGLVERTEXATTRIB3FPROC __rglgen_glVertexAttrib3f; +RGLSYMGLVERTEXATTRIB3FVPROC __rglgen_glVertexAttrib3fv; +RGLSYMGLVERTEXATTRIB3SPROC __rglgen_glVertexAttrib3s; +RGLSYMGLVERTEXATTRIB3SVPROC __rglgen_glVertexAttrib3sv; +RGLSYMGLVERTEXATTRIB4NBVPROC __rglgen_glVertexAttrib4Nbv; +RGLSYMGLVERTEXATTRIB4NIVPROC __rglgen_glVertexAttrib4Niv; +RGLSYMGLVERTEXATTRIB4NSVPROC __rglgen_glVertexAttrib4Nsv; +RGLSYMGLVERTEXATTRIB4NUBPROC __rglgen_glVertexAttrib4Nub; +RGLSYMGLVERTEXATTRIB4NUBVPROC __rglgen_glVertexAttrib4Nubv; +RGLSYMGLVERTEXATTRIB4NUIVPROC __rglgen_glVertexAttrib4Nuiv; +RGLSYMGLVERTEXATTRIB4NUSVPROC __rglgen_glVertexAttrib4Nusv; +RGLSYMGLVERTEXATTRIB4BVPROC __rglgen_glVertexAttrib4bv; +RGLSYMGLVERTEXATTRIB4DPROC __rglgen_glVertexAttrib4d; +RGLSYMGLVERTEXATTRIB4DVPROC __rglgen_glVertexAttrib4dv; +RGLSYMGLVERTEXATTRIB4FPROC __rglgen_glVertexAttrib4f; +RGLSYMGLVERTEXATTRIB4FVPROC __rglgen_glVertexAttrib4fv; +RGLSYMGLVERTEXATTRIB4IVPROC __rglgen_glVertexAttrib4iv; +RGLSYMGLVERTEXATTRIB4SPROC __rglgen_glVertexAttrib4s; +RGLSYMGLVERTEXATTRIB4SVPROC __rglgen_glVertexAttrib4sv; +RGLSYMGLVERTEXATTRIB4UBVPROC __rglgen_glVertexAttrib4ubv; +RGLSYMGLVERTEXATTRIB4UIVPROC __rglgen_glVertexAttrib4uiv; +RGLSYMGLVERTEXATTRIB4USVPROC __rglgen_glVertexAttrib4usv; +RGLSYMGLVERTEXATTRIBPOINTERPROC __rglgen_glVertexAttribPointer; +RGLSYMGLUNIFORMMATRIX2X3FVPROC __rglgen_glUniformMatrix2x3fv; +RGLSYMGLUNIFORMMATRIX3X2FVPROC __rglgen_glUniformMatrix3x2fv; +RGLSYMGLUNIFORMMATRIX2X4FVPROC __rglgen_glUniformMatrix2x4fv; +RGLSYMGLUNIFORMMATRIX4X2FVPROC __rglgen_glUniformMatrix4x2fv; +RGLSYMGLUNIFORMMATRIX3X4FVPROC __rglgen_glUniformMatrix3x4fv; +RGLSYMGLUNIFORMMATRIX4X3FVPROC __rglgen_glUniformMatrix4x3fv; +RGLSYMGLCOLORMASKIPROC __rglgen_glColorMaski; +RGLSYMGLGETBOOLEANI_VPROC __rglgen_glGetBooleani_v; +RGLSYMGLGETINTEGERI_VPROC __rglgen_glGetIntegeri_v; +RGLSYMGLENABLEIPROC __rglgen_glEnablei; +RGLSYMGLDISABLEIPROC __rglgen_glDisablei; +RGLSYMGLISENABLEDIPROC __rglgen_glIsEnabledi; +RGLSYMGLBEGINTRANSFORMFEEDBACKPROC __rglgen_glBeginTransformFeedback; +RGLSYMGLENDTRANSFORMFEEDBACKPROC __rglgen_glEndTransformFeedback; +RGLSYMGLBINDBUFFERRANGEPROC __rglgen_glBindBufferRange; +RGLSYMGLBINDBUFFERBASEPROC __rglgen_glBindBufferBase; +RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC __rglgen_glTransformFeedbackVaryings; +RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC __rglgen_glGetTransformFeedbackVarying; +RGLSYMGLCLAMPCOLORPROC __rglgen_glClampColor; +RGLSYMGLBEGINCONDITIONALRENDERPROC __rglgen_glBeginConditionalRender; +RGLSYMGLENDCONDITIONALRENDERPROC __rglgen_glEndConditionalRender; +RGLSYMGLVERTEXATTRIBIPOINTERPROC __rglgen_glVertexAttribIPointer; +RGLSYMGLGETVERTEXATTRIBIIVPROC __rglgen_glGetVertexAttribIiv; +RGLSYMGLGETVERTEXATTRIBIUIVPROC __rglgen_glGetVertexAttribIuiv; +RGLSYMGLVERTEXATTRIBI1IPROC __rglgen_glVertexAttribI1i; +RGLSYMGLVERTEXATTRIBI2IPROC __rglgen_glVertexAttribI2i; +RGLSYMGLVERTEXATTRIBI3IPROC __rglgen_glVertexAttribI3i; +RGLSYMGLVERTEXATTRIBI4IPROC __rglgen_glVertexAttribI4i; +RGLSYMGLVERTEXATTRIBI1UIPROC __rglgen_glVertexAttribI1ui; +RGLSYMGLVERTEXATTRIBI2UIPROC __rglgen_glVertexAttribI2ui; +RGLSYMGLVERTEXATTRIBI3UIPROC __rglgen_glVertexAttribI3ui; +RGLSYMGLVERTEXATTRIBI4UIPROC __rglgen_glVertexAttribI4ui; +RGLSYMGLVERTEXATTRIBI1IVPROC __rglgen_glVertexAttribI1iv; +RGLSYMGLVERTEXATTRIBI2IVPROC __rglgen_glVertexAttribI2iv; +RGLSYMGLVERTEXATTRIBI3IVPROC __rglgen_glVertexAttribI3iv; +RGLSYMGLVERTEXATTRIBI4IVPROC __rglgen_glVertexAttribI4iv; +RGLSYMGLVERTEXATTRIBI1UIVPROC __rglgen_glVertexAttribI1uiv; +RGLSYMGLVERTEXATTRIBI2UIVPROC __rglgen_glVertexAttribI2uiv; +RGLSYMGLVERTEXATTRIBI3UIVPROC __rglgen_glVertexAttribI3uiv; +RGLSYMGLVERTEXATTRIBI4UIVPROC __rglgen_glVertexAttribI4uiv; +RGLSYMGLVERTEXATTRIBI4BVPROC __rglgen_glVertexAttribI4bv; +RGLSYMGLVERTEXATTRIBI4SVPROC __rglgen_glVertexAttribI4sv; +RGLSYMGLVERTEXATTRIBI4UBVPROC __rglgen_glVertexAttribI4ubv; +RGLSYMGLVERTEXATTRIBI4USVPROC __rglgen_glVertexAttribI4usv; +RGLSYMGLGETUNIFORMUIVPROC __rglgen_glGetUniformuiv; +RGLSYMGLBINDFRAGDATALOCATIONPROC __rglgen_glBindFragDataLocation; +RGLSYMGLGETFRAGDATALOCATIONPROC __rglgen_glGetFragDataLocation; +RGLSYMGLUNIFORM1UIPROC __rglgen_glUniform1ui; +RGLSYMGLUNIFORM2UIPROC __rglgen_glUniform2ui; +RGLSYMGLUNIFORM3UIPROC __rglgen_glUniform3ui; +RGLSYMGLUNIFORM4UIPROC __rglgen_glUniform4ui; +RGLSYMGLUNIFORM1UIVPROC __rglgen_glUniform1uiv; +RGLSYMGLUNIFORM2UIVPROC __rglgen_glUniform2uiv; +RGLSYMGLUNIFORM3UIVPROC __rglgen_glUniform3uiv; +RGLSYMGLUNIFORM4UIVPROC __rglgen_glUniform4uiv; +RGLSYMGLTEXPARAMETERIIVPROC __rglgen_glTexParameterIiv; +RGLSYMGLTEXPARAMETERIUIVPROC __rglgen_glTexParameterIuiv; +RGLSYMGLGETTEXPARAMETERIIVPROC __rglgen_glGetTexParameterIiv; +RGLSYMGLGETTEXPARAMETERIUIVPROC __rglgen_glGetTexParameterIuiv; +RGLSYMGLCLEARBUFFERIVPROC __rglgen_glClearBufferiv; +RGLSYMGLCLEARBUFFERUIVPROC __rglgen_glClearBufferuiv; +RGLSYMGLCLEARBUFFERFVPROC __rglgen_glClearBufferfv; +RGLSYMGLCLEARBUFFERFIPROC __rglgen_glClearBufferfi; +RGLSYMGLGETSTRINGIPROC __rglgen_glGetStringi; +RGLSYMGLISRENDERBUFFERPROC __rglgen_glIsRenderbuffer; +RGLSYMGLBINDRENDERBUFFERPROC __rglgen_glBindRenderbuffer; +RGLSYMGLDELETERENDERBUFFERSPROC __rglgen_glDeleteRenderbuffers; +RGLSYMGLGENRENDERBUFFERSPROC __rglgen_glGenRenderbuffers; +RGLSYMGLRENDERBUFFERSTORAGEPROC __rglgen_glRenderbufferStorage; +RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; +RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; +RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; +RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; +RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; +RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; +RGLSYMGLFRAMEBUFFERTEXTURE1DPROC __rglgen_glFramebufferTexture1D; +RGLSYMGLFRAMEBUFFERTEXTURE2DPROC __rglgen_glFramebufferTexture2D; +RGLSYMGLFRAMEBUFFERTEXTURE3DPROC __rglgen_glFramebufferTexture3D; +RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC __rglgen_glFramebufferRenderbuffer; +RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetFramebufferAttachmentParameteriv; +RGLSYMGLGENERATEMIPMAPPROC __rglgen_glGenerateMipmap; +RGLSYMGLBLITFRAMEBUFFERPROC __rglgen_glBlitFramebuffer; +RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glRenderbufferStorageMultisample; +RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC __rglgen_glFramebufferTextureLayer; +RGLSYMGLMAPBUFFERRANGEPROC __rglgen_glMapBufferRange; +RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC __rglgen_glFlushMappedBufferRange; +RGLSYMGLBINDVERTEXARRAYPROC __rglgen_glBindVertexArray; +RGLSYMGLDELETEVERTEXARRAYSPROC __rglgen_glDeleteVertexArrays; +RGLSYMGLGENVERTEXARRAYSPROC __rglgen_glGenVertexArrays; +RGLSYMGLISVERTEXARRAYPROC __rglgen_glIsVertexArray; +RGLSYMGLDRAWARRAYSINSTANCEDPROC __rglgen_glDrawArraysInstanced; +RGLSYMGLDRAWELEMENTSINSTANCEDPROC __rglgen_glDrawElementsInstanced; +RGLSYMGLTEXBUFFERPROC __rglgen_glTexBuffer; +RGLSYMGLPRIMITIVERESTARTINDEXPROC __rglgen_glPrimitiveRestartIndex; +RGLSYMGLCOPYBUFFERSUBDATAPROC __rglgen_glCopyBufferSubData; +RGLSYMGLGETUNIFORMINDICESPROC __rglgen_glGetUniformIndices; +RGLSYMGLGETACTIVEUNIFORMSIVPROC __rglgen_glGetActiveUniformsiv; +RGLSYMGLGETACTIVEUNIFORMNAMEPROC __rglgen_glGetActiveUniformName; +RGLSYMGLGETUNIFORMBLOCKINDEXPROC __rglgen_glGetUniformBlockIndex; +RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC __rglgen_glGetActiveUniformBlockiv; +RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC __rglgen_glGetActiveUniformBlockName; +RGLSYMGLUNIFORMBLOCKBINDINGPROC __rglgen_glUniformBlockBinding; +RGLSYMGLDRAWELEMENTSBASEVERTEXPROC __rglgen_glDrawElementsBaseVertex; +RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC __rglgen_glDrawRangeElementsBaseVertex; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __rglgen_glDrawElementsInstancedBaseVertex; +RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXPROC __rglgen_glMultiDrawElementsBaseVertex; +RGLSYMGLPROVOKINGVERTEXPROC __rglgen_glProvokingVertex; +RGLSYMGLFENCESYNCPROC __rglgen_glFenceSync; +RGLSYMGLISSYNCPROC __rglgen_glIsSync; +RGLSYMGLDELETESYNCPROC __rglgen_glDeleteSync; +RGLSYMGLCLIENTWAITSYNCPROC __rglgen_glClientWaitSync; +RGLSYMGLWAITSYNCPROC __rglgen_glWaitSync; +RGLSYMGLGETINTEGER64VPROC __rglgen_glGetInteger64v; +RGLSYMGLGETSYNCIVPROC __rglgen_glGetSynciv; +RGLSYMGLGETINTEGER64I_VPROC __rglgen_glGetInteger64i_v; +RGLSYMGLGETBUFFERPARAMETERI64VPROC __rglgen_glGetBufferParameteri64v; +RGLSYMGLFRAMEBUFFERTEXTUREPROC __rglgen_glFramebufferTexture; +RGLSYMGLTEXIMAGE2DMULTISAMPLEPROC __rglgen_glTexImage2DMultisample; +RGLSYMGLTEXIMAGE3DMULTISAMPLEPROC __rglgen_glTexImage3DMultisample; +RGLSYMGLGETMULTISAMPLEFVPROC __rglgen_glGetMultisamplefv; +RGLSYMGLSAMPLEMASKIPROC __rglgen_glSampleMaski; +RGLSYMGLBINDFRAGDATALOCATIONINDEXEDPROC __rglgen_glBindFragDataLocationIndexed; +RGLSYMGLGETFRAGDATAINDEXPROC __rglgen_glGetFragDataIndex; +RGLSYMGLGENSAMPLERSPROC __rglgen_glGenSamplers; +RGLSYMGLDELETESAMPLERSPROC __rglgen_glDeleteSamplers; +RGLSYMGLISSAMPLERPROC __rglgen_glIsSampler; +RGLSYMGLBINDSAMPLERPROC __rglgen_glBindSampler; +RGLSYMGLSAMPLERPARAMETERIPROC __rglgen_glSamplerParameteri; +RGLSYMGLSAMPLERPARAMETERIVPROC __rglgen_glSamplerParameteriv; +RGLSYMGLSAMPLERPARAMETERFPROC __rglgen_glSamplerParameterf; +RGLSYMGLSAMPLERPARAMETERFVPROC __rglgen_glSamplerParameterfv; +RGLSYMGLSAMPLERPARAMETERIIVPROC __rglgen_glSamplerParameterIiv; +RGLSYMGLSAMPLERPARAMETERIUIVPROC __rglgen_glSamplerParameterIuiv; +RGLSYMGLGETSAMPLERPARAMETERIVPROC __rglgen_glGetSamplerParameteriv; +RGLSYMGLGETSAMPLERPARAMETERIIVPROC __rglgen_glGetSamplerParameterIiv; +RGLSYMGLGETSAMPLERPARAMETERFVPROC __rglgen_glGetSamplerParameterfv; +RGLSYMGLGETSAMPLERPARAMETERIUIVPROC __rglgen_glGetSamplerParameterIuiv; +RGLSYMGLQUERYCOUNTERPROC __rglgen_glQueryCounter; +RGLSYMGLGETQUERYOBJECTI64VPROC __rglgen_glGetQueryObjecti64v; +RGLSYMGLGETQUERYOBJECTUI64VPROC __rglgen_glGetQueryObjectui64v; +RGLSYMGLVERTEXATTRIBDIVISORPROC __rglgen_glVertexAttribDivisor; +RGLSYMGLVERTEXATTRIBP1UIPROC __rglgen_glVertexAttribP1ui; +RGLSYMGLVERTEXATTRIBP1UIVPROC __rglgen_glVertexAttribP1uiv; +RGLSYMGLVERTEXATTRIBP2UIPROC __rglgen_glVertexAttribP2ui; +RGLSYMGLVERTEXATTRIBP2UIVPROC __rglgen_glVertexAttribP2uiv; +RGLSYMGLVERTEXATTRIBP3UIPROC __rglgen_glVertexAttribP3ui; +RGLSYMGLVERTEXATTRIBP3UIVPROC __rglgen_glVertexAttribP3uiv; +RGLSYMGLVERTEXATTRIBP4UIPROC __rglgen_glVertexAttribP4ui; +RGLSYMGLVERTEXATTRIBP4UIVPROC __rglgen_glVertexAttribP4uiv; +RGLSYMGLVERTEXP2UIPROC __rglgen_glVertexP2ui; +RGLSYMGLVERTEXP2UIVPROC __rglgen_glVertexP2uiv; +RGLSYMGLVERTEXP3UIPROC __rglgen_glVertexP3ui; +RGLSYMGLVERTEXP3UIVPROC __rglgen_glVertexP3uiv; +RGLSYMGLVERTEXP4UIPROC __rglgen_glVertexP4ui; +RGLSYMGLVERTEXP4UIVPROC __rglgen_glVertexP4uiv; +RGLSYMGLTEXCOORDP1UIPROC __rglgen_glTexCoordP1ui; +RGLSYMGLTEXCOORDP1UIVPROC __rglgen_glTexCoordP1uiv; +RGLSYMGLTEXCOORDP2UIPROC __rglgen_glTexCoordP2ui; +RGLSYMGLTEXCOORDP2UIVPROC __rglgen_glTexCoordP2uiv; +RGLSYMGLTEXCOORDP3UIPROC __rglgen_glTexCoordP3ui; +RGLSYMGLTEXCOORDP3UIVPROC __rglgen_glTexCoordP3uiv; +RGLSYMGLTEXCOORDP4UIPROC __rglgen_glTexCoordP4ui; +RGLSYMGLTEXCOORDP4UIVPROC __rglgen_glTexCoordP4uiv; +RGLSYMGLMULTITEXCOORDP1UIPROC __rglgen_glMultiTexCoordP1ui; +RGLSYMGLMULTITEXCOORDP1UIVPROC __rglgen_glMultiTexCoordP1uiv; +RGLSYMGLMULTITEXCOORDP2UIPROC __rglgen_glMultiTexCoordP2ui; +RGLSYMGLMULTITEXCOORDP2UIVPROC __rglgen_glMultiTexCoordP2uiv; +RGLSYMGLMULTITEXCOORDP3UIPROC __rglgen_glMultiTexCoordP3ui; +RGLSYMGLMULTITEXCOORDP3UIVPROC __rglgen_glMultiTexCoordP3uiv; +RGLSYMGLMULTITEXCOORDP4UIPROC __rglgen_glMultiTexCoordP4ui; +RGLSYMGLMULTITEXCOORDP4UIVPROC __rglgen_glMultiTexCoordP4uiv; +RGLSYMGLNORMALP3UIPROC __rglgen_glNormalP3ui; +RGLSYMGLNORMALP3UIVPROC __rglgen_glNormalP3uiv; +RGLSYMGLCOLORP3UIPROC __rglgen_glColorP3ui; +RGLSYMGLCOLORP3UIVPROC __rglgen_glColorP3uiv; +RGLSYMGLCOLORP4UIPROC __rglgen_glColorP4ui; +RGLSYMGLCOLORP4UIVPROC __rglgen_glColorP4uiv; +RGLSYMGLSECONDARYCOLORP3UIPROC __rglgen_glSecondaryColorP3ui; +RGLSYMGLSECONDARYCOLORP3UIVPROC __rglgen_glSecondaryColorP3uiv; +RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; +RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; +RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; +RGLSYMGLBLENDFUNCIPROC __rglgen_glBlendFunci; +RGLSYMGLBLENDFUNCSEPARATEIPROC __rglgen_glBlendFuncSeparatei; +RGLSYMGLDRAWARRAYSINDIRECTPROC __rglgen_glDrawArraysIndirect; +RGLSYMGLDRAWELEMENTSINDIRECTPROC __rglgen_glDrawElementsIndirect; +RGLSYMGLUNIFORM1DPROC __rglgen_glUniform1d; +RGLSYMGLUNIFORM2DPROC __rglgen_glUniform2d; +RGLSYMGLUNIFORM3DPROC __rglgen_glUniform3d; +RGLSYMGLUNIFORM4DPROC __rglgen_glUniform4d; +RGLSYMGLUNIFORM1DVPROC __rglgen_glUniform1dv; +RGLSYMGLUNIFORM2DVPROC __rglgen_glUniform2dv; +RGLSYMGLUNIFORM3DVPROC __rglgen_glUniform3dv; +RGLSYMGLUNIFORM4DVPROC __rglgen_glUniform4dv; +RGLSYMGLUNIFORMMATRIX2DVPROC __rglgen_glUniformMatrix2dv; +RGLSYMGLUNIFORMMATRIX3DVPROC __rglgen_glUniformMatrix3dv; +RGLSYMGLUNIFORMMATRIX4DVPROC __rglgen_glUniformMatrix4dv; +RGLSYMGLUNIFORMMATRIX2X3DVPROC __rglgen_glUniformMatrix2x3dv; +RGLSYMGLUNIFORMMATRIX2X4DVPROC __rglgen_glUniformMatrix2x4dv; +RGLSYMGLUNIFORMMATRIX3X2DVPROC __rglgen_glUniformMatrix3x2dv; +RGLSYMGLUNIFORMMATRIX3X4DVPROC __rglgen_glUniformMatrix3x4dv; +RGLSYMGLUNIFORMMATRIX4X2DVPROC __rglgen_glUniformMatrix4x2dv; +RGLSYMGLUNIFORMMATRIX4X3DVPROC __rglgen_glUniformMatrix4x3dv; +RGLSYMGLGETUNIFORMDVPROC __rglgen_glGetUniformdv; +RGLSYMGLGETSUBROUTINEUNIFORMLOCATIONPROC __rglgen_glGetSubroutineUniformLocation; +RGLSYMGLGETSUBROUTINEINDEXPROC __rglgen_glGetSubroutineIndex; +RGLSYMGLGETACTIVESUBROUTINEUNIFORMIVPROC __rglgen_glGetActiveSubroutineUniformiv; +RGLSYMGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __rglgen_glGetActiveSubroutineUniformName; +RGLSYMGLGETACTIVESUBROUTINENAMEPROC __rglgen_glGetActiveSubroutineName; +RGLSYMGLUNIFORMSUBROUTINESUIVPROC __rglgen_glUniformSubroutinesuiv; +RGLSYMGLGETUNIFORMSUBROUTINEUIVPROC __rglgen_glGetUniformSubroutineuiv; +RGLSYMGLGETPROGRAMSTAGEIVPROC __rglgen_glGetProgramStageiv; +RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; +RGLSYMGLPATCHPARAMETERFVPROC __rglgen_glPatchParameterfv; +RGLSYMGLBINDTRANSFORMFEEDBACKPROC __rglgen_glBindTransformFeedback; +RGLSYMGLDELETETRANSFORMFEEDBACKSPROC __rglgen_glDeleteTransformFeedbacks; +RGLSYMGLGENTRANSFORMFEEDBACKSPROC __rglgen_glGenTransformFeedbacks; +RGLSYMGLISTRANSFORMFEEDBACKPROC __rglgen_glIsTransformFeedback; +RGLSYMGLPAUSETRANSFORMFEEDBACKPROC __rglgen_glPauseTransformFeedback; +RGLSYMGLRESUMETRANSFORMFEEDBACKPROC __rglgen_glResumeTransformFeedback; +RGLSYMGLDRAWTRANSFORMFEEDBACKPROC __rglgen_glDrawTransformFeedback; +RGLSYMGLDRAWTRANSFORMFEEDBACKSTREAMPROC __rglgen_glDrawTransformFeedbackStream; +RGLSYMGLBEGINQUERYINDEXEDPROC __rglgen_glBeginQueryIndexed; +RGLSYMGLENDQUERYINDEXEDPROC __rglgen_glEndQueryIndexed; +RGLSYMGLGETQUERYINDEXEDIVPROC __rglgen_glGetQueryIndexediv; +RGLSYMGLRELEASESHADERCOMPILERPROC __rglgen_glReleaseShaderCompiler; +RGLSYMGLSHADERBINARYPROC __rglgen_glShaderBinary; +RGLSYMGLGETSHADERPRECISIONFORMATPROC __rglgen_glGetShaderPrecisionFormat; +RGLSYMGLDEPTHRANGEFPROC __rglgen_glDepthRangef; +RGLSYMGLCLEARDEPTHFPROC __rglgen_glClearDepthf; +RGLSYMGLGETPROGRAMBINARYPROC __rglgen_glGetProgramBinary; +RGLSYMGLPROGRAMBINARYPROC __rglgen_glProgramBinary; +RGLSYMGLPROGRAMPARAMETERIPROC __rglgen_glProgramParameteri; +RGLSYMGLUSEPROGRAMSTAGESPROC __rglgen_glUseProgramStages; +RGLSYMGLACTIVESHADERPROGRAMPROC __rglgen_glActiveShaderProgram; +RGLSYMGLCREATESHADERPROGRAMVPROC __rglgen_glCreateShaderProgramv; +RGLSYMGLBINDPROGRAMPIPELINEPROC __rglgen_glBindProgramPipeline; +RGLSYMGLDELETEPROGRAMPIPELINESPROC __rglgen_glDeleteProgramPipelines; +RGLSYMGLGENPROGRAMPIPELINESPROC __rglgen_glGenProgramPipelines; +RGLSYMGLISPROGRAMPIPELINEPROC __rglgen_glIsProgramPipeline; +RGLSYMGLGETPROGRAMPIPELINEIVPROC __rglgen_glGetProgramPipelineiv; +RGLSYMGLPROGRAMUNIFORM1IPROC __rglgen_glProgramUniform1i; +RGLSYMGLPROGRAMUNIFORM1IVPROC __rglgen_glProgramUniform1iv; +RGLSYMGLPROGRAMUNIFORM1FPROC __rglgen_glProgramUniform1f; +RGLSYMGLPROGRAMUNIFORM1FVPROC __rglgen_glProgramUniform1fv; +RGLSYMGLPROGRAMUNIFORM1DPROC __rglgen_glProgramUniform1d; +RGLSYMGLPROGRAMUNIFORM1DVPROC __rglgen_glProgramUniform1dv; +RGLSYMGLPROGRAMUNIFORM1UIPROC __rglgen_glProgramUniform1ui; +RGLSYMGLPROGRAMUNIFORM1UIVPROC __rglgen_glProgramUniform1uiv; +RGLSYMGLPROGRAMUNIFORM2IPROC __rglgen_glProgramUniform2i; +RGLSYMGLPROGRAMUNIFORM2IVPROC __rglgen_glProgramUniform2iv; +RGLSYMGLPROGRAMUNIFORM2FPROC __rglgen_glProgramUniform2f; +RGLSYMGLPROGRAMUNIFORM2FVPROC __rglgen_glProgramUniform2fv; +RGLSYMGLPROGRAMUNIFORM2DPROC __rglgen_glProgramUniform2d; +RGLSYMGLPROGRAMUNIFORM2DVPROC __rglgen_glProgramUniform2dv; +RGLSYMGLPROGRAMUNIFORM2UIPROC __rglgen_glProgramUniform2ui; +RGLSYMGLPROGRAMUNIFORM2UIVPROC __rglgen_glProgramUniform2uiv; +RGLSYMGLPROGRAMUNIFORM3IPROC __rglgen_glProgramUniform3i; +RGLSYMGLPROGRAMUNIFORM3IVPROC __rglgen_glProgramUniform3iv; +RGLSYMGLPROGRAMUNIFORM3FPROC __rglgen_glProgramUniform3f; +RGLSYMGLPROGRAMUNIFORM3FVPROC __rglgen_glProgramUniform3fv; +RGLSYMGLPROGRAMUNIFORM3DPROC __rglgen_glProgramUniform3d; +RGLSYMGLPROGRAMUNIFORM3DVPROC __rglgen_glProgramUniform3dv; +RGLSYMGLPROGRAMUNIFORM3UIPROC __rglgen_glProgramUniform3ui; +RGLSYMGLPROGRAMUNIFORM3UIVPROC __rglgen_glProgramUniform3uiv; +RGLSYMGLPROGRAMUNIFORM4IPROC __rglgen_glProgramUniform4i; +RGLSYMGLPROGRAMUNIFORM4IVPROC __rglgen_glProgramUniform4iv; +RGLSYMGLPROGRAMUNIFORM4FPROC __rglgen_glProgramUniform4f; +RGLSYMGLPROGRAMUNIFORM4FVPROC __rglgen_glProgramUniform4fv; +RGLSYMGLPROGRAMUNIFORM4DPROC __rglgen_glProgramUniform4d; +RGLSYMGLPROGRAMUNIFORM4DVPROC __rglgen_glProgramUniform4dv; +RGLSYMGLPROGRAMUNIFORM4UIPROC __rglgen_glProgramUniform4ui; +RGLSYMGLPROGRAMUNIFORM4UIVPROC __rglgen_glProgramUniform4uiv; +RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC __rglgen_glProgramUniformMatrix2fv; +RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC __rglgen_glProgramUniformMatrix3fv; +RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC __rglgen_glProgramUniformMatrix4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX2DVPROC __rglgen_glProgramUniformMatrix2dv; +RGLSYMGLPROGRAMUNIFORMMATRIX3DVPROC __rglgen_glProgramUniformMatrix3dv; +RGLSYMGLPROGRAMUNIFORMMATRIX4DVPROC __rglgen_glProgramUniformMatrix4dv; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC __rglgen_glProgramUniformMatrix2x3fv; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC __rglgen_glProgramUniformMatrix3x2fv; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC __rglgen_glProgramUniformMatrix2x4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC __rglgen_glProgramUniformMatrix4x2fv; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC __rglgen_glProgramUniformMatrix3x4fv; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC __rglgen_glProgramUniformMatrix4x3fv; +RGLSYMGLPROGRAMUNIFORMMATRIX2X3DVPROC __rglgen_glProgramUniformMatrix2x3dv; +RGLSYMGLPROGRAMUNIFORMMATRIX3X2DVPROC __rglgen_glProgramUniformMatrix3x2dv; +RGLSYMGLPROGRAMUNIFORMMATRIX2X4DVPROC __rglgen_glProgramUniformMatrix2x4dv; +RGLSYMGLPROGRAMUNIFORMMATRIX4X2DVPROC __rglgen_glProgramUniformMatrix4x2dv; +RGLSYMGLPROGRAMUNIFORMMATRIX3X4DVPROC __rglgen_glProgramUniformMatrix3x4dv; +RGLSYMGLPROGRAMUNIFORMMATRIX4X3DVPROC __rglgen_glProgramUniformMatrix4x3dv; +RGLSYMGLVALIDATEPROGRAMPIPELINEPROC __rglgen_glValidateProgramPipeline; +RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC __rglgen_glGetProgramPipelineInfoLog; +RGLSYMGLVERTEXATTRIBL1DPROC __rglgen_glVertexAttribL1d; +RGLSYMGLVERTEXATTRIBL2DPROC __rglgen_glVertexAttribL2d; +RGLSYMGLVERTEXATTRIBL3DPROC __rglgen_glVertexAttribL3d; +RGLSYMGLVERTEXATTRIBL4DPROC __rglgen_glVertexAttribL4d; +RGLSYMGLVERTEXATTRIBL1DVPROC __rglgen_glVertexAttribL1dv; +RGLSYMGLVERTEXATTRIBL2DVPROC __rglgen_glVertexAttribL2dv; +RGLSYMGLVERTEXATTRIBL3DVPROC __rglgen_glVertexAttribL3dv; +RGLSYMGLVERTEXATTRIBL4DVPROC __rglgen_glVertexAttribL4dv; +RGLSYMGLVERTEXATTRIBLPOINTERPROC __rglgen_glVertexAttribLPointer; +RGLSYMGLGETVERTEXATTRIBLDVPROC __rglgen_glGetVertexAttribLdv; +RGLSYMGLVIEWPORTARRAYVPROC __rglgen_glViewportArrayv; +RGLSYMGLVIEWPORTINDEXEDFPROC __rglgen_glViewportIndexedf; +RGLSYMGLVIEWPORTINDEXEDFVPROC __rglgen_glViewportIndexedfv; +RGLSYMGLSCISSORARRAYVPROC __rglgen_glScissorArrayv; +RGLSYMGLSCISSORINDEXEDPROC __rglgen_glScissorIndexed; +RGLSYMGLSCISSORINDEXEDVPROC __rglgen_glScissorIndexedv; +RGLSYMGLDEPTHRANGEARRAYVPROC __rglgen_glDepthRangeArrayv; +RGLSYMGLDEPTHRANGEINDEXEDPROC __rglgen_glDepthRangeIndexed; +RGLSYMGLGETFLOATI_VPROC __rglgen_glGetFloati_v; +RGLSYMGLGETDOUBLEI_VPROC __rglgen_glGetDoublei_v; +RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __rglgen_glDrawArraysInstancedBaseInstance; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __rglgen_glDrawElementsInstancedBaseInstance; +RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstance; +RGLSYMGLGETINTERNALFORMATIVPROC __rglgen_glGetInternalformativ; +RGLSYMGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __rglgen_glGetActiveAtomicCounterBufferiv; +RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; +RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; +RGLSYMGLTEXSTORAGE1DPROC __rglgen_glTexStorage1D; +RGLSYMGLTEXSTORAGE2DPROC __rglgen_glTexStorage2D; +RGLSYMGLTEXSTORAGE3DPROC __rglgen_glTexStorage3D; +RGLSYMGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __rglgen_glDrawTransformFeedbackInstanced; +RGLSYMGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __rglgen_glDrawTransformFeedbackStreamInstanced; +RGLSYMGLCLEARBUFFERDATAPROC __rglgen_glClearBufferData; +RGLSYMGLCLEARBUFFERSUBDATAPROC __rglgen_glClearBufferSubData; +RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; +RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC __rglgen_glDispatchComputeIndirect; +RGLSYMGLCOPYIMAGESUBDATAPROC __rglgen_glCopyImageSubData; +RGLSYMGLFRAMEBUFFERPARAMETERIPROC __rglgen_glFramebufferParameteri; +RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetFramebufferParameteriv; +RGLSYMGLGETINTERNALFORMATI64VPROC __rglgen_glGetInternalformati64v; +RGLSYMGLINVALIDATETEXSUBIMAGEPROC __rglgen_glInvalidateTexSubImage; +RGLSYMGLINVALIDATETEXIMAGEPROC __rglgen_glInvalidateTexImage; +RGLSYMGLINVALIDATEBUFFERSUBDATAPROC __rglgen_glInvalidateBufferSubData; +RGLSYMGLINVALIDATEBUFFERDATAPROC __rglgen_glInvalidateBufferData; +RGLSYMGLINVALIDATEFRAMEBUFFERPROC __rglgen_glInvalidateFramebuffer; +RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC __rglgen_glInvalidateSubFramebuffer; +RGLSYMGLMULTIDRAWARRAYSINDIRECTPROC __rglgen_glMultiDrawArraysIndirect; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTPROC __rglgen_glMultiDrawElementsIndirect; +RGLSYMGLGETPROGRAMINTERFACEIVPROC __rglgen_glGetProgramInterfaceiv; +RGLSYMGLGETPROGRAMRESOURCEINDEXPROC __rglgen_glGetProgramResourceIndex; +RGLSYMGLGETPROGRAMRESOURCENAMEPROC __rglgen_glGetProgramResourceName; +RGLSYMGLGETPROGRAMRESOURCEIVPROC __rglgen_glGetProgramResourceiv; +RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC __rglgen_glGetProgramResourceLocation; +RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXPROC __rglgen_glGetProgramResourceLocationIndex; +RGLSYMGLSHADERSTORAGEBLOCKBINDINGPROC __rglgen_glShaderStorageBlockBinding; +RGLSYMGLTEXBUFFERRANGEPROC __rglgen_glTexBufferRange; +RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC __rglgen_glTexStorage2DMultisample; +RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC __rglgen_glTexStorage3DMultisample; +RGLSYMGLTEXTUREVIEWPROC __rglgen_glTextureView; +RGLSYMGLBINDVERTEXBUFFERPROC __rglgen_glBindVertexBuffer; +RGLSYMGLVERTEXATTRIBFORMATPROC __rglgen_glVertexAttribFormat; +RGLSYMGLVERTEXATTRIBIFORMATPROC __rglgen_glVertexAttribIFormat; +RGLSYMGLVERTEXATTRIBLFORMATPROC __rglgen_glVertexAttribLFormat; +RGLSYMGLVERTEXATTRIBBINDINGPROC __rglgen_glVertexAttribBinding; +RGLSYMGLVERTEXBINDINGDIVISORPROC __rglgen_glVertexBindingDivisor; +RGLSYMGLDEBUGMESSAGECONTROLPROC __rglgen_glDebugMessageControl; +RGLSYMGLDEBUGMESSAGEINSERTPROC __rglgen_glDebugMessageInsert; +RGLSYMGLDEBUGMESSAGECALLBACKPROC __rglgen_glDebugMessageCallback; +RGLSYMGLGETDEBUGMESSAGELOGPROC __rglgen_glGetDebugMessageLog; +RGLSYMGLPUSHDEBUGGROUPPROC __rglgen_glPushDebugGroup; +RGLSYMGLPOPDEBUGGROUPPROC __rglgen_glPopDebugGroup; +RGLSYMGLOBJECTLABELPROC __rglgen_glObjectLabel; +RGLSYMGLGETOBJECTLABELPROC __rglgen_glGetObjectLabel; +RGLSYMGLOBJECTPTRLABELPROC __rglgen_glObjectPtrLabel; +RGLSYMGLGETOBJECTPTRLABELPROC __rglgen_glGetObjectPtrLabel; +RGLSYMGLBUFFERSTORAGEPROC __rglgen_glBufferStorage; +RGLSYMGLCLEARTEXIMAGEPROC __rglgen_glClearTexImage; +RGLSYMGLCLEARTEXSUBIMAGEPROC __rglgen_glClearTexSubImage; +RGLSYMGLBINDBUFFERSBASEPROC __rglgen_glBindBuffersBase; +RGLSYMGLBINDBUFFERSRANGEPROC __rglgen_glBindBuffersRange; +RGLSYMGLBINDTEXTURESPROC __rglgen_glBindTextures; +RGLSYMGLBINDSAMPLERSPROC __rglgen_glBindSamplers; +RGLSYMGLBINDIMAGETEXTURESPROC __rglgen_glBindImageTextures; +RGLSYMGLBINDVERTEXBUFFERSPROC __rglgen_glBindVertexBuffers; +RGLSYMGLGETTEXTUREHANDLEARBPROC __rglgen_glGetTextureHandleARB; +RGLSYMGLGETTEXTURESAMPLERHANDLEARBPROC __rglgen_glGetTextureSamplerHandleARB; +RGLSYMGLMAKETEXTUREHANDLERESIDENTARBPROC __rglgen_glMakeTextureHandleResidentARB; +RGLSYMGLMAKETEXTUREHANDLENONRESIDENTARBPROC __rglgen_glMakeTextureHandleNonResidentARB; +RGLSYMGLGETIMAGEHANDLEARBPROC __rglgen_glGetImageHandleARB; +RGLSYMGLMAKEIMAGEHANDLERESIDENTARBPROC __rglgen_glMakeImageHandleResidentARB; +RGLSYMGLMAKEIMAGEHANDLENONRESIDENTARBPROC __rglgen_glMakeImageHandleNonResidentARB; +RGLSYMGLUNIFORMHANDLEUI64ARBPROC __rglgen_glUniformHandleui64ARB; +RGLSYMGLUNIFORMHANDLEUI64VARBPROC __rglgen_glUniformHandleui64vARB; +RGLSYMGLPROGRAMUNIFORMHANDLEUI64ARBPROC __rglgen_glProgramUniformHandleui64ARB; +RGLSYMGLPROGRAMUNIFORMHANDLEUI64VARBPROC __rglgen_glProgramUniformHandleui64vARB; +RGLSYMGLISTEXTUREHANDLERESIDENTARBPROC __rglgen_glIsTextureHandleResidentARB; +RGLSYMGLISIMAGEHANDLERESIDENTARBPROC __rglgen_glIsImageHandleResidentARB; +RGLSYMGLVERTEXATTRIBL1UI64ARBPROC __rglgen_glVertexAttribL1ui64ARB; +RGLSYMGLVERTEXATTRIBL1UI64VARBPROC __rglgen_glVertexAttribL1ui64vARB; +RGLSYMGLGETVERTEXATTRIBLUI64VARBPROC __rglgen_glGetVertexAttribLui64vARB; +RGLSYMGLCREATESYNCFROMCLEVENTARBPROC __rglgen_glCreateSyncFromCLeventARB; +RGLSYMGLCLAMPCOLORARBPROC __rglgen_glClampColorARB; +RGLSYMGLDISPATCHCOMPUTEGROUPSIZEARBPROC __rglgen_glDispatchComputeGroupSizeARB; +RGLSYMGLDEBUGMESSAGECONTROLARBPROC __rglgen_glDebugMessageControlARB; +RGLSYMGLDEBUGMESSAGEINSERTARBPROC __rglgen_glDebugMessageInsertARB; +RGLSYMGLDEBUGMESSAGECALLBACKARBPROC __rglgen_glDebugMessageCallbackARB; +RGLSYMGLGETDEBUGMESSAGELOGARBPROC __rglgen_glGetDebugMessageLogARB; +RGLSYMGLDRAWBUFFERSARBPROC __rglgen_glDrawBuffersARB; +RGLSYMGLBLENDEQUATIONIARBPROC __rglgen_glBlendEquationiARB; +RGLSYMGLBLENDEQUATIONSEPARATEIARBPROC __rglgen_glBlendEquationSeparateiARB; +RGLSYMGLBLENDFUNCIARBPROC __rglgen_glBlendFunciARB; +RGLSYMGLBLENDFUNCSEPARATEIARBPROC __rglgen_glBlendFuncSeparateiARB; +RGLSYMGLDRAWARRAYSINSTANCEDARBPROC __rglgen_glDrawArraysInstancedARB; +RGLSYMGLDRAWELEMENTSINSTANCEDARBPROC __rglgen_glDrawElementsInstancedARB; +RGLSYMGLPROGRAMSTRINGARBPROC __rglgen_glProgramStringARB; +RGLSYMGLBINDPROGRAMARBPROC __rglgen_glBindProgramARB; +RGLSYMGLDELETEPROGRAMSARBPROC __rglgen_glDeleteProgramsARB; +RGLSYMGLGENPROGRAMSARBPROC __rglgen_glGenProgramsARB; +RGLSYMGLPROGRAMENVPARAMETER4DARBPROC __rglgen_glProgramEnvParameter4dARB; +RGLSYMGLPROGRAMENVPARAMETER4DVARBPROC __rglgen_glProgramEnvParameter4dvARB; +RGLSYMGLPROGRAMENVPARAMETER4FARBPROC __rglgen_glProgramEnvParameter4fARB; +RGLSYMGLPROGRAMENVPARAMETER4FVARBPROC __rglgen_glProgramEnvParameter4fvARB; +RGLSYMGLPROGRAMLOCALPARAMETER4DARBPROC __rglgen_glProgramLocalParameter4dARB; +RGLSYMGLPROGRAMLOCALPARAMETER4DVARBPROC __rglgen_glProgramLocalParameter4dvARB; +RGLSYMGLPROGRAMLOCALPARAMETER4FARBPROC __rglgen_glProgramLocalParameter4fARB; +RGLSYMGLPROGRAMLOCALPARAMETER4FVARBPROC __rglgen_glProgramLocalParameter4fvARB; +RGLSYMGLGETPROGRAMENVPARAMETERDVARBPROC __rglgen_glGetProgramEnvParameterdvARB; +RGLSYMGLGETPROGRAMENVPARAMETERFVARBPROC __rglgen_glGetProgramEnvParameterfvARB; +RGLSYMGLGETPROGRAMLOCALPARAMETERDVARBPROC __rglgen_glGetProgramLocalParameterdvARB; +RGLSYMGLGETPROGRAMLOCALPARAMETERFVARBPROC __rglgen_glGetProgramLocalParameterfvARB; +RGLSYMGLGETPROGRAMIVARBPROC __rglgen_glGetProgramivARB; +RGLSYMGLGETPROGRAMSTRINGARBPROC __rglgen_glGetProgramStringARB; +RGLSYMGLISPROGRAMARBPROC __rglgen_glIsProgramARB; +RGLSYMGLPROGRAMPARAMETERIARBPROC __rglgen_glProgramParameteriARB; +RGLSYMGLFRAMEBUFFERTEXTUREARBPROC __rglgen_glFramebufferTextureARB; +RGLSYMGLFRAMEBUFFERTEXTURELAYERARBPROC __rglgen_glFramebufferTextureLayerARB; +RGLSYMGLFRAMEBUFFERTEXTUREFACEARBPROC __rglgen_glFramebufferTextureFaceARB; +RGLSYMGLCOLORTABLEPROC __rglgen_glColorTable; +RGLSYMGLCOLORTABLEPARAMETERFVPROC __rglgen_glColorTableParameterfv; +RGLSYMGLCOLORTABLEPARAMETERIVPROC __rglgen_glColorTableParameteriv; +RGLSYMGLCOPYCOLORTABLEPROC __rglgen_glCopyColorTable; +RGLSYMGLGETCOLORTABLEPROC __rglgen_glGetColorTable; +RGLSYMGLGETCOLORTABLEPARAMETERFVPROC __rglgen_glGetColorTableParameterfv; +RGLSYMGLGETCOLORTABLEPARAMETERIVPROC __rglgen_glGetColorTableParameteriv; +RGLSYMGLCOLORSUBTABLEPROC __rglgen_glColorSubTable; +RGLSYMGLCOPYCOLORSUBTABLEPROC __rglgen_glCopyColorSubTable; +RGLSYMGLCONVOLUTIONFILTER1DPROC __rglgen_glConvolutionFilter1D; +RGLSYMGLCONVOLUTIONFILTER2DPROC __rglgen_glConvolutionFilter2D; +RGLSYMGLCONVOLUTIONPARAMETERFPROC __rglgen_glConvolutionParameterf; +RGLSYMGLCONVOLUTIONPARAMETERFVPROC __rglgen_glConvolutionParameterfv; +RGLSYMGLCONVOLUTIONPARAMETERIPROC __rglgen_glConvolutionParameteri; +RGLSYMGLCONVOLUTIONPARAMETERIVPROC __rglgen_glConvolutionParameteriv; +RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC __rglgen_glCopyConvolutionFilter1D; +RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC __rglgen_glCopyConvolutionFilter2D; +RGLSYMGLGETCONVOLUTIONFILTERPROC __rglgen_glGetConvolutionFilter; +RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC __rglgen_glGetConvolutionParameterfv; +RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC __rglgen_glGetConvolutionParameteriv; +RGLSYMGLGETSEPARABLEFILTERPROC __rglgen_glGetSeparableFilter; +RGLSYMGLSEPARABLEFILTER2DPROC __rglgen_glSeparableFilter2D; +RGLSYMGLGETHISTOGRAMPROC __rglgen_glGetHistogram; +RGLSYMGLGETHISTOGRAMPARAMETERFVPROC __rglgen_glGetHistogramParameterfv; +RGLSYMGLGETHISTOGRAMPARAMETERIVPROC __rglgen_glGetHistogramParameteriv; +RGLSYMGLGETMINMAXPROC __rglgen_glGetMinmax; +RGLSYMGLGETMINMAXPARAMETERFVPROC __rglgen_glGetMinmaxParameterfv; +RGLSYMGLGETMINMAXPARAMETERIVPROC __rglgen_glGetMinmaxParameteriv; +RGLSYMGLHISTOGRAMPROC __rglgen_glHistogram; +RGLSYMGLMINMAXPROC __rglgen_glMinmax; +RGLSYMGLRESETHISTOGRAMPROC __rglgen_glResetHistogram; +RGLSYMGLRESETMINMAXPROC __rglgen_glResetMinmax; +RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawArraysIndirectCountARB; +RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawElementsIndirectCountARB; +RGLSYMGLVERTEXATTRIBDIVISORARBPROC __rglgen_glVertexAttribDivisorARB; +RGLSYMGLCURRENTPALETTEMATRIXARBPROC __rglgen_glCurrentPaletteMatrixARB; +RGLSYMGLMATRIXINDEXUBVARBPROC __rglgen_glMatrixIndexubvARB; +RGLSYMGLMATRIXINDEXUSVARBPROC __rglgen_glMatrixIndexusvARB; +RGLSYMGLMATRIXINDEXUIVARBPROC __rglgen_glMatrixIndexuivARB; +RGLSYMGLMATRIXINDEXPOINTERARBPROC __rglgen_glMatrixIndexPointerARB; +RGLSYMGLSAMPLECOVERAGEARBPROC __rglgen_glSampleCoverageARB; +RGLSYMGLACTIVETEXTUREARBPROC __rglgen_glActiveTextureARB; +RGLSYMGLCLIENTACTIVETEXTUREARBPROC __rglgen_glClientActiveTextureARB; +RGLSYMGLMULTITEXCOORD1DARBPROC __rglgen_glMultiTexCoord1dARB; +RGLSYMGLMULTITEXCOORD1DVARBPROC __rglgen_glMultiTexCoord1dvARB; +RGLSYMGLMULTITEXCOORD1FARBPROC __rglgen_glMultiTexCoord1fARB; +RGLSYMGLMULTITEXCOORD1FVARBPROC __rglgen_glMultiTexCoord1fvARB; +RGLSYMGLMULTITEXCOORD1IARBPROC __rglgen_glMultiTexCoord1iARB; +RGLSYMGLMULTITEXCOORD1IVARBPROC __rglgen_glMultiTexCoord1ivARB; +RGLSYMGLMULTITEXCOORD1SARBPROC __rglgen_glMultiTexCoord1sARB; +RGLSYMGLMULTITEXCOORD1SVARBPROC __rglgen_glMultiTexCoord1svARB; +RGLSYMGLMULTITEXCOORD2DARBPROC __rglgen_glMultiTexCoord2dARB; +RGLSYMGLMULTITEXCOORD2DVARBPROC __rglgen_glMultiTexCoord2dvARB; +RGLSYMGLMULTITEXCOORD2FARBPROC __rglgen_glMultiTexCoord2fARB; +RGLSYMGLMULTITEXCOORD2FVARBPROC __rglgen_glMultiTexCoord2fvARB; +RGLSYMGLMULTITEXCOORD2IARBPROC __rglgen_glMultiTexCoord2iARB; +RGLSYMGLMULTITEXCOORD2IVARBPROC __rglgen_glMultiTexCoord2ivARB; +RGLSYMGLMULTITEXCOORD2SARBPROC __rglgen_glMultiTexCoord2sARB; +RGLSYMGLMULTITEXCOORD2SVARBPROC __rglgen_glMultiTexCoord2svARB; +RGLSYMGLMULTITEXCOORD3DARBPROC __rglgen_glMultiTexCoord3dARB; +RGLSYMGLMULTITEXCOORD3DVARBPROC __rglgen_glMultiTexCoord3dvARB; +RGLSYMGLMULTITEXCOORD3FARBPROC __rglgen_glMultiTexCoord3fARB; +RGLSYMGLMULTITEXCOORD3FVARBPROC __rglgen_glMultiTexCoord3fvARB; +RGLSYMGLMULTITEXCOORD3IARBPROC __rglgen_glMultiTexCoord3iARB; +RGLSYMGLMULTITEXCOORD3IVARBPROC __rglgen_glMultiTexCoord3ivARB; +RGLSYMGLMULTITEXCOORD3SARBPROC __rglgen_glMultiTexCoord3sARB; +RGLSYMGLMULTITEXCOORD3SVARBPROC __rglgen_glMultiTexCoord3svARB; +RGLSYMGLMULTITEXCOORD4DARBPROC __rglgen_glMultiTexCoord4dARB; +RGLSYMGLMULTITEXCOORD4DVARBPROC __rglgen_glMultiTexCoord4dvARB; +RGLSYMGLMULTITEXCOORD4FARBPROC __rglgen_glMultiTexCoord4fARB; +RGLSYMGLMULTITEXCOORD4FVARBPROC __rglgen_glMultiTexCoord4fvARB; +RGLSYMGLMULTITEXCOORD4IARBPROC __rglgen_glMultiTexCoord4iARB; +RGLSYMGLMULTITEXCOORD4IVARBPROC __rglgen_glMultiTexCoord4ivARB; +RGLSYMGLMULTITEXCOORD4SARBPROC __rglgen_glMultiTexCoord4sARB; +RGLSYMGLMULTITEXCOORD4SVARBPROC __rglgen_glMultiTexCoord4svARB; +RGLSYMGLGENQUERIESARBPROC __rglgen_glGenQueriesARB; +RGLSYMGLDELETEQUERIESARBPROC __rglgen_glDeleteQueriesARB; +RGLSYMGLISQUERYARBPROC __rglgen_glIsQueryARB; +RGLSYMGLBEGINQUERYARBPROC __rglgen_glBeginQueryARB; +RGLSYMGLENDQUERYARBPROC __rglgen_glEndQueryARB; +RGLSYMGLGETQUERYIVARBPROC __rglgen_glGetQueryivARB; +RGLSYMGLGETQUERYOBJECTIVARBPROC __rglgen_glGetQueryObjectivARB; +RGLSYMGLGETQUERYOBJECTUIVARBPROC __rglgen_glGetQueryObjectuivARB; +RGLSYMGLPOINTPARAMETERFARBPROC __rglgen_glPointParameterfARB; +RGLSYMGLPOINTPARAMETERFVARBPROC __rglgen_glPointParameterfvARB; +RGLSYMGLGETGRAPHICSRESETSTATUSARBPROC __rglgen_glGetGraphicsResetStatusARB; +RGLSYMGLGETNTEXIMAGEARBPROC __rglgen_glGetnTexImageARB; +RGLSYMGLREADNPIXELSARBPROC __rglgen_glReadnPixelsARB; +RGLSYMGLGETNCOMPRESSEDTEXIMAGEARBPROC __rglgen_glGetnCompressedTexImageARB; +RGLSYMGLGETNUNIFORMFVARBPROC __rglgen_glGetnUniformfvARB; +RGLSYMGLGETNUNIFORMIVARBPROC __rglgen_glGetnUniformivARB; +RGLSYMGLGETNUNIFORMUIVARBPROC __rglgen_glGetnUniformuivARB; +RGLSYMGLGETNUNIFORMDVARBPROC __rglgen_glGetnUniformdvARB; +RGLSYMGLGETNMAPDVARBPROC __rglgen_glGetnMapdvARB; +RGLSYMGLGETNMAPFVARBPROC __rglgen_glGetnMapfvARB; +RGLSYMGLGETNMAPIVARBPROC __rglgen_glGetnMapivARB; +RGLSYMGLGETNPIXELMAPFVARBPROC __rglgen_glGetnPixelMapfvARB; +RGLSYMGLGETNPIXELMAPUIVARBPROC __rglgen_glGetnPixelMapuivARB; +RGLSYMGLGETNPIXELMAPUSVARBPROC __rglgen_glGetnPixelMapusvARB; +RGLSYMGLGETNPOLYGONSTIPPLEARBPROC __rglgen_glGetnPolygonStippleARB; +RGLSYMGLGETNCOLORTABLEARBPROC __rglgen_glGetnColorTableARB; +RGLSYMGLGETNCONVOLUTIONFILTERARBPROC __rglgen_glGetnConvolutionFilterARB; +RGLSYMGLGETNSEPARABLEFILTERARBPROC __rglgen_glGetnSeparableFilterARB; +RGLSYMGLGETNHISTOGRAMARBPROC __rglgen_glGetnHistogramARB; +RGLSYMGLGETNMINMAXARBPROC __rglgen_glGetnMinmaxARB; +RGLSYMGLMINSAMPLESHADINGARBPROC __rglgen_glMinSampleShadingARB; +RGLSYMGLDELETEOBJECTARBPROC __rglgen_glDeleteObjectARB; +RGLSYMGLGETHANDLEARBPROC __rglgen_glGetHandleARB; +RGLSYMGLDETACHOBJECTARBPROC __rglgen_glDetachObjectARB; +RGLSYMGLCREATESHADEROBJECTARBPROC __rglgen_glCreateShaderObjectARB; +RGLSYMGLSHADERSOURCEARBPROC __rglgen_glShaderSourceARB; +RGLSYMGLCOMPILESHADERARBPROC __rglgen_glCompileShaderARB; +RGLSYMGLCREATEPROGRAMOBJECTARBPROC __rglgen_glCreateProgramObjectARB; +RGLSYMGLATTACHOBJECTARBPROC __rglgen_glAttachObjectARB; +RGLSYMGLLINKPROGRAMARBPROC __rglgen_glLinkProgramARB; +RGLSYMGLUSEPROGRAMOBJECTARBPROC __rglgen_glUseProgramObjectARB; +RGLSYMGLVALIDATEPROGRAMARBPROC __rglgen_glValidateProgramARB; +RGLSYMGLUNIFORM1FARBPROC __rglgen_glUniform1fARB; +RGLSYMGLUNIFORM2FARBPROC __rglgen_glUniform2fARB; +RGLSYMGLUNIFORM3FARBPROC __rglgen_glUniform3fARB; +RGLSYMGLUNIFORM4FARBPROC __rglgen_glUniform4fARB; +RGLSYMGLUNIFORM1IARBPROC __rglgen_glUniform1iARB; +RGLSYMGLUNIFORM2IARBPROC __rglgen_glUniform2iARB; +RGLSYMGLUNIFORM3IARBPROC __rglgen_glUniform3iARB; +RGLSYMGLUNIFORM4IARBPROC __rglgen_glUniform4iARB; +RGLSYMGLUNIFORM1FVARBPROC __rglgen_glUniform1fvARB; +RGLSYMGLUNIFORM2FVARBPROC __rglgen_glUniform2fvARB; +RGLSYMGLUNIFORM3FVARBPROC __rglgen_glUniform3fvARB; +RGLSYMGLUNIFORM4FVARBPROC __rglgen_glUniform4fvARB; +RGLSYMGLUNIFORM1IVARBPROC __rglgen_glUniform1ivARB; +RGLSYMGLUNIFORM2IVARBPROC __rglgen_glUniform2ivARB; +RGLSYMGLUNIFORM3IVARBPROC __rglgen_glUniform3ivARB; +RGLSYMGLUNIFORM4IVARBPROC __rglgen_glUniform4ivARB; +RGLSYMGLUNIFORMMATRIX2FVARBPROC __rglgen_glUniformMatrix2fvARB; +RGLSYMGLUNIFORMMATRIX3FVARBPROC __rglgen_glUniformMatrix3fvARB; +RGLSYMGLUNIFORMMATRIX4FVARBPROC __rglgen_glUniformMatrix4fvARB; +RGLSYMGLGETOBJECTPARAMETERFVARBPROC __rglgen_glGetObjectParameterfvARB; +RGLSYMGLGETOBJECTPARAMETERIVARBPROC __rglgen_glGetObjectParameterivARB; +RGLSYMGLGETINFOLOGARBPROC __rglgen_glGetInfoLogARB; +RGLSYMGLGETATTACHEDOBJECTSARBPROC __rglgen_glGetAttachedObjectsARB; +RGLSYMGLGETUNIFORMLOCATIONARBPROC __rglgen_glGetUniformLocationARB; +RGLSYMGLGETACTIVEUNIFORMARBPROC __rglgen_glGetActiveUniformARB; +RGLSYMGLGETUNIFORMFVARBPROC __rglgen_glGetUniformfvARB; +RGLSYMGLGETUNIFORMIVARBPROC __rglgen_glGetUniformivARB; +RGLSYMGLGETSHADERSOURCEARBPROC __rglgen_glGetShaderSourceARB; +RGLSYMGLNAMEDSTRINGARBPROC __rglgen_glNamedStringARB; +RGLSYMGLDELETENAMEDSTRINGARBPROC __rglgen_glDeleteNamedStringARB; +RGLSYMGLCOMPILESHADERINCLUDEARBPROC __rglgen_glCompileShaderIncludeARB; +RGLSYMGLISNAMEDSTRINGARBPROC __rglgen_glIsNamedStringARB; +RGLSYMGLGETNAMEDSTRINGARBPROC __rglgen_glGetNamedStringARB; +RGLSYMGLGETNAMEDSTRINGIVARBPROC __rglgen_glGetNamedStringivARB; +RGLSYMGLTEXPAGECOMMITMENTARBPROC __rglgen_glTexPageCommitmentARB; +RGLSYMGLTEXBUFFERARBPROC __rglgen_glTexBufferARB; +RGLSYMGLCOMPRESSEDTEXIMAGE3DARBPROC __rglgen_glCompressedTexImage3DARB; +RGLSYMGLCOMPRESSEDTEXIMAGE2DARBPROC __rglgen_glCompressedTexImage2DARB; +RGLSYMGLCOMPRESSEDTEXIMAGE1DARBPROC __rglgen_glCompressedTexImage1DARB; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __rglgen_glCompressedTexSubImage3DARB; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __rglgen_glCompressedTexSubImage2DARB; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __rglgen_glCompressedTexSubImage1DARB; +RGLSYMGLGETCOMPRESSEDTEXIMAGEARBPROC __rglgen_glGetCompressedTexImageARB; +RGLSYMGLLOADTRANSPOSEMATRIXFARBPROC __rglgen_glLoadTransposeMatrixfARB; +RGLSYMGLLOADTRANSPOSEMATRIXDARBPROC __rglgen_glLoadTransposeMatrixdARB; +RGLSYMGLMULTTRANSPOSEMATRIXFARBPROC __rglgen_glMultTransposeMatrixfARB; +RGLSYMGLMULTTRANSPOSEMATRIXDARBPROC __rglgen_glMultTransposeMatrixdARB; +RGLSYMGLWEIGHTBVARBPROC __rglgen_glWeightbvARB; +RGLSYMGLWEIGHTSVARBPROC __rglgen_glWeightsvARB; +RGLSYMGLWEIGHTIVARBPROC __rglgen_glWeightivARB; +RGLSYMGLWEIGHTFVARBPROC __rglgen_glWeightfvARB; +RGLSYMGLWEIGHTDVARBPROC __rglgen_glWeightdvARB; +RGLSYMGLWEIGHTUBVARBPROC __rglgen_glWeightubvARB; +RGLSYMGLWEIGHTUSVARBPROC __rglgen_glWeightusvARB; +RGLSYMGLWEIGHTUIVARBPROC __rglgen_glWeightuivARB; +RGLSYMGLWEIGHTPOINTERARBPROC __rglgen_glWeightPointerARB; +RGLSYMGLVERTEXBLENDARBPROC __rglgen_glVertexBlendARB; +RGLSYMGLBINDBUFFERARBPROC __rglgen_glBindBufferARB; +RGLSYMGLDELETEBUFFERSARBPROC __rglgen_glDeleteBuffersARB; +RGLSYMGLGENBUFFERSARBPROC __rglgen_glGenBuffersARB; +RGLSYMGLISBUFFERARBPROC __rglgen_glIsBufferARB; +RGLSYMGLBUFFERDATAARBPROC __rglgen_glBufferDataARB; +RGLSYMGLBUFFERSUBDATAARBPROC __rglgen_glBufferSubDataARB; +RGLSYMGLGETBUFFERSUBDATAARBPROC __rglgen_glGetBufferSubDataARB; +RGLSYMGLMAPBUFFERARBPROC __rglgen_glMapBufferARB; +RGLSYMGLUNMAPBUFFERARBPROC __rglgen_glUnmapBufferARB; +RGLSYMGLGETBUFFERPARAMETERIVARBPROC __rglgen_glGetBufferParameterivARB; +RGLSYMGLGETBUFFERPOINTERVARBPROC __rglgen_glGetBufferPointervARB; +RGLSYMGLVERTEXATTRIB1DARBPROC __rglgen_glVertexAttrib1dARB; +RGLSYMGLVERTEXATTRIB1DVARBPROC __rglgen_glVertexAttrib1dvARB; +RGLSYMGLVERTEXATTRIB1FARBPROC __rglgen_glVertexAttrib1fARB; +RGLSYMGLVERTEXATTRIB1FVARBPROC __rglgen_glVertexAttrib1fvARB; +RGLSYMGLVERTEXATTRIB1SARBPROC __rglgen_glVertexAttrib1sARB; +RGLSYMGLVERTEXATTRIB1SVARBPROC __rglgen_glVertexAttrib1svARB; +RGLSYMGLVERTEXATTRIB2DARBPROC __rglgen_glVertexAttrib2dARB; +RGLSYMGLVERTEXATTRIB2DVARBPROC __rglgen_glVertexAttrib2dvARB; +RGLSYMGLVERTEXATTRIB2FARBPROC __rglgen_glVertexAttrib2fARB; +RGLSYMGLVERTEXATTRIB2FVARBPROC __rglgen_glVertexAttrib2fvARB; +RGLSYMGLVERTEXATTRIB2SARBPROC __rglgen_glVertexAttrib2sARB; +RGLSYMGLVERTEXATTRIB2SVARBPROC __rglgen_glVertexAttrib2svARB; +RGLSYMGLVERTEXATTRIB3DARBPROC __rglgen_glVertexAttrib3dARB; +RGLSYMGLVERTEXATTRIB3DVARBPROC __rglgen_glVertexAttrib3dvARB; +RGLSYMGLVERTEXATTRIB3FARBPROC __rglgen_glVertexAttrib3fARB; +RGLSYMGLVERTEXATTRIB3FVARBPROC __rglgen_glVertexAttrib3fvARB; +RGLSYMGLVERTEXATTRIB3SARBPROC __rglgen_glVertexAttrib3sARB; +RGLSYMGLVERTEXATTRIB3SVARBPROC __rglgen_glVertexAttrib3svARB; +RGLSYMGLVERTEXATTRIB4NBVARBPROC __rglgen_glVertexAttrib4NbvARB; +RGLSYMGLVERTEXATTRIB4NIVARBPROC __rglgen_glVertexAttrib4NivARB; +RGLSYMGLVERTEXATTRIB4NSVARBPROC __rglgen_glVertexAttrib4NsvARB; +RGLSYMGLVERTEXATTRIB4NUBARBPROC __rglgen_glVertexAttrib4NubARB; +RGLSYMGLVERTEXATTRIB4NUBVARBPROC __rglgen_glVertexAttrib4NubvARB; +RGLSYMGLVERTEXATTRIB4NUIVARBPROC __rglgen_glVertexAttrib4NuivARB; +RGLSYMGLVERTEXATTRIB4NUSVARBPROC __rglgen_glVertexAttrib4NusvARB; +RGLSYMGLVERTEXATTRIB4BVARBPROC __rglgen_glVertexAttrib4bvARB; +RGLSYMGLVERTEXATTRIB4DARBPROC __rglgen_glVertexAttrib4dARB; +RGLSYMGLVERTEXATTRIB4DVARBPROC __rglgen_glVertexAttrib4dvARB; +RGLSYMGLVERTEXATTRIB4FARBPROC __rglgen_glVertexAttrib4fARB; +RGLSYMGLVERTEXATTRIB4FVARBPROC __rglgen_glVertexAttrib4fvARB; +RGLSYMGLVERTEXATTRIB4IVARBPROC __rglgen_glVertexAttrib4ivARB; +RGLSYMGLVERTEXATTRIB4SARBPROC __rglgen_glVertexAttrib4sARB; +RGLSYMGLVERTEXATTRIB4SVARBPROC __rglgen_glVertexAttrib4svARB; +RGLSYMGLVERTEXATTRIB4UBVARBPROC __rglgen_glVertexAttrib4ubvARB; +RGLSYMGLVERTEXATTRIB4UIVARBPROC __rglgen_glVertexAttrib4uivARB; +RGLSYMGLVERTEXATTRIB4USVARBPROC __rglgen_glVertexAttrib4usvARB; +RGLSYMGLVERTEXATTRIBPOINTERARBPROC __rglgen_glVertexAttribPointerARB; +RGLSYMGLENABLEVERTEXATTRIBARRAYARBPROC __rglgen_glEnableVertexAttribArrayARB; +RGLSYMGLDISABLEVERTEXATTRIBARRAYARBPROC __rglgen_glDisableVertexAttribArrayARB; +RGLSYMGLGETVERTEXATTRIBDVARBPROC __rglgen_glGetVertexAttribdvARB; +RGLSYMGLGETVERTEXATTRIBFVARBPROC __rglgen_glGetVertexAttribfvARB; +RGLSYMGLGETVERTEXATTRIBIVARBPROC __rglgen_glGetVertexAttribivARB; +RGLSYMGLGETVERTEXATTRIBPOINTERVARBPROC __rglgen_glGetVertexAttribPointervARB; +RGLSYMGLBINDATTRIBLOCATIONARBPROC __rglgen_glBindAttribLocationARB; +RGLSYMGLGETACTIVEATTRIBARBPROC __rglgen_glGetActiveAttribARB; +RGLSYMGLGETATTRIBLOCATIONARBPROC __rglgen_glGetAttribLocationARB; +RGLSYMGLWINDOWPOS2DARBPROC __rglgen_glWindowPos2dARB; +RGLSYMGLWINDOWPOS2DVARBPROC __rglgen_glWindowPos2dvARB; +RGLSYMGLWINDOWPOS2FARBPROC __rglgen_glWindowPos2fARB; +RGLSYMGLWINDOWPOS2FVARBPROC __rglgen_glWindowPos2fvARB; +RGLSYMGLWINDOWPOS2IARBPROC __rglgen_glWindowPos2iARB; +RGLSYMGLWINDOWPOS2IVARBPROC __rglgen_glWindowPos2ivARB; +RGLSYMGLWINDOWPOS2SARBPROC __rglgen_glWindowPos2sARB; +RGLSYMGLWINDOWPOS2SVARBPROC __rglgen_glWindowPos2svARB; +RGLSYMGLWINDOWPOS3DARBPROC __rglgen_glWindowPos3dARB; +RGLSYMGLWINDOWPOS3DVARBPROC __rglgen_glWindowPos3dvARB; +RGLSYMGLWINDOWPOS3FARBPROC __rglgen_glWindowPos3fARB; +RGLSYMGLWINDOWPOS3FVARBPROC __rglgen_glWindowPos3fvARB; +RGLSYMGLWINDOWPOS3IARBPROC __rglgen_glWindowPos3iARB; +RGLSYMGLWINDOWPOS3IVARBPROC __rglgen_glWindowPos3ivARB; +RGLSYMGLWINDOWPOS3SARBPROC __rglgen_glWindowPos3sARB; +RGLSYMGLWINDOWPOS3SVARBPROC __rglgen_glWindowPos3svARB; +RGLSYMGLMULTITEXCOORD1BOESPROC __rglgen_glMultiTexCoord1bOES; +RGLSYMGLMULTITEXCOORD1BVOESPROC __rglgen_glMultiTexCoord1bvOES; +RGLSYMGLMULTITEXCOORD2BOESPROC __rglgen_glMultiTexCoord2bOES; +RGLSYMGLMULTITEXCOORD2BVOESPROC __rglgen_glMultiTexCoord2bvOES; +RGLSYMGLMULTITEXCOORD3BOESPROC __rglgen_glMultiTexCoord3bOES; +RGLSYMGLMULTITEXCOORD3BVOESPROC __rglgen_glMultiTexCoord3bvOES; +RGLSYMGLMULTITEXCOORD4BOESPROC __rglgen_glMultiTexCoord4bOES; +RGLSYMGLMULTITEXCOORD4BVOESPROC __rglgen_glMultiTexCoord4bvOES; +RGLSYMGLTEXCOORD1BOESPROC __rglgen_glTexCoord1bOES; +RGLSYMGLTEXCOORD1BVOESPROC __rglgen_glTexCoord1bvOES; +RGLSYMGLTEXCOORD2BOESPROC __rglgen_glTexCoord2bOES; +RGLSYMGLTEXCOORD2BVOESPROC __rglgen_glTexCoord2bvOES; +RGLSYMGLTEXCOORD3BOESPROC __rglgen_glTexCoord3bOES; +RGLSYMGLTEXCOORD3BVOESPROC __rglgen_glTexCoord3bvOES; +RGLSYMGLTEXCOORD4BOESPROC __rglgen_glTexCoord4bOES; +RGLSYMGLTEXCOORD4BVOESPROC __rglgen_glTexCoord4bvOES; +RGLSYMGLVERTEX2BOESPROC __rglgen_glVertex2bOES; +RGLSYMGLVERTEX2BVOESPROC __rglgen_glVertex2bvOES; +RGLSYMGLVERTEX3BOESPROC __rglgen_glVertex3bOES; +RGLSYMGLVERTEX3BVOESPROC __rglgen_glVertex3bvOES; +RGLSYMGLVERTEX4BOESPROC __rglgen_glVertex4bOES; +RGLSYMGLVERTEX4BVOESPROC __rglgen_glVertex4bvOES; +RGLSYMGLALPHAFUNCXOESPROC __rglgen_glAlphaFuncxOES; +RGLSYMGLCLEARCOLORXOESPROC __rglgen_glClearColorxOES; +RGLSYMGLCLEARDEPTHXOESPROC __rglgen_glClearDepthxOES; +RGLSYMGLCLIPPLANEXOESPROC __rglgen_glClipPlanexOES; +RGLSYMGLCOLOR4XOESPROC __rglgen_glColor4xOES; +RGLSYMGLDEPTHRANGEXOESPROC __rglgen_glDepthRangexOES; +RGLSYMGLFOGXOESPROC __rglgen_glFogxOES; +RGLSYMGLFOGXVOESPROC __rglgen_glFogxvOES; +RGLSYMGLFRUSTUMXOESPROC __rglgen_glFrustumxOES; +RGLSYMGLGETCLIPPLANEXOESPROC __rglgen_glGetClipPlanexOES; +RGLSYMGLGETFIXEDVOESPROC __rglgen_glGetFixedvOES; +RGLSYMGLGETTEXENVXVOESPROC __rglgen_glGetTexEnvxvOES; +RGLSYMGLGETTEXPARAMETERXVOESPROC __rglgen_glGetTexParameterxvOES; +RGLSYMGLLIGHTMODELXOESPROC __rglgen_glLightModelxOES; +RGLSYMGLLIGHTMODELXVOESPROC __rglgen_glLightModelxvOES; +RGLSYMGLLIGHTXOESPROC __rglgen_glLightxOES; +RGLSYMGLLIGHTXVOESPROC __rglgen_glLightxvOES; +RGLSYMGLLINEWIDTHXOESPROC __rglgen_glLineWidthxOES; +RGLSYMGLLOADMATRIXXOESPROC __rglgen_glLoadMatrixxOES; +RGLSYMGLMATERIALXOESPROC __rglgen_glMaterialxOES; +RGLSYMGLMATERIALXVOESPROC __rglgen_glMaterialxvOES; +RGLSYMGLMULTMATRIXXOESPROC __rglgen_glMultMatrixxOES; +RGLSYMGLMULTITEXCOORD4XOESPROC __rglgen_glMultiTexCoord4xOES; +RGLSYMGLNORMAL3XOESPROC __rglgen_glNormal3xOES; +RGLSYMGLORTHOXOESPROC __rglgen_glOrthoxOES; +RGLSYMGLPOINTPARAMETERXVOESPROC __rglgen_glPointParameterxvOES; +RGLSYMGLPOINTSIZEXOESPROC __rglgen_glPointSizexOES; +RGLSYMGLPOLYGONOFFSETXOESPROC __rglgen_glPolygonOffsetxOES; +RGLSYMGLROTATEXOESPROC __rglgen_glRotatexOES; +RGLSYMGLSAMPLECOVERAGEOESPROC __rglgen_glSampleCoverageOES; +RGLSYMGLSCALEXOESPROC __rglgen_glScalexOES; +RGLSYMGLTEXENVXOESPROC __rglgen_glTexEnvxOES; +RGLSYMGLTEXENVXVOESPROC __rglgen_glTexEnvxvOES; +RGLSYMGLTEXPARAMETERXOESPROC __rglgen_glTexParameterxOES; +RGLSYMGLTEXPARAMETERXVOESPROC __rglgen_glTexParameterxvOES; +RGLSYMGLTRANSLATEXOESPROC __rglgen_glTranslatexOES; +RGLSYMGLACCUMXOESPROC __rglgen_glAccumxOES; +RGLSYMGLBITMAPXOESPROC __rglgen_glBitmapxOES; +RGLSYMGLBLENDCOLORXOESPROC __rglgen_glBlendColorxOES; +RGLSYMGLCLEARACCUMXOESPROC __rglgen_glClearAccumxOES; +RGLSYMGLCOLOR3XOESPROC __rglgen_glColor3xOES; +RGLSYMGLCOLOR3XVOESPROC __rglgen_glColor3xvOES; +RGLSYMGLCOLOR4XVOESPROC __rglgen_glColor4xvOES; +RGLSYMGLCONVOLUTIONPARAMETERXOESPROC __rglgen_glConvolutionParameterxOES; +RGLSYMGLCONVOLUTIONPARAMETERXVOESPROC __rglgen_glConvolutionParameterxvOES; +RGLSYMGLEVALCOORD1XOESPROC __rglgen_glEvalCoord1xOES; +RGLSYMGLEVALCOORD1XVOESPROC __rglgen_glEvalCoord1xvOES; +RGLSYMGLEVALCOORD2XOESPROC __rglgen_glEvalCoord2xOES; +RGLSYMGLEVALCOORD2XVOESPROC __rglgen_glEvalCoord2xvOES; +RGLSYMGLFEEDBACKBUFFERXOESPROC __rglgen_glFeedbackBufferxOES; +RGLSYMGLGETCONVOLUTIONPARAMETERXVOESPROC __rglgen_glGetConvolutionParameterxvOES; +RGLSYMGLGETHISTOGRAMPARAMETERXVOESPROC __rglgen_glGetHistogramParameterxvOES; +RGLSYMGLGETLIGHTXOESPROC __rglgen_glGetLightxOES; +RGLSYMGLGETMAPXVOESPROC __rglgen_glGetMapxvOES; +RGLSYMGLGETMATERIALXOESPROC __rglgen_glGetMaterialxOES; +RGLSYMGLGETPIXELMAPXVPROC __rglgen_glGetPixelMapxv; +RGLSYMGLGETTEXGENXVOESPROC __rglgen_glGetTexGenxvOES; +RGLSYMGLGETTEXLEVELPARAMETERXVOESPROC __rglgen_glGetTexLevelParameterxvOES; +RGLSYMGLINDEXXOESPROC __rglgen_glIndexxOES; +RGLSYMGLINDEXXVOESPROC __rglgen_glIndexxvOES; +RGLSYMGLLOADTRANSPOSEMATRIXXOESPROC __rglgen_glLoadTransposeMatrixxOES; +RGLSYMGLMAP1XOESPROC __rglgen_glMap1xOES; +RGLSYMGLMAP2XOESPROC __rglgen_glMap2xOES; +RGLSYMGLMAPGRID1XOESPROC __rglgen_glMapGrid1xOES; +RGLSYMGLMAPGRID2XOESPROC __rglgen_glMapGrid2xOES; +RGLSYMGLMULTTRANSPOSEMATRIXXOESPROC __rglgen_glMultTransposeMatrixxOES; +RGLSYMGLMULTITEXCOORD1XOESPROC __rglgen_glMultiTexCoord1xOES; +RGLSYMGLMULTITEXCOORD1XVOESPROC __rglgen_glMultiTexCoord1xvOES; +RGLSYMGLMULTITEXCOORD2XOESPROC __rglgen_glMultiTexCoord2xOES; +RGLSYMGLMULTITEXCOORD2XVOESPROC __rglgen_glMultiTexCoord2xvOES; +RGLSYMGLMULTITEXCOORD3XOESPROC __rglgen_glMultiTexCoord3xOES; +RGLSYMGLMULTITEXCOORD3XVOESPROC __rglgen_glMultiTexCoord3xvOES; +RGLSYMGLMULTITEXCOORD4XVOESPROC __rglgen_glMultiTexCoord4xvOES; +RGLSYMGLNORMAL3XVOESPROC __rglgen_glNormal3xvOES; +RGLSYMGLPASSTHROUGHXOESPROC __rglgen_glPassThroughxOES; +RGLSYMGLPIXELMAPXPROC __rglgen_glPixelMapx; +RGLSYMGLPIXELSTOREXPROC __rglgen_glPixelStorex; +RGLSYMGLPIXELTRANSFERXOESPROC __rglgen_glPixelTransferxOES; +RGLSYMGLPIXELZOOMXOESPROC __rglgen_glPixelZoomxOES; +RGLSYMGLPRIORITIZETEXTURESXOESPROC __rglgen_glPrioritizeTexturesxOES; +RGLSYMGLRASTERPOS2XOESPROC __rglgen_glRasterPos2xOES; +RGLSYMGLRASTERPOS2XVOESPROC __rglgen_glRasterPos2xvOES; +RGLSYMGLRASTERPOS3XOESPROC __rglgen_glRasterPos3xOES; +RGLSYMGLRASTERPOS3XVOESPROC __rglgen_glRasterPos3xvOES; +RGLSYMGLRASTERPOS4XOESPROC __rglgen_glRasterPos4xOES; +RGLSYMGLRASTERPOS4XVOESPROC __rglgen_glRasterPos4xvOES; +RGLSYMGLRECTXOESPROC __rglgen_glRectxOES; +RGLSYMGLRECTXVOESPROC __rglgen_glRectxvOES; +RGLSYMGLTEXCOORD1XOESPROC __rglgen_glTexCoord1xOES; +RGLSYMGLTEXCOORD1XVOESPROC __rglgen_glTexCoord1xvOES; +RGLSYMGLTEXCOORD2XOESPROC __rglgen_glTexCoord2xOES; +RGLSYMGLTEXCOORD2XVOESPROC __rglgen_glTexCoord2xvOES; +RGLSYMGLTEXCOORD3XOESPROC __rglgen_glTexCoord3xOES; +RGLSYMGLTEXCOORD3XVOESPROC __rglgen_glTexCoord3xvOES; +RGLSYMGLTEXCOORD4XOESPROC __rglgen_glTexCoord4xOES; +RGLSYMGLTEXCOORD4XVOESPROC __rglgen_glTexCoord4xvOES; +RGLSYMGLTEXGENXOESPROC __rglgen_glTexGenxOES; +RGLSYMGLTEXGENXVOESPROC __rglgen_glTexGenxvOES; +RGLSYMGLVERTEX2XOESPROC __rglgen_glVertex2xOES; +RGLSYMGLVERTEX2XVOESPROC __rglgen_glVertex2xvOES; +RGLSYMGLVERTEX3XOESPROC __rglgen_glVertex3xOES; +RGLSYMGLVERTEX3XVOESPROC __rglgen_glVertex3xvOES; +RGLSYMGLVERTEX4XOESPROC __rglgen_glVertex4xOES; +RGLSYMGLVERTEX4XVOESPROC __rglgen_glVertex4xvOES; +RGLSYMGLQUERYMATRIXXOESPROC __rglgen_glQueryMatrixxOES; +RGLSYMGLCLEARDEPTHFOESPROC __rglgen_glClearDepthfOES; +RGLSYMGLCLIPPLANEFOESPROC __rglgen_glClipPlanefOES; +RGLSYMGLDEPTHRANGEFOESPROC __rglgen_glDepthRangefOES; +RGLSYMGLFRUSTUMFOESPROC __rglgen_glFrustumfOES; +RGLSYMGLGETCLIPPLANEFOESPROC __rglgen_glGetClipPlanefOES; +RGLSYMGLORTHOFOESPROC __rglgen_glOrthofOES; +RGLSYMGLIMAGETRANSFORMPARAMETERIHPPROC __rglgen_glImageTransformParameteriHP; +RGLSYMGLIMAGETRANSFORMPARAMETERFHPPROC __rglgen_glImageTransformParameterfHP; +RGLSYMGLIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glImageTransformParameterivHP; +RGLSYMGLIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glImageTransformParameterfvHP; +RGLSYMGLGETIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glGetImageTransformParameterivHP; +RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glGetImageTransformParameterfvHP;
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/rglgen.c
Added
@@ -0,0 +1,45 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <string.h> + +#include <glsym/rglgen.h> +#include <glsym/glsym.h> + +void rglgen_resolve_symbols_custom(rglgen_proc_address_t proc, + const struct rglgen_sym_map *map) +{ + for (; map->sym; map++) + { + rglgen_func_t func = proc(map->sym); + memcpy(map->ptr, &func, sizeof(func)); + } +} + +void rglgen_resolve_symbols(rglgen_proc_address_t proc) +{ + if (!proc) + return; + + rglgen_resolve_symbols_custom(proc, rglgen_symbol_map); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/rglgen.py
Added
@@ -0,0 +1,147 @@ +#!/usr/bin/env python3 + +""" + License statement applies to this file (glgen.py) only. + + Permission is hereby granted, free of charge, + to any person obtaining a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import sys +import os +import re + +banned_ext = [ 'AMD', 'APPLE', 'NV', 'NVX', 'ATI', '3DLABS', 'SUN', 'SGI', 'SGIX', 'SGIS', 'INTEL', '3DFX', 'IBM', 'MESA', 'GREMEDY', 'OML', 'PGI', 'I3D', 'INGL', 'MTX', 'QCOM', 'IMG', 'ANGLE', 'SUNX', 'INGR' ] + +def noext(sym): + for ext in banned_ext: + if sym.endswith(ext): + return False + return True + +def fix_multiline_functions(lines): + fixed_lines = [] + temp_lines = [] + for line in lines: + if line.count('(') > line.count(')'): + temp_lines.append(line) + else: + if len(temp_lines) > 0: + if line.count(')') > line.count('('): + temp_lines.append(line) + fixed_line = re.sub(' +',' ', ''.join(temp_lines).replace('\n','').replace('\t','')) + fixed_lines.append(fixed_line) + temp_lines = [] + else: + temp_lines.append(line) + else: + fixed_lines.append(line) + return fixed_lines + +def find_gl_symbols(lines): + typedefs = [] + syms = [] + for line in lines: + m = re.search(r'^typedef.+PFN(\S+)PROC.+$', line) + g = re.search(r'^.+(gl\S+)\W*\(.+\).*$', line) + if m and noext(m.group(1)): + typedefs.append(m.group(0).replace('PFN', 'RGLSYM').replace('GLDEBUGPROC', 'RGLGENGLDEBUGPROC')) + if g and noext(g.group(1)): + syms.append(g.group(1)) + return (typedefs, syms) + +def generate_defines(gl_syms): + res = [] + for line in gl_syms: + res.append('#define {} __rglgen_{}'.format(line, line)) + return res + +def generate_declarations(gl_syms): + return ['RGLSYM' + x.upper() + 'PROC ' + '__rglgen_' + x + ';' for x in gl_syms] + +def generate_macros(gl_syms): + return [' SYM(' + x.replace('gl', '') + '),' for x in gl_syms] + +def dump(f, lines): + f.write('\n'.join(lines)) + f.write('\n\n') + +if __name__ == '__main__': + + if len(sys.argv) > 4: + for banned in sys.argv[4:]: + banned_ext.append(banned) + + with open(sys.argv[1], 'r') as f: + lines = fix_multiline_functions(f.readlines()) + typedefs, syms = find_gl_symbols(lines) + + overrides = generate_defines(syms) + declarations = generate_declarations(syms) + externs = ['extern ' + x for x in declarations] + + macros = generate_macros(syms) + + with open(sys.argv[2], 'w') as f: + f.write('#ifndef RGLGEN_DECL_H__\n') + f.write('#define RGLGEN_DECL_H__\n') + + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + + f.write('#ifdef GL_APIENTRY\n') + f.write('typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('#else\n') + f.write('#ifndef APIENTRY\n') + f.write('#define APIENTRY\n') + f.write('#endif\n') + f.write('#ifndef APIENTRYP\n') + f.write('#define APIENTRYP APIENTRY *\n') + f.write('#endif\n') + f.write('typedef void (APIENTRY *RGLGENGLDEBUGPROCARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('typedef void (APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('#endif\n') + + f.write('#ifndef GL_OES_EGL_image\n') + f.write('typedef void *GLeglImageOES;\n') + f.write('#endif\n') + + f.write('#if !defined(GL_OES_fixed_point) && !defined(HAVE_OPENGLES2)\n') + f.write('typedef GLint GLfixed;\n') + f.write('#endif\n') + + dump(f, typedefs) + dump(f, overrides) + dump(f, externs) + + f.write('struct rglgen_sym_map { const char *sym; void *ptr; };\n') + f.write('extern const struct rglgen_sym_map rglgen_symbol_map[];\n') + + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + + f.write('#endif\n') + + with open(sys.argv[3], 'w') as f: + f.write('#include "glsym/glsym.h"\n') + f.write('#include <stddef.h>\n') + f.write('#define SYM(x) { "gl" #x, &(gl##x) }\n') + f.write('const struct rglgen_sym_map rglgen_symbol_map[] = {\n') + dump(f, macros) + f.write(' { NULL, NULL },\n') + f.write('};\n') + dump(f, declarations)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/glsym/xglgen.py
Added
@@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +""" + License statement applies to this file (xglgen.py) only. + + Permission is hereby granted, free of charge, + to any person obtaining a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import sys +import os +import re + +banned_ext = [ 'AMD', 'APPLE', 'NV', 'NVX', 'ATI', '3DLABS', 'SUN', 'SGI', 'SGIX', 'SGIS', 'INTEL', '3DFX', 'IBM', 'MESA', 'GREMEDY', 'OML', 'PGI', 'I3D', 'INGL', 'MTX', 'QCOM', 'IMG', 'ANGLE', 'SUNX', 'INGR' ] + +def noext(sym): + for ext in banned_ext: + if sym.endswith(ext): + return False + return True + +def fix_multiline_functions(lines): + fixed_lines = [] + temp_lines = [] + for line in lines: + if line.count('(') > line.count(')'): + temp_lines.append(line) + else: + if len(temp_lines) > 0: + if line.count(')') > line.count('('): + temp_lines.append(line) + fixed_line = re.sub(' +',' ', ''.join(temp_lines).replace('\n','').replace('\t','')) + fixed_lines.append(fixed_line) + temp_lines = [] + else: + temp_lines.append(line) + else: + fixed_lines.append(line) + return fixed_lines + +def find_gl_symbols(lines): + typedefs = [] + syms = [] + for line in lines: + # Note this doesn't work automated; this script is designed as a helper + m = re.search(r'^typedef.+PFN(\S+)PROC.+$', line) + g = re.search(r'^GLAPI\s(.+)\s(.+)\s(gl\S+)\W*\((.+)\).*', line) + if g and noext(g.group(3)): + typedefs.append('typedef ' + g.group(1) + ' (APIENTRYP RGLSYM' + g.group(3).upper() + 'PROC) (' + g.group(4) + ');') + syms.append(g.group(3)) + + return (typedefs, syms) + +def generate_defines(gl_syms): + res = [] + for line in gl_syms: + res.append('#define {} __rglgen_{}'.format(line, line)) + return res + +def generate_declarations(gl_syms): + return ['RGLSYM' + x.upper() + 'PROC ' + x + ';' for x in gl_syms] + +def generate_macros(gl_syms): + return [' SYM(' + x.replace('gl', '') + '),' for x in gl_syms] + +def dump(f, lines): + f.write('\n'.join(lines)) + f.write('\n\n') + +if __name__ == '__main__': + + if len(sys.argv) > 4: + for banned in sys.argv[4:]: + banned_ext.append(banned) + + with open(sys.argv[1], 'r') as f: + lines = fix_multiline_functions(f.readlines()) + typedefs, syms = find_gl_symbols(lines) + + overrides = generate_defines(syms) + declarations = generate_declarations(syms) + externs = ['extern ' + x for x in declarations] + + macros = generate_macros(syms) + + with open(sys.argv[2], 'w') as f: + f.write('#ifndef RGLGEN_DECL_H__\n') + f.write('#define RGLGEN_DECL_H__\n') + + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + + f.write('#ifdef GL_APIENTRY\n') + f.write('typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('typedef void (GL_APIENTRY *RGLGENGLDEBUGPROCKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('#else\n') + f.write('#ifndef APIENTRY\n') + f.write('#define APIENTRY\n') + f.write('#endif\n') + f.write('#ifndef APIENTRYP\n') + f.write('#define APIENTRYP APIENTRY *\n') + f.write('#endif\n') + f.write('typedef void (APIENTRY *RGLGENGLDEBUGPROCARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('typedef void (APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*);\n') + f.write('#endif\n') + + f.write('#ifndef GL_OES_EGL_image\n') + f.write('typedef void *GLeglImageOES;\n') + f.write('#endif\n') + + f.write('#if !defined(GL_OES_fixed_point) && !defined(HAVE_OPENGLES2)\n') + f.write('typedef GLint GLfixed;\n') + f.write('#endif\n') + + f.write('#if defined(OSX) && !defined(MAC_OS_X_VERSION_10_7)\n') + f.write('typedef long long int GLint64;\n') + f.write('typedef unsigned long long int GLuint64;\n') + f.write('typedef unsigned long long int GLuint64EXT;\n') + f.write('typedef struct __GLsync *GLsync;\n') + f.write('#endif\n') + + dump(f, typedefs) + dump(f, overrides) + dump(f, externs) + + f.write('struct rglgen_sym_map { const char *sym; void *ptr; };\n') + f.write('extern const struct rglgen_sym_map rglgen_symbol_map[];\n') + + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + + f.write('#endif\n') + + with open(sys.argv[3], 'w') as f: + f.write('#include "glsym/glsym.h"\n') + f.write('#include <stddef.h>\n') + f.write('#define SYM(x) { "gl" #x, &(gl##x) }\n') + f.write('const struct rglgen_sym_map rglgen_symbol_map[] = {\n') + dump(f, macros) + f.write(' { NULL, NULL },\n') + f.write('};\n') + dump(f, declarations)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/hash/lrc_hash.c
Added
@@ -0,0 +1,576 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (lrc_hash.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <string.h> +#include <stdio.h> +#ifdef _WIN32 +#include <io.h> +#else +#include <unistd.h> +#endif +#include <lrc_hash.h> +#include <retro_miscellaneous.h> +#include <retro_endianness.h> +#include <streams/file_stream.h> + +#define LSL32(x, n) ((uint32_t)(x) << (n)) +#define LSR32(x, n) ((uint32_t)(x) >> (n)) +#define ROR32(x, n) (LSR32(x, n) | LSL32(x, 32 - (n))) + +/* First 32 bits of the fractional parts of the square roots of the first 8 primes 2..19 */ +static const uint32_t T_H[8] = { + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, +}; + +/* First 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311 */ +static const uint32_t T_K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +/* SHA256 implementation from bSNES. Written by valditx. */ + +struct sha256_ctx +{ + union + { + uint8_t u8[64]; + uint32_t u32[16]; + } in; + unsigned inlen; + + uint32_t w[64]; + uint32_t h[8]; + uint64_t len; +}; + +static void sha256_init(struct sha256_ctx *p) +{ + memset(p, 0, sizeof(struct sha256_ctx)); + memcpy(p->h, T_H, sizeof(T_H)); +} + +static void sha256_block(struct sha256_ctx *p) +{ + unsigned i; + uint32_t s0, s1; + uint32_t a, b, c, d, e, f, g, h; + + for (i = 0; i < 16; i++) + p->w[i] = load32be(p->in.u32 + i); + + for (i = 16; i < 64; i++) + { + s0 = ROR32(p->w[i - 15], 7) ^ ROR32(p->w[i - 15], 18) ^ LSR32(p->w[i - 15], 3); + s1 = ROR32(p->w[i - 2], 17) ^ ROR32(p->w[i - 2], 19) ^ LSR32(p->w[i - 2], 10); + p->w[i] = p->w[i - 16] + s0 + p->w[i - 7] + s1; + } + + a = p->h[0]; b = p->h[1]; c = p->h[2]; d = p->h[3]; + e = p->h[4]; f = p->h[5]; g = p->h[6]; h = p->h[7]; + + for (i = 0; i < 64; i++) + { + uint32_t t1, t2, maj, ch; + + s0 = ROR32(a, 2) ^ ROR32(a, 13) ^ ROR32(a, 22); + maj = (a & b) ^ (a & c) ^ (b & c); + t2 = s0 + maj; + s1 = ROR32(e, 6) ^ ROR32(e, 11) ^ ROR32(e, 25); + ch = (e & f) ^ (~e & g); + t1 = h + s1 + ch + T_K[i] + p->w[i]; + + h = g; + g = f; + f = e; + e = d + t1; + d = c; + c = b; + b = a; + a = t1 + t2; + } + + p->h[0] += a; p->h[1] += b; p->h[2] += c; p->h[3] += d; + p->h[4] += e; p->h[5] += f; p->h[6] += g; p->h[7] += h; + + /* Next block */ + p->inlen = 0; +} + +static void sha256_chunk(struct sha256_ctx *p, + const uint8_t *s, unsigned len) +{ + p->len += len; + + while (len) + { + unsigned l = 64 - p->inlen; + + if (len < l) + l = len; + + memcpy(p->in.u8 + p->inlen, s, l); + + s += l; + p->inlen += l; + len -= l; + + if (p->inlen == 64) + sha256_block(p); + } +} + +static void sha256_final(struct sha256_ctx *p) +{ + uint64_t len; + p->in.u8[p->inlen++] = 0x80; + + if (p->inlen > 56) + { + memset(p->in.u8 + p->inlen, 0, 64 - p->inlen); + sha256_block(p); + } + + memset(p->in.u8 + p->inlen, 0, 56 - p->inlen); + + len = p->len << 3; + store32be(p->in.u32 + 14, (uint32_t)(len >> 32)); + store32be(p->in.u32 + 15, (uint32_t)len); + sha256_block(p); +} + +static void sha256_subhash(struct sha256_ctx *p, uint32_t *t) +{ + unsigned i; + for (i = 0; i < 8; i++) + store32be(t++, p->h[i]); +} + +/** + * sha256_hash: + * @s : Output. + * @in : Input. + * @size : Size of @s. + * + * Hashes SHA256 and outputs a human readable string. + **/ +void sha256_hash(char *s, const uint8_t *in, size_t size) +{ + unsigned i; + struct sha256_ctx sha; + + union + { + uint32_t u32[8]; + uint8_t u8[32]; + } shahash; + + sha256_init(&sha); + sha256_chunk(&sha, in, (unsigned)size); + sha256_final(&sha); + sha256_subhash(&sha, shahash.u32); + + for (i = 0; i < 32; i++) + snprintf(s + 2 * i, 3, "%02x", (unsigned)shahash.u8[i]); +} + +#ifndef HAVE_ZLIB +/* Zlib CRC32. */ +static const uint32_t crc32_hash_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +uint32_t crc32_adjust(uint32_t checksum, uint8_t input) +{ + return ((checksum >> 8) & 0x00ffffff) ^ crc32_hash_table[(checksum ^ input) & 0xff]; +} + +uint32_t crc32_calculate(const uint8_t *data, size_t length) +{ + size_t i; + uint32_t checksum = ~0; + for (i = 0; i < length; i++) + checksum = crc32_adjust(checksum, data[i]); + return ~checksum; +} +#endif + +/* SHA-1 implementation. */ + +/* + * sha1.c + * + * Copyright (C) 1998, 2009 + * Paul E. Jones <paulej@packetizer.com> + * All Rights Reserved + * + ***************************************************************************** + * $Id: sha1.c 12 2009-06-22 19:34:25Z paulej $ + ***************************************************************************** + * + * Description: + * This file implements the Secure Hashing Standard as defined + * in FIPS PUB 180-1 published April 17, 1995. + * + * The Secure Hashing Standard, which uses the Secure Hashing + * Algorithm (SHA), produces a 160-bit message digest for a + * given data stream. In theory, it is highly improbable that + * two messages will produce the same message digest. Therefore, + * this algorithm can serve as a means of providing a "fingerprint" + * for a message. + * + * Portability Issues: + * SHA-1 is defined in terms of 32-bit "words". This code was + * written with the expectation that the processor has at least + * a 32-bit machine word size. If the machine word size is larger, + * the code should still function properly. One caveat to that + * is that the input functions taking characters and character + * arrays assume that only 8 bits of information are stored in each + * character. + * + * Caveats: + * SHA-1 is designed to work with messages less than 2^64 bits + * long. Although SHA-1 allows a message digest to be generated for + * messages of any number of bits less than 2^64, this + * implementation only works with messages with a length that is a + * multiple of the size of an 8-bit character. + * + */ + +/* Define the circular shift macro */ +#define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF) | ((word) >> (32-(bits)))) + +struct sha1_context +{ + unsigned Message_Digest[5]; /* Message Digest (output) */ + + unsigned Length_Low; /* Message length in bits */ + unsigned Length_High; /* Message length in bits */ + + unsigned char Message_Block[64]; /* 512-bit message blocks */ + int Message_Block_Index; /* Index into message block array */ + + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corruped? */ +}; + + +static void SHA1Reset(struct sha1_context *context) +{ + if (!context) + return; + + context->Length_Low = 0; + context->Length_High = 0; + context->Message_Block_Index = 0; + + context->Message_Digest[0] = 0x67452301; + context->Message_Digest[1] = 0xEFCDAB89; + context->Message_Digest[2] = 0x98BADCFE; + context->Message_Digest[3] = 0x10325476; + context->Message_Digest[4] = 0xC3D2E1F0; + + context->Computed = 0; + context->Corrupted = 0; +} + +static void SHA1ProcessMessageBlock(struct sha1_context *context) +{ + const unsigned K[] = /* Constants defined in SHA-1 */ + { + 0x5A827999, + 0x6ED9EBA1, + 0x8F1BBCDC, + 0xCA62C1D6 + }; + int t; /* Loop counter */ + unsigned temp; /* Temporary word value */ + unsigned W[80]; /* Word sequence */ + unsigned A, B, C, D, E; /* Word buffers */ + + /* Initialize the first 16 words in the array W */ + for (t = 0; t < 16; t++) + { + W[t] = ((unsigned) context->Message_Block[t * 4]) << 24; + W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16; + W[t] |= ((unsigned) context->Message_Block[t * 4 + 2]) << 8; + W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]); + } + + for (t = 16; t < 80; t++) + W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); + + A = context->Message_Digest[0]; + B = context->Message_Digest[1]; + C = context->Message_Digest[2]; + D = context->Message_Digest[3]; + E = context->Message_Digest[4]; + + for (t = 0; t < 20; t++) + { + temp = SHA1CircularShift(5,A) + + ((B & C) | ((~B) & D)) + E + W[t] + K[0]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for (t = 20; t < 40; t++) + { + temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for (t = 40; t < 60; t++) + { + temp = SHA1CircularShift(5,A) + + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + for (t = 60; t < 80; t++) + { + temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = SHA1CircularShift(30,B); + B = A; + A = temp; + } + + context->Message_Digest[0] = + (context->Message_Digest[0] + A) & 0xFFFFFFFF; + context->Message_Digest[1] = + (context->Message_Digest[1] + B) & 0xFFFFFFFF; + context->Message_Digest[2] = + (context->Message_Digest[2] + C) & 0xFFFFFFFF; + context->Message_Digest[3] = + (context->Message_Digest[3] + D) & 0xFFFFFFFF; + context->Message_Digest[4] = + (context->Message_Digest[4] + E) & 0xFFFFFFFF; + + context->Message_Block_Index = 0; +} + +static void SHA1PadMessage(struct sha1_context *context) +{ + if (!context) + return; + + /* + * Check to see if the current message block is too small to hold + * the initial padding bits and length. If so, we will pad the + * block, process it, and then continue padding into a second + * block. + */ + context->Message_Block[context->Message_Block_Index++] = 0x80; + + if (context->Message_Block_Index > 55) + { + while (context->Message_Block_Index < 64) + context->Message_Block[context->Message_Block_Index++] = 0; + + SHA1ProcessMessageBlock(context); + } + + while (context->Message_Block_Index < 56) + context->Message_Block[context->Message_Block_Index++] = 0; + + /* Store the message length as the last 8 octets */ + context->Message_Block[56] = (context->Length_High >> 24) & 0xFF; + context->Message_Block[57] = (context->Length_High >> 16) & 0xFF; + context->Message_Block[58] = (context->Length_High >> 8) & 0xFF; + context->Message_Block[59] = (context->Length_High) & 0xFF; + context->Message_Block[60] = (context->Length_Low >> 24) & 0xFF; + context->Message_Block[61] = (context->Length_Low >> 16) & 0xFF; + context->Message_Block[62] = (context->Length_Low >> 8) & 0xFF; + context->Message_Block[63] = (context->Length_Low) & 0xFF; + + SHA1ProcessMessageBlock(context); +} + +static int SHA1Result(struct sha1_context *context) +{ + if (context->Corrupted) + return 0; + + if (!context->Computed) + { + SHA1PadMessage(context); + context->Computed = 1; + } + + return 1; +} + +static void SHA1Input(struct sha1_context *context, + const unsigned char *message_array, + unsigned length) +{ + if (!length) + return; + + if (context->Computed || context->Corrupted) + { + context->Corrupted = 1; + return; + } + + while (length-- && !context->Corrupted) + { + context->Message_Block[context->Message_Block_Index++] = + (*message_array & 0xFF); + + context->Length_Low += 8; + /* Force it to 32 bits */ + context->Length_Low &= 0xFFFFFFFF; + if (context->Length_Low == 0) + { + context->Length_High++; + /* Force it to 32 bits */ + context->Length_High &= 0xFFFFFFFF; + if (context->Length_High == 0) + context->Corrupted = 1; /* Message is too long */ + } + + if (context->Message_Block_Index == 64) + SHA1ProcessMessageBlock(context); + + message_array++; + } +} + +int sha1_calculate(const char *path, char *result) +{ + struct sha1_context sha; + unsigned char buff[4096]; + int rv = 1; + RFILE *fd = filestream_open(path, + RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + if (!fd) + goto error; + + buff[0] = '\0'; + + SHA1Reset(&sha); + + do + { + rv = (int)filestream_read(fd, buff, 4096); + if (rv < 0) + goto error; + + SHA1Input(&sha, buff, rv); + } while (rv); + + if (!SHA1Result(&sha)) + goto error; + + sprintf(result, "%08X%08X%08X%08X%08X", + sha.Message_Digest[0], + sha.Message_Digest[1], + sha.Message_Digest[2], + sha.Message_Digest[3], sha.Message_Digest[4]); + + filestream_close(fd); + return 0; + +error: + if (fd) + filestream_close(fd); + return -1; +} + +uint32_t djb2_calculate(const char *str) +{ + const unsigned char *aux = (const unsigned char*)str; + uint32_t hash = 5381; + + while ( *aux ) + hash = ( hash << 5 ) + hash + *aux++; + + return hash; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/array
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/array/rbuf.h
Added
@@ -0,0 +1,120 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rbuf.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_ARRAY_RBUF_H__ +#define __LIBRETRO_SDK_ARRAY_RBUF_H__ + +/* + * This file implements stretchy buffers as invented (?) by Sean Barrett. + * Based on the implementation from the public domain Bitwise project + * by Per Vognsen - https://github.com/pervognsen/bitwise + * + * It's a super simple type safe dynamic array for C with no need + * to predeclare any type or anything. + * The first time an element is added, memory for 16 elements are allocated. + * Then every time length is about to exceed capacity, capacity is doubled. + * + * Be careful not to supply modifying statements to the macro arguments. + * Something like RBUF_REMOVE(buf, i--); would have unintended results. + * + * Sample usage: + * + * mytype_t* buf = NULL; + * RBUF_PUSH(buf, some_element); + * RBUF_PUSH(buf, other_element); + * -- now RBUF_LEN(buf) == 2, buf[0] == some_element, buf[1] == other_element + * + * -- Free allocated memory: + * RBUF_FREE(buf); + * -- now buf == NULL, RBUF_LEN(buf) == 0, RBUF_CAP(buf) == 0 + * + * -- Explicitly increase allocated memory and set capacity: + * RBUF_FIT(buf, 100); + * -- now RBUF_LEN(buf) == 0, RBUF_CAP(buf) == 100 + * + * -- Resize buffer (does not initialize or zero memory!) + * RBUF_RESIZE(buf, 200); + * -- now RBUF_LEN(buf) == 200, RBUF_CAP(buf) == 200 + * + * -- To handle running out of memory: + * bool ran_out_of_memory = !RBUF_TRYFIT(buf, 1000); + * -- before RESIZE or PUSH. When out of memory, buf will stay unmodified. + */ + +#include <retro_math.h> /* for MAX */ +#include <stdlib.h> /* for malloc, realloc */ + +#define RBUF__HDR(b) (((struct rbuf__hdr *)(b))-1) + +#define RBUF_LEN(b) ((b) ? RBUF__HDR(b)->len : 0) +#define RBUF_CAP(b) ((b) ? RBUF__HDR(b)->cap : 0) +#define RBUF_END(b) ((b) + RBUF_LEN(b)) +#define RBUF_SIZEOF(b) ((b) ? RBUF_LEN(b)*sizeof(*b) : 0) + +#define RBUF_FREE(b) ((b) ? (free(RBUF__HDR(b)), (b) = NULL) : 0) +#define RBUF_FIT(b, n) ((size_t)(n) <= RBUF_CAP(b) ? 0 : (*(void**)(&(b)) = rbuf__grow((b), (n), sizeof(*(b))))) +#define RBUF_PUSH(b, val) (RBUF_FIT((b), 1 + RBUF_LEN(b)), (b)[RBUF__HDR(b)->len++] = (val)) +#define RBUF_POP(b) (b)[--RBUF__HDR(b)->len] +#define RBUF_RESIZE(b, sz) (RBUF_FIT((b), (sz)), ((b) ? RBUF__HDR(b)->len = (sz) : 0)) +#define RBUF_CLEAR(b) ((b) ? RBUF__HDR(b)->len = 0 : 0) +#define RBUF_TRYFIT(b, n) (RBUF_FIT((b), (n)), (((b) && RBUF_CAP(b) >= (size_t)(n)) || !(n))) +#define RBUF_REMOVE(b, idx) memmove((b) + (idx), (b) + (idx) + 1, (--RBUF__HDR(b)->len - (idx)) * sizeof(*(b))) + +struct rbuf__hdr +{ + size_t len; + size_t cap; +}; + +#ifdef __GNUC__ +__attribute__((__unused__)) +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4505) //unreferenced local function has been removed +#endif +static void *rbuf__grow(void *buf, + size_t new_len, size_t elem_size) +{ + struct rbuf__hdr *new_hdr; + size_t new_cap = MAX(2 * RBUF_CAP(buf), MAX(new_len, 16)); + size_t new_size = sizeof(struct rbuf__hdr) + new_cap*elem_size; + if (buf) + { + new_hdr = (struct rbuf__hdr *)realloc(RBUF__HDR(buf), new_size); + if (!new_hdr) + return buf; /* out of memory, return unchanged */ + } + else + { + new_hdr = (struct rbuf__hdr *)malloc(new_size); + if (!new_hdr) + return NULL; /* out of memory */ + new_hdr->len = 0; + } + new_hdr->cap = new_cap; + return new_hdr + 1; +} +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/array/rhmap.h
Added
@@ -0,0 +1,284 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rhmap.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_ARRAY_RHMAP_H__ +#define __LIBRETRO_SDK_ARRAY_RHMAP_H__ + +/* + * This file implements a hash map with 32-bit keys. + * Based on the implementation from the public domain Bitwise project + * by Per Vognsen - https://github.com/pervognsen/bitwise + * + * It's a super simple type safe hash map for C with no need + * to predeclare any type or anything. + * Will always allocate memory for twice the amount of max elements + * so larger structs should be stored as pointers or indices to an array. + * Can be used in C++ with POD types (without any constructor/destructor). + * + * Be careful not to supply modifying statements to the macro arguments. + * Something like RHMAP_FIT(map, i++); would have unintended results. + * + * Sample usage: + * + * -- Set 2 elements with string keys and mytype_t values: + * mytype_t* map = NULL; + * RHMAP_SET_STR(map, "foo", foo_element); + * RHMAP_SET_STR(map, "bar", bar_element); + * -- now RHMAP_LEN(map) == 2, RHMAP_GET_STR(map, "foo") == foo_element + * + * -- Check if keys exist: + * bool has_foo = RHMAP_HAS_STR(map, "foo"); + * bool has_baz = RHMAP_HAS_STR(map, "baz"); + * -- now has_foo == true, has_baz == false + * + * -- Removing a key: + * bool removed = RHMAP_DEL_STR(map, "bar"); + * bool removed_again = RHMAP_DEL_STR(map, "bar"); + * -- now RHMAP_LEN(map) == 1, removed == true, removed_again == false + * + * -- Add/modify via pointer: + * mytype_t* p_elem = RHMAP_PTR_STR(map, "qux"); + * p_elem->a = 123; + * -- New keys initially have memory uninitialized + * -- Pointers can get invalidated when a key is added/removed + * + * -- Looking up the index for a given key: + * ptrdiff_t idx_foo = RHMAP_IDX_STR(map, "foo"); + * ptrdiff_t idx_invalid = RHMAP_IDX_STR(map, "invalid"); + * -- now idx_foo >= 0, idx_invalid == -1, map[idx_foo] == foo_element + * -- Indices can change when a key is added/removed + * + * -- Clear all elements (keep memory allocated): + * RHMAP_CLEAR(map); + * -- now RHMAP_LEN(map) == 0, RHMAP_CAP(map) == 16 + * + * -- Reserve memory for at least N elements: + * RHMAP_FIT(map, 30); + * -- now RHMAP_LEN(map) == 0, RHMAP_CAP(map) == 64 + * + * -- Add elements with custom hash keys: + * RHMAP_SET(map, my_uint32_hash(key1), some_element); + * RHMAP_SET(map, my_uint32_hash(key2), other_element); + * -- now RHMAP_LEN(map) == 2, _GET/_HAS/_DEL/_PTR/_IDX also exist + * + * -- Iterate elements (random order, order can change on insert): + * for (size_t i = 0, cap = RHMAP_CAP(map); i != cap, i++) + * if (RHMAP_KEY(map, i)) + * ------ here map[i] is the value of key RHMAP_KEY(map, i) + * + * -- Set a custom null value (is zeroed by default): + * RHMAP_SETNULLVAL(map, map_null); + * -- now RHMAP_GET_STR(map, "invalid") == map_null + * + * -- Free allocated memory: + * RHMAP_FREE(map); + * -- now map == NULL, RHMAP_LEN(map) == 0, RHMAP_CAP(map) == 0 + * + * -- To handle running out of memory: + * bool ran_out_of_memory = !RHMAP_TRYFIT(map, 1000); + * -- before setting an element (with SET, PTR or NULLVAL). + * -- When out of memory, map will stay unmodified. + * + */ + +#include <stdlib.h> /* for malloc, realloc */ +#include <string.h> /* for memcpy, memset */ +#include <stddef.h> /* for ptrdiff_t, size_t */ +#include <stdint.h> /* for uint32_t */ + +#define RHMAP_LEN(b) ((b) ? RHMAP__HDR(b)->len : 0) +#define RHMAP_MAX(b) ((b) ? RHMAP__HDR(b)->maxlen : 0) +#define RHMAP_CAP(b) ((b) ? RHMAP__HDR(b)->maxlen + 1 : 0) +#define RHMAP_KEY(b, idx) (RHMAP__HDR(b)->keys[idx]) +#define RHMAP_KEY_STR(b, idx) (RHMAP__HDR(b)->key_strs[idx]) +#define RHMAP_SETNULLVAL(b, val) (RHMAP__FIT1(b), b[-1] = (val)) +#define RHMAP_CLEAR(b) ((b) ? (memset(RHMAP__HDR(b)->keys, 0, RHMAP_CAP(b) * sizeof(uint32_t)), RHMAP__HDR(b)->len = 0) : 0) +#define RHMAP_FREE(b) ((b) ? (rhmap__free(RHMAP__HDR(b)), (b) = NULL) : 0) +#define RHMAP_FIT(b, n) ((!(n) || ((b) && (size_t)(n) * 2 <= RHMAP_MAX(b))) ? 0 : RHMAP__GROW(b, n)) +#define RHMAP_TRYFIT(b, n) (RHMAP_FIT((b), (n)), (!(n) || ((b) && (size_t)(n) * 2 <= RHMAP_MAX(b)))) + +#define RHMAP_SET(b, key, val) RHMAP_SET_FULL(b, key, NULL, val) +#define RHMAP_GET(b, key) RHMAP_GET_FULL(b, key, NULL) +#define RHMAP_HAS(b, key) RHMAP_HAS_FULL(b, key, NULL) +#define RHMAP_DEL(b, key) RHMAP_DEL_FULL(b, key, NULL) +#define RHMAP_PTR(b, key) RHMAP_PTR_FULL(b, key, NULL) +#define RHMAP_IDX(b, key) RHMAP_IDX_FULL(b, key, NULL) + +#ifdef __GNUC__ +#define RHMAP__UNUSED __attribute__((__unused__)) +#else +#define RHMAP__UNUSED +#endif + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4505) //unreferenced local function has been removed +#endif + +#define RHMAP_SET_FULL(b, key, str, val) (RHMAP__FIT1(b), b[rhmap__idx(RHMAP__HDR(b), (key), (str), 1, 0)] = (val)) +#define RHMAP_GET_FULL(b, key, str) (RHMAP__FIT1(b), b[rhmap__idx(RHMAP__HDR(b), (key), (str), 0, 0)]) +#define RHMAP_HAS_FULL(b, key, str) ((b) ? rhmap__idx(RHMAP__HDR(b), (key), (str), 0, 0) != -1 : 0) +#define RHMAP_DEL_FULL(b, key, str) ((b) ? rhmap__idx(RHMAP__HDR(b), (key), (str), 0, sizeof(*(b))) != -1 : 0) +#define RHMAP_PTR_FULL(b, key, str) (RHMAP__FIT1(b), &b[rhmap__idx(RHMAP__HDR(b), (key), (str), 1, 0)]) +#define RHMAP_IDX_FULL(b, key, str) ((b) ? rhmap__idx(RHMAP__HDR(b), (key), (str), 0, 0) : -1) + +#define RHMAP_SET_STR(b, string_key, val) RHMAP_SET_FULL(b, rhmap_hash_string(string_key), string_key, val) +#define RHMAP_GET_STR(b, string_key) RHMAP_GET_FULL(b, rhmap_hash_string(string_key), string_key) +#define RHMAP_HAS_STR(b, string_key) RHMAP_HAS_FULL(b, rhmap_hash_string(string_key), string_key) +#define RHMAP_DEL_STR(b, string_key) RHMAP_DEL_FULL(b, rhmap_hash_string(string_key), string_key) +#define RHMAP_PTR_STR(b, string_key) RHMAP_PTR_FULL(b, rhmap_hash_string(string_key), string_key) +#define RHMAP_IDX_STR(b, string_key) RHMAP_IDX_FULL(b, rhmap_hash_string(string_key), string_key) + +RHMAP__UNUSED static uint32_t rhmap_hash_string(const char* str) +{ + unsigned char c; + uint32_t hash = (uint32_t)0x811c9dc5; + while ((c = (unsigned char)*(str++)) != '\0') + hash = ((hash * (uint32_t)0x01000193) ^ (uint32_t)c); + return (hash ? hash : 1); +} + +struct rhmap__hdr { size_t len, maxlen; uint32_t *keys; char** key_strs; }; +#define RHMAP__HDR(b) (((struct rhmap__hdr *)&(b)[-1])-1) +#define RHMAP__GROW(b, n) (*(void**)(&(b)) = rhmap__grow(RHMAP__HDR(b), (void*)(b), sizeof(*(b)), (size_t)(n))) +#define RHMAP__FIT1(b) ((b) && RHMAP_LEN(b) * 2 <= RHMAP_MAX(b) ? 0 : RHMAP__GROW(b, 0)) + +RHMAP__UNUSED static void* rhmap__grow(struct rhmap__hdr *old_hdr, void* old_ptr, size_t elem_size, size_t reserve) +{ + struct rhmap__hdr *new_hdr; + char *new_vals; + size_t new_max = (old_ptr ? old_hdr->maxlen * 2 + 1 : 15); + while (new_max && new_max / 2 <= reserve) + if (!(new_max = new_max * 2 + 1)) + return old_ptr; /* overflow */ + + new_hdr = (struct rhmap__hdr *)malloc(sizeof(struct rhmap__hdr) + (new_max + 2) * elem_size); + if (!new_hdr) + return old_ptr; /* out of memory */ + + new_hdr->maxlen = new_max; + new_hdr->keys = (uint32_t *)calloc(new_max + 1, sizeof(uint32_t)); + if (!new_hdr->keys) + { + /* out of memory */ + free(new_hdr); + return old_ptr; + } + new_hdr->key_strs = (char**)calloc(new_max + 1, sizeof(char*)); + if (!new_hdr->key_strs) + { + /* out of memory */ + free(new_hdr->keys); + free(new_hdr); + return old_ptr; + } + + new_vals = ((char*)(new_hdr + 1)) + elem_size; + if (old_ptr) + { + size_t i; + char* old_vals = ((char*)(old_hdr + 1)) + elem_size; + for (i = 0; i <= old_hdr->maxlen; i++) + { + uint32_t key, j; + if (!old_hdr->keys[i]) + continue; + for (key = old_hdr->keys[i], j = key;; j++) + { + if (!new_hdr->keys[j &= new_hdr->maxlen]) + { + new_hdr->keys[j] = key; + new_hdr->key_strs[j] = old_hdr->key_strs[i]; + memcpy(new_vals + j * elem_size, old_vals + i * elem_size, elem_size); + break; + } + } + } + memcpy(new_vals - elem_size, old_vals - elem_size, elem_size); + new_hdr->len = old_hdr->len; + free(old_hdr->keys); + free(old_hdr->key_strs); + free(old_hdr); + } + else + { + memset(new_vals - elem_size, 0, elem_size); + new_hdr->len = 0; + } + return new_vals; +} + +RHMAP__UNUSED static ptrdiff_t rhmap__idx(struct rhmap__hdr* hdr, uint32_t key, const char * str, int add, size_t del) +{ + uint32_t i; + + if (!key) + return (ptrdiff_t)-1; + + for (i = key;; i++) + { + if (hdr->keys[i &= hdr->maxlen] == key && (!hdr->key_strs[i] || !str || !strcmp(hdr->key_strs[i], str))) + { + if (del) + { + hdr->len--; + hdr->keys[i] = 0; + free(hdr->key_strs[i]); + hdr->key_strs[i] = NULL; + while ((key = hdr->keys[i = (i + 1) & hdr->maxlen]) != 0) + { + if ((key = (uint32_t)rhmap__idx(hdr, key, str, 1, 0)) == i) continue; + hdr->len--; + hdr->keys[i] = 0; + free(hdr->key_strs[i]); + hdr->key_strs[i] = NULL; + memcpy(((char*)(hdr + 1)) + (key + 1) * del, + ((char*)(hdr + 1)) + (i + 1) * del, del); + } + } + return (ptrdiff_t)i; + } + if (!hdr->keys[i]) + { + if (add) { hdr->len++; hdr->keys[i] = key; if (str) hdr->key_strs[i] = strdup(str); return (ptrdiff_t)i; } + return (ptrdiff_t)-1; + } + } +} + +RHMAP__UNUSED static void rhmap__free(struct rhmap__hdr* hdr) +{ + size_t i; + for (i=0;i<hdr->maxlen+1;i++) + { + free(hdr->key_strs[i]); + } + free(hdr->key_strs); + free(hdr->keys); + free(hdr); +} + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/audio_mix.h
Added
@@ -0,0 +1,93 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_mix.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_AUDIO_MIX_H__ +#define __LIBRETRO_SDK_AUDIO_MIX_H__ + +#include <retro_common_api.h> + +#include <stdint.h> +#include <stddef.h> +#ifdef _WIN32 +#include <direct.h> +#else +#include <unistd.h> +#endif + +#include <formats/rwav.h> +#include <audio/audio_resampler.h> + +RETRO_BEGIN_DECLS + +typedef struct +{ + double ratio; + void *buf; + int16_t *upsample_buf; + float *float_buf; + float *float_resample_buf; + int16_t *resample_buf; + const retro_resampler_t *resampler; + void *resampler_data; + rwav_t *rwav; + ssize_t len; + size_t resample_len; + int sample_rate; + bool resample; +} audio_chunk_t; + +#if defined(__SSE2__) +#define audio_mix_volume audio_mix_volume_SSE2 + +void audio_mix_volume_SSE2(float *out, + const float *in, float vol, size_t samples); +#else +#define audio_mix_volume audio_mix_volume_C +#endif + +void audio_mix_volume_C(float *dst, const float *src, float vol, size_t samples); + +void audio_mix_free_chunk(audio_chunk_t *chunk); + +audio_chunk_t* audio_mix_load_wav_file(const char *path, int sample_rate); + +size_t audio_mix_get_chunk_num_samples(audio_chunk_t *chunk); + +/** + * audio_mix_get_chunk_sample: + * @chunk : audio chunk instance + * @channel : channel of the sample (0=left, 1=right) + * @index : index of the sample + * + * Get a sample from an audio chunk. + * + * Returns: A signed 16-bit audio sample, (if necessary) resampled into the desired output rate. + **/ +int16_t audio_mix_get_chunk_sample(audio_chunk_t *chunk, unsigned channel, size_t sample); + +int16_t* audio_mix_get_chunk_samples(audio_chunk_t *chunk); + +int audio_mix_get_chunk_num_channels(audio_chunk_t *chunk); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/audio_mixer.h
Added
@@ -0,0 +1,84 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_mixer.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_AUDIO_MIXER__H +#define __LIBRETRO_SDK_AUDIO_MIXER__H + +#include <stdint.h> +#include <stddef.h> +#include <stdlib.h> + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <boolean.h> +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +enum audio_mixer_type +{ + AUDIO_MIXER_TYPE_NONE = 0, + AUDIO_MIXER_TYPE_WAV, + AUDIO_MIXER_TYPE_OGG, + AUDIO_MIXER_TYPE_MOD, + AUDIO_MIXER_TYPE_FLAC, + AUDIO_MIXER_TYPE_MP3 +}; + +typedef struct audio_mixer_sound audio_mixer_sound_t; +typedef struct audio_mixer_voice audio_mixer_voice_t; + +typedef void (*audio_mixer_stop_cb_t)(audio_mixer_sound_t* sound, unsigned reason); + +/* Reasons passed to the stop callback. */ +#define AUDIO_MIXER_SOUND_FINISHED 0 +#define AUDIO_MIXER_SOUND_STOPPED 1 +#define AUDIO_MIXER_SOUND_REPEATED 2 + +void audio_mixer_init(unsigned rate); + +void audio_mixer_done(void); + +audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size); +audio_mixer_sound_t* audio_mixer_load_ogg(void *buffer, int32_t size); +audio_mixer_sound_t* audio_mixer_load_mod(void *buffer, int32_t size); +audio_mixer_sound_t* audio_mixer_load_flac(void *buffer, int32_t size); +audio_mixer_sound_t* audio_mixer_load_mp3(void *buffer, int32_t size); + +void audio_mixer_destroy(audio_mixer_sound_t* sound); + +audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, + bool repeat, float volume, audio_mixer_stop_cb_t stop_cb); + +void audio_mixer_stop(audio_mixer_voice_t* voice); + +float audio_mixer_voice_get_volume(audio_mixer_voice_t *voice); + +void audio_mixer_voice_set_volume(audio_mixer_voice_t *voice, float val); + +void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override, bool override); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/audio_resampler.h
Added
@@ -0,0 +1,194 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (audio_resampler.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_AUDIO_RESAMPLER_DRIVER_H +#define __LIBRETRO_SDK_AUDIO_RESAMPLER_DRIVER_H + +#include <stdint.h> +#include <stddef.h> + +#include <boolean.h> +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +#define RESAMPLER_SIMD_SSE (1 << 0) +#define RESAMPLER_SIMD_SSE2 (1 << 1) +#define RESAMPLER_SIMD_VMX (1 << 2) +#define RESAMPLER_SIMD_VMX128 (1 << 3) +#define RESAMPLER_SIMD_AVX (1 << 4) +#define RESAMPLER_SIMD_NEON (1 << 5) +#define RESAMPLER_SIMD_SSE3 (1 << 6) +#define RESAMPLER_SIMD_SSSE3 (1 << 7) +#define RESAMPLER_SIMD_MMX (1 << 8) +#define RESAMPLER_SIMD_MMXEXT (1 << 9) +#define RESAMPLER_SIMD_SSE4 (1 << 10) +#define RESAMPLER_SIMD_SSE42 (1 << 11) +#define RESAMPLER_SIMD_AVX2 (1 << 12) +#define RESAMPLER_SIMD_VFPU (1 << 13) +#define RESAMPLER_SIMD_PS (1 << 14) + +enum resampler_quality +{ + RESAMPLER_QUALITY_DONTCARE = 0, + RESAMPLER_QUALITY_LOWEST, + RESAMPLER_QUALITY_LOWER, + RESAMPLER_QUALITY_NORMAL, + RESAMPLER_QUALITY_HIGHER, + RESAMPLER_QUALITY_HIGHEST +}; + +/* A bit-mask of all supported SIMD instruction sets. + * Allows an implementation to pick different + * resampler_implementation structs. + */ +typedef unsigned resampler_simd_mask_t; + +#define RESAMPLER_API_VERSION 1 + +struct resampler_data +{ + const float *data_in; + float *data_out; + + size_t input_frames; + size_t output_frames; + + double ratio; +}; + +/* Returns true if config key was found. Otherwise, + * returns false, and sets value to default value. + */ +typedef int (*resampler_config_get_float_t)(void *userdata, + const char *key, float *value, float default_value); + +typedef int (*resampler_config_get_int_t)(void *userdata, + const char *key, int *value, int default_value); + +/* Allocates an array with values. free() with resampler_config_free_t. */ +typedef int (*resampler_config_get_float_array_t)(void *userdata, + const char *key, float **values, unsigned *out_num_values, + const float *default_values, unsigned num_default_values); + +typedef int (*resampler_config_get_int_array_t)(void *userdata, + const char *key, int **values, unsigned *out_num_values, + const int *default_values, unsigned num_default_values); + +typedef int (*resampler_config_get_string_t)(void *userdata, + const char *key, char **output, const char *default_output); + +/* Calls free() in host runtime. Sometimes needed on Windows. + * free() on NULL is fine. */ +typedef void (*resampler_config_free_t)(void *ptr); + +struct resampler_config +{ + resampler_config_get_float_t get_float; + resampler_config_get_int_t get_int; + + resampler_config_get_float_array_t get_float_array; + resampler_config_get_int_array_t get_int_array; + + resampler_config_get_string_t get_string; + /* Avoid problems where resampler plug and host are + * linked against different C runtimes. */ + resampler_config_free_t free; +}; + +/* Bandwidth factor. Will be < 1.0 for downsampling, > 1.0 for upsampling. + * Corresponds to expected resampling ratio. */ +typedef void *(*resampler_init_t)(const struct resampler_config *config, + double bandwidth_mod, enum resampler_quality quality, + resampler_simd_mask_t mask); + +/* Frees the handle. */ +typedef void (*resampler_free_t)(void *data); + +/* Processes input data. */ +typedef void (*resampler_process_t)(void *_data, struct resampler_data *data); + +typedef struct retro_resampler +{ + resampler_init_t init; + resampler_process_t process; + resampler_free_t free; + + /* Must be RESAMPLER_API_VERSION */ + unsigned api_version; + + /* Human readable identifier of implementation. */ + const char *ident; + + /* Computer-friendly short version of ident. + * Lower case, no spaces and special characters, etc. */ + const char *short_ident; +} retro_resampler_t; + +typedef struct audio_frame_float +{ + float l; + float r; +} audio_frame_float_t; + +extern retro_resampler_t sinc_resampler; +#ifdef HAVE_CC_RESAMPLER +extern retro_resampler_t CC_resampler; +#endif +extern retro_resampler_t nearest_resampler; + +/** + * audio_resampler_driver_find_handle: + * @index : index of driver to get handle to. + * + * Returns: handle to audio resampler driver at index. Can be NULL + * if nothing found. + **/ +const void *audio_resampler_driver_find_handle(int index); + +/** + * audio_resampler_driver_find_ident: + * @index : index of driver to get handle to. + * + * Returns: Human-readable identifier of audio resampler driver at index. + * Can be NULL if nothing found. + **/ +const char *audio_resampler_driver_find_ident(int index); + +/** + * retro_resampler_realloc: + * @re : Resampler handle + * @backend : Resampler backend that is about to be set. + * @ident : Identifier name for resampler we want. + * @bw_ratio : Bandwidth ratio. + * + * Reallocates resampler. Will free previous handle before + * allocating a new one. If ident is NULL, first resampler will be used. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool retro_resampler_realloc(void **re, const retro_resampler_t **backend, + const char *ident, enum resampler_quality quality, double bw_ratio); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/conversion
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/conversion/float_to_s16.h
Added
@@ -0,0 +1,55 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (float_to_s16.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_CONVERSION_FLOAT_TO_S16_H__ +#define __LIBRETRO_SDK_CONVERSION_FLOAT_TO_S16_H__ + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +#include <stdint.h> +#include <stddef.h> + +/** + * convert_float_to_s16: + * @out : output buffer + * @in : input buffer + * @samples : size of samples to be converted + * + * Converts floating point + * to signed integer 16-bit. + **/ +void convert_float_to_s16(int16_t *out, + const float *in, size_t samples); + +/** + * convert_float_to_s16_init_simd: + * + * Sets up function pointers for conversion + * functions based on CPU features. + **/ +void convert_float_to_s16_init_simd(void); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/conversion/s16_to_float.h
Added
@@ -0,0 +1,55 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (s16_to_float.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef __LIBRETRO_SDK_CONVERSION_S16_TO_FLOAT_H__ +#define __LIBRETRO_SDK_CONVERSION_S16_TO_FLOAT_H__ + +#include <stdint.h> +#include <stddef.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +/** + * convert_s16_to_float: + * @out : output buffer + * @in : input buffer + * @samples : size of samples to be converted + * @gain : gain applied (.e.g. audio volume) + * + * Converts from signed integer 16-bit + * to floating point. + **/ +void convert_s16_to_float(float *out, + const int16_t *in, size_t samples, float gain); + +/** + * convert_s16_to_float_init_simd: + * + * Sets up function pointers for conversion + * functions based on CPU features. + **/ +void convert_s16_to_float_init_simd(void); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/audio/dsp_filter.h
Added
@@ -0,0 +1,52 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (dsp_filter.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_AUDIO_DSP_FILTER_H +#define __LIBRETRO_SDK_AUDIO_DSP_FILTER_H + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +typedef struct retro_dsp_filter retro_dsp_filter_t; + +retro_dsp_filter_t *retro_dsp_filter_new(const char *filter_config, + void *string_data, float sample_rate); + +void retro_dsp_filter_free(retro_dsp_filter_t *dsp); + +struct retro_dsp_data +{ + float *input; + unsigned input_frames; + + /* Set by retro_dsp_filter_process(). */ + float *output; + unsigned output_frames; +}; + +void retro_dsp_filter_process(retro_dsp_filter_t *dsp, + struct retro_dsp_data *data); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/boolean.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/boolean.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (boolean.h).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/cdrom
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/cdrom/cdrom.h
Added
@@ -0,0 +1,125 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (cdrom.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_CDROM_H +#define __LIBRETRO_SDK_CDROM_H + +#include <stdio.h> +#include <stdint.h> +#include <stddef.h> +#include <sys/types.h> + +#include <vfs/vfs.h> +#include <libretro.h> +#include <retro_common_api.h> +#include <retro_inline.h> + +#include <boolean.h> + +struct string_list; + +RETRO_BEGIN_DECLS + +typedef struct +{ + unsigned short g1_timeout; + unsigned short g2_timeout; + unsigned short g3_timeout; +} cdrom_group_timeouts_t; + +typedef struct +{ + unsigned lba_start; /* start of pregap */ + unsigned lba; /* start of data */ + unsigned track_size; /* in LBAs */ + unsigned track_bytes; + unsigned char track_num; + unsigned char min; /* start of data */ + unsigned char sec; + unsigned char frame; + unsigned char mode; + bool audio; +} cdrom_track_t; + +typedef struct +{ + cdrom_track_t track[99]; /* unsigned alignment */ + cdrom_group_timeouts_t timeouts; /* unsigned short alignment */ + unsigned char num_tracks; + char drive; +} cdrom_toc_t; + +void cdrom_lba_to_msf(unsigned lba, unsigned char *min, unsigned char *sec, unsigned char *frame); + +unsigned cdrom_msf_to_lba(unsigned char min, unsigned char sec, unsigned char frame); + +void increment_msf(unsigned char *min, unsigned char *sec, unsigned char *frame); + +int cdrom_read_subq(libretro_vfs_implementation_file *stream, unsigned char *buf, size_t len); + +int cdrom_write_cue(libretro_vfs_implementation_file *stream, char **out_buf, size_t *out_len, char cdrom_drive, unsigned char *num_tracks, cdrom_toc_t *toc); + +/* needs 32 bytes for full vendor, product and version */ +int cdrom_get_inquiry(libretro_vfs_implementation_file *stream, char *model, int len, bool *is_cdrom); + +int cdrom_read(libretro_vfs_implementation_file *stream, cdrom_group_timeouts_t *timeouts, unsigned char min, unsigned char sec, unsigned char frame, void *s, size_t len, size_t skip); + +int cdrom_set_read_speed(libretro_vfs_implementation_file *stream, unsigned speed); + +int cdrom_stop(libretro_vfs_implementation_file *stream); + +int cdrom_unlock(libretro_vfs_implementation_file *stream); + +int cdrom_open_tray(libretro_vfs_implementation_file *stream); + +int cdrom_close_tray(libretro_vfs_implementation_file *stream); + +/* must be freed by the caller */ +struct string_list* cdrom_get_available_drives(void); + +bool cdrom_is_media_inserted(libretro_vfs_implementation_file *stream); + +bool cdrom_drive_has_media(const char drive); + +void cdrom_get_current_config_core(libretro_vfs_implementation_file *stream); + +void cdrom_get_current_config_profiles(libretro_vfs_implementation_file *stream); + +void cdrom_get_current_config_cdread(libretro_vfs_implementation_file *stream); + +void cdrom_get_current_config_multiread(libretro_vfs_implementation_file *stream); + +void cdrom_get_current_config_random_readable(libretro_vfs_implementation_file *stream); + +int cdrom_get_sense(libretro_vfs_implementation_file *stream, unsigned char *sense, size_t len); + +bool cdrom_set_read_cache(libretro_vfs_implementation_file *stream, bool enabled); + +bool cdrom_get_timeouts(libretro_vfs_implementation_file *stream, cdrom_group_timeouts_t *timeouts); + +bool cdrom_has_atip(libretro_vfs_implementation_file *stream); + +void cdrom_device_fillpath(char *path, size_t len, char drive, unsigned char track, bool is_cue); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/clamping.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/clamping.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (clamping.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/apple_compat.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/apple_compat.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (apple_compat.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/fnmatch.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/fnmatch.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (fnmatch.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/fopen_utf8.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/fopen_utf8.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (fopen_utf8.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/getopt.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/getopt.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (getopt.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/intrinsics.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/intrinsics.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (intrinsics.h). @@ -41,7 +41,7 @@ /* Count Leading Zero, unsigned 16bit input value */ static INLINE unsigned compat_clz_u16(uint16_t val) { -#if defined(__GNUC__) && !defined(PS2) +#if defined(__GNUC__) return __builtin_clz(val << 16 | 0x8000); #else unsigned ret = 0; @@ -61,22 +61,36 @@ { #if defined(__GNUC__) && !defined(RARCH_CONSOLE) return __builtin_ctz(x); -#elif _MSC_VER >= 1400 && !defined(_XBOX) +#elif _MSC_VER >= 1400 && !defined(_XBOX) && !defined(__WINRT__) unsigned long r = 0; - _BitScanReverse((unsigned long*)&r, x); + _BitScanForward((unsigned long*)&r, x); return (int)r; #else -/* Only checks at nibble granularity, - * because that's what we need. */ - if (x & 0x000f) - return 0; - if (x & 0x00f0) - return 4; - if (x & 0x0f00) - return 8; - if (x & 0xf000) - return 12; - return 16; + int count = 0; + if (!(x & 0xffff)) + { + x >>= 16; + count |= 16; + } + if (!(x & 0xff)) + { + x >>= 8; + count |= 8; + } + if (!(x & 0xf)) + { + x >>= 4; + count |= 4; + } + if (!(x & 0x3)) + { + x >>= 2; + count |= 2; + } + if (!(x & 0x1)) + count |= 1; + + return count; #endif }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/msvc.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/msvc.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (msvc.h). @@ -29,20 +29,17 @@ extern "C" { #endif -/* Pre-MSVC 2015 compilers don't implement snprintf in a cross-platform manner. */ +/* Pre-MSVC 2015 compilers don't implement snprintf, vsnprintf in a cross-platform manner. */ #if _MSC_VER < 1900 + #include <stdio.h> + #include <stdarg.h> #include <stdlib.h> + #ifndef snprintf #define snprintf c99_snprintf_retro__ #endif - int c99_snprintf_retro__(char *outBuf, size_t size, const char *format, ...); -#endif -/* Pre-MSVC 2008 compilers don't implement vsnprintf in a cross-platform manner? Not sure about this one. */ -#if _MSC_VER < 1500 - #include <stdarg.h> - #include <stdlib.h> #ifndef vsnprintf #define vsnprintf c99_vsnprintf_retro__ #endif @@ -56,6 +53,8 @@ #undef UNICODE /* Do not bother with UNICODE at this time. */ #include <direct.h> #include <stddef.h> + +#define _USE_MATH_DEFINES #include <math.h> /* Python headers defines ssize_t and sets HAVE_SSIZE_T.
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/posix_string.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/posix_string.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (posix_string.h). @@ -29,10 +29,6 @@ #include <compat/msvc.h> #endif -#if defined(PS2) -#include <compat_ctype.h> -#endif - RETRO_BEGIN_DECLS #ifdef _WIN32
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/strcasestr.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/strcasestr.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (strcasestr.h). @@ -25,10 +25,6 @@ #include <string.h> -#if defined(PS2) -#include <compat_ctype.h> -#endif - #if defined(RARCH_INTERNAL) && defined(HAVE_CONFIG_H) #include "../../../config.h" #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/strl.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/strl.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (strl.h).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/zlib
Added
+(directory)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/compat/zlib.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/zlib.h
Changed
@@ -1742,8 +1742,9 @@ const char * zError (int); int inflateSyncPoint (z_streamp); -const uint32_t * get_crc_table(void); + const uint32_t * get_crc_table(void); int inflateUndermine (z_streamp, int); + int inflateValidate (z_streamp, int); int inflateResetKeep (z_streamp); int deflateResetKeep (z_streamp); #if defined(_WIN32) && !defined(Z_SOLO)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/zlib/zconf.h
Added
@@ -0,0 +1,483 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# endif +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include <limits.h> +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include <sys/types.h> /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include <stdarg.h> /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include <stddef.h> /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/zlib/zconf.h.in
Added
@@ -0,0 +1,483 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# endif +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include <limits.h> +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include <sys/types.h> /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include <stdarg.h> /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include <stddef.h> /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/zlib/zlib.h
Added
@@ -0,0 +1,1761 @@ +#ifndef _COMPAT_ZLIB_H +#define _COMPAT_ZLIB_H + +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include <stdint.h> +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) (voidpf opaque, uInt items, uInt size); +typedef void (*free_func) (voidpf opaque, voidpf address); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + void *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + + const char * zlibVersion (void); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* + int deflateInit (z_streamp strm, int level); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + int deflate (z_streamp strm, int flush); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + int deflateEnd (z_streamp strm); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + +/* + int inflateInit (z_streamp strm); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + int inflate (z_streamp strm, int flush); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + int inflateEnd (z_streamp strm); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* + int deflateInit2 (z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + + int deflateSetDictionary (z_streamp strm, + const Bytef *dictionary, + uInt dictLength); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + + int deflateCopy (z_streamp dest, + z_streamp source); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + + int deflateReset (z_streamp strm); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + + int deflateParams (z_streamp strm, + int level, + int strategy); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + + int deflateTune (z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + + uLong deflateBound (z_streamp strm, + uLong sourceLen); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + + int deflatePending (z_streamp strm, + unsigned *pending, + int *bits); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + + int deflatePrime (z_streamp strm, + int bits, + int value); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + + int deflateSetHeader (z_streamp strm, + gz_headerp head); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* + int inflateInit2 (z_streamp strm, + int windowBits); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + + int inflateSetDictionary (z_streamp strm, + const Bytef *dictionary, + uInt dictLength); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + + int inflateGetDictionary (z_streamp strm, + Bytef *dictionary, + uInt *dictLength); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + + int inflateSync (z_streamp strm); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + + int inflateCopy (z_streamp dest, + z_streamp source); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + + int inflateReset (z_streamp strm); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + + int inflateReset2 (z_streamp strm, + int windowBits); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + + int inflatePrime (z_streamp strm, + int bits, + int value); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + + long inflateMark (z_streamp strm); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + + int inflateGetHeader (z_streamp strm, + gz_headerp head); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* + int inflateBackInit (z_streamp strm, int windowBits, + unsigned char FAR *window); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) (void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func) (void FAR *, unsigned char FAR *, unsigned); + + int inflateBack (z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + + int inflateBackEnd (z_streamp strm); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + + uLong zlibCompileFlags (void); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + + int compress (Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + + int compress2 (Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + + uLong compressBound (uLong sourceLen); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + + int uncompress (unsigned char *dest, uint32_t *destLen, + const unsigned char *source, uint32_t sourceLen); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* + gzFile gzopen (const char *path, const char *mode); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + + gzFile gzdopen (int fd, const char *mode); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + + int gzbuffer (gzFile file, unsigned size); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + + int gzsetparams (gzFile file, int level, int strategy); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + + int gzread (gzFile file, voidp buf, unsigned len); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + + int gzwrite (gzFile file, + voidpc buf, unsigned len); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + + int gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + + int gzputs (gzFile file, const char *s); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + + char * gzgets (gzFile file, char *buf, int len); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + + int gzputc (gzFile file, int c); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + + int gzgetc (gzFile file); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + + int gzungetc (int c, gzFile file); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + + int gzflush (gzFile file, int flush); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* + z_off_t gzseek (gzFile file, + z_off_t offset, int whence); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + + int gzrewind (gzFile file); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* + z_off_t gztell (gzFile file); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* + z_off_t gzoffset (gzFile file); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + + int gzeof (gzFile file); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + + int gzdirect (gzFile file); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + + int gzclose (gzFile file); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + + int gzclose_r (gzFile file); + int gzclose_w (gzFile file); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + + const char * gzerror (gzFile file, int *errnum); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + + void gzclearerr (gzFile file); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +uint32_t adler32 (uint32_t adler, const uint8_t *buf, size_t len); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* + uLong adler32_combine (uLong adler1, uLong adler2, + z_off_t len2); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + + uLong crc32 (uLong crc, const Bytef *buf, uInt len); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* + uLong crc32_combine (uLong crc1, uLong crc2, z_off_t len2); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ + int deflateInit_ (z_streamp strm, int level, + const char *version, int stream_size); + int inflateInit_ (z_streamp strm, + const char *version, int stream_size); + int deflateInit2_ (z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); + int inflateInit2_ (z_streamp strm, int windowBits, + const char *version, int stream_size); + int inflateBackInit_ (z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ + int gzgetc_ (gzFile file); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + gzFile gzopen64 (const char *, const char *); + z_off64_t gzseek64 (gzFile, z_off64_t, int); + z_off64_t gztell64 (gzFile); + z_off64_t gzoffset64 (gzFile); + uLong adler32_combine64 (uLong, uLong, z_off64_t); + uLong crc32_combine64 (uLong, uLong, z_off64_t); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + gzFile gzopen64 (const char *, const char *); + z_off_t gzseek64 (gzFile, z_off_t, int); + z_off_t gztell64 (gzFile); + z_off_t gzoffset64 (gzFile); + uLong adler32_combine64 (uLong, uLong, z_off_t); + uLong crc32_combine64 (uLong, uLong, z_off_t); +# endif +#else + gzFile gzopen (const char *, const char *); + z_off_t gzseek (gzFile, z_off_t, int); + z_off_t gztell (gzFile); + z_off_t gzoffset (gzFile); + uLong adler32_combine (uLong, uLong, z_off_t); + uLong crc32_combine (uLong, uLong, z_off_t); +#endif + +#else /* Z_SOLO */ + + uLong adler32_combine (uLong, uLong, z_off_t); + uLong crc32_combine (uLong, uLong, z_off_t); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ + const char * zError (int); + int inflateSyncPoint (z_streamp); + +const uint32_t * get_crc_table(void); + int inflateUndermine (z_streamp, int); + int inflateResetKeep (z_streamp); + int deflateResetKeep (z_streamp); +#if defined(_WIN32) && !defined(Z_SOLO) + gzFile gzopen_w (const wchar_t *path, + const char *mode); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO + int gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/compat/zlib/zutil.h
Added
@@ -0,0 +1,253 @@ +#ifndef _COMPAT_ZUTIL_H +#define _COMPAT_ZUTIL_H + +#ifdef WANT_ZLIB + +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include <zlib.h> + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include <stddef.h> +# endif +# include <string.h> +# include <stdlib.h> +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern char z_errmsg[10][21]; /* indexed by 2-zlib_error */ +/* (array size given to avoid silly warnings with Visual C++) */ +/* (array entry size given to avoid silly string cast warnings) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include <alloc.h> +# endif +# else /* MSC or DJGPP */ +# include <malloc.h> +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# if defined(M_I86) && !defined(Z_SOLO) +# include <malloc.h> +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include <unix.h> /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + uLong adler32_combine64 (uLong, uLong, z_off_t); + uLong crc32_combine64 (uLong, uLong, z_off_t); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy (Bytef* dest, const Bytef* source, uInt len); + int ZLIB_INTERNAL zmemcmp (const Bytef* s1, const Bytef* s2, uInt len); + void ZLIB_INTERNAL zmemzero (Bytef* dest, uInt len); +#endif + +/* Diagnostic functions */ +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, + unsigned size); + void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ + +#else +#include <zutil.h> +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/defines
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/defines/cocoa_defines.h
Added
@@ -0,0 +1,73 @@ +/* Copyright (C) 2010-2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (cocoa_defines.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __COCOA_COMMON_DEFINES_H +#define __COCOA_COMMON_DEFINES_H + +#include <AvailabilityMacros.h> + +#ifndef MAC_OS_X_VERSION_10_12 +#define MAC_OS_X_VERSION_10_12 101200 +#endif + +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12 +#define NSEventModifierFlagCommand NSCommandKeyMask +#define NSEventModifierFlagControl NSControlKeyMask +#define NSEventModifierFlagHelp NSHelpKeyMask +#define NSEventModifierFlagNumericPad NSNumericPadKeyMask +#define NSEventModifierFlagOption NSAlternateKeyMask +#define NSEventModifierFlagShift NSShiftKeyMask +#define NSCompositingOperationSourceOver NSCompositeSourceOver +#define NSEventMaskApplicationDefined NSApplicationDefinedMask +#define NSEventTypeApplicationDefined NSApplicationDefined +#define NSEventTypeCursorUpdate NSCursorUpdate +#define NSEventTypeMouseMoved NSMouseMoved +#define NSEventTypeMouseEntered NSMouseEntered +#define NSEventTypeMouseExited NSMouseExited +#define NSEventTypeLeftMouseDown NSLeftMouseDown +#define NSEventTypeRightMouseDown NSRightMouseDown +#define NSEventTypeOtherMouseDown NSOtherMouseDown +#define NSEventTypeLeftMouseUp NSLeftMouseUp +#define NSEventTypeRightMouseUp NSRightMouseUp +#define NSEventTypeOtherMouseUp NSOtherMouseUp +#define NSEventTypeLeftMouseDragged NSLeftMouseDragged +#define NSEventTypeRightMouseDragged NSRightMouseDragged +#define NSEventTypeOtherMouseDragged NSOtherMouseDragged +#define NSEventTypeScrollWheel NSScrollWheel +#define NSEventTypeKeyDown NSKeyDown +#define NSEventTypeKeyUp NSKeyUp +#define NSEventTypeFlagsChanged NSFlagsChanged +#define NSEventMaskAny NSAnyEventMask +#define NSWindowStyleMaskBorderless NSBorderlessWindowMask +#define NSWindowStyleMaskClosable NSClosableWindowMask +#define NSWindowStyleMaskFullScreen NSFullScreenWindowMask +#define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask +#define NSWindowStyleMaskResizable NSResizableWindowMask +#define NSWindowStyleMaskTitled NSTitledWindowMask +#define NSAlertStyleCritical NSCriticalAlertStyle +#define NSAlertStyleInformational NSInformationalAlertStyle +#define NSAlertStyleWarning NSWarningAlertStyle +#define NSEventModifierFlagCapsLock NSAlphaShiftKeyMask +#define NSControlSizeRegular NSRegularControlSize +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/defines/d3d_defines.h
Added
@@ -0,0 +1,92 @@ +/* Copyright (C) 2010-2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (d3d_defines.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef D3DVIDEO_DEFINES_H +#define D3DVIDEO_DEFINES_H + +#if defined(DEBUG) || defined(_DEBUG) +#define D3D_DEBUG_INFO +#endif + +#if defined(HAVE_D3D9) +/* Direct3D 9 */ +#if 0 +#include <d3d9.h> +#endif + +#if 0 +#define LPDIRECT3D LPDIRECT3D9 +#define LPDIRECT3DDEVICE LPDIRECT3DDEVICE9 +#define LPDIRECT3DTEXTURE LPDIRECT3DTEXTURE9 +#define LPDIRECT3DCUBETEXTURE LPDIRECT3DCUBETEXTURE9 +#define LPDIRECT3DVERTEXBUFFER LPDIRECT3DVERTEXBUFFER9 +#define LPDIRECT3DVERTEXSHADER LPDIRECT3DVERTEXSHADER9 +#define LPDIRECT3DPIXELSHADER LPDIRECT3DPIXELSHADER9 +#define LPDIRECT3DSURFACE LPDIRECT3DSURFACE9 +#define LPDIRECT3DVERTEXDECLARATION LPDIRECT3DVERTEXDECLARATION9 +#define LPDIRECT3DVOLUMETEXTURE LPDIRECT3DVOLUMETEXTURE9 +#define LPDIRECT3DRESOURCE LPDIRECT3DRESOURCE9 +#define D3DVERTEXELEMENT D3DVERTEXELEMENT9 +#define D3DVIEWPORT D3DVIEWPORT9 +#endif + +#ifndef D3DCREATE_SOFTWARE_VERTEXPROCESSING +#define D3DCREATE_SOFTWARE_VERTEXPROCESSING 0 +#endif + +#elif defined(HAVE_D3D8) +#if 0 +#ifdef _XBOX +#include <xtl.h> +#else +#include "../gfx/include/d3d8/d3d8.h" +#endif +#endif + +/* Direct3D 8 */ +#if 0 +#define LPDIRECT3D LPDIRECT3D8 +#define LPDIRECT3DDEVICE LPDIRECT3DDEVICE8 +#define LPDIRECT3DTEXTURE LPDIRECT3DTEXTURE8 +#define LPDIRECT3DCUBETEXTURE LPDIRECT3DCUBETEXTURE8 +#define LPDIRECT3DVOLUMETEXTURE LPDIRECT3DVOLUMETEXTURE8 +#define LPDIRECT3DVERTEXBUFFER LPDIRECT3DVERTEXBUFFER8 +#define LPDIRECT3DVERTEXDECLARATION (void*) +#define LPDIRECT3DSURFACE LPDIRECT3DSURFACE8 +#define LPDIRECT3DRESOURCE LPDIRECT3DRESOURCE8 +#define D3DVERTEXELEMENT D3DVERTEXELEMENT8 +#define D3DVIEWPORT D3DVIEWPORT8 +#endif + +#if !defined(D3DLOCK_NOSYSLOCK) && defined(_XBOX) +#define D3DLOCK_NOSYSLOCK (0) +#endif + +#if 0 +#define D3DSAMP_ADDRESSU D3DTSS_ADDRESSU +#define D3DSAMP_ADDRESSV D3DTSS_ADDRESSV +#define D3DSAMP_MAGFILTER D3DTSS_MAGFILTER +#define D3DSAMP_MINFILTER D3DTSS_MINFILTER +#endif +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/defines/gx_defines.h
Added
@@ -0,0 +1,96 @@ +/* Copyright (C) 2010-2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (gx_defines.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _GX_DEFINES_H +#define _GX_DEFINES_H + +#ifdef GEKKO + +#define SYSMEM1_SIZE 0x01800000 + +#define _SHIFTL(v, s, w) ((uint32_t) (((uint32_t)(v) & ((0x01 << (w)) - 1)) << (s))) +#define _SHIFTR(v, s, w) ((uint32_t)(((uint32_t)(v) >> (s)) & ((0x01 << (w)) - 1))) + +#define OSThread lwp_t +#define OSCond lwpq_t +#define OSThreadQueue lwpq_t + +#define OSInitMutex(mutex) LWP_MutexInit(mutex, 0) +#define OSLockMutex(mutex) LWP_MutexLock(mutex) +#define OSUnlockMutex(mutex) LWP_MutexUnlock(mutex) +#define OSTryLockMutex(mutex) LWP_MutexTryLock(mutex) + +#define OSInitCond(cond) LWP_CondInit(cond) +#define OSSignalCond(cond) LWP_ThreadSignal(cond) +#define OSWaitCond(cond, mutex) LWP_CondWait(cond, mutex) + +#define OSInitThreadQueue(queue) LWP_InitQueue(queue) +#define OSCloseThreadQueue(queue) LWP_CloseQueue(queue) +#define OSSleepThread(queue) LWP_ThreadSleep(queue) +#define OSJoinThread(thread, val) LWP_JoinThread(thread, val) + +#define OSCreateThread(thread, func, intarg, ptrarg, stackbase, stacksize, priority, attrs) LWP_CreateThread(thread, func, ptrarg, stackbase, stacksize, priority) + +#define BLIT_LINE_16(off) \ +{ \ + const uint32_t *tmp_src = src; \ + uint32_t *tmp_dst = dst; \ + for (unsigned x = 0; x < width2 >> 1; x++, tmp_src += 2, tmp_dst += 8) \ + { \ + tmp_dst[ 0 + off] = BLIT_LINE_16_CONV(tmp_src[0]); \ + tmp_dst[ 1 + off] = BLIT_LINE_16_CONV(tmp_src[1]); \ + } \ + src += tmp_pitch; \ +} + +#define BLIT_LINE_32(off) \ +{ \ + const uint16_t *tmp_src = src; \ + uint16_t *tmp_dst = dst; \ + for (unsigned x = 0; x < width2 >> 3; x++, tmp_src += 8, tmp_dst += 32) \ + { \ + tmp_dst[ 0 + off] = tmp_src[0] | 0xFF00; \ + tmp_dst[ 16 + off] = tmp_src[1]; \ + tmp_dst[ 1 + off] = tmp_src[2] | 0xFF00; \ + tmp_dst[ 17 + off] = tmp_src[3]; \ + tmp_dst[ 2 + off] = tmp_src[4] | 0xFF00; \ + tmp_dst[ 18 + off] = tmp_src[5]; \ + tmp_dst[ 3 + off] = tmp_src[6] | 0xFF00; \ + tmp_dst[ 19 + off] = tmp_src[7]; \ + } \ + src += tmp_pitch; \ +} + +#define CHUNK_FRAMES 64 +#define CHUNK_SIZE (CHUNK_FRAMES * sizeof(uint32_t)) +#define BLOCKS 16 + +#define AIInit AUDIO_Init +#define AIInitDMA AUDIO_InitDMA +#define AIStartDMA AUDIO_StartDMA +#define AIStopDMA AUDIO_StopDMA +#define AIRegisterDMACallback AUDIO_RegisterDMACallback +#define AISetDSPSampleRate AUDIO_SetDSPSampleRate + +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/defines/ps3_defines.h
Added
@@ -0,0 +1,704 @@ +/* Copyright (C) 2010-2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (ps3_defines.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _PS3_DEFINES_H +#define _PS3_DEFINES_H + +/*============================================================ + AUDIO PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <audio/audio.h> +#include <sys/thread.h> + +#include <sys/event_queue.h> +#include <lv2/mutex.h> +#include <lv2/cond.h> + +/*forward decl. for audioAddData */ +extern int audioAddData(uint32_t portNum, float *data, + uint32_t frames, float volume); + +#define PS3_SYS_NO_TIMEOUT 0 +#define param_attrib attrib + +#else +#include <sdk_version.h> +#include <cell/audio.h> +#include <sys/event.h> +#include <sys/synchronization.h> + +#define numChannels nChannel +#define numBlocks nBlock +#define param_attrib attr + +#define audioQuit cellAudioQuit +#define audioInit cellAudioInit +#define audioPortStart cellAudioPortStart +#define audioPortOpen cellAudioPortOpen +#define audioPortClose cellAudioPortClose +#define audioPortStop cellAudioPortStop +#define audioPortParam CellAudioPortParam +#define audioPortOpen cellAudioPortOpen +#define audioAddData cellAudioAddData + +/* event queue functions */ +#define sysEventQueueReceive sys_event_queue_receive +#define audioSetNotifyEventQueue cellAudioSetNotifyEventQueue +#define audioRemoveNotifyEventQueue cellAudioRemoveNotifyEventQueue +#define audioCreateNotifyEventQueue cellAudioCreateNotifyEventQueue + +#define sysLwCondCreate sys_lwcond_create +#define sysLwCondDestroy sys_lwcond_destroy +#define sysLwCondWait sys_lwcond_wait +#define sysLwCondSignal sys_lwcond_signal + +#define sysLwMutexDestroy sys_lwmutex_destroy +#define sysLwMutexLock sys_lwmutex_lock +#define sysLwMutexUnlock sys_lwmutex_unlock +#define sysLwMutexCreate sys_lwmutex_create + +#define AUDIO_BLOCK_SAMPLES CELL_AUDIO_BLOCK_SAMPLES +#define SYSMODULE_NET CELL_SYSMODULE_NET +#define PS3_SYS_NO_TIMEOUT SYS_NO_TIMEOUT + +#define sys_lwmutex_attr_t sys_lwmutex_attribute_t +#define sys_lwcond_attr_t sys_lwcond_attribute_t +#define sys_sem_t sys_semaphore_t + +#define sysGetSystemTime sys_time_get_system_time +#define sysModuleLoad cellSysmoduleLoadModule +#define sysModuleUnload cellSysmoduleUnloadModule + +#define netInitialize sys_net_initialize_network + +#endif + +/*============================================================ + INPUT PAD PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <io/pad.h> +#define CELL_PAD_CAPABILITY_SENSOR_MODE 4 +#define CELL_PAD_SETTING_SENSOR_ON 4 +#define CELL_PAD_STATUS_ASSIGN_CHANGES 2 +#define CELL_PAD_BTN_OFFSET_DIGITAL1 2 +#define CELL_PAD_BTN_OFFSET_DIGITAL2 3 +#define CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X 4 +#define CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y 5 +#define CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X 6 +#define CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y 7 +#define CELL_PAD_BTN_OFFSET_PRESS_RIGHT 8 +#define CELL_PAD_BTN_OFFSET_PRESS_LEFT 9 +#define CELL_PAD_BTN_OFFSET_PRESS_UP 10 +#define CELL_PAD_BTN_OFFSET_PRESS_DOWN 11 +#define CELL_PAD_BTN_OFFSET_PRESS_TRIANGLE 12 +#define CELL_PAD_BTN_OFFSET_PRESS_CIRCLE 13 +#define CELL_PAD_BTN_OFFSET_PRESS_CROSS 14 +#define CELL_PAD_BTN_OFFSET_PRESS_SQUARE 15 +#define CELL_PAD_BTN_OFFSET_PRESS_L1 16 +#define CELL_PAD_BTN_OFFSET_PRESS_R1 17 +#define CELL_PAD_BTN_OFFSET_PRESS_L2 18 +#define CELL_PAD_BTN_OFFSET_PRESS_R2 19 +#define CELL_PAD_BTN_OFFSET_SENSOR_X 20 +#define CELL_PAD_BTN_OFFSET_SENSOR_Y 21 +#define CELL_PAD_BTN_OFFSET_SENSOR_Z 22 +#define CELL_PAD_BTN_OFFSET_SENSOR_G 23 +#define CELL_PAD_CTRL_LEFT (128) +#define CELL_PAD_CTRL_DOWN (64) +#define CELL_PAD_CTRL_RIGHT (32) +#define CELL_PAD_CTRL_UP (16) +#define CELL_PAD_CTRL_START (8) +#define CELL_PAD_CTRL_R3 (4) +#define CELL_PAD_CTRL_L3 (2) +#define CELL_PAD_CTRL_SELECT (1) +#define CELL_PAD_CTRL_SQUARE (128) +#define CELL_PAD_CTRL_CROSS (64) +#define CELL_PAD_CTRL_CIRCLE (32) +#define CELL_PAD_CTRL_TRIANGLE (16) +#define CELL_PAD_CTRL_R1 (8) +#define CELL_PAD_CTRL_L1 (4) +#define CELL_PAD_CTRL_R2 (2) +#define CELL_PAD_CTRL_L2 (1) +#define CELL_PAD_CTRL_LDD_PS (1) +#define CELL_PAD_STATUS_CONNECTED (1) +#define CELL_SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN SYSUTIL_SYSTEMPARAM_ID_ENTER_BUTTON_ASSIGN +#define CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS (1) +#define CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE (0) +#define now_connect connected +#define CellPadActParam padActParam +#define cellPadSetPortSetting ioPadSetPortSetting +#define cellSysutilGetSystemParamInt sysUtilGetSystemParamInt +#define cellPadSetActDirect ioPadSetActDirect +#define CellPadInfo2 padInfo2 +#define cellPadGetInfo2 ioPadGetInfo2 +#define CellPadData padData +#define cellPadGetData ioPadGetData +#define cellPadInit ioPadInit +#define cellPadEnd ioPadEnd +#else +#include <cell/pad.h> +#define padInfo2 CellPadInfo2 +#define padData CellPadData +#define ioPadGetInfo2 cellPadGetInfo2 +#define ioPadGetData cellPadGetData +#define ioPadInit cellPadInit +#define ioPadEnd cellPadEnd +#endif + +/*============================================================ + INPUT MOUSE PROTOTYPES +============================================================ */ + +#ifdef HAVE_MOUSE + +#ifdef __PSL1GHT__ +#include <io/mouse.h> + +/* define ps3 mouse structs */ +#define CellMouseInfo mouseInfo +#define CellMouseData mouseData + +/* define all the ps3 mouse functions */ +#define cellMouseInit ioMouseInit +#define cellMouseGetData ioMouseGetData +#define cellMouseEnd ioMouseEnd +#define cellMouseGetInfo ioMouseGetInfo + +/* PSL1GHT does not define these in its header */ +#define CELL_MOUSE_BUTTON_1 (UINT64_C(1) << 0) /* Button 1 */ +#define CELL_MOUSE_BUTTON_2 (UINT64_C(1) << 1) /* Button 2 */ +#define CELL_MOUSE_BUTTON_3 (UINT64_C(1) << 2) /* Button 3 */ +#define CELL_MOUSE_BUTTON_4 (UINT64_C(1) << 3) /* Button 4 */ +#define CELL_MOUSE_BUTTON_5 (UINT64_C(1) << 4) /* Button 5 */ +#define CELL_MOUSE_BUTTON_6 (UINT64_C(1) << 5) /* Button 6 */ +#define CELL_MOUSE_BUTTON_7 (UINT64_C(1) << 6) /* Button 7 */ +#define CELL_MOUSE_BUTTON_8 (UINT64_C(1) << 7) /* Button 8 */ + +#else +#include <cell/mouse.h> +#endif + +#endif + +/*============================================================ + OSK PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <sysutil/osk.h> +/* define all the OSK functions */ +#define pOskLoadAsync oskLoadAsync +#define pOskSetLayoutMode oskSetLayoutMode +#define pOskSetKeyLayoutOption oskSetKeyLayoutOption +#define pOskGetSize oskGetSize +#define pOskDisableDimmer oskDisableDimmer +#define pOskAbort oskAbort +#define pOskUnloadAsync oskUnloadAsync + +/* define OSK structs / types */ +#define sys_memory_container_t sys_mem_container_t +#define CellOskDialogPoint oskPoint +#define CellOskDialogInputFieldInfo oskInputFieldInfo +#define CellOskDialogCallbackReturnParam oskCallbackReturnParam +#define CellOskDialogParam oskParam + +#define osk_allowed_panels allowedPanels +#define osk_prohibit_flags prohibitFlags + +#define osk_inputfield_message message +#define osk_inputfield_starttext startText +#define osk_inputfield_max_length maxLength +#define osk_callback_return_param res +#define osk_callback_num_chars len +#define osk_callback_return_string str + +/* define the OSK defines */ +#define CELL_OSKDIALOG_10KEY_PANEL OSK_10KEY_PANEL +#define CELL_OSKDIALOG_FULLKEY_PANEL OSK_FULLKEY_PANEL +#define CELL_OSKDIALOG_LAYOUTMODE_X_ALIGN_CENTER OSK_LAYOUTMODE_HORIZONTAL_ALIGN_CENTER +#define CELL_OSKDIALOG_LAYOUTMODE_Y_ALIGN_TOP OSK_LAYOUTMODE_VERTICAL_ALIGN_TOP +#define CELL_OSKDIALOG_PANELMODE_NUMERAL OSK_PANEL_TYPE_NUMERAL +#define CELL_OSKDIALOG_PANELMODE_NUMERAL_FULL_WIDTH OSK_PANEL_TYPE_NUMERAL_FULL_WIDTH +#define CELL_OSKDIALOG_PANELMODE_ALPHABET OSK_PANEL_TYPE_ALPHABET +#define CELL_OSKDIALOG_PANELMODE_ENGLISH OSK_PANEL_TYPE_ENGLISH +#define CELL_OSKDIALOG_INPUT_FIELD_RESULT_OK (0) +#define CELL_OSKDIALOG_INPUT_FIELD_RESULT_CANCELED (1) +#define CELL_OSKDIALOG_INPUT_FIELD_RESULT_ABORT (2) +#define CELL_OSKDIALOG_INPUT_FIELD_RESULT_NO_INPUT_TEXT (3) +#define CELL_OSKDIALOG_STRING_SIZE (512) +#else +#include <sysutil/sysutil_oskdialog.h> +/* define all the OSK functions */ +#define pOskLoadAsync cellOskDialogLoadAsync +#define pOskSetLayoutMode cellOskDialogSetLayoutMode +#define pOskSetKeyLayoutOption cellOskDialogSetKeyLayoutOption +#define pOskGetSize cellOskDialogGetSize +#define pOskDisableDimmer cellOskDialogDisableDimmer +#define pOskAbort cellOskDialogAbort +#define pOskUnloadAsync cellOskDialogUnloadAsync + +/* define OSK structs / types */ +#define osk_allowed_panels allowOskPanelFlg +#define osk_prohibit_flags prohibitFlgs +#define osk_inputfield_message message +#define osk_inputfield_starttext init_text +#define osk_inputfield_max_length limit_length +#define osk_callback_return_param result +#define osk_callback_num_chars numCharsResultString +#define osk_callback_return_string pResultString +#endif + +/*============================================================ + JPEG/PNG DECODING/ENCODING PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ + +#define spu_enable enable +#define stream_select stream +#define color_alpha alpha +#define color_space space +#define output_mode mode +#define output_bytes_per_line bytes_per_line +#define output_width width +#define output_height height + +#define CELL_OK 0 +#define PTR_NULL 0 + +#else +/* define the JPEG/PNG struct member names */ +#define spu_enable spuThreadEnable +#define ppu_prio ppuThreadPriority +#define spu_prio spuThreadPriority +#define malloc_func cbCtrlMallocFunc +#define malloc_arg cbCtrlMallocArg +#define free_func cbCtrlFreeFunc +#define free_arg cbCtrlFreeArg +#define stream_select srcSelect +#define file_name fileName +#define file_offset fileOffset +#define file_size fileSize +#define stream_ptr streamPtr +#define stream_size streamSize +#define down_scale downScale +#define color_alpha outputColorAlpha +#define color_space outputColorSpace +#define cmd_ptr commandPtr +#define quality method +#define output_mode outputMode +#define output_bytes_per_line outputBytesPerLine +#define output_width outputWidth +#define output_height outputHeight +#define bit_depth outputBitDepth +#define pack_flag outputPackFlag +#define alpha_select outputAlphaSelect + +#define PTR_NULL NULL + +#endif + +/*============================================================ + TIMER PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#define sys_timer_usleep usleep +#endif + +/*============================================================ + THREADING PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <sys/thread.h> + +/* FIXME - not sure if this is correct -> FIXED! 1 and not 0 */ +#define SYS_THREAD_CREATE_JOINABLE THREAD_JOINABLE + +#else +#include <sys/ppu_thread.h> + +#define SYS_PROCESS_SPAWN_STACK_SIZE_1M SYS_PROCESS_PRIMARY_STACK_SIZE_1M +#define SYS_THREAD_CREATE_JOINABLE SYS_PPU_THREAD_CREATE_JOINABLE + +#define sysThreadCreate sys_ppu_thread_create +#define sysThreadJoin sys_ppu_thread_join +#define sysThreadExit sys_ppu_thread_exit + +#define sysProcessExit sys_process_exit +#define sysProcessExitSpawn2 sys_game_process_exitspawn + +#endif + +/*============================================================ + MEMORY PROTOTYPES +============================================================ */ + +#ifndef __PSL1GHT__ +#define sysMemContainerCreate sys_memory_container_create +#define sysMemContainerDestroy sys_memory_container_destroy +#endif + +/*============================================================ + RSX PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <sysutil/video.h> +#define CELL_GCM_FALSE GCM_FALSE +#define CELL_GCM_TRUE GCM_TRUE + +#define CELL_GCM_ONE GCM_ONE +#define CELL_GCM_ZERO GCM_ZERO +#define CELL_GCM_ALWAYS GCM_ALWAYS + +#define CELL_GCM_LOCATION_LOCAL GCM_LOCATION_RSX +#define CELL_GCM_LOCATION_MAIN GCM_LOCATION_CELL + +#define CELL_GCM_MAX_RT_DIMENSION (4096) + +#define CELL_GCM_TEXTURE_LINEAR_NEAREST GCM_TEXTURE_LINEAR_MIPMAP_NEAREST +#define CELL_GCM_TEXTURE_LINEAR_LINEAR GCM_TEXTURE_LINEAR_MIPMAP_LINEAR +#define CELL_GCM_TEXTURE_NEAREST_LINEAR GCM_TEXTURE_NEAREST_MIPMAP_LINEAR +#define CELL_GCM_TEXTURE_NEAREST_NEAREST GCM_TEXTURE_NEAREST_MIPMAP_NEAREST +#define CELL_GCM_TEXTURE_NEAREST GCM_TEXTURE_NEAREST +#define CELL_GCM_TEXTURE_LINEAR GCM_TEXTURE_LINEAR + +#define CELL_GCM_TEXTURE_A8R8G8B8 GCM_TEXTURE_FORMAT_A8R8G8B8 +#define CELL_GCM_TEXTURE_R5G6B5 GCM_TEXTURE_FORMAT_R5G6B5 +#define CELL_GCM_TEXTURE_A1R5G5B5 GCM_TEXTURE_FORMAT_A1R5G5B5 + +#define CELL_GCM_TEXTURE_CLAMP_TO_EDGE GCM_TEXTURE_CLAMP_TO_EDGE + +#define CELL_GCM_TEXTURE_MAX_ANISO_1 GCM_TEXTURE_MAX_ANISO_1 +#define CELL_GCM_TEXTURE_CONVOLUTION_QUINCUNX GCM_TEXTURE_CONVOLUTION_QUINCUNX +#define CELL_GCM_TEXTURE_ZFUNC_NEVER GCM_TEXTURE_ZFUNC_NEVER + +#define CELL_GCM_DISPLAY_HSYNC GCM_FLIP_HSYNC +#define CELL_GCM_DISPLAY_VSYNC GCM_FLIP_VSYNC + +#define CELL_GCM_CLEAR_R GCM_CLEAR_R +#define CELL_GCM_CLEAR_G GCM_CLEAR_G +#define CELL_GCM_CLEAR_B GCM_CLEAR_B +#define CELL_GCM_CLEAR_A GCM_CLEAR_A + +#define CELL_GCM_FUNC_ADD GCM_FUNC_ADD + +#define CELL_GCM_SMOOTH (0x1D01) +#define CELL_GCM_DEBUG_LEVEL2 2 + +#define CELL_GCM_COMPMODE_DISABLED 0 + +#define CELL_GCM_TRANSFER_LOCAL_TO_LOCAL 0 + +#define CELL_GCM_TEXTURE_REMAP_ORDER_XYXY (0) +#define CELL_GCM_TEXTURE_REMAP_ORDER_XXXY (1) + +#define CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL (0) + +#define CELL_GCM_TEXTURE_REMAP_FROM_A (0) +#define CELL_GCM_TEXTURE_REMAP_FROM_R (1) +#define CELL_GCM_TEXTURE_REMAP_FROM_G (2) +#define CELL_GCM_TEXTURE_REMAP_FROM_B (3) + +#define CELL_GCM_TEXTURE_REMAP_ZERO (0) +#define CELL_GCM_TEXTURE_REMAP_ONE (1) +#define CELL_GCM_TEXTURE_REMAP_REMAP (2) + +#define CELL_GCM_MAX_TEXIMAGE_COUNT (16) + +#define CELL_GCM_TEXTURE_WRAP (1) + +#define CELL_GCM_TEXTURE_NR (0x00) +#define CELL_GCM_TEXTURE_LN (0x20) + +#define CELL_GCM_TEXTURE_B8 (0x81) + +#define CELL_RESC_720x480 RESC_720x480 +#define CELL_RESC_720x576 RESC_720x576 +#define CELL_RESC_1280x720 RESC_1280x720 +#define CELL_RESC_1920x1080 RESC_1920x1080 + +#define CELL_RESC_FULLSCREEN RESC_FULLSCREEN +#define CELL_RESC_PANSCAN RESC_PANSCAN +#define CELL_RESC_LETTERBOX RESC_LETTERBOX +#define CELL_RESC_CONSTANT_VRAM RESC_CONSTANT_VRAM +#define CELL_RESC_MINIMUM_GPU_LOAD RESC_MINIMUM_GPU_LOAD + +#define CELL_RESC_PAL_50 RESC_PAL_50 +#define CELL_RESC_PAL_60_DROP RESC_PAL_60_DROP +#define CELL_RESC_PAL_60_INTERPOLATE RESC_PAL_60_INTERPOLATE +#define CELL_RESC_PAL_60_INTERPOLATE_30_DROP RESC_PAL_60_INTERPOLATE_30_DROP +#define CELL_RESC_PAL_60_INTERPOLATE_DROP_FLEXIBLE RESC_PAL_60_INTERPOLATE_DROP_FLEXIBLE + +#define CELL_RESC_INTERLACE_FILTER RESC_INTERLACE_FILTER +#define CELL_RESC_NORMAL_BILINEAR RESC_NORMAL_BILINEAR + +#define CELL_RESC_ELEMENT_HALF RESC_ELEMENT_HALF + +#define CELL_VIDEO_OUT_ASPECT_AUTO VIDEO_ASPECT_AUTO +#define CELL_VIDEO_OUT_ASPECT_4_3 VIDEO_ASPECT_4_3 +#define CELL_VIDEO_OUT_ASPECT_16_9 VIDEO_ASPECT_16_9 + +#define CELL_VIDEO_OUT_RESOLUTION_480 VIDEO_RESOLUTION_480 +#define CELL_VIDEO_OUT_RESOLUTION_576 VIDEO_RESOLUTION_576 +#define CELL_VIDEO_OUT_RESOLUTION_720 VIDEO_RESOLUTION_720 +#define CELL_VIDEO_OUT_RESOLUTION_1080 VIDEO_RESOLUTION_1080 +#define CELL_VIDEO_OUT_RESOLUTION_960x1080 VIDEO_RESOLUTION_960x1080 +#define CELL_VIDEO_OUT_RESOLUTION_1280x1080 VIDEO_RESOLUTION_1280x1080 +#define CELL_VIDEO_OUT_RESOLUTION_1440x1080 VIDEO_RESOLUTION_1440x1080 +#define CELL_VIDEO_OUT_RESOLUTION_1600x1080 VIDEO_RESOLUTION_1600x1080 + +#define CELL_VIDEO_OUT_SCAN_MODE_PROGRESSIVE VIDEO_SCANMODE_PROGRESSIVE + +#define CELL_VIDEO_OUT_PRIMARY VIDEO_PRIMARY + +#define CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_X8R8G8B8 VIDEO_BUFFER_FORMAT_XRGB +#define CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_R16G16B16X16_FLOAT VIDEO_BUFFER_FORMAT_FLOAT + +#define CellGcmSurface gcmSurface +#define CellGcmTexture gcmTexture +#define CellGcmContextData _gcmCtxData +#define CellGcmConfig gcmConfiguration +#define CellVideoOutConfiguration videoConfiguration +#define CellVideoOutResolution videoResolution +#define CellVideoOutState videoState + +#define CellRescInitConfig rescInitConfig +#define CellRescSrc rescSrc +#define CellRescBufferMode rescBufferMode + +#define resolutionId resolution +#define memoryFrequency memoryFreq +#define coreFrequency coreFreq + +#define cellGcmFinish rsxFinish + +#define cellGcmGetFlipStatus gcmGetFlipStatus +#define cellGcmResetFlipStatus gcmResetFlipStatus +#define cellGcmSetWaitFlip gcmSetWaitFlip +#define cellGcmSetDebugOutputLevel gcmSetDebugOutputLevel +#define cellGcmSetDisplayBuffer gcmSetDisplayBuffer +#define cellGcmSetGraphicsHandler gcmSetGraphicsHandler +#define cellGcmSetFlipHandler gcmSetFlipHandler +#define cellGcmSetVBlankHandler gcmSetVBlankHandler +#define cellGcmGetConfiguration gcmGetConfiguration +#define cellGcmSetJumpCommand rsxSetJumpCommand +#define cellGcmFlush rsxFlushBuffer +#define cellGcmSetFlipMode gcmSetFlipMode +#define cellGcmSetFlip gcmSetFlip +#define cellGcmGetLabelAddress gcmGetLabelAddress +#define cellGcmUnbindTile gcmUnbindTile +#define cellGcmBindTile gcmBindTile +#define cellGcmSetTileInfo gcmSetTileInfo +#define cellGcmAddressToOffset gcmAddressToOffset + +#define cellRescCreateInterlaceTable rescCreateInterlaceTable +#define cellRescSetDisplayMode rescSetDisplayMode +#define cellRescGetNumColorBuffers rescGetNumColorBuffers +#define cellRescGetBufferSize rescGetBufferSize +#define cellRescSetBufferAddress rescSetBufferAddress +#define cellRescGetFlipStatus rescGetFlipStatus +#define cellRescResetFlipStatus rescResetFlipStatus +#define cellRescSetConvertAndFlip rescSetConvertAndFlip +#define cellRescSetVBlankHandler rescSetVBlankHandler +#define cellRescSetFlipHandler rescSetFlipHandler +#define cellRescAdjustAspectRatio rescAdjustAspectRatio +#define cellRescSetWaitFlip rescSetWaitFlip +#define cellRescSetSrc rescSetSrc +#define cellRescInit rescInit +#define cellRescExit rescExit + +#define cellVideoOutConfigure videoConfigure +#define cellVideoOutGetState videoGetState +#define cellVideoOutGetResolution videoGetResolution +#define cellVideoOutGetResolutionAvailability videoGetResolutionAvailability + +#define cellGcmSetViewportInline rsxSetViewport +#define cellGcmSetReferenceCommandInline rsxSetReferenceCommand +#define cellGcmSetBlendEquationInline rsxSetBlendEquation +#define cellGcmSetWriteBackEndLabelInline rsxSetWriteBackendLabel +#define cellGcmSetWaitLabelInline rsxSetWaitLabel +#define cellGcmSetDepthTestEnableInline rsxSetDepthTestEnable +#define cellGcmSetScissorInline rsxSetScissor +#define cellGcmSetBlendEnableInline rsxSetBlendEnable +#define cellGcmSetClearColorInline rsxSetClearColor +#define cellGcmSetBlendFuncInline rsxSetBlendFunc +#define cellGcmSetBlendColorInline rsxSetBlendColor +#define cellGcmSetTextureFilterInline rsxTextureFilter +#define cellGcmSetTextureControlInline rsxTextureControl +#define cellGcmSetCullFaceEnableInline rsxSetCullFaceEnable +#define cellGcmSetShadeModeInline rsxSetShadeModel +#define cellGcmSetTransferImage rsxSetTransferImage +#define cellGcmSetBlendColor rsxSetBlendColor +#define cellGcmSetBlendEquation rsxSetBlendEquation +#define cellGcmSetBlendFunc rsxSetBlendFunc +#define cellGcmSetClearColor rsxSetClearColor +#define cellGcmSetScissor rsxSetScissor +#define celGcmSetInvalidateVertexCache(fifo) rsxInvalidateTextureCache(fifo, GCM_INVALIDATE_VERTEX_TEXTURE) +#else +#define cellGcmSetTransferImage cellGcmSetTransferImageInline +#define celGcmSetInvalidateVertexCache cellGcmSetInvalidateVertexCacheInline +#endif + +/*============================================================ + NETWORK PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <net/netctl.h> + +#define cellNetCtlInit netCtlInit +#define cellNetCtlGetState netCtlGetState +#define cellNetCtlTerm netCtlTerm + +#define CELL_NET_CTL_STATE_IPObtained NET_CTL_STATE_IPObtained +#else +#define netCtlInit cellNetCtlInit +#define netCtlGetState cellNetCtlGetState +#define netCtlTerm cellNetCtlTerm +#define NET_CTL_STATE_IPObtained CELL_NET_CTL_STATE_IPObtained +#endif + +/*============================================================ + NET PROTOTYPES +============================================================ */ + +#if defined(HAVE_NETWORKING) +#ifdef __PSL1GHT__ +#include <net/net.h> + +#define socketselect select +#define socketclose close + +#define sys_net_initialize_network netInitialize +#define sys_net_finalize_network netFinalizeNetwork +#else +#include <netex/net.h> +#include <np.h> +#include <np/drm.h> + +#define netInitialize sys_net_initialize_network +#define netFinalizeNetwork sys_net_finalize_network +#endif +#endif + +/*============================================================ + SYSUTIL PROTOTYPES +============================================================ */ + +#ifdef __PSL1GHT__ +#include <sysutil/game.h> +#define CellGameContentSize sysGameContentSize +#define cellGameContentPermit sysGameContentPermit +#define cellGameBootCheck sysGameBootCheck + +#define CELL_GAME_ATTRIBUTE_APP_HOME (UINT64_C(1) <<1) /* boot from / app_home/PS3_GAME */ +#define CELL_GAME_DIRNAME_SIZE 32 + +#define CELL_GAME_GAMETYPE_SYS 0 +#define CELL_GAME_GAMETYPE_DISC 1 +#define CELL_GAME_GAMETYPE_HDD 2 +#define CELL_GAME_GAMETYPE_GAMEDATA 3 +#define CELL_GAME_GAMETYPE_HOME 4 + +#endif + +#if defined(HAVE_SYSUTILS) +#ifdef __PSL1GHT__ +#include <sysutil/sysutil.h> + +#define CELL_SYSUTIL_REQUEST_EXITGAME SYSUTIL_EXIT_GAME + +#define cellSysutilRegisterCallback sysUtilRegisterCallback +#define cellSysutilCheckCallback sysUtilCheckCallback +#else +#include <sysutil/sysutil_screenshot.h> +#include <sysutil/sysutil_common.h> +#include <sysutil/sysutil_gamecontent.h> +#endif +#endif + +#if(CELL_SDK_VERSION > 0x340000) +#include <sysutil/sysutil_bgmplayback.h> +#endif + +/*============================================================ + SYSMODULE PROTOTYPES +============================================================ */ + +#if defined(HAVE_SYSMODULES) +#ifdef __PSL1GHT__ +#include <sysmodule/sysmodule.h> + +#define CELL_SYSMODULE_IO SYSMODULE_IO +#define CELL_SYSMODULE_FS SYSMODULE_FS +#define CELL_SYSMODULE_NET SYSMODULE_NET +#define CELL_SYSMODULE_SYSUTIL_NP SYSMODULE_SYSUTIL_NP +#define CELL_SYSMODULE_JPGDEC SYSMODULE_JPGDEC +#define CELL_SYSMODULE_PNGDEC SYSMODULE_PNGDEC + +#define cellSysmoduleLoadModule sysModuleLoad +#define cellSysmoduleUnloadModule sysModuleUnload + +#else +#include <cell/sysmodule.h> + +#define sysModuleLoad cellSysmoduleLoadModule +#define sysModuleUnload cellSysmoduleUnloadModule +#define SYSMODULE_NET CELL_SYSMODULE_NET +#endif +#endif + +/*============================================================ + FS PROTOTYPES +============================================================ */ +#define FS_SUCCEEDED 0 +#define FS_TYPE_DIR 1 +#ifdef __PSL1GHT__ +#include <lv2/sysfs.h> +#define O_RDONLY SYS_O_RDONLY +#define O_WRONLY SYS_O_WRONLY +#define O_CREAT SYS_O_CREAT +#define O_TRUNC SYS_O_TRUNC +#define O_RDWR SYS_O_RDWR +#else +#include <cell/cell_fs.h> +#define O_RDONLY CELL_FS_O_RDONLY +#define O_WRONLY CELL_FS_O_WRONLY +#define O_CREAT CELL_FS_O_CREAT +#define O_TRUNC CELL_FS_O_TRUNC +#define O_RDWR CELL_FS_O_RDWR +#define sysFsStat cellFsStat +#define sysFSStat CellFsStat +#define sysFSDirent CellFsDirent +#define sysFsOpendir cellFsOpendir +#define sysFsReaddir cellFsReaddir +#define sysFSDirent CellFsDirent +#define sysFsClosedir cellFsClosedir +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/defines/psp_defines.h
Added
@@ -0,0 +1,145 @@ +/* Copyright (C) 2010-2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (psp_defines.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _PSP_DEFINES_H +#define _PSP_DEFINES_H + +/*============================================================ + ERROR PROTOTYPES +============================================================ */ + +#ifndef SCE_OK +#define SCE_OK 0 +#endif + +/*============================================================ + DISPLAY PROTOTYPES +============================================================ */ + +#if defined(SN_TARGET_PSP2) || defined(VITA) + +#ifdef VITA +int sceClibPrintf ( const char * format, ... ); +#define printf sceClibPrintf +#define PSP_DISPLAY_PIXEL_FORMAT_8888 (SCE_DISPLAY_PIXELFORMAT_A8B8G8R8) +#else +#define PSP_DISPLAY_PIXEL_FORMAT_8888 (SCE_DISPLAY_PIXELFORMAT_A8B8G8R8) +#endif + +#define DisplaySetFrameBuf(topaddr, bufferwidth, pixelformat, sync) sceDisplaySetFrameBuf(topaddr, sync) + +#define PSP_FB_WIDTH 960 +#define PSP_FB_HEIGHT 544 +#define PSP_PITCH_PIXELS 1024 + + // Memory left to the system for threads and other internal stuffs +#ifdef SCE_LIBC_SIZE +#define RAM_THRESHOLD 0x2000000 + SCE_LIBC_SIZE +#else +#define RAM_THRESHOLD 0x2000000 +#endif + +#elif defined(PSP) +#define DisplaySetFrameBuf(topaddr, bufferwidth, pixelformat, sync) sceDisplaySetFrameBuf(topaddr, bufferwidth, pixelformat, sync) + +#define SCE_DISPLAY_UPDATETIMING_NEXTVSYNC 1 + +#define PSP_FB_WIDTH 512 +#define PSP_FB_HEIGHT 512 +#define PSP_PITCH_PIXELS 512 + +#endif + +/*============================================================ + INPUT PROTOTYPES +============================================================ */ + +#if defined(SN_TARGET_PSP2) || defined(VITA) + +#define STATE_BUTTON(state) ((state).buttons) +#define STATE_ANALOGLX(state) ((state).lx) +#define STATE_ANALOGLY(state) ((state).ly) +#define STATE_ANALOGRX(state) ((state).rx) +#define STATE_ANALOGRY(state) ((state).ry) + +#if defined(VITA) +#define DEFAULT_SAMPLING_MODE (SCE_CTRL_MODE_ANALOG) + +#define PSP_CTRL_LEFT SCE_CTRL_LEFT +#define PSP_CTRL_DOWN SCE_CTRL_DOWN +#define PSP_CTRL_RIGHT SCE_CTRL_RIGHT +#define PSP_CTRL_UP SCE_CTRL_UP +#define PSP_CTRL_START SCE_CTRL_START +#define PSP_CTRL_SELECT SCE_CTRL_SELECT +#define PSP_CTRL_TRIANGLE SCE_CTRL_TRIANGLE +#define PSP_CTRL_SQUARE SCE_CTRL_SQUARE +#define PSP_CTRL_CROSS SCE_CTRL_CROSS +#define PSP_CTRL_CIRCLE SCE_CTRL_CIRCLE +#define PSP_CTRL_L SCE_CTRL_L1 +#define PSP_CTRL_R SCE_CTRL_R1 +#define PSP_CTRL_L2 SCE_CTRL_LTRIGGER +#define PSP_CTRL_R2 SCE_CTRL_RTRIGGER +#define PSP_CTRL_L3 SCE_CTRL_L3 +#define PSP_CTRL_R3 SCE_CTRL_R3 +#else +#define DEFAULT_SAMPLING_MODE (SCE_CTRL_MODE_DIGITALANALOG) + +#define PSP_CTRL_LEFT SCE_CTRL_LEFT +#define PSP_CTRL_DOWN SCE_CTRL_DOWN +#define PSP_CTRL_RIGHT SCE_CTRL_RIGHT +#define PSP_CTRL_UP SCE_CTRL_UP +#define PSP_CTRL_START SCE_CTRL_START +#define PSP_CTRL_SELECT SCE_CTRL_SELECT +#define PSP_CTRL_TRIANGLE SCE_CTRL_TRIANGLE +#define PSP_CTRL_SQUARE SCE_CTRL_SQUARE +#define PSP_CTRL_CROSS SCE_CTRL_CROSS +#define PSP_CTRL_CIRCLE SCE_CTRL_CIRCLE +#define PSP_CTRL_L SCE_CTRL_L +#define PSP_CTRL_R SCE_CTRL_R +#endif + +#if defined(VITA) +#define CtrlSetSamplingMode(mode) sceCtrlSetSamplingModeExt(mode) +#define CtrlPeekBufferPositive(port, pad_data, bufs) sceCtrlPeekBufferPositiveExt2(port, pad_data, bufs) +#else +#define CtrlSetSamplingMode(mode) sceCtrlSetSamplingMode(mode) +#define CtrlPeekBufferPositive(port, pad_data, bufs) sceCtrlPeekBufferPositive(port, pad_data, bufs) +#endif + +#elif defined(PSP) + +#define PSP_CTRL_L PSP_CTRL_LTRIGGER +#define PSP_CTRL_R PSP_CTRL_RTRIGGER + +#define STATE_BUTTON(state) ((state).Buttons) +#define STATE_ANALOGLX(state) ((state).Lx) +#define STATE_ANALOGLY(state) ((state).Ly) +#define STATE_ANALOGRX(state) ((state).Rx) +#define STATE_ANALOGRY(state) ((state).Ry) + +#define DEFAULT_SAMPLING_MODE (PSP_CTRL_MODE_ANALOG) + +#define CtrlSetSamplingMode(mode) sceCtrlSetSamplingMode(mode) +#define CtrlPeekBufferPositive(port, pad_data, bufs) sceCtrlPeekBufferPositive(pad_data, bufs) +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/dynamic
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/dynamic/dylib.h
Added
@@ -0,0 +1,71 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (dylib.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __DYLIB_H +#define __DYLIB_H + +#include <boolean.h> + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <retro_common_api.h> + +#if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB) +#define NEED_DYNAMIC +#else +#undef NEED_DYNAMIC +#endif + +RETRO_BEGIN_DECLS + +typedef void *dylib_t; +typedef void (*function_t)(void); + +#ifdef NEED_DYNAMIC +/** + * dylib_load: + * @path : Path to libretro core library. + * + * Platform independent dylib loading. + * + * Returns: library handle on success, otherwise NULL. + **/ +dylib_t dylib_load(const char *path); + +/** + * dylib_close: + * @lib : Library handle. + * + * Frees library handle. + **/ +void dylib_close(dylib_t lib); + +char *dylib_error(void); + +function_t dylib_proc(dylib_t lib, const char *proc); +#endif + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/encodings/base64.h
Added
@@ -0,0 +1,48 @@ +#ifndef _LIBRETRO_ENCODINGS_BASE64_H +#define _LIBRETRO_ENCODINGS_BASE64_H + +#include <stdint.h> +#include <stddef.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +const static char* b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/* maps A=>0,B=>1.. */ +const static unsigned char unb64[]={ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 62, 0, 0, 0, 63, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +}; /* This array has 256 elements */ + +char* base64(const void* binaryData, int len, int *flen); +unsigned char* unbase64(const char* ascii, int len, int *flen); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/encodings/crc32.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/encodings/crc32.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (crc32.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/encodings/utf.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/encodings/utf.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (utf.h). @@ -35,7 +35,7 @@ enum CodePage { CODEPAGE_LOCAL = 0, /* CP_ACP */ - CODEPAGE_UTF8 = 65001 /* CP_UTF8 */ + CODEPAGE_UTF8 = 65001 /* CP_UTF8 */ }; size_t utf8_conv_utf32(uint32_t *out, size_t out_chars,
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/encodings/win32.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/encodings/win32.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (utf.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/fastcpy.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/fastcpy.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (fastcpy.h). @@ -45,49 +45,48 @@ static INLINE void* memset16(void* dst,uint16_t val,size_t size) { - uint16_t* typedptr = (uint16_t*)dst; + uint16_t *typedptr = (uint16_t*)dst; std::fill(typedptr, typedptr + size, val); return dst; } static INLINE void* memset32(void* dst,uint32_t val,size_t size) { - uint32_t* typedptr = (uint32_t*)dst; + uint32_t *typedptr = (uint32_t*)dst; std::fill(typedptr, typedptr + size, val); return dst; } static INLINE void* memset64(void* dst,uint64_t val,size_t size) { - uint64_t* typedptr = (uint64_t*)dst; + uint64_t *typedptr = (uint64_t*)dst; std::fill(typedptr, typedptr + size, val); return dst; } #else - -static INLINE void* memset16(void* dst,uint16_t val,size_t size) +static INLINE void *memset16(void* dst,uint16_t val,size_t size) { size_t i; - uint16_t* typedptr = (uint16_t*)dst; - for(i = 0;i < size;i++) + uint16_t *typedptr = (uint16_t*)dst; + for (i = 0;i < size;i++) typedptr[i] = val; return dst; } -static INLINE void* memset32(void* dst,uint32_t val,size_t size) +static INLINE void *memset32(void* dst,uint32_t val,size_t size) { size_t i; - uint32_t* typedptr = (uint32_t*)dst; - for(i = 0;i < size;i++) + uint32_t *typedptr = (uint32_t*)dst; + for (i = 0; i < size; i++) typedptr[i] = val; return dst; } -static INLINE void* memset64(void* dst,uint64_t val,size_t size) +static INLINE void *memset64(void* dst,uint64_t val,size_t size) { size_t i; - uint64_t* typedptr = (uint64_t*)dst; - for(i = 0;i < size;i++) + uint64_t *typedptr = (uint64_t*)dst; + for (i = 0; i < size;i++) typedptr[i] = val; return dst; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/features/features_cpu.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/features/features_cpu.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (features_cpu.h). @@ -68,6 +68,8 @@ **/ unsigned cpu_features_get_core_amount(void); +void cpu_features_get_model_name(char *name, int len); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/file/archive_file.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/file/archive_file.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (archive_file.h). @@ -37,9 +37,11 @@ #include <retro_common_api.h> -RETRO_BEGIN_DECLS +#if defined(RARCH_INTERNAL) && defined(HAVE_CONFIG_H) +#include "../../../config.h" /* for HAVE_MMAP */ +#endif -struct archive_extract_userdata; +RETRO_BEGIN_DECLS enum file_archive_transfer_type { @@ -52,72 +54,54 @@ typedef struct file_archive_handle { - void *stream; uint8_t *data; uint32_t real_checksum; - const struct file_archive_file_backend *backend; } file_archive_file_handle_t; -typedef struct file_archive_file_data file_archive_file_data_t; - typedef struct file_archive_transfer { - enum file_archive_transfer_type type; - int32_t archive_size; - ptrdiff_t start_delta; - file_archive_file_data_t *handle; - void *stream; - const uint8_t *footer; - const uint8_t *directory; - const uint8_t *data; + int64_t archive_size; + void *context; + struct RFILE *archive_file; const struct file_archive_file_backend *backend; +#ifdef HAVE_MMAP + uint8_t *archive_mmap_data; + int archive_mmap_fd; +#endif + unsigned step_total; + unsigned step_current; + enum file_archive_transfer_type type; } file_archive_transfer_t; -enum file_archive_compression_mode -{ - ARCHIVE_MODE_UNCOMPRESSED = 0, - ARCHIVE_MODE_COMPRESSED = 8 -}; - -struct decomp_state_t -{ - char *opt_file; - char *needle; - void **buf; - size_t size; - bool found; -}; - typedef struct { + file_archive_transfer_t archive; /* int64_t alignment */ char *source_file; char *subdir; char *target_dir; char *target_file; char *valid_ext; - char *callback_error; - - file_archive_transfer_t archive; struct archive_extract_userdata *userdata; } decompress_state_t; struct archive_extract_userdata { - char archive_path[PATH_MAX_LENGTH]; + /* These are set or read by the archive processing */ char *first_extracted_file_path; - char *extracted_file_path; const char *extraction_directory; - size_t archive_path_size; struct string_list *ext; struct string_list *list; + file_archive_transfer_t *transfer; + /* Not used by the processing, free to use outside or in iterate callback */ + decompress_state_t *dec; + void* cb_data; + size_t archive_path_size; + uint32_t crc; + char archive_path[PATH_MAX_LENGTH]; + char current_file_path[PATH_MAX_LENGTH]; bool found_file; bool list_only; - void *context; - char archive_name[PATH_MAX_LENGTH]; - uint32_t crc; - struct decomp_state_t decomp_state; - decompress_state_t *dec; }; /* Returns true when parsing should continue. False to stop. */ @@ -127,22 +111,27 @@ struct file_archive_file_backend { - void *(*stream_new)(void); - void (*stream_free)(void *); - bool (*stream_decompress_data_to_file_init)( - file_archive_file_handle_t *, const uint8_t *, uint32_t, uint32_t); - int (*stream_decompress_data_to_file_iterate)(void *); - uint32_t (*stream_crc_calculate)(uint32_t, const uint8_t *, size_t); - int (*compressed_file_read)(const char *path, const char *needle, void **buf, - const char *optional_outfile); int (*archive_parse_file_init)( file_archive_transfer_t *state, const char *file); int (*archive_parse_file_iterate_step)( - file_archive_transfer_t *state, + void *context, const char *valid_exts, struct archive_extract_userdata *userdata, file_archive_file_cb file_cb); + void (*archive_parse_file_free)( + void *context); + + bool (*stream_decompress_data_to_file_init)( + void *context, file_archive_file_handle_t *handle, + const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size); + int (*stream_decompress_data_to_file_iterate)( + void *context, + file_archive_file_handle_t *handle); + + uint32_t (*stream_crc_calculate)(uint32_t, const uint8_t *, size_t); + int64_t (*compressed_file_read)(const char *path, const char *needle, void **buf, + const char *optional_outfile); const char *ident; }; @@ -175,6 +164,13 @@ const char *valid_exts, const char *extraction_dir, char *out_path, size_t len); +/* Warning: 'list' must zero initialised before + * calling this function, otherwise memory leaks/ + * undefined behaviour will occur */ +bool file_archive_get_file_list_noalloc(struct string_list *list, + const char *path, + const char *valid_exts); + /** * file_archive_get_file_list: * @path : filename path of archive
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/file/config_file.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/file/config_file.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (config_file.h). @@ -54,13 +54,15 @@ struct config_file { char *path; + char *reference; + struct config_entry_list **entries_map; struct config_entry_list *entries; struct config_entry_list *tail; struct config_entry_list *last; + struct config_include_list *includes; unsigned include_depth; bool guaranteed_no_duplicates; - - struct config_include_list *includes; + bool modified; }; typedef struct config_file config_file_t; @@ -86,17 +88,31 @@ * NULL path will create an empty config file. */ config_file_t *config_file_new(const char *path); +config_file_t *config_file_new_alloc(void); + +void config_file_initialize(struct config_file *conf); + /* Loads a config file. Returns NULL if file doesn't exist. * NULL path will create an empty config file. * Includes cb callbacks to run custom code during config file processing.*/ config_file_t *config_file_new_with_callback(const char *path, config_file_cb_t *cb); -/* Load a config file from a string. */ -config_file_t *config_file_new_from_string(const char *from_string); +/* Load a config file from a string. + * > WARNING: This will modify 'from_string'. + * Pass a copy of source string if original + * contents must be preserved */ +config_file_t *config_file_new_from_string(char *from_string, + const char *path); + +config_file_t *config_file_new_from_path_to_string(const char *path); /* Frees config file. */ void config_file_free(config_file_t *conf); +void config_file_set_reference_path(config_file_t *conf, char *path); + +bool config_file_deinitialize(config_file_t *conf); + /* Loads a new config, and appends its data to conf. * The key-value pairs of the new config file takes priority over the old. */ bool config_append_file(config_file_t *conf, const char *path); @@ -106,7 +122,17 @@ bool config_entry_exists(config_file_t *conf, const char *entry); -struct config_entry_list; +struct config_entry_list +{ + char *key; + char *value; + struct config_entry_list *next; + /* If we got this from an #include, + * do not allow overwrite. */ + bool readonly; +}; + + struct config_file_entry { const char *key; @@ -115,6 +141,9 @@ const struct config_entry_list *next; }; +struct config_entry_list *config_get_entry( + const config_file_t *conf, const char *key); + bool config_get_entry_list_head(config_file_t *conf, struct config_file_entry *entry); bool config_get_entry_list_next(struct config_file_entry *entry);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/file/config_file_userdata.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/file/config_file_userdata.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (config_file_userdata.h). @@ -43,6 +43,9 @@ int config_userdata_get_int(void *userdata, const char *key_str, int *value, int default_value); +int config_userdata_get_hex(void *userdata, const char *key_str, + unsigned *value, unsigned default_value); + int config_userdata_get_float_array(void *userdata, const char *key_str, float **values, unsigned *out_num_values, const float *default_values, unsigned num_default_values);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/file/file_path.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/file/file_path.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2019 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (file_path.h). @@ -125,6 +125,7 @@ * Returns: basename from path. **/ const char *path_basename(const char *path); +const char *path_basename_nocompression(const char *path); /** * path_basedir: @@ -147,13 +148,38 @@ /** * path_resolve_realpath: - * @buf : buffer for path + * @buf : input and output buffer for path * @size : size of buffer + * @resolve_symlinks : whether to resolve symlinks or not * - * Turns relative paths into absolute path. - * If relative, rebases on current working dir. + * Resolves use of ".", "..", multiple slashes etc in absolute paths. + * + * Relative paths are rebased on the current working dir. + * + * Returns: @buf if successful, NULL otherwise. + * Note: Not implemented on consoles + * Note: Symlinks are only resolved on Unix-likes + * Note: The current working dir might not be what you expect, + * e.g. on Android it is "/" + * Use of fill_pathname_resolve_relative() should be prefered **/ -void path_resolve_realpath(char *buf, size_t size); +char *path_resolve_realpath(char *buf, size_t size, bool resolve_symlinks); + +/** + * path_relative_to: + * @out : buffer to write the relative path to + * @path : path to be expressed relatively + * @base : relative to this + * @size : size of output buffer + * + * Turns @path into a path relative to @base and writes it to @out. + * + * @base is assumed to be a base directory, i.e. a path ending with '/' or '\'. + * Both @path and @base are assumed to be absolute paths without "." or "..". + * + * E.g. path /a/b/e/f.cgp with base /a/b/c/d/ turns into ../../e/f.cgp + **/ +size_t path_relative_to(char *out, const char *path, const char *base, size_t size); /** * path_is_absolute: @@ -201,7 +227,7 @@ * E.g.: * out_filename = "RetroArch-{month}{day}-{Hours}{Minutes}.{@ext}" **/ -void fill_dated_filename(char *out_filename, +size_t fill_dated_filename(char *out_filename, const char *ext, size_t size); /** @@ -234,7 +260,7 @@ * present in 'in_path', it will be ignored. * */ -void fill_pathname_noext(char *out_path, const char *in_path, +size_t fill_pathname_noext(char *out_path, const char *in_path, const char *replace, size_t size); /** @@ -264,7 +290,7 @@ * E.g..: in_dir = "/tmp/some_dir", in_basename = "/some_content/foo.c", * replace = ".asm" => in_dir = "/tmp/some_dir/foo.c.asm" **/ -void fill_pathname_dir(char *in_dir, const char *in_basename, +size_t fill_pathname_dir(char *in_dir, const char *in_basename, const char *replace, size_t size); /** @@ -275,12 +301,12 @@ * * Copies basename of @in_path into @out_path. **/ -void fill_pathname_base(char *out_path, const char *in_path, size_t size); +size_t fill_pathname_base(char *out_path, const char *in_path, size_t size); void fill_pathname_base_noext(char *out_dir, const char *in_path, size_t size); -void fill_pathname_base_ext(char *out, +size_t fill_pathname_base_ext(char *out, const char *in_path, const char *ext, size_t size); @@ -351,21 +377,20 @@ * Makes sure not to get two consecutive slashes * between directory and path. **/ -void fill_pathname_join(char *out_path, const char *dir, +size_t fill_pathname_join(char *out_path, const char *dir, const char *path, size_t size); -void fill_pathname_join_special_ext(char *out_path, +size_t fill_pathname_join_special_ext(char *out_path, const char *dir, const char *path, const char *last, const char *ext, size_t size); -void fill_pathname_join_concat_noext( - char *out_path, +size_t fill_pathname_join_concat_noext(char *out_path, const char *dir, const char *path, const char *concat, size_t size); -void fill_pathname_join_concat(char *out_path, +size_t fill_pathname_join_concat(char *out_path, const char *dir, const char *path, const char *concat, size_t size); @@ -384,10 +409,10 @@ * Joins a directory (@dir) and path (@path) together * using the given delimiter (@delim). **/ -void fill_pathname_join_delim(char *out_path, const char *dir, +size_t fill_pathname_join_delim(char *out_path, const char *dir, const char *path, const char delim, size_t size); -void fill_pathname_join_delim_concat(char *out_path, const char *dir, +size_t fill_pathname_join_delim_concat(char *out_path, const char *dir, const char *path, const char delim, const char *concat, size_t size); @@ -406,7 +431,7 @@ * E.g.: "/path/to/game.img" -> game.img * "/path/to/myarchive.7z#folder/to/game.img" -> game.img */ -void fill_short_pathname_representation(char* out_rep, +size_t fill_short_pathname_representation(char* out_rep, const char *in_path, size_t size); void fill_short_pathname_representation_noext(char* out_rep, @@ -418,6 +443,12 @@ void fill_pathname_abbreviate_special(char *out_path, const char *in_path, size_t size); +void fill_pathname_abbreviated_or_relative(char *out_path, const char *in_refpath, const char *in_path, size_t size); + +void pathname_conform_slashes_to_os(char *path); + +void pathname_make_slashes_portable(char *path); + /** * path_basedir: * @path : path @@ -436,9 +467,9 @@ * Returns: true (1) if character is a slash, otherwise false (0). */ #ifdef _WIN32 -#define path_char_is_slash(c) (((c) == '/') || ((c) == '\\')) +#define PATH_CHAR_IS_SLASH(c) (((c) == '/') || ((c) == '\\')) #else -#define path_char_is_slash(c) ((c) == '/') +#define PATH_CHAR_IS_SLASH(c) ((c) == '/') #endif /** @@ -449,11 +480,11 @@ * Returns: default slash separator. */ #ifdef _WIN32 -#define path_default_slash() "\\" -#define path_default_slash_c() '\\' +#define PATH_DEFAULT_SLASH() "\\" +#define PATH_DEFAULT_SLASH_C() '\\' #else -#define path_default_slash() "/" -#define path_default_slash_c() '/' +#define PATH_DEFAULT_SLASH() "/" +#define PATH_DEFAULT_SLASH_C() '/' #endif /** @@ -494,10 +525,14 @@ bool path_is_character_special(const char *path); +int path_stat(const char *path); + bool path_is_valid(const char *path); int32_t path_get_size(const char *path); +bool is_path_accessible_using_standard_io(const char *path); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/file/nbio.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/file/nbio.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (nbio.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/filters.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/filters.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (filters.h).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/cdfs.h
Added
@@ -0,0 +1,108 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (cdfs.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __RARCH_CDFS_H +#define __RARCH_CDFS_H + +#include <streams/interface_stream.h> + +RETRO_BEGIN_DECLS + +/* these functions provide an interface for locating and reading files within a data track + * of a CD (following the ISO-9660 directory structure definition) + */ + +typedef struct cdfs_track_t +{ + intfstream_t* stream; + unsigned int stream_sector_size; + unsigned int stream_sector_header_size; + unsigned int first_sector_offset; +} cdfs_track_t; + +typedef struct cdfs_file_t +{ + struct cdfs_track_t* track; + int first_sector; + int current_sector; + int sector_buffer_valid; + unsigned int current_sector_offset; + unsigned int size; + unsigned int pos; + uint8_t sector_buffer[2048]; +} cdfs_file_t; + +/* opens the specified file within the CD or virtual CD. + * if path is NULL, will open the raw CD (useful for + * reading CD without having to worry about sector sizes, + * headers, or checksum data) + */ +int cdfs_open_file(cdfs_file_t* file, cdfs_track_t* stream, const char* path); + +void cdfs_close_file(cdfs_file_t* file); + +int64_t cdfs_read_file(cdfs_file_t* file, void* buffer, uint64_t len); + +int64_t cdfs_get_size(cdfs_file_t* file); + +int64_t cdfs_tell(cdfs_file_t* file); + +int64_t cdfs_seek(cdfs_file_t* file, int64_t offset, int whence); + +void cdfs_seek_sector(cdfs_file_t* file, unsigned int sector); + +/* opens the specified track in a CD or virtual CD file - the resulting stream should be passed to + * cdfs_open_file to get access to a file within the CD. + * + * supported files: + * real CD - path will be in the form "cdrom://drive1.cue" or "cdrom://d:/drive.cue" + * bin/cue - path will point to the cue file + * chd - path will point to the chd file + * + * for bin/cue files, the following storage modes are supported: + * MODE2/2352 + * MODE1/2352 + * MODE1/2048 - untested + * MODE2/2336 - untested + */ +cdfs_track_t* cdfs_open_track(const char* path, unsigned int track_index); + +/* opens the first data track in a CD or virtual CD file. see cdfs_open_track for supported file formats + */ +cdfs_track_t* cdfs_open_data_track(const char* path); + +/* opens a raw track file for a CD or virtual CD. + * + * supported files: + * real CD - path will be in the form "cdrom://drive1-track01.bin" or "cdrom://d:/drive-track01.bin" + * NOTE: cue file for CD must be opened first to populate vfs_cdrom_toc. + * bin - path will point to the bin file + * iso - path will point to the iso file + */ +cdfs_track_t* cdfs_open_raw_track(const char* path); + +/* closes the CD or virtual CD track and frees the associated memory */ +void cdfs_close_track(cdfs_track_t* track); + +RETRO_END_DECLS + +#endif /* __RARCH_CDFS_H */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/image.h
Added
@@ -0,0 +1,102 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (image.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __RARCH_IMAGE_CONTEXT_H +#define __RARCH_IMAGE_CONTEXT_H + +#include <stdint.h> +#include <stddef.h> + +#include <retro_common_api.h> + +#include <boolean.h> + +RETRO_BEGIN_DECLS + +enum image_process_code +{ + IMAGE_PROCESS_ERROR = -2, + IMAGE_PROCESS_ERROR_END = -1, + IMAGE_PROCESS_NEXT = 0, + IMAGE_PROCESS_END = 1 +}; + +struct texture_image +{ + uint32_t *pixels; + unsigned width; + unsigned height; + bool supports_rgba; +}; + +enum image_type_enum +{ + IMAGE_TYPE_NONE = 0, + IMAGE_TYPE_PNG, + IMAGE_TYPE_JPEG, + IMAGE_TYPE_BMP, + IMAGE_TYPE_TGA +}; + +enum image_type_enum image_texture_get_type(const char *path); + +bool image_texture_set_color_shifts(unsigned *r_shift, unsigned *g_shift, + unsigned *b_shift, unsigned *a_shift, + struct texture_image *out_img); + +bool image_texture_color_convert(unsigned r_shift, + unsigned g_shift, unsigned b_shift, unsigned a_shift, + struct texture_image *out_img); + +bool image_texture_load_buffer(struct texture_image *img, + enum image_type_enum type, void *buffer, size_t buffer_len); + +bool image_texture_load(struct texture_image *img, const char *path); +void image_texture_free(struct texture_image *img); + +/* Image transfer */ + +void image_transfer_free(void *data, enum image_type_enum type); + +void *image_transfer_new(enum image_type_enum type); + +bool image_transfer_start(void *data, enum image_type_enum type); + +void image_transfer_set_buffer_ptr( + void *data, + enum image_type_enum type, + void *ptr, + size_t len); + +int image_transfer_process( + void *data, + enum image_type_enum type, + uint32_t **buf, size_t size, + unsigned *width, unsigned *height); + +bool image_transfer_iterate(void *data, enum image_type_enum type); + +bool image_transfer_is_valid(void *data, enum image_type_enum type); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/jsonsax.h
Added
@@ -0,0 +1,70 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (jsonsax.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_JSONSAX_H__ +#define __LIBRETRO_SDK_FORMAT_JSONSAX_H__ + +#include <stddef.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +enum +{ + JSONSAX_OK = 0, + JSONSAX_INTERRUPTED, + JSONSAX_MISSING_KEY, + JSONSAX_UNTERMINATED_KEY, + JSONSAX_MISSING_VALUE, + JSONSAX_UNTERMINATED_OBJECT, + JSONSAX_UNTERMINATED_ARRAY, + JSONSAX_UNTERMINATED_STRING, + JSONSAX_INVALID_VALUE +}; + +#ifdef JSONSAX_ERRORS +extern const char* jsonsax_errors[]; +#endif + +typedef struct +{ + int ( *start_document )( void* userdata ); + int ( *end_document )( void* userdata ); + int ( *start_object )( void* userdata ); + int ( *end_object )( void* userdata ); + int ( *start_array )( void* userdata ); + int ( *end_array )( void* userdata ); + int ( *key )( void* userdata, const char* name, size_t length ); + int ( *array_index )( void* userdata, unsigned int index ); + int ( *string )( void* userdata, const char* string, size_t length ); + int ( *number )( void* userdata, const char* number, size_t length ); + int ( *boolean )( void* userdata, int istrue ); + int ( *null )( void* userdata ); +} +jsonsax_handlers_t; + +int jsonsax_parse( const char* json, const jsonsax_handlers_t* handlers, void* userdata ); + +RETRO_END_DECLS + +#endif /* __LIBRETRO_SDK_FORMAT_JSONSAX_H__ */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/jsonsax_full.h
Added
@@ -0,0 +1,1040 @@ +/* + Copyright (c) 2012 John-Anthony Owens + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ + +#ifndef JSONSAX_H_INCLUDED +#define JSONSAX_H_INCLUDED + +/* The library version */ +#define JSON_MAJOR_VERSION 1 +#define JSON_MINOR_VERSION 4 +#define JSON_MICRO_VERSION 5 + +/* JSON_NO_PARSER and JSON_NO_WRITER, if defined, remove the corresponding + * APIs and functionality from the library. + */ +#if defined(JSON_NO_PARSER) && defined(JSON_NO_WRITER) +#error JSON_NO_PARSER and JSON_NO_WRITER cannot both be defined! +#endif + +#include <stddef.h> /* for size_t and NULL */ + +/* The library API is C and should not be subjected to C++ name mangling. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* JSON_EXPORT controls the library's public API import/export linkage + * specifiers. By default, the library will be compiled to support dynamic + * linkage. In order to build the library for static linkage, the JSON_STATIC + * macro must be defined when the library itself is built AND when the client + * includes jsonsax.h. + */ +#if defined(JSON_STATIC) +#define JSON_EXPORT /* nothing */ +#else +#if defined(_MSC_VER) +#if defined(JSON_BUILDING) +#define JSON_EXPORT __declspec(dllexport) +#else +#define JSON_EXPORT __declspec(dllimport) +#endif +#else +#if defined(JSON_BUILDING) +#define JSON_EXPORT __attribute__ ((visibility("default"))) +#else +#define JSON_EXPORT /* nothing */ +#endif +#endif +#endif + +/* JSON_CALL controls the library's public API calling-convention. Clients' + * handler functions should be declared with JSON_CALL in order to ensure + * that the calling convention matches. + */ +#ifndef JSON_CALL +#if defined(_MSC_VER) +#define JSON_CALL __cdecl +#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) +#define JSON_CALL __attribute__((cdecl)) +#else +#define JSON_CALL /* nothing */ +#endif +#endif + +#define JSON_API(t) JSON_EXPORT t JSON_CALL + +/* Boolean values used by the library. */ +typedef enum tag_JSON_Boolean +{ + JSON_False = 0, + JSON_True = 1 +} JSON_Boolean; + +/* Values returned by library APIs to indicate success or failure. */ +typedef enum tag_JSON_Status +{ + JSON_Failure = 0, + JSON_Success = 1 +} JSON_Status; + +/* Error codes. */ +typedef enum tag_JSON_Error +{ + JSON_Error_None = 0, + JSON_Error_OutOfMemory = 1, + JSON_Error_AbortedByHandler = 2, + JSON_Error_BOMNotAllowed = 3, + JSON_Error_InvalidEncodingSequence = 4, + JSON_Error_UnknownToken = 5, + JSON_Error_UnexpectedToken = 6, + JSON_Error_IncompleteToken = 7, + JSON_Error_ExpectedMoreTokens = 8, + JSON_Error_UnescapedControlCharacter = 9, + JSON_Error_InvalidEscapeSequence = 10, + JSON_Error_UnpairedSurrogateEscapeSequence = 11, + JSON_Error_TooLongString = 12, + JSON_Error_InvalidNumber = 13, + JSON_Error_TooLongNumber = 14, + JSON_Error_DuplicateObjectMember = 15, + JSON_Error_StoppedAfterEmbeddedDocument = 16 +} JSON_Error; + +/* Text encodings. */ +typedef enum tag_JSON_Encoding +{ + JSON_UnknownEncoding = 0, + JSON_UTF8 = 1, + JSON_UTF16LE = 2, + JSON_UTF16BE = 3, + JSON_UTF32LE = 4, + JSON_UTF32BE = 5 +} JSON_Encoding; + +/* Attributes of a string value. */ +typedef enum tag_JSON_StringAttribute +{ + JSON_SimpleString = 0, + JSON_ContainsNullCharacter = 1 << 0, /* U+0000 */ + JSON_ContainsControlCharacter = 1 << 1, /* U+0000 - U+001F */ + JSON_ContainsNonASCIICharacter = 1 << 2, /* U+0080 - U+10FFFF */ + JSON_ContainsNonBMPCharacter = 1 << 3, /* U+10000 - U+10FFFF */ + JSON_ContainsReplacedCharacter = 1 << 4 /* an invalid encoding sequence was replaced by U+FFFD */ +} JSON_StringAttribute; +typedef unsigned int JSON_StringAttributes; + +/* Attributes of a number value. */ +typedef enum tag_JSON_NumberAttribute +{ + JSON_SimpleNumber = 0, + JSON_IsNegative = 1 << 0, + JSON_IsHex = 1 << 1, + JSON_ContainsDecimalPoint = 1 << 2, + JSON_ContainsExponent = 1 << 3, + JSON_ContainsNegativeExponent = 1 << 4 +} JSON_NumberAttribute; +typedef unsigned int JSON_NumberAttributes; + +/* Types of "special" number. */ +typedef enum tag_JSON_SpecialNumber +{ + JSON_NaN = 0, + JSON_Infinity = 1, + JSON_NegativeInfinity = 2 +} JSON_SpecialNumber; + +/* Information identifying a location in a parser instance's input stream. */ +typedef struct tag_JSON_Location +{ + /* The zero-based index of the byte in the input stream. Note that this + * is the only value that unambiguously identifies the location, since + * line and column refer to characters (which may be encoded in the input + * as multi-byte sequences) rather than bytes. + */ + size_t byte; + + /* The zero-based line number of the character in the input stream. Note + * that the parser treats each of the following character sequences as a + * single line break for purposes of computing line numbers: + * + * U+000A (LINE FEED) + * U+000D (CARRIAGE RETURN) + * U+000D U+000A (CARRIAGE RETURN, LINE FEED) + * + */ + size_t line; + + /* The zero-based column number of the character in the input stream. */ + size_t column; + + /* The zero-based depth in the JSON document structure at the location. */ + size_t depth; +} JSON_Location; + +/* Custom memory management handlers. + * + * The semantics of these handlers correspond exactly to those of standard + * realloc(), and free(). The handlers also receive the value of the memory + * suite's user data parameter, which clients can use to implement memory + * pools or impose custom allocation limits, if desired. + */ +typedef void* (JSON_CALL * JSON_ReallocHandler)(void* userData, void* ptr, size_t size); +typedef void (JSON_CALL * JSON_FreeHandler)(void* userData, void* ptr); + +/* A suite of custom memory management functions. */ +typedef struct tag_JSON_MemorySuite +{ + void* userData; + JSON_ReallocHandler realloc; + JSON_FreeHandler free; +} JSON_MemorySuite; + +/******************** JSON Parser ********************/ + +#ifndef JSON_NO_PARSER + +/* Parser instance. */ +struct JSON_Parser_Data; /* opaque data */ +typedef struct JSON_Parser_Data* JSON_Parser; + +/* Create a parser instance. + * + * If pMemorySuite is null, the library will use the C runtime realloc() and + * free() as the parser's memory management suite. Otherwise, all the + * handlers in the memory suite must be non-null or the call will fail and + * return null. + */ +JSON_API(JSON_Parser) JSON_Parser_Create(const JSON_MemorySuite* pMemorySuite); + +/* Free a parser instance. + * + * Every successful call to JSON_Parser_Create() must eventually be paired + * with a call to JSON_Parser_Free() in order to avoid leaking memory. + * + * This function returns failure if the parser parameter is null or if the + * function was called reentrantly from inside a handler. + */ +JSON_API(JSON_Status) JSON_Parser_Free(JSON_Parser parser); + +/* Reset a parser instance so that it can be used to parse a new input stream. + * + * This function returns failure if the parser parameter is null or if the + * function was called reentrantly from inside a handler. + * + * After a parser is reset, its state is indistinguishable from its state + * when it was returned by JSON_Parser_Create(). The parser's custom memory + * suite, if any, is preserved; all other settings, state, and handlers are + * restored to their default values. + */ +JSON_API(JSON_Status) JSON_Parser_Reset(JSON_Parser parser); + +/* Get and set the user data value associated with a parser instance. + * + * This setting allows clients to associate additional data with a + * parser instance. The parser itself does not use the value. + * + * The default value of this setting is null. + * + * This setting can be changed at any time, even inside handlers. + */ +JSON_API(void*) JSON_Parser_GetUserData(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetUserData(JSON_Parser parser, void* userData); + +/* Get and set the input encoding for a parser instance. + * + * If the client does not explicitly set the input encoding before calling + * JSON_Parser_Parse() on the parser instance, the parser will use the first + * 4 bytes of input to detect the input encoding automatically. Once the + * parser has detected the encoding, calls to JSON_Parser_GetInputEncoding() + * will return the detected value. + * + * The default value of this setting is JSON_UnknownEncoding. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Encoding) JSON_Parser_GetInputEncoding(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetInputEncoding(JSON_Parser parser, JSON_Encoding encoding); + +/* Get and set the string encoding for a parser instance. + * + * This setting controls the encoding of the string values that are + * passed to the string and object member handlers. + * + * The default value of this setting is JSON_UTF8. + * + * This setting cannot be set to JSON_UnknownEncoding. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Encoding) JSON_Parser_GetStringEncoding(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetStringEncoding(JSON_Parser parser, JSON_Encoding encoding); + +/* Get and set the maximum length of strings that a parser instance allows. + * + * This setting controls the maximum length, in bytes (NOT characters), of + * the encoded strings that are passed to the string and object member + * handlers. If the parser encounters a string that, when encoded in the + * string encoding, is longer than the maximum string length, it triggers + * the JSON_TooLongString error. + * + * The default value of this setting is SIZE_MAX. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(size_t) JSON_Parser_GetMaxStringLength(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetMaxStringLength(JSON_Parser parser, size_t maxLength); + +/* Get and set the number encoding for a parser instance. + * + * This setting controls the encoding of the number values that are + * passed to the number handler. + * + * The default value of this setting is JSON_UTF8. + * + * This setting cannot be set to JSON_UnknownEncoding. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Encoding) JSON_Parser_GetNumberEncoding(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetNumberEncoding(JSON_Parser parser, JSON_Encoding encoding); + +/* Get and set the maximum length of numbers that a parser instance allows. + * + * This setting controls the maximum length, in bytes (NOT characters), of + * the encoded numbers that are passed to the number handler. If the parser + * encounters a number that, when encoded in the number encoding, is longer + * than the maximum number length, it triggers the JSON_TooLongNumber error. + * + * The default value of this setting is SIZE_MAX. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(size_t) JSON_Parser_GetMaxNumberLength(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetMaxNumberLength(JSON_Parser parser, size_t maxLength); + +/* Get and set whether a parser instance allows the input to begin with a + * byte-order-mark (BOM). + * + * RFC 4627 does not allow JSON text to begin with a BOM, but some clients + * may find it convenient to be lenient in this regard; for example, if the + * JSON text is being read from a file that has a BOM. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetAllowBOM(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetAllowBOM(JSON_Parser parser, JSON_Boolean allowBOM); + +/* Get and set whether a parser instance allows Javascript-style comments to + * appear in the JSON text. + * + * RFC 4627 does not allow JSON text to contain comments, but some clients + * may find it useful to allow them. + * + * Both types of comment described by ECMA-262 (multi-line and single-line) + * are supported. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetAllowComments(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetAllowComments(JSON_Parser parser, JSON_Boolean allowComments); + +/* Get and set whether a parser instance allows the "special" number literals + * NaN, Infinity, and -Infinity. + * + * RFC 4627 does not provide any way to represent NaN, Infinity, or -Infinity, + * but some clients may find it convenient to recognize these as literals, + * since they are emitted by many common JSON generators. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetAllowSpecialNumbers(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetAllowSpecialNumbers(JSON_Parser parser, JSON_Boolean allowSpecialNumbers); + +/* Get and set whether a parser instance allows hexadecimal notation to be + * used for specifying number values. + * + * RFC 4627 does not allow hexadecimal numbers, but some clients may find it + * convenient to allow them, in order to represent binary bit patterns more + * easily. + * + * The parser recognizes hexadecimal numbers that conform to the syntax of + * HexIntegerLiteral, as described in section 7.8.3 of ECMA-262. That is, a + * valid hexadecimal number must comprise the prefix '0x' or '0X', followed + * by a sequence of one or more of the following characters: '0' - '9', + * 'a' - 'f', and 'A' - 'F'. + * + * Hexadecimal numbers cannot be prefixed by a minus sign. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetAllowHexNumbers(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetAllowHexNumbers(JSON_Parser parser, JSON_Boolean allowHexNumbers); + +/* Get and set whether a parser instance allows unescaped control characters + * (U+0000 - U+001F) to appear inside string values. + * + * RFC 4627 does not allow JSON text to contain unescaped control characters, + * but some clients may find it useful to allow them. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetAllowUnescapedControlCharacters(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetAllowUnescapedControlCharacters(JSON_Parser parser, JSON_Boolean allowUnescapedControlCharacters); + +/* Get and set whether a parser instance replaces invalid encoding sequences + * it encounters inside string tokens with the Unicode replacement character + * (U+FFFD) rather than triggering an error. + * + * By default, the parser is strict when decoding the input stream, and will + * fail if it encounters an encoding sequence that is not valid for the input + * encoding. Note especially that this includes (but is not limited to) the + * following: + * + * - Overlong encoding sequences in UTF-8. + * - Surrogate codepoints encoded in UTF-8 or UTF-32. + * - Unpaired or improperly-paired surrogates in UTF-16. + * - Codepoints outside the Unicode range encoded in UTF-8 or UTF-32. + * + * The replacement follows the rules and recommendations described in section + * 3.9 of version 5.2.0 of [the Unicode Standard](http://www.unicode.org/versions/Unicode5.2.0/). + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetReplaceInvalidEncodingSequences(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetReplaceInvalidEncodingSequences(JSON_Parser parser, JSON_Boolean replaceInvalidEncodingSequences); + +/* Get and set whether a parser instance tracks object member names for all + * open objects and detects duplicate members if any occur in the input. + * + * RFC 4627 stipulates that JSON parsers SHOULD check for duplicates, but + * may opt not to in light of reasonable implementation considerations. + * Checking for duplicate members necessarily incurs non-trivial memory + * overhead, and is therefore not enabled by default. Most clients use + * their parse handlers to build some sort of in-memory DOM representation + * of the JSON text and therefore already have the means to check for + * duplicate member names without incurring additional memory overhead; it + * is recommended that these clients implement duplicate member checking + * in their object member handler (refer to SetObjectMemberHandler() for + * details) and leave this setting disabled. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetTrackObjectMembers(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetTrackObjectMembers(JSON_Parser parser, JSON_Boolean trackObjectMembers); + +/* Get and set whether a parser instance stops parsing as soon as the end of + * the top-level JSON document is parsed. + * + * This setting allows the client to parse JSON content that is embedded + * inside a larger data stream. If this setting is enabled, the parser will, + * upon successfully parsing the end of the embedded JSON document, set its + * error to JSON_Error_StoppedAfterEmbeddedDocument, set its error location + * to the location in the input stream immediately following the end of the + * document, and return JSON_Failure from JSON_Parser_Parse(). + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the parser has started parsing. + */ +JSON_API(JSON_Boolean) JSON_Parser_GetStopAfterEmbeddedDocument(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetStopAfterEmbeddedDocument(JSON_Parser parser, JSON_Boolean stopAfterEmbeddedDocument); + +/* Get the type of error, if any, encountered by a parser instance. + * + * If the parser encountered an error while parsing input, this function + * returns the type of the error. Otherwise, this function returns + * JSON_Error_None. + */ +JSON_API(JSON_Error) JSON_Parser_GetError(JSON_Parser parser); + +/* Get the location in the input stream at which a parser instance + * encountered an error. + * + * If the parser encountered an error while parsing input, this function + * sets the members of the structure pointed to by pLocation to the location + * in the input stream at which the error occurred and returns success. + * Otherwise, it leaves the members unchanged and returns failure. + */ +JSON_API(JSON_Status) JSON_Parser_GetErrorLocation(JSON_Parser parser, JSON_Location* pLocation); + +/* Get the location in the input stream of the beginning of the token + * that is currently being handled by one of a parser instance's parse + * handlers. + * + * If the parser is inside a parse handler, this function sets the members + * of the structure pointed to by pLocation to the location and returns + * success. Otherwise, it leaves the members unchanged and returns failure. + */ +JSON_API(JSON_Status) JSON_Parser_GetTokenLocation(JSON_Parser parser, JSON_Location* pLocation); + +/* Get the location in the input stream that immediately follows the end of + * the token that is currently being handled by one of a parser instance's + * parse handlers. + * + * If the parser is inside a parse handler, this function sets the members + * of the structure pointed to by pLocation to the location and returns + * success. Otherwise, it leaves the members unchanged and returns failure. + */ +JSON_API(JSON_Status) JSON_Parser_GetAfterTokenLocation(JSON_Parser parser, JSON_Location* pLocation); + +/* Parse handlers are callbacks that the client provides in order to + * be notified about the structure of the JSON document as it is being + * parsed. The following notes apply equally to all parse handlers: + * + * 1. Parse handlers are optional. In fact, a parser with no parse + * handlers at all can be used to simply validate that the input + * is valid JSON. + * + * 2. Parse handlers can be set, unset, or changed at any time, even + * from inside a parse handler. + * + * 3. If a parse handler returns JSON_Parser_Abort, the parser will + * abort the parse, set its error to JSON_Error_AbortedByHandler, + * set its error location to the start of the token that triggered + * the handler, and return JSON_Failure from the outer call to + * JSON_Parser_Parse(). + * + * 4. A parse handler can get the location in the input stream of the + * token that triggered the handler by calling + * JSON_Parser_GetTokenLocation(). + */ + +/* Values returned by parse handlers to indicate whether parsing should + * continue or be aborted. + * + * Note that JSON_TreatAsDuplicateObjectMember should only be returned by + * object member handlers. Refer to JSON_Parser_SetObjectMemberHandler() + * for details. + */ +typedef enum tag_JSON_Parser_HandlerResult +{ + JSON_Parser_Continue = 0, + JSON_Parser_Abort = 1, + JSON_Parser_TreatAsDuplicateObjectMember = 2 +} JSON_Parser_HandlerResult; + +/* Get and set the handler that is called when a parser instance detects the + * input encoding. + * + * If the parser instance's input encoding was set to JSON_UnknownEncoding + * when parsing began, this handler will be called as soon as the actual + * input encoding has been detected. + * + * Note that JSON_Parser_GetTokenLocation() will return failure if called + * from inside this handler, since there is no token associated with this + * event. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_EncodingDetectedHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_EncodingDetectedHandler) JSON_Parser_GetEncodingDetectedHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetEncodingDetectedHandler(JSON_Parser parser, JSON_Parser_EncodingDetectedHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * a JSON null literal value. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_NullHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_NullHandler) JSON_Parser_GetNullHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetNullHandler(JSON_Parser parser, JSON_Parser_NullHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * a JSON boolean value (true or false). + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_BooleanHandler)(JSON_Parser parser, JSON_Boolean value); +JSON_API(JSON_Parser_BooleanHandler) JSON_Parser_GetBooleanHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetBooleanHandler(JSON_Parser parser, JSON_Parser_BooleanHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * a JSON string value. + * + * The pValue parameter points to a buffer containing the string value, + * encoded according to the parser instance's string encoding setting. The + * buffer is null-terminated (the null terminator character is also encoded). + * Note, however, that JSON strings may contain embedded null characters, + * which are specifiable using the escape sequence \u0000. The client is + * free to modify the contents of the buffer during the handler. + * + * The length parameter specifies the number of bytes (NOT characters) in + * the encoded string, not including the encoded null terminator. + * + * The attributes parameter provides information about the characters + * that comprise the string. If the option to replace invalid encoding + * sequences is enabled and the string contains any Unicode replacement + * characters (U+FFFD) that were the result of replacing invalid encoding + * sequences in the input, the attributes will include the value + * JSON_ContainsReplacedCharacter. Note that the absence of this attribute + * does not imply that the string does not contain any U+FFFD characters, + * since such characters may have been present in the original input, and + * not inserted by a replacement operation. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_StringHandler)(JSON_Parser parser, char* pValue, size_t length, JSON_StringAttributes attributes); +JSON_API(JSON_Parser_StringHandler) JSON_Parser_GetStringHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetStringHandler(JSON_Parser parser, JSON_Parser_StringHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * a JSON number value. + * + * JSON numbers do not have a defined binary representation or precision, + * and different clients may wish to interpret them differently, for + * example, as IEEE 754 doubles, 64-bit integers, or arbitrary-precision + * bignums. For this reason, the parser does not attempt to interpret + * number values, but leaves this to the client. + * + * The pValue parameter points to a buffer containing the number value, + * encoded according to the parser instance's number encoding setting. The + * buffer is null-terminated (the null terminator character is also encoded). + * The buffer is guaranteed to contain only characters allowed in JSON number + * values, that is: '0' - '9', '+', '-', '.', 'e', and 'E'; if the option + * to allow hex numbers is enabled, the text may also contain the characters + * 'x', 'X', 'a' - 'f', and 'A' - 'F'. The client is free to modify the + * contents of the buffer during the handler. This is especially useful + * to clients that wish to convert the number to a double using the C + * standard library's strtod() function, which is locale-sensitive; in this + * case, the client should modify the buffer to replace the '.' character + * with localconv()->decimal_point[0] before passing the buffer to strtod(). + * + * The length parameter specifies the number of bytes (NOT characters) in + * the encoded number, not including the encoded null terminator. + * + * The attributes parameter provides information about the number. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_NumberHandler)(JSON_Parser parser, char* pValue, size_t length, JSON_NumberAttributes attributes); +JSON_API(JSON_Parser_NumberHandler) JSON_Parser_GetNumberHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetNumberHandler(JSON_Parser parser, JSON_Parser_NumberHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * one of the "special" number literals NaN, Infinity, and -Inifinity. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_SpecialNumberHandler)(JSON_Parser parser, JSON_SpecialNumber value); +JSON_API(JSON_Parser_SpecialNumberHandler) JSON_Parser_GetSpecialNumberHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetSpecialNumberHandler(JSON_Parser parser, JSON_Parser_SpecialNumberHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * the left curly brace that starts an object. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_StartObjectHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_StartObjectHandler) JSON_Parser_GetStartObjectHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetStartObjectHandler(JSON_Parser parser, JSON_Parser_StartObjectHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * the right curly brace that ends an object. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_EndObjectHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_EndObjectHandler) JSON_Parser_GetEndObjectHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetEndObjectHandler(JSON_Parser parser, JSON_Parser_EndObjectHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * an object member name. + * + * The pValue parameter points to a buffer containing the member name, + * encoded according to the parser instance's string encoding setting. The + * buffer is null-terminated (the null terminator character is also encoded). + * Note, however, that JSON strings may contain embedded null characters, + * which are specifiable using the escape sequence \u0000. The client is + * free to modify the contents of the buffer during the handler. + * + * The length parameter specifies the number of bytes (NOT characters) in + * the encoded string, not including the encoded null terminator. + * + * The attributes parameter provides information about the characters + * that comprise the string. If the option to replace invalid encoding + * sequences is enabled and the string contains any Unicode replacement + * characters (U+FFFD) that were the result of replacing invalid encoding + * sequences in the input, the attributes will include the value + * JSON_ContainsReplacedCharacter. Note that the absence of this attribute + * does not imply that the string does not contain any U+FFFD characters, + * since such characters may have been present in the original input, and + * not inserted by a replacement operation. + * + * The handler can return JSON_Parser_TreatAsDuplicateObjectMember to + * indicate that the current object already contains a member with the + * specified name. This allows clients to implement duplicate member + * checking without incurring the additional memory overhead associated + * with enabling the TrackObjectMembers setting. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_ObjectMemberHandler)(JSON_Parser parser, char* pValue, size_t length, JSON_StringAttributes attributes); +JSON_API(JSON_Parser_ObjectMemberHandler) JSON_Parser_GetObjectMemberHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetObjectMemberHandler(JSON_Parser parser, JSON_Parser_ObjectMemberHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * the left square brace that starts an array. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_StartArrayHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_StartArrayHandler) JSON_Parser_GetStartArrayHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetStartArrayHandler(JSON_Parser parser, JSON_Parser_StartArrayHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * the right square brace that ends an array. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_EndArrayHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_EndArrayHandler) JSON_Parser_GetEndArrayHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetEndArrayHandler(JSON_Parser parser, JSON_Parser_EndArrayHandler handler); + +/* Get and set the handler that is called when a parser instance encounters + * an array item. + * + * This event is always immediately followed by a null, boolean, string, + * number, special number, start object, or start array event. + */ +typedef JSON_Parser_HandlerResult (JSON_CALL * JSON_Parser_ArrayItemHandler)(JSON_Parser parser); +JSON_API(JSON_Parser_ArrayItemHandler) JSON_Parser_GetArrayItemHandler(JSON_Parser parser); +JSON_API(JSON_Status) JSON_Parser_SetArrayItemHandler(JSON_Parser parser, JSON_Parser_ArrayItemHandler handler); + +/* Push zero or more bytes of input to a parser instance. + * + * The pBytes parameter points to a buffer containing the bytes to be + * parsed, if any. pBytes may be NULL if and only if the length parameter + * is 0. + * + * The length parameter specifies the number of bytes (NOT characters) + * pointed to by pBytes. + * + * The isFinal parameter specifies whether the parser should treat the + * input to the call as the last chunk of input in the JSON document. + * If this parameter is JSON_False, the parser will assume that more + * input may be forthcoming. + * + * The parser adheres to [RFC 4627](http://www.ietf.org/rfc/rfc4627.txt), + * except that any JSON value (null, true, false, string, number, object, + * or array) is accepted as a valid top-level entity in the parsed text. + * + * This function returns failure if the parser parameter is null, if the + * function was called reentrantly from inside a handler, or if the + * parser instance has already finished parsing. + */ +JSON_API(JSON_Status) JSON_Parser_Parse(JSON_Parser parser, const char* pBytes, size_t length, JSON_Boolean isFinal); + +#endif /* JSON_NO_PARSER */ + +/******************** JSON Writer ********************/ + +#ifndef JSON_NO_WRITER + +/* Writer instance. */ +struct JSON_Writer_Data; /* opaque data */ +typedef struct JSON_Writer_Data* JSON_Writer; + +/* Create a writer instance. + * + * If pMemorySuite is null, the library will use the C runtime realloc() and + * free() as the writer's memory management suite. Otherwise, all the + * handlers in the memory suite must be non-null or the call will fail and + * return null. + */ +JSON_API(JSON_Writer) JSON_Writer_Create(const JSON_MemorySuite* pMemorySuite); + +/* Free a writer instance. + * + * Every successful call to JSON_Writer_Create() must eventually be paired + * with a call to JSON_Writer_Free() in order to avoid leaking memory. + * + * This function returns failure if the writer parameter is null or if the + * function was called reentrantly from inside a handler. + */ +JSON_API(JSON_Status) JSON_Writer_Free(JSON_Writer writer); + +/* Reset a writer instance so that it can be used to write a new output + * stream. + * + * This function returns failure if the writer parameter is null or if the + * function was called reentrantly from inside a handler. + * + * After a writer is reset, its state is indistinguishable from its state + * when it was returned by JSON_Writer_Create(). The writer's custom memory + * suite, if any, is preserved; all other settings, state, and handlers are + * restored to their default values. + */ +JSON_API(JSON_Status) JSON_Writer_Reset(JSON_Writer writer); + +/* Get and set the user data value associated with a writer instance. + * + * This setting allows clients to associate additional data with a + * writer instance. The writer itself does not use the value. + * + * The default value of this setting is NULL. + * + * This setting can be changed at any time, even inside handlers. + */ +JSON_API(void*) JSON_Writer_GetUserData(JSON_Writer writer); +JSON_API(JSON_Status) JSON_Writer_SetUserData(JSON_Writer writer, void* userData); + +/* Get and set the output encoding for a writer instance. + * + * The default value of this setting is JSON_UTF8. + * + * This setting cannot be set to JSON_UnknownEncoding. + * + * This setting cannot be changed once the writer has started writing. + */ +JSON_API(JSON_Encoding) JSON_Writer_GetOutputEncoding(JSON_Writer writer); +JSON_API(JSON_Status) JSON_Writer_SetOutputEncoding(JSON_Writer writer, JSON_Encoding encoding); + +/* Get and set whether a writer instance uses CARRIAGE RETURN, LINE FEED + * (CRLF) as the new line sequence generated by JSON_Writer_WriteNewLine(). + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the writer has started writing. + */ +JSON_API(JSON_Boolean) JSON_Writer_GetUseCRLF(JSON_Writer writer); +JSON_API(JSON_Status) JSON_Writer_SetUseCRLF(JSON_Writer writer, JSON_Boolean useCRLF); + +/* Get and set whether a writer instance replaces invalid encoding sequences + * it encounters in string tokens with the Unicode replacement character + * (U+FFFD) rather than triggering an error. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the writer has started writing. + */ +JSON_API(JSON_Boolean) JSON_Writer_GetReplaceInvalidEncodingSequences(JSON_Writer writer); +JSON_API(JSON_Status) JSON_Writer_SetReplaceInvalidEncodingSequences(JSON_Writer writer, JSON_Boolean replaceInvalidEncodingSequences); + +/* Get and set whether a writer instance escapes all non-ASCII characters + * that it outputs. This can be useful for debugging, or when the output + * will be consumed by a parser that does not support UTF-encoded input. + * It is not recommended as a general practice, since it bloats the size + * of non-ASCII strings considerably, compared to UTF encoding. + * + * The default value of this setting is JSON_False. + * + * This setting cannot be changed once the writer has started writing. + */ +JSON_API(JSON_Boolean) JSON_Writer_GetEscapeAllNonASCIICharacters(JSON_Writer writer); +JSON_API(JSON_Status) JSON_Writer_SetEscapeAllNonASCIICharacters(JSON_Writer writer, JSON_Boolean escapeAllNonASCIICharacters); + +/* Get the type of error, if any, encountered by a writer instance. + * + * If the writer encountered an error while writing input, this function + * returns the type of the error. Otherwise, this function returns + * JSON_Error_None. + */ +JSON_API(JSON_Error) JSON_Writer_GetError(JSON_Writer writer); + +/* The JSON_Writer_WriteXXX() family of functions cause JSON text to be + * sent to a writer instance's output handler. The following notes apply + * equally to all these functions: + * + * 1. The output handler is optional, and can be set, unset, or changed + * at any time, even from inside the output handler. + * + * 2. A single call to JSON_Writer_WriteXXX() may trigger multiple calls + * to the output handler. + * + * 3. All output generated by a call to JSON_Writer_WriteXXX() is sent + * to the output handler before the call returns; that is, the writer + * does not aggregate output from multiple writes before sending it to + * the output handler. + * + * 4. A call to JSON_Writer_WriteXXX() will fail if the writer has + * already encountered an error. + * + * 5. A call to JSON_Writer_WriteXXX() will fail if the call was made + * reentrantly from inside a handler. + * + * 6. A call to JSON_Writer_WriteXXX() will fail if it would cause the + * writer to output grammatically-incorrect JSON text. + * + * 7. If an output handler returns JSON_Writer_Abort, the writer will + * abort the write, set its error to JSON_Error_AbortedByHandler, + * set its error location to the location in the output stream prior + * to the call to the handler, and return JSON_Failure from the outer + * call to JSON_Writer_WriteXXX(). + */ + +/* Values returned by write handlers to indicate whether writing should + * continue or be aborted. + */ +typedef enum tag_JSON_Writer_HandlerResult +{ + JSON_Writer_Continue = 0, + JSON_Writer_Abort = 1 +} JSON_Writer_HandlerResult; + +/* Get and set the handler that is called when a writer instance has output + * ready to be written. + * + * The pBytes parameter points to a buffer containing the bytes to be written, + * encoded according to the writer instance's output encoding setting. The + * buffer is NOT null-terminated. + * + * The length parameter specifies the number of bytes (NOT characters) in + * the encoded output. + */ +typedef JSON_Writer_HandlerResult (JSON_CALL * JSON_Writer_OutputHandler)(JSON_Writer writer, const char* pBytes, size_t length); +JSON_API(JSON_Writer_OutputHandler) JSON_Writer_GetOutputHandler(JSON_Writer writer); +JSON_API(JSON_Status) JSON_Writer_SetOutputHandler(JSON_Writer writer, JSON_Writer_OutputHandler handler); + +/* Write the JSON null literal to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteNull(JSON_Writer writer); + +/* Write a JSON boolean value to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteBoolean(JSON_Writer writer, JSON_Boolean value); + +/* Write a JSON string value to the output. + * + * The pValue parameter points to a buffer containing the string to be + * written. The buffer does NOT need to be null-terminated. This + * parameter can be null if and only if the length parameter is zero. + * + * The length parameter specifies the number of bytes (NOT characters) + * in the buffer. If the buffer is null-terminated, the length should + * NOT include the null terminator. + * + * The encoding parameter specifies the encoding of the text pointed + * to by pValue. This parameter cannot be JSON_UnknownEncoding. + * + * If the string contains invalid encoding sequences and the option to + * replace invalid encoding sequences with the Unicode replacement + * character (U+FFFD) is not enabled for the writer instance, the writer + * sets its error to JSON_Error_InvalidEncodingSequence and returns + * failure. + * + * The writer escapes the following codepoints: + * + * - BACKSPACE (U+0008) => \b + * - TAB (U+0009) => \t + * - LINE FEED (U+000A) => \n + * - FORM FEED (U+000C) => \f + * - CARRIAGE RETURN (U+000D) => \r + * - QUOTATION MARK (U+0022) => \" + * - SOLIDUS (U+002F) => \/ + * - REVERSE SOLIDUS (U+005C) => \\ + * + * The writer also escapes the following codepoints using hex-style escape + * sequences: + * + * - All control characters (U+0000 - U+001F) except those covered by the + * list above. + * - DELETE (U+007F) + * - LINE SEPARATOR (U+2028) + * - PARAGRAPH SEPARATOR (U+2029) + * - All 34 Unicode "noncharacter" codepoints whose values end in FE or FF. + * - All 32 Unicode "noncharacter" codepoints in the range U+FDD0 - U+FDEF. + * - REPLACEMENT CHARACTER (U+FFFD), if it did not appear in the original + * string provided by the client; in other words, if the writer introduced + * it in the output as a replacement for an invalid encoding sequence in + * the original string. + * + * If the setting to escape all non-ASCII characters is enabled, ALL + * codepoints above U+0080 are escaped using hex-style escape sequences. + */ +JSON_API(JSON_Status) JSON_Writer_WriteString(JSON_Writer writer, const char* pValue, size_t length, JSON_Encoding encoding); + +/* Write a JSON number value to the output. + * + * The pValue parameter points to a buffer containing the number to be + * written. The buffer does NOT need to be null-terminated. + * + * The length parameter specifies the number of bytes (NOT characters) + * in the buffer. If the buffer is null-terminated, the length should + * NOT include the null terminator. + * + * The encoding parameter specifies the encoding of the text pointed + * to by pValue. This parameter cannot be JSON_UnknownEncoding. + * + * If the number contains an invalid encoding sequence, the writer sets + * its error to JSON_Error_InvalidEncodingSequence and returns failure, + * regardless of whether the option to replace invalid encoding sequences + * with the Unicode replacement character (U+FFFD) is enabled (that + * setting only affects writing of string values). + * + * The number must be a valid JSON number as described by RFC 4627, or a + * hexadecimal number conforming to the syntax of HexIntegerLiteral, as + * described in section 7.8.3 of ECMA-262. Otherwise, the writer sets its + * error to JSON_Error_InvalidNumber and returns failure. + */ +JSON_API(JSON_Status) JSON_Writer_WriteNumber(JSON_Writer writer, const char* pValue, size_t length, JSON_Encoding encoding); + +/* Write a JSON "special" number literal to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteSpecialNumber(JSON_Writer writer, JSON_SpecialNumber value); + +/* Write a left curly-brace character to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteStartObject(JSON_Writer writer); + +/* Write a right curly-brace character to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteEndObject(JSON_Writer writer); + +/* Write a left square-brace character to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteStartArray(JSON_Writer writer); + +/* Write a right square-brace character to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteEndArray(JSON_Writer writer); + +/* Write a colon character to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteColon(JSON_Writer writer); + +/* Write a comma character to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteComma(JSON_Writer writer); + +/* Write space characters to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteSpace(JSON_Writer writer, size_t numberOfSpaces); + +/* Write a newline sequence to the output. */ +JSON_API(JSON_Status) JSON_Writer_WriteNewLine(JSON_Writer writer); + +#endif /* JSON_NO_WRITER */ + +/******************** Miscellaneous API ********************/ + +/* Information about the library version. */ +typedef struct tag_JSON_Version +{ + unsigned int major; + unsigned int minor; + unsigned int micro; +} JSON_Version; + +/* Get a pointer to the library version information. */ +JSON_API(const JSON_Version*) JSON_LibraryVersion(void); + +/* Get a constant, null-terminated, ASCII string describing an error code. */ +JSON_API(const char*) JSON_ErrorString(JSON_Error error); + +/* Get the UTF-16 encoding whose endianness matches the target platform. + * + * This function always returns either JSON_UTF16LE or JSON_UTF16BE. + */ +JSON_API(JSON_Encoding) JSON_NativeUTF16Encoding(void); + +/* Get the UTF-32 encoding whose endianness matches the target platform. + * + * This function always returns either JSON_UTF32LE or JSON_UTF32BE. + */ +JSON_API(JSON_Encoding) JSON_NativeUTF32Encoding(void); + +#ifdef __cplusplus +} +#endif + +#endif /* JSONSAX_H_INCLUDED */
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/logiqx_dat.h
Added
@@ -0,0 +1,107 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (logiqx_dat.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_LOGIQX_DAT_H__ +#define __LIBRETRO_SDK_FORMAT_LOGIQX_DAT_H__ + +#include <retro_common_api.h> +#include <retro_miscellaneous.h> + +#include <boolean.h> + +RETRO_BEGIN_DECLS + +/* Trivial handler for DAT files in Logiqx XML format + * (http://www.logiqx.com/). Provides bare minimum + * functionality - predominantly concerned with obtaining + * description text for specific arcade ROM images. + * + * Note: Also supports the following alternative DAT + * formats, since they are functionally identical to + * Logiqx XML (but with different element names): + * > MAME List XML + * > MAME 'Software List' */ + +/* Prevent direct access to logiqx_dat_t members */ +typedef struct logiqx_dat logiqx_dat_t; + +/* Holds all metadata for a single game entry + * in the DAT file (minimal at present - may be + * expanded with individual internal ROM data + * if required) */ +typedef struct +{ + char name[PATH_MAX_LENGTH]; + char description[PATH_MAX_LENGTH]; + char year[8]; + char manufacturer[128]; + bool is_bios; + bool is_runnable; +} logiqx_dat_game_info_t; + +/* Validation */ + +/* Performs rudimentary validation of the specified + * Logiqx XML DAT file path (not rigorous - just + * enough to prevent obvious errors). + * Also provides access to file size (DAT files can + * be very large, so it is useful to have this information + * on hand - i.e. so we can check that the system has + * enough free memory to load the file). */ +bool logiqx_dat_path_is_valid(const char *path, uint64_t *file_size); + +/* File initialisation/de-initialisation */ + +/* Loads specified Logiqx XML DAT file from disk. + * Returned logiqx_dat_t object must be free'd using + * logiqx_dat_free(). + * Returns NULL if file is invalid or a read error + * occurs. */ +logiqx_dat_t *logiqx_dat_init(const char *path); + +/* Frees specified DAT file */ +void logiqx_dat_free(logiqx_dat_t *dat_file); + +/* Game information access */ + +/* Sets/resets internal node pointer to the first + * entry in the DAT file */ +void logiqx_dat_set_first(logiqx_dat_t *dat_file); + +/* Fetches game information for the current entry + * in the DAT file and increments the internal node + * pointer. + * Returns false if the end of the DAT file has been + * reached (in which case 'game_info' will be invalid) */ +bool logiqx_dat_get_next( + logiqx_dat_t *dat_file, logiqx_dat_game_info_t *game_info); + +/* Fetches information for the specified game. + * Returns false if game does not exist, or arguments + * are invalid. */ +bool logiqx_dat_search( + logiqx_dat_t *dat_file, const char *game_name, + logiqx_dat_game_info_t *game_info); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/m3u_file.h
Added
@@ -0,0 +1,122 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (m3u_file.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_M3U_FILE_H__ +#define __LIBRETRO_SDK_FORMAT_M3U_FILE_H__ + +#include <retro_common_api.h> + +#include <stdint.h> +#include <stddef.h> +#include <boolean.h> + +RETRO_BEGIN_DECLS + +/* Trivial handler for M3U playlist files */ + +/* M3U file extension */ +#define M3U_FILE_EXT "m3u" + +/* Prevent direct access to m3u_file_t members */ +typedef struct content_m3u_file m3u_file_t; + +/* Holds all metadata for a single M3U file entry */ +typedef struct +{ + char *path; + char *full_path; + char *label; +} m3u_file_entry_t; + +/* Defines entry label formatting when + * writing M3U files to disk */ +enum m3u_file_label_type +{ + M3U_FILE_LABEL_NONE = 0, + M3U_FILE_LABEL_NONSTD, + M3U_FILE_LABEL_EXTSTD, + M3U_FILE_LABEL_RETRO +}; + +/* File Initialisation / De-Initialisation */ + +/* Creates and initialises an M3U file + * - If 'path' refers to an existing file, + * contents is parsed + * - If path does not exist, an empty M3U file + * is created + * - Returned m3u_file_t object must be free'd using + * m3u_file_free() + * - Returns NULL in the event of an error */ +m3u_file_t *m3u_file_init(const char *path); + +/* Frees specified M3U file */ +void m3u_file_free(m3u_file_t *m3u_file); + +/* Getters */ + +/* Returns M3U file path */ +char *m3u_file_get_path(m3u_file_t *m3u_file); + +/* Returns number of entries in M3U file */ +size_t m3u_file_get_size(m3u_file_t *m3u_file); + +/* Fetches specified M3U file entry + * - Returns false if 'idx' is invalid, or internal + * entry is NULL */ +bool m3u_file_get_entry( + m3u_file_t *m3u_file, size_t idx, m3u_file_entry_t **entry); + +/* Setters */ + +/* Adds specified entry to the M3U file + * - Returns false if path is invalid, or + * memory could not be allocated for the + * entry */ +bool m3u_file_add_entry( + m3u_file_t *m3u_file, const char *path, const char *label); + +/* Removes all entries in M3U file */ +void m3u_file_clear(m3u_file_t *m3u_file); + +/* Saving */ + +/* Saves M3U file to disk + * - Setting 'label_type' to M3U_FILE_LABEL_NONE + * just outputs entry paths - this the most + * common format supported by most cores + * - Returns false in the event of an error */ +bool m3u_file_save( + m3u_file_t *m3u_file, enum m3u_file_label_type label_type); + +/* Utilities */ + +/* Sorts M3U file entries in alphabetical order */ +void m3u_file_qsort(m3u_file_t *m3u_file); + +/* Returns true if specified path corresponds + * to an M3U file (simple convenience function) */ +bool m3u_file_is_m3u(const char *path); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rbmp.h
Added
@@ -0,0 +1,66 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rbmp.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_RBMP_H__ +#define __LIBRETRO_SDK_FORMAT_RBMP_H__ + +#include <retro_common_api.h> + +#include <boolean.h> + +RETRO_BEGIN_DECLS + +enum rbmp_source_type +{ + RBMP_SOURCE_TYPE_DONT_CARE, + RBMP_SOURCE_TYPE_BGR24, + RBMP_SOURCE_TYPE_XRGB888, + RBMP_SOURCE_TYPE_RGB565, + RBMP_SOURCE_TYPE_ARGB8888 +}; + +typedef struct rbmp rbmp_t; + +bool rbmp_save_image( + const char *filename, + const void *frame, + unsigned width, + unsigned height, + unsigned pitch, + enum rbmp_source_type type); + +int rbmp_process_image(rbmp_t *rbmp, void **buf, + size_t size, unsigned *width, unsigned *height); + +void form_bmp_header(uint8_t *header, + unsigned width, unsigned height, + bool is32bpp); + +bool rbmp_set_buf_ptr(rbmp_t *rbmp, void *data); + +void rbmp_free(rbmp_t *rbmp); + +rbmp_t *rbmp_alloc(void); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rjpeg.h
Added
@@ -0,0 +1,48 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rjpeg.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_RJPEG_H__ +#define __LIBRETRO_SDK_FORMAT_RJPEG_H__ + +#include <stdint.h> +#include <stddef.h> + +#include <retro_common_api.h> + +#include <boolean.h> + +RETRO_BEGIN_DECLS + +typedef struct rjpeg rjpeg_t; + +int rjpeg_process_image(rjpeg_t *rjpeg, void **buf, + size_t size, unsigned *width, unsigned *height); + +bool rjpeg_set_buf_ptr(rjpeg_t *rjpeg, void *data); + +void rjpeg_free(rjpeg_t *rjpeg); + +rjpeg_t *rjpeg_alloc(void); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rjson.h
Added
@@ -0,0 +1,275 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rjson.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_RJSON_H__ +#define __LIBRETRO_SDK_FORMAT_RJSON_H__ + +#include <retro_common_api.h> +#include <retro_inline.h> /* INLINE */ +#include <boolean.h> /* bool */ +#include <stddef.h> /* size_t */ + +RETRO_BEGIN_DECLS + +/* List of possible element types returned by rjson_next */ +enum rjson_type +{ + RJSON_DONE, + RJSON_OBJECT, RJSON_ARRAY, RJSON_OBJECT_END, RJSON_ARRAY_END, + RJSON_STRING, RJSON_NUMBER, RJSON_TRUE, RJSON_FALSE, RJSON_NULL, + RJSON_ERROR +}; + +/* Options that can be passed to rjson_set_options */ +enum rjson_option +{ + /* Allow UTF-8 byte order marks */ + RJSON_OPTION_ALLOW_UTF8BOM = (1<<0), + /* Allow JavaScript style comments in the stream */ + RJSON_OPTION_ALLOW_COMMENTS = (1<<1), + /* Allow unescaped control characters in strings (bytes 0x00 - 0x1F) */ + RJSON_OPTION_ALLOW_UNESCAPED_CONTROL_CHARACTERS = (1<<2), + /* Ignore invalid Unicode escapes and don't validate UTF-8 codes */ + RJSON_OPTION_IGNORE_INVALID_ENCODING = (1<<3), + /* Replace invalid Unicode escapes and UTF-8 codes with a '?' character */ + RJSON_OPTION_REPLACE_INVALID_ENCODING = (1<<4), + /* Ignore carriage return (\r escape sequence) in strings */ + RJSON_OPTION_IGNORE_STRING_CARRIAGE_RETURN = (1<<5), + /* Allow data after the end of the top JSON object/array/value */ + RJSON_OPTION_ALLOW_TRAILING_DATA = (1<<6) +}; + +/* Custom data input callback + * Should return > 0 and <= len on success, 0 on file end and < 0 on error. */ +typedef int (*rjson_io_t)(void* buf, int len, void *user_data); +typedef struct rjson rjson_t; +struct intfstream_internal; +struct RFILE; + +/* Create a new parser instance from various sources */ +rjson_t *rjson_open_stream(struct intfstream_internal *stream); +rjson_t *rjson_open_rfile(struct RFILE *rfile); +rjson_t *rjson_open_buffer(const void *buffer, size_t size); +rjson_t *rjson_open_string(const char *string); +rjson_t *rjson_open_user(rjson_io_t io, void *user_data, int io_block_size); + +/* Free the parser instance created with rjson_open_* */ +void rjson_free(rjson_t *json); + +/* Set one or more enum rjson_option, will override previously set options. + * Use bitwise OR to concatenate multiple options. + * By default none of the options are set. */ +void rjson_set_options(rjson_t *json, char rjson_option_flags); + +/* Sets the maximum context depth, recursion inside arrays and objects. + * By default this is set to 50. */ +void rjson_set_max_depth(rjson_t *json, unsigned int max_depth); + +/* Parse to the next JSON element and return the type of it. + * Will return RJSON_DONE when successfully reaching the end or + * RJSON_ERROR when an error was encountered. */ +enum rjson_type rjson_next(rjson_t *json); + +/* Get the current string, null-terminated unescaped UTF-8 encoded. + * Can only be used when the current element is RJSON_STRING or RJSON_NUMBER. + * The returned pointer is only valid until the parsing continues. */ +const char *rjson_get_string(rjson_t *json, size_t *length); + +/* Returns the current number (or string) converted to double or int */ +double rjson_get_double(rjson_t *json); +int rjson_get_int(rjson_t *json); + +/* Returns a string describing the error once rjson_next/rjson_parse + * has returned an unrecoverable RJSON_ERROR (otherwise returns ""). */ +const char *rjson_get_error(rjson_t *json); + +/* Can be used to set a custom error description on an invalid JSON structure. + * Maximum length of 79 characters and once set the parsing can't continue. */ +void rjson_set_error(rjson_t *json, const char* error); + +/* Functions to get the current position in the source stream as well as */ +/* a bit of source json arround the current position for additional detail + * when parsing has failed with RJSON_ERROR. + * Intended to be used with printf style formatting like: + * printf("Invalid JSON at line %d, column %d - %s - Source: ...%.*s...\n", + * (int)rjson_get_source_line(json), (int)rjson_get_source_column(json), + * rjson_get_error(json), rjson_get_source_context_len(json), + * rjson_get_source_context_buf(json)); */ +size_t rjson_get_source_line(rjson_t *json); +size_t rjson_get_source_column(rjson_t *json); +int rjson_get_source_context_len(rjson_t *json); +const char* rjson_get_source_context_buf(rjson_t *json); + +/* Confirm the parsing context stack, for example calling + rjson_check_context(json, 2, RJSON_OBJECT, RJSON_ARRAY) + returns true when inside "{ [ ..." but not for "[ .." or "{ [ { ..." */ +bool rjson_check_context(rjson_t *json, unsigned int depth, ...); + +/* Returns the current level of nested objects/arrays */ +unsigned int rjson_get_context_depth(rjson_t *json); + +/* Return the current parsing context, that is, RJSON_OBJECT if we are inside + * an object, RJSON_ARRAY if we are inside an array, and RJSON_DONE or + * RJSON_ERROR if we are not yet/anymore in either. */ +enum rjson_type rjson_get_context_type(rjson_t *json); + +/* While inside an object or an array, this return the number of parsing + * events that have already been observed at this level with rjson_next. + * In particular, inside an object, an odd number would indicate that the just + * observed RJSON_STRING event is a member name. */ +size_t rjson_get_context_count(rjson_t *json); + +/* Parse an entire JSON stream with a list of element specific handlers. + * Each of the handlers can be passed a function or NULL to ignore it. + * If a handler returns false, the parsing will abort and the returned + * rjson_type will indicate on which element type parsing was aborted. + * Otherwise the return value will be RJSON_DONE or RJSON_ERROR. */ +enum rjson_type rjson_parse(rjson_t *json, void* context, + bool (*object_member_handler)(void *context, const char *str, size_t len), + bool (*string_handler )(void *context, const char *str, size_t len), + bool (*number_handler )(void *context, const char *str, size_t len), + bool (*start_object_handler )(void *context), + bool (*end_object_handler )(void *context), + bool (*start_array_handler )(void *context), + bool (*end_array_handler )(void *context), + bool (*boolean_handler )(void *context, bool value), + bool (*null_handler )(void *context)); + +/* A simpler interface to parse a JSON in memory. This will avoid any memory + * allocations unless the document contains strings longer than 512 characters. + * In the error handler, error will be "" if any of the other handlers aborted. */ +bool rjson_parse_quick(const char *string, void* context, char option_flags, + bool (*object_member_handler)(void *context, const char *str, size_t len), + bool (*string_handler )(void *context, const char *str, size_t len), + bool (*number_handler )(void *context, const char *str, size_t len), + bool (*start_object_handler )(void *context), + bool (*end_object_handler )(void *context), + bool (*start_array_handler )(void *context), + bool (*end_array_handler )(void *context), + bool (*boolean_handler )(void *context, bool value), + bool (*null_handler )(void *context), + void (*error_handler )(void *context, int line, int col, const char* error)); + +/* ------------------------------------------------------------------------- */ + +/* Options that can be passed to rjsonwriter_set_options */ +enum rjsonwriter_option +{ + /* Don't write spaces, tabs or newlines to the output (except in strings) */ + RJSONWRITER_OPTION_SKIP_WHITESPACE = (1<<0) +}; + +/* Custom data output callback + * Should return len on success and < len on a write error. */ +typedef int (*rjsonwriter_io_t)(const void* buf, int len, void *user_data); +typedef struct rjsonwriter rjsonwriter_t; + +/* Create a new writer instance to various targets */ +rjsonwriter_t *rjsonwriter_open_stream(struct intfstream_internal *stream); +rjsonwriter_t *rjsonwriter_open_rfile(struct RFILE *rfile); +rjsonwriter_t *rjsonwriter_open_memory(void); +rjsonwriter_t *rjsonwriter_open_user(rjsonwriter_io_t io, void *user_data); + +/* When opened with rjsonwriter_open_memory, will return the generated JSON. + * Result is always null-terminated. Passed len can be NULL if not needed, + * otherwise returned len will be string length without null-terminator. + * Returns NULL if writing ran out of memory or not opened from memory. + * Returned buffer is only valid until writer is modified or freed. */ +char* rjsonwriter_get_memory_buffer(rjsonwriter_t *writer, int* len); + +/* Free rjsonwriter handle and return result of final rjsonwriter_flush call */ +bool rjsonwriter_free(rjsonwriter_t *writer); + +/* Set one or more enum rjsonwriter_option, will override previously set options. + * Use bitwise OR to concatenate multiple options. + * By default none of the options are set. */ +void rjsonwriter_set_options(rjsonwriter_t *writer, int rjsonwriter_option_flags); + +/* Flush any buffered output data to the output stream. + * Returns true if the data was successfully written. Once writing fails once, + * no more data will be written and flush will always returns false */ +bool rjsonwriter_flush(rjsonwriter_t *writer); + +/* Returns a string describing an error or "" if there was none. + * The only error possible is "output error" after the io function failed. + * If rjsonwriter_rawf were used manually, "out of memory" is also possible. */ +const char *rjsonwriter_get_error(rjsonwriter_t *writer); + +/* Used by the inline functions below to append raw data */ +void rjsonwriter_raw(rjsonwriter_t *writer, const char *buf, int len); +void rjsonwriter_rawf(rjsonwriter_t *writer, const char *fmt, ...); + +/* Add a UTF-8 encoded string + * Special and control characters are automatically escaped. + * If NULL is passed an empty string will be written (not JSON null). */ +void rjsonwriter_add_string(rjsonwriter_t *writer, const char *value); +void rjsonwriter_add_string_len(rjsonwriter_t *writer, const char *value, int len); + +/* Add a signed or unsigned integer or a double number */ +static INLINE void rjsonwriter_add_int(rjsonwriter_t *writer, int value) + { rjsonwriter_rawf(writer, "%d", value); } + +static INLINE void rjsonwriter_add_unsigned(rjsonwriter_t *writer, unsigned value) + { rjsonwriter_rawf(writer, "%u", value); } + +void rjsonwriter_add_double(rjsonwriter_t *writer, double value); + +/* Functions to add JSON token characters */ +static INLINE void rjsonwriter_add_start_object(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, "{", 1); } + +static INLINE void rjsonwriter_add_end_object(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, "}", 1); } + +static INLINE void rjsonwriter_add_start_array(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, "[", 1); } + +static INLINE void rjsonwriter_add_end_array(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, "]", 1); } + +static INLINE void rjsonwriter_add_colon(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, ":", 1); } + +static INLINE void rjsonwriter_add_comma(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, ",", 1); } + +static INLINE void rjsonwriter_add_bool(rjsonwriter_t *writer, bool value) + { rjsonwriter_raw(writer, (value ? "true" : "false"), (value ? 4 : 5)); } + +/* Functions to add whitespace characters */ +/* These do nothing with the option RJSONWRITER_OPTION_SKIP_WHITESPACE */ +static INLINE void rjsonwriter_add_newline(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, "\n", 1); } + +static INLINE void rjsonwriter_add_space(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, " ", 1); } + +void rjsonwriter_add_spaces(rjsonwriter_t *writer, int count); + +static INLINE void rjsonwriter_add_tab(rjsonwriter_t *writer) + { rjsonwriter_raw(writer, "\t", 1); } + +void rjsonwriter_add_tabs(rjsonwriter_t *writer, int count); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rpng.h
Added
@@ -0,0 +1,64 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rpng.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_RPNG_H__ +#define __LIBRETRO_SDK_FORMAT_RPNG_H__ + +#include <stdint.h> +#include <stddef.h> + +#include <retro_common_api.h> + +#include <boolean.h> + +RETRO_BEGIN_DECLS + +typedef struct rpng rpng_t; + +rpng_t *rpng_init(const char *path); + +bool rpng_is_valid(rpng_t *rpng); + +bool rpng_set_buf_ptr(rpng_t *rpng, void *data, size_t len); + +rpng_t *rpng_alloc(void); + +void rpng_free(rpng_t *rpng); + +bool rpng_iterate_image(rpng_t *rpng); + +int rpng_process_image(rpng_t *rpng, + void **data, size_t size, unsigned *width, unsigned *height); + +bool rpng_start(rpng_t *rpng); + +bool rpng_save_image_argb(const char *path, const uint32_t *data, + unsigned width, unsigned height, unsigned pitch); +bool rpng_save_image_bgr24(const char *path, const uint8_t *data, + unsigned width, unsigned height, unsigned pitch); + +uint8_t* rpng_save_image_bgr24_string(const uint8_t *data, + unsigned width, unsigned height, signed pitch, uint64_t *bytes); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rtga.h
Added
@@ -0,0 +1,48 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rtga.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_RTGA_H__ +#define __LIBRETRO_SDK_FORMAT_RTGA_H__ + +#include <stdint.h> +#include <stddef.h> + +#include <retro_common_api.h> + +#include <boolean.h> + +RETRO_BEGIN_DECLS + +typedef struct rtga rtga_t; + +int rtga_process_image(rtga_t *rtga, void **buf, + size_t size, unsigned *width, unsigned *height); + +bool rtga_set_buf_ptr(rtga_t *rtga, void *data); + +void rtga_free(rtga_t *rtga); + +rtga_t *rtga_alloc(void); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rwav.h
Added
@@ -0,0 +1,87 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rwav.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FORMAT_RWAV_H__ +#define __LIBRETRO_SDK_FORMAT_RWAV_H__ + +#include <retro_common_api.h> +#include <stdint.h> + +RETRO_BEGIN_DECLS + +typedef struct +{ + /* bits per sample */ + unsigned int bitspersample; + + /* number of channels */ + unsigned int numchannels; + + /* sample rate */ + unsigned int samplerate; + + /* number of *samples* */ + size_t numsamples; + + /* number of *bytes* in the pointer below, i.e. numsamples * numchannels * bitspersample/8 */ + size_t subchunk2size; + + /* PCM data */ + const void* samples; +} rwav_t; + +enum rwav_state +{ + RWAV_ITERATE_ERROR = -1, + RWAV_ITERATE_MORE = 0, + RWAV_ITERATE_DONE = 1, + RWAV_ITERATE_BUF_SIZE = 4096 +}; + +typedef struct rwav_iterator rwav_iterator_t; + +/** + * Initializes the iterator to fill the out structure with data parsed from buf. + */ +void rwav_init(rwav_iterator_t* iter, rwav_t* out, const void* buf, size_t size); + +/** + * Parses a piece of the data. Continue calling as long as it returns RWAV_ITERATE_MORE. + * Stop calling otherwise, and check for errors. If RWAV_ITERATE_DONE is returned, + * the rwav_t structure passed to rwav_init is ready to be used. The iterator does not + * have to be freed. + */ +enum rwav_state rwav_iterate(rwav_iterator_t *iter); + +/** + * Loads the entire data in one go. + */ +enum rwav_state rwav_load(rwav_t* out, const void* buf, size_t size); + +/** + * Frees parsed wave data. + */ +void rwav_free(rwav_t *rwav); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/formats/rxml.h
Added
@@ -0,0 +1,69 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rxml.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef __LIBRETRO_SDK_FORMAT_RXML_H__ +#define __LIBRETRO_SDK_FORMAT_RXML_H__ + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +/* Total NIH. Very trivial "XML" implementation for use in RetroArch. + * Error checking is minimal. Invalid documents may lead to very + * buggy behavior, but memory corruption should never happen. + * + * Only parts of standard that RetroArch cares about is supported. + * Nothing more, nothing less. "Clever" XML documents will + * probably break the implementation. + * + * Do *NOT* try to use this for anything else. You have been warned. + */ + +typedef struct rxml_document rxml_document_t; + +struct rxml_attrib_node +{ + char *attrib; + char *value; + struct rxml_attrib_node *next; +}; + +typedef struct rxml_node +{ + char *name; + char *data; + struct rxml_attrib_node *attrib; + + struct rxml_node *children; + struct rxml_node *next; +} rxml_node_t; + +rxml_document_t *rxml_load_document(const char *path); +rxml_document_t *rxml_load_document_string(const char *str); +void rxml_free_document(rxml_document_t *doc); + +struct rxml_node *rxml_root_node(rxml_document_t *doc); + +const char *rxml_node_attrib(struct rxml_node *node, const char *attrib); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/gl_capabilities.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/gl_capabilities.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (gl_capabilities.h). @@ -51,18 +51,18 @@ GL_CAPS_TEX_STORAGE_EXT }; -bool gl_check_error(char **error_string); - bool gl_query_core_context_in_use(void); void gl_query_core_context_set(bool set); void gl_query_core_context_unset(void); -bool gl_check_capability(enum gl_capability_enum enum_idx); - bool gl_query_extension(const char *ext); +bool gl_check_error(char **error_string); + +bool gl_check_capability(enum gl_capability_enum enum_idx); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/math/matrix_3x3.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/math/matrix_3x3.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (matrix_3x3.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/math/matrix_4x4.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/math/matrix_4x4.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (matrix_4x4.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/math/vector_2.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/math/vector_2.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (vector_2.h). @@ -54,7 +54,7 @@ unsigned i; volatile float f = 1e10; - for(i = 0; i < 10; ++i) + for (i = 0; i < 10; ++i) f *= f; return f; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/math/vector_3.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/math/vector_3.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (vector_3.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/math/vector_4.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/math/vector_4.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (vector_4.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/scaler/filter.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/scaler/filter.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (filter.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/scaler/pixconv.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/scaler/pixconv.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (pixconv.h). @@ -61,6 +61,10 @@ int width, int height, int out_stride, int in_stride); +void conv_bgr24_rgb565(void *output, const void *input, + int width, int height, + int out_stride, int in_stride); + void conv_argb8888_0rgb1555(void *output, const void *input, int width, int height, int out_stride, int in_stride); @@ -77,6 +81,10 @@ int width, int height, int out_stride, int in_stride); +void conv_abgr8888_bgr24(void *output, const void *input, + int width, int height, + int out_stride, int in_stride); + void conv_argb8888_abgr8888(void *output, const void *input, int width, int height, int out_stride, int in_stride);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/scaler/scaler.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/scaler/scaler.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (scaler.h). @@ -54,25 +54,13 @@ struct scaler_filter { int16_t *filter; - int filter_len; - int filter_stride; - int *filter_pos; + int *filter_pos; + int filter_len; + int filter_stride; }; struct scaler_ctx { - int in_width; - int in_height; - int in_stride; - - int out_width; - int out_height; - int out_stride; - - enum scaler_pix_fmt in_fmt; - enum scaler_pix_fmt out_fmt; - enum scaler_type scaler_type; - void (*scaler_horiz)(const struct scaler_ctx*, const void*, int); void (*scaler_vert)(const struct scaler_ctx*, @@ -83,9 +71,7 @@ void (*in_pixconv)(void*, const void*, int, int, int, int); void (*out_pixconv)(void*, const void*, int, int, int, int); void (*direct_pixconv)(void*, const void*, int, int, int, int); - - bool unscaled; - struct scaler_filter horiz, vert; + struct scaler_filter horiz, vert; /* ptr alignment */ struct { @@ -106,6 +92,20 @@ uint32_t *frame; int stride; } output; + + int in_width; + int in_height; + int in_stride; + + int out_width; + int out_height; + int out_stride; + + enum scaler_pix_fmt in_fmt; + enum scaler_pix_fmt out_fmt; + enum scaler_type scaler_type; + + bool unscaled; }; bool scaler_ctx_gen_filter(struct scaler_ctx *ctx);
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/scaler/scaler_int.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/scaler/scaler_int.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (scaler_int.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/gfx/video_frame.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/gfx/video_frame.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (video_frame.h).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/glsym.h
Added
@@ -0,0 +1,45 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_GLSYM_H__ +#define __LIBRETRO_SDK_GLSYM_H__ + +#include "rglgen.h" + +#ifndef HAVE_PSGL +#if defined(HAVE_OPENGLES2) +#include "glsym_es2.h" +#elif defined(HAVE_OPENGLES3) +#include "glsym_es3.h" +#else +#ifdef HAVE_LIBNX +#include "switch/nx_glsym.h" +#endif +#include "glsym_gl.h" +#endif +#endif + +#ifdef HAVE_GLSYM_PRIVATE +#include "glsym_private.h" +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/glsym_es2.h
Added
@@ -0,0 +1,639 @@ +#ifndef RGLGEN_DECL_H__ +#define RGLGEN_DECL_H__ +#ifdef __cplusplus +extern "C" { +#endif +#ifdef GL_APIENTRY +typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +typedef void (GL_APIENTRY *RGLGENGLDEBUGPROCKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +#else +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +typedef void (APIENTRY *RGLGENGLDEBUGPROCARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +typedef void (APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +#endif +#ifndef GL_OES_EGL_image +typedef void *GLeglImageOES; +#endif +#if !defined(GL_OES_fixed_point) && !defined(HAVE_OPENGLES2) +typedef GLint GLfixed; +#endif + +typedef void (GL_APIENTRYP RGLSYMGLBLENDBARRIERKHRPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC) (RGLGENGLDEBUGPROCKHR callback, const void *userParam); +typedef GLuint (GL_APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP RGLSYMGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP RGLSYMGLPOPDEBUGGROUPKHRPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETPOINTERVKHRPROC) (GLenum pname, void **params); +typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GL_APIENTRYP RGLSYMGLENABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP RGLSYMGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); +typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GL_APIENTRYP RGLSYMGLMINSAMPLESHADINGOESPROC) (GLfloat value); +typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GL_APIENTRYP RGLSYMGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP RGLSYMGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP RGLSYMGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTARRAYVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTINDEXEDFOESPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTINDEXEDFVOESPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORARRAYVOESPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORINDEXEDOESPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORINDEXEDVOESPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEARRAYFVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEINDEXEDFOESPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP RGLSYMGLGETFLOATI_VOESPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (GL_APIENTRYP RGLSYMGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GL_APIENTRYP RGLSYMGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GL_APIENTRYP RGLSYMGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP RGLSYMGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP RGLSYMGLPOPGROUPMARKEREXTPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (GL_APIENTRYP RGLSYMGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP RGLSYMGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISQUERYEXTPROC) (GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLENDQUERYEXTPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); +typedef void (GL_APIENTRYP RGLSYMGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); +typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +typedef void (GL_APIENTRYP RGLSYMGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); +typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (GL_APIENTRYP RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GL_APIENTRYP RGLSYMGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); +typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP RGLSYMGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); +typedef void (GL_APIENTRYP RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint *values); +typedef void (GL_APIENTRYP RGLSYMGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP RGLSYMGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GL_APIENTRYP RGLSYMGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); + +#define glBlendBarrierKHR __rglgen_glBlendBarrierKHR +#define glDebugMessageControlKHR __rglgen_glDebugMessageControlKHR +#define glDebugMessageInsertKHR __rglgen_glDebugMessageInsertKHR +#define glDebugMessageCallbackKHR __rglgen_glDebugMessageCallbackKHR +#define glGetDebugMessageLogKHR __rglgen_glGetDebugMessageLogKHR +#define glPushDebugGroupKHR __rglgen_glPushDebugGroupKHR +#define glPopDebugGroupKHR __rglgen_glPopDebugGroupKHR +#define glObjectLabelKHR __rglgen_glObjectLabelKHR +#define glGetObjectLabelKHR __rglgen_glGetObjectLabelKHR +#define glObjectPtrLabelKHR __rglgen_glObjectPtrLabelKHR +#define glGetObjectPtrLabelKHR __rglgen_glGetObjectPtrLabelKHR +#define glGetPointervKHR __rglgen_glGetPointervKHR +#define glGetGraphicsResetStatusKHR __rglgen_glGetGraphicsResetStatusKHR +#define glReadnPixelsKHR __rglgen_glReadnPixelsKHR +#define glGetnUniformfvKHR __rglgen_glGetnUniformfvKHR +#define glGetnUniformivKHR __rglgen_glGetnUniformivKHR +#define glGetnUniformuivKHR __rglgen_glGetnUniformuivKHR +#define glEGLImageTargetTexture2DOES __rglgen_glEGLImageTargetTexture2DOES +#define glEGLImageTargetRenderbufferStorageOES __rglgen_glEGLImageTargetRenderbufferStorageOES +#define glCopyImageSubDataOES __rglgen_glCopyImageSubDataOES +#define glEnableiOES __rglgen_glEnableiOES +#define glDisableiOES __rglgen_glDisableiOES +#define glBlendEquationiOES __rglgen_glBlendEquationiOES +#define glBlendEquationSeparateiOES __rglgen_glBlendEquationSeparateiOES +#define glBlendFunciOES __rglgen_glBlendFunciOES +#define glBlendFuncSeparateiOES __rglgen_glBlendFuncSeparateiOES +#define glColorMaskiOES __rglgen_glColorMaskiOES +#define glIsEnablediOES __rglgen_glIsEnablediOES +#define glDrawElementsBaseVertexOES __rglgen_glDrawElementsBaseVertexOES +#define glDrawRangeElementsBaseVertexOES __rglgen_glDrawRangeElementsBaseVertexOES +#define glDrawElementsInstancedBaseVertexOES __rglgen_glDrawElementsInstancedBaseVertexOES +#define glMultiDrawElementsBaseVertexOES __rglgen_glMultiDrawElementsBaseVertexOES +#define glFramebufferTextureOES __rglgen_glFramebufferTextureOES +#define glGetProgramBinaryOES __rglgen_glGetProgramBinaryOES +#define glProgramBinaryOES __rglgen_glProgramBinaryOES +#define glMapBufferOES __rglgen_glMapBufferOES +#define glUnmapBufferOES __rglgen_glUnmapBufferOES +#define glGetBufferPointervOES __rglgen_glGetBufferPointervOES +#define glPrimitiveBoundingBoxOES __rglgen_glPrimitiveBoundingBoxOES +#define glMinSampleShadingOES __rglgen_glMinSampleShadingOES +#define glPatchParameteriOES __rglgen_glPatchParameteriOES +#define glTexImage3DOES __rglgen_glTexImage3DOES +#define glTexSubImage3DOES __rglgen_glTexSubImage3DOES +#define glCopyTexSubImage3DOES __rglgen_glCopyTexSubImage3DOES +#define glCompressedTexImage3DOES __rglgen_glCompressedTexImage3DOES +#define glCompressedTexSubImage3DOES __rglgen_glCompressedTexSubImage3DOES +#define glFramebufferTexture3DOES __rglgen_glFramebufferTexture3DOES +#define glTexParameterIivOES __rglgen_glTexParameterIivOES +#define glTexParameterIuivOES __rglgen_glTexParameterIuivOES +#define glGetTexParameterIivOES __rglgen_glGetTexParameterIivOES +#define glGetTexParameterIuivOES __rglgen_glGetTexParameterIuivOES +#define glSamplerParameterIivOES __rglgen_glSamplerParameterIivOES +#define glSamplerParameterIuivOES __rglgen_glSamplerParameterIuivOES +#define glGetSamplerParameterIivOES __rglgen_glGetSamplerParameterIivOES +#define glGetSamplerParameterIuivOES __rglgen_glGetSamplerParameterIuivOES +#define glTexBufferOES __rglgen_glTexBufferOES +#define glTexBufferRangeOES __rglgen_glTexBufferRangeOES +#define glTexStorage3DMultisampleOES __rglgen_glTexStorage3DMultisampleOES +#define glTextureViewOES __rglgen_glTextureViewOES +#define glBindVertexArrayOES __rglgen_glBindVertexArrayOES +#define glDeleteVertexArraysOES __rglgen_glDeleteVertexArraysOES +#define glGenVertexArraysOES __rglgen_glGenVertexArraysOES +#define glIsVertexArrayOES __rglgen_glIsVertexArrayOES +#define glViewportArrayvOES __rglgen_glViewportArrayvOES +#define glViewportIndexedfOES __rglgen_glViewportIndexedfOES +#define glViewportIndexedfvOES __rglgen_glViewportIndexedfvOES +#define glScissorArrayvOES __rglgen_glScissorArrayvOES +#define glScissorIndexedOES __rglgen_glScissorIndexedOES +#define glScissorIndexedvOES __rglgen_glScissorIndexedvOES +#define glDepthRangeArrayfvOES __rglgen_glDepthRangeArrayfvOES +#define glDepthRangeIndexedfOES __rglgen_glDepthRangeIndexedfOES +#define glGetFloati_vOES __rglgen_glGetFloati_vOES +#define glDrawArraysInstancedBaseInstanceEXT __rglgen_glDrawArraysInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseInstanceEXT __rglgen_glDrawElementsInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT +#define glBindFragDataLocationIndexedEXT __rglgen_glBindFragDataLocationIndexedEXT +#define glBindFragDataLocationEXT __rglgen_glBindFragDataLocationEXT +#define glGetProgramResourceLocationIndexEXT __rglgen_glGetProgramResourceLocationIndexEXT +#define glGetFragDataIndexEXT __rglgen_glGetFragDataIndexEXT +#define glBufferStorageEXT __rglgen_glBufferStorageEXT +#define glClearTexImageEXT __rglgen_glClearTexImageEXT +#define glClearTexSubImageEXT __rglgen_glClearTexSubImageEXT +#define glCopyImageSubDataEXT __rglgen_glCopyImageSubDataEXT +#define glLabelObjectEXT __rglgen_glLabelObjectEXT +#define glGetObjectLabelEXT __rglgen_glGetObjectLabelEXT +#define glInsertEventMarkerEXT __rglgen_glInsertEventMarkerEXT +#define glPushGroupMarkerEXT __rglgen_glPushGroupMarkerEXT +#define glPopGroupMarkerEXT __rglgen_glPopGroupMarkerEXT +#define glDiscardFramebufferEXT __rglgen_glDiscardFramebufferEXT +#define glGenQueriesEXT __rglgen_glGenQueriesEXT +#define glDeleteQueriesEXT __rglgen_glDeleteQueriesEXT +#define glIsQueryEXT __rglgen_glIsQueryEXT +#define glBeginQueryEXT __rglgen_glBeginQueryEXT +#define glEndQueryEXT __rglgen_glEndQueryEXT +#define glQueryCounterEXT __rglgen_glQueryCounterEXT +#define glGetQueryivEXT __rglgen_glGetQueryivEXT +#define glGetQueryObjectivEXT __rglgen_glGetQueryObjectivEXT +#define glGetQueryObjectuivEXT __rglgen_glGetQueryObjectuivEXT +#define glDrawBuffersEXT __rglgen_glDrawBuffersEXT +#define glEnableiEXT __rglgen_glEnableiEXT +#define glDisableiEXT __rglgen_glDisableiEXT +#define glBlendEquationiEXT __rglgen_glBlendEquationiEXT +#define glBlendEquationSeparateiEXT __rglgen_glBlendEquationSeparateiEXT +#define glBlendFunciEXT __rglgen_glBlendFunciEXT +#define glBlendFuncSeparateiEXT __rglgen_glBlendFuncSeparateiEXT +#define glColorMaskiEXT __rglgen_glColorMaskiEXT +#define glIsEnablediEXT __rglgen_glIsEnablediEXT +#define glDrawElementsBaseVertexEXT __rglgen_glDrawElementsBaseVertexEXT +#define glDrawRangeElementsBaseVertexEXT __rglgen_glDrawRangeElementsBaseVertexEXT +#define glDrawElementsInstancedBaseVertexEXT __rglgen_glDrawElementsInstancedBaseVertexEXT +#define glMultiDrawElementsBaseVertexEXT __rglgen_glMultiDrawElementsBaseVertexEXT +#define glDrawArraysInstancedEXT __rglgen_glDrawArraysInstancedEXT +#define glDrawElementsInstancedEXT __rglgen_glDrawElementsInstancedEXT +#define glFramebufferTextureEXT __rglgen_glFramebufferTextureEXT +#define glVertexAttribDivisorEXT __rglgen_glVertexAttribDivisorEXT +#define glMapBufferRangeEXT __rglgen_glMapBufferRangeEXT +#define glFlushMappedBufferRangeEXT __rglgen_glFlushMappedBufferRangeEXT +#define glMultiDrawArraysEXT __rglgen_glMultiDrawArraysEXT +#define glMultiDrawElementsEXT __rglgen_glMultiDrawElementsEXT +#define glMultiDrawArraysIndirectEXT __rglgen_glMultiDrawArraysIndirectEXT +#define glMultiDrawElementsIndirectEXT __rglgen_glMultiDrawElementsIndirectEXT +#define glRenderbufferStorageMultisampleEXT __rglgen_glRenderbufferStorageMultisampleEXT +#define glFramebufferTexture2DMultisampleEXT __rglgen_glFramebufferTexture2DMultisampleEXT +#define glReadBufferIndexedEXT __rglgen_glReadBufferIndexedEXT +#define glDrawBuffersIndexedEXT __rglgen_glDrawBuffersIndexedEXT +#define glGetIntegeri_vEXT __rglgen_glGetIntegeri_vEXT +#define glPolygonOffsetClampEXT __rglgen_glPolygonOffsetClampEXT +#define glPrimitiveBoundingBoxEXT __rglgen_glPrimitiveBoundingBoxEXT +#define glRasterSamplesEXT __rglgen_glRasterSamplesEXT +#define glGetGraphicsResetStatusEXT __rglgen_glGetGraphicsResetStatusEXT +#define glReadnPixelsEXT __rglgen_glReadnPixelsEXT +#define glGetnUniformfvEXT __rglgen_glGetnUniformfvEXT +#define glGetnUniformivEXT __rglgen_glGetnUniformivEXT +#define glActiveShaderProgramEXT __rglgen_glActiveShaderProgramEXT +#define glBindProgramPipelineEXT __rglgen_glBindProgramPipelineEXT +#define glCreateShaderProgramvEXT __rglgen_glCreateShaderProgramvEXT +#define glDeleteProgramPipelinesEXT __rglgen_glDeleteProgramPipelinesEXT +#define glGenProgramPipelinesEXT __rglgen_glGenProgramPipelinesEXT +#define glGetProgramPipelineInfoLogEXT __rglgen_glGetProgramPipelineInfoLogEXT +#define glGetProgramPipelineivEXT __rglgen_glGetProgramPipelineivEXT +#define glIsProgramPipelineEXT __rglgen_glIsProgramPipelineEXT +#define glProgramParameteriEXT __rglgen_glProgramParameteriEXT +#define glProgramUniform1fEXT __rglgen_glProgramUniform1fEXT +#define glProgramUniform1fvEXT __rglgen_glProgramUniform1fvEXT +#define glProgramUniform1iEXT __rglgen_glProgramUniform1iEXT +#define glProgramUniform1ivEXT __rglgen_glProgramUniform1ivEXT +#define glProgramUniform2fEXT __rglgen_glProgramUniform2fEXT +#define glProgramUniform2fvEXT __rglgen_glProgramUniform2fvEXT +#define glProgramUniform2iEXT __rglgen_glProgramUniform2iEXT +#define glProgramUniform2ivEXT __rglgen_glProgramUniform2ivEXT +#define glProgramUniform3fEXT __rglgen_glProgramUniform3fEXT +#define glProgramUniform3fvEXT __rglgen_glProgramUniform3fvEXT +#define glProgramUniform3iEXT __rglgen_glProgramUniform3iEXT +#define glProgramUniform3ivEXT __rglgen_glProgramUniform3ivEXT +#define glProgramUniform4fEXT __rglgen_glProgramUniform4fEXT +#define glProgramUniform4fvEXT __rglgen_glProgramUniform4fvEXT +#define glProgramUniform4iEXT __rglgen_glProgramUniform4iEXT +#define glProgramUniform4ivEXT __rglgen_glProgramUniform4ivEXT +#define glProgramUniformMatrix2fvEXT __rglgen_glProgramUniformMatrix2fvEXT +#define glProgramUniformMatrix3fvEXT __rglgen_glProgramUniformMatrix3fvEXT +#define glProgramUniformMatrix4fvEXT __rglgen_glProgramUniformMatrix4fvEXT +#define glUseProgramStagesEXT __rglgen_glUseProgramStagesEXT +#define glValidateProgramPipelineEXT __rglgen_glValidateProgramPipelineEXT +#define glProgramUniform1uiEXT __rglgen_glProgramUniform1uiEXT +#define glProgramUniform2uiEXT __rglgen_glProgramUniform2uiEXT +#define glProgramUniform3uiEXT __rglgen_glProgramUniform3uiEXT +#define glProgramUniform4uiEXT __rglgen_glProgramUniform4uiEXT +#define glProgramUniform1uivEXT __rglgen_glProgramUniform1uivEXT +#define glProgramUniform2uivEXT __rglgen_glProgramUniform2uivEXT +#define glProgramUniform3uivEXT __rglgen_glProgramUniform3uivEXT +#define glProgramUniform4uivEXT __rglgen_glProgramUniform4uivEXT +#define glProgramUniformMatrix2x3fvEXT __rglgen_glProgramUniformMatrix2x3fvEXT +#define glProgramUniformMatrix3x2fvEXT __rglgen_glProgramUniformMatrix3x2fvEXT +#define glProgramUniformMatrix2x4fvEXT __rglgen_glProgramUniformMatrix2x4fvEXT +#define glProgramUniformMatrix4x2fvEXT __rglgen_glProgramUniformMatrix4x2fvEXT +#define glProgramUniformMatrix3x4fvEXT __rglgen_glProgramUniformMatrix3x4fvEXT +#define glProgramUniformMatrix4x3fvEXT __rglgen_glProgramUniformMatrix4x3fvEXT +#define glFramebufferPixelLocalStorageSizeEXT __rglgen_glFramebufferPixelLocalStorageSizeEXT +#define glGetFramebufferPixelLocalStorageSizeEXT __rglgen_glGetFramebufferPixelLocalStorageSizeEXT +#define glClearPixelLocalStorageuiEXT __rglgen_glClearPixelLocalStorageuiEXT +#define glTexPageCommitmentEXT __rglgen_glTexPageCommitmentEXT +#define glPatchParameteriEXT __rglgen_glPatchParameteriEXT +#define glTexParameterIivEXT __rglgen_glTexParameterIivEXT +#define glTexParameterIuivEXT __rglgen_glTexParameterIuivEXT +#define glGetTexParameterIivEXT __rglgen_glGetTexParameterIivEXT +#define glGetTexParameterIuivEXT __rglgen_glGetTexParameterIuivEXT +#define glSamplerParameterIivEXT __rglgen_glSamplerParameterIivEXT +#define glSamplerParameterIuivEXT __rglgen_glSamplerParameterIuivEXT +#define glGetSamplerParameterIivEXT __rglgen_glGetSamplerParameterIivEXT +#define glGetSamplerParameterIuivEXT __rglgen_glGetSamplerParameterIuivEXT +#define glTexBufferEXT __rglgen_glTexBufferEXT +#define glTexBufferRangeEXT __rglgen_glTexBufferRangeEXT +#define glTexStorage1DEXT __rglgen_glTexStorage1DEXT +#define glTexStorage2DEXT __rglgen_glTexStorage2DEXT +#define glTexStorage3DEXT __rglgen_glTexStorage3DEXT +#define glTextureStorage1DEXT __rglgen_glTextureStorage1DEXT +#define glTextureStorage2DEXT __rglgen_glTextureStorage2DEXT +#define glTextureStorage3DEXT __rglgen_glTextureStorage3DEXT +#define glTextureViewEXT __rglgen_glTextureViewEXT +#define glesEXT __rglgen_glesEXT +#define glFramebufferTextureMultiviewOVR __rglgen_glFramebufferTextureMultiviewOVR +#define glFramebufferTextureMultisampleMultiviewOVR __rglgen_glFramebufferTextureMultisampleMultiviewOVR + +extern RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; +extern RGLSYMGLDEBUGMESSAGECONTROLKHRPROC __rglgen_glDebugMessageControlKHR; +extern RGLSYMGLDEBUGMESSAGEINSERTKHRPROC __rglgen_glDebugMessageInsertKHR; +extern RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC __rglgen_glDebugMessageCallbackKHR; +extern RGLSYMGLGETDEBUGMESSAGELOGKHRPROC __rglgen_glGetDebugMessageLogKHR; +extern RGLSYMGLPUSHDEBUGGROUPKHRPROC __rglgen_glPushDebugGroupKHR; +extern RGLSYMGLPOPDEBUGGROUPKHRPROC __rglgen_glPopDebugGroupKHR; +extern RGLSYMGLOBJECTLABELKHRPROC __rglgen_glObjectLabelKHR; +extern RGLSYMGLGETOBJECTLABELKHRPROC __rglgen_glGetObjectLabelKHR; +extern RGLSYMGLOBJECTPTRLABELKHRPROC __rglgen_glObjectPtrLabelKHR; +extern RGLSYMGLGETOBJECTPTRLABELKHRPROC __rglgen_glGetObjectPtrLabelKHR; +extern RGLSYMGLGETPOINTERVKHRPROC __rglgen_glGetPointervKHR; +extern RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC __rglgen_glGetGraphicsResetStatusKHR; +extern RGLSYMGLREADNPIXELSKHRPROC __rglgen_glReadnPixelsKHR; +extern RGLSYMGLGETNUNIFORMFVKHRPROC __rglgen_glGetnUniformfvKHR; +extern RGLSYMGLGETNUNIFORMIVKHRPROC __rglgen_glGetnUniformivKHR; +extern RGLSYMGLGETNUNIFORMUIVKHRPROC __rglgen_glGetnUniformuivKHR; +extern RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC __rglgen_glEGLImageTargetTexture2DOES; +extern RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __rglgen_glEGLImageTargetRenderbufferStorageOES; +extern RGLSYMGLCOPYIMAGESUBDATAOESPROC __rglgen_glCopyImageSubDataOES; +extern RGLSYMGLENABLEIOESPROC __rglgen_glEnableiOES; +extern RGLSYMGLDISABLEIOESPROC __rglgen_glDisableiOES; +extern RGLSYMGLBLENDEQUATIONIOESPROC __rglgen_glBlendEquationiOES; +extern RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC __rglgen_glBlendEquationSeparateiOES; +extern RGLSYMGLBLENDFUNCIOESPROC __rglgen_glBlendFunciOES; +extern RGLSYMGLBLENDFUNCSEPARATEIOESPROC __rglgen_glBlendFuncSeparateiOES; +extern RGLSYMGLCOLORMASKIOESPROC __rglgen_glColorMaskiOES; +extern RGLSYMGLISENABLEDIOESPROC __rglgen_glIsEnablediOES; +extern RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glDrawElementsBaseVertexOES; +extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC __rglgen_glDrawRangeElementsBaseVertexOES; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC __rglgen_glDrawElementsInstancedBaseVertexOES; +extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glMultiDrawElementsBaseVertexOES; +extern RGLSYMGLFRAMEBUFFERTEXTUREOESPROC __rglgen_glFramebufferTextureOES; +extern RGLSYMGLGETPROGRAMBINARYOESPROC __rglgen_glGetProgramBinaryOES; +extern RGLSYMGLPROGRAMBINARYOESPROC __rglgen_glProgramBinaryOES; +extern RGLSYMGLMAPBUFFEROESPROC __rglgen_glMapBufferOES; +extern RGLSYMGLUNMAPBUFFEROESPROC __rglgen_glUnmapBufferOES; +extern RGLSYMGLGETBUFFERPOINTERVOESPROC __rglgen_glGetBufferPointervOES; +extern RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC __rglgen_glPrimitiveBoundingBoxOES; +extern RGLSYMGLMINSAMPLESHADINGOESPROC __rglgen_glMinSampleShadingOES; +extern RGLSYMGLPATCHPARAMETERIOESPROC __rglgen_glPatchParameteriOES; +extern RGLSYMGLTEXIMAGE3DOESPROC __rglgen_glTexImage3DOES; +extern RGLSYMGLTEXSUBIMAGE3DOESPROC __rglgen_glTexSubImage3DOES; +extern RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC __rglgen_glCopyTexSubImage3DOES; +extern RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC __rglgen_glCompressedTexImage3DOES; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __rglgen_glCompressedTexSubImage3DOES; +extern RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC __rglgen_glFramebufferTexture3DOES; +extern RGLSYMGLTEXPARAMETERIIVOESPROC __rglgen_glTexParameterIivOES; +extern RGLSYMGLTEXPARAMETERIUIVOESPROC __rglgen_glTexParameterIuivOES; +extern RGLSYMGLGETTEXPARAMETERIIVOESPROC __rglgen_glGetTexParameterIivOES; +extern RGLSYMGLGETTEXPARAMETERIUIVOESPROC __rglgen_glGetTexParameterIuivOES; +extern RGLSYMGLSAMPLERPARAMETERIIVOESPROC __rglgen_glSamplerParameterIivOES; +extern RGLSYMGLSAMPLERPARAMETERIUIVOESPROC __rglgen_glSamplerParameterIuivOES; +extern RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC __rglgen_glGetSamplerParameterIivOES; +extern RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC __rglgen_glGetSamplerParameterIuivOES; +extern RGLSYMGLTEXBUFFEROESPROC __rglgen_glTexBufferOES; +extern RGLSYMGLTEXBUFFERRANGEOESPROC __rglgen_glTexBufferRangeOES; +extern RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC __rglgen_glTexStorage3DMultisampleOES; +extern RGLSYMGLTEXTUREVIEWOESPROC __rglgen_glTextureViewOES; +extern RGLSYMGLBINDVERTEXARRAYOESPROC __rglgen_glBindVertexArrayOES; +extern RGLSYMGLDELETEVERTEXARRAYSOESPROC __rglgen_glDeleteVertexArraysOES; +extern RGLSYMGLGENVERTEXARRAYSOESPROC __rglgen_glGenVertexArraysOES; +extern RGLSYMGLISVERTEXARRAYOESPROC __rglgen_glIsVertexArrayOES; +extern RGLSYMGLVIEWPORTARRAYVOESPROC __rglgen_glViewportArrayvOES; +extern RGLSYMGLVIEWPORTINDEXEDFOESPROC __rglgen_glViewportIndexedfOES; +extern RGLSYMGLVIEWPORTINDEXEDFVOESPROC __rglgen_glViewportIndexedfvOES; +extern RGLSYMGLSCISSORARRAYVOESPROC __rglgen_glScissorArrayvOES; +extern RGLSYMGLSCISSORINDEXEDOESPROC __rglgen_glScissorIndexedOES; +extern RGLSYMGLSCISSORINDEXEDVOESPROC __rglgen_glScissorIndexedvOES; +extern RGLSYMGLDEPTHRANGEARRAYFVOESPROC __rglgen_glDepthRangeArrayfvOES; +extern RGLSYMGLDEPTHRANGEINDEXEDFOESPROC __rglgen_glDepthRangeIndexedfOES; +extern RGLSYMGLGETFLOATI_VOESPROC __rglgen_glGetFloati_vOES; +extern RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawArraysInstancedBaseInstanceEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseInstanceEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT; +extern RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __rglgen_glBindFragDataLocationIndexedEXT; +extern RGLSYMGLBINDFRAGDATALOCATIONEXTPROC __rglgen_glBindFragDataLocationEXT; +extern RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __rglgen_glGetProgramResourceLocationIndexEXT; +extern RGLSYMGLGETFRAGDATAINDEXEXTPROC __rglgen_glGetFragDataIndexEXT; +extern RGLSYMGLBUFFERSTORAGEEXTPROC __rglgen_glBufferStorageEXT; +extern RGLSYMGLCLEARTEXIMAGEEXTPROC __rglgen_glClearTexImageEXT; +extern RGLSYMGLCLEARTEXSUBIMAGEEXTPROC __rglgen_glClearTexSubImageEXT; +extern RGLSYMGLCOPYIMAGESUBDATAEXTPROC __rglgen_glCopyImageSubDataEXT; +extern RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; +extern RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; +extern RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; +extern RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; +extern RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; +extern RGLSYMGLDISCARDFRAMEBUFFEREXTPROC __rglgen_glDiscardFramebufferEXT; +extern RGLSYMGLGENQUERIESEXTPROC __rglgen_glGenQueriesEXT; +extern RGLSYMGLDELETEQUERIESEXTPROC __rglgen_glDeleteQueriesEXT; +extern RGLSYMGLISQUERYEXTPROC __rglgen_glIsQueryEXT; +extern RGLSYMGLBEGINQUERYEXTPROC __rglgen_glBeginQueryEXT; +extern RGLSYMGLENDQUERYEXTPROC __rglgen_glEndQueryEXT; +extern RGLSYMGLQUERYCOUNTEREXTPROC __rglgen_glQueryCounterEXT; +extern RGLSYMGLGETQUERYIVEXTPROC __rglgen_glGetQueryivEXT; +extern RGLSYMGLGETQUERYOBJECTIVEXTPROC __rglgen_glGetQueryObjectivEXT; +extern RGLSYMGLGETQUERYOBJECTUIVEXTPROC __rglgen_glGetQueryObjectuivEXT; +extern RGLSYMGLDRAWBUFFERSEXTPROC __rglgen_glDrawBuffersEXT; +extern RGLSYMGLENABLEIEXTPROC __rglgen_glEnableiEXT; +extern RGLSYMGLDISABLEIEXTPROC __rglgen_glDisableiEXT; +extern RGLSYMGLBLENDEQUATIONIEXTPROC __rglgen_glBlendEquationiEXT; +extern RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC __rglgen_glBlendEquationSeparateiEXT; +extern RGLSYMGLBLENDFUNCIEXTPROC __rglgen_glBlendFunciEXT; +extern RGLSYMGLBLENDFUNCSEPARATEIEXTPROC __rglgen_glBlendFuncSeparateiEXT; +extern RGLSYMGLCOLORMASKIEXTPROC __rglgen_glColorMaskiEXT; +extern RGLSYMGLISENABLEDIEXTPROC __rglgen_glIsEnablediEXT; +extern RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawElementsBaseVertexEXT; +extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawRangeElementsBaseVertexEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __rglgen_glDrawElementsInstancedBaseVertexEXT; +extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glMultiDrawElementsBaseVertexEXT; +extern RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; +extern RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC __rglgen_glFramebufferTextureEXT; +extern RGLSYMGLVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexAttribDivisorEXT; +extern RGLSYMGLMAPBUFFERRANGEEXTPROC __rglgen_glMapBufferRangeEXT; +extern RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedBufferRangeEXT; +extern RGLSYMGLMULTIDRAWARRAYSEXTPROC __rglgen_glMultiDrawArraysEXT; +extern RGLSYMGLMULTIDRAWELEMENTSEXTPROC __rglgen_glMultiDrawElementsEXT; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC __rglgen_glMultiDrawArraysIndirectEXT; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC __rglgen_glMultiDrawElementsIndirectEXT; +extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glRenderbufferStorageMultisampleEXT; +extern RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __rglgen_glFramebufferTexture2DMultisampleEXT; +extern RGLSYMGLREADBUFFERINDEXEDEXTPROC __rglgen_glReadBufferIndexedEXT; +extern RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC __rglgen_glDrawBuffersIndexedEXT; +extern RGLSYMGLGETINTEGERI_VEXTPROC __rglgen_glGetIntegeri_vEXT; +extern RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; +extern RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC __rglgen_glPrimitiveBoundingBoxEXT; +extern RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; +extern RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC __rglgen_glGetGraphicsResetStatusEXT; +extern RGLSYMGLREADNPIXELSEXTPROC __rglgen_glReadnPixelsEXT; +extern RGLSYMGLGETNUNIFORMFVEXTPROC __rglgen_glGetnUniformfvEXT; +extern RGLSYMGLGETNUNIFORMIVEXTPROC __rglgen_glGetnUniformivEXT; +extern RGLSYMGLACTIVESHADERPROGRAMEXTPROC __rglgen_glActiveShaderProgramEXT; +extern RGLSYMGLBINDPROGRAMPIPELINEEXTPROC __rglgen_glBindProgramPipelineEXT; +extern RGLSYMGLCREATESHADERPROGRAMVEXTPROC __rglgen_glCreateShaderProgramvEXT; +extern RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC __rglgen_glDeleteProgramPipelinesEXT; +extern RGLSYMGLGENPROGRAMPIPELINESEXTPROC __rglgen_glGenProgramPipelinesEXT; +extern RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC __rglgen_glGetProgramPipelineInfoLogEXT; +extern RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC __rglgen_glGetProgramPipelineivEXT; +extern RGLSYMGLISPROGRAMPIPELINEEXTPROC __rglgen_glIsProgramPipelineEXT; +extern RGLSYMGLPROGRAMPARAMETERIEXTPROC __rglgen_glProgramParameteriEXT; +extern RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; +extern RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; +extern RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; +extern RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; +extern RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; +extern RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; +extern RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; +extern RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; +extern RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; +extern RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; +extern RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; +extern RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; +extern RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; +extern RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; +extern RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; +extern RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; +extern RGLSYMGLUSEPROGRAMSTAGESEXTPROC __rglgen_glUseProgramStagesEXT; +extern RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC __rglgen_glValidateProgramPipelineEXT; +extern RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; +extern RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; +extern RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; +extern RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; +extern RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; +extern RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; +extern RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; +extern RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; +extern RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glFramebufferPixelLocalStorageSizeEXT; +extern RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glGetFramebufferPixelLocalStorageSizeEXT; +extern RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC __rglgen_glClearPixelLocalStorageuiEXT; +extern RGLSYMGLTEXPAGECOMMITMENTEXTPROC __rglgen_glTexPageCommitmentEXT; +extern RGLSYMGLPATCHPARAMETERIEXTPROC __rglgen_glPatchParameteriEXT; +extern RGLSYMGLTEXPARAMETERIIVEXTPROC __rglgen_glTexParameterIivEXT; +extern RGLSYMGLTEXPARAMETERIUIVEXTPROC __rglgen_glTexParameterIuivEXT; +extern RGLSYMGLGETTEXPARAMETERIIVEXTPROC __rglgen_glGetTexParameterIivEXT; +extern RGLSYMGLGETTEXPARAMETERIUIVEXTPROC __rglgen_glGetTexParameterIuivEXT; +extern RGLSYMGLSAMPLERPARAMETERIIVEXTPROC __rglgen_glSamplerParameterIivEXT; +extern RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC __rglgen_glSamplerParameterIuivEXT; +extern RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC __rglgen_glGetSamplerParameterIivEXT; +extern RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC __rglgen_glGetSamplerParameterIuivEXT; +extern RGLSYMGLTEXBUFFEREXTPROC __rglgen_glTexBufferEXT; +extern RGLSYMGLTEXBUFFERRANGEEXTPROC __rglgen_glTexBufferRangeEXT; +extern RGLSYMGLTEXSTORAGE1DEXTPROC __rglgen_glTexStorage1DEXT; +extern RGLSYMGLTEXSTORAGE2DEXTPROC __rglgen_glTexStorage2DEXT; +extern RGLSYMGLTEXSTORAGE3DEXTPROC __rglgen_glTexStorage3DEXT; +extern RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; +extern RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; +extern RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; +extern RGLSYMGLTEXTUREVIEWEXTPROC __rglgen_glTextureViewEXT; +extern RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; +extern RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultisampleMultiviewOVR; + +struct rglgen_sym_map { const char *sym; void *ptr; }; +extern const struct rglgen_sym_map rglgen_symbol_map[]; +#ifdef __cplusplus +} +#endif +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/glsym_es3.h
Added
@@ -0,0 +1,650 @@ +#ifndef RGLGEN_DECL_H__ +#define RGLGEN_DECL_H__ +#ifdef __cplusplus +extern "C" { +#endif +#ifdef GL_APIENTRY +typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +typedef void (GL_APIENTRY *RGLGENGLDEBUGPROCKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +#else +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +typedef void (APIENTRY *RGLGENGLDEBUGPROCARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +typedef void (APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +#endif +#ifndef GL_OES_EGL_image +typedef void *GLeglImageOES; +#endif +#if !defined(GL_OES_fixed_point) && !defined(HAVE_OPENGLES2) +typedef GLint GLfixed; +#endif +#if defined(OSX) && !defined(MAC_OS_X_VERSION_10_7) +typedef long long int GLint64; +typedef unsigned long long int GLuint64; +typedef unsigned long long int GLuint64EXT; +typedef struct __GLsync *GLsync; +#endif +typedef void (GL_APIENTRYP RGLSYMGLBLENDBARRIERKHRPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC) (RGLGENGLDEBUGPROCKHR callback, const void *userParam); +typedef GLuint (GL_APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP RGLSYMGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP RGLSYMGLPOPDEBUGGROUPKHRPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETPOINTERVKHRPROC) (GLenum pname, void **params); +typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GL_APIENTRYP RGLSYMGLENABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP RGLSYMGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); +typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GL_APIENTRYP RGLSYMGLMINSAMPLESHADINGOESPROC) (GLfloat value); +typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GL_APIENTRYP RGLSYMGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GL_APIENTRYP RGLSYMGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP RGLSYMGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP RGLSYMGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTARRAYVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTINDEXEDFOESPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GL_APIENTRYP RGLSYMGLVIEWPORTINDEXEDFVOESPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORARRAYVOESPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORINDEXEDOESPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLSCISSORINDEXEDVOESPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEARRAYFVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP RGLSYMGLDEPTHRANGEINDEXEDFOESPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP RGLSYMGLGETFLOATI_VOESPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GL_APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (GL_APIENTRYP RGLSYMGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP RGLSYMGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GL_APIENTRYP RGLSYMGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (GL_APIENTRYP RGLSYMGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GL_APIENTRYP RGLSYMGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP RGLSYMGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP RGLSYMGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP RGLSYMGLPOPGROUPMARKEREXTPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (GL_APIENTRYP RGLSYMGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP RGLSYMGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISQUERYEXTPROC) (GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP RGLSYMGLENDQUERYEXTPROC) (GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP RGLSYMGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); +typedef void (GL_APIENTRYP RGLSYMGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP RGLSYMGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISENABLEDIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, const GLint *basevertex); +typedef void (GL_APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GL_APIENTRYP RGLSYMGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); +typedef void *(GL_APIENTRYP RGLSYMGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +typedef void (GL_APIENTRYP RGLSYMGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); +typedef void (GL_APIENTRYP RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); +typedef void (GL_APIENTRYP RGLSYMGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (GL_APIENTRYP RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +typedef void (GL_APIENTRYP RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef void (GL_APIENTRYP RGLSYMGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +typedef GLenum (GL_APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC) (void); +typedef void (GL_APIENTRYP RGLSYMGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP RGLSYMGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef GLuint (GL_APIENTRYP RGLSYMGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); +typedef void (GL_APIENTRYP RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP RGLSYMGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef GLboolean (GL_APIENTRYP RGLSYMGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GL_APIENTRYP RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); +typedef void (GL_APIENTRYP RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint *values); +typedef void (GL_APIENTRYP RGLSYMGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GL_APIENTRYP RGLSYMGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP RGLSYMGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP RGLSYMGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP RGLSYMGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (GL_APIENTRYP RGLSYMGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +typedef void (GL_APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); + +#define glBlendBarrierKHR __rglgen_glBlendBarrierKHR +#define glDebugMessageControlKHR __rglgen_glDebugMessageControlKHR +#define glDebugMessageInsertKHR __rglgen_glDebugMessageInsertKHR +#define glDebugMessageCallbackKHR __rglgen_glDebugMessageCallbackKHR +#define glGetDebugMessageLogKHR __rglgen_glGetDebugMessageLogKHR +#define glPushDebugGroupKHR __rglgen_glPushDebugGroupKHR +#define glPopDebugGroupKHR __rglgen_glPopDebugGroupKHR +#define glObjectLabelKHR __rglgen_glObjectLabelKHR +#define glGetObjectLabelKHR __rglgen_glGetObjectLabelKHR +#define glObjectPtrLabelKHR __rglgen_glObjectPtrLabelKHR +#define glGetObjectPtrLabelKHR __rglgen_glGetObjectPtrLabelKHR +#define glGetPointervKHR __rglgen_glGetPointervKHR +#define glGetGraphicsResetStatusKHR __rglgen_glGetGraphicsResetStatusKHR +#define glReadnPixelsKHR __rglgen_glReadnPixelsKHR +#define glGetnUniformfvKHR __rglgen_glGetnUniformfvKHR +#define glGetnUniformivKHR __rglgen_glGetnUniformivKHR +#define glGetnUniformuivKHR __rglgen_glGetnUniformuivKHR +#define glEGLImageTargetTexture2DOES __rglgen_glEGLImageTargetTexture2DOES +#define glEGLImageTargetRenderbufferStorageOES __rglgen_glEGLImageTargetRenderbufferStorageOES +#define glCopyImageSubDataOES __rglgen_glCopyImageSubDataOES +#define glEnableiOES __rglgen_glEnableiOES +#define glDisableiOES __rglgen_glDisableiOES +#define glBlendEquationiOES __rglgen_glBlendEquationiOES +#define glBlendEquationSeparateiOES __rglgen_glBlendEquationSeparateiOES +#define glBlendFunciOES __rglgen_glBlendFunciOES +#define glBlendFuncSeparateiOES __rglgen_glBlendFuncSeparateiOES +#define glColorMaskiOES __rglgen_glColorMaskiOES +#define glIsEnablediOES __rglgen_glIsEnablediOES +#define glDrawElementsBaseVertexOES __rglgen_glDrawElementsBaseVertexOES +#define glDrawRangeElementsBaseVertexOES __rglgen_glDrawRangeElementsBaseVertexOES +#define glDrawElementsInstancedBaseVertexOES __rglgen_glDrawElementsInstancedBaseVertexOES +#define glMultiDrawElementsBaseVertexOES __rglgen_glMultiDrawElementsBaseVertexOES +#define glFramebufferTextureOES __rglgen_glFramebufferTextureOES +#define glGetProgramBinaryOES __rglgen_glGetProgramBinaryOES +#define glProgramBinaryOES __rglgen_glProgramBinaryOES +#define glMapBufferOES __rglgen_glMapBufferOES +#define glUnmapBufferOES __rglgen_glUnmapBufferOES +#define glGetBufferPointervOES __rglgen_glGetBufferPointervOES +#define glPrimitiveBoundingBoxOES __rglgen_glPrimitiveBoundingBoxOES +#define glMinSampleShadingOES __rglgen_glMinSampleShadingOES +#define glPatchParameteriOES __rglgen_glPatchParameteriOES +#define glTexImage3DOES __rglgen_glTexImage3DOES +#define glTexSubImage3DOES __rglgen_glTexSubImage3DOES +#define glCopyTexSubImage3DOES __rglgen_glCopyTexSubImage3DOES +#define glCompressedTexImage3DOES __rglgen_glCompressedTexImage3DOES +#define glCompressedTexSubImage3DOES __rglgen_glCompressedTexSubImage3DOES +#define glFramebufferTexture3DOES __rglgen_glFramebufferTexture3DOES +#define glTexParameterIivOES __rglgen_glTexParameterIivOES +#define glTexParameterIuivOES __rglgen_glTexParameterIuivOES +#define glGetTexParameterIivOES __rglgen_glGetTexParameterIivOES +#define glGetTexParameterIuivOES __rglgen_glGetTexParameterIuivOES +#define glSamplerParameterIivOES __rglgen_glSamplerParameterIivOES +#define glSamplerParameterIuivOES __rglgen_glSamplerParameterIuivOES +#define glGetSamplerParameterIivOES __rglgen_glGetSamplerParameterIivOES +#define glGetSamplerParameterIuivOES __rglgen_glGetSamplerParameterIuivOES +#define glTexBufferOES __rglgen_glTexBufferOES +#define glTexBufferRangeOES __rglgen_glTexBufferRangeOES +#define glTexStorage3DMultisampleOES __rglgen_glTexStorage3DMultisampleOES +#define glTextureViewOES __rglgen_glTextureViewOES +#define glBindVertexArrayOES __rglgen_glBindVertexArrayOES +#define glDeleteVertexArraysOES __rglgen_glDeleteVertexArraysOES +#define glGenVertexArraysOES __rglgen_glGenVertexArraysOES +#define glIsVertexArrayOES __rglgen_glIsVertexArrayOES +#define glViewportArrayvOES __rglgen_glViewportArrayvOES +#define glViewportIndexedfOES __rglgen_glViewportIndexedfOES +#define glViewportIndexedfvOES __rglgen_glViewportIndexedfvOES +#define glScissorArrayvOES __rglgen_glScissorArrayvOES +#define glScissorIndexedOES __rglgen_glScissorIndexedOES +#define glScissorIndexedvOES __rglgen_glScissorIndexedvOES +#define glDepthRangeArrayfvOES __rglgen_glDepthRangeArrayfvOES +#define glDepthRangeIndexedfOES __rglgen_glDepthRangeIndexedfOES +#define glGetFloati_vOES __rglgen_glGetFloati_vOES +#define glDrawArraysInstancedBaseInstanceEXT __rglgen_glDrawArraysInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseInstanceEXT __rglgen_glDrawElementsInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT +#define glBindFragDataLocationIndexedEXT __rglgen_glBindFragDataLocationIndexedEXT +#define glBindFragDataLocationEXT __rglgen_glBindFragDataLocationEXT +#define glGetProgramResourceLocationIndexEXT __rglgen_glGetProgramResourceLocationIndexEXT +#define glGetFragDataIndexEXT __rglgen_glGetFragDataIndexEXT +#define glBufferStorageEXT __rglgen_glBufferStorageEXT +#define glClearTexImageEXT __rglgen_glClearTexImageEXT +#define glClearTexSubImageEXT __rglgen_glClearTexSubImageEXT +#define glCopyImageSubDataEXT __rglgen_glCopyImageSubDataEXT +#define glLabelObjectEXT __rglgen_glLabelObjectEXT +#define glGetObjectLabelEXT __rglgen_glGetObjectLabelEXT +#define glInsertEventMarkerEXT __rglgen_glInsertEventMarkerEXT +#define glPushGroupMarkerEXT __rglgen_glPushGroupMarkerEXT +#define glPopGroupMarkerEXT __rglgen_glPopGroupMarkerEXT +#define glDiscardFramebufferEXT __rglgen_glDiscardFramebufferEXT +#define glGenQueriesEXT __rglgen_glGenQueriesEXT +#define glDeleteQueriesEXT __rglgen_glDeleteQueriesEXT +#define glIsQueryEXT __rglgen_glIsQueryEXT +#define glBeginQueryEXT __rglgen_glBeginQueryEXT +#define glEndQueryEXT __rglgen_glEndQueryEXT +#define glQueryCounterEXT __rglgen_glQueryCounterEXT +#define glGetQueryivEXT __rglgen_glGetQueryivEXT +#define glGetQueryObjectivEXT __rglgen_glGetQueryObjectivEXT +#define glGetQueryObjectuivEXT __rglgen_glGetQueryObjectuivEXT +#define glGetQueryObjecti64vEXT __rglgen_glGetQueryObjecti64vEXT +#define glGetQueryObjectui64vEXT __rglgen_glGetQueryObjectui64vEXT +#define glDrawBuffersEXT __rglgen_glDrawBuffersEXT +#define glEnableiEXT __rglgen_glEnableiEXT +#define glDisableiEXT __rglgen_glDisableiEXT +#define glBlendEquationiEXT __rglgen_glBlendEquationiEXT +#define glBlendEquationSeparateiEXT __rglgen_glBlendEquationSeparateiEXT +#define glBlendFunciEXT __rglgen_glBlendFunciEXT +#define glBlendFuncSeparateiEXT __rglgen_glBlendFuncSeparateiEXT +#define glColorMaskiEXT __rglgen_glColorMaskiEXT +#define glIsEnablediEXT __rglgen_glIsEnablediEXT +#define glDrawElementsBaseVertexEXT __rglgen_glDrawElementsBaseVertexEXT +#define glDrawRangeElementsBaseVertexEXT __rglgen_glDrawRangeElementsBaseVertexEXT +#define glDrawElementsInstancedBaseVertexEXT __rglgen_glDrawElementsInstancedBaseVertexEXT +#define glMultiDrawElementsBaseVertexEXT __rglgen_glMultiDrawElementsBaseVertexEXT +#define glDrawArraysInstancedEXT __rglgen_glDrawArraysInstancedEXT +#define glDrawElementsInstancedEXT __rglgen_glDrawElementsInstancedEXT +#define glFramebufferTextureEXT __rglgen_glFramebufferTextureEXT +#define glVertexAttribDivisorEXT __rglgen_glVertexAttribDivisorEXT +#define glMapBufferRangeEXT __rglgen_glMapBufferRangeEXT +#define glFlushMappedBufferRangeEXT __rglgen_glFlushMappedBufferRangeEXT +#define glMultiDrawArraysEXT __rglgen_glMultiDrawArraysEXT +#define glMultiDrawElementsEXT __rglgen_glMultiDrawElementsEXT +#define glMultiDrawArraysIndirectEXT __rglgen_glMultiDrawArraysIndirectEXT +#define glMultiDrawElementsIndirectEXT __rglgen_glMultiDrawElementsIndirectEXT +#define glRenderbufferStorageMultisampleEXT __rglgen_glRenderbufferStorageMultisampleEXT +#define glFramebufferTexture2DMultisampleEXT __rglgen_glFramebufferTexture2DMultisampleEXT +#define glReadBufferIndexedEXT __rglgen_glReadBufferIndexedEXT +#define glDrawBuffersIndexedEXT __rglgen_glDrawBuffersIndexedEXT +#define glGetIntegeri_vEXT __rglgen_glGetIntegeri_vEXT +#define glPolygonOffsetClampEXT __rglgen_glPolygonOffsetClampEXT +#define glPrimitiveBoundingBoxEXT __rglgen_glPrimitiveBoundingBoxEXT +#define glRasterSamplesEXT __rglgen_glRasterSamplesEXT +#define glGetGraphicsResetStatusEXT __rglgen_glGetGraphicsResetStatusEXT +#define glReadnPixelsEXT __rglgen_glReadnPixelsEXT +#define glGetnUniformfvEXT __rglgen_glGetnUniformfvEXT +#define glGetnUniformivEXT __rglgen_glGetnUniformivEXT +#define glActiveShaderProgramEXT __rglgen_glActiveShaderProgramEXT +#define glBindProgramPipelineEXT __rglgen_glBindProgramPipelineEXT +#define glCreateShaderProgramvEXT __rglgen_glCreateShaderProgramvEXT +#define glDeleteProgramPipelinesEXT __rglgen_glDeleteProgramPipelinesEXT +#define glGenProgramPipelinesEXT __rglgen_glGenProgramPipelinesEXT +#define glGetProgramPipelineInfoLogEXT __rglgen_glGetProgramPipelineInfoLogEXT +#define glGetProgramPipelineivEXT __rglgen_glGetProgramPipelineivEXT +#define glIsProgramPipelineEXT __rglgen_glIsProgramPipelineEXT +#define glProgramParameteriEXT __rglgen_glProgramParameteriEXT +#define glProgramUniform1fEXT __rglgen_glProgramUniform1fEXT +#define glProgramUniform1fvEXT __rglgen_glProgramUniform1fvEXT +#define glProgramUniform1iEXT __rglgen_glProgramUniform1iEXT +#define glProgramUniform1ivEXT __rglgen_glProgramUniform1ivEXT +#define glProgramUniform2fEXT __rglgen_glProgramUniform2fEXT +#define glProgramUniform2fvEXT __rglgen_glProgramUniform2fvEXT +#define glProgramUniform2iEXT __rglgen_glProgramUniform2iEXT +#define glProgramUniform2ivEXT __rglgen_glProgramUniform2ivEXT +#define glProgramUniform3fEXT __rglgen_glProgramUniform3fEXT +#define glProgramUniform3fvEXT __rglgen_glProgramUniform3fvEXT +#define glProgramUniform3iEXT __rglgen_glProgramUniform3iEXT +#define glProgramUniform3ivEXT __rglgen_glProgramUniform3ivEXT +#define glProgramUniform4fEXT __rglgen_glProgramUniform4fEXT +#define glProgramUniform4fvEXT __rglgen_glProgramUniform4fvEXT +#define glProgramUniform4iEXT __rglgen_glProgramUniform4iEXT +#define glProgramUniform4ivEXT __rglgen_glProgramUniform4ivEXT +#define glProgramUniformMatrix2fvEXT __rglgen_glProgramUniformMatrix2fvEXT +#define glProgramUniformMatrix3fvEXT __rglgen_glProgramUniformMatrix3fvEXT +#define glProgramUniformMatrix4fvEXT __rglgen_glProgramUniformMatrix4fvEXT +#define glUseProgramStagesEXT __rglgen_glUseProgramStagesEXT +#define glValidateProgramPipelineEXT __rglgen_glValidateProgramPipelineEXT +#define glProgramUniform1uiEXT __rglgen_glProgramUniform1uiEXT +#define glProgramUniform2uiEXT __rglgen_glProgramUniform2uiEXT +#define glProgramUniform3uiEXT __rglgen_glProgramUniform3uiEXT +#define glProgramUniform4uiEXT __rglgen_glProgramUniform4uiEXT +#define glProgramUniform1uivEXT __rglgen_glProgramUniform1uivEXT +#define glProgramUniform2uivEXT __rglgen_glProgramUniform2uivEXT +#define glProgramUniform3uivEXT __rglgen_glProgramUniform3uivEXT +#define glProgramUniform4uivEXT __rglgen_glProgramUniform4uivEXT +#define glProgramUniformMatrix2x3fvEXT __rglgen_glProgramUniformMatrix2x3fvEXT +#define glProgramUniformMatrix3x2fvEXT __rglgen_glProgramUniformMatrix3x2fvEXT +#define glProgramUniformMatrix2x4fvEXT __rglgen_glProgramUniformMatrix2x4fvEXT +#define glProgramUniformMatrix4x2fvEXT __rglgen_glProgramUniformMatrix4x2fvEXT +#define glProgramUniformMatrix3x4fvEXT __rglgen_glProgramUniformMatrix3x4fvEXT +#define glProgramUniformMatrix4x3fvEXT __rglgen_glProgramUniformMatrix4x3fvEXT +#define glFramebufferPixelLocalStorageSizeEXT __rglgen_glFramebufferPixelLocalStorageSizeEXT +#define glGetFramebufferPixelLocalStorageSizeEXT __rglgen_glGetFramebufferPixelLocalStorageSizeEXT +#define glClearPixelLocalStorageuiEXT __rglgen_glClearPixelLocalStorageuiEXT +#define glTexPageCommitmentEXT __rglgen_glTexPageCommitmentEXT +#define glPatchParameteriEXT __rglgen_glPatchParameteriEXT +#define glTexParameterIivEXT __rglgen_glTexParameterIivEXT +#define glTexParameterIuivEXT __rglgen_glTexParameterIuivEXT +#define glGetTexParameterIivEXT __rglgen_glGetTexParameterIivEXT +#define glGetTexParameterIuivEXT __rglgen_glGetTexParameterIuivEXT +#define glSamplerParameterIivEXT __rglgen_glSamplerParameterIivEXT +#define glSamplerParameterIuivEXT __rglgen_glSamplerParameterIuivEXT +#define glGetSamplerParameterIivEXT __rglgen_glGetSamplerParameterIivEXT +#define glGetSamplerParameterIuivEXT __rglgen_glGetSamplerParameterIuivEXT +#define glTexBufferEXT __rglgen_glTexBufferEXT +#define glTexBufferRangeEXT __rglgen_glTexBufferRangeEXT +#define glTexStorage1DEXT __rglgen_glTexStorage1DEXT +#define glTexStorage2DEXT __rglgen_glTexStorage2DEXT +#define glTexStorage3DEXT __rglgen_glTexStorage3DEXT +#define glTextureStorage1DEXT __rglgen_glTextureStorage1DEXT +#define glTextureStorage2DEXT __rglgen_glTextureStorage2DEXT +#define glTextureStorage3DEXT __rglgen_glTextureStorage3DEXT +#define glTextureViewEXT __rglgen_glTextureViewEXT +#define glesEXT __rglgen_glesEXT +#define glFramebufferTextureMultiviewOVR __rglgen_glFramebufferTextureMultiviewOVR +#define glFramebufferTextureMultisampleMultiviewOVR __rglgen_glFramebufferTextureMultisampleMultiviewOVR + +extern RGLSYMGLBLENDBARRIERKHRPROC __rglgen_glBlendBarrierKHR; +extern RGLSYMGLDEBUGMESSAGECONTROLKHRPROC __rglgen_glDebugMessageControlKHR; +extern RGLSYMGLDEBUGMESSAGEINSERTKHRPROC __rglgen_glDebugMessageInsertKHR; +extern RGLSYMGLDEBUGMESSAGECALLBACKKHRPROC __rglgen_glDebugMessageCallbackKHR; +extern RGLSYMGLGETDEBUGMESSAGELOGKHRPROC __rglgen_glGetDebugMessageLogKHR; +extern RGLSYMGLPUSHDEBUGGROUPKHRPROC __rglgen_glPushDebugGroupKHR; +extern RGLSYMGLPOPDEBUGGROUPKHRPROC __rglgen_glPopDebugGroupKHR; +extern RGLSYMGLOBJECTLABELKHRPROC __rglgen_glObjectLabelKHR; +extern RGLSYMGLGETOBJECTLABELKHRPROC __rglgen_glGetObjectLabelKHR; +extern RGLSYMGLOBJECTPTRLABELKHRPROC __rglgen_glObjectPtrLabelKHR; +extern RGLSYMGLGETOBJECTPTRLABELKHRPROC __rglgen_glGetObjectPtrLabelKHR; +extern RGLSYMGLGETPOINTERVKHRPROC __rglgen_glGetPointervKHR; +extern RGLSYMGLGETGRAPHICSRESETSTATUSKHRPROC __rglgen_glGetGraphicsResetStatusKHR; +extern RGLSYMGLREADNPIXELSKHRPROC __rglgen_glReadnPixelsKHR; +extern RGLSYMGLGETNUNIFORMFVKHRPROC __rglgen_glGetnUniformfvKHR; +extern RGLSYMGLGETNUNIFORMIVKHRPROC __rglgen_glGetnUniformivKHR; +extern RGLSYMGLGETNUNIFORMUIVKHRPROC __rglgen_glGetnUniformuivKHR; +extern RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC __rglgen_glEGLImageTargetTexture2DOES; +extern RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC __rglgen_glEGLImageTargetRenderbufferStorageOES; +extern RGLSYMGLCOPYIMAGESUBDATAOESPROC __rglgen_glCopyImageSubDataOES; +extern RGLSYMGLENABLEIOESPROC __rglgen_glEnableiOES; +extern RGLSYMGLDISABLEIOESPROC __rglgen_glDisableiOES; +extern RGLSYMGLBLENDEQUATIONIOESPROC __rglgen_glBlendEquationiOES; +extern RGLSYMGLBLENDEQUATIONSEPARATEIOESPROC __rglgen_glBlendEquationSeparateiOES; +extern RGLSYMGLBLENDFUNCIOESPROC __rglgen_glBlendFunciOES; +extern RGLSYMGLBLENDFUNCSEPARATEIOESPROC __rglgen_glBlendFuncSeparateiOES; +extern RGLSYMGLCOLORMASKIOESPROC __rglgen_glColorMaskiOES; +extern RGLSYMGLISENABLEDIOESPROC __rglgen_glIsEnablediOES; +extern RGLSYMGLDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glDrawElementsBaseVertexOES; +extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXOESPROC __rglgen_glDrawRangeElementsBaseVertexOES; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC __rglgen_glDrawElementsInstancedBaseVertexOES; +extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXOESPROC __rglgen_glMultiDrawElementsBaseVertexOES; +extern RGLSYMGLFRAMEBUFFERTEXTUREOESPROC __rglgen_glFramebufferTextureOES; +extern RGLSYMGLGETPROGRAMBINARYOESPROC __rglgen_glGetProgramBinaryOES; +extern RGLSYMGLPROGRAMBINARYOESPROC __rglgen_glProgramBinaryOES; +extern RGLSYMGLMAPBUFFEROESPROC __rglgen_glMapBufferOES; +extern RGLSYMGLUNMAPBUFFEROESPROC __rglgen_glUnmapBufferOES; +extern RGLSYMGLGETBUFFERPOINTERVOESPROC __rglgen_glGetBufferPointervOES; +extern RGLSYMGLPRIMITIVEBOUNDINGBOXOESPROC __rglgen_glPrimitiveBoundingBoxOES; +extern RGLSYMGLMINSAMPLESHADINGOESPROC __rglgen_glMinSampleShadingOES; +extern RGLSYMGLPATCHPARAMETERIOESPROC __rglgen_glPatchParameteriOES; +extern RGLSYMGLTEXIMAGE3DOESPROC __rglgen_glTexImage3DOES; +extern RGLSYMGLTEXSUBIMAGE3DOESPROC __rglgen_glTexSubImage3DOES; +extern RGLSYMGLCOPYTEXSUBIMAGE3DOESPROC __rglgen_glCopyTexSubImage3DOES; +extern RGLSYMGLCOMPRESSEDTEXIMAGE3DOESPROC __rglgen_glCompressedTexImage3DOES; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DOESPROC __rglgen_glCompressedTexSubImage3DOES; +extern RGLSYMGLFRAMEBUFFERTEXTURE3DOESPROC __rglgen_glFramebufferTexture3DOES; +extern RGLSYMGLTEXPARAMETERIIVOESPROC __rglgen_glTexParameterIivOES; +extern RGLSYMGLTEXPARAMETERIUIVOESPROC __rglgen_glTexParameterIuivOES; +extern RGLSYMGLGETTEXPARAMETERIIVOESPROC __rglgen_glGetTexParameterIivOES; +extern RGLSYMGLGETTEXPARAMETERIUIVOESPROC __rglgen_glGetTexParameterIuivOES; +extern RGLSYMGLSAMPLERPARAMETERIIVOESPROC __rglgen_glSamplerParameterIivOES; +extern RGLSYMGLSAMPLERPARAMETERIUIVOESPROC __rglgen_glSamplerParameterIuivOES; +extern RGLSYMGLGETSAMPLERPARAMETERIIVOESPROC __rglgen_glGetSamplerParameterIivOES; +extern RGLSYMGLGETSAMPLERPARAMETERIUIVOESPROC __rglgen_glGetSamplerParameterIuivOES; +extern RGLSYMGLTEXBUFFEROESPROC __rglgen_glTexBufferOES; +extern RGLSYMGLTEXBUFFERRANGEOESPROC __rglgen_glTexBufferRangeOES; +extern RGLSYMGLTEXSTORAGE3DMULTISAMPLEOESPROC __rglgen_glTexStorage3DMultisampleOES; +extern RGLSYMGLTEXTUREVIEWOESPROC __rglgen_glTextureViewOES; +extern RGLSYMGLBINDVERTEXARRAYOESPROC __rglgen_glBindVertexArrayOES; +extern RGLSYMGLDELETEVERTEXARRAYSOESPROC __rglgen_glDeleteVertexArraysOES; +extern RGLSYMGLGENVERTEXARRAYSOESPROC __rglgen_glGenVertexArraysOES; +extern RGLSYMGLISVERTEXARRAYOESPROC __rglgen_glIsVertexArrayOES; +extern RGLSYMGLVIEWPORTARRAYVOESPROC __rglgen_glViewportArrayvOES; +extern RGLSYMGLVIEWPORTINDEXEDFOESPROC __rglgen_glViewportIndexedfOES; +extern RGLSYMGLVIEWPORTINDEXEDFVOESPROC __rglgen_glViewportIndexedfvOES; +extern RGLSYMGLSCISSORARRAYVOESPROC __rglgen_glScissorArrayvOES; +extern RGLSYMGLSCISSORINDEXEDOESPROC __rglgen_glScissorIndexedOES; +extern RGLSYMGLSCISSORINDEXEDVOESPROC __rglgen_glScissorIndexedvOES; +extern RGLSYMGLDEPTHRANGEARRAYFVOESPROC __rglgen_glDepthRangeArrayfvOES; +extern RGLSYMGLDEPTHRANGEINDEXEDFOESPROC __rglgen_glDepthRangeIndexedfOES; +extern RGLSYMGLGETFLOATI_VOESPROC __rglgen_glGetFloati_vOES; +extern RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawArraysInstancedBaseInstanceEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseInstanceEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstanceEXT; +extern RGLSYMGLBINDFRAGDATALOCATIONINDEXEDEXTPROC __rglgen_glBindFragDataLocationIndexedEXT; +extern RGLSYMGLBINDFRAGDATALOCATIONEXTPROC __rglgen_glBindFragDataLocationEXT; +extern RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC __rglgen_glGetProgramResourceLocationIndexEXT; +extern RGLSYMGLGETFRAGDATAINDEXEXTPROC __rglgen_glGetFragDataIndexEXT; +extern RGLSYMGLBUFFERSTORAGEEXTPROC __rglgen_glBufferStorageEXT; +extern RGLSYMGLCLEARTEXIMAGEEXTPROC __rglgen_glClearTexImageEXT; +extern RGLSYMGLCLEARTEXSUBIMAGEEXTPROC __rglgen_glClearTexSubImageEXT; +extern RGLSYMGLCOPYIMAGESUBDATAEXTPROC __rglgen_glCopyImageSubDataEXT; +extern RGLSYMGLLABELOBJECTEXTPROC __rglgen_glLabelObjectEXT; +extern RGLSYMGLGETOBJECTLABELEXTPROC __rglgen_glGetObjectLabelEXT; +extern RGLSYMGLINSERTEVENTMARKEREXTPROC __rglgen_glInsertEventMarkerEXT; +extern RGLSYMGLPUSHGROUPMARKEREXTPROC __rglgen_glPushGroupMarkerEXT; +extern RGLSYMGLPOPGROUPMARKEREXTPROC __rglgen_glPopGroupMarkerEXT; +extern RGLSYMGLDISCARDFRAMEBUFFEREXTPROC __rglgen_glDiscardFramebufferEXT; +extern RGLSYMGLGENQUERIESEXTPROC __rglgen_glGenQueriesEXT; +extern RGLSYMGLDELETEQUERIESEXTPROC __rglgen_glDeleteQueriesEXT; +extern RGLSYMGLISQUERYEXTPROC __rglgen_glIsQueryEXT; +extern RGLSYMGLBEGINQUERYEXTPROC __rglgen_glBeginQueryEXT; +extern RGLSYMGLENDQUERYEXTPROC __rglgen_glEndQueryEXT; +extern RGLSYMGLQUERYCOUNTEREXTPROC __rglgen_glQueryCounterEXT; +extern RGLSYMGLGETQUERYIVEXTPROC __rglgen_glGetQueryivEXT; +extern RGLSYMGLGETQUERYOBJECTIVEXTPROC __rglgen_glGetQueryObjectivEXT; +extern RGLSYMGLGETQUERYOBJECTUIVEXTPROC __rglgen_glGetQueryObjectuivEXT; +extern RGLSYMGLGETQUERYOBJECTI64VEXTPROC __rglgen_glGetQueryObjecti64vEXT; +extern RGLSYMGLGETQUERYOBJECTUI64VEXTPROC __rglgen_glGetQueryObjectui64vEXT; +extern RGLSYMGLDRAWBUFFERSEXTPROC __rglgen_glDrawBuffersEXT; +extern RGLSYMGLENABLEIEXTPROC __rglgen_glEnableiEXT; +extern RGLSYMGLDISABLEIEXTPROC __rglgen_glDisableiEXT; +extern RGLSYMGLBLENDEQUATIONIEXTPROC __rglgen_glBlendEquationiEXT; +extern RGLSYMGLBLENDEQUATIONSEPARATEIEXTPROC __rglgen_glBlendEquationSeparateiEXT; +extern RGLSYMGLBLENDFUNCIEXTPROC __rglgen_glBlendFunciEXT; +extern RGLSYMGLBLENDFUNCSEPARATEIEXTPROC __rglgen_glBlendFuncSeparateiEXT; +extern RGLSYMGLCOLORMASKIEXTPROC __rglgen_glColorMaskiEXT; +extern RGLSYMGLISENABLEDIEXTPROC __rglgen_glIsEnablediEXT; +extern RGLSYMGLDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawElementsBaseVertexEXT; +extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC __rglgen_glDrawRangeElementsBaseVertexEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC __rglgen_glDrawElementsInstancedBaseVertexEXT; +extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC __rglgen_glMultiDrawElementsBaseVertexEXT; +extern RGLSYMGLDRAWARRAYSINSTANCEDEXTPROC __rglgen_glDrawArraysInstancedEXT; +extern RGLSYMGLDRAWELEMENTSINSTANCEDEXTPROC __rglgen_glDrawElementsInstancedEXT; +extern RGLSYMGLFRAMEBUFFERTEXTUREEXTPROC __rglgen_glFramebufferTextureEXT; +extern RGLSYMGLVERTEXATTRIBDIVISOREXTPROC __rglgen_glVertexAttribDivisorEXT; +extern RGLSYMGLMAPBUFFERRANGEEXTPROC __rglgen_glMapBufferRangeEXT; +extern RGLSYMGLFLUSHMAPPEDBUFFERRANGEEXTPROC __rglgen_glFlushMappedBufferRangeEXT; +extern RGLSYMGLMULTIDRAWARRAYSEXTPROC __rglgen_glMultiDrawArraysEXT; +extern RGLSYMGLMULTIDRAWELEMENTSEXTPROC __rglgen_glMultiDrawElementsEXT; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTEXTPROC __rglgen_glMultiDrawArraysIndirectEXT; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTEXTPROC __rglgen_glMultiDrawElementsIndirectEXT; +extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __rglgen_glRenderbufferStorageMultisampleEXT; +extern RGLSYMGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC __rglgen_glFramebufferTexture2DMultisampleEXT; +extern RGLSYMGLREADBUFFERINDEXEDEXTPROC __rglgen_glReadBufferIndexedEXT; +extern RGLSYMGLDRAWBUFFERSINDEXEDEXTPROC __rglgen_glDrawBuffersIndexedEXT; +extern RGLSYMGLGETINTEGERI_VEXTPROC __rglgen_glGetIntegeri_vEXT; +extern RGLSYMGLPOLYGONOFFSETCLAMPEXTPROC __rglgen_glPolygonOffsetClampEXT; +extern RGLSYMGLPRIMITIVEBOUNDINGBOXEXTPROC __rglgen_glPrimitiveBoundingBoxEXT; +extern RGLSYMGLRASTERSAMPLESEXTPROC __rglgen_glRasterSamplesEXT; +extern RGLSYMGLGETGRAPHICSRESETSTATUSEXTPROC __rglgen_glGetGraphicsResetStatusEXT; +extern RGLSYMGLREADNPIXELSEXTPROC __rglgen_glReadnPixelsEXT; +extern RGLSYMGLGETNUNIFORMFVEXTPROC __rglgen_glGetnUniformfvEXT; +extern RGLSYMGLGETNUNIFORMIVEXTPROC __rglgen_glGetnUniformivEXT; +extern RGLSYMGLACTIVESHADERPROGRAMEXTPROC __rglgen_glActiveShaderProgramEXT; +extern RGLSYMGLBINDPROGRAMPIPELINEEXTPROC __rglgen_glBindProgramPipelineEXT; +extern RGLSYMGLCREATESHADERPROGRAMVEXTPROC __rglgen_glCreateShaderProgramvEXT; +extern RGLSYMGLDELETEPROGRAMPIPELINESEXTPROC __rglgen_glDeleteProgramPipelinesEXT; +extern RGLSYMGLGENPROGRAMPIPELINESEXTPROC __rglgen_glGenProgramPipelinesEXT; +extern RGLSYMGLGETPROGRAMPIPELINEINFOLOGEXTPROC __rglgen_glGetProgramPipelineInfoLogEXT; +extern RGLSYMGLGETPROGRAMPIPELINEIVEXTPROC __rglgen_glGetProgramPipelineivEXT; +extern RGLSYMGLISPROGRAMPIPELINEEXTPROC __rglgen_glIsProgramPipelineEXT; +extern RGLSYMGLPROGRAMPARAMETERIEXTPROC __rglgen_glProgramParameteriEXT; +extern RGLSYMGLPROGRAMUNIFORM1FEXTPROC __rglgen_glProgramUniform1fEXT; +extern RGLSYMGLPROGRAMUNIFORM1FVEXTPROC __rglgen_glProgramUniform1fvEXT; +extern RGLSYMGLPROGRAMUNIFORM1IEXTPROC __rglgen_glProgramUniform1iEXT; +extern RGLSYMGLPROGRAMUNIFORM1IVEXTPROC __rglgen_glProgramUniform1ivEXT; +extern RGLSYMGLPROGRAMUNIFORM2FEXTPROC __rglgen_glProgramUniform2fEXT; +extern RGLSYMGLPROGRAMUNIFORM2FVEXTPROC __rglgen_glProgramUniform2fvEXT; +extern RGLSYMGLPROGRAMUNIFORM2IEXTPROC __rglgen_glProgramUniform2iEXT; +extern RGLSYMGLPROGRAMUNIFORM2IVEXTPROC __rglgen_glProgramUniform2ivEXT; +extern RGLSYMGLPROGRAMUNIFORM3FEXTPROC __rglgen_glProgramUniform3fEXT; +extern RGLSYMGLPROGRAMUNIFORM3FVEXTPROC __rglgen_glProgramUniform3fvEXT; +extern RGLSYMGLPROGRAMUNIFORM3IEXTPROC __rglgen_glProgramUniform3iEXT; +extern RGLSYMGLPROGRAMUNIFORM3IVEXTPROC __rglgen_glProgramUniform3ivEXT; +extern RGLSYMGLPROGRAMUNIFORM4FEXTPROC __rglgen_glProgramUniform4fEXT; +extern RGLSYMGLPROGRAMUNIFORM4FVEXTPROC __rglgen_glProgramUniform4fvEXT; +extern RGLSYMGLPROGRAMUNIFORM4IEXTPROC __rglgen_glProgramUniform4iEXT; +extern RGLSYMGLPROGRAMUNIFORM4IVEXTPROC __rglgen_glProgramUniform4ivEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVEXTPROC __rglgen_glProgramUniformMatrix2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVEXTPROC __rglgen_glProgramUniformMatrix3fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVEXTPROC __rglgen_glProgramUniformMatrix4fvEXT; +extern RGLSYMGLUSEPROGRAMSTAGESEXTPROC __rglgen_glUseProgramStagesEXT; +extern RGLSYMGLVALIDATEPROGRAMPIPELINEEXTPROC __rglgen_glValidateProgramPipelineEXT; +extern RGLSYMGLPROGRAMUNIFORM1UIEXTPROC __rglgen_glProgramUniform1uiEXT; +extern RGLSYMGLPROGRAMUNIFORM2UIEXTPROC __rglgen_glProgramUniform2uiEXT; +extern RGLSYMGLPROGRAMUNIFORM3UIEXTPROC __rglgen_glProgramUniform3uiEXT; +extern RGLSYMGLPROGRAMUNIFORM4UIEXTPROC __rglgen_glProgramUniform4uiEXT; +extern RGLSYMGLPROGRAMUNIFORM1UIVEXTPROC __rglgen_glProgramUniform1uivEXT; +extern RGLSYMGLPROGRAMUNIFORM2UIVEXTPROC __rglgen_glProgramUniform2uivEXT; +extern RGLSYMGLPROGRAMUNIFORM3UIVEXTPROC __rglgen_glProgramUniform3uivEXT; +extern RGLSYMGLPROGRAMUNIFORM4UIVEXTPROC __rglgen_glProgramUniform4uivEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __rglgen_glProgramUniformMatrix2x3fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __rglgen_glProgramUniformMatrix3x2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __rglgen_glProgramUniformMatrix2x4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __rglgen_glProgramUniformMatrix4x2fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __rglgen_glProgramUniformMatrix3x4fvEXT; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __rglgen_glProgramUniformMatrix4x3fvEXT; +extern RGLSYMGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glFramebufferPixelLocalStorageSizeEXT; +extern RGLSYMGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC __rglgen_glGetFramebufferPixelLocalStorageSizeEXT; +extern RGLSYMGLCLEARPIXELLOCALSTORAGEUIEXTPROC __rglgen_glClearPixelLocalStorageuiEXT; +extern RGLSYMGLTEXPAGECOMMITMENTEXTPROC __rglgen_glTexPageCommitmentEXT; +extern RGLSYMGLPATCHPARAMETERIEXTPROC __rglgen_glPatchParameteriEXT; +extern RGLSYMGLTEXPARAMETERIIVEXTPROC __rglgen_glTexParameterIivEXT; +extern RGLSYMGLTEXPARAMETERIUIVEXTPROC __rglgen_glTexParameterIuivEXT; +extern RGLSYMGLGETTEXPARAMETERIIVEXTPROC __rglgen_glGetTexParameterIivEXT; +extern RGLSYMGLGETTEXPARAMETERIUIVEXTPROC __rglgen_glGetTexParameterIuivEXT; +extern RGLSYMGLSAMPLERPARAMETERIIVEXTPROC __rglgen_glSamplerParameterIivEXT; +extern RGLSYMGLSAMPLERPARAMETERIUIVEXTPROC __rglgen_glSamplerParameterIuivEXT; +extern RGLSYMGLGETSAMPLERPARAMETERIIVEXTPROC __rglgen_glGetSamplerParameterIivEXT; +extern RGLSYMGLGETSAMPLERPARAMETERIUIVEXTPROC __rglgen_glGetSamplerParameterIuivEXT; +extern RGLSYMGLTEXBUFFEREXTPROC __rglgen_glTexBufferEXT; +extern RGLSYMGLTEXBUFFERRANGEEXTPROC __rglgen_glTexBufferRangeEXT; +extern RGLSYMGLTEXSTORAGE1DEXTPROC __rglgen_glTexStorage1DEXT; +extern RGLSYMGLTEXSTORAGE2DEXTPROC __rglgen_glTexStorage2DEXT; +extern RGLSYMGLTEXSTORAGE3DEXTPROC __rglgen_glTexStorage3DEXT; +extern RGLSYMGLTEXTURESTORAGE1DEXTPROC __rglgen_glTextureStorage1DEXT; +extern RGLSYMGLTEXTURESTORAGE2DEXTPROC __rglgen_glTextureStorage2DEXT; +extern RGLSYMGLTEXTURESTORAGE3DEXTPROC __rglgen_glTextureStorage3DEXT; +extern RGLSYMGLTEXTUREVIEWEXTPROC __rglgen_glTextureViewEXT; +extern RGLSYMGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultiviewOVR; +extern RGLSYMGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC __rglgen_glFramebufferTextureMultisampleMultiviewOVR; + +struct rglgen_sym_map { const char *sym; void *ptr; }; +extern const struct rglgen_sym_map rglgen_symbol_map[]; +#ifdef __cplusplus +} +#endif +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/glsym_gl.h
Added
@@ -0,0 +1,3140 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef RGLGEN_DECL_H__ +#define RGLGEN_DECL_H__ +#ifdef __cplusplus +extern "C" { +#endif +#ifdef GL_APIENTRY +typedef void (GL_APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +typedef void (GL_APIENTRY *RGLGENGLDEBUGPROCKHR)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +#else +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +typedef void (APIENTRY *RGLGENGLDEBUGPROCARB)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +typedef void (APIENTRY *RGLGENGLDEBUGPROC)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*, GLvoid*); +#endif +#ifndef GL_OES_EGL_image +typedef void *GLeglImageOES; +#endif +#if !defined(GL_OES_fixed_point) && !defined(HAVE_OPENGLES2) +typedef GLint GLfixed; +#endif +#if defined(__MACH__) && !defined(OS_TARGET_IPHONE) && !defined(MAC_OS_X_VERSION_10_7) +typedef long long int GLint64; +typedef unsigned long long int GLuint64; +typedef unsigned long long int GLuint64EXT; +typedef struct __GLsync *GLsync; +#endif +typedef void (APIENTRYP RGLSYMGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP RGLSYMGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP RGLSYMGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP RGLSYMGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP RGLSYMGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP RGLSYMGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP RGLSYMGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP RGLSYMGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (APIENTRYP RGLSYMGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP RGLSYMGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP RGLSYMGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP RGLSYMGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP RGLSYMGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP RGLSYMGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP RGLSYMGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP RGLSYMGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP RGLSYMGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP RGLSYMGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP RGLSYMGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP RGLSYMGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP RGLSYMGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP RGLSYMGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP RGLSYMGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP RGLSYMGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP RGLSYMGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP RGLSYMGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP RGLSYMGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP RGLSYMGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP RGLSYMGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP RGLSYMGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP RGLSYMGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP RGLSYMGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP RGLSYMGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP RGLSYMGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP RGLSYMGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP RGLSYMGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP RGLSYMGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP RGLSYMGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP RGLSYMGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP RGLSYMGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP RGLSYMGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP RGLSYMGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP RGLSYMGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP RGLSYMGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP RGLSYMGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP RGLSYMGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP RGLSYMGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP RGLSYMGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP RGLSYMGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP RGLSYMGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP RGLSYMGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP RGLSYMGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP RGLSYMGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP RGLSYMGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP RGLSYMGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP RGLSYMGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP RGLSYMGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP RGLSYMGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP RGLSYMGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP RGLSYMGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP RGLSYMGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP RGLSYMGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP RGLSYMGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP RGLSYMGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP RGLSYMGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP RGLSYMGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP RGLSYMGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP RGLSYMGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP RGLSYMGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP RGLSYMGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP RGLSYMGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP RGLSYMGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP RGLSYMGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP RGLSYMGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP RGLSYMGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP RGLSYMGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP RGLSYMGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP RGLSYMGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP RGLSYMGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP RGLSYMGLISVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP RGLSYMGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP RGLSYMGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP RGLSYMGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP RGLSYMGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP RGLSYMGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP RGLSYMGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP RGLSYMGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP RGLSYMGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP RGLSYMGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP RGLSYMGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP RGLSYMGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP RGLSYMGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP RGLSYMGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP RGLSYMGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP RGLSYMGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP RGLSYMGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP RGLSYMGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP RGLSYMGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP RGLSYMGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP RGLSYMGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP RGLSYMGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP RGLSYMGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP RGLSYMGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP RGLSYMGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP RGLSYMGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP RGLSYMGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP RGLSYMGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP RGLSYMGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP RGLSYMGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP RGLSYMGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP RGLSYMGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP RGLSYMGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP RGLSYMGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP RGLSYMGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP RGLSYMGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP RGLSYMGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP RGLSYMGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP RGLSYMGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP RGLSYMGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP RGLSYMGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP RGLSYMGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP RGLSYMGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP RGLSYMGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP RGLSYMGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP RGLSYMGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP RGLSYMGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP RGLSYMGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP RGLSYMGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP RGLSYMGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP RGLSYMGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP RGLSYMGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP RGLSYMGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +typedef void (APIENTRYP RGLSYMGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP RGLSYMGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP RGLSYMGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP RGLSYMGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP RGLSYMGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP RGLSYMGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP RGLSYMGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP RGLSYMGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP RGLSYMGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP RGLSYMGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP RGLSYMGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP RGLSYMGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP RGLSYMGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP RGLSYMGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP RGLSYMGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP RGLSYMGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP RGLSYMGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP RGLSYMGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP RGLSYMGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP RGLSYMGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP RGLSYMGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP RGLSYMGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +typedef void (APIENTRYP RGLSYMGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP RGLSYMGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP RGLSYMGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP RGLSYMGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP RGLSYMGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP RGLSYMGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP RGLSYMGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP RGLSYMGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP RGLSYMGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP RGLSYMGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP RGLSYMGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKPROC) (RGLGENGLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP RGLSYMGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP RGLSYMGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP RGLSYMGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP RGLSYMGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP RGLSYMGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP RGLSYMGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP RGLSYMGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP RGLSYMGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP RGLSYMGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP RGLSYMGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP RGLSYMGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP RGLSYMGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP RGLSYMGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP RGLSYMGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef GLuint64 (APIENTRYP RGLSYMGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP RGLSYMGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP RGLSYMGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP RGLSYMGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP RGLSYMGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP RGLSYMGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP RGLSYMGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP RGLSYMGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP RGLSYMGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP RGLSYMGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP RGLSYMGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP RGLSYMGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef __APPLE__ + struct _cl_context; + struct _cl_event; +#endif +typedef GLsync (APIENTRYP RGLSYMGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +typedef void (APIENTRYP RGLSYMGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP RGLSYMGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP RGLSYMGLDEBUGMESSAGECALLBACKARBPROC) (RGLGENGLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP RGLSYMGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP RGLSYMGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (APIENTRYP RGLSYMGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP RGLSYMGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP RGLSYMGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP RGLSYMGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP RGLSYMGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP RGLSYMGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP RGLSYMGLISPROGRAMARBPROC) (GLuint program); +typedef void (APIENTRYP RGLSYMGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP RGLSYMGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP RGLSYMGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP RGLSYMGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (APIENTRYP RGLSYMGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP RGLSYMGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP RGLSYMGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP RGLSYMGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP RGLSYMGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLRESETMINMAXPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP RGLSYMGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP RGLSYMGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP RGLSYMGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP RGLSYMGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP RGLSYMGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP RGLSYMGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP RGLSYMGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP RGLSYMGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP RGLSYMGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP RGLSYMGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP RGLSYMGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +typedef GLenum (APIENTRYP RGLSYMGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP RGLSYMGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP RGLSYMGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP RGLSYMGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP RGLSYMGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP RGLSYMGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP RGLSYMGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP RGLSYMGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP RGLSYMGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP RGLSYMGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP RGLSYMGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP RGLSYMGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP RGLSYMGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP RGLSYMGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP RGLSYMGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP RGLSYMGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP RGLSYMGLMINSAMPLESHADINGARBPROC) (GLfloat value); +typedef void (APIENTRYP RGLSYMGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP RGLSYMGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP RGLSYMGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP RGLSYMGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP RGLSYMGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP RGLSYMGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP RGLSYMGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP RGLSYMGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP RGLSYMGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP RGLSYMGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP RGLSYMGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP RGLSYMGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP RGLSYMGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP RGLSYMGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP RGLSYMGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP RGLSYMGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP RGLSYMGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP RGLSYMGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP RGLSYMGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP RGLSYMGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP RGLSYMGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP RGLSYMGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP RGLSYMGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP RGLSYMGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +typedef void (APIENTRYP RGLSYMGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP RGLSYMGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP RGLSYMGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP RGLSYMGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP RGLSYMGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +typedef void (APIENTRYP RGLSYMGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP RGLSYMGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP RGLSYMGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLVERTEXBLENDARBPROC) (GLint count); +typedef void (APIENTRYP RGLSYMGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP RGLSYMGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP RGLSYMGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP RGLSYMGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP RGLSYMGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP RGLSYMGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP RGLSYMGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP RGLSYMGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP RGLSYMGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP RGLSYMGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP RGLSYMGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP RGLSYMGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP RGLSYMGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +typedef void (APIENTRYP RGLSYMGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP RGLSYMGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP RGLSYMGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP RGLSYMGLWINDOWPOS3SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLVERTEX2BOESPROC) (GLbyte x); +typedef void (APIENTRYP RGLSYMGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLVERTEX3BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP RGLSYMGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP RGLSYMGLVERTEX4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP RGLSYMGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP RGLSYMGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP RGLSYMGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP RGLSYMGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP RGLSYMGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP RGLSYMGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP RGLSYMGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP RGLSYMGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP RGLSYMGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP RGLSYMGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP RGLSYMGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP RGLSYMGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP RGLSYMGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP RGLSYMGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP RGLSYMGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP RGLSYMGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP RGLSYMGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP RGLSYMGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP RGLSYMGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP RGLSYMGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP RGLSYMGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); +typedef void (APIENTRYP RGLSYMGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP RGLSYMGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP RGLSYMGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP RGLSYMGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP RGLSYMGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP RGLSYMGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP RGLSYMGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP RGLSYMGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP RGLSYMGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP RGLSYMGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP RGLSYMGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP RGLSYMGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP RGLSYMGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP RGLSYMGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP RGLSYMGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP RGLSYMGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP RGLSYMGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP RGLSYMGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP RGLSYMGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP RGLSYMGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP RGLSYMGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP RGLSYMGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP RGLSYMGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP RGLSYMGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP RGLSYMGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP RGLSYMGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP RGLSYMGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP RGLSYMGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP RGLSYMGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP RGLSYMGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP RGLSYMGLVERTEX4XVOESPROC) (const GLfixed *coords); +typedef GLbitfield (APIENTRYP RGLSYMGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +typedef void (APIENTRYP RGLSYMGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP RGLSYMGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP RGLSYMGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP RGLSYMGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP RGLSYMGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); + +#define glDrawRangeElements __rglgen_glDrawRangeElements +#define glTexImage3D __rglgen_glTexImage3D +#define glTexSubImage3D __rglgen_glTexSubImage3D +#define glCopyTexSubImage3D __rglgen_glCopyTexSubImage3D +#define glActiveTexture __rglgen_glActiveTexture +#define glSampleCoverage __rglgen_glSampleCoverage +#define glCompressedTexImage3D __rglgen_glCompressedTexImage3D +#define glCompressedTexImage2D __rglgen_glCompressedTexImage2D +#define glCompressedTexImage1D __rglgen_glCompressedTexImage1D +#define glCompressedTexSubImage3D __rglgen_glCompressedTexSubImage3D +#define glCompressedTexSubImage2D __rglgen_glCompressedTexSubImage2D +#define glCompressedTexSubImage1D __rglgen_glCompressedTexSubImage1D +#define glGetCompressedTexImage __rglgen_glGetCompressedTexImage +#define glClientActiveTexture __rglgen_glClientActiveTexture +#define glMultiTexCoord1d __rglgen_glMultiTexCoord1d +#define glMultiTexCoord1dv __rglgen_glMultiTexCoord1dv +#define glMultiTexCoord1f __rglgen_glMultiTexCoord1f +#define glMultiTexCoord1fv __rglgen_glMultiTexCoord1fv +#define glMultiTexCoord1i __rglgen_glMultiTexCoord1i +#define glMultiTexCoord1iv __rglgen_glMultiTexCoord1iv +#define glMultiTexCoord1s __rglgen_glMultiTexCoord1s +#define glMultiTexCoord1sv __rglgen_glMultiTexCoord1sv +#define glMultiTexCoord2d __rglgen_glMultiTexCoord2d +#define glMultiTexCoord2dv __rglgen_glMultiTexCoord2dv +#define glMultiTexCoord2f __rglgen_glMultiTexCoord2f +#define glMultiTexCoord2fv __rglgen_glMultiTexCoord2fv +#define glMultiTexCoord2i __rglgen_glMultiTexCoord2i +#define glMultiTexCoord2iv __rglgen_glMultiTexCoord2iv +#define glMultiTexCoord2s __rglgen_glMultiTexCoord2s +#define glMultiTexCoord2sv __rglgen_glMultiTexCoord2sv +#define glMultiTexCoord3d __rglgen_glMultiTexCoord3d +#define glMultiTexCoord3dv __rglgen_glMultiTexCoord3dv +#define glMultiTexCoord3f __rglgen_glMultiTexCoord3f +#define glMultiTexCoord3fv __rglgen_glMultiTexCoord3fv +#define glMultiTexCoord3i __rglgen_glMultiTexCoord3i +#define glMultiTexCoord3iv __rglgen_glMultiTexCoord3iv +#define glMultiTexCoord3s __rglgen_glMultiTexCoord3s +#define glMultiTexCoord3sv __rglgen_glMultiTexCoord3sv +#define glMultiTexCoord4d __rglgen_glMultiTexCoord4d +#define glMultiTexCoord4dv __rglgen_glMultiTexCoord4dv +#define glMultiTexCoord4f __rglgen_glMultiTexCoord4f +#define glMultiTexCoord4fv __rglgen_glMultiTexCoord4fv +#define glMultiTexCoord4i __rglgen_glMultiTexCoord4i +#define glMultiTexCoord4iv __rglgen_glMultiTexCoord4iv +#define glMultiTexCoord4s __rglgen_glMultiTexCoord4s +#define glMultiTexCoord4sv __rglgen_glMultiTexCoord4sv +#define glLoadTransposeMatrixf __rglgen_glLoadTransposeMatrixf +#define glLoadTransposeMatrixd __rglgen_glLoadTransposeMatrixd +#define glMultTransposeMatrixf __rglgen_glMultTransposeMatrixf +#define glMultTransposeMatrixd __rglgen_glMultTransposeMatrixd +#define glBlendFuncSeparate __rglgen_glBlendFuncSeparate +#define glMultiDrawArrays __rglgen_glMultiDrawArrays +#define glMultiDrawElements __rglgen_glMultiDrawElements +#define glPointParameterf __rglgen_glPointParameterf +#define glPointParameterfv __rglgen_glPointParameterfv +#define glPointParameteri __rglgen_glPointParameteri +#define glPointParameteriv __rglgen_glPointParameteriv +#define glFogCoordf __rglgen_glFogCoordf +#define glFogCoordfv __rglgen_glFogCoordfv +#define glFogCoordd __rglgen_glFogCoordd +#define glFogCoorddv __rglgen_glFogCoorddv +#define glFogCoordPointer __rglgen_glFogCoordPointer +#define glSecondaryColor3b __rglgen_glSecondaryColor3b +#define glSecondaryColor3bv __rglgen_glSecondaryColor3bv +#define glSecondaryColor3d __rglgen_glSecondaryColor3d +#define glSecondaryColor3dv __rglgen_glSecondaryColor3dv +#define glSecondaryColor3f __rglgen_glSecondaryColor3f +#define glSecondaryColor3fv __rglgen_glSecondaryColor3fv +#define glSecondaryColor3i __rglgen_glSecondaryColor3i +#define glSecondaryColor3iv __rglgen_glSecondaryColor3iv +#define glSecondaryColor3s __rglgen_glSecondaryColor3s +#define glSecondaryColor3sv __rglgen_glSecondaryColor3sv +#define glSecondaryColor3ub __rglgen_glSecondaryColor3ub +#define glSecondaryColor3ubv __rglgen_glSecondaryColor3ubv +#define glSecondaryColor3ui __rglgen_glSecondaryColor3ui +#define glSecondaryColor3uiv __rglgen_glSecondaryColor3uiv +#define glSecondaryColor3us __rglgen_glSecondaryColor3us +#define glSecondaryColor3usv __rglgen_glSecondaryColor3usv +#define glSecondaryColorPointer __rglgen_glSecondaryColorPointer +#define glWindowPos2d __rglgen_glWindowPos2d +#define glWindowPos2dv __rglgen_glWindowPos2dv +#define glWindowPos2f __rglgen_glWindowPos2f +#define glWindowPos2fv __rglgen_glWindowPos2fv +#define glWindowPos2i __rglgen_glWindowPos2i +#define glWindowPos2iv __rglgen_glWindowPos2iv +#define glWindowPos2s __rglgen_glWindowPos2s +#define glWindowPos2sv __rglgen_glWindowPos2sv +#define glWindowPos3d __rglgen_glWindowPos3d +#define glWindowPos3dv __rglgen_glWindowPos3dv +#define glWindowPos3f __rglgen_glWindowPos3f +#define glWindowPos3fv __rglgen_glWindowPos3fv +#define glWindowPos3i __rglgen_glWindowPos3i +#define glWindowPos3iv __rglgen_glWindowPos3iv +#define glWindowPos3s __rglgen_glWindowPos3s +#define glWindowPos3sv __rglgen_glWindowPos3sv +#define glBlendColor __rglgen_glBlendColor +#define glBlendEquation __rglgen_glBlendEquation +#define glGenQueries __rglgen_glGenQueries +#define glDeleteQueries __rglgen_glDeleteQueries +#define glIsQuery __rglgen_glIsQuery +#define glBeginQuery __rglgen_glBeginQuery +#define glEndQuery __rglgen_glEndQuery +#define glGetQueryiv __rglgen_glGetQueryiv +#define glGetQueryObjectiv __rglgen_glGetQueryObjectiv +#define glGetQueryObjectuiv __rglgen_glGetQueryObjectuiv +#define glBindBuffer __rglgen_glBindBuffer +#define glDeleteBuffers __rglgen_glDeleteBuffers +#define glGenBuffers __rglgen_glGenBuffers +#define glIsBuffer __rglgen_glIsBuffer +#define glBufferData __rglgen_glBufferData +#define glBufferSubData __rglgen_glBufferSubData +#define glGetBufferSubData __rglgen_glGetBufferSubData +#define glMapBuffer __rglgen_glMapBuffer +#define glUnmapBuffer __rglgen_glUnmapBuffer +#define glGetBufferParameteriv __rglgen_glGetBufferParameteriv +#define glGetBufferPointerv __rglgen_glGetBufferPointerv +#define glBlendEquationSeparate __rglgen_glBlendEquationSeparate +#define glDrawBuffers __rglgen_glDrawBuffers +#define glStencilOpSeparate __rglgen_glStencilOpSeparate +#define glStencilFuncSeparate __rglgen_glStencilFuncSeparate +#define glStencilMaskSeparate __rglgen_glStencilMaskSeparate +#define glAttachShader __rglgen_glAttachShader +#define glBindAttribLocation __rglgen_glBindAttribLocation +#define glCompileShader __rglgen_glCompileShader +#define glCreateProgram __rglgen_glCreateProgram +#define glCreateShader __rglgen_glCreateShader +#define glDeleteProgram __rglgen_glDeleteProgram +#define glDeleteShader __rglgen_glDeleteShader +#define glDetachShader __rglgen_glDetachShader +#define glDisableVertexAttribArray __rglgen_glDisableVertexAttribArray +#define glEnableVertexAttribArray __rglgen_glEnableVertexAttribArray +#define glGetActiveAttrib __rglgen_glGetActiveAttrib +#define glGetActiveUniform __rglgen_glGetActiveUniform +#define glGetAttachedShaders __rglgen_glGetAttachedShaders +#define glGetAttribLocation __rglgen_glGetAttribLocation +#define glGetProgramiv __rglgen_glGetProgramiv +#define glGetProgramInfoLog __rglgen_glGetProgramInfoLog +#define glGetShaderiv __rglgen_glGetShaderiv +#define glGetShaderInfoLog __rglgen_glGetShaderInfoLog +#define glGetShaderSource __rglgen_glGetShaderSource +#define glGetUniformLocation __rglgen_glGetUniformLocation +#define glGetUniformfv __rglgen_glGetUniformfv +#define glGetUniformiv __rglgen_glGetUniformiv +#define glGetVertexAttribdv __rglgen_glGetVertexAttribdv +#define glGetVertexAttribfv __rglgen_glGetVertexAttribfv +#define glGetVertexAttribiv __rglgen_glGetVertexAttribiv +#define glGetVertexAttribPointerv __rglgen_glGetVertexAttribPointerv +#define glIsProgram __rglgen_glIsProgram +#define glIsShader __rglgen_glIsShader +#define glLinkProgram __rglgen_glLinkProgram +#define glShaderSource __rglgen_glShaderSource +#define glUseProgram __rglgen_glUseProgram +#define glUniform1f __rglgen_glUniform1f +#define glUniform2f __rglgen_glUniform2f +#define glUniform3f __rglgen_glUniform3f +#define glUniform4f __rglgen_glUniform4f +#define glUniform1i __rglgen_glUniform1i +#define glUniform2i __rglgen_glUniform2i +#define glUniform3i __rglgen_glUniform3i +#define glUniform4i __rglgen_glUniform4i +#define glUniform1fv __rglgen_glUniform1fv +#define glUniform2fv __rglgen_glUniform2fv +#define glUniform3fv __rglgen_glUniform3fv +#define glUniform4fv __rglgen_glUniform4fv +#define glUniform1iv __rglgen_glUniform1iv +#define glUniform2iv __rglgen_glUniform2iv +#define glUniform3iv __rglgen_glUniform3iv +#define glUniform4iv __rglgen_glUniform4iv +#define glUniformMatrix2fv __rglgen_glUniformMatrix2fv +#define glUniformMatrix3fv __rglgen_glUniformMatrix3fv +#define glUniformMatrix4fv __rglgen_glUniformMatrix4fv +#define glValidateProgram __rglgen_glValidateProgram +#define glVertexAttrib1d __rglgen_glVertexAttrib1d +#define glVertexAttrib1dv __rglgen_glVertexAttrib1dv +#define glVertexAttrib1f __rglgen_glVertexAttrib1f +#define glVertexAttrib1fv __rglgen_glVertexAttrib1fv +#define glVertexAttrib1s __rglgen_glVertexAttrib1s +#define glVertexAttrib1sv __rglgen_glVertexAttrib1sv +#define glVertexAttrib2d __rglgen_glVertexAttrib2d +#define glVertexAttrib2dv __rglgen_glVertexAttrib2dv +#define glVertexAttrib2f __rglgen_glVertexAttrib2f +#define glVertexAttrib2fv __rglgen_glVertexAttrib2fv +#define glVertexAttrib2s __rglgen_glVertexAttrib2s +#define glVertexAttrib2sv __rglgen_glVertexAttrib2sv +#define glVertexAttrib3d __rglgen_glVertexAttrib3d +#define glVertexAttrib3dv __rglgen_glVertexAttrib3dv +#define glVertexAttrib3f __rglgen_glVertexAttrib3f +#define glVertexAttrib3fv __rglgen_glVertexAttrib3fv +#define glVertexAttrib3s __rglgen_glVertexAttrib3s +#define glVertexAttrib3sv __rglgen_glVertexAttrib3sv +#define glVertexAttrib4Nbv __rglgen_glVertexAttrib4Nbv +#define glVertexAttrib4Niv __rglgen_glVertexAttrib4Niv +#define glVertexAttrib4Nsv __rglgen_glVertexAttrib4Nsv +#define glVertexAttrib4Nub __rglgen_glVertexAttrib4Nub +#define glVertexAttrib4Nubv __rglgen_glVertexAttrib4Nubv +#define glVertexAttrib4Nuiv __rglgen_glVertexAttrib4Nuiv +#define glVertexAttrib4Nusv __rglgen_glVertexAttrib4Nusv +#define glVertexAttrib4bv __rglgen_glVertexAttrib4bv +#define glVertexAttrib4d __rglgen_glVertexAttrib4d +#define glVertexAttrib4dv __rglgen_glVertexAttrib4dv +#define glVertexAttrib4f __rglgen_glVertexAttrib4f +#define glVertexAttrib4fv __rglgen_glVertexAttrib4fv +#define glVertexAttrib4iv __rglgen_glVertexAttrib4iv +#define glVertexAttrib4s __rglgen_glVertexAttrib4s +#define glVertexAttrib4sv __rglgen_glVertexAttrib4sv +#define glVertexAttrib4ubv __rglgen_glVertexAttrib4ubv +#define glVertexAttrib4uiv __rglgen_glVertexAttrib4uiv +#define glVertexAttrib4usv __rglgen_glVertexAttrib4usv +#define glVertexAttribPointer __rglgen_glVertexAttribPointer +#define glUniformMatrix2x3fv __rglgen_glUniformMatrix2x3fv +#define glUniformMatrix3x2fv __rglgen_glUniformMatrix3x2fv +#define glUniformMatrix2x4fv __rglgen_glUniformMatrix2x4fv +#define glUniformMatrix4x2fv __rglgen_glUniformMatrix4x2fv +#define glUniformMatrix3x4fv __rglgen_glUniformMatrix3x4fv +#define glUniformMatrix4x3fv __rglgen_glUniformMatrix4x3fv +#define glColorMaski __rglgen_glColorMaski +#define glGetBooleani_v __rglgen_glGetBooleani_v +#define glGetIntegeri_v __rglgen_glGetIntegeri_v +#define glEnablei __rglgen_glEnablei +#define glDisablei __rglgen_glDisablei +#define glIsEnabledi __rglgen_glIsEnabledi +#define glBeginTransformFeedback __rglgen_glBeginTransformFeedback +#define glEndTransformFeedback __rglgen_glEndTransformFeedback +#define glBindBufferRange __rglgen_glBindBufferRange +#define glBindBufferBase __rglgen_glBindBufferBase +#define glTransformFeedbackVaryings __rglgen_glTransformFeedbackVaryings +#define glGetTransformFeedbackVarying __rglgen_glGetTransformFeedbackVarying +#define glClampColor __rglgen_glClampColor +#define glBeginConditionalRender __rglgen_glBeginConditionalRender +#define glEndConditionalRender __rglgen_glEndConditionalRender +#define glVertexAttribIPointer __rglgen_glVertexAttribIPointer +#define glGetVertexAttribIiv __rglgen_glGetVertexAttribIiv +#define glGetVertexAttribIuiv __rglgen_glGetVertexAttribIuiv +#define glVertexAttribI1i __rglgen_glVertexAttribI1i +#define glVertexAttribI2i __rglgen_glVertexAttribI2i +#define glVertexAttribI3i __rglgen_glVertexAttribI3i +#define glVertexAttribI4i __rglgen_glVertexAttribI4i +#define glVertexAttribI1ui __rglgen_glVertexAttribI1ui +#define glVertexAttribI2ui __rglgen_glVertexAttribI2ui +#define glVertexAttribI3ui __rglgen_glVertexAttribI3ui +#define glVertexAttribI4ui __rglgen_glVertexAttribI4ui +#define glVertexAttribI1iv __rglgen_glVertexAttribI1iv +#define glVertexAttribI2iv __rglgen_glVertexAttribI2iv +#define glVertexAttribI3iv __rglgen_glVertexAttribI3iv +#define glVertexAttribI4iv __rglgen_glVertexAttribI4iv +#define glVertexAttribI1uiv __rglgen_glVertexAttribI1uiv +#define glVertexAttribI2uiv __rglgen_glVertexAttribI2uiv +#define glVertexAttribI3uiv __rglgen_glVertexAttribI3uiv +#define glVertexAttribI4uiv __rglgen_glVertexAttribI4uiv +#define glVertexAttribI4bv __rglgen_glVertexAttribI4bv +#define glVertexAttribI4sv __rglgen_glVertexAttribI4sv +#define glVertexAttribI4ubv __rglgen_glVertexAttribI4ubv +#define glVertexAttribI4usv __rglgen_glVertexAttribI4usv +#define glGetUniformuiv __rglgen_glGetUniformuiv +#define glBindFragDataLocation __rglgen_glBindFragDataLocation +#define glGetFragDataLocation __rglgen_glGetFragDataLocation +#define glUniform1ui __rglgen_glUniform1ui +#define glUniform2ui __rglgen_glUniform2ui +#define glUniform3ui __rglgen_glUniform3ui +#define glUniform4ui __rglgen_glUniform4ui +#define glUniform1uiv __rglgen_glUniform1uiv +#define glUniform2uiv __rglgen_glUniform2uiv +#define glUniform3uiv __rglgen_glUniform3uiv +#define glUniform4uiv __rglgen_glUniform4uiv +#define glTexParameterIiv __rglgen_glTexParameterIiv +#define glTexParameterIuiv __rglgen_glTexParameterIuiv +#define glGetTexParameterIiv __rglgen_glGetTexParameterIiv +#define glGetTexParameterIuiv __rglgen_glGetTexParameterIuiv +#define glClearBufferiv __rglgen_glClearBufferiv +#define glClearBufferuiv __rglgen_glClearBufferuiv +#define glClearBufferfv __rglgen_glClearBufferfv +#define glClearBufferfi __rglgen_glClearBufferfi +#define glGetStringi __rglgen_glGetStringi +#define glIsRenderbuffer __rglgen_glIsRenderbuffer +#define glBindRenderbuffer __rglgen_glBindRenderbuffer +#define glDeleteRenderbuffers __rglgen_glDeleteRenderbuffers +#define glGenRenderbuffers __rglgen_glGenRenderbuffers +#define glRenderbufferStorage __rglgen_glRenderbufferStorage +#define glGetRenderbufferParameteriv __rglgen_glGetRenderbufferParameteriv +#define glIsFramebuffer __rglgen_glIsFramebuffer +#define glBindFramebuffer __rglgen_glBindFramebuffer +#define glDeleteFramebuffers __rglgen_glDeleteFramebuffers +#define glGenFramebuffers __rglgen_glGenFramebuffers +#define glCheckFramebufferStatus __rglgen_glCheckFramebufferStatus +#define glFramebufferTexture1D __rglgen_glFramebufferTexture1D +#define glFramebufferTexture2D __rglgen_glFramebufferTexture2D +#define glFramebufferTexture3D __rglgen_glFramebufferTexture3D +#define glFramebufferRenderbuffer __rglgen_glFramebufferRenderbuffer +#define glGetFramebufferAttachmentParameteriv __rglgen_glGetFramebufferAttachmentParameteriv +#define glGenerateMipmap __rglgen_glGenerateMipmap +#define glBlitFramebuffer __rglgen_glBlitFramebuffer +#define glRenderbufferStorageMultisample __rglgen_glRenderbufferStorageMultisample +#define glFramebufferTextureLayer __rglgen_glFramebufferTextureLayer +#define glMapBufferRange __rglgen_glMapBufferRange +#define glFlushMappedBufferRange __rglgen_glFlushMappedBufferRange +#define glBindVertexArray __rglgen_glBindVertexArray +#define glDeleteVertexArrays __rglgen_glDeleteVertexArrays +#define glGenVertexArrays __rglgen_glGenVertexArrays +#define glIsVertexArray __rglgen_glIsVertexArray +#define glDrawArraysInstanced __rglgen_glDrawArraysInstanced +#define glDrawElementsInstanced __rglgen_glDrawElementsInstanced +#define glTexBuffer __rglgen_glTexBuffer +#define glPrimitiveRestartIndex __rglgen_glPrimitiveRestartIndex +#define glCopyBufferSubData __rglgen_glCopyBufferSubData +#define glGetUniformIndices __rglgen_glGetUniformIndices +#define glGetActiveUniformsiv __rglgen_glGetActiveUniformsiv +#define glGetActiveUniformName __rglgen_glGetActiveUniformName +#define glGetUniformBlockIndex __rglgen_glGetUniformBlockIndex +#define glGetActiveUniformBlockiv __rglgen_glGetActiveUniformBlockiv +#define glGetActiveUniformBlockName __rglgen_glGetActiveUniformBlockName +#define glUniformBlockBinding __rglgen_glUniformBlockBinding +#define glDrawElementsBaseVertex __rglgen_glDrawElementsBaseVertex +#define glDrawRangeElementsBaseVertex __rglgen_glDrawRangeElementsBaseVertex +#define glDrawElementsInstancedBaseVertex __rglgen_glDrawElementsInstancedBaseVertex +#define glMultiDrawElementsBaseVertex __rglgen_glMultiDrawElementsBaseVertex +#define glProvokingVertex __rglgen_glProvokingVertex +#define glFenceSync __rglgen_glFenceSync +#define glIsSync __rglgen_glIsSync +#define glDeleteSync __rglgen_glDeleteSync +#define glClientWaitSync __rglgen_glClientWaitSync +#define glWaitSync __rglgen_glWaitSync +#define glGetInteger64v __rglgen_glGetInteger64v +#define glGetSynciv __rglgen_glGetSynciv +#define glGetInteger64i_v __rglgen_glGetInteger64i_v +#define glGetBufferParameteri64v __rglgen_glGetBufferParameteri64v +#define glFramebufferTexture __rglgen_glFramebufferTexture +#define glTexImage2DMultisample __rglgen_glTexImage2DMultisample +#define glTexImage3DMultisample __rglgen_glTexImage3DMultisample +#define glGetMultisamplefv __rglgen_glGetMultisamplefv +#define glSampleMaski __rglgen_glSampleMaski +#define glBindFragDataLocationIndexed __rglgen_glBindFragDataLocationIndexed +#define glGetFragDataIndex __rglgen_glGetFragDataIndex +#define glGenSamplers __rglgen_glGenSamplers +#define glDeleteSamplers __rglgen_glDeleteSamplers +#define glIsSampler __rglgen_glIsSampler +#define glBindSampler __rglgen_glBindSampler +#define glSamplerParameteri __rglgen_glSamplerParameteri +#define glSamplerParameteriv __rglgen_glSamplerParameteriv +#define glSamplerParameterf __rglgen_glSamplerParameterf +#define glSamplerParameterfv __rglgen_glSamplerParameterfv +#define glSamplerParameterIiv __rglgen_glSamplerParameterIiv +#define glSamplerParameterIuiv __rglgen_glSamplerParameterIuiv +#define glGetSamplerParameteriv __rglgen_glGetSamplerParameteriv +#define glGetSamplerParameterIiv __rglgen_glGetSamplerParameterIiv +#define glGetSamplerParameterfv __rglgen_glGetSamplerParameterfv +#define glGetSamplerParameterIuiv __rglgen_glGetSamplerParameterIuiv +#define glQueryCounter __rglgen_glQueryCounter +#define glGetQueryObjecti64v __rglgen_glGetQueryObjecti64v +#define glGetQueryObjectui64v __rglgen_glGetQueryObjectui64v +#define glVertexAttribDivisor __rglgen_glVertexAttribDivisor +#define glVertexAttribP1ui __rglgen_glVertexAttribP1ui +#define glVertexAttribP1uiv __rglgen_glVertexAttribP1uiv +#define glVertexAttribP2ui __rglgen_glVertexAttribP2ui +#define glVertexAttribP2uiv __rglgen_glVertexAttribP2uiv +#define glVertexAttribP3ui __rglgen_glVertexAttribP3ui +#define glVertexAttribP3uiv __rglgen_glVertexAttribP3uiv +#define glVertexAttribP4ui __rglgen_glVertexAttribP4ui +#define glVertexAttribP4uiv __rglgen_glVertexAttribP4uiv +#define glVertexP2ui __rglgen_glVertexP2ui +#define glVertexP2uiv __rglgen_glVertexP2uiv +#define glVertexP3ui __rglgen_glVertexP3ui +#define glVertexP3uiv __rglgen_glVertexP3uiv +#define glVertexP4ui __rglgen_glVertexP4ui +#define glVertexP4uiv __rglgen_glVertexP4uiv +#define glTexCoordP1ui __rglgen_glTexCoordP1ui +#define glTexCoordP1uiv __rglgen_glTexCoordP1uiv +#define glTexCoordP2ui __rglgen_glTexCoordP2ui +#define glTexCoordP2uiv __rglgen_glTexCoordP2uiv +#define glTexCoordP3ui __rglgen_glTexCoordP3ui +#define glTexCoordP3uiv __rglgen_glTexCoordP3uiv +#define glTexCoordP4ui __rglgen_glTexCoordP4ui +#define glTexCoordP4uiv __rglgen_glTexCoordP4uiv +#define glMultiTexCoordP1ui __rglgen_glMultiTexCoordP1ui +#define glMultiTexCoordP1uiv __rglgen_glMultiTexCoordP1uiv +#define glMultiTexCoordP2ui __rglgen_glMultiTexCoordP2ui +#define glMultiTexCoordP2uiv __rglgen_glMultiTexCoordP2uiv +#define glMultiTexCoordP3ui __rglgen_glMultiTexCoordP3ui +#define glMultiTexCoordP3uiv __rglgen_glMultiTexCoordP3uiv +#define glMultiTexCoordP4ui __rglgen_glMultiTexCoordP4ui +#define glMultiTexCoordP4uiv __rglgen_glMultiTexCoordP4uiv +#define glNormalP3ui __rglgen_glNormalP3ui +#define glNormalP3uiv __rglgen_glNormalP3uiv +#define glColorP3ui __rglgen_glColorP3ui +#define glColorP3uiv __rglgen_glColorP3uiv +#define glColorP4ui __rglgen_glColorP4ui +#define glColorP4uiv __rglgen_glColorP4uiv +#define glSecondaryColorP3ui __rglgen_glSecondaryColorP3ui +#define glSecondaryColorP3uiv __rglgen_glSecondaryColorP3uiv +#define glMinSampleShading __rglgen_glMinSampleShading +#define glBlendEquationi __rglgen_glBlendEquationi +#define glBlendEquationSeparatei __rglgen_glBlendEquationSeparatei +#define glBlendFunci __rglgen_glBlendFunci +#define glBlendFuncSeparatei __rglgen_glBlendFuncSeparatei +#define glDrawArraysIndirect __rglgen_glDrawArraysIndirect +#define glDrawElementsIndirect __rglgen_glDrawElementsIndirect +#define glUniform1d __rglgen_glUniform1d +#define glUniform2d __rglgen_glUniform2d +#define glUniform3d __rglgen_glUniform3d +#define glUniform4d __rglgen_glUniform4d +#define glUniform1dv __rglgen_glUniform1dv +#define glUniform2dv __rglgen_glUniform2dv +#define glUniform3dv __rglgen_glUniform3dv +#define glUniform4dv __rglgen_glUniform4dv +#define glUniformMatrix2dv __rglgen_glUniformMatrix2dv +#define glUniformMatrix3dv __rglgen_glUniformMatrix3dv +#define glUniformMatrix4dv __rglgen_glUniformMatrix4dv +#define glUniformMatrix2x3dv __rglgen_glUniformMatrix2x3dv +#define glUniformMatrix2x4dv __rglgen_glUniformMatrix2x4dv +#define glUniformMatrix3x2dv __rglgen_glUniformMatrix3x2dv +#define glUniformMatrix3x4dv __rglgen_glUniformMatrix3x4dv +#define glUniformMatrix4x2dv __rglgen_glUniformMatrix4x2dv +#define glUniformMatrix4x3dv __rglgen_glUniformMatrix4x3dv +#define glGetUniformdv __rglgen_glGetUniformdv +#define glGetSubroutineUniformLocation __rglgen_glGetSubroutineUniformLocation +#define glGetSubroutineIndex __rglgen_glGetSubroutineIndex +#define glGetActiveSubroutineUniformiv __rglgen_glGetActiveSubroutineUniformiv +#define glGetActiveSubroutineUniformName __rglgen_glGetActiveSubroutineUniformName +#define glGetActiveSubroutineName __rglgen_glGetActiveSubroutineName +#define glUniformSubroutinesuiv __rglgen_glUniformSubroutinesuiv +#define glGetUniformSubroutineuiv __rglgen_glGetUniformSubroutineuiv +#define glGetProgramStageiv __rglgen_glGetProgramStageiv +#define glPatchParameteri __rglgen_glPatchParameteri +#define glPatchParameterfv __rglgen_glPatchParameterfv +#define glBindTransformFeedback __rglgen_glBindTransformFeedback +#define glDeleteTransformFeedbacks __rglgen_glDeleteTransformFeedbacks +#define glGenTransformFeedbacks __rglgen_glGenTransformFeedbacks +#define glIsTransformFeedback __rglgen_glIsTransformFeedback +#define glPauseTransformFeedback __rglgen_glPauseTransformFeedback +#define glResumeTransformFeedback __rglgen_glResumeTransformFeedback +#define glDrawTransformFeedback __rglgen_glDrawTransformFeedback +#define glDrawTransformFeedbackStream __rglgen_glDrawTransformFeedbackStream +#define glBeginQueryIndexed __rglgen_glBeginQueryIndexed +#define glEndQueryIndexed __rglgen_glEndQueryIndexed +#define glGetQueryIndexediv __rglgen_glGetQueryIndexediv +#define glReleaseShaderCompiler __rglgen_glReleaseShaderCompiler +#define glShaderBinary __rglgen_glShaderBinary +#define glGetShaderPrecisionFormat __rglgen_glGetShaderPrecisionFormat +#define glDepthRangef __rglgen_glDepthRangef +#define glClearDepthf __rglgen_glClearDepthf +#define glGetProgramBinary __rglgen_glGetProgramBinary +#define glProgramBinary __rglgen_glProgramBinary +#define glProgramParameteri __rglgen_glProgramParameteri +#define glUseProgramStages __rglgen_glUseProgramStages +#define glActiveShaderProgram __rglgen_glActiveShaderProgram +#define glCreateShaderProgramv __rglgen_glCreateShaderProgramv +#define glBindProgramPipeline __rglgen_glBindProgramPipeline +#define glDeleteProgramPipelines __rglgen_glDeleteProgramPipelines +#define glGenProgramPipelines __rglgen_glGenProgramPipelines +#define glIsProgramPipeline __rglgen_glIsProgramPipeline +#define glGetProgramPipelineiv __rglgen_glGetProgramPipelineiv +#define glProgramUniform1i __rglgen_glProgramUniform1i +#define glProgramUniform1iv __rglgen_glProgramUniform1iv +#define glProgramUniform1f __rglgen_glProgramUniform1f +#define glProgramUniform1fv __rglgen_glProgramUniform1fv +#define glProgramUniform1d __rglgen_glProgramUniform1d +#define glProgramUniform1dv __rglgen_glProgramUniform1dv +#define glProgramUniform1ui __rglgen_glProgramUniform1ui +#define glProgramUniform1uiv __rglgen_glProgramUniform1uiv +#define glProgramUniform2i __rglgen_glProgramUniform2i +#define glProgramUniform2iv __rglgen_glProgramUniform2iv +#define glProgramUniform2f __rglgen_glProgramUniform2f +#define glProgramUniform2fv __rglgen_glProgramUniform2fv +#define glProgramUniform2d __rglgen_glProgramUniform2d +#define glProgramUniform2dv __rglgen_glProgramUniform2dv +#define glProgramUniform2ui __rglgen_glProgramUniform2ui +#define glProgramUniform2uiv __rglgen_glProgramUniform2uiv +#define glProgramUniform3i __rglgen_glProgramUniform3i +#define glProgramUniform3iv __rglgen_glProgramUniform3iv +#define glProgramUniform3f __rglgen_glProgramUniform3f +#define glProgramUniform3fv __rglgen_glProgramUniform3fv +#define glProgramUniform3d __rglgen_glProgramUniform3d +#define glProgramUniform3dv __rglgen_glProgramUniform3dv +#define glProgramUniform3ui __rglgen_glProgramUniform3ui +#define glProgramUniform3uiv __rglgen_glProgramUniform3uiv +#define glProgramUniform4i __rglgen_glProgramUniform4i +#define glProgramUniform4iv __rglgen_glProgramUniform4iv +#define glProgramUniform4f __rglgen_glProgramUniform4f +#define glProgramUniform4fv __rglgen_glProgramUniform4fv +#define glProgramUniform4d __rglgen_glProgramUniform4d +#define glProgramUniform4dv __rglgen_glProgramUniform4dv +#define glProgramUniform4ui __rglgen_glProgramUniform4ui +#define glProgramUniform4uiv __rglgen_glProgramUniform4uiv +#define glProgramUniformMatrix2fv __rglgen_glProgramUniformMatrix2fv +#define glProgramUniformMatrix3fv __rglgen_glProgramUniformMatrix3fv +#define glProgramUniformMatrix4fv __rglgen_glProgramUniformMatrix4fv +#define glProgramUniformMatrix2dv __rglgen_glProgramUniformMatrix2dv +#define glProgramUniformMatrix3dv __rglgen_glProgramUniformMatrix3dv +#define glProgramUniformMatrix4dv __rglgen_glProgramUniformMatrix4dv +#define glProgramUniformMatrix2x3fv __rglgen_glProgramUniformMatrix2x3fv +#define glProgramUniformMatrix3x2fv __rglgen_glProgramUniformMatrix3x2fv +#define glProgramUniformMatrix2x4fv __rglgen_glProgramUniformMatrix2x4fv +#define glProgramUniformMatrix4x2fv __rglgen_glProgramUniformMatrix4x2fv +#define glProgramUniformMatrix3x4fv __rglgen_glProgramUniformMatrix3x4fv +#define glProgramUniformMatrix4x3fv __rglgen_glProgramUniformMatrix4x3fv +#define glProgramUniformMatrix2x3dv __rglgen_glProgramUniformMatrix2x3dv +#define glProgramUniformMatrix3x2dv __rglgen_glProgramUniformMatrix3x2dv +#define glProgramUniformMatrix2x4dv __rglgen_glProgramUniformMatrix2x4dv +#define glProgramUniformMatrix4x2dv __rglgen_glProgramUniformMatrix4x2dv +#define glProgramUniformMatrix3x4dv __rglgen_glProgramUniformMatrix3x4dv +#define glProgramUniformMatrix4x3dv __rglgen_glProgramUniformMatrix4x3dv +#define glValidateProgramPipeline __rglgen_glValidateProgramPipeline +#define glGetProgramPipelineInfoLog __rglgen_glGetProgramPipelineInfoLog +#define glVertexAttribL1d __rglgen_glVertexAttribL1d +#define glVertexAttribL2d __rglgen_glVertexAttribL2d +#define glVertexAttribL3d __rglgen_glVertexAttribL3d +#define glVertexAttribL4d __rglgen_glVertexAttribL4d +#define glVertexAttribL1dv __rglgen_glVertexAttribL1dv +#define glVertexAttribL2dv __rglgen_glVertexAttribL2dv +#define glVertexAttribL3dv __rglgen_glVertexAttribL3dv +#define glVertexAttribL4dv __rglgen_glVertexAttribL4dv +#define glVertexAttribLPointer __rglgen_glVertexAttribLPointer +#define glGetVertexAttribLdv __rglgen_glGetVertexAttribLdv +#define glViewportArrayv __rglgen_glViewportArrayv +#define glViewportIndexedf __rglgen_glViewportIndexedf +#define glViewportIndexedfv __rglgen_glViewportIndexedfv +#define glScissorArrayv __rglgen_glScissorArrayv +#define glScissorIndexed __rglgen_glScissorIndexed +#define glScissorIndexedv __rglgen_glScissorIndexedv +#define glDepthRangeArrayv __rglgen_glDepthRangeArrayv +#define glDepthRangeIndexed __rglgen_glDepthRangeIndexed +#define glGetFloati_v __rglgen_glGetFloati_v +#define glGetDoublei_v __rglgen_glGetDoublei_v +#define glDrawArraysInstancedBaseInstance __rglgen_glDrawArraysInstancedBaseInstance +#define glDrawElementsInstancedBaseInstance __rglgen_glDrawElementsInstancedBaseInstance +#define glDrawElementsInstancedBaseVertexBaseInstance __rglgen_glDrawElementsInstancedBaseVertexBaseInstance +#define glGetInternalformativ __rglgen_glGetInternalformativ +#define glGetActiveAtomicCounterBufferiv __rglgen_glGetActiveAtomicCounterBufferiv +#define glBindImageTexture __rglgen_glBindImageTexture +#define glMemoryBarrier __rglgen_glMemoryBarrier +#define glTexStorage1D __rglgen_glTexStorage1D +#define glTexStorage2D __rglgen_glTexStorage2D +#define glTexStorage3D __rglgen_glTexStorage3D +#define glDrawTransformFeedbackInstanced __rglgen_glDrawTransformFeedbackInstanced +#define glDrawTransformFeedbackStreamInstanced __rglgen_glDrawTransformFeedbackStreamInstanced +#define glClearBufferData __rglgen_glClearBufferData +#define glClearBufferSubData __rglgen_glClearBufferSubData +#define glDispatchCompute __rglgen_glDispatchCompute +#define glDispatchComputeIndirect __rglgen_glDispatchComputeIndirect +#define glCopyImageSubData __rglgen_glCopyImageSubData +#define glFramebufferParameteri __rglgen_glFramebufferParameteri +#define glGetFramebufferParameteriv __rglgen_glGetFramebufferParameteriv +#define glGetInternalformati64v __rglgen_glGetInternalformati64v +#define glInvalidateTexSubImage __rglgen_glInvalidateTexSubImage +#define glInvalidateTexImage __rglgen_glInvalidateTexImage +#define glInvalidateBufferSubData __rglgen_glInvalidateBufferSubData +#define glInvalidateBufferData __rglgen_glInvalidateBufferData +#define glInvalidateFramebuffer __rglgen_glInvalidateFramebuffer +#define glInvalidateSubFramebuffer __rglgen_glInvalidateSubFramebuffer +#define glMultiDrawArraysIndirect __rglgen_glMultiDrawArraysIndirect +#define glMultiDrawElementsIndirect __rglgen_glMultiDrawElementsIndirect +#define glGetProgramInterfaceiv __rglgen_glGetProgramInterfaceiv +#define glGetProgramResourceIndex __rglgen_glGetProgramResourceIndex +#define glGetProgramResourceName __rglgen_glGetProgramResourceName +#define glGetProgramResourceiv __rglgen_glGetProgramResourceiv +#define glGetProgramResourceLocation __rglgen_glGetProgramResourceLocation +#define glGetProgramResourceLocationIndex __rglgen_glGetProgramResourceLocationIndex +#define glShaderStorageBlockBinding __rglgen_glShaderStorageBlockBinding +#define glTexBufferRange __rglgen_glTexBufferRange +#define glTexStorage2DMultisample __rglgen_glTexStorage2DMultisample +#define glTexStorage3DMultisample __rglgen_glTexStorage3DMultisample +#define glTextureView __rglgen_glTextureView +#define glBindVertexBuffer __rglgen_glBindVertexBuffer +#define glVertexAttribFormat __rglgen_glVertexAttribFormat +#define glVertexAttribIFormat __rglgen_glVertexAttribIFormat +#define glVertexAttribLFormat __rglgen_glVertexAttribLFormat +#define glVertexAttribBinding __rglgen_glVertexAttribBinding +#define glVertexBindingDivisor __rglgen_glVertexBindingDivisor +#define glDebugMessageControl __rglgen_glDebugMessageControl +#define glDebugMessageInsert __rglgen_glDebugMessageInsert +#define glDebugMessageCallback __rglgen_glDebugMessageCallback +#define glGetDebugMessageLog __rglgen_glGetDebugMessageLog +#define glPushDebugGroup __rglgen_glPushDebugGroup +#define glPopDebugGroup __rglgen_glPopDebugGroup +#define glObjectLabel __rglgen_glObjectLabel +#define glGetObjectLabel __rglgen_glGetObjectLabel +#define glObjectPtrLabel __rglgen_glObjectPtrLabel +#define glGetObjectPtrLabel __rglgen_glGetObjectPtrLabel +#define glBufferStorage __rglgen_glBufferStorage +#define glClearTexImage __rglgen_glClearTexImage +#define glClearTexSubImage __rglgen_glClearTexSubImage +#define glBindBuffersBase __rglgen_glBindBuffersBase +#define glBindBuffersRange __rglgen_glBindBuffersRange +#define glBindTextures __rglgen_glBindTextures +#define glBindSamplers __rglgen_glBindSamplers +#define glBindImageTextures __rglgen_glBindImageTextures +#define glBindVertexBuffers __rglgen_glBindVertexBuffers +#define glGetTextureHandleARB __rglgen_glGetTextureHandleARB +#define glGetTextureSamplerHandleARB __rglgen_glGetTextureSamplerHandleARB +#define glMakeTextureHandleResidentARB __rglgen_glMakeTextureHandleResidentARB +#define glMakeTextureHandleNonResidentARB __rglgen_glMakeTextureHandleNonResidentARB +#define glGetImageHandleARB __rglgen_glGetImageHandleARB +#define glMakeImageHandleResidentARB __rglgen_glMakeImageHandleResidentARB +#define glMakeImageHandleNonResidentARB __rglgen_glMakeImageHandleNonResidentARB +#define glUniformHandleui64ARB __rglgen_glUniformHandleui64ARB +#define glUniformHandleui64vARB __rglgen_glUniformHandleui64vARB +#define glProgramUniformHandleui64ARB __rglgen_glProgramUniformHandleui64ARB +#define glProgramUniformHandleui64vARB __rglgen_glProgramUniformHandleui64vARB +#define glIsTextureHandleResidentARB __rglgen_glIsTextureHandleResidentARB +#define glIsImageHandleResidentARB __rglgen_glIsImageHandleResidentARB +#define glVertexAttribL1ui64ARB __rglgen_glVertexAttribL1ui64ARB +#define glVertexAttribL1ui64vARB __rglgen_glVertexAttribL1ui64vARB +#define glGetVertexAttribLui64vARB __rglgen_glGetVertexAttribLui64vARB +#define glCreateSyncFromCLeventARB __rglgen_glCreateSyncFromCLeventARB +#define glClampColorARB __rglgen_glClampColorARB +#define glDispatchComputeGroupSizeARB __rglgen_glDispatchComputeGroupSizeARB +#define glDebugMessageControlARB __rglgen_glDebugMessageControlARB +#define glDebugMessageInsertARB __rglgen_glDebugMessageInsertARB +#define glDebugMessageCallbackARB __rglgen_glDebugMessageCallbackARB +#define glGetDebugMessageLogARB __rglgen_glGetDebugMessageLogARB +#define glDrawBuffersARB __rglgen_glDrawBuffersARB +#define glBlendEquationiARB __rglgen_glBlendEquationiARB +#define glBlendEquationSeparateiARB __rglgen_glBlendEquationSeparateiARB +#define glBlendFunciARB __rglgen_glBlendFunciARB +#define glBlendFuncSeparateiARB __rglgen_glBlendFuncSeparateiARB +#define glDrawArraysInstancedARB __rglgen_glDrawArraysInstancedARB +#define glDrawElementsInstancedARB __rglgen_glDrawElementsInstancedARB +#define glProgramStringARB __rglgen_glProgramStringARB +#define glBindProgramARB __rglgen_glBindProgramARB +#define glDeleteProgramsARB __rglgen_glDeleteProgramsARB +#define glGenProgramsARB __rglgen_glGenProgramsARB +#define glProgramEnvParameter4dARB __rglgen_glProgramEnvParameter4dARB +#define glProgramEnvParameter4dvARB __rglgen_glProgramEnvParameter4dvARB +#define glProgramEnvParameter4fARB __rglgen_glProgramEnvParameter4fARB +#define glProgramEnvParameter4fvARB __rglgen_glProgramEnvParameter4fvARB +#define glProgramLocalParameter4dARB __rglgen_glProgramLocalParameter4dARB +#define glProgramLocalParameter4dvARB __rglgen_glProgramLocalParameter4dvARB +#define glProgramLocalParameter4fARB __rglgen_glProgramLocalParameter4fARB +#define glProgramLocalParameter4fvARB __rglgen_glProgramLocalParameter4fvARB +#define glGetProgramEnvParameterdvARB __rglgen_glGetProgramEnvParameterdvARB +#define glGetProgramEnvParameterfvARB __rglgen_glGetProgramEnvParameterfvARB +#define glGetProgramLocalParameterdvARB __rglgen_glGetProgramLocalParameterdvARB +#define glGetProgramLocalParameterfvARB __rglgen_glGetProgramLocalParameterfvARB +#define glGetProgramivARB __rglgen_glGetProgramivARB +#define glGetProgramStringARB __rglgen_glGetProgramStringARB +#define glIsProgramARB __rglgen_glIsProgramARB +#define glProgramParameteriARB __rglgen_glProgramParameteriARB +#define glFramebufferTextureARB __rglgen_glFramebufferTextureARB +#define glFramebufferTextureLayerARB __rglgen_glFramebufferTextureLayerARB +#define glFramebufferTextureFaceARB __rglgen_glFramebufferTextureFaceARB +#define glColorTable __rglgen_glColorTable +#define glColorTableParameterfv __rglgen_glColorTableParameterfv +#define glColorTableParameteriv __rglgen_glColorTableParameteriv +#define glCopyColorTable __rglgen_glCopyColorTable +#define glGetColorTable __rglgen_glGetColorTable +#define glGetColorTableParameterfv __rglgen_glGetColorTableParameterfv +#define glGetColorTableParameteriv __rglgen_glGetColorTableParameteriv +#define glColorSubTable __rglgen_glColorSubTable +#define glCopyColorSubTable __rglgen_glCopyColorSubTable +#define glConvolutionFilter1D __rglgen_glConvolutionFilter1D +#define glConvolutionFilter2D __rglgen_glConvolutionFilter2D +#define glConvolutionParameterf __rglgen_glConvolutionParameterf +#define glConvolutionParameterfv __rglgen_glConvolutionParameterfv +#define glConvolutionParameteri __rglgen_glConvolutionParameteri +#define glConvolutionParameteriv __rglgen_glConvolutionParameteriv +#define glCopyConvolutionFilter1D __rglgen_glCopyConvolutionFilter1D +#define glCopyConvolutionFilter2D __rglgen_glCopyConvolutionFilter2D +#define glGetConvolutionFilter __rglgen_glGetConvolutionFilter +#define glGetConvolutionParameterfv __rglgen_glGetConvolutionParameterfv +#define glGetConvolutionParameteriv __rglgen_glGetConvolutionParameteriv +#define glGetSeparableFilter __rglgen_glGetSeparableFilter +#define glSeparableFilter2D __rglgen_glSeparableFilter2D +#define glGetHistogram __rglgen_glGetHistogram +#define glGetHistogramParameterfv __rglgen_glGetHistogramParameterfv +#define glGetHistogramParameteriv __rglgen_glGetHistogramParameteriv +#define glGetMinmax __rglgen_glGetMinmax +#define glGetMinmaxParameterfv __rglgen_glGetMinmaxParameterfv +#define glGetMinmaxParameteriv __rglgen_glGetMinmaxParameteriv +#define glHistogram __rglgen_glHistogram +#define glMinmax __rglgen_glMinmax +#define glResetHistogram __rglgen_glResetHistogram +#define glResetMinmax __rglgen_glResetMinmax +#define glMultiDrawArraysIndirectCountARB __rglgen_glMultiDrawArraysIndirectCountARB +#define glMultiDrawElementsIndirectCountARB __rglgen_glMultiDrawElementsIndirectCountARB +#define glVertexAttribDivisorARB __rglgen_glVertexAttribDivisorARB +#define glCurrentPaletteMatrixARB __rglgen_glCurrentPaletteMatrixARB +#define glMatrixIndexubvARB __rglgen_glMatrixIndexubvARB +#define glMatrixIndexusvARB __rglgen_glMatrixIndexusvARB +#define glMatrixIndexuivARB __rglgen_glMatrixIndexuivARB +#define glMatrixIndexPointerARB __rglgen_glMatrixIndexPointerARB +#define glSampleCoverageARB __rglgen_glSampleCoverageARB +#define glActiveTextureARB __rglgen_glActiveTextureARB +#define glClientActiveTextureARB __rglgen_glClientActiveTextureARB +#define glMultiTexCoord1dARB __rglgen_glMultiTexCoord1dARB +#define glMultiTexCoord1dvARB __rglgen_glMultiTexCoord1dvARB +#define glMultiTexCoord1fARB __rglgen_glMultiTexCoord1fARB +#define glMultiTexCoord1fvARB __rglgen_glMultiTexCoord1fvARB +#define glMultiTexCoord1iARB __rglgen_glMultiTexCoord1iARB +#define glMultiTexCoord1ivARB __rglgen_glMultiTexCoord1ivARB +#define glMultiTexCoord1sARB __rglgen_glMultiTexCoord1sARB +#define glMultiTexCoord1svARB __rglgen_glMultiTexCoord1svARB +#define glMultiTexCoord2dARB __rglgen_glMultiTexCoord2dARB +#define glMultiTexCoord2dvARB __rglgen_glMultiTexCoord2dvARB +#define glMultiTexCoord2fARB __rglgen_glMultiTexCoord2fARB +#define glMultiTexCoord2fvARB __rglgen_glMultiTexCoord2fvARB +#define glMultiTexCoord2iARB __rglgen_glMultiTexCoord2iARB +#define glMultiTexCoord2ivARB __rglgen_glMultiTexCoord2ivARB +#define glMultiTexCoord2sARB __rglgen_glMultiTexCoord2sARB +#define glMultiTexCoord2svARB __rglgen_glMultiTexCoord2svARB +#define glMultiTexCoord3dARB __rglgen_glMultiTexCoord3dARB +#define glMultiTexCoord3dvARB __rglgen_glMultiTexCoord3dvARB +#define glMultiTexCoord3fARB __rglgen_glMultiTexCoord3fARB +#define glMultiTexCoord3fvARB __rglgen_glMultiTexCoord3fvARB +#define glMultiTexCoord3iARB __rglgen_glMultiTexCoord3iARB +#define glMultiTexCoord3ivARB __rglgen_glMultiTexCoord3ivARB +#define glMultiTexCoord3sARB __rglgen_glMultiTexCoord3sARB +#define glMultiTexCoord3svARB __rglgen_glMultiTexCoord3svARB +#define glMultiTexCoord4dARB __rglgen_glMultiTexCoord4dARB +#define glMultiTexCoord4dvARB __rglgen_glMultiTexCoord4dvARB +#define glMultiTexCoord4fARB __rglgen_glMultiTexCoord4fARB +#define glMultiTexCoord4fvARB __rglgen_glMultiTexCoord4fvARB +#define glMultiTexCoord4iARB __rglgen_glMultiTexCoord4iARB +#define glMultiTexCoord4ivARB __rglgen_glMultiTexCoord4ivARB +#define glMultiTexCoord4sARB __rglgen_glMultiTexCoord4sARB +#define glMultiTexCoord4svARB __rglgen_glMultiTexCoord4svARB +#define glGenQueriesARB __rglgen_glGenQueriesARB +#define glDeleteQueriesARB __rglgen_glDeleteQueriesARB +#define glIsQueryARB __rglgen_glIsQueryARB +#define glBeginQueryARB __rglgen_glBeginQueryARB +#define glEndQueryARB __rglgen_glEndQueryARB +#define glGetQueryivARB __rglgen_glGetQueryivARB +#define glGetQueryObjectivARB __rglgen_glGetQueryObjectivARB +#define glGetQueryObjectuivARB __rglgen_glGetQueryObjectuivARB +#define glPointParameterfARB __rglgen_glPointParameterfARB +#define glPointParameterfvARB __rglgen_glPointParameterfvARB +#define glGetGraphicsResetStatusARB __rglgen_glGetGraphicsResetStatusARB +#define glGetnTexImageARB __rglgen_glGetnTexImageARB +#define glReadnPixelsARB __rglgen_glReadnPixelsARB +#define glGetnCompressedTexImageARB __rglgen_glGetnCompressedTexImageARB +#define glGetnUniformfvARB __rglgen_glGetnUniformfvARB +#define glGetnUniformivARB __rglgen_glGetnUniformivARB +#define glGetnUniformuivARB __rglgen_glGetnUniformuivARB +#define glGetnUniformdvARB __rglgen_glGetnUniformdvARB +#define glGetnMapdvARB __rglgen_glGetnMapdvARB +#define glGetnMapfvARB __rglgen_glGetnMapfvARB +#define glGetnMapivARB __rglgen_glGetnMapivARB +#define glGetnPixelMapfvARB __rglgen_glGetnPixelMapfvARB +#define glGetnPixelMapuivARB __rglgen_glGetnPixelMapuivARB +#define glGetnPixelMapusvARB __rglgen_glGetnPixelMapusvARB +#define glGetnPolygonStippleARB __rglgen_glGetnPolygonStippleARB +#define glGetnColorTableARB __rglgen_glGetnColorTableARB +#define glGetnConvolutionFilterARB __rglgen_glGetnConvolutionFilterARB +#define glGetnSeparableFilterARB __rglgen_glGetnSeparableFilterARB +#define glGetnHistogramARB __rglgen_glGetnHistogramARB +#define glGetnMinmaxARB __rglgen_glGetnMinmaxARB +#define glMinSampleShadingARB __rglgen_glMinSampleShadingARB +#define glDeleteObjectARB __rglgen_glDeleteObjectARB +#define glGetHandleARB __rglgen_glGetHandleARB +#define glDetachObjectARB __rglgen_glDetachObjectARB +#define glCreateShaderObjectARB __rglgen_glCreateShaderObjectARB +#define glShaderSourceARB __rglgen_glShaderSourceARB +#define glCompileShaderARB __rglgen_glCompileShaderARB +#define glCreateProgramObjectARB __rglgen_glCreateProgramObjectARB +#define glAttachObjectARB __rglgen_glAttachObjectARB +#define glLinkProgramARB __rglgen_glLinkProgramARB +#define glUseProgramObjectARB __rglgen_glUseProgramObjectARB +#define glValidateProgramARB __rglgen_glValidateProgramARB +#define glUniform1fARB __rglgen_glUniform1fARB +#define glUniform2fARB __rglgen_glUniform2fARB +#define glUniform3fARB __rglgen_glUniform3fARB +#define glUniform4fARB __rglgen_glUniform4fARB +#define glUniform1iARB __rglgen_glUniform1iARB +#define glUniform2iARB __rglgen_glUniform2iARB +#define glUniform3iARB __rglgen_glUniform3iARB +#define glUniform4iARB __rglgen_glUniform4iARB +#define glUniform1fvARB __rglgen_glUniform1fvARB +#define glUniform2fvARB __rglgen_glUniform2fvARB +#define glUniform3fvARB __rglgen_glUniform3fvARB +#define glUniform4fvARB __rglgen_glUniform4fvARB +#define glUniform1ivARB __rglgen_glUniform1ivARB +#define glUniform2ivARB __rglgen_glUniform2ivARB +#define glUniform3ivARB __rglgen_glUniform3ivARB +#define glUniform4ivARB __rglgen_glUniform4ivARB +#define glUniformMatrix2fvARB __rglgen_glUniformMatrix2fvARB +#define glUniformMatrix3fvARB __rglgen_glUniformMatrix3fvARB +#define glUniformMatrix4fvARB __rglgen_glUniformMatrix4fvARB +#define glGetObjectParameterfvARB __rglgen_glGetObjectParameterfvARB +#define glGetObjectParameterivARB __rglgen_glGetObjectParameterivARB +#define glGetInfoLogARB __rglgen_glGetInfoLogARB +#define glGetAttachedObjectsARB __rglgen_glGetAttachedObjectsARB +#define glGetUniformLocationARB __rglgen_glGetUniformLocationARB +#define glGetActiveUniformARB __rglgen_glGetActiveUniformARB +#define glGetUniformfvARB __rglgen_glGetUniformfvARB +#define glGetUniformivARB __rglgen_glGetUniformivARB +#define glGetShaderSourceARB __rglgen_glGetShaderSourceARB +#define glNamedStringARB __rglgen_glNamedStringARB +#define glDeleteNamedStringARB __rglgen_glDeleteNamedStringARB +#define glCompileShaderIncludeARB __rglgen_glCompileShaderIncludeARB +#define glIsNamedStringARB __rglgen_glIsNamedStringARB +#define glGetNamedStringARB __rglgen_glGetNamedStringARB +#define glGetNamedStringivARB __rglgen_glGetNamedStringivARB +#define glTexPageCommitmentARB __rglgen_glTexPageCommitmentARB +#define glTexBufferARB __rglgen_glTexBufferARB +#define glCompressedTexImage3DARB __rglgen_glCompressedTexImage3DARB +#define glCompressedTexImage2DARB __rglgen_glCompressedTexImage2DARB +#define glCompressedTexImage1DARB __rglgen_glCompressedTexImage1DARB +#define glCompressedTexSubImage3DARB __rglgen_glCompressedTexSubImage3DARB +#define glCompressedTexSubImage2DARB __rglgen_glCompressedTexSubImage2DARB +#define glCompressedTexSubImage1DARB __rglgen_glCompressedTexSubImage1DARB +#define glGetCompressedTexImageARB __rglgen_glGetCompressedTexImageARB +#define glLoadTransposeMatrixfARB __rglgen_glLoadTransposeMatrixfARB +#define glLoadTransposeMatrixdARB __rglgen_glLoadTransposeMatrixdARB +#define glMultTransposeMatrixfARB __rglgen_glMultTransposeMatrixfARB +#define glMultTransposeMatrixdARB __rglgen_glMultTransposeMatrixdARB +#define glWeightbvARB __rglgen_glWeightbvARB +#define glWeightsvARB __rglgen_glWeightsvARB +#define glWeightivARB __rglgen_glWeightivARB +#define glWeightfvARB __rglgen_glWeightfvARB +#define glWeightdvARB __rglgen_glWeightdvARB +#define glWeightubvARB __rglgen_glWeightubvARB +#define glWeightusvARB __rglgen_glWeightusvARB +#define glWeightuivARB __rglgen_glWeightuivARB +#define glWeightPointerARB __rglgen_glWeightPointerARB +#define glVertexBlendARB __rglgen_glVertexBlendARB +#define glBindBufferARB __rglgen_glBindBufferARB +#define glDeleteBuffersARB __rglgen_glDeleteBuffersARB +#define glGenBuffersARB __rglgen_glGenBuffersARB +#define glIsBufferARB __rglgen_glIsBufferARB +#define glBufferDataARB __rglgen_glBufferDataARB +#define glBufferSubDataARB __rglgen_glBufferSubDataARB +#define glGetBufferSubDataARB __rglgen_glGetBufferSubDataARB +#define glMapBufferARB __rglgen_glMapBufferARB +#define glUnmapBufferARB __rglgen_glUnmapBufferARB +#define glGetBufferParameterivARB __rglgen_glGetBufferParameterivARB +#define glGetBufferPointervARB __rglgen_glGetBufferPointervARB +#define glVertexAttrib1dARB __rglgen_glVertexAttrib1dARB +#define glVertexAttrib1dvARB __rglgen_glVertexAttrib1dvARB +#define glVertexAttrib1fARB __rglgen_glVertexAttrib1fARB +#define glVertexAttrib1fvARB __rglgen_glVertexAttrib1fvARB +#define glVertexAttrib1sARB __rglgen_glVertexAttrib1sARB +#define glVertexAttrib1svARB __rglgen_glVertexAttrib1svARB +#define glVertexAttrib2dARB __rglgen_glVertexAttrib2dARB +#define glVertexAttrib2dvARB __rglgen_glVertexAttrib2dvARB +#define glVertexAttrib2fARB __rglgen_glVertexAttrib2fARB +#define glVertexAttrib2fvARB __rglgen_glVertexAttrib2fvARB +#define glVertexAttrib2sARB __rglgen_glVertexAttrib2sARB +#define glVertexAttrib2svARB __rglgen_glVertexAttrib2svARB +#define glVertexAttrib3dARB __rglgen_glVertexAttrib3dARB +#define glVertexAttrib3dvARB __rglgen_glVertexAttrib3dvARB +#define glVertexAttrib3fARB __rglgen_glVertexAttrib3fARB +#define glVertexAttrib3fvARB __rglgen_glVertexAttrib3fvARB +#define glVertexAttrib3sARB __rglgen_glVertexAttrib3sARB +#define glVertexAttrib3svARB __rglgen_glVertexAttrib3svARB +#define glVertexAttrib4NbvARB __rglgen_glVertexAttrib4NbvARB +#define glVertexAttrib4NivARB __rglgen_glVertexAttrib4NivARB +#define glVertexAttrib4NsvARB __rglgen_glVertexAttrib4NsvARB +#define glVertexAttrib4NubARB __rglgen_glVertexAttrib4NubARB +#define glVertexAttrib4NubvARB __rglgen_glVertexAttrib4NubvARB +#define glVertexAttrib4NuivARB __rglgen_glVertexAttrib4NuivARB +#define glVertexAttrib4NusvARB __rglgen_glVertexAttrib4NusvARB +#define glVertexAttrib4bvARB __rglgen_glVertexAttrib4bvARB +#define glVertexAttrib4dARB __rglgen_glVertexAttrib4dARB +#define glVertexAttrib4dvARB __rglgen_glVertexAttrib4dvARB +#define glVertexAttrib4fARB __rglgen_glVertexAttrib4fARB +#define glVertexAttrib4fvARB __rglgen_glVertexAttrib4fvARB +#define glVertexAttrib4ivARB __rglgen_glVertexAttrib4ivARB +#define glVertexAttrib4sARB __rglgen_glVertexAttrib4sARB +#define glVertexAttrib4svARB __rglgen_glVertexAttrib4svARB +#define glVertexAttrib4ubvARB __rglgen_glVertexAttrib4ubvARB +#define glVertexAttrib4uivARB __rglgen_glVertexAttrib4uivARB +#define glVertexAttrib4usvARB __rglgen_glVertexAttrib4usvARB +#define glVertexAttribPointerARB __rglgen_glVertexAttribPointerARB +#define glEnableVertexAttribArrayARB __rglgen_glEnableVertexAttribArrayARB +#define glDisableVertexAttribArrayARB __rglgen_glDisableVertexAttribArrayARB +#define glGetVertexAttribdvARB __rglgen_glGetVertexAttribdvARB +#define glGetVertexAttribfvARB __rglgen_glGetVertexAttribfvARB +#define glGetVertexAttribivARB __rglgen_glGetVertexAttribivARB +#define glGetVertexAttribPointervARB __rglgen_glGetVertexAttribPointervARB +#define glBindAttribLocationARB __rglgen_glBindAttribLocationARB +#define glGetActiveAttribARB __rglgen_glGetActiveAttribARB +#define glGetAttribLocationARB __rglgen_glGetAttribLocationARB +#define glWindowPos2dARB __rglgen_glWindowPos2dARB +#define glWindowPos2dvARB __rglgen_glWindowPos2dvARB +#define glWindowPos2fARB __rglgen_glWindowPos2fARB +#define glWindowPos2fvARB __rglgen_glWindowPos2fvARB +#define glWindowPos2iARB __rglgen_glWindowPos2iARB +#define glWindowPos2ivARB __rglgen_glWindowPos2ivARB +#define glWindowPos2sARB __rglgen_glWindowPos2sARB +#define glWindowPos2svARB __rglgen_glWindowPos2svARB +#define glWindowPos3dARB __rglgen_glWindowPos3dARB +#define glWindowPos3dvARB __rglgen_glWindowPos3dvARB +#define glWindowPos3fARB __rglgen_glWindowPos3fARB +#define glWindowPos3fvARB __rglgen_glWindowPos3fvARB +#define glWindowPos3iARB __rglgen_glWindowPos3iARB +#define glWindowPos3ivARB __rglgen_glWindowPos3ivARB +#define glWindowPos3sARB __rglgen_glWindowPos3sARB +#define glWindowPos3svARB __rglgen_glWindowPos3svARB +#define glMultiTexCoord1bOES __rglgen_glMultiTexCoord1bOES +#define glMultiTexCoord1bvOES __rglgen_glMultiTexCoord1bvOES +#define glMultiTexCoord2bOES __rglgen_glMultiTexCoord2bOES +#define glMultiTexCoord2bvOES __rglgen_glMultiTexCoord2bvOES +#define glMultiTexCoord3bOES __rglgen_glMultiTexCoord3bOES +#define glMultiTexCoord3bvOES __rglgen_glMultiTexCoord3bvOES +#define glMultiTexCoord4bOES __rglgen_glMultiTexCoord4bOES +#define glMultiTexCoord4bvOES __rglgen_glMultiTexCoord4bvOES +#define glTexCoord1bOES __rglgen_glTexCoord1bOES +#define glTexCoord1bvOES __rglgen_glTexCoord1bvOES +#define glTexCoord2bOES __rglgen_glTexCoord2bOES +#define glTexCoord2bvOES __rglgen_glTexCoord2bvOES +#define glTexCoord3bOES __rglgen_glTexCoord3bOES +#define glTexCoord3bvOES __rglgen_glTexCoord3bvOES +#define glTexCoord4bOES __rglgen_glTexCoord4bOES +#define glTexCoord4bvOES __rglgen_glTexCoord4bvOES +#define glVertex2bOES __rglgen_glVertex2bOES +#define glVertex2bvOES __rglgen_glVertex2bvOES +#define glVertex3bOES __rglgen_glVertex3bOES +#define glVertex3bvOES __rglgen_glVertex3bvOES +#define glVertex4bOES __rglgen_glVertex4bOES +#define glVertex4bvOES __rglgen_glVertex4bvOES +#define glAlphaFuncxOES __rglgen_glAlphaFuncxOES +#define glClearColorxOES __rglgen_glClearColorxOES +#define glClearDepthxOES __rglgen_glClearDepthxOES +#define glClipPlanexOES __rglgen_glClipPlanexOES +#define glColor4xOES __rglgen_glColor4xOES +#define glDepthRangexOES __rglgen_glDepthRangexOES +#define glFogxOES __rglgen_glFogxOES +#define glFogxvOES __rglgen_glFogxvOES +#define glFrustumxOES __rglgen_glFrustumxOES +#define glGetClipPlanexOES __rglgen_glGetClipPlanexOES +#define glGetFixedvOES __rglgen_glGetFixedvOES +#define glGetTexEnvxvOES __rglgen_glGetTexEnvxvOES +#define glGetTexParameterxvOES __rglgen_glGetTexParameterxvOES +#define glLightModelxOES __rglgen_glLightModelxOES +#define glLightModelxvOES __rglgen_glLightModelxvOES +#define glLightxOES __rglgen_glLightxOES +#define glLightxvOES __rglgen_glLightxvOES +#define glLineWidthxOES __rglgen_glLineWidthxOES +#define glLoadMatrixxOES __rglgen_glLoadMatrixxOES +#define glMaterialxOES __rglgen_glMaterialxOES +#define glMaterialxvOES __rglgen_glMaterialxvOES +#define glMultMatrixxOES __rglgen_glMultMatrixxOES +#define glMultiTexCoord4xOES __rglgen_glMultiTexCoord4xOES +#define glNormal3xOES __rglgen_glNormal3xOES +#define glOrthoxOES __rglgen_glOrthoxOES +#define glPointParameterxvOES __rglgen_glPointParameterxvOES +#define glPointSizexOES __rglgen_glPointSizexOES +#define glPolygonOffsetxOES __rglgen_glPolygonOffsetxOES +#define glRotatexOES __rglgen_glRotatexOES +#define glSampleCoverageOES __rglgen_glSampleCoverageOES +#define glScalexOES __rglgen_glScalexOES +#define glTexEnvxOES __rglgen_glTexEnvxOES +#define glTexEnvxvOES __rglgen_glTexEnvxvOES +#define glTexParameterxOES __rglgen_glTexParameterxOES +#define glTexParameterxvOES __rglgen_glTexParameterxvOES +#define glTranslatexOES __rglgen_glTranslatexOES +#define glAccumxOES __rglgen_glAccumxOES +#define glBitmapxOES __rglgen_glBitmapxOES +#define glBlendColorxOES __rglgen_glBlendColorxOES +#define glClearAccumxOES __rglgen_glClearAccumxOES +#define glColor3xOES __rglgen_glColor3xOES +#define glColor3xvOES __rglgen_glColor3xvOES +#define glColor4xvOES __rglgen_glColor4xvOES +#define glConvolutionParameterxOES __rglgen_glConvolutionParameterxOES +#define glConvolutionParameterxvOES __rglgen_glConvolutionParameterxvOES +#define glEvalCoord1xOES __rglgen_glEvalCoord1xOES +#define glEvalCoord1xvOES __rglgen_glEvalCoord1xvOES +#define glEvalCoord2xOES __rglgen_glEvalCoord2xOES +#define glEvalCoord2xvOES __rglgen_glEvalCoord2xvOES +#define glFeedbackBufferxOES __rglgen_glFeedbackBufferxOES +#define glGetConvolutionParameterxvOES __rglgen_glGetConvolutionParameterxvOES +#define glGetHistogramParameterxvOES __rglgen_glGetHistogramParameterxvOES +#define glGetLightxOES __rglgen_glGetLightxOES +#define glGetMapxvOES __rglgen_glGetMapxvOES +#define glGetMaterialxOES __rglgen_glGetMaterialxOES +#define glGetPixelMapxv __rglgen_glGetPixelMapxv +#define glGetTexGenxvOES __rglgen_glGetTexGenxvOES +#define glGetTexLevelParameterxvOES __rglgen_glGetTexLevelParameterxvOES +#define glIndexxOES __rglgen_glIndexxOES +#define glIndexxvOES __rglgen_glIndexxvOES +#define glLoadTransposeMatrixxOES __rglgen_glLoadTransposeMatrixxOES +#define glMap1xOES __rglgen_glMap1xOES +#define glMap2xOES __rglgen_glMap2xOES +#define glMapGrid1xOES __rglgen_glMapGrid1xOES +#define glMapGrid2xOES __rglgen_glMapGrid2xOES +#define glMultTransposeMatrixxOES __rglgen_glMultTransposeMatrixxOES +#define glMultiTexCoord1xOES __rglgen_glMultiTexCoord1xOES +#define glMultiTexCoord1xvOES __rglgen_glMultiTexCoord1xvOES +#define glMultiTexCoord2xOES __rglgen_glMultiTexCoord2xOES +#define glMultiTexCoord2xvOES __rglgen_glMultiTexCoord2xvOES +#define glMultiTexCoord3xOES __rglgen_glMultiTexCoord3xOES +#define glMultiTexCoord3xvOES __rglgen_glMultiTexCoord3xvOES +#define glMultiTexCoord4xvOES __rglgen_glMultiTexCoord4xvOES +#define glNormal3xvOES __rglgen_glNormal3xvOES +#define glPassThroughxOES __rglgen_glPassThroughxOES +#define glPixelMapx __rglgen_glPixelMapx +#define glPixelStorex __rglgen_glPixelStorex +#define glPixelTransferxOES __rglgen_glPixelTransferxOES +#define glPixelZoomxOES __rglgen_glPixelZoomxOES +#define glPrioritizeTexturesxOES __rglgen_glPrioritizeTexturesxOES +#define glRasterPos2xOES __rglgen_glRasterPos2xOES +#define glRasterPos2xvOES __rglgen_glRasterPos2xvOES +#define glRasterPos3xOES __rglgen_glRasterPos3xOES +#define glRasterPos3xvOES __rglgen_glRasterPos3xvOES +#define glRasterPos4xOES __rglgen_glRasterPos4xOES +#define glRasterPos4xvOES __rglgen_glRasterPos4xvOES +#define glRectxOES __rglgen_glRectxOES +#define glRectxvOES __rglgen_glRectxvOES +#define glTexCoord1xOES __rglgen_glTexCoord1xOES +#define glTexCoord1xvOES __rglgen_glTexCoord1xvOES +#define glTexCoord2xOES __rglgen_glTexCoord2xOES +#define glTexCoord2xvOES __rglgen_glTexCoord2xvOES +#define glTexCoord3xOES __rglgen_glTexCoord3xOES +#define glTexCoord3xvOES __rglgen_glTexCoord3xvOES +#define glTexCoord4xOES __rglgen_glTexCoord4xOES +#define glTexCoord4xvOES __rglgen_glTexCoord4xvOES +#define glTexGenxOES __rglgen_glTexGenxOES +#define glTexGenxvOES __rglgen_glTexGenxvOES +#define glVertex2xOES __rglgen_glVertex2xOES +#define glVertex2xvOES __rglgen_glVertex2xvOES +#define glVertex3xOES __rglgen_glVertex3xOES +#define glVertex3xvOES __rglgen_glVertex3xvOES +#define glVertex4xOES __rglgen_glVertex4xOES +#define glVertex4xvOES __rglgen_glVertex4xvOES +#define glQueryMatrixxOES __rglgen_glQueryMatrixxOES +#define glClearDepthfOES __rglgen_glClearDepthfOES +#define glClipPlanefOES __rglgen_glClipPlanefOES +#define glDepthRangefOES __rglgen_glDepthRangefOES +#define glFrustumfOES __rglgen_glFrustumfOES +#define glGetClipPlanefOES __rglgen_glGetClipPlanefOES +#define glOrthofOES __rglgen_glOrthofOES +#define glImageTransformParameteriHP __rglgen_glImageTransformParameteriHP +#define glImageTransformParameterfHP __rglgen_glImageTransformParameterfHP +#define glImageTransformParameterivHP __rglgen_glImageTransformParameterivHP +#define glImageTransformParameterfvHP __rglgen_glImageTransformParameterfvHP +#define glGetImageTransformParameterivHP __rglgen_glGetImageTransformParameterivHP +#define glGetImageTransformParameterfvHP __rglgen_glGetImageTransformParameterfvHP + +extern RGLSYMGLDRAWRANGEELEMENTSPROC __rglgen_glDrawRangeElements; +extern RGLSYMGLTEXIMAGE3DPROC __rglgen_glTexImage3D; +extern RGLSYMGLTEXSUBIMAGE3DPROC __rglgen_glTexSubImage3D; +extern RGLSYMGLCOPYTEXSUBIMAGE3DPROC __rglgen_glCopyTexSubImage3D; +extern RGLSYMGLACTIVETEXTUREPROC __rglgen_glActiveTexture; +extern RGLSYMGLSAMPLECOVERAGEPROC __rglgen_glSampleCoverage; +extern RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC __rglgen_glCompressedTexImage3D; +extern RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC __rglgen_glCompressedTexImage2D; +extern RGLSYMGLCOMPRESSEDTEXIMAGE1DPROC __rglgen_glCompressedTexImage1D; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC __rglgen_glCompressedTexSubImage3D; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC __rglgen_glCompressedTexSubImage2D; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC __rglgen_glCompressedTexSubImage1D; +extern RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC __rglgen_glGetCompressedTexImage; +extern RGLSYMGLCLIENTACTIVETEXTUREPROC __rglgen_glClientActiveTexture; +extern RGLSYMGLMULTITEXCOORD1DPROC __rglgen_glMultiTexCoord1d; +extern RGLSYMGLMULTITEXCOORD1DVPROC __rglgen_glMultiTexCoord1dv; +extern RGLSYMGLMULTITEXCOORD1FPROC __rglgen_glMultiTexCoord1f; +extern RGLSYMGLMULTITEXCOORD1FVPROC __rglgen_glMultiTexCoord1fv; +extern RGLSYMGLMULTITEXCOORD1IPROC __rglgen_glMultiTexCoord1i; +extern RGLSYMGLMULTITEXCOORD1IVPROC __rglgen_glMultiTexCoord1iv; +extern RGLSYMGLMULTITEXCOORD1SPROC __rglgen_glMultiTexCoord1s; +extern RGLSYMGLMULTITEXCOORD1SVPROC __rglgen_glMultiTexCoord1sv; +extern RGLSYMGLMULTITEXCOORD2DPROC __rglgen_glMultiTexCoord2d; +extern RGLSYMGLMULTITEXCOORD2DVPROC __rglgen_glMultiTexCoord2dv; +extern RGLSYMGLMULTITEXCOORD2FPROC __rglgen_glMultiTexCoord2f; +extern RGLSYMGLMULTITEXCOORD2FVPROC __rglgen_glMultiTexCoord2fv; +extern RGLSYMGLMULTITEXCOORD2IPROC __rglgen_glMultiTexCoord2i; +extern RGLSYMGLMULTITEXCOORD2IVPROC __rglgen_glMultiTexCoord2iv; +extern RGLSYMGLMULTITEXCOORD2SPROC __rglgen_glMultiTexCoord2s; +extern RGLSYMGLMULTITEXCOORD2SVPROC __rglgen_glMultiTexCoord2sv; +extern RGLSYMGLMULTITEXCOORD3DPROC __rglgen_glMultiTexCoord3d; +extern RGLSYMGLMULTITEXCOORD3DVPROC __rglgen_glMultiTexCoord3dv; +extern RGLSYMGLMULTITEXCOORD3FPROC __rglgen_glMultiTexCoord3f; +extern RGLSYMGLMULTITEXCOORD3FVPROC __rglgen_glMultiTexCoord3fv; +extern RGLSYMGLMULTITEXCOORD3IPROC __rglgen_glMultiTexCoord3i; +extern RGLSYMGLMULTITEXCOORD3IVPROC __rglgen_glMultiTexCoord3iv; +extern RGLSYMGLMULTITEXCOORD3SPROC __rglgen_glMultiTexCoord3s; +extern RGLSYMGLMULTITEXCOORD3SVPROC __rglgen_glMultiTexCoord3sv; +extern RGLSYMGLMULTITEXCOORD4DPROC __rglgen_glMultiTexCoord4d; +extern RGLSYMGLMULTITEXCOORD4DVPROC __rglgen_glMultiTexCoord4dv; +extern RGLSYMGLMULTITEXCOORD4FPROC __rglgen_glMultiTexCoord4f; +extern RGLSYMGLMULTITEXCOORD4FVPROC __rglgen_glMultiTexCoord4fv; +extern RGLSYMGLMULTITEXCOORD4IPROC __rglgen_glMultiTexCoord4i; +extern RGLSYMGLMULTITEXCOORD4IVPROC __rglgen_glMultiTexCoord4iv; +extern RGLSYMGLMULTITEXCOORD4SPROC __rglgen_glMultiTexCoord4s; +extern RGLSYMGLMULTITEXCOORD4SVPROC __rglgen_glMultiTexCoord4sv; +extern RGLSYMGLLOADTRANSPOSEMATRIXFPROC __rglgen_glLoadTransposeMatrixf; +extern RGLSYMGLLOADTRANSPOSEMATRIXDPROC __rglgen_glLoadTransposeMatrixd; +extern RGLSYMGLMULTTRANSPOSEMATRIXFPROC __rglgen_glMultTransposeMatrixf; +extern RGLSYMGLMULTTRANSPOSEMATRIXDPROC __rglgen_glMultTransposeMatrixd; +extern RGLSYMGLBLENDFUNCSEPARATEPROC __rglgen_glBlendFuncSeparate; +extern RGLSYMGLMULTIDRAWARRAYSPROC __rglgen_glMultiDrawArrays; +extern RGLSYMGLMULTIDRAWELEMENTSPROC __rglgen_glMultiDrawElements; +extern RGLSYMGLPOINTPARAMETERFPROC __rglgen_glPointParameterf; +extern RGLSYMGLPOINTPARAMETERFVPROC __rglgen_glPointParameterfv; +extern RGLSYMGLPOINTPARAMETERIPROC __rglgen_glPointParameteri; +extern RGLSYMGLPOINTPARAMETERIVPROC __rglgen_glPointParameteriv; +extern RGLSYMGLFOGCOORDFPROC __rglgen_glFogCoordf; +extern RGLSYMGLFOGCOORDFVPROC __rglgen_glFogCoordfv; +extern RGLSYMGLFOGCOORDDPROC __rglgen_glFogCoordd; +extern RGLSYMGLFOGCOORDDVPROC __rglgen_glFogCoorddv; +extern RGLSYMGLFOGCOORDPOINTERPROC __rglgen_glFogCoordPointer; +extern RGLSYMGLSECONDARYCOLOR3BPROC __rglgen_glSecondaryColor3b; +extern RGLSYMGLSECONDARYCOLOR3BVPROC __rglgen_glSecondaryColor3bv; +extern RGLSYMGLSECONDARYCOLOR3DPROC __rglgen_glSecondaryColor3d; +extern RGLSYMGLSECONDARYCOLOR3DVPROC __rglgen_glSecondaryColor3dv; +extern RGLSYMGLSECONDARYCOLOR3FPROC __rglgen_glSecondaryColor3f; +extern RGLSYMGLSECONDARYCOLOR3FVPROC __rglgen_glSecondaryColor3fv; +extern RGLSYMGLSECONDARYCOLOR3IPROC __rglgen_glSecondaryColor3i; +extern RGLSYMGLSECONDARYCOLOR3IVPROC __rglgen_glSecondaryColor3iv; +extern RGLSYMGLSECONDARYCOLOR3SPROC __rglgen_glSecondaryColor3s; +extern RGLSYMGLSECONDARYCOLOR3SVPROC __rglgen_glSecondaryColor3sv; +extern RGLSYMGLSECONDARYCOLOR3UBPROC __rglgen_glSecondaryColor3ub; +extern RGLSYMGLSECONDARYCOLOR3UBVPROC __rglgen_glSecondaryColor3ubv; +extern RGLSYMGLSECONDARYCOLOR3UIPROC __rglgen_glSecondaryColor3ui; +extern RGLSYMGLSECONDARYCOLOR3UIVPROC __rglgen_glSecondaryColor3uiv; +extern RGLSYMGLSECONDARYCOLOR3USPROC __rglgen_glSecondaryColor3us; +extern RGLSYMGLSECONDARYCOLOR3USVPROC __rglgen_glSecondaryColor3usv; +extern RGLSYMGLSECONDARYCOLORPOINTERPROC __rglgen_glSecondaryColorPointer; +extern RGLSYMGLWINDOWPOS2DPROC __rglgen_glWindowPos2d; +extern RGLSYMGLWINDOWPOS2DVPROC __rglgen_glWindowPos2dv; +extern RGLSYMGLWINDOWPOS2FPROC __rglgen_glWindowPos2f; +extern RGLSYMGLWINDOWPOS2FVPROC __rglgen_glWindowPos2fv; +extern RGLSYMGLWINDOWPOS2IPROC __rglgen_glWindowPos2i; +extern RGLSYMGLWINDOWPOS2IVPROC __rglgen_glWindowPos2iv; +extern RGLSYMGLWINDOWPOS2SPROC __rglgen_glWindowPos2s; +extern RGLSYMGLWINDOWPOS2SVPROC __rglgen_glWindowPos2sv; +extern RGLSYMGLWINDOWPOS3DPROC __rglgen_glWindowPos3d; +extern RGLSYMGLWINDOWPOS3DVPROC __rglgen_glWindowPos3dv; +extern RGLSYMGLWINDOWPOS3FPROC __rglgen_glWindowPos3f; +extern RGLSYMGLWINDOWPOS3FVPROC __rglgen_glWindowPos3fv; +extern RGLSYMGLWINDOWPOS3IPROC __rglgen_glWindowPos3i; +extern RGLSYMGLWINDOWPOS3IVPROC __rglgen_glWindowPos3iv; +extern RGLSYMGLWINDOWPOS3SPROC __rglgen_glWindowPos3s; +extern RGLSYMGLWINDOWPOS3SVPROC __rglgen_glWindowPos3sv; +extern RGLSYMGLBLENDCOLORPROC __rglgen_glBlendColor; +extern RGLSYMGLBLENDEQUATIONPROC __rglgen_glBlendEquation; +extern RGLSYMGLGENQUERIESPROC __rglgen_glGenQueries; +extern RGLSYMGLDELETEQUERIESPROC __rglgen_glDeleteQueries; +extern RGLSYMGLISQUERYPROC __rglgen_glIsQuery; +extern RGLSYMGLBEGINQUERYPROC __rglgen_glBeginQuery; +extern RGLSYMGLENDQUERYPROC __rglgen_glEndQuery; +extern RGLSYMGLGETQUERYIVPROC __rglgen_glGetQueryiv; +extern RGLSYMGLGETQUERYOBJECTIVPROC __rglgen_glGetQueryObjectiv; +extern RGLSYMGLGETQUERYOBJECTUIVPROC __rglgen_glGetQueryObjectuiv; +extern RGLSYMGLBINDBUFFERPROC __rglgen_glBindBuffer; +extern RGLSYMGLDELETEBUFFERSPROC __rglgen_glDeleteBuffers; +extern RGLSYMGLGENBUFFERSPROC __rglgen_glGenBuffers; +extern RGLSYMGLISBUFFERPROC __rglgen_glIsBuffer; +extern RGLSYMGLBUFFERDATAPROC __rglgen_glBufferData; +extern RGLSYMGLBUFFERSUBDATAPROC __rglgen_glBufferSubData; +extern RGLSYMGLGETBUFFERSUBDATAPROC __rglgen_glGetBufferSubData; +extern RGLSYMGLMAPBUFFERPROC __rglgen_glMapBuffer; +extern RGLSYMGLUNMAPBUFFERPROC __rglgen_glUnmapBuffer; +extern RGLSYMGLGETBUFFERPARAMETERIVPROC __rglgen_glGetBufferParameteriv; +extern RGLSYMGLGETBUFFERPOINTERVPROC __rglgen_glGetBufferPointerv; +extern RGLSYMGLBLENDEQUATIONSEPARATEPROC __rglgen_glBlendEquationSeparate; +extern RGLSYMGLDRAWBUFFERSPROC __rglgen_glDrawBuffers; +extern RGLSYMGLSTENCILOPSEPARATEPROC __rglgen_glStencilOpSeparate; +extern RGLSYMGLSTENCILFUNCSEPARATEPROC __rglgen_glStencilFuncSeparate; +extern RGLSYMGLSTENCILMASKSEPARATEPROC __rglgen_glStencilMaskSeparate; +extern RGLSYMGLATTACHSHADERPROC __rglgen_glAttachShader; +extern RGLSYMGLBINDATTRIBLOCATIONPROC __rglgen_glBindAttribLocation; +extern RGLSYMGLCOMPILESHADERPROC __rglgen_glCompileShader; +extern RGLSYMGLCREATEPROGRAMPROC __rglgen_glCreateProgram; +extern RGLSYMGLCREATESHADERPROC __rglgen_glCreateShader; +extern RGLSYMGLDELETEPROGRAMPROC __rglgen_glDeleteProgram; +extern RGLSYMGLDELETESHADERPROC __rglgen_glDeleteShader; +extern RGLSYMGLDETACHSHADERPROC __rglgen_glDetachShader; +extern RGLSYMGLDISABLEVERTEXATTRIBARRAYPROC __rglgen_glDisableVertexAttribArray; +extern RGLSYMGLENABLEVERTEXATTRIBARRAYPROC __rglgen_glEnableVertexAttribArray; +extern RGLSYMGLGETACTIVEATTRIBPROC __rglgen_glGetActiveAttrib; +extern RGLSYMGLGETACTIVEUNIFORMPROC __rglgen_glGetActiveUniform; +extern RGLSYMGLGETATTACHEDSHADERSPROC __rglgen_glGetAttachedShaders; +extern RGLSYMGLGETATTRIBLOCATIONPROC __rglgen_glGetAttribLocation; +extern RGLSYMGLGETPROGRAMIVPROC __rglgen_glGetProgramiv; +extern RGLSYMGLGETPROGRAMINFOLOGPROC __rglgen_glGetProgramInfoLog; +extern RGLSYMGLGETSHADERIVPROC __rglgen_glGetShaderiv; +extern RGLSYMGLGETSHADERINFOLOGPROC __rglgen_glGetShaderInfoLog; +extern RGLSYMGLGETSHADERSOURCEPROC __rglgen_glGetShaderSource; +extern RGLSYMGLGETUNIFORMLOCATIONPROC __rglgen_glGetUniformLocation; +extern RGLSYMGLGETUNIFORMFVPROC __rglgen_glGetUniformfv; +extern RGLSYMGLGETUNIFORMIVPROC __rglgen_glGetUniformiv; +extern RGLSYMGLGETVERTEXATTRIBDVPROC __rglgen_glGetVertexAttribdv; +extern RGLSYMGLGETVERTEXATTRIBFVPROC __rglgen_glGetVertexAttribfv; +extern RGLSYMGLGETVERTEXATTRIBIVPROC __rglgen_glGetVertexAttribiv; +extern RGLSYMGLGETVERTEXATTRIBPOINTERVPROC __rglgen_glGetVertexAttribPointerv; +extern RGLSYMGLISPROGRAMPROC __rglgen_glIsProgram; +extern RGLSYMGLISSHADERPROC __rglgen_glIsShader; +extern RGLSYMGLLINKPROGRAMPROC __rglgen_glLinkProgram; +extern RGLSYMGLSHADERSOURCEPROC __rglgen_glShaderSource; +extern RGLSYMGLUSEPROGRAMPROC __rglgen_glUseProgram; +extern RGLSYMGLUNIFORM1FPROC __rglgen_glUniform1f; +extern RGLSYMGLUNIFORM2FPROC __rglgen_glUniform2f; +extern RGLSYMGLUNIFORM3FPROC __rglgen_glUniform3f; +extern RGLSYMGLUNIFORM4FPROC __rglgen_glUniform4f; +extern RGLSYMGLUNIFORM1IPROC __rglgen_glUniform1i; +extern RGLSYMGLUNIFORM2IPROC __rglgen_glUniform2i; +extern RGLSYMGLUNIFORM3IPROC __rglgen_glUniform3i; +extern RGLSYMGLUNIFORM4IPROC __rglgen_glUniform4i; +extern RGLSYMGLUNIFORM1FVPROC __rglgen_glUniform1fv; +extern RGLSYMGLUNIFORM2FVPROC __rglgen_glUniform2fv; +extern RGLSYMGLUNIFORM3FVPROC __rglgen_glUniform3fv; +extern RGLSYMGLUNIFORM4FVPROC __rglgen_glUniform4fv; +extern RGLSYMGLUNIFORM1IVPROC __rglgen_glUniform1iv; +extern RGLSYMGLUNIFORM2IVPROC __rglgen_glUniform2iv; +extern RGLSYMGLUNIFORM3IVPROC __rglgen_glUniform3iv; +extern RGLSYMGLUNIFORM4IVPROC __rglgen_glUniform4iv; +extern RGLSYMGLUNIFORMMATRIX2FVPROC __rglgen_glUniformMatrix2fv; +extern RGLSYMGLUNIFORMMATRIX3FVPROC __rglgen_glUniformMatrix3fv; +extern RGLSYMGLUNIFORMMATRIX4FVPROC __rglgen_glUniformMatrix4fv; +extern RGLSYMGLVALIDATEPROGRAMPROC __rglgen_glValidateProgram; +extern RGLSYMGLVERTEXATTRIB1DPROC __rglgen_glVertexAttrib1d; +extern RGLSYMGLVERTEXATTRIB1DVPROC __rglgen_glVertexAttrib1dv; +extern RGLSYMGLVERTEXATTRIB1FPROC __rglgen_glVertexAttrib1f; +extern RGLSYMGLVERTEXATTRIB1FVPROC __rglgen_glVertexAttrib1fv; +extern RGLSYMGLVERTEXATTRIB1SPROC __rglgen_glVertexAttrib1s; +extern RGLSYMGLVERTEXATTRIB1SVPROC __rglgen_glVertexAttrib1sv; +extern RGLSYMGLVERTEXATTRIB2DPROC __rglgen_glVertexAttrib2d; +extern RGLSYMGLVERTEXATTRIB2DVPROC __rglgen_glVertexAttrib2dv; +extern RGLSYMGLVERTEXATTRIB2FPROC __rglgen_glVertexAttrib2f; +extern RGLSYMGLVERTEXATTRIB2FVPROC __rglgen_glVertexAttrib2fv; +extern RGLSYMGLVERTEXATTRIB2SPROC __rglgen_glVertexAttrib2s; +extern RGLSYMGLVERTEXATTRIB2SVPROC __rglgen_glVertexAttrib2sv; +extern RGLSYMGLVERTEXATTRIB3DPROC __rglgen_glVertexAttrib3d; +extern RGLSYMGLVERTEXATTRIB3DVPROC __rglgen_glVertexAttrib3dv; +extern RGLSYMGLVERTEXATTRIB3FPROC __rglgen_glVertexAttrib3f; +extern RGLSYMGLVERTEXATTRIB3FVPROC __rglgen_glVertexAttrib3fv; +extern RGLSYMGLVERTEXATTRIB3SPROC __rglgen_glVertexAttrib3s; +extern RGLSYMGLVERTEXATTRIB3SVPROC __rglgen_glVertexAttrib3sv; +extern RGLSYMGLVERTEXATTRIB4NBVPROC __rglgen_glVertexAttrib4Nbv; +extern RGLSYMGLVERTEXATTRIB4NIVPROC __rglgen_glVertexAttrib4Niv; +extern RGLSYMGLVERTEXATTRIB4NSVPROC __rglgen_glVertexAttrib4Nsv; +extern RGLSYMGLVERTEXATTRIB4NUBPROC __rglgen_glVertexAttrib4Nub; +extern RGLSYMGLVERTEXATTRIB4NUBVPROC __rglgen_glVertexAttrib4Nubv; +extern RGLSYMGLVERTEXATTRIB4NUIVPROC __rglgen_glVertexAttrib4Nuiv; +extern RGLSYMGLVERTEXATTRIB4NUSVPROC __rglgen_glVertexAttrib4Nusv; +extern RGLSYMGLVERTEXATTRIB4BVPROC __rglgen_glVertexAttrib4bv; +extern RGLSYMGLVERTEXATTRIB4DPROC __rglgen_glVertexAttrib4d; +extern RGLSYMGLVERTEXATTRIB4DVPROC __rglgen_glVertexAttrib4dv; +extern RGLSYMGLVERTEXATTRIB4FPROC __rglgen_glVertexAttrib4f; +extern RGLSYMGLVERTEXATTRIB4FVPROC __rglgen_glVertexAttrib4fv; +extern RGLSYMGLVERTEXATTRIB4IVPROC __rglgen_glVertexAttrib4iv; +extern RGLSYMGLVERTEXATTRIB4SPROC __rglgen_glVertexAttrib4s; +extern RGLSYMGLVERTEXATTRIB4SVPROC __rglgen_glVertexAttrib4sv; +extern RGLSYMGLVERTEXATTRIB4UBVPROC __rglgen_glVertexAttrib4ubv; +extern RGLSYMGLVERTEXATTRIB4UIVPROC __rglgen_glVertexAttrib4uiv; +extern RGLSYMGLVERTEXATTRIB4USVPROC __rglgen_glVertexAttrib4usv; +extern RGLSYMGLVERTEXATTRIBPOINTERPROC __rglgen_glVertexAttribPointer; +extern RGLSYMGLUNIFORMMATRIX2X3FVPROC __rglgen_glUniformMatrix2x3fv; +extern RGLSYMGLUNIFORMMATRIX3X2FVPROC __rglgen_glUniformMatrix3x2fv; +extern RGLSYMGLUNIFORMMATRIX2X4FVPROC __rglgen_glUniformMatrix2x4fv; +extern RGLSYMGLUNIFORMMATRIX4X2FVPROC __rglgen_glUniformMatrix4x2fv; +extern RGLSYMGLUNIFORMMATRIX3X4FVPROC __rglgen_glUniformMatrix3x4fv; +extern RGLSYMGLUNIFORMMATRIX4X3FVPROC __rglgen_glUniformMatrix4x3fv; +extern RGLSYMGLCOLORMASKIPROC __rglgen_glColorMaski; +extern RGLSYMGLGETBOOLEANI_VPROC __rglgen_glGetBooleani_v; +extern RGLSYMGLGETINTEGERI_VPROC __rglgen_glGetIntegeri_v; +extern RGLSYMGLENABLEIPROC __rglgen_glEnablei; +extern RGLSYMGLDISABLEIPROC __rglgen_glDisablei; +extern RGLSYMGLISENABLEDIPROC __rglgen_glIsEnabledi; +extern RGLSYMGLBEGINTRANSFORMFEEDBACKPROC __rglgen_glBeginTransformFeedback; +extern RGLSYMGLENDTRANSFORMFEEDBACKPROC __rglgen_glEndTransformFeedback; +extern RGLSYMGLBINDBUFFERRANGEPROC __rglgen_glBindBufferRange; +extern RGLSYMGLBINDBUFFERBASEPROC __rglgen_glBindBufferBase; +extern RGLSYMGLTRANSFORMFEEDBACKVARYINGSPROC __rglgen_glTransformFeedbackVaryings; +extern RGLSYMGLGETTRANSFORMFEEDBACKVARYINGPROC __rglgen_glGetTransformFeedbackVarying; +extern RGLSYMGLCLAMPCOLORPROC __rglgen_glClampColor; +extern RGLSYMGLBEGINCONDITIONALRENDERPROC __rglgen_glBeginConditionalRender; +extern RGLSYMGLENDCONDITIONALRENDERPROC __rglgen_glEndConditionalRender; +extern RGLSYMGLVERTEXATTRIBIPOINTERPROC __rglgen_glVertexAttribIPointer; +extern RGLSYMGLGETVERTEXATTRIBIIVPROC __rglgen_glGetVertexAttribIiv; +extern RGLSYMGLGETVERTEXATTRIBIUIVPROC __rglgen_glGetVertexAttribIuiv; +extern RGLSYMGLVERTEXATTRIBI1IPROC __rglgen_glVertexAttribI1i; +extern RGLSYMGLVERTEXATTRIBI2IPROC __rglgen_glVertexAttribI2i; +extern RGLSYMGLVERTEXATTRIBI3IPROC __rglgen_glVertexAttribI3i; +extern RGLSYMGLVERTEXATTRIBI4IPROC __rglgen_glVertexAttribI4i; +extern RGLSYMGLVERTEXATTRIBI1UIPROC __rglgen_glVertexAttribI1ui; +extern RGLSYMGLVERTEXATTRIBI2UIPROC __rglgen_glVertexAttribI2ui; +extern RGLSYMGLVERTEXATTRIBI3UIPROC __rglgen_glVertexAttribI3ui; +extern RGLSYMGLVERTEXATTRIBI4UIPROC __rglgen_glVertexAttribI4ui; +extern RGLSYMGLVERTEXATTRIBI1IVPROC __rglgen_glVertexAttribI1iv; +extern RGLSYMGLVERTEXATTRIBI2IVPROC __rglgen_glVertexAttribI2iv; +extern RGLSYMGLVERTEXATTRIBI3IVPROC __rglgen_glVertexAttribI3iv; +extern RGLSYMGLVERTEXATTRIBI4IVPROC __rglgen_glVertexAttribI4iv; +extern RGLSYMGLVERTEXATTRIBI1UIVPROC __rglgen_glVertexAttribI1uiv; +extern RGLSYMGLVERTEXATTRIBI2UIVPROC __rglgen_glVertexAttribI2uiv; +extern RGLSYMGLVERTEXATTRIBI3UIVPROC __rglgen_glVertexAttribI3uiv; +extern RGLSYMGLVERTEXATTRIBI4UIVPROC __rglgen_glVertexAttribI4uiv; +extern RGLSYMGLVERTEXATTRIBI4BVPROC __rglgen_glVertexAttribI4bv; +extern RGLSYMGLVERTEXATTRIBI4SVPROC __rglgen_glVertexAttribI4sv; +extern RGLSYMGLVERTEXATTRIBI4UBVPROC __rglgen_glVertexAttribI4ubv; +extern RGLSYMGLVERTEXATTRIBI4USVPROC __rglgen_glVertexAttribI4usv; +extern RGLSYMGLGETUNIFORMUIVPROC __rglgen_glGetUniformuiv; +extern RGLSYMGLBINDFRAGDATALOCATIONPROC __rglgen_glBindFragDataLocation; +extern RGLSYMGLGETFRAGDATALOCATIONPROC __rglgen_glGetFragDataLocation; +extern RGLSYMGLUNIFORM1UIPROC __rglgen_glUniform1ui; +extern RGLSYMGLUNIFORM2UIPROC __rglgen_glUniform2ui; +extern RGLSYMGLUNIFORM3UIPROC __rglgen_glUniform3ui; +extern RGLSYMGLUNIFORM4UIPROC __rglgen_glUniform4ui; +extern RGLSYMGLUNIFORM1UIVPROC __rglgen_glUniform1uiv; +extern RGLSYMGLUNIFORM2UIVPROC __rglgen_glUniform2uiv; +extern RGLSYMGLUNIFORM3UIVPROC __rglgen_glUniform3uiv; +extern RGLSYMGLUNIFORM4UIVPROC __rglgen_glUniform4uiv; +extern RGLSYMGLTEXPARAMETERIIVPROC __rglgen_glTexParameterIiv; +extern RGLSYMGLTEXPARAMETERIUIVPROC __rglgen_glTexParameterIuiv; +extern RGLSYMGLGETTEXPARAMETERIIVPROC __rglgen_glGetTexParameterIiv; +extern RGLSYMGLGETTEXPARAMETERIUIVPROC __rglgen_glGetTexParameterIuiv; +extern RGLSYMGLCLEARBUFFERIVPROC __rglgen_glClearBufferiv; +extern RGLSYMGLCLEARBUFFERUIVPROC __rglgen_glClearBufferuiv; +extern RGLSYMGLCLEARBUFFERFVPROC __rglgen_glClearBufferfv; +extern RGLSYMGLCLEARBUFFERFIPROC __rglgen_glClearBufferfi; +extern RGLSYMGLGETSTRINGIPROC __rglgen_glGetStringi; +extern RGLSYMGLISRENDERBUFFERPROC __rglgen_glIsRenderbuffer; +extern RGLSYMGLBINDRENDERBUFFERPROC __rglgen_glBindRenderbuffer; +extern RGLSYMGLDELETERENDERBUFFERSPROC __rglgen_glDeleteRenderbuffers; +extern RGLSYMGLGENRENDERBUFFERSPROC __rglgen_glGenRenderbuffers; +extern RGLSYMGLRENDERBUFFERSTORAGEPROC __rglgen_glRenderbufferStorage; +extern RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; +extern RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; +extern RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; +extern RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; +extern RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; +extern RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; +extern RGLSYMGLFRAMEBUFFERTEXTURE1DPROC __rglgen_glFramebufferTexture1D; +extern RGLSYMGLFRAMEBUFFERTEXTURE2DPROC __rglgen_glFramebufferTexture2D; +extern RGLSYMGLFRAMEBUFFERTEXTURE3DPROC __rglgen_glFramebufferTexture3D; +extern RGLSYMGLFRAMEBUFFERRENDERBUFFERPROC __rglgen_glFramebufferRenderbuffer; +extern RGLSYMGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __rglgen_glGetFramebufferAttachmentParameteriv; +extern RGLSYMGLGENERATEMIPMAPPROC __rglgen_glGenerateMipmap; +extern RGLSYMGLBLITFRAMEBUFFERPROC __rglgen_glBlitFramebuffer; +extern RGLSYMGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __rglgen_glRenderbufferStorageMultisample; +extern RGLSYMGLFRAMEBUFFERTEXTURELAYERPROC __rglgen_glFramebufferTextureLayer; +extern RGLSYMGLMAPBUFFERRANGEPROC __rglgen_glMapBufferRange; +extern RGLSYMGLFLUSHMAPPEDBUFFERRANGEPROC __rglgen_glFlushMappedBufferRange; +extern RGLSYMGLBINDVERTEXARRAYPROC __rglgen_glBindVertexArray; +extern RGLSYMGLDELETEVERTEXARRAYSPROC __rglgen_glDeleteVertexArrays; +extern RGLSYMGLGENVERTEXARRAYSPROC __rglgen_glGenVertexArrays; +extern RGLSYMGLISVERTEXARRAYPROC __rglgen_glIsVertexArray; +extern RGLSYMGLDRAWARRAYSINSTANCEDPROC __rglgen_glDrawArraysInstanced; +extern RGLSYMGLDRAWELEMENTSINSTANCEDPROC __rglgen_glDrawElementsInstanced; +extern RGLSYMGLTEXBUFFERPROC __rglgen_glTexBuffer; +extern RGLSYMGLPRIMITIVERESTARTINDEXPROC __rglgen_glPrimitiveRestartIndex; +extern RGLSYMGLCOPYBUFFERSUBDATAPROC __rglgen_glCopyBufferSubData; +extern RGLSYMGLGETUNIFORMINDICESPROC __rglgen_glGetUniformIndices; +extern RGLSYMGLGETACTIVEUNIFORMSIVPROC __rglgen_glGetActiveUniformsiv; +extern RGLSYMGLGETACTIVEUNIFORMNAMEPROC __rglgen_glGetActiveUniformName; +extern RGLSYMGLGETUNIFORMBLOCKINDEXPROC __rglgen_glGetUniformBlockIndex; +extern RGLSYMGLGETACTIVEUNIFORMBLOCKIVPROC __rglgen_glGetActiveUniformBlockiv; +extern RGLSYMGLGETACTIVEUNIFORMBLOCKNAMEPROC __rglgen_glGetActiveUniformBlockName; +extern RGLSYMGLUNIFORMBLOCKBINDINGPROC __rglgen_glUniformBlockBinding; +extern RGLSYMGLDRAWELEMENTSBASEVERTEXPROC __rglgen_glDrawElementsBaseVertex; +extern RGLSYMGLDRAWRANGEELEMENTSBASEVERTEXPROC __rglgen_glDrawRangeElementsBaseVertex; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __rglgen_glDrawElementsInstancedBaseVertex; +extern RGLSYMGLMULTIDRAWELEMENTSBASEVERTEXPROC __rglgen_glMultiDrawElementsBaseVertex; +extern RGLSYMGLPROVOKINGVERTEXPROC __rglgen_glProvokingVertex; +extern RGLSYMGLFENCESYNCPROC __rglgen_glFenceSync; +extern RGLSYMGLISSYNCPROC __rglgen_glIsSync; +extern RGLSYMGLDELETESYNCPROC __rglgen_glDeleteSync; +extern RGLSYMGLCLIENTWAITSYNCPROC __rglgen_glClientWaitSync; +extern RGLSYMGLWAITSYNCPROC __rglgen_glWaitSync; +extern RGLSYMGLGETINTEGER64VPROC __rglgen_glGetInteger64v; +extern RGLSYMGLGETSYNCIVPROC __rglgen_glGetSynciv; +extern RGLSYMGLGETINTEGER64I_VPROC __rglgen_glGetInteger64i_v; +extern RGLSYMGLGETBUFFERPARAMETERI64VPROC __rglgen_glGetBufferParameteri64v; +extern RGLSYMGLFRAMEBUFFERTEXTUREPROC __rglgen_glFramebufferTexture; +extern RGLSYMGLTEXIMAGE2DMULTISAMPLEPROC __rglgen_glTexImage2DMultisample; +extern RGLSYMGLTEXIMAGE3DMULTISAMPLEPROC __rglgen_glTexImage3DMultisample; +extern RGLSYMGLGETMULTISAMPLEFVPROC __rglgen_glGetMultisamplefv; +extern RGLSYMGLSAMPLEMASKIPROC __rglgen_glSampleMaski; +extern RGLSYMGLBINDFRAGDATALOCATIONINDEXEDPROC __rglgen_glBindFragDataLocationIndexed; +extern RGLSYMGLGETFRAGDATAINDEXPROC __rglgen_glGetFragDataIndex; +extern RGLSYMGLGENSAMPLERSPROC __rglgen_glGenSamplers; +extern RGLSYMGLDELETESAMPLERSPROC __rglgen_glDeleteSamplers; +extern RGLSYMGLISSAMPLERPROC __rglgen_glIsSampler; +extern RGLSYMGLBINDSAMPLERPROC __rglgen_glBindSampler; +extern RGLSYMGLSAMPLERPARAMETERIPROC __rglgen_glSamplerParameteri; +extern RGLSYMGLSAMPLERPARAMETERIVPROC __rglgen_glSamplerParameteriv; +extern RGLSYMGLSAMPLERPARAMETERFPROC __rglgen_glSamplerParameterf; +extern RGLSYMGLSAMPLERPARAMETERFVPROC __rglgen_glSamplerParameterfv; +extern RGLSYMGLSAMPLERPARAMETERIIVPROC __rglgen_glSamplerParameterIiv; +extern RGLSYMGLSAMPLERPARAMETERIUIVPROC __rglgen_glSamplerParameterIuiv; +extern RGLSYMGLGETSAMPLERPARAMETERIVPROC __rglgen_glGetSamplerParameteriv; +extern RGLSYMGLGETSAMPLERPARAMETERIIVPROC __rglgen_glGetSamplerParameterIiv; +extern RGLSYMGLGETSAMPLERPARAMETERFVPROC __rglgen_glGetSamplerParameterfv; +extern RGLSYMGLGETSAMPLERPARAMETERIUIVPROC __rglgen_glGetSamplerParameterIuiv; +extern RGLSYMGLQUERYCOUNTERPROC __rglgen_glQueryCounter; +extern RGLSYMGLGETQUERYOBJECTI64VPROC __rglgen_glGetQueryObjecti64v; +extern RGLSYMGLGETQUERYOBJECTUI64VPROC __rglgen_glGetQueryObjectui64v; +extern RGLSYMGLVERTEXATTRIBDIVISORPROC __rglgen_glVertexAttribDivisor; +extern RGLSYMGLVERTEXATTRIBP1UIPROC __rglgen_glVertexAttribP1ui; +extern RGLSYMGLVERTEXATTRIBP1UIVPROC __rglgen_glVertexAttribP1uiv; +extern RGLSYMGLVERTEXATTRIBP2UIPROC __rglgen_glVertexAttribP2ui; +extern RGLSYMGLVERTEXATTRIBP2UIVPROC __rglgen_glVertexAttribP2uiv; +extern RGLSYMGLVERTEXATTRIBP3UIPROC __rglgen_glVertexAttribP3ui; +extern RGLSYMGLVERTEXATTRIBP3UIVPROC __rglgen_glVertexAttribP3uiv; +extern RGLSYMGLVERTEXATTRIBP4UIPROC __rglgen_glVertexAttribP4ui; +extern RGLSYMGLVERTEXATTRIBP4UIVPROC __rglgen_glVertexAttribP4uiv; +extern RGLSYMGLVERTEXP2UIPROC __rglgen_glVertexP2ui; +extern RGLSYMGLVERTEXP2UIVPROC __rglgen_glVertexP2uiv; +extern RGLSYMGLVERTEXP3UIPROC __rglgen_glVertexP3ui; +extern RGLSYMGLVERTEXP3UIVPROC __rglgen_glVertexP3uiv; +extern RGLSYMGLVERTEXP4UIPROC __rglgen_glVertexP4ui; +extern RGLSYMGLVERTEXP4UIVPROC __rglgen_glVertexP4uiv; +extern RGLSYMGLTEXCOORDP1UIPROC __rglgen_glTexCoordP1ui; +extern RGLSYMGLTEXCOORDP1UIVPROC __rglgen_glTexCoordP1uiv; +extern RGLSYMGLTEXCOORDP2UIPROC __rglgen_glTexCoordP2ui; +extern RGLSYMGLTEXCOORDP2UIVPROC __rglgen_glTexCoordP2uiv; +extern RGLSYMGLTEXCOORDP3UIPROC __rglgen_glTexCoordP3ui; +extern RGLSYMGLTEXCOORDP3UIVPROC __rglgen_glTexCoordP3uiv; +extern RGLSYMGLTEXCOORDP4UIPROC __rglgen_glTexCoordP4ui; +extern RGLSYMGLTEXCOORDP4UIVPROC __rglgen_glTexCoordP4uiv; +extern RGLSYMGLMULTITEXCOORDP1UIPROC __rglgen_glMultiTexCoordP1ui; +extern RGLSYMGLMULTITEXCOORDP1UIVPROC __rglgen_glMultiTexCoordP1uiv; +extern RGLSYMGLMULTITEXCOORDP2UIPROC __rglgen_glMultiTexCoordP2ui; +extern RGLSYMGLMULTITEXCOORDP2UIVPROC __rglgen_glMultiTexCoordP2uiv; +extern RGLSYMGLMULTITEXCOORDP3UIPROC __rglgen_glMultiTexCoordP3ui; +extern RGLSYMGLMULTITEXCOORDP3UIVPROC __rglgen_glMultiTexCoordP3uiv; +extern RGLSYMGLMULTITEXCOORDP4UIPROC __rglgen_glMultiTexCoordP4ui; +extern RGLSYMGLMULTITEXCOORDP4UIVPROC __rglgen_glMultiTexCoordP4uiv; +extern RGLSYMGLNORMALP3UIPROC __rglgen_glNormalP3ui; +extern RGLSYMGLNORMALP3UIVPROC __rglgen_glNormalP3uiv; +extern RGLSYMGLCOLORP3UIPROC __rglgen_glColorP3ui; +extern RGLSYMGLCOLORP3UIVPROC __rglgen_glColorP3uiv; +extern RGLSYMGLCOLORP4UIPROC __rglgen_glColorP4ui; +extern RGLSYMGLCOLORP4UIVPROC __rglgen_glColorP4uiv; +extern RGLSYMGLSECONDARYCOLORP3UIPROC __rglgen_glSecondaryColorP3ui; +extern RGLSYMGLSECONDARYCOLORP3UIVPROC __rglgen_glSecondaryColorP3uiv; +extern RGLSYMGLMINSAMPLESHADINGPROC __rglgen_glMinSampleShading; +extern RGLSYMGLBLENDEQUATIONIPROC __rglgen_glBlendEquationi; +extern RGLSYMGLBLENDEQUATIONSEPARATEIPROC __rglgen_glBlendEquationSeparatei; +extern RGLSYMGLBLENDFUNCIPROC __rglgen_glBlendFunci; +extern RGLSYMGLBLENDFUNCSEPARATEIPROC __rglgen_glBlendFuncSeparatei; +extern RGLSYMGLDRAWARRAYSINDIRECTPROC __rglgen_glDrawArraysIndirect; +extern RGLSYMGLDRAWELEMENTSINDIRECTPROC __rglgen_glDrawElementsIndirect; +extern RGLSYMGLUNIFORM1DPROC __rglgen_glUniform1d; +extern RGLSYMGLUNIFORM2DPROC __rglgen_glUniform2d; +extern RGLSYMGLUNIFORM3DPROC __rglgen_glUniform3d; +extern RGLSYMGLUNIFORM4DPROC __rglgen_glUniform4d; +extern RGLSYMGLUNIFORM1DVPROC __rglgen_glUniform1dv; +extern RGLSYMGLUNIFORM2DVPROC __rglgen_glUniform2dv; +extern RGLSYMGLUNIFORM3DVPROC __rglgen_glUniform3dv; +extern RGLSYMGLUNIFORM4DVPROC __rglgen_glUniform4dv; +extern RGLSYMGLUNIFORMMATRIX2DVPROC __rglgen_glUniformMatrix2dv; +extern RGLSYMGLUNIFORMMATRIX3DVPROC __rglgen_glUniformMatrix3dv; +extern RGLSYMGLUNIFORMMATRIX4DVPROC __rglgen_glUniformMatrix4dv; +extern RGLSYMGLUNIFORMMATRIX2X3DVPROC __rglgen_glUniformMatrix2x3dv; +extern RGLSYMGLUNIFORMMATRIX2X4DVPROC __rglgen_glUniformMatrix2x4dv; +extern RGLSYMGLUNIFORMMATRIX3X2DVPROC __rglgen_glUniformMatrix3x2dv; +extern RGLSYMGLUNIFORMMATRIX3X4DVPROC __rglgen_glUniformMatrix3x4dv; +extern RGLSYMGLUNIFORMMATRIX4X2DVPROC __rglgen_glUniformMatrix4x2dv; +extern RGLSYMGLUNIFORMMATRIX4X3DVPROC __rglgen_glUniformMatrix4x3dv; +extern RGLSYMGLGETUNIFORMDVPROC __rglgen_glGetUniformdv; +extern RGLSYMGLGETSUBROUTINEUNIFORMLOCATIONPROC __rglgen_glGetSubroutineUniformLocation; +extern RGLSYMGLGETSUBROUTINEINDEXPROC __rglgen_glGetSubroutineIndex; +extern RGLSYMGLGETACTIVESUBROUTINEUNIFORMIVPROC __rglgen_glGetActiveSubroutineUniformiv; +extern RGLSYMGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __rglgen_glGetActiveSubroutineUniformName; +extern RGLSYMGLGETACTIVESUBROUTINENAMEPROC __rglgen_glGetActiveSubroutineName; +extern RGLSYMGLUNIFORMSUBROUTINESUIVPROC __rglgen_glUniformSubroutinesuiv; +extern RGLSYMGLGETUNIFORMSUBROUTINEUIVPROC __rglgen_glGetUniformSubroutineuiv; +extern RGLSYMGLGETPROGRAMSTAGEIVPROC __rglgen_glGetProgramStageiv; +extern RGLSYMGLPATCHPARAMETERIPROC __rglgen_glPatchParameteri; +extern RGLSYMGLPATCHPARAMETERFVPROC __rglgen_glPatchParameterfv; +extern RGLSYMGLBINDTRANSFORMFEEDBACKPROC __rglgen_glBindTransformFeedback; +extern RGLSYMGLDELETETRANSFORMFEEDBACKSPROC __rglgen_glDeleteTransformFeedbacks; +extern RGLSYMGLGENTRANSFORMFEEDBACKSPROC __rglgen_glGenTransformFeedbacks; +extern RGLSYMGLISTRANSFORMFEEDBACKPROC __rglgen_glIsTransformFeedback; +extern RGLSYMGLPAUSETRANSFORMFEEDBACKPROC __rglgen_glPauseTransformFeedback; +extern RGLSYMGLRESUMETRANSFORMFEEDBACKPROC __rglgen_glResumeTransformFeedback; +extern RGLSYMGLDRAWTRANSFORMFEEDBACKPROC __rglgen_glDrawTransformFeedback; +extern RGLSYMGLDRAWTRANSFORMFEEDBACKSTREAMPROC __rglgen_glDrawTransformFeedbackStream; +extern RGLSYMGLBEGINQUERYINDEXEDPROC __rglgen_glBeginQueryIndexed; +extern RGLSYMGLENDQUERYINDEXEDPROC __rglgen_glEndQueryIndexed; +extern RGLSYMGLGETQUERYINDEXEDIVPROC __rglgen_glGetQueryIndexediv; +extern RGLSYMGLRELEASESHADERCOMPILERPROC __rglgen_glReleaseShaderCompiler; +extern RGLSYMGLSHADERBINARYPROC __rglgen_glShaderBinary; +extern RGLSYMGLGETSHADERPRECISIONFORMATPROC __rglgen_glGetShaderPrecisionFormat; +extern RGLSYMGLDEPTHRANGEFPROC __rglgen_glDepthRangef; +extern RGLSYMGLCLEARDEPTHFPROC __rglgen_glClearDepthf; +extern RGLSYMGLGETPROGRAMBINARYPROC __rglgen_glGetProgramBinary; +extern RGLSYMGLPROGRAMBINARYPROC __rglgen_glProgramBinary; +extern RGLSYMGLPROGRAMPARAMETERIPROC __rglgen_glProgramParameteri; +extern RGLSYMGLUSEPROGRAMSTAGESPROC __rglgen_glUseProgramStages; +extern RGLSYMGLACTIVESHADERPROGRAMPROC __rglgen_glActiveShaderProgram; +extern RGLSYMGLCREATESHADERPROGRAMVPROC __rglgen_glCreateShaderProgramv; +extern RGLSYMGLBINDPROGRAMPIPELINEPROC __rglgen_glBindProgramPipeline; +extern RGLSYMGLDELETEPROGRAMPIPELINESPROC __rglgen_glDeleteProgramPipelines; +extern RGLSYMGLGENPROGRAMPIPELINESPROC __rglgen_glGenProgramPipelines; +extern RGLSYMGLISPROGRAMPIPELINEPROC __rglgen_glIsProgramPipeline; +extern RGLSYMGLGETPROGRAMPIPELINEIVPROC __rglgen_glGetProgramPipelineiv; +extern RGLSYMGLPROGRAMUNIFORM1IPROC __rglgen_glProgramUniform1i; +extern RGLSYMGLPROGRAMUNIFORM1IVPROC __rglgen_glProgramUniform1iv; +extern RGLSYMGLPROGRAMUNIFORM1FPROC __rglgen_glProgramUniform1f; +extern RGLSYMGLPROGRAMUNIFORM1FVPROC __rglgen_glProgramUniform1fv; +extern RGLSYMGLPROGRAMUNIFORM1DPROC __rglgen_glProgramUniform1d; +extern RGLSYMGLPROGRAMUNIFORM1DVPROC __rglgen_glProgramUniform1dv; +extern RGLSYMGLPROGRAMUNIFORM1UIPROC __rglgen_glProgramUniform1ui; +extern RGLSYMGLPROGRAMUNIFORM1UIVPROC __rglgen_glProgramUniform1uiv; +extern RGLSYMGLPROGRAMUNIFORM2IPROC __rglgen_glProgramUniform2i; +extern RGLSYMGLPROGRAMUNIFORM2IVPROC __rglgen_glProgramUniform2iv; +extern RGLSYMGLPROGRAMUNIFORM2FPROC __rglgen_glProgramUniform2f; +extern RGLSYMGLPROGRAMUNIFORM2FVPROC __rglgen_glProgramUniform2fv; +extern RGLSYMGLPROGRAMUNIFORM2DPROC __rglgen_glProgramUniform2d; +extern RGLSYMGLPROGRAMUNIFORM2DVPROC __rglgen_glProgramUniform2dv; +extern RGLSYMGLPROGRAMUNIFORM2UIPROC __rglgen_glProgramUniform2ui; +extern RGLSYMGLPROGRAMUNIFORM2UIVPROC __rglgen_glProgramUniform2uiv; +extern RGLSYMGLPROGRAMUNIFORM3IPROC __rglgen_glProgramUniform3i; +extern RGLSYMGLPROGRAMUNIFORM3IVPROC __rglgen_glProgramUniform3iv; +extern RGLSYMGLPROGRAMUNIFORM3FPROC __rglgen_glProgramUniform3f; +extern RGLSYMGLPROGRAMUNIFORM3FVPROC __rglgen_glProgramUniform3fv; +extern RGLSYMGLPROGRAMUNIFORM3DPROC __rglgen_glProgramUniform3d; +extern RGLSYMGLPROGRAMUNIFORM3DVPROC __rglgen_glProgramUniform3dv; +extern RGLSYMGLPROGRAMUNIFORM3UIPROC __rglgen_glProgramUniform3ui; +extern RGLSYMGLPROGRAMUNIFORM3UIVPROC __rglgen_glProgramUniform3uiv; +extern RGLSYMGLPROGRAMUNIFORM4IPROC __rglgen_glProgramUniform4i; +extern RGLSYMGLPROGRAMUNIFORM4IVPROC __rglgen_glProgramUniform4iv; +extern RGLSYMGLPROGRAMUNIFORM4FPROC __rglgen_glProgramUniform4f; +extern RGLSYMGLPROGRAMUNIFORM4FVPROC __rglgen_glProgramUniform4fv; +extern RGLSYMGLPROGRAMUNIFORM4DPROC __rglgen_glProgramUniform4d; +extern RGLSYMGLPROGRAMUNIFORM4DVPROC __rglgen_glProgramUniform4dv; +extern RGLSYMGLPROGRAMUNIFORM4UIPROC __rglgen_glProgramUniform4ui; +extern RGLSYMGLPROGRAMUNIFORM4UIVPROC __rglgen_glProgramUniform4uiv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2FVPROC __rglgen_glProgramUniformMatrix2fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3FVPROC __rglgen_glProgramUniformMatrix3fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4FVPROC __rglgen_glProgramUniformMatrix4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2DVPROC __rglgen_glProgramUniformMatrix2dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3DVPROC __rglgen_glProgramUniformMatrix3dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4DVPROC __rglgen_glProgramUniformMatrix4dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3FVPROC __rglgen_glProgramUniformMatrix2x3fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2FVPROC __rglgen_glProgramUniformMatrix3x2fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4FVPROC __rglgen_glProgramUniformMatrix2x4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2FVPROC __rglgen_glProgramUniformMatrix4x2fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4FVPROC __rglgen_glProgramUniformMatrix3x4fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3FVPROC __rglgen_glProgramUniformMatrix4x3fv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X3DVPROC __rglgen_glProgramUniformMatrix2x3dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X2DVPROC __rglgen_glProgramUniformMatrix3x2dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX2X4DVPROC __rglgen_glProgramUniformMatrix2x4dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X2DVPROC __rglgen_glProgramUniformMatrix4x2dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX3X4DVPROC __rglgen_glProgramUniformMatrix3x4dv; +extern RGLSYMGLPROGRAMUNIFORMMATRIX4X3DVPROC __rglgen_glProgramUniformMatrix4x3dv; +extern RGLSYMGLVALIDATEPROGRAMPIPELINEPROC __rglgen_glValidateProgramPipeline; +extern RGLSYMGLGETPROGRAMPIPELINEINFOLOGPROC __rglgen_glGetProgramPipelineInfoLog; +extern RGLSYMGLVERTEXATTRIBL1DPROC __rglgen_glVertexAttribL1d; +extern RGLSYMGLVERTEXATTRIBL2DPROC __rglgen_glVertexAttribL2d; +extern RGLSYMGLVERTEXATTRIBL3DPROC __rglgen_glVertexAttribL3d; +extern RGLSYMGLVERTEXATTRIBL4DPROC __rglgen_glVertexAttribL4d; +extern RGLSYMGLVERTEXATTRIBL1DVPROC __rglgen_glVertexAttribL1dv; +extern RGLSYMGLVERTEXATTRIBL2DVPROC __rglgen_glVertexAttribL2dv; +extern RGLSYMGLVERTEXATTRIBL3DVPROC __rglgen_glVertexAttribL3dv; +extern RGLSYMGLVERTEXATTRIBL4DVPROC __rglgen_glVertexAttribL4dv; +extern RGLSYMGLVERTEXATTRIBLPOINTERPROC __rglgen_glVertexAttribLPointer; +extern RGLSYMGLGETVERTEXATTRIBLDVPROC __rglgen_glGetVertexAttribLdv; +extern RGLSYMGLVIEWPORTARRAYVPROC __rglgen_glViewportArrayv; +extern RGLSYMGLVIEWPORTINDEXEDFPROC __rglgen_glViewportIndexedf; +extern RGLSYMGLVIEWPORTINDEXEDFVPROC __rglgen_glViewportIndexedfv; +extern RGLSYMGLSCISSORARRAYVPROC __rglgen_glScissorArrayv; +extern RGLSYMGLSCISSORINDEXEDPROC __rglgen_glScissorIndexed; +extern RGLSYMGLSCISSORINDEXEDVPROC __rglgen_glScissorIndexedv; +extern RGLSYMGLDEPTHRANGEARRAYVPROC __rglgen_glDepthRangeArrayv; +extern RGLSYMGLDEPTHRANGEINDEXEDPROC __rglgen_glDepthRangeIndexed; +extern RGLSYMGLGETFLOATI_VPROC __rglgen_glGetFloati_v; +extern RGLSYMGLGETDOUBLEI_VPROC __rglgen_glGetDoublei_v; +extern RGLSYMGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __rglgen_glDrawArraysInstancedBaseInstance; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __rglgen_glDrawElementsInstancedBaseInstance; +extern RGLSYMGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __rglgen_glDrawElementsInstancedBaseVertexBaseInstance; +extern RGLSYMGLGETINTERNALFORMATIVPROC __rglgen_glGetInternalformativ; +extern RGLSYMGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __rglgen_glGetActiveAtomicCounterBufferiv; +extern RGLSYMGLBINDIMAGETEXTUREPROC __rglgen_glBindImageTexture; +extern RGLSYMGLMEMORYBARRIERPROC __rglgen_glMemoryBarrier; +extern RGLSYMGLTEXSTORAGE1DPROC __rglgen_glTexStorage1D; +extern RGLSYMGLTEXSTORAGE2DPROC __rglgen_glTexStorage2D; +extern RGLSYMGLTEXSTORAGE3DPROC __rglgen_glTexStorage3D; +extern RGLSYMGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __rglgen_glDrawTransformFeedbackInstanced; +extern RGLSYMGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __rglgen_glDrawTransformFeedbackStreamInstanced; +extern RGLSYMGLCLEARBUFFERDATAPROC __rglgen_glClearBufferData; +extern RGLSYMGLCLEARBUFFERSUBDATAPROC __rglgen_glClearBufferSubData; +extern RGLSYMGLDISPATCHCOMPUTEPROC __rglgen_glDispatchCompute; +extern RGLSYMGLDISPATCHCOMPUTEINDIRECTPROC __rglgen_glDispatchComputeIndirect; +extern RGLSYMGLCOPYIMAGESUBDATAPROC __rglgen_glCopyImageSubData; +extern RGLSYMGLFRAMEBUFFERPARAMETERIPROC __rglgen_glFramebufferParameteri; +extern RGLSYMGLGETFRAMEBUFFERPARAMETERIVPROC __rglgen_glGetFramebufferParameteriv; +extern RGLSYMGLGETINTERNALFORMATI64VPROC __rglgen_glGetInternalformati64v; +extern RGLSYMGLINVALIDATETEXSUBIMAGEPROC __rglgen_glInvalidateTexSubImage; +extern RGLSYMGLINVALIDATETEXIMAGEPROC __rglgen_glInvalidateTexImage; +extern RGLSYMGLINVALIDATEBUFFERSUBDATAPROC __rglgen_glInvalidateBufferSubData; +extern RGLSYMGLINVALIDATEBUFFERDATAPROC __rglgen_glInvalidateBufferData; +extern RGLSYMGLINVALIDATEFRAMEBUFFERPROC __rglgen_glInvalidateFramebuffer; +extern RGLSYMGLINVALIDATESUBFRAMEBUFFERPROC __rglgen_glInvalidateSubFramebuffer; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTPROC __rglgen_glMultiDrawArraysIndirect; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTPROC __rglgen_glMultiDrawElementsIndirect; +extern RGLSYMGLGETPROGRAMINTERFACEIVPROC __rglgen_glGetProgramInterfaceiv; +extern RGLSYMGLGETPROGRAMRESOURCEINDEXPROC __rglgen_glGetProgramResourceIndex; +extern RGLSYMGLGETPROGRAMRESOURCENAMEPROC __rglgen_glGetProgramResourceName; +extern RGLSYMGLGETPROGRAMRESOURCEIVPROC __rglgen_glGetProgramResourceiv; +extern RGLSYMGLGETPROGRAMRESOURCELOCATIONPROC __rglgen_glGetProgramResourceLocation; +extern RGLSYMGLGETPROGRAMRESOURCELOCATIONINDEXPROC __rglgen_glGetProgramResourceLocationIndex; +extern RGLSYMGLSHADERSTORAGEBLOCKBINDINGPROC __rglgen_glShaderStorageBlockBinding; +extern RGLSYMGLTEXBUFFERRANGEPROC __rglgen_glTexBufferRange; +extern RGLSYMGLTEXSTORAGE2DMULTISAMPLEPROC __rglgen_glTexStorage2DMultisample; +extern RGLSYMGLTEXSTORAGE3DMULTISAMPLEPROC __rglgen_glTexStorage3DMultisample; +extern RGLSYMGLTEXTUREVIEWPROC __rglgen_glTextureView; +extern RGLSYMGLBINDVERTEXBUFFERPROC __rglgen_glBindVertexBuffer; +extern RGLSYMGLVERTEXATTRIBFORMATPROC __rglgen_glVertexAttribFormat; +extern RGLSYMGLVERTEXATTRIBIFORMATPROC __rglgen_glVertexAttribIFormat; +extern RGLSYMGLVERTEXATTRIBLFORMATPROC __rglgen_glVertexAttribLFormat; +extern RGLSYMGLVERTEXATTRIBBINDINGPROC __rglgen_glVertexAttribBinding; +extern RGLSYMGLVERTEXBINDINGDIVISORPROC __rglgen_glVertexBindingDivisor; +extern RGLSYMGLDEBUGMESSAGECONTROLPROC __rglgen_glDebugMessageControl; +extern RGLSYMGLDEBUGMESSAGEINSERTPROC __rglgen_glDebugMessageInsert; +extern RGLSYMGLDEBUGMESSAGECALLBACKPROC __rglgen_glDebugMessageCallback; +extern RGLSYMGLGETDEBUGMESSAGELOGPROC __rglgen_glGetDebugMessageLog; +extern RGLSYMGLPUSHDEBUGGROUPPROC __rglgen_glPushDebugGroup; +extern RGLSYMGLPOPDEBUGGROUPPROC __rglgen_glPopDebugGroup; +extern RGLSYMGLOBJECTLABELPROC __rglgen_glObjectLabel; +extern RGLSYMGLGETOBJECTLABELPROC __rglgen_glGetObjectLabel; +extern RGLSYMGLOBJECTPTRLABELPROC __rglgen_glObjectPtrLabel; +extern RGLSYMGLGETOBJECTPTRLABELPROC __rglgen_glGetObjectPtrLabel; +extern RGLSYMGLBUFFERSTORAGEPROC __rglgen_glBufferStorage; +extern RGLSYMGLCLEARTEXIMAGEPROC __rglgen_glClearTexImage; +extern RGLSYMGLCLEARTEXSUBIMAGEPROC __rglgen_glClearTexSubImage; +extern RGLSYMGLBINDBUFFERSBASEPROC __rglgen_glBindBuffersBase; +extern RGLSYMGLBINDBUFFERSRANGEPROC __rglgen_glBindBuffersRange; +extern RGLSYMGLBINDTEXTURESPROC __rglgen_glBindTextures; +extern RGLSYMGLBINDSAMPLERSPROC __rglgen_glBindSamplers; +extern RGLSYMGLBINDIMAGETEXTURESPROC __rglgen_glBindImageTextures; +extern RGLSYMGLBINDVERTEXBUFFERSPROC __rglgen_glBindVertexBuffers; +extern RGLSYMGLGETTEXTUREHANDLEARBPROC __rglgen_glGetTextureHandleARB; +extern RGLSYMGLGETTEXTURESAMPLERHANDLEARBPROC __rglgen_glGetTextureSamplerHandleARB; +extern RGLSYMGLMAKETEXTUREHANDLERESIDENTARBPROC __rglgen_glMakeTextureHandleResidentARB; +extern RGLSYMGLMAKETEXTUREHANDLENONRESIDENTARBPROC __rglgen_glMakeTextureHandleNonResidentARB; +extern RGLSYMGLGETIMAGEHANDLEARBPROC __rglgen_glGetImageHandleARB; +extern RGLSYMGLMAKEIMAGEHANDLERESIDENTARBPROC __rglgen_glMakeImageHandleResidentARB; +extern RGLSYMGLMAKEIMAGEHANDLENONRESIDENTARBPROC __rglgen_glMakeImageHandleNonResidentARB; +extern RGLSYMGLUNIFORMHANDLEUI64ARBPROC __rglgen_glUniformHandleui64ARB; +extern RGLSYMGLUNIFORMHANDLEUI64VARBPROC __rglgen_glUniformHandleui64vARB; +extern RGLSYMGLPROGRAMUNIFORMHANDLEUI64ARBPROC __rglgen_glProgramUniformHandleui64ARB; +extern RGLSYMGLPROGRAMUNIFORMHANDLEUI64VARBPROC __rglgen_glProgramUniformHandleui64vARB; +extern RGLSYMGLISTEXTUREHANDLERESIDENTARBPROC __rglgen_glIsTextureHandleResidentARB; +extern RGLSYMGLISIMAGEHANDLERESIDENTARBPROC __rglgen_glIsImageHandleResidentARB; +extern RGLSYMGLVERTEXATTRIBL1UI64ARBPROC __rglgen_glVertexAttribL1ui64ARB; +extern RGLSYMGLVERTEXATTRIBL1UI64VARBPROC __rglgen_glVertexAttribL1ui64vARB; +extern RGLSYMGLGETVERTEXATTRIBLUI64VARBPROC __rglgen_glGetVertexAttribLui64vARB; +extern RGLSYMGLCREATESYNCFROMCLEVENTARBPROC __rglgen_glCreateSyncFromCLeventARB; +extern RGLSYMGLCLAMPCOLORARBPROC __rglgen_glClampColorARB; +extern RGLSYMGLDISPATCHCOMPUTEGROUPSIZEARBPROC __rglgen_glDispatchComputeGroupSizeARB; +extern RGLSYMGLDEBUGMESSAGECONTROLARBPROC __rglgen_glDebugMessageControlARB; +extern RGLSYMGLDEBUGMESSAGEINSERTARBPROC __rglgen_glDebugMessageInsertARB; +extern RGLSYMGLDEBUGMESSAGECALLBACKARBPROC __rglgen_glDebugMessageCallbackARB; +extern RGLSYMGLGETDEBUGMESSAGELOGARBPROC __rglgen_glGetDebugMessageLogARB; +extern RGLSYMGLDRAWBUFFERSARBPROC __rglgen_glDrawBuffersARB; +extern RGLSYMGLBLENDEQUATIONIARBPROC __rglgen_glBlendEquationiARB; +extern RGLSYMGLBLENDEQUATIONSEPARATEIARBPROC __rglgen_glBlendEquationSeparateiARB; +extern RGLSYMGLBLENDFUNCIARBPROC __rglgen_glBlendFunciARB; +extern RGLSYMGLBLENDFUNCSEPARATEIARBPROC __rglgen_glBlendFuncSeparateiARB; +extern RGLSYMGLDRAWARRAYSINSTANCEDARBPROC __rglgen_glDrawArraysInstancedARB; +extern RGLSYMGLDRAWELEMENTSINSTANCEDARBPROC __rglgen_glDrawElementsInstancedARB; +extern RGLSYMGLPROGRAMSTRINGARBPROC __rglgen_glProgramStringARB; +extern RGLSYMGLBINDPROGRAMARBPROC __rglgen_glBindProgramARB; +extern RGLSYMGLDELETEPROGRAMSARBPROC __rglgen_glDeleteProgramsARB; +extern RGLSYMGLGENPROGRAMSARBPROC __rglgen_glGenProgramsARB; +extern RGLSYMGLPROGRAMENVPARAMETER4DARBPROC __rglgen_glProgramEnvParameter4dARB; +extern RGLSYMGLPROGRAMENVPARAMETER4DVARBPROC __rglgen_glProgramEnvParameter4dvARB; +extern RGLSYMGLPROGRAMENVPARAMETER4FARBPROC __rglgen_glProgramEnvParameter4fARB; +extern RGLSYMGLPROGRAMENVPARAMETER4FVARBPROC __rglgen_glProgramEnvParameter4fvARB; +extern RGLSYMGLPROGRAMLOCALPARAMETER4DARBPROC __rglgen_glProgramLocalParameter4dARB; +extern RGLSYMGLPROGRAMLOCALPARAMETER4DVARBPROC __rglgen_glProgramLocalParameter4dvARB; +extern RGLSYMGLPROGRAMLOCALPARAMETER4FARBPROC __rglgen_glProgramLocalParameter4fARB; +extern RGLSYMGLPROGRAMLOCALPARAMETER4FVARBPROC __rglgen_glProgramLocalParameter4fvARB; +extern RGLSYMGLGETPROGRAMENVPARAMETERDVARBPROC __rglgen_glGetProgramEnvParameterdvARB; +extern RGLSYMGLGETPROGRAMENVPARAMETERFVARBPROC __rglgen_glGetProgramEnvParameterfvARB; +extern RGLSYMGLGETPROGRAMLOCALPARAMETERDVARBPROC __rglgen_glGetProgramLocalParameterdvARB; +extern RGLSYMGLGETPROGRAMLOCALPARAMETERFVARBPROC __rglgen_glGetProgramLocalParameterfvARB; +extern RGLSYMGLGETPROGRAMIVARBPROC __rglgen_glGetProgramivARB; +extern RGLSYMGLGETPROGRAMSTRINGARBPROC __rglgen_glGetProgramStringARB; +extern RGLSYMGLISPROGRAMARBPROC __rglgen_glIsProgramARB; +extern RGLSYMGLPROGRAMPARAMETERIARBPROC __rglgen_glProgramParameteriARB; +extern RGLSYMGLFRAMEBUFFERTEXTUREARBPROC __rglgen_glFramebufferTextureARB; +extern RGLSYMGLFRAMEBUFFERTEXTURELAYERARBPROC __rglgen_glFramebufferTextureLayerARB; +extern RGLSYMGLFRAMEBUFFERTEXTUREFACEARBPROC __rglgen_glFramebufferTextureFaceARB; +extern RGLSYMGLCOLORTABLEPROC __rglgen_glColorTable; +extern RGLSYMGLCOLORTABLEPARAMETERFVPROC __rglgen_glColorTableParameterfv; +extern RGLSYMGLCOLORTABLEPARAMETERIVPROC __rglgen_glColorTableParameteriv; +extern RGLSYMGLCOPYCOLORTABLEPROC __rglgen_glCopyColorTable; +extern RGLSYMGLGETCOLORTABLEPROC __rglgen_glGetColorTable; +extern RGLSYMGLGETCOLORTABLEPARAMETERFVPROC __rglgen_glGetColorTableParameterfv; +extern RGLSYMGLGETCOLORTABLEPARAMETERIVPROC __rglgen_glGetColorTableParameteriv; +extern RGLSYMGLCOLORSUBTABLEPROC __rglgen_glColorSubTable; +extern RGLSYMGLCOPYCOLORSUBTABLEPROC __rglgen_glCopyColorSubTable; +extern RGLSYMGLCONVOLUTIONFILTER1DPROC __rglgen_glConvolutionFilter1D; +extern RGLSYMGLCONVOLUTIONFILTER2DPROC __rglgen_glConvolutionFilter2D; +extern RGLSYMGLCONVOLUTIONPARAMETERFPROC __rglgen_glConvolutionParameterf; +extern RGLSYMGLCONVOLUTIONPARAMETERFVPROC __rglgen_glConvolutionParameterfv; +extern RGLSYMGLCONVOLUTIONPARAMETERIPROC __rglgen_glConvolutionParameteri; +extern RGLSYMGLCONVOLUTIONPARAMETERIVPROC __rglgen_glConvolutionParameteriv; +extern RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC __rglgen_glCopyConvolutionFilter1D; +extern RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC __rglgen_glCopyConvolutionFilter2D; +extern RGLSYMGLGETCONVOLUTIONFILTERPROC __rglgen_glGetConvolutionFilter; +extern RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC __rglgen_glGetConvolutionParameterfv; +extern RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC __rglgen_glGetConvolutionParameteriv; +extern RGLSYMGLGETSEPARABLEFILTERPROC __rglgen_glGetSeparableFilter; +extern RGLSYMGLSEPARABLEFILTER2DPROC __rglgen_glSeparableFilter2D; +extern RGLSYMGLGETHISTOGRAMPROC __rglgen_glGetHistogram; +extern RGLSYMGLGETHISTOGRAMPARAMETERFVPROC __rglgen_glGetHistogramParameterfv; +extern RGLSYMGLGETHISTOGRAMPARAMETERIVPROC __rglgen_glGetHistogramParameteriv; +extern RGLSYMGLGETMINMAXPROC __rglgen_glGetMinmax; +extern RGLSYMGLGETMINMAXPARAMETERFVPROC __rglgen_glGetMinmaxParameterfv; +extern RGLSYMGLGETMINMAXPARAMETERIVPROC __rglgen_glGetMinmaxParameteriv; +extern RGLSYMGLHISTOGRAMPROC __rglgen_glHistogram; +extern RGLSYMGLMINMAXPROC __rglgen_glMinmax; +extern RGLSYMGLRESETHISTOGRAMPROC __rglgen_glResetHistogram; +extern RGLSYMGLRESETMINMAXPROC __rglgen_glResetMinmax; +extern RGLSYMGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawArraysIndirectCountARB; +extern RGLSYMGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __rglgen_glMultiDrawElementsIndirectCountARB; +extern RGLSYMGLVERTEXATTRIBDIVISORARBPROC __rglgen_glVertexAttribDivisorARB; +extern RGLSYMGLCURRENTPALETTEMATRIXARBPROC __rglgen_glCurrentPaletteMatrixARB; +extern RGLSYMGLMATRIXINDEXUBVARBPROC __rglgen_glMatrixIndexubvARB; +extern RGLSYMGLMATRIXINDEXUSVARBPROC __rglgen_glMatrixIndexusvARB; +extern RGLSYMGLMATRIXINDEXUIVARBPROC __rglgen_glMatrixIndexuivARB; +extern RGLSYMGLMATRIXINDEXPOINTERARBPROC __rglgen_glMatrixIndexPointerARB; +extern RGLSYMGLSAMPLECOVERAGEARBPROC __rglgen_glSampleCoverageARB; +extern RGLSYMGLACTIVETEXTUREARBPROC __rglgen_glActiveTextureARB; +extern RGLSYMGLCLIENTACTIVETEXTUREARBPROC __rglgen_glClientActiveTextureARB; +extern RGLSYMGLMULTITEXCOORD1DARBPROC __rglgen_glMultiTexCoord1dARB; +extern RGLSYMGLMULTITEXCOORD1DVARBPROC __rglgen_glMultiTexCoord1dvARB; +extern RGLSYMGLMULTITEXCOORD1FARBPROC __rglgen_glMultiTexCoord1fARB; +extern RGLSYMGLMULTITEXCOORD1FVARBPROC __rglgen_glMultiTexCoord1fvARB; +extern RGLSYMGLMULTITEXCOORD1IARBPROC __rglgen_glMultiTexCoord1iARB; +extern RGLSYMGLMULTITEXCOORD1IVARBPROC __rglgen_glMultiTexCoord1ivARB; +extern RGLSYMGLMULTITEXCOORD1SARBPROC __rglgen_glMultiTexCoord1sARB; +extern RGLSYMGLMULTITEXCOORD1SVARBPROC __rglgen_glMultiTexCoord1svARB; +extern RGLSYMGLMULTITEXCOORD2DARBPROC __rglgen_glMultiTexCoord2dARB; +extern RGLSYMGLMULTITEXCOORD2DVARBPROC __rglgen_glMultiTexCoord2dvARB; +extern RGLSYMGLMULTITEXCOORD2FARBPROC __rglgen_glMultiTexCoord2fARB; +extern RGLSYMGLMULTITEXCOORD2FVARBPROC __rglgen_glMultiTexCoord2fvARB; +extern RGLSYMGLMULTITEXCOORD2IARBPROC __rglgen_glMultiTexCoord2iARB; +extern RGLSYMGLMULTITEXCOORD2IVARBPROC __rglgen_glMultiTexCoord2ivARB; +extern RGLSYMGLMULTITEXCOORD2SARBPROC __rglgen_glMultiTexCoord2sARB; +extern RGLSYMGLMULTITEXCOORD2SVARBPROC __rglgen_glMultiTexCoord2svARB; +extern RGLSYMGLMULTITEXCOORD3DARBPROC __rglgen_glMultiTexCoord3dARB; +extern RGLSYMGLMULTITEXCOORD3DVARBPROC __rglgen_glMultiTexCoord3dvARB; +extern RGLSYMGLMULTITEXCOORD3FARBPROC __rglgen_glMultiTexCoord3fARB; +extern RGLSYMGLMULTITEXCOORD3FVARBPROC __rglgen_glMultiTexCoord3fvARB; +extern RGLSYMGLMULTITEXCOORD3IARBPROC __rglgen_glMultiTexCoord3iARB; +extern RGLSYMGLMULTITEXCOORD3IVARBPROC __rglgen_glMultiTexCoord3ivARB; +extern RGLSYMGLMULTITEXCOORD3SARBPROC __rglgen_glMultiTexCoord3sARB; +extern RGLSYMGLMULTITEXCOORD3SVARBPROC __rglgen_glMultiTexCoord3svARB; +extern RGLSYMGLMULTITEXCOORD4DARBPROC __rglgen_glMultiTexCoord4dARB; +extern RGLSYMGLMULTITEXCOORD4DVARBPROC __rglgen_glMultiTexCoord4dvARB; +extern RGLSYMGLMULTITEXCOORD4FARBPROC __rglgen_glMultiTexCoord4fARB; +extern RGLSYMGLMULTITEXCOORD4FVARBPROC __rglgen_glMultiTexCoord4fvARB; +extern RGLSYMGLMULTITEXCOORD4IARBPROC __rglgen_glMultiTexCoord4iARB; +extern RGLSYMGLMULTITEXCOORD4IVARBPROC __rglgen_glMultiTexCoord4ivARB; +extern RGLSYMGLMULTITEXCOORD4SARBPROC __rglgen_glMultiTexCoord4sARB; +extern RGLSYMGLMULTITEXCOORD4SVARBPROC __rglgen_glMultiTexCoord4svARB; +extern RGLSYMGLGENQUERIESARBPROC __rglgen_glGenQueriesARB; +extern RGLSYMGLDELETEQUERIESARBPROC __rglgen_glDeleteQueriesARB; +extern RGLSYMGLISQUERYARBPROC __rglgen_glIsQueryARB; +extern RGLSYMGLBEGINQUERYARBPROC __rglgen_glBeginQueryARB; +extern RGLSYMGLENDQUERYARBPROC __rglgen_glEndQueryARB; +extern RGLSYMGLGETQUERYIVARBPROC __rglgen_glGetQueryivARB; +extern RGLSYMGLGETQUERYOBJECTIVARBPROC __rglgen_glGetQueryObjectivARB; +extern RGLSYMGLGETQUERYOBJECTUIVARBPROC __rglgen_glGetQueryObjectuivARB; +extern RGLSYMGLPOINTPARAMETERFARBPROC __rglgen_glPointParameterfARB; +extern RGLSYMGLPOINTPARAMETERFVARBPROC __rglgen_glPointParameterfvARB; +extern RGLSYMGLGETGRAPHICSRESETSTATUSARBPROC __rglgen_glGetGraphicsResetStatusARB; +extern RGLSYMGLGETNTEXIMAGEARBPROC __rglgen_glGetnTexImageARB; +extern RGLSYMGLREADNPIXELSARBPROC __rglgen_glReadnPixelsARB; +extern RGLSYMGLGETNCOMPRESSEDTEXIMAGEARBPROC __rglgen_glGetnCompressedTexImageARB; +extern RGLSYMGLGETNUNIFORMFVARBPROC __rglgen_glGetnUniformfvARB; +extern RGLSYMGLGETNUNIFORMIVARBPROC __rglgen_glGetnUniformivARB; +extern RGLSYMGLGETNUNIFORMUIVARBPROC __rglgen_glGetnUniformuivARB; +extern RGLSYMGLGETNUNIFORMDVARBPROC __rglgen_glGetnUniformdvARB; +extern RGLSYMGLGETNMAPDVARBPROC __rglgen_glGetnMapdvARB; +extern RGLSYMGLGETNMAPFVARBPROC __rglgen_glGetnMapfvARB; +extern RGLSYMGLGETNMAPIVARBPROC __rglgen_glGetnMapivARB; +extern RGLSYMGLGETNPIXELMAPFVARBPROC __rglgen_glGetnPixelMapfvARB; +extern RGLSYMGLGETNPIXELMAPUIVARBPROC __rglgen_glGetnPixelMapuivARB; +extern RGLSYMGLGETNPIXELMAPUSVARBPROC __rglgen_glGetnPixelMapusvARB; +extern RGLSYMGLGETNPOLYGONSTIPPLEARBPROC __rglgen_glGetnPolygonStippleARB; +extern RGLSYMGLGETNCOLORTABLEARBPROC __rglgen_glGetnColorTableARB; +extern RGLSYMGLGETNCONVOLUTIONFILTERARBPROC __rglgen_glGetnConvolutionFilterARB; +extern RGLSYMGLGETNSEPARABLEFILTERARBPROC __rglgen_glGetnSeparableFilterARB; +extern RGLSYMGLGETNHISTOGRAMARBPROC __rglgen_glGetnHistogramARB; +extern RGLSYMGLGETNMINMAXARBPROC __rglgen_glGetnMinmaxARB; +extern RGLSYMGLMINSAMPLESHADINGARBPROC __rglgen_glMinSampleShadingARB; +extern RGLSYMGLDELETEOBJECTARBPROC __rglgen_glDeleteObjectARB; +extern RGLSYMGLGETHANDLEARBPROC __rglgen_glGetHandleARB; +extern RGLSYMGLDETACHOBJECTARBPROC __rglgen_glDetachObjectARB; +extern RGLSYMGLCREATESHADEROBJECTARBPROC __rglgen_glCreateShaderObjectARB; +extern RGLSYMGLSHADERSOURCEARBPROC __rglgen_glShaderSourceARB; +extern RGLSYMGLCOMPILESHADERARBPROC __rglgen_glCompileShaderARB; +extern RGLSYMGLCREATEPROGRAMOBJECTARBPROC __rglgen_glCreateProgramObjectARB; +extern RGLSYMGLATTACHOBJECTARBPROC __rglgen_glAttachObjectARB; +extern RGLSYMGLLINKPROGRAMARBPROC __rglgen_glLinkProgramARB; +extern RGLSYMGLUSEPROGRAMOBJECTARBPROC __rglgen_glUseProgramObjectARB; +extern RGLSYMGLVALIDATEPROGRAMARBPROC __rglgen_glValidateProgramARB; +extern RGLSYMGLUNIFORM1FARBPROC __rglgen_glUniform1fARB; +extern RGLSYMGLUNIFORM2FARBPROC __rglgen_glUniform2fARB; +extern RGLSYMGLUNIFORM3FARBPROC __rglgen_glUniform3fARB; +extern RGLSYMGLUNIFORM4FARBPROC __rglgen_glUniform4fARB; +extern RGLSYMGLUNIFORM1IARBPROC __rglgen_glUniform1iARB; +extern RGLSYMGLUNIFORM2IARBPROC __rglgen_glUniform2iARB; +extern RGLSYMGLUNIFORM3IARBPROC __rglgen_glUniform3iARB; +extern RGLSYMGLUNIFORM4IARBPROC __rglgen_glUniform4iARB; +extern RGLSYMGLUNIFORM1FVARBPROC __rglgen_glUniform1fvARB; +extern RGLSYMGLUNIFORM2FVARBPROC __rglgen_glUniform2fvARB; +extern RGLSYMGLUNIFORM3FVARBPROC __rglgen_glUniform3fvARB; +extern RGLSYMGLUNIFORM4FVARBPROC __rglgen_glUniform4fvARB; +extern RGLSYMGLUNIFORM1IVARBPROC __rglgen_glUniform1ivARB; +extern RGLSYMGLUNIFORM2IVARBPROC __rglgen_glUniform2ivARB; +extern RGLSYMGLUNIFORM3IVARBPROC __rglgen_glUniform3ivARB; +extern RGLSYMGLUNIFORM4IVARBPROC __rglgen_glUniform4ivARB; +extern RGLSYMGLUNIFORMMATRIX2FVARBPROC __rglgen_glUniformMatrix2fvARB; +extern RGLSYMGLUNIFORMMATRIX3FVARBPROC __rglgen_glUniformMatrix3fvARB; +extern RGLSYMGLUNIFORMMATRIX4FVARBPROC __rglgen_glUniformMatrix4fvARB; +extern RGLSYMGLGETOBJECTPARAMETERFVARBPROC __rglgen_glGetObjectParameterfvARB; +extern RGLSYMGLGETOBJECTPARAMETERIVARBPROC __rglgen_glGetObjectParameterivARB; +extern RGLSYMGLGETINFOLOGARBPROC __rglgen_glGetInfoLogARB; +extern RGLSYMGLGETATTACHEDOBJECTSARBPROC __rglgen_glGetAttachedObjectsARB; +extern RGLSYMGLGETUNIFORMLOCATIONARBPROC __rglgen_glGetUniformLocationARB; +extern RGLSYMGLGETACTIVEUNIFORMARBPROC __rglgen_glGetActiveUniformARB; +extern RGLSYMGLGETUNIFORMFVARBPROC __rglgen_glGetUniformfvARB; +extern RGLSYMGLGETUNIFORMIVARBPROC __rglgen_glGetUniformivARB; +extern RGLSYMGLGETSHADERSOURCEARBPROC __rglgen_glGetShaderSourceARB; +extern RGLSYMGLNAMEDSTRINGARBPROC __rglgen_glNamedStringARB; +extern RGLSYMGLDELETENAMEDSTRINGARBPROC __rglgen_glDeleteNamedStringARB; +extern RGLSYMGLCOMPILESHADERINCLUDEARBPROC __rglgen_glCompileShaderIncludeARB; +extern RGLSYMGLISNAMEDSTRINGARBPROC __rglgen_glIsNamedStringARB; +extern RGLSYMGLGETNAMEDSTRINGARBPROC __rglgen_glGetNamedStringARB; +extern RGLSYMGLGETNAMEDSTRINGIVARBPROC __rglgen_glGetNamedStringivARB; +extern RGLSYMGLTEXPAGECOMMITMENTARBPROC __rglgen_glTexPageCommitmentARB; +extern RGLSYMGLTEXBUFFERARBPROC __rglgen_glTexBufferARB; +extern RGLSYMGLCOMPRESSEDTEXIMAGE3DARBPROC __rglgen_glCompressedTexImage3DARB; +extern RGLSYMGLCOMPRESSEDTEXIMAGE2DARBPROC __rglgen_glCompressedTexImage2DARB; +extern RGLSYMGLCOMPRESSEDTEXIMAGE1DARBPROC __rglgen_glCompressedTexImage1DARB; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __rglgen_glCompressedTexSubImage3DARB; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __rglgen_glCompressedTexSubImage2DARB; +extern RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __rglgen_glCompressedTexSubImage1DARB; +extern RGLSYMGLGETCOMPRESSEDTEXIMAGEARBPROC __rglgen_glGetCompressedTexImageARB; +extern RGLSYMGLLOADTRANSPOSEMATRIXFARBPROC __rglgen_glLoadTransposeMatrixfARB; +extern RGLSYMGLLOADTRANSPOSEMATRIXDARBPROC __rglgen_glLoadTransposeMatrixdARB; +extern RGLSYMGLMULTTRANSPOSEMATRIXFARBPROC __rglgen_glMultTransposeMatrixfARB; +extern RGLSYMGLMULTTRANSPOSEMATRIXDARBPROC __rglgen_glMultTransposeMatrixdARB; +extern RGLSYMGLWEIGHTBVARBPROC __rglgen_glWeightbvARB; +extern RGLSYMGLWEIGHTSVARBPROC __rglgen_glWeightsvARB; +extern RGLSYMGLWEIGHTIVARBPROC __rglgen_glWeightivARB; +extern RGLSYMGLWEIGHTFVARBPROC __rglgen_glWeightfvARB; +extern RGLSYMGLWEIGHTDVARBPROC __rglgen_glWeightdvARB; +extern RGLSYMGLWEIGHTUBVARBPROC __rglgen_glWeightubvARB; +extern RGLSYMGLWEIGHTUSVARBPROC __rglgen_glWeightusvARB; +extern RGLSYMGLWEIGHTUIVARBPROC __rglgen_glWeightuivARB; +extern RGLSYMGLWEIGHTPOINTERARBPROC __rglgen_glWeightPointerARB; +extern RGLSYMGLVERTEXBLENDARBPROC __rglgen_glVertexBlendARB; +extern RGLSYMGLBINDBUFFERARBPROC __rglgen_glBindBufferARB; +extern RGLSYMGLDELETEBUFFERSARBPROC __rglgen_glDeleteBuffersARB; +extern RGLSYMGLGENBUFFERSARBPROC __rglgen_glGenBuffersARB; +extern RGLSYMGLISBUFFERARBPROC __rglgen_glIsBufferARB; +extern RGLSYMGLBUFFERDATAARBPROC __rglgen_glBufferDataARB; +extern RGLSYMGLBUFFERSUBDATAARBPROC __rglgen_glBufferSubDataARB; +extern RGLSYMGLGETBUFFERSUBDATAARBPROC __rglgen_glGetBufferSubDataARB; +extern RGLSYMGLMAPBUFFERARBPROC __rglgen_glMapBufferARB; +extern RGLSYMGLUNMAPBUFFERARBPROC __rglgen_glUnmapBufferARB; +extern RGLSYMGLGETBUFFERPARAMETERIVARBPROC __rglgen_glGetBufferParameterivARB; +extern RGLSYMGLGETBUFFERPOINTERVARBPROC __rglgen_glGetBufferPointervARB; +extern RGLSYMGLVERTEXATTRIB1DARBPROC __rglgen_glVertexAttrib1dARB; +extern RGLSYMGLVERTEXATTRIB1DVARBPROC __rglgen_glVertexAttrib1dvARB; +extern RGLSYMGLVERTEXATTRIB1FARBPROC __rglgen_glVertexAttrib1fARB; +extern RGLSYMGLVERTEXATTRIB1FVARBPROC __rglgen_glVertexAttrib1fvARB; +extern RGLSYMGLVERTEXATTRIB1SARBPROC __rglgen_glVertexAttrib1sARB; +extern RGLSYMGLVERTEXATTRIB1SVARBPROC __rglgen_glVertexAttrib1svARB; +extern RGLSYMGLVERTEXATTRIB2DARBPROC __rglgen_glVertexAttrib2dARB; +extern RGLSYMGLVERTEXATTRIB2DVARBPROC __rglgen_glVertexAttrib2dvARB; +extern RGLSYMGLVERTEXATTRIB2FARBPROC __rglgen_glVertexAttrib2fARB; +extern RGLSYMGLVERTEXATTRIB2FVARBPROC __rglgen_glVertexAttrib2fvARB; +extern RGLSYMGLVERTEXATTRIB2SARBPROC __rglgen_glVertexAttrib2sARB; +extern RGLSYMGLVERTEXATTRIB2SVARBPROC __rglgen_glVertexAttrib2svARB; +extern RGLSYMGLVERTEXATTRIB3DARBPROC __rglgen_glVertexAttrib3dARB; +extern RGLSYMGLVERTEXATTRIB3DVARBPROC __rglgen_glVertexAttrib3dvARB; +extern RGLSYMGLVERTEXATTRIB3FARBPROC __rglgen_glVertexAttrib3fARB; +extern RGLSYMGLVERTEXATTRIB3FVARBPROC __rglgen_glVertexAttrib3fvARB; +extern RGLSYMGLVERTEXATTRIB3SARBPROC __rglgen_glVertexAttrib3sARB; +extern RGLSYMGLVERTEXATTRIB3SVARBPROC __rglgen_glVertexAttrib3svARB; +extern RGLSYMGLVERTEXATTRIB4NBVARBPROC __rglgen_glVertexAttrib4NbvARB; +extern RGLSYMGLVERTEXATTRIB4NIVARBPROC __rglgen_glVertexAttrib4NivARB; +extern RGLSYMGLVERTEXATTRIB4NSVARBPROC __rglgen_glVertexAttrib4NsvARB; +extern RGLSYMGLVERTEXATTRIB4NUBARBPROC __rglgen_glVertexAttrib4NubARB; +extern RGLSYMGLVERTEXATTRIB4NUBVARBPROC __rglgen_glVertexAttrib4NubvARB; +extern RGLSYMGLVERTEXATTRIB4NUIVARBPROC __rglgen_glVertexAttrib4NuivARB; +extern RGLSYMGLVERTEXATTRIB4NUSVARBPROC __rglgen_glVertexAttrib4NusvARB; +extern RGLSYMGLVERTEXATTRIB4BVARBPROC __rglgen_glVertexAttrib4bvARB; +extern RGLSYMGLVERTEXATTRIB4DARBPROC __rglgen_glVertexAttrib4dARB; +extern RGLSYMGLVERTEXATTRIB4DVARBPROC __rglgen_glVertexAttrib4dvARB; +extern RGLSYMGLVERTEXATTRIB4FARBPROC __rglgen_glVertexAttrib4fARB; +extern RGLSYMGLVERTEXATTRIB4FVARBPROC __rglgen_glVertexAttrib4fvARB; +extern RGLSYMGLVERTEXATTRIB4IVARBPROC __rglgen_glVertexAttrib4ivARB; +extern RGLSYMGLVERTEXATTRIB4SARBPROC __rglgen_glVertexAttrib4sARB; +extern RGLSYMGLVERTEXATTRIB4SVARBPROC __rglgen_glVertexAttrib4svARB; +extern RGLSYMGLVERTEXATTRIB4UBVARBPROC __rglgen_glVertexAttrib4ubvARB; +extern RGLSYMGLVERTEXATTRIB4UIVARBPROC __rglgen_glVertexAttrib4uivARB; +extern RGLSYMGLVERTEXATTRIB4USVARBPROC __rglgen_glVertexAttrib4usvARB; +extern RGLSYMGLVERTEXATTRIBPOINTERARBPROC __rglgen_glVertexAttribPointerARB; +extern RGLSYMGLENABLEVERTEXATTRIBARRAYARBPROC __rglgen_glEnableVertexAttribArrayARB; +extern RGLSYMGLDISABLEVERTEXATTRIBARRAYARBPROC __rglgen_glDisableVertexAttribArrayARB; +extern RGLSYMGLGETVERTEXATTRIBDVARBPROC __rglgen_glGetVertexAttribdvARB; +extern RGLSYMGLGETVERTEXATTRIBFVARBPROC __rglgen_glGetVertexAttribfvARB; +extern RGLSYMGLGETVERTEXATTRIBIVARBPROC __rglgen_glGetVertexAttribivARB; +extern RGLSYMGLGETVERTEXATTRIBPOINTERVARBPROC __rglgen_glGetVertexAttribPointervARB; +extern RGLSYMGLBINDATTRIBLOCATIONARBPROC __rglgen_glBindAttribLocationARB; +extern RGLSYMGLGETACTIVEATTRIBARBPROC __rglgen_glGetActiveAttribARB; +extern RGLSYMGLGETATTRIBLOCATIONARBPROC __rglgen_glGetAttribLocationARB; +extern RGLSYMGLWINDOWPOS2DARBPROC __rglgen_glWindowPos2dARB; +extern RGLSYMGLWINDOWPOS2DVARBPROC __rglgen_glWindowPos2dvARB; +extern RGLSYMGLWINDOWPOS2FARBPROC __rglgen_glWindowPos2fARB; +extern RGLSYMGLWINDOWPOS2FVARBPROC __rglgen_glWindowPos2fvARB; +extern RGLSYMGLWINDOWPOS2IARBPROC __rglgen_glWindowPos2iARB; +extern RGLSYMGLWINDOWPOS2IVARBPROC __rglgen_glWindowPos2ivARB; +extern RGLSYMGLWINDOWPOS2SARBPROC __rglgen_glWindowPos2sARB; +extern RGLSYMGLWINDOWPOS2SVARBPROC __rglgen_glWindowPos2svARB; +extern RGLSYMGLWINDOWPOS3DARBPROC __rglgen_glWindowPos3dARB; +extern RGLSYMGLWINDOWPOS3DVARBPROC __rglgen_glWindowPos3dvARB; +extern RGLSYMGLWINDOWPOS3FARBPROC __rglgen_glWindowPos3fARB; +extern RGLSYMGLWINDOWPOS3FVARBPROC __rglgen_glWindowPos3fvARB; +extern RGLSYMGLWINDOWPOS3IARBPROC __rglgen_glWindowPos3iARB; +extern RGLSYMGLWINDOWPOS3IVARBPROC __rglgen_glWindowPos3ivARB; +extern RGLSYMGLWINDOWPOS3SARBPROC __rglgen_glWindowPos3sARB; +extern RGLSYMGLWINDOWPOS3SVARBPROC __rglgen_glWindowPos3svARB; +extern RGLSYMGLMULTITEXCOORD1BOESPROC __rglgen_glMultiTexCoord1bOES; +extern RGLSYMGLMULTITEXCOORD1BVOESPROC __rglgen_glMultiTexCoord1bvOES; +extern RGLSYMGLMULTITEXCOORD2BOESPROC __rglgen_glMultiTexCoord2bOES; +extern RGLSYMGLMULTITEXCOORD2BVOESPROC __rglgen_glMultiTexCoord2bvOES; +extern RGLSYMGLMULTITEXCOORD3BOESPROC __rglgen_glMultiTexCoord3bOES; +extern RGLSYMGLMULTITEXCOORD3BVOESPROC __rglgen_glMultiTexCoord3bvOES; +extern RGLSYMGLMULTITEXCOORD4BOESPROC __rglgen_glMultiTexCoord4bOES; +extern RGLSYMGLMULTITEXCOORD4BVOESPROC __rglgen_glMultiTexCoord4bvOES; +extern RGLSYMGLTEXCOORD1BOESPROC __rglgen_glTexCoord1bOES; +extern RGLSYMGLTEXCOORD1BVOESPROC __rglgen_glTexCoord1bvOES; +extern RGLSYMGLTEXCOORD2BOESPROC __rglgen_glTexCoord2bOES; +extern RGLSYMGLTEXCOORD2BVOESPROC __rglgen_glTexCoord2bvOES; +extern RGLSYMGLTEXCOORD3BOESPROC __rglgen_glTexCoord3bOES; +extern RGLSYMGLTEXCOORD3BVOESPROC __rglgen_glTexCoord3bvOES; +extern RGLSYMGLTEXCOORD4BOESPROC __rglgen_glTexCoord4bOES; +extern RGLSYMGLTEXCOORD4BVOESPROC __rglgen_glTexCoord4bvOES; +extern RGLSYMGLVERTEX2BOESPROC __rglgen_glVertex2bOES; +extern RGLSYMGLVERTEX2BVOESPROC __rglgen_glVertex2bvOES; +extern RGLSYMGLVERTEX3BOESPROC __rglgen_glVertex3bOES; +extern RGLSYMGLVERTEX3BVOESPROC __rglgen_glVertex3bvOES; +extern RGLSYMGLVERTEX4BOESPROC __rglgen_glVertex4bOES; +extern RGLSYMGLVERTEX4BVOESPROC __rglgen_glVertex4bvOES; +extern RGLSYMGLALPHAFUNCXOESPROC __rglgen_glAlphaFuncxOES; +extern RGLSYMGLCLEARCOLORXOESPROC __rglgen_glClearColorxOES; +extern RGLSYMGLCLEARDEPTHXOESPROC __rglgen_glClearDepthxOES; +extern RGLSYMGLCLIPPLANEXOESPROC __rglgen_glClipPlanexOES; +extern RGLSYMGLCOLOR4XOESPROC __rglgen_glColor4xOES; +extern RGLSYMGLDEPTHRANGEXOESPROC __rglgen_glDepthRangexOES; +extern RGLSYMGLFOGXOESPROC __rglgen_glFogxOES; +extern RGLSYMGLFOGXVOESPROC __rglgen_glFogxvOES; +extern RGLSYMGLFRUSTUMXOESPROC __rglgen_glFrustumxOES; +extern RGLSYMGLGETCLIPPLANEXOESPROC __rglgen_glGetClipPlanexOES; +extern RGLSYMGLGETFIXEDVOESPROC __rglgen_glGetFixedvOES; +extern RGLSYMGLGETTEXENVXVOESPROC __rglgen_glGetTexEnvxvOES; +extern RGLSYMGLGETTEXPARAMETERXVOESPROC __rglgen_glGetTexParameterxvOES; +extern RGLSYMGLLIGHTMODELXOESPROC __rglgen_glLightModelxOES; +extern RGLSYMGLLIGHTMODELXVOESPROC __rglgen_glLightModelxvOES; +extern RGLSYMGLLIGHTXOESPROC __rglgen_glLightxOES; +extern RGLSYMGLLIGHTXVOESPROC __rglgen_glLightxvOES; +extern RGLSYMGLLINEWIDTHXOESPROC __rglgen_glLineWidthxOES; +extern RGLSYMGLLOADMATRIXXOESPROC __rglgen_glLoadMatrixxOES; +extern RGLSYMGLMATERIALXOESPROC __rglgen_glMaterialxOES; +extern RGLSYMGLMATERIALXVOESPROC __rglgen_glMaterialxvOES; +extern RGLSYMGLMULTMATRIXXOESPROC __rglgen_glMultMatrixxOES; +extern RGLSYMGLMULTITEXCOORD4XOESPROC __rglgen_glMultiTexCoord4xOES; +extern RGLSYMGLNORMAL3XOESPROC __rglgen_glNormal3xOES; +extern RGLSYMGLORTHOXOESPROC __rglgen_glOrthoxOES; +extern RGLSYMGLPOINTPARAMETERXVOESPROC __rglgen_glPointParameterxvOES; +extern RGLSYMGLPOINTSIZEXOESPROC __rglgen_glPointSizexOES; +extern RGLSYMGLPOLYGONOFFSETXOESPROC __rglgen_glPolygonOffsetxOES; +extern RGLSYMGLROTATEXOESPROC __rglgen_glRotatexOES; +extern RGLSYMGLSAMPLECOVERAGEOESPROC __rglgen_glSampleCoverageOES; +extern RGLSYMGLSCALEXOESPROC __rglgen_glScalexOES; +extern RGLSYMGLTEXENVXOESPROC __rglgen_glTexEnvxOES; +extern RGLSYMGLTEXENVXVOESPROC __rglgen_glTexEnvxvOES; +extern RGLSYMGLTEXPARAMETERXOESPROC __rglgen_glTexParameterxOES; +extern RGLSYMGLTEXPARAMETERXVOESPROC __rglgen_glTexParameterxvOES; +extern RGLSYMGLTRANSLATEXOESPROC __rglgen_glTranslatexOES; +extern RGLSYMGLACCUMXOESPROC __rglgen_glAccumxOES; +extern RGLSYMGLBITMAPXOESPROC __rglgen_glBitmapxOES; +extern RGLSYMGLBLENDCOLORXOESPROC __rglgen_glBlendColorxOES; +extern RGLSYMGLCLEARACCUMXOESPROC __rglgen_glClearAccumxOES; +extern RGLSYMGLCOLOR3XOESPROC __rglgen_glColor3xOES; +extern RGLSYMGLCOLOR3XVOESPROC __rglgen_glColor3xvOES; +extern RGLSYMGLCOLOR4XVOESPROC __rglgen_glColor4xvOES; +extern RGLSYMGLCONVOLUTIONPARAMETERXOESPROC __rglgen_glConvolutionParameterxOES; +extern RGLSYMGLCONVOLUTIONPARAMETERXVOESPROC __rglgen_glConvolutionParameterxvOES; +extern RGLSYMGLEVALCOORD1XOESPROC __rglgen_glEvalCoord1xOES; +extern RGLSYMGLEVALCOORD1XVOESPROC __rglgen_glEvalCoord1xvOES; +extern RGLSYMGLEVALCOORD2XOESPROC __rglgen_glEvalCoord2xOES; +extern RGLSYMGLEVALCOORD2XVOESPROC __rglgen_glEvalCoord2xvOES; +extern RGLSYMGLFEEDBACKBUFFERXOESPROC __rglgen_glFeedbackBufferxOES; +extern RGLSYMGLGETCONVOLUTIONPARAMETERXVOESPROC __rglgen_glGetConvolutionParameterxvOES; +extern RGLSYMGLGETHISTOGRAMPARAMETERXVOESPROC __rglgen_glGetHistogramParameterxvOES; +extern RGLSYMGLGETLIGHTXOESPROC __rglgen_glGetLightxOES; +extern RGLSYMGLGETMAPXVOESPROC __rglgen_glGetMapxvOES; +extern RGLSYMGLGETMATERIALXOESPROC __rglgen_glGetMaterialxOES; +extern RGLSYMGLGETPIXELMAPXVPROC __rglgen_glGetPixelMapxv; +extern RGLSYMGLGETTEXGENXVOESPROC __rglgen_glGetTexGenxvOES; +extern RGLSYMGLGETTEXLEVELPARAMETERXVOESPROC __rglgen_glGetTexLevelParameterxvOES; +extern RGLSYMGLINDEXXOESPROC __rglgen_glIndexxOES; +extern RGLSYMGLINDEXXVOESPROC __rglgen_glIndexxvOES; +extern RGLSYMGLLOADTRANSPOSEMATRIXXOESPROC __rglgen_glLoadTransposeMatrixxOES; +extern RGLSYMGLMAP1XOESPROC __rglgen_glMap1xOES; +extern RGLSYMGLMAP2XOESPROC __rglgen_glMap2xOES; +extern RGLSYMGLMAPGRID1XOESPROC __rglgen_glMapGrid1xOES; +extern RGLSYMGLMAPGRID2XOESPROC __rglgen_glMapGrid2xOES; +extern RGLSYMGLMULTTRANSPOSEMATRIXXOESPROC __rglgen_glMultTransposeMatrixxOES; +extern RGLSYMGLMULTITEXCOORD1XOESPROC __rglgen_glMultiTexCoord1xOES; +extern RGLSYMGLMULTITEXCOORD1XVOESPROC __rglgen_glMultiTexCoord1xvOES; +extern RGLSYMGLMULTITEXCOORD2XOESPROC __rglgen_glMultiTexCoord2xOES; +extern RGLSYMGLMULTITEXCOORD2XVOESPROC __rglgen_glMultiTexCoord2xvOES; +extern RGLSYMGLMULTITEXCOORD3XOESPROC __rglgen_glMultiTexCoord3xOES; +extern RGLSYMGLMULTITEXCOORD3XVOESPROC __rglgen_glMultiTexCoord3xvOES; +extern RGLSYMGLMULTITEXCOORD4XVOESPROC __rglgen_glMultiTexCoord4xvOES; +extern RGLSYMGLNORMAL3XVOESPROC __rglgen_glNormal3xvOES; +extern RGLSYMGLPASSTHROUGHXOESPROC __rglgen_glPassThroughxOES; +extern RGLSYMGLPIXELMAPXPROC __rglgen_glPixelMapx; +extern RGLSYMGLPIXELSTOREXPROC __rglgen_glPixelStorex; +extern RGLSYMGLPIXELTRANSFERXOESPROC __rglgen_glPixelTransferxOES; +extern RGLSYMGLPIXELZOOMXOESPROC __rglgen_glPixelZoomxOES; +extern RGLSYMGLPRIORITIZETEXTURESXOESPROC __rglgen_glPrioritizeTexturesxOES; +extern RGLSYMGLRASTERPOS2XOESPROC __rglgen_glRasterPos2xOES; +extern RGLSYMGLRASTERPOS2XVOESPROC __rglgen_glRasterPos2xvOES; +extern RGLSYMGLRASTERPOS3XOESPROC __rglgen_glRasterPos3xOES; +extern RGLSYMGLRASTERPOS3XVOESPROC __rglgen_glRasterPos3xvOES; +extern RGLSYMGLRASTERPOS4XOESPROC __rglgen_glRasterPos4xOES; +extern RGLSYMGLRASTERPOS4XVOESPROC __rglgen_glRasterPos4xvOES; +extern RGLSYMGLRECTXOESPROC __rglgen_glRectxOES; +extern RGLSYMGLRECTXVOESPROC __rglgen_glRectxvOES; +extern RGLSYMGLTEXCOORD1XOESPROC __rglgen_glTexCoord1xOES; +extern RGLSYMGLTEXCOORD1XVOESPROC __rglgen_glTexCoord1xvOES; +extern RGLSYMGLTEXCOORD2XOESPROC __rglgen_glTexCoord2xOES; +extern RGLSYMGLTEXCOORD2XVOESPROC __rglgen_glTexCoord2xvOES; +extern RGLSYMGLTEXCOORD3XOESPROC __rglgen_glTexCoord3xOES; +extern RGLSYMGLTEXCOORD3XVOESPROC __rglgen_glTexCoord3xvOES; +extern RGLSYMGLTEXCOORD4XOESPROC __rglgen_glTexCoord4xOES; +extern RGLSYMGLTEXCOORD4XVOESPROC __rglgen_glTexCoord4xvOES; +extern RGLSYMGLTEXGENXOESPROC __rglgen_glTexGenxOES; +extern RGLSYMGLTEXGENXVOESPROC __rglgen_glTexGenxvOES; +extern RGLSYMGLVERTEX2XOESPROC __rglgen_glVertex2xOES; +extern RGLSYMGLVERTEX2XVOESPROC __rglgen_glVertex2xvOES; +extern RGLSYMGLVERTEX3XOESPROC __rglgen_glVertex3xOES; +extern RGLSYMGLVERTEX3XVOESPROC __rglgen_glVertex3xvOES; +extern RGLSYMGLVERTEX4XOESPROC __rglgen_glVertex4xOES; +extern RGLSYMGLVERTEX4XVOESPROC __rglgen_glVertex4xvOES; +extern RGLSYMGLQUERYMATRIXXOESPROC __rglgen_glQueryMatrixxOES; +extern RGLSYMGLCLEARDEPTHFOESPROC __rglgen_glClearDepthfOES; +extern RGLSYMGLCLIPPLANEFOESPROC __rglgen_glClipPlanefOES; +extern RGLSYMGLDEPTHRANGEFOESPROC __rglgen_glDepthRangefOES; +extern RGLSYMGLFRUSTUMFOESPROC __rglgen_glFrustumfOES; +extern RGLSYMGLGETCLIPPLANEFOESPROC __rglgen_glGetClipPlanefOES; +extern RGLSYMGLORTHOFOESPROC __rglgen_glOrthofOES; +extern RGLSYMGLIMAGETRANSFORMPARAMETERIHPPROC __rglgen_glImageTransformParameteriHP; +extern RGLSYMGLIMAGETRANSFORMPARAMETERFHPPROC __rglgen_glImageTransformParameterfHP; +extern RGLSYMGLIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glImageTransformParameterivHP; +extern RGLSYMGLIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glImageTransformParameterfvHP; +extern RGLSYMGLGETIMAGETRANSFORMPARAMETERIVHPPROC __rglgen_glGetImageTransformParameterivHP; +extern RGLSYMGLGETIMAGETRANSFORMPARAMETERFVHPPROC __rglgen_glGetImageTransformParameterfvHP; + +struct rglgen_sym_map { const char *sym; void *ptr; }; +extern const struct rglgen_sym_map rglgen_symbol_map[]; +#ifdef __cplusplus +} +#endif +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/rglgen.h
Added
@@ -0,0 +1,46 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef RGLGEN_H__ +#define RGLGEN_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <retro_common_api.h> + +#include "rglgen_headers.h" + +RETRO_BEGIN_DECLS + +struct rglgen_sym_map; + +typedef void (*rglgen_func_t)(void); +typedef rglgen_func_t (*rglgen_proc_address_t)(const char*); +void rglgen_resolve_symbols(rglgen_proc_address_t proc); +void rglgen_resolve_symbols_custom(rglgen_proc_address_t proc, + const struct rglgen_sym_map *map); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/rglgen_headers.h
Added
@@ -0,0 +1,53 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef RGLGEN_HEADERS_H__ +#define RGLGEN_HEADERS_H__ + +#ifdef HAVE_EGL +#include <EGL/egl.h> +#include <EGL/eglext.h> +#endif + +#include "rglgen_private_headers.h" + +#ifndef GL_MAP_WRITE_BIT +#define GL_MAP_WRITE_BIT 0x0002 +#endif + +#ifndef GL_MAP_INVALIDATE_BUFFER_BIT +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#endif + +#ifndef GL_RED_INTEGER +#define GL_RED_INTEGER 0x8D94 +#endif + +#ifndef GL_BGRA_EXT +#define GL_BGRA_EXT GL_BGRA +#endif + +#ifndef GL_LUMINANCE_ALPHA +#define GL_LUMINANCE_ALPHA 0x190A +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/rglgen_private_headers.h
Added
@@ -0,0 +1,76 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (glsym). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef RGLGEN_PRIVATE_HEADERS_H__ +#define RGLGEN_PRIVATE_HEADERS_H__ + +#if defined(IOS) + +#if defined(HAVE_OPENGLES3) +#include <OpenGLES/ES3/gl.h> +#include <OpenGLES/ES3/glext.h> +#else +#include <OpenGLES/ES2/gl.h> +#include <OpenGLES/ES2/glext.h> +#endif + +#elif defined(__APPLE__) +#include <compat/apple_compat.h> +#if MAC_OS_X_VERSION_10_7 +#include <OpenGL/gl3.h> +#include <OpenGL/gl3ext.h> +#else +#include <OpenGL/gl.h> +#include <OpenGL/glext.h> +#endif +#elif defined(HAVE_PSGL) +#include <PSGL/psgl.h> +#include <GLES/glext.h> +#elif defined(HAVE_OPENGL_MODERN) +#include <GL3/gl3.h> +#include <GL3/gl3ext.h> +#elif defined(HAVE_OPENGLES3) +#include <GLES3/gl3.h> +#define __gl2_h_ +#include <GLES2/gl2ext.h> +#elif defined(HAVE_OPENGLES2) +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> +#elif defined(HAVE_OPENGLES1) +#include <GLES/gl.h> +#include <GLES/glext.h> +#else +#if defined(_WIN32) && !defined(_XBOX) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif +#ifndef HAVE_LIBNX +#include <GL/gl.h> +#include <GL/glext.h> +#else +/* We need to avoid including <GL/gl.h> on this platform */ +#include "switch/nx_gl.h" +#include <GL/glext.h> +#endif /* SWITCH */ +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/switch
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/switch/nx_gl.h
Added
@@ -0,0 +1,848 @@ +/* Copyright (C) 2018-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro SDK code part (nx_gl.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __NX_GL_H__ +#define __NX_GL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif + +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif + +// GL.h types +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; /* 1-byte signed */ +typedef short GLshort; /* 2-byte signed */ +typedef int GLint; /* 4-byte signed */ +typedef unsigned char GLubyte; /* 1-byte unsigned */ +typedef unsigned short GLushort; /* 2-byte unsigned */ +typedef unsigned int GLuint; /* 4-byte unsigned */ +typedef int GLsizei; /* 4-byte signed */ +typedef float GLfloat; /* single precision float */ +typedef float GLclampf; /* single precision float in [0,1] */ +typedef double GLdouble; /* double precision float */ +typedef double GLclampd; /* double precision float in [0,1] */ + +// GL.h defines +#define GL_ARB_imaging 1 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_SHININESS 0x1601 +#define GL_EMISSION 0x1600 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_SHADE_MODEL 0x0B54 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_NORMALIZE 0x0BA1 +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM 0x0100 +#define GL_ADD 0x0104 +#define GL_LOAD 0x0101 +#define GL_MULT 0x0103 +#define GL_RETURN 0x0102 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_BLEND 0x0BE2 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_DST 0x0BE0 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_FEEDBACK 0x1C01 +#define GL_RENDER 0x1C00 +#define GL_SELECT 0x1C02 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_FOG 0x0B60 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_LINEAR 0x2601 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STENCIL_INDEX 0x1901 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_NONE 0 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_COLOR_INDEX 0x1900 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_ALPHA_BITS 0x0D55 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_INDEX_BITS 0x0D51 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_READ_BUFFER 0x0C02 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_BITMAP 0x1A00 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_DITHER 0x0BD0 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_RENDER_MODE 0x0C40 +#define GL_RGBA_MODE 0x0C31 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_SPHERE_MAP 0x2402 +#define GL_DECAL 0x2101 +#define GL_MODULATE 0x2100 +#define GL_NEAREST 0x2600 +#define GL_REPEAT 0x2901 +#define GL_CLAMP 0x2900 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_RESCALE_NORMAL 0x803A +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_BLEND_EQUATION 0x8009 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_COLOR 0x8005 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_ARB_multitexture 1 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#define GL_MESA_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_MESA 0x8750 +#define GL_UNSIGNED_INT_24_8_MESA 0x8751 +#define GL_UNSIGNED_INT_8_24_REV_MESA 0x8752 +#define GL_UNSIGNED_SHORT_15_1_MESA 0x8753 +#define GL_UNSIGNED_SHORT_1_15_REV_MESA 0x8754 +#define GL_ATI_blend_equation_separate 1 +#define GL_ALPHA_BLEND_EQUATION_ATI 0x883D +#define GL_OES_EGL_image 1 + +#ifdef __cplusplus +} +#endif + +#endif // __NX_GL_H__
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/glsym/switch/nx_glsym.h
Added
@@ -0,0 +1,928 @@ +#ifndef __NX_GLSYM_H__ +#define __NX_GLSYM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *GLeglImageOES; +typedef void (APIENTRYP RGLSYMGLCLEARINDEXPROC) ( GLfloat c ); +typedef void (APIENTRYP RGLSYMGLCLEARCOLORPROC) ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); +typedef void (APIENTRYP RGLSYMGLCLEARPROC) ( GLbitfield mask ); +typedef void (APIENTRYP RGLSYMGLINDEXMASKPROC) ( GLuint mask ); +typedef void (APIENTRYP RGLSYMGLCOLORMASKPROC) ( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); +typedef void (APIENTRYP RGLSYMGLALPHAFUNCPROC) ( GLenum func, GLclampf ref ); +typedef void (APIENTRYP RGLSYMGLBLENDFUNCPROC) ( GLenum sfactor, GLenum dfactor ); +typedef void (APIENTRYP RGLSYMGLLOGICOPPROC) ( GLenum opcode ); +typedef void (APIENTRYP RGLSYMGLCULLFACEPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLFRONTFACEPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLPOINTSIZEPROC) ( GLfloat size ); +typedef void (APIENTRYP RGLSYMGLLINEWIDTHPROC) ( GLfloat width ); +typedef void (APIENTRYP RGLSYMGLLINESTIPPLEPROC) ( GLint factor, GLushort pattern ); +typedef void (APIENTRYP RGLSYMGLPOLYGONMODEPROC) ( GLenum face, GLenum mode ); +typedef void (APIENTRYP RGLSYMGLPOLYGONOFFSETPROC) ( GLfloat factor, GLfloat units ); +typedef void (APIENTRYP RGLSYMGLPOLYGONSTIPPLEPROC) ( const GLubyte *mask ); +typedef void (APIENTRYP RGLSYMGLGETPOLYGONSTIPPLEPROC) ( GLubyte *mask ); +typedef void (APIENTRYP RGLSYMGLEDGEFLAGPROC) ( GLboolean flag ); +typedef void (APIENTRYP RGLSYMGLEDGEFLAGVPROC) ( const GLboolean *flag ); +typedef void (APIENTRYP RGLSYMGLSCISSORPROC) ( GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP RGLSYMGLCLIPPLANEPROC) ( GLenum plane, const GLdouble *equation ); +typedef void (APIENTRYP RGLSYMGLGETCLIPPLANEPROC) ( GLenum plane, GLdouble *equation ); +typedef void (APIENTRYP RGLSYMGLDRAWBUFFERPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLREADBUFFERPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLENABLEPROC) ( GLenum cap ); +typedef void (APIENTRYP RGLSYMGLDISABLEPROC) ( GLenum cap ); +typedef GLboolean (APIENTRYP RGLSYMGLISENABLEDPROC) ( GLenum cap ); +typedef void (APIENTRYP RGLSYMGLENABLECLIENTSTATEPROC) ( GLenum cap ); +typedef void (APIENTRYP RGLSYMGLDISABLECLIENTSTATEPROC) ( GLenum cap ); +typedef void (APIENTRYP RGLSYMGLGETBOOLEANVPROC) ( GLenum pname, GLboolean *params ); +typedef void (APIENTRYP RGLSYMGLGETDOUBLEVPROC) ( GLenum pname, GLdouble *params ); +typedef void (APIENTRYP RGLSYMGLGETFLOATVPROC) ( GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETINTEGERVPROC) ( GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLPUSHATTRIBPROC) ( GLbitfield mask ); +typedef void (APIENTRYP RGLSYMGLPOPATTRIBPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLPUSHCLIENTATTRIBPROC) ( GLbitfield mask ); +typedef void (APIENTRYP RGLSYMGLPOPCLIENTATTRIBPROC) ( void ); +typedef GLint (APIENTRYP RGLSYMGLRENDERMODEPROC) ( GLenum mode ); +typedef GLenum (APIENTRYP RGLSYMGLGETERRORPROC) ( void ); +typedef const GLubyte * (APIENTRYP RGLSYMGLGETSTRINGPROC) ( GLenum name ); +typedef void (APIENTRYP RGLSYMGLFINISHPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLFLUSHPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLHINTPROC) ( GLenum target, GLenum mode ); +typedef void (APIENTRYP RGLSYMGLCLEARDEPTHPROC) ( GLclampd depth ); +typedef void (APIENTRYP RGLSYMGLDEPTHFUNCPROC) ( GLenum func ); +typedef void (APIENTRYP RGLSYMGLDEPTHMASKPROC) ( GLboolean flag ); +typedef void (APIENTRYP RGLSYMGLDEPTHRANGEPROC) ( GLclampd near_val, GLclampd far_val ); +typedef void (APIENTRYP RGLSYMGLCLEARACCUMPROC) ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); +typedef void (APIENTRYP RGLSYMGLACCUMPROC) ( GLenum op, GLfloat value ); +typedef void (APIENTRYP RGLSYMGLMATRIXMODEPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLORTHOPROC) ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ); +typedef void (APIENTRYP RGLSYMGLFRUSTUMPROC) ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_val, GLdouble far_val ); +typedef void (APIENTRYP RGLSYMGLVIEWPORTPROC) ( GLint x, GLint y, GLsizei width, GLsizei height ); +typedef void (APIENTRYP RGLSYMGLPUSHMATRIXPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLPOPMATRIXPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLLOADIDENTITYPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLLOADMATRIXDPROC) ( const GLdouble *m ); +typedef void (APIENTRYP RGLSYMGLLOADMATRIXFPROC) ( const GLfloat *m ); +typedef void (APIENTRYP RGLSYMGLMULTMATRIXDPROC) ( const GLdouble *m ); +typedef void (APIENTRYP RGLSYMGLMULTMATRIXFPROC) ( const GLfloat *m ); +typedef void (APIENTRYP RGLSYMGLROTATEDPROC) ( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP RGLSYMGLROTATEFPROC) ( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP RGLSYMGLSCALEDPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP RGLSYMGLSCALEFPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP RGLSYMGLTRANSLATEDPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP RGLSYMGLTRANSLATEFPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef GLboolean (APIENTRYP RGLSYMGLISLISTPROC) ( GLuint list ); +typedef void (APIENTRYP RGLSYMGLDELETELISTSPROC) ( GLuint list, GLsizei range ); +typedef GLuint (APIENTRYP RGLSYMGLGENLISTSPROC) ( GLsizei range ); +typedef void (APIENTRYP RGLSYMGLNEWLISTPROC) ( GLuint list, GLenum mode ); +typedef void (APIENTRYP RGLSYMGLENDLISTPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLCALLLISTPROC) ( GLuint list ); +typedef void (APIENTRYP RGLSYMGLCALLLISTSPROC) ( GLsizei n, GLenum type, const GLvoid *lists ); +typedef void (APIENTRYP RGLSYMGLLISTBASEPROC) ( GLuint base ); +typedef void (APIENTRYP RGLSYMGLBEGINPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLENDPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLVERTEX2DPROC) ( GLdouble x, GLdouble y ); +typedef void (APIENTRYP RGLSYMGLVERTEX2FPROC) ( GLfloat x, GLfloat y ); +typedef void (APIENTRYP RGLSYMGLVERTEX2IPROC) ( GLint x, GLint y ); +typedef void (APIENTRYP RGLSYMGLVERTEX2SPROC) ( GLshort x, GLshort y ); +typedef void (APIENTRYP RGLSYMGLVERTEX3DPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP RGLSYMGLVERTEX3FPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP RGLSYMGLVERTEX3IPROC) ( GLint x, GLint y, GLint z ); +typedef void (APIENTRYP RGLSYMGLVERTEX3SPROC) ( GLshort x, GLshort y, GLshort z ); +typedef void (APIENTRYP RGLSYMGLVERTEX4DPROC) ( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +typedef void (APIENTRYP RGLSYMGLVERTEX4FPROC) ( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +typedef void (APIENTRYP RGLSYMGLVERTEX4IPROC) ( GLint x, GLint y, GLint z, GLint w ); +typedef void (APIENTRYP RGLSYMGLVERTEX4SPROC) ( GLshort x, GLshort y, GLshort z, GLshort w ); +typedef void (APIENTRYP RGLSYMGLVERTEX2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX2SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLVERTEX4SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLNORMAL3BPROC) ( GLbyte nx, GLbyte ny, GLbyte nz ); +typedef void (APIENTRYP RGLSYMGLNORMAL3DPROC) ( GLdouble nx, GLdouble ny, GLdouble nz ); +typedef void (APIENTRYP RGLSYMGLNORMAL3FPROC) ( GLfloat nx, GLfloat ny, GLfloat nz ); +typedef void (APIENTRYP RGLSYMGLNORMAL3IPROC) ( GLint nx, GLint ny, GLint nz ); +typedef void (APIENTRYP RGLSYMGLNORMAL3SPROC) ( GLshort nx, GLshort ny, GLshort nz ); +typedef void (APIENTRYP RGLSYMGLNORMAL3BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP RGLSYMGLNORMAL3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLNORMAL3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLNORMAL3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLNORMAL3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLINDEXDPROC) ( GLdouble c ); +typedef void (APIENTRYP RGLSYMGLINDEXFPROC) ( GLfloat c ); +typedef void (APIENTRYP RGLSYMGLINDEXIPROC) ( GLint c ); +typedef void (APIENTRYP RGLSYMGLINDEXSPROC) ( GLshort c ); +typedef void (APIENTRYP RGLSYMGLINDEXUBPROC) ( GLubyte c ); +typedef void (APIENTRYP RGLSYMGLINDEXDVPROC) ( const GLdouble *c ); +typedef void (APIENTRYP RGLSYMGLINDEXFVPROC) ( const GLfloat *c ); +typedef void (APIENTRYP RGLSYMGLINDEXIVPROC) ( const GLint *c ); +typedef void (APIENTRYP RGLSYMGLINDEXSVPROC) ( const GLshort *c ); +typedef void (APIENTRYP RGLSYMGLINDEXUBVPROC) ( const GLubyte *c ); +typedef void (APIENTRYP RGLSYMGLCOLOR3BPROC) ( GLbyte red, GLbyte green, GLbyte blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3DPROC) ( GLdouble red, GLdouble green, GLdouble blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3FPROC) ( GLfloat red, GLfloat green, GLfloat blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3IPROC) ( GLint red, GLint green, GLint blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3SPROC) ( GLshort red, GLshort green, GLshort blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3UBPROC) ( GLubyte red, GLubyte green, GLubyte blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3UIPROC) ( GLuint red, GLuint green, GLuint blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR3USPROC) ( GLushort red, GLushort green, GLushort blue ); +typedef void (APIENTRYP RGLSYMGLCOLOR4BPROC) ( GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4DPROC) ( GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4FPROC) ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4IPROC) ( GLint red, GLint green, GLint blue, GLint alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4SPROC) ( GLshort red, GLshort green, GLshort blue, GLshort alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4UBPROC) ( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4UIPROC) ( GLuint red, GLuint green, GLuint blue, GLuint alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR4USPROC) ( GLushort red, GLushort green, GLushort blue, GLushort alpha ); +typedef void (APIENTRYP RGLSYMGLCOLOR3BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3UBVPROC) ( const GLubyte *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3UIVPROC) ( const GLuint *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR3USVPROC) ( const GLushort *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4BVPROC) ( const GLbyte *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4UBVPROC) ( const GLubyte *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4UIVPROC) ( const GLuint *v ); +typedef void (APIENTRYP RGLSYMGLCOLOR4USVPROC) ( const GLushort *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1DPROC) ( GLdouble s ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1FPROC) ( GLfloat s ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1IPROC) ( GLint s ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1SPROC) ( GLshort s ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2DPROC) ( GLdouble s, GLdouble t ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2FPROC) ( GLfloat s, GLfloat t ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2IPROC) ( GLint s, GLint t ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2SPROC) ( GLshort s, GLshort t ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3DPROC) ( GLdouble s, GLdouble t, GLdouble r ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3FPROC) ( GLfloat s, GLfloat t, GLfloat r ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3IPROC) ( GLint s, GLint t, GLint r ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3SPROC) ( GLshort s, GLshort t, GLshort r ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4DPROC) ( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4FPROC) ( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4IPROC) ( GLint s, GLint t, GLint r, GLint q ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4SPROC) ( GLshort s, GLshort t, GLshort r, GLshort q ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD1SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD2SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLTEXCOORD4SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2DPROC) ( GLdouble x, GLdouble y ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2FPROC) ( GLfloat x, GLfloat y ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2IPROC) ( GLint x, GLint y ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2SPROC) ( GLshort x, GLshort y ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3DPROC) ( GLdouble x, GLdouble y, GLdouble z ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3FPROC) ( GLfloat x, GLfloat y, GLfloat z ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3IPROC) ( GLint x, GLint y, GLint z ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3SPROC) ( GLshort x, GLshort y, GLshort z ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4DPROC) ( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4FPROC) ( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4IPROC) ( GLint x, GLint y, GLint z, GLint w ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4SPROC) ( GLshort x, GLshort y, GLshort z, GLshort w ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS2SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS3SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4DVPROC) ( const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4FVPROC) ( const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4IVPROC) ( const GLint *v ); +typedef void (APIENTRYP RGLSYMGLRASTERPOS4SVPROC) ( const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLRECTDPROC) ( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +typedef void (APIENTRYP RGLSYMGLRECTFPROC) ( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +typedef void (APIENTRYP RGLSYMGLRECTIPROC) ( GLint x1, GLint y1, GLint x2, GLint y2 ); +typedef void (APIENTRYP RGLSYMGLRECTSPROC) ( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); +typedef void (APIENTRYP RGLSYMGLRECTDVPROC) ( const GLdouble *v1, const GLdouble *v2 ); +typedef void (APIENTRYP RGLSYMGLRECTFVPROC) ( const GLfloat *v1, const GLfloat *v2 ); +typedef void (APIENTRYP RGLSYMGLRECTIVPROC) ( const GLint *v1, const GLint *v2 ); +typedef void (APIENTRYP RGLSYMGLRECTSVPROC) ( const GLshort *v1, const GLshort *v2 ); +typedef void (APIENTRYP RGLSYMGLVERTEXPOINTERPROC) ( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); +typedef void (APIENTRYP RGLSYMGLNORMALPOINTERPROC) ( GLenum type, GLsizei stride, const GLvoid *ptr ); +typedef void (APIENTRYP RGLSYMGLCOLORPOINTERPROC) ( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); +typedef void (APIENTRYP RGLSYMGLINDEXPOINTERPROC) ( GLenum type, GLsizei stride, const GLvoid *ptr ); +typedef void (APIENTRYP RGLSYMGLTEXCOORDPOINTERPROC) ( GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ); +typedef void (APIENTRYP RGLSYMGLEDGEFLAGPOINTERPROC) ( GLsizei stride, const GLvoid *ptr ); +typedef void (APIENTRYP RGLSYMGLGETPOINTERVPROC) ( GLenum pname, GLvoid **params ); +typedef void (APIENTRYP RGLSYMGLARRAYELEMENTPROC) ( GLint i ); +typedef void (APIENTRYP RGLSYMGLDRAWARRAYSPROC) ( GLenum mode, GLint first, GLsizei count ); +typedef void (APIENTRYP RGLSYMGLDRAWELEMENTSPROC) ( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices ); +typedef void (APIENTRYP RGLSYMGLINTERLEAVEDARRAYSPROC) ( GLenum format, GLsizei stride, const GLvoid *pointer ); +typedef void (APIENTRYP RGLSYMGLSHADEMODELPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLLIGHTFPROC) ( GLenum light, GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLLIGHTIPROC) ( GLenum light, GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLLIGHTFVPROC) ( GLenum light, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLLIGHTIVPROC) ( GLenum light, GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLGETLIGHTFVPROC) ( GLenum light, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETLIGHTIVPROC) ( GLenum light, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLLIGHTMODELFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLLIGHTMODELIPROC) ( GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLLIGHTMODELFVPROC) ( GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLLIGHTMODELIVPROC) ( GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLMATERIALFPROC) ( GLenum face, GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLMATERIALIPROC) ( GLenum face, GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLMATERIALFVPROC) ( GLenum face, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLMATERIALIVPROC) ( GLenum face, GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLGETMATERIALFVPROC) ( GLenum face, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETMATERIALIVPROC) ( GLenum face, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLCOLORMATERIALPROC) ( GLenum face, GLenum mode ); +typedef void (APIENTRYP RGLSYMGLPIXELZOOMPROC) ( GLfloat xfactor, GLfloat yfactor ); +typedef void (APIENTRYP RGLSYMGLPIXELSTOREFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLPIXELSTOREIPROC) ( GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLPIXELTRANSFERFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLPIXELTRANSFERIPROC) ( GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLPIXELMAPFVPROC) ( GLenum map, GLsizei mapsize, const GLfloat *values ); +typedef void (APIENTRYP RGLSYMGLPIXELMAPUIVPROC) ( GLenum map, GLsizei mapsize, const GLuint *values ); +typedef void (APIENTRYP RGLSYMGLPIXELMAPUSVPROC) ( GLenum map, GLsizei mapsize, const GLushort *values ); +typedef void (APIENTRYP RGLSYMGLGETPIXELMAPFVPROC) ( GLenum map, GLfloat *values ); +typedef void (APIENTRYP RGLSYMGLGETPIXELMAPUIVPROC) ( GLenum map, GLuint *values ); +typedef void (APIENTRYP RGLSYMGLGETPIXELMAPUSVPROC) ( GLenum map, GLushort *values ); +typedef void (APIENTRYP RGLSYMGLBITMAPPROC) ( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap ); +typedef void (APIENTRYP RGLSYMGLREADPIXELSPROC) ( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLDRAWPIXELSPROC) ( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLCOPYPIXELSPROC) ( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ); +typedef void (APIENTRYP RGLSYMGLSTENCILFUNCPROC) ( GLenum func, GLint ref, GLuint mask ); +typedef void (APIENTRYP RGLSYMGLSTENCILMASKPROC) ( GLuint mask ); +typedef void (APIENTRYP RGLSYMGLSTENCILOPPROC) ( GLenum fail, GLenum zfail, GLenum zpass ); +typedef void (APIENTRYP RGLSYMGLCLEARSTENCILPROC) ( GLint s ); +typedef void (APIENTRYP RGLSYMGLTEXGENDPROC) ( GLenum coord, GLenum pname, GLdouble param ); +typedef void (APIENTRYP RGLSYMGLTEXGENFPROC) ( GLenum coord, GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLTEXGENIPROC) ( GLenum coord, GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLTEXGENDVPROC) ( GLenum coord, GLenum pname, const GLdouble *params ); +typedef void (APIENTRYP RGLSYMGLTEXGENFVPROC) ( GLenum coord, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLTEXGENIVPROC) ( GLenum coord, GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXGENDVPROC) ( GLenum coord, GLenum pname, GLdouble *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXGENFVPROC) ( GLenum coord, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXGENIVPROC) ( GLenum coord, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLTEXENVFPROC) ( GLenum target, GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLTEXENVIPROC) ( GLenum target, GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLTEXENVFVPROC) ( GLenum target, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLTEXENVIVPROC) ( GLenum target, GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXENVFVPROC) ( GLenum target, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXENVIVPROC) ( GLenum target, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERFPROC) ( GLenum target, GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERIPROC) ( GLenum target, GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERFVPROC) ( GLenum target, GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLTEXPARAMETERIVPROC) ( GLenum target, GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERFVPROC) ( GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP RGLSYMGLGETTEXPARAMETERIVPROC) ( GLenum target, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERFVPROC) ( GLenum target, GLint level, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETTEXLEVELPARAMETERIVPROC) ( GLenum target, GLint level, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE1DPROC) ( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE2DPROC) ( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLGETTEXIMAGEPROC) ( GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLGENTEXTURESPROC) ( GLsizei n, GLuint *textures ); +typedef void (APIENTRYP RGLSYMGLDELETETEXTURESPROC) ( GLsizei n, const GLuint *textures); +typedef void (APIENTRYP RGLSYMGLBINDTEXTUREPROC) ( GLenum target, GLuint texture ); +typedef void (APIENTRYP RGLSYMGLPRIORITIZETEXTURESPROC) ( GLsizei n, const GLuint *textures, const GLclampf *priorities ); +typedef GLboolean (APIENTRYP RGLSYMGLARETEXTURESRESIDENTPROC) ( GLsizei n, const GLuint *textures, GLboolean *residences ); +typedef GLboolean (APIENTRYP RGLSYMGLISTEXTUREPROC) ( GLuint texture ); +typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLCOPYTEXIMAGE1DPROC) ( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border ); +typedef void (APIENTRYP RGLSYMGLCOPYTEXIMAGE2DPROC) ( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border ); +typedef void (APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width ); +typedef void (APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ); +typedef void (APIENTRYP RGLSYMGLMAP1DPROC) ( GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points ); +typedef void (APIENTRYP RGLSYMGLMAP1FPROC) ( GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points ); +typedef void (APIENTRYP RGLSYMGLMAP2DPROC) ( GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points ); +typedef void (APIENTRYP RGLSYMGLMAP2FPROC) ( GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points ); +typedef void (APIENTRYP RGLSYMGLGETMAPDVPROC) ( GLenum target, GLenum query, GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLGETMAPFVPROC) ( GLenum target, GLenum query, GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLGETMAPIVPROC) ( GLenum target, GLenum query, GLint *v ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD1DPROC) ( GLdouble u ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD1FPROC) ( GLfloat u ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD1DVPROC) ( const GLdouble *u ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD1FVPROC) ( const GLfloat *u ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD2DPROC) ( GLdouble u, GLdouble v ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD2FPROC) ( GLfloat u, GLfloat v ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD2DVPROC) ( const GLdouble *u ); +typedef void (APIENTRYP RGLSYMGLEVALCOORD2FVPROC) ( const GLfloat *u ); +typedef void (APIENTRYP RGLSYMGLMAPGRID1DPROC) ( GLint un, GLdouble u1, GLdouble u2 ); +typedef void (APIENTRYP RGLSYMGLMAPGRID1FPROC) ( GLint un, GLfloat u1, GLfloat u2 ); +typedef void (APIENTRYP RGLSYMGLMAPGRID2DPROC) ( GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2 ); +typedef void (APIENTRYP RGLSYMGLMAPGRID2FPROC) ( GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2 ); +typedef void (APIENTRYP RGLSYMGLEVALPOINT1PROC) ( GLint i ); +typedef void (APIENTRYP RGLSYMGLEVALPOINT2PROC) ( GLint i, GLint j ); +typedef void (APIENTRYP RGLSYMGLEVALMESH1PROC) ( GLenum mode, GLint i1, GLint i2 ); +typedef void (APIENTRYP RGLSYMGLEVALMESH2PROC) ( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); +typedef void (APIENTRYP RGLSYMGLFOGFPROC) ( GLenum pname, GLfloat param ); +typedef void (APIENTRYP RGLSYMGLFOGIPROC) ( GLenum pname, GLint param ); +typedef void (APIENTRYP RGLSYMGLFOGFVPROC) ( GLenum pname, const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLFOGIVPROC) ( GLenum pname, const GLint *params ); +typedef void (APIENTRYP RGLSYMGLFEEDBACKBUFFERPROC) ( GLsizei size, GLenum type, GLfloat *buffer ); +typedef void (APIENTRYP RGLSYMGLPASSTHROUGHPROC) ( GLfloat token ); +typedef void (APIENTRYP RGLSYMGLSELECTBUFFERPROC) ( GLsizei size, GLuint *buffer ); +typedef void (APIENTRYP RGLSYMGLINITNAMESPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLLOADNAMEPROC) ( GLuint name ); +typedef void (APIENTRYP RGLSYMGLPUSHNAMEPROC) ( GLuint name ); +typedef void (APIENTRYP RGLSYMGLPOPNAMEPROC) ( void ); +typedef void (APIENTRYP RGLSYMGLDRAWRANGEELEMENTSPROC) ( GLenum mode, GLuint start,GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); +typedef void (APIENTRYP RGLSYMGLTEXIMAGE3DPROC) ( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels ); +typedef void (APIENTRYP RGLSYMGLTEXSUBIMAGE3DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRYP RGLSYMGLCOPYTEXSUBIMAGE3DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ); +typedef void (APIENTRYP RGLSYMGLCOLORTABLEPROC) ( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table ); +typedef void (APIENTRYP RGLSYMGLCOLORSUBTABLEPROC) ( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP RGLSYMGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP RGLSYMGLCOPYCOLORSUBTABLEPROC) ( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ); +typedef void (APIENTRYP RGLSYMGLCOPYCOLORTABLEPROC) ( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ); +typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPROC) ( GLenum target, GLenum format, GLenum type, GLvoid *table ); +typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPARAMETERFVPROC) ( GLenum target, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETCOLORTABLEPARAMETERIVPROC) ( GLenum target, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLBLENDEQUATIONPROC) ( GLenum mode ); +typedef void (APIENTRYP RGLSYMGLBLENDCOLORPROC) ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); +typedef void (APIENTRYP RGLSYMGLHISTOGRAMPROC) ( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ); +typedef void (APIENTRYP RGLSYMGLRESETHISTOGRAMPROC) ( GLenum target ); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPROC) ( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values ); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERFVPROC) ( GLenum target, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETHISTOGRAMPARAMETERIVPROC) ( GLenum target, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLMINMAXPROC) ( GLenum target, GLenum internalformat,GLboolean sink ); +typedef void (APIENTRYP RGLSYMGLRESETMINMAXPROC) ( GLenum target ); +typedef void (APIENTRYP RGLSYMGLGETMINMAXPROC) ( GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values ); +typedef void (APIENTRYP RGLSYMGLGETMINMAXPARAMETERFVPROC) ( GLenum target, GLenum pname, GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETMINMAXPARAMETERIVPROC) ( GLenum target, GLenum pname, GLint *params ); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONFILTER1DPROC) ( GLenum target,GLenum internalformat, GLsizei width, GLenum format, GLenum type,const GLvoid *image ); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONFILTER2DPROC) ( GLenum target,GLenum internalformat, GLsizei width, GLsizei height, GLenum format,GLenum type, const GLvoid *image ); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERFPROC) ( GLenum target, GLenum pname,GLfloat params ); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERFVPROC) ( GLenum target, GLenum pname,const GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERIPROC) ( GLenum target, GLenum pname,GLint params ); +typedef void (APIENTRYP RGLSYMGLCONVOLUTIONPARAMETERIVPROC) ( GLenum target, GLenum pname,const GLint *params ); +typedef void (APIENTRYP RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC) ( GLenum target,GLenum internalformat, GLint x, GLint y, GLsizei width ); +typedef void (APIENTRYP RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC) ( GLenum target,GLenum internalformat, GLint x, GLint y, GLsizei width,GLsizei height); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONFILTERPROC) ( GLenum target, GLenum format,GLenum type, GLvoid *image ); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC) ( GLenum target, GLenum pname,GLfloat *params ); +typedef void (APIENTRYP RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC) ( GLenum target, GLenum pname,GLint *params ); +typedef void (APIENTRYP RGLSYMGLSEPARABLEFILTER2DPROC) ( GLenum target,GLenum internalformat, GLsizei width, GLsizei height, GLenum format,GLenum type, const GLvoid *row, const GLvoid *column ); +typedef void (APIENTRYP RGLSYMGLGETSEPARABLEFILTERPROC) ( GLenum target, GLenum format,GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); +typedef void (APIENTRYP RGLSYMGLACTIVETEXTUREPROC) ( GLenum texture ); +typedef void (APIENTRYP RGLSYMGLCLIENTACTIVETEXTUREPROC) ( GLenum texture ); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE1DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC) ( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); +typedef void (APIENTRYP RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC) ( GLenum target, GLint lod, GLvoid *img ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DPROC) ( GLenum target, GLdouble s ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DVPROC) ( GLenum target, const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FPROC) ( GLenum target, GLfloat s ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FVPROC) ( GLenum target, const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IPROC) ( GLenum target, GLint s ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IVPROC) ( GLenum target, const GLint *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SPROC) ( GLenum target, GLshort s ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SVPROC) ( GLenum target, const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DPROC) ( GLenum target, GLdouble s, GLdouble t ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DVPROC) ( GLenum target, const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FPROC) ( GLenum target, GLfloat s, GLfloat t ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FVPROC) ( GLenum target, const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IPROC) ( GLenum target, GLint s, GLint t ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IVPROC) ( GLenum target, const GLint *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SPROC) ( GLenum target, GLshort s, GLshort t ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SVPROC) ( GLenum target, const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DPROC) ( GLenum target, GLdouble s, GLdouble t, GLdouble r ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DVPROC) ( GLenum target, const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FPROC) ( GLenum target, GLfloat s, GLfloat t, GLfloat r ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FVPROC) ( GLenum target, const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IPROC) ( GLenum target, GLint s, GLint t, GLint r ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IVPROC) ( GLenum target, const GLint *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SPROC) ( GLenum target, GLshort s, GLshort t, GLshort r ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SVPROC) ( GLenum target, const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DPROC) ( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DVPROC) ( GLenum target, const GLdouble *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FPROC) ( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FVPROC) ( GLenum target, const GLfloat *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IPROC) ( GLenum target, GLint s, GLint t, GLint r, GLint q ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IVPROC) ( GLenum target, const GLint *v ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SPROC) ( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SVPROC) ( GLenum target, const GLshort *v ); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXDPROC) ( const GLdouble m[16] ); +typedef void (APIENTRYP RGLSYMGLLOADTRANSPOSEMATRIXFPROC) ( const GLfloat m[16] ); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXDPROC) ( const GLdouble m[16] ); +typedef void (APIENTRYP RGLSYMGLMULTTRANSPOSEMATRIXFPROC) ( const GLfloat m[16] ); +typedef void (APIENTRYP RGLSYMGLSAMPLECOVERAGEPROC) ( GLclampf value, GLboolean invert ); +typedef void (APIENTRYP RGLSYMGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP RGLSYMGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP RGLSYMGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (APIENTRYP RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +typedef void (APIENTRYP RGLSYMGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); + +RGLSYMGLCLEARINDEXPROC glClearIndex; +RGLSYMGLCLEARCOLORPROC glClearColor; +RGLSYMGLCLEARPROC glClear; +RGLSYMGLINDEXMASKPROC glIndexMask; +RGLSYMGLCOLORMASKPROC glColorMask; +RGLSYMGLALPHAFUNCPROC glAlphaFunc; +RGLSYMGLBLENDFUNCPROC glBlendFunc; +RGLSYMGLLOGICOPPROC glLogicOp; +RGLSYMGLCULLFACEPROC glCullFace; +RGLSYMGLFRONTFACEPROC glFrontFace; +RGLSYMGLPOINTSIZEPROC glPointSize; +RGLSYMGLLINEWIDTHPROC glLineWidth; +RGLSYMGLLINESTIPPLEPROC glLineStipple; +RGLSYMGLPOLYGONMODEPROC glPolygonMode; +RGLSYMGLPOLYGONOFFSETPROC glPolygonOffset; +RGLSYMGLPOLYGONSTIPPLEPROC glPolygonStipple; +RGLSYMGLGETPOLYGONSTIPPLEPROC glGetPolygonStipple; +RGLSYMGLEDGEFLAGPROC glEdgeFlag; +RGLSYMGLEDGEFLAGVPROC glEdgeFlagv; +RGLSYMGLSCISSORPROC glScissor; +RGLSYMGLCLIPPLANEPROC glClipPlane; +RGLSYMGLGETCLIPPLANEPROC glGetClipPlane; +RGLSYMGLDRAWBUFFERPROC glDrawBuffer; +RGLSYMGLREADBUFFERPROC glReadBuffer; +RGLSYMGLENABLEPROC glEnable; +RGLSYMGLDISABLEPROC glDisable; +RGLSYMGLISENABLEDPROC glIsEnabled; +RGLSYMGLENABLECLIENTSTATEPROC glEnableClientState; +RGLSYMGLDISABLECLIENTSTATEPROC glDisableClientState; +RGLSYMGLGETBOOLEANVPROC glGetBooleanv; +RGLSYMGLGETDOUBLEVPROC glGetDoublev; +RGLSYMGLGETFLOATVPROC glGetFloatv; +RGLSYMGLGETINTEGERVPROC glGetIntegerv; +RGLSYMGLPUSHATTRIBPROC glPushAttrib; +RGLSYMGLPOPATTRIBPROC glPopAttrib; +RGLSYMGLPUSHCLIENTATTRIBPROC glPushClientAttrib; +RGLSYMGLPOPCLIENTATTRIBPROC glPopClientAttrib; +RGLSYMGLRENDERMODEPROC glRenderMode; +RGLSYMGLGETERRORPROC glGetError; +RGLSYMGLGETSTRINGPROC glGetString; +RGLSYMGLFINISHPROC glFinish; +RGLSYMGLFLUSHPROC glFlush; +RGLSYMGLHINTPROC glHint; +RGLSYMGLCLEARDEPTHPROC glClearDepth; +RGLSYMGLDEPTHFUNCPROC glDepthFunc; +RGLSYMGLDEPTHMASKPROC glDepthMask; +RGLSYMGLDEPTHRANGEPROC glDepthRange; +RGLSYMGLCLEARACCUMPROC glClearAccum; +RGLSYMGLACCUMPROC glAccum; +RGLSYMGLMATRIXMODEPROC glMatrixMode; +RGLSYMGLORTHOPROC glOrtho; +RGLSYMGLFRUSTUMPROC glFrustum; +RGLSYMGLVIEWPORTPROC glViewport; +RGLSYMGLPUSHMATRIXPROC glPushMatrix; +RGLSYMGLPOPMATRIXPROC glPopMatrix; +RGLSYMGLLOADIDENTITYPROC glLoadIdentity; +RGLSYMGLLOADMATRIXDPROC glLoadMatrixd; +RGLSYMGLLOADMATRIXFPROC glLoadMatrixf; +RGLSYMGLMULTMATRIXDPROC glMultMatrixd; +RGLSYMGLMULTMATRIXFPROC glMultMatrixf; +RGLSYMGLROTATEDPROC glRotated; +RGLSYMGLROTATEFPROC glRotatef; +RGLSYMGLSCALEDPROC glScaled; +RGLSYMGLSCALEFPROC glScalef; +RGLSYMGLTRANSLATEDPROC glTranslated; +RGLSYMGLTRANSLATEFPROC glTranslatef; +RGLSYMGLISLISTPROC glIsList; +RGLSYMGLDELETELISTSPROC glDeleteLists; +RGLSYMGLGENLISTSPROC glGenLists; +RGLSYMGLNEWLISTPROC glNewList; +RGLSYMGLENDLISTPROC glEndList; +RGLSYMGLCALLLISTPROC glCallList; +RGLSYMGLCALLLISTSPROC glCallLists; +RGLSYMGLLISTBASEPROC glListBase; +RGLSYMGLBEGINPROC glBegin; +RGLSYMGLENDPROC glEnd; +RGLSYMGLVERTEX2DPROC glVertex2d; +RGLSYMGLVERTEX2FPROC glVertex2f; +RGLSYMGLVERTEX2IPROC glVertex2i; +RGLSYMGLVERTEX2SPROC glVertex2s; +RGLSYMGLVERTEX3DPROC glVertex3d; +RGLSYMGLVERTEX3FPROC glVertex3f; +RGLSYMGLVERTEX3IPROC glVertex3i; +RGLSYMGLVERTEX3SPROC glVertex3s; +RGLSYMGLVERTEX4DPROC glVertex4d; +RGLSYMGLVERTEX4FPROC glVertex4f; +RGLSYMGLVERTEX4IPROC glVertex4i; +RGLSYMGLVERTEX4SPROC glVertex4s; +RGLSYMGLVERTEX2DVPROC glVertex2dv; +RGLSYMGLVERTEX2FVPROC glVertex2fv; +RGLSYMGLVERTEX2IVPROC glVertex2iv; +RGLSYMGLVERTEX2SVPROC glVertex2sv; +RGLSYMGLVERTEX3DVPROC glVertex3dv; +RGLSYMGLVERTEX3FVPROC glVertex3fv; +RGLSYMGLVERTEX3IVPROC glVertex3iv; +RGLSYMGLVERTEX3SVPROC glVertex3sv; +RGLSYMGLVERTEX4DVPROC glVertex4dv; +RGLSYMGLVERTEX4FVPROC glVertex4fv; +RGLSYMGLVERTEX4IVPROC glVertex4iv; +RGLSYMGLVERTEX4SVPROC glVertex4sv; +RGLSYMGLNORMAL3BPROC glNormal3b; +RGLSYMGLNORMAL3DPROC glNormal3d; +RGLSYMGLNORMAL3FPROC glNormal3f; +RGLSYMGLNORMAL3IPROC glNormal3i; +RGLSYMGLNORMAL3SPROC glNormal3s; +RGLSYMGLNORMAL3BVPROC glNormal3bv; +RGLSYMGLNORMAL3DVPROC glNormal3dv; +RGLSYMGLNORMAL3FVPROC glNormal3fv; +RGLSYMGLNORMAL3IVPROC glNormal3iv; +RGLSYMGLNORMAL3SVPROC glNormal3sv; +RGLSYMGLINDEXDPROC glIndexd; +RGLSYMGLINDEXFPROC glIndexf; +RGLSYMGLINDEXIPROC glIndexi; +RGLSYMGLINDEXSPROC glIndexs; +RGLSYMGLINDEXUBPROC glIndexub; +RGLSYMGLINDEXDVPROC glIndexdv; +RGLSYMGLINDEXFVPROC glIndexfv; +RGLSYMGLINDEXIVPROC glIndexiv; +RGLSYMGLINDEXSVPROC glIndexsv; +RGLSYMGLINDEXUBVPROC glIndexubv; +RGLSYMGLCOLOR3BPROC glColor3b; +RGLSYMGLCOLOR3DPROC glColor3d; +RGLSYMGLCOLOR3FPROC glColor3f; +RGLSYMGLCOLOR3IPROC glColor3i; +RGLSYMGLCOLOR3SPROC glColor3s; +RGLSYMGLCOLOR3UBPROC glColor3ub; +RGLSYMGLCOLOR3UIPROC glColor3ui; +RGLSYMGLCOLOR3USPROC glColor3us; +RGLSYMGLCOLOR4BPROC glColor4b; +RGLSYMGLCOLOR4DPROC glColor4d; +RGLSYMGLCOLOR4FPROC glColor4f; +RGLSYMGLCOLOR4IPROC glColor4i; +RGLSYMGLCOLOR4SPROC glColor4s; +RGLSYMGLCOLOR4UBPROC glColor4ub; +RGLSYMGLCOLOR4UIPROC glColor4ui; +RGLSYMGLCOLOR4USPROC glColor4us; +RGLSYMGLCOLOR3BVPROC glColor3bv; +RGLSYMGLCOLOR3DVPROC glColor3dv; +RGLSYMGLCOLOR3FVPROC glColor3fv; +RGLSYMGLCOLOR3IVPROC glColor3iv; +RGLSYMGLCOLOR3SVPROC glColor3sv; +RGLSYMGLCOLOR3UBVPROC glColor3ubv; +RGLSYMGLCOLOR3UIVPROC glColor3uiv; +RGLSYMGLCOLOR3USVPROC glColor3usv; +RGLSYMGLCOLOR4BVPROC glColor4bv; +RGLSYMGLCOLOR4DVPROC glColor4dv; +RGLSYMGLCOLOR4FVPROC glColor4fv; +RGLSYMGLCOLOR4IVPROC glColor4iv; +RGLSYMGLCOLOR4SVPROC glColor4sv; +RGLSYMGLCOLOR4UBVPROC glColor4ubv; +RGLSYMGLCOLOR4UIVPROC glColor4uiv; +RGLSYMGLCOLOR4USVPROC glColor4usv; +RGLSYMGLTEXCOORD1DPROC glTexCoord1d; +RGLSYMGLTEXCOORD1FPROC glTexCoord1f; +RGLSYMGLTEXCOORD1IPROC glTexCoord1i; +RGLSYMGLTEXCOORD1SPROC glTexCoord1s; +RGLSYMGLTEXCOORD2DPROC glTexCoord2d; +RGLSYMGLTEXCOORD2FPROC glTexCoord2f; +RGLSYMGLTEXCOORD2IPROC glTexCoord2i; +RGLSYMGLTEXCOORD2SPROC glTexCoord2s; +RGLSYMGLTEXCOORD3DPROC glTexCoord3d; +RGLSYMGLTEXCOORD3FPROC glTexCoord3f; +RGLSYMGLTEXCOORD3IPROC glTexCoord3i; +RGLSYMGLTEXCOORD3SPROC glTexCoord3s; +RGLSYMGLTEXCOORD4DPROC glTexCoord4d; +RGLSYMGLTEXCOORD4FPROC glTexCoord4f; +RGLSYMGLTEXCOORD4IPROC glTexCoord4i; +RGLSYMGLTEXCOORD4SPROC glTexCoord4s; +RGLSYMGLTEXCOORD1DVPROC glTexCoord1dv; +RGLSYMGLTEXCOORD1FVPROC glTexCoord1fv; +RGLSYMGLTEXCOORD1IVPROC glTexCoord1iv; +RGLSYMGLTEXCOORD1SVPROC glTexCoord1sv; +RGLSYMGLTEXCOORD2DVPROC glTexCoord2dv; +RGLSYMGLTEXCOORD2FVPROC glTexCoord2fv; +RGLSYMGLTEXCOORD2IVPROC glTexCoord2iv; +RGLSYMGLTEXCOORD2SVPROC glTexCoord2sv; +RGLSYMGLTEXCOORD3DVPROC glTexCoord3dv; +RGLSYMGLTEXCOORD3FVPROC glTexCoord3fv; +RGLSYMGLTEXCOORD3IVPROC glTexCoord3iv; +RGLSYMGLTEXCOORD3SVPROC glTexCoord3sv; +RGLSYMGLTEXCOORD4DVPROC glTexCoord4dv; +RGLSYMGLTEXCOORD4FVPROC glTexCoord4fv; +RGLSYMGLTEXCOORD4IVPROC glTexCoord4iv; +RGLSYMGLTEXCOORD4SVPROC glTexCoord4sv; +RGLSYMGLRASTERPOS2DPROC glRasterPos2d; +RGLSYMGLRASTERPOS2FPROC glRasterPos2f; +RGLSYMGLRASTERPOS2IPROC glRasterPos2i; +RGLSYMGLRASTERPOS2SPROC glRasterPos2s; +RGLSYMGLRASTERPOS3DPROC glRasterPos3d; +RGLSYMGLRASTERPOS3FPROC glRasterPos3f; +RGLSYMGLRASTERPOS3IPROC glRasterPos3i; +RGLSYMGLRASTERPOS3SPROC glRasterPos3s; +RGLSYMGLRASTERPOS4DPROC glRasterPos4d; +RGLSYMGLRASTERPOS4FPROC glRasterPos4f; +RGLSYMGLRASTERPOS4IPROC glRasterPos4i; +RGLSYMGLRASTERPOS4SPROC glRasterPos4s; +RGLSYMGLRASTERPOS2DVPROC glRasterPos2dv; +RGLSYMGLRASTERPOS2FVPROC glRasterPos2fv; +RGLSYMGLRASTERPOS2IVPROC glRasterPos2iv; +RGLSYMGLRASTERPOS2SVPROC glRasterPos2sv; +RGLSYMGLRASTERPOS3DVPROC glRasterPos3dv; +RGLSYMGLRASTERPOS3FVPROC glRasterPos3fv; +RGLSYMGLRASTERPOS3IVPROC glRasterPos3iv; +RGLSYMGLRASTERPOS3SVPROC glRasterPos3sv; +RGLSYMGLRASTERPOS4DVPROC glRasterPos4dv; +RGLSYMGLRASTERPOS4FVPROC glRasterPos4fv; +RGLSYMGLRASTERPOS4IVPROC glRasterPos4iv; +RGLSYMGLRASTERPOS4SVPROC glRasterPos4sv; +RGLSYMGLRECTDPROC glRectd; +RGLSYMGLRECTFPROC glRectf; +RGLSYMGLRECTIPROC glRecti; +RGLSYMGLRECTSPROC glRects; +RGLSYMGLRECTDVPROC glRectdv; +RGLSYMGLRECTFVPROC glRectfv; +RGLSYMGLRECTIVPROC glRectiv; +RGLSYMGLRECTSVPROC glRectsv; +RGLSYMGLVERTEXPOINTERPROC glVertexPointer; +RGLSYMGLNORMALPOINTERPROC glNormalPointer; +RGLSYMGLCOLORPOINTERPROC glColorPointer; +RGLSYMGLINDEXPOINTERPROC glIndexPointer; +RGLSYMGLTEXCOORDPOINTERPROC glTexCoordPointer; +RGLSYMGLEDGEFLAGPOINTERPROC glEdgeFlagPointer; +RGLSYMGLGETPOINTERVPROC glGetPointerv; +RGLSYMGLARRAYELEMENTPROC glArrayElement; +RGLSYMGLDRAWARRAYSPROC glDrawArrays; +RGLSYMGLDRAWELEMENTSPROC glDrawElements; +RGLSYMGLINTERLEAVEDARRAYSPROC glInterleavedArrays; +RGLSYMGLSHADEMODELPROC glShadeModel; +RGLSYMGLLIGHTFPROC glLightf; +RGLSYMGLLIGHTIPROC glLighti; +RGLSYMGLLIGHTFVPROC glLightfv; +RGLSYMGLLIGHTIVPROC glLightiv; +RGLSYMGLGETLIGHTFVPROC glGetLightfv; +RGLSYMGLGETLIGHTIVPROC glGetLightiv; +RGLSYMGLLIGHTMODELFPROC glLightModelf; +RGLSYMGLLIGHTMODELIPROC glLightModeli; +RGLSYMGLLIGHTMODELFVPROC glLightModelfv; +RGLSYMGLLIGHTMODELIVPROC glLightModeliv; +RGLSYMGLMATERIALFPROC glMaterialf; +RGLSYMGLMATERIALIPROC glMateriali; +RGLSYMGLMATERIALFVPROC glMaterialfv; +RGLSYMGLMATERIALIVPROC glMaterialiv; +RGLSYMGLGETMATERIALFVPROC glGetMaterialfv; +RGLSYMGLGETMATERIALIVPROC glGetMaterialiv; +RGLSYMGLCOLORMATERIALPROC glColorMaterial; +RGLSYMGLPIXELZOOMPROC glPixelZoom; +RGLSYMGLPIXELSTOREFPROC glPixelStoref; +RGLSYMGLPIXELSTOREIPROC glPixelStorei; +RGLSYMGLPIXELTRANSFERFPROC glPixelTransferf; +RGLSYMGLPIXELTRANSFERIPROC glPixelTransferi; +RGLSYMGLPIXELMAPFVPROC glPixelMapfv; +RGLSYMGLPIXELMAPUIVPROC glPixelMapuiv; +RGLSYMGLPIXELMAPUSVPROC glPixelMapusv; +RGLSYMGLGETPIXELMAPFVPROC glGetPixelMapfv; +RGLSYMGLGETPIXELMAPUIVPROC glGetPixelMapuiv; +RGLSYMGLGETPIXELMAPUSVPROC glGetPixelMapusv; +RGLSYMGLBITMAPPROC glBitmap; +RGLSYMGLREADPIXELSPROC glReadPixels; +RGLSYMGLDRAWPIXELSPROC glDrawPixels; +RGLSYMGLCOPYPIXELSPROC glCopyPixels; +RGLSYMGLSTENCILFUNCPROC glStencilFunc; +RGLSYMGLSTENCILMASKPROC glStencilMask; +RGLSYMGLSTENCILOPPROC glStencilOp; +RGLSYMGLCLEARSTENCILPROC glClearStencil; +RGLSYMGLTEXGENDPROC glTexGend; +RGLSYMGLTEXGENFPROC glTexGenf; +RGLSYMGLTEXGENIPROC glTexGeni; +RGLSYMGLTEXGENDVPROC glTexGendv; +RGLSYMGLTEXGENFVPROC glTexGenfv; +RGLSYMGLTEXGENIVPROC glTexGeniv; +RGLSYMGLGETTEXGENDVPROC glGetTexGendv; +RGLSYMGLGETTEXGENFVPROC glGetTexGenfv; +RGLSYMGLGETTEXGENIVPROC glGetTexGeniv; +RGLSYMGLTEXENVFPROC glTexEnvf; +RGLSYMGLTEXENVIPROC glTexEnvi; +RGLSYMGLTEXENVFVPROC glTexEnvfv; +RGLSYMGLTEXENVIVPROC glTexEnviv; +RGLSYMGLGETTEXENVFVPROC glGetTexEnvfv; +RGLSYMGLGETTEXENVIVPROC glGetTexEnviv; +RGLSYMGLTEXPARAMETERFPROC glTexParameterf; +RGLSYMGLTEXPARAMETERIPROC glTexParameteri; +RGLSYMGLTEXPARAMETERFVPROC glTexParameterfv; +RGLSYMGLTEXPARAMETERIVPROC glTexParameteriv; +RGLSYMGLGETTEXPARAMETERFVPROC glGetTexParameterfv; +RGLSYMGLGETTEXPARAMETERIVPROC glGetTexParameteriv; +RGLSYMGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParameterfv; +RGLSYMGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv; +RGLSYMGLTEXIMAGE1DPROC glTexImage1D; +RGLSYMGLTEXIMAGE2DPROC glTexImage2D; +RGLSYMGLGETTEXIMAGEPROC glGetTexImage; +RGLSYMGLGENTEXTURESPROC glGenTextures; +RGLSYMGLDELETETEXTURESPROC glDeleteTextures; +RGLSYMGLBINDTEXTUREPROC glBindTexture; +RGLSYMGLPRIORITIZETEXTURESPROC glPrioritizeTextures; +RGLSYMGLARETEXTURESRESIDENTPROC glAreTexturesResident; +RGLSYMGLISTEXTUREPROC glIsTexture; +RGLSYMGLTEXSUBIMAGE1DPROC glTexSubImage1D; +RGLSYMGLTEXSUBIMAGE2DPROC glTexSubImage2D; +RGLSYMGLCOPYTEXIMAGE1DPROC glCopyTexImage1D; +RGLSYMGLCOPYTEXIMAGE2DPROC glCopyTexImage2D; +RGLSYMGLCOPYTEXSUBIMAGE1DPROC glCopyTexSubImage1D; +RGLSYMGLCOPYTEXSUBIMAGE2DPROC glCopyTexSubImage2D; +RGLSYMGLMAP1DPROC glMap1d; +RGLSYMGLMAP1FPROC glMap1f; +RGLSYMGLMAP2DPROC glMap2d; +RGLSYMGLMAP2FPROC glMap2f; +RGLSYMGLGETMAPDVPROC glGetMapdv; +RGLSYMGLGETMAPFVPROC glGetMapfv; +RGLSYMGLGETMAPIVPROC glGetMapiv; +RGLSYMGLEVALCOORD1DPROC glEvalCoord1d; +RGLSYMGLEVALCOORD1FPROC glEvalCoord1f; +RGLSYMGLEVALCOORD1DVPROC glEvalCoord1dv; +RGLSYMGLEVALCOORD1FVPROC glEvalCoord1fv; +RGLSYMGLEVALCOORD2DPROC glEvalCoord2d; +RGLSYMGLEVALCOORD2FPROC glEvalCoord2f; +RGLSYMGLEVALCOORD2DVPROC glEvalCoord2dv; +RGLSYMGLEVALCOORD2FVPROC glEvalCoord2fv; +RGLSYMGLMAPGRID1DPROC glMapGrid1d; +RGLSYMGLMAPGRID1FPROC glMapGrid1f; +RGLSYMGLMAPGRID2DPROC glMapGrid2d; +RGLSYMGLMAPGRID2FPROC glMapGrid2f; +RGLSYMGLEVALPOINT1PROC glEvalPoint1; +RGLSYMGLEVALPOINT2PROC glEvalPoint2; +RGLSYMGLEVALMESH1PROC glEvalMesh1; +RGLSYMGLEVALMESH2PROC glEvalMesh2; +RGLSYMGLFOGFPROC glFogf; +RGLSYMGLFOGIPROC glFogi; +RGLSYMGLFOGFVPROC glFogfv; +RGLSYMGLFOGIVPROC glFogiv; +RGLSYMGLFEEDBACKBUFFERPROC glFeedbackBuffer; +RGLSYMGLPASSTHROUGHPROC glPassThrough; +RGLSYMGLSELECTBUFFERPROC glSelectBuffer; +RGLSYMGLINITNAMESPROC glInitNames; +RGLSYMGLLOADNAMEPROC glLoadName; +RGLSYMGLPUSHNAMEPROC glPushName; +RGLSYMGLPOPNAMEPROC glPopName; +RGLSYMGLDRAWRANGEELEMENTSPROC glDrawRangeElements; +RGLSYMGLTEXIMAGE3DPROC glTexImage3D; +RGLSYMGLTEXSUBIMAGE3DPROC glTexSubImage3D; +RGLSYMGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D; +RGLSYMGLCOLORTABLEPROC glColorTable; +RGLSYMGLCOLORSUBTABLEPROC glColorSubTable; +RGLSYMGLCOLORTABLEPARAMETERIVPROC glColorTableParameteriv; +RGLSYMGLCOLORTABLEPARAMETERFVPROC glColorTableParameterfv; +RGLSYMGLCOPYCOLORSUBTABLEPROC glCopyColorSubTable; +RGLSYMGLCOPYCOLORTABLEPROC glCopyColorTable; +RGLSYMGLGETCOLORTABLEPROC glGetColorTable; +RGLSYMGLGETCOLORTABLEPARAMETERFVPROC glGetColorTableParameterfv; +RGLSYMGLGETCOLORTABLEPARAMETERIVPROC glGetColorTableParameteriv; +RGLSYMGLBLENDEQUATIONPROC glBlendEquation; +RGLSYMGLBLENDCOLORPROC glBlendColor; +RGLSYMGLHISTOGRAMPROC glHistogram; +RGLSYMGLRESETHISTOGRAMPROC glResetHistogram; +RGLSYMGLGETHISTOGRAMPROC glGetHistogram; +RGLSYMGLGETHISTOGRAMPARAMETERFVPROC glGetHistogramParameterfv; +RGLSYMGLGETHISTOGRAMPARAMETERIVPROC glGetHistogramParameteriv; +RGLSYMGLMINMAXPROC glMinmax; +RGLSYMGLRESETMINMAXPROC glResetMinmax; +RGLSYMGLGETMINMAXPROC glGetMinmax; +RGLSYMGLGETMINMAXPARAMETERFVPROC glGetMinmaxParameterfv; +RGLSYMGLGETMINMAXPARAMETERIVPROC glGetMinmaxParameteriv; +RGLSYMGLCONVOLUTIONFILTER1DPROC glConvolutionFilter1D; +RGLSYMGLCONVOLUTIONFILTER2DPROC glConvolutionFilter2D; +RGLSYMGLCONVOLUTIONPARAMETERFPROC glConvolutionParameterf; +RGLSYMGLCONVOLUTIONPARAMETERFVPROC glConvolutionParameterfv; +RGLSYMGLCONVOLUTIONPARAMETERIPROC glConvolutionParameteri; +RGLSYMGLCONVOLUTIONPARAMETERIVPROC glConvolutionParameteriv; +RGLSYMGLCOPYCONVOLUTIONFILTER1DPROC glCopyConvolutionFilter1D; +RGLSYMGLCOPYCONVOLUTIONFILTER2DPROC glCopyConvolutionFilter2D; +RGLSYMGLGETCONVOLUTIONFILTERPROC glGetConvolutionFilter; +RGLSYMGLGETCONVOLUTIONPARAMETERFVPROC glGetConvolutionParameterfv; +RGLSYMGLGETCONVOLUTIONPARAMETERIVPROC glGetConvolutionParameteriv; +RGLSYMGLSEPARABLEFILTER2DPROC glSeparableFilter2D; +RGLSYMGLGETSEPARABLEFILTERPROC glGetSeparableFilter; +RGLSYMGLACTIVETEXTUREPROC glActiveTexture; +RGLSYMGLCLIENTACTIVETEXTUREPROC glClientActiveTexture; +RGLSYMGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D; +RGLSYMGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; +RGLSYMGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D; +RGLSYMGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D; +RGLSYMGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage; +RGLSYMGLMULTITEXCOORD1DPROC glMultiTexCoord1d; +RGLSYMGLMULTITEXCOORD1DVPROC glMultiTexCoord1dv; +RGLSYMGLMULTITEXCOORD1FPROC glMultiTexCoord1f; +RGLSYMGLMULTITEXCOORD1FVPROC glMultiTexCoord1fv; +RGLSYMGLMULTITEXCOORD1IPROC glMultiTexCoord1i; +RGLSYMGLMULTITEXCOORD1IVPROC glMultiTexCoord1iv; +RGLSYMGLMULTITEXCOORD1SPROC glMultiTexCoord1s; +RGLSYMGLMULTITEXCOORD1SVPROC glMultiTexCoord1sv; +RGLSYMGLMULTITEXCOORD2DPROC glMultiTexCoord2d; +RGLSYMGLMULTITEXCOORD2DVPROC glMultiTexCoord2dv; +RGLSYMGLMULTITEXCOORD2FPROC glMultiTexCoord2f; +RGLSYMGLMULTITEXCOORD2FVPROC glMultiTexCoord2fv; +RGLSYMGLMULTITEXCOORD2IPROC glMultiTexCoord2i; +RGLSYMGLMULTITEXCOORD2IVPROC glMultiTexCoord2iv; +RGLSYMGLMULTITEXCOORD2SPROC glMultiTexCoord2s; +RGLSYMGLMULTITEXCOORD2SVPROC glMultiTexCoord2sv; +RGLSYMGLMULTITEXCOORD3DPROC glMultiTexCoord3d; +RGLSYMGLMULTITEXCOORD3DVPROC glMultiTexCoord3dv; +RGLSYMGLMULTITEXCOORD3FPROC glMultiTexCoord3f; +RGLSYMGLMULTITEXCOORD3FVPROC glMultiTexCoord3fv; +RGLSYMGLMULTITEXCOORD3IPROC glMultiTexCoord3i; +RGLSYMGLMULTITEXCOORD3IVPROC glMultiTexCoord3iv; +RGLSYMGLMULTITEXCOORD3SPROC glMultiTexCoord3s; +RGLSYMGLMULTITEXCOORD3SVPROC glMultiTexCoord3sv; +RGLSYMGLMULTITEXCOORD4DPROC glMultiTexCoord4d; +RGLSYMGLMULTITEXCOORD4DVPROC glMultiTexCoord4dv; +RGLSYMGLMULTITEXCOORD4FPROC glMultiTexCoord4f; +RGLSYMGLMULTITEXCOORD4FVPROC glMultiTexCoord4fv; +RGLSYMGLMULTITEXCOORD4IPROC glMultiTexCoord4i; +RGLSYMGLMULTITEXCOORD4IVPROC glMultiTexCoord4iv; +RGLSYMGLMULTITEXCOORD4SPROC glMultiTexCoord4s; +RGLSYMGLMULTITEXCOORD4SVPROC glMultiTexCoord4sv; +RGLSYMGLLOADTRANSPOSEMATRIXDPROC glLoadTransposeMatrixd; +RGLSYMGLLOADTRANSPOSEMATRIXFPROC glLoadTransposeMatrixf; +RGLSYMGLMULTTRANSPOSEMATRIXDPROC glMultTransposeMatrixd; +RGLSYMGLMULTTRANSPOSEMATRIXFPROC glMultTransposeMatrixf; +RGLSYMGLSAMPLECOVERAGEPROC glSampleCoverage; +RGLSYMGLACTIVETEXTUREARBPROC glActiveTextureARB; +RGLSYMGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB; +RGLSYMGLMULTITEXCOORD1DARBPROC glMultiTexCoord1dARB; +RGLSYMGLMULTITEXCOORD1DVARBPROC glMultiTexCoord1dvARB; +RGLSYMGLMULTITEXCOORD1FARBPROC glMultiTexCoord1fARB; +RGLSYMGLMULTITEXCOORD1FVARBPROC glMultiTexCoord1fvARB; +RGLSYMGLMULTITEXCOORD1IARBPROC glMultiTexCoord1iARB; +RGLSYMGLMULTITEXCOORD1IVARBPROC glMultiTexCoord1ivARB; +RGLSYMGLMULTITEXCOORD1SARBPROC glMultiTexCoord1sARB; +RGLSYMGLMULTITEXCOORD1SVARBPROC glMultiTexCoord1svARB; +RGLSYMGLMULTITEXCOORD2DARBPROC glMultiTexCoord2dARB; +RGLSYMGLMULTITEXCOORD2DVARBPROC glMultiTexCoord2dvARB; +RGLSYMGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB; +RGLSYMGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB; +RGLSYMGLMULTITEXCOORD2IARBPROC glMultiTexCoord2iARB; +RGLSYMGLMULTITEXCOORD2IVARBPROC glMultiTexCoord2ivARB; +RGLSYMGLMULTITEXCOORD2SARBPROC glMultiTexCoord2sARB; +RGLSYMGLMULTITEXCOORD2SVARBPROC glMultiTexCoord2svARB; +RGLSYMGLMULTITEXCOORD3DARBPROC glMultiTexCoord3dARB; +RGLSYMGLMULTITEXCOORD3DVARBPROC glMultiTexCoord3dvARB; +RGLSYMGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB; +RGLSYMGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB; +RGLSYMGLMULTITEXCOORD3IARBPROC glMultiTexCoord3iARB; +RGLSYMGLMULTITEXCOORD3IVARBPROC glMultiTexCoord3ivARB; +RGLSYMGLMULTITEXCOORD3SARBPROC glMultiTexCoord3sARB; +RGLSYMGLMULTITEXCOORD3SVARBPROC glMultiTexCoord3svARB; +RGLSYMGLMULTITEXCOORD4DARBPROC glMultiTexCoord4dARB; +RGLSYMGLMULTITEXCOORD4DVARBPROC glMultiTexCoord4dvARB; +RGLSYMGLMULTITEXCOORD4FARBPROC glMultiTexCoord4fARB; +RGLSYMGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB; +RGLSYMGLMULTITEXCOORD4IARBPROC glMultiTexCoord4iARB; +RGLSYMGLMULTITEXCOORD4IVARBPROC glMultiTexCoord4ivARB; +RGLSYMGLMULTITEXCOORD4SARBPROC glMultiTexCoord4sARB; +RGLSYMGLMULTITEXCOORD4SVARBPROC glMultiTexCoord4svARB; +RGLSYMGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; +RGLSYMGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES; +RGLSYMGLBINDTEXTURESPROC glBindTextures; + +#ifdef __cplusplus +} +#endif +#endif // __NX_GLSYM_H__
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libchdr/chd.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libchdr/chd.h
Changed
@@ -193,12 +193,21 @@ #define CHDFLAGS_IS_WRITEABLE 0x00000002 #define CHDFLAGS_UNDEFINED 0xfffffffc +#define CHD_MAKE_TAG(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) + /* compression types */ #define CHDCOMPRESSION_NONE 0 #define CHDCOMPRESSION_ZLIB 1 #define CHDCOMPRESSION_ZLIB_PLUS 2 #define CHDCOMPRESSION_AV 3 +#define CHD_CODEC_ZLIB CHD_MAKE_TAG('z','l','i','b') + +/* general codecs with CD frontend */ +#define CHD_CODEC_CD_ZLIB CHD_MAKE_TAG('c','d','z','l') +#define CHD_CODEC_CD_LZMA CHD_MAKE_TAG('c','d','l','z') +#define CHD_CODEC_CD_FLAC CHD_MAKE_TAG('c','d','f','l') + /* A/V codec configuration parameters */ #define AV_CODEC_COMPRESS_CONFIG 1 #define AV_CODEC_DECOMPRESS_CONFIG 2 @@ -211,33 +220,34 @@ #define CHD_MDFLAGS_CHECKSUM 0x01 /* indicates data is checksummed */ /* standard hard disk metadata */ -#define HARD_DISK_METADATA_TAG 0x47444444 /* 'GDDD' */ -#define HARD_DISK_METADATA_FORMAT "CYLS:%d,HEADS:%d,SECS:%d,BPS:%d" +#define HARD_DISK_METADATA_TAG CHD_MAKE_TAG('G','D','D','D') +#define HARD_DISK_METADATA_FORMAT "CYLS:%u,HEADS:%u,SECS:%u,BPS:%u" /* hard disk identify information */ -#define HARD_DISK_IDENT_METADATA_TAG 0x49444e54 /* 'IDNT' */ +#define HARD_DISK_IDENT_METADATA_TAG CHD_MAKE_TAG('I','D','N','T') /* hard disk key information */ -#define HARD_DISK_KEY_METADATA_TAG 0x4b455920 /* 'KEY ' */ +#define HARD_DISK_KEY_METADATA_TAG CHD_MAKE_TAG('K','E','Y',' ') /* pcmcia CIS information */ -#define PCMCIA_CIS_METADATA_TAG 0x43495320 /* 'CIS ' */ +#define PCMCIA_CIS_METADATA_TAG CHD_MAKE_TAG('C','I','S',' ') /* standard CD-ROM metadata */ -#define CDROM_OLD_METADATA_TAG 0x43484344 /* 'CHCD' */ -#define CDROM_TRACK_METADATA_TAG 0x43485452 /* 'CHTR' */ -#define CDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d" -#define CDROM_TRACK_METADATA2_TAG 0x43485432 /* 'CHT2' */ -#define CDROM_TRACK_METADATA2_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" -#define GDROM_TRACK_METADATA_TAG 0x43484744 /* 'CHTD' */ -#define GDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PAD:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" +#define CDROM_OLD_METADATA_TAG CHD_MAKE_TAG('C','H','C','D') +#define CDROM_TRACK_METADATA_TAG CHD_MAKE_TAG('C','H','T','R') +#define CDROM_TRACK_METADATA_FORMAT "TRACK:%u TYPE:%s SUBTYPE:%s FRAMES:%u" +#define CDROM_TRACK_METADATA2_TAG CHD_MAKE_TAG('C','H','T','2') +#define CDROM_TRACK_METADATA2_FORMAT "TRACK:%u TYPE:%s SUBTYPE:%s FRAMES:%u PREGAP:%u PGTYPE:%s PGSUB:%s POSTGAP:%u" +#define GDROM_OLD_METADATA_TAG CHD_MAKE_TAG('C','H','G','T') +#define GDROM_TRACK_METADATA_TAG CHD_MAKE_TAG('C', 'H', 'G', 'D') +#define GDROM_TRACK_METADATA_FORMAT "TRACK:%u TYPE:%s SUBTYPE:%s FRAMES:%u PAD:%u PREGAP:%u PGTYPE:%s PGSUB:%s POSTGAP:%u" /* standard A/V metadata */ -#define AV_METADATA_TAG 0x41564156 /* 'AVAV' */ +#define AV_METADATA_TAG CHD_MAKE_TAG('A','V','A','V') #define AV_METADATA_FORMAT "FPS:%d.%06d WIDTH:%d HEIGHT:%d INTERLACED:%d CHANNELS:%d SAMPLERATE:%d" /* A/V laserdisc frame metadata */ -#define AV_LD_METADATA_TAG 0x41564C44 /* 'AVLD' */ +#define AV_LD_METADATA_TAG CHD_MAKE_TAG('A','V','L','D') /* CHD open values */ #define CHD_OPEN_READ 1
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libchdr/libchdr_zlib.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libchdr/libchdr_zlib.h
Changed
@@ -27,6 +27,7 @@ struct _zlib_allocator { UINT32 * allocptr[MAX_ZLIB_ALLOCS]; + UINT32 * allocptr2[MAX_ZLIB_ALLOCS]; }; typedef struct _zlib_codec_data zlib_codec_data;
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libchdr/lzma.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libchdr/lzma.h
Changed
@@ -30,6 +30,7 @@ void (*Free)(void *p, void *address); /* address can be 0 */ void (*FreeSz)(void *p, void *address, size_t size); /* address can be 0 */ uint32_t* allocptr[MAX_LZMA_ALLOCS]; + uint32_t* allocptr2[MAX_LZMA_ALLOCS]; }; typedef struct _lzma_codec_data lzma_codec_data;
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libco.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libco.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (libco.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libretro.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libretro.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this libretro API header (libretro.h). @@ -69,7 +69,7 @@ # endif # endif # else -# if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__CELLOS_LV2__) +# if defined(__GNUC__) && __GNUC__ >= 4 # define RETRO_API RETRO_CALLCONV __attribute__((__visibility__("default"))) # else # define RETRO_API RETRO_CALLCONV @@ -278,6 +278,11 @@ RETRO_LANGUAGE_ARABIC = 16, RETRO_LANGUAGE_GREEK = 17, RETRO_LANGUAGE_TURKISH = 18, + RETRO_LANGUAGE_SLOVAK = 19, + RETRO_LANGUAGE_PERSIAN = 20, + RETRO_LANGUAGE_HEBREW = 21, + RETRO_LANGUAGE_ASTURIAN = 22, + RETRO_LANGUAGE_FINNISH = 23, RETRO_LANGUAGE_LAST, /* Ensure sizeof(enum) == sizeof(int) */ @@ -708,6 +713,9 @@ * state of rumble motors in controllers. * A strong and weak motor is supported, and they can be * controlled indepedently. + * Should be called from either retro_init() or retro_load_game(). + * Should not be called from retro_set_environment(). + * Returns false if rumble functionality is unavailable. */ #define RETRO_ENVIRONMENT_GET_INPUT_DEVICE_CAPABILITIES 24 /* uint64_t * -- @@ -1087,10 +1095,10 @@ #define RETRO_ENVIRONMENT_GET_TARGET_REFRESH_RATE (50 | RETRO_ENVIRONMENT_EXPERIMENTAL) /* float * -- - * Float value that lets us know what target refresh rate + * Float value that lets us know what target refresh rate * is curently in use by the frontend. * - * The core can use the returned value to set an ideal + * The core can use the returned value to set an ideal * refresh rate/framerate. */ @@ -1098,7 +1106,7 @@ /* bool * -- * Boolean value that indicates whether or not the frontend supports * input bitmasks being returned by retro_input_state_t. The advantage - * of this is that retro_input_state_t has to be only called once to + * of this is that retro_input_state_t has to be only called once to * grab all button states instead of multiple times. * * If it returns true, you can pass RETRO_DEVICE_ID_JOYPAD_MASK as 'id' @@ -1117,7 +1125,7 @@ * This may be still be done regardless of the core options * interface version. * - * If version is 1 however, core options may instead be set by + * If version is >= 1 however, core options may instead be set by * passing an array of retro_core_option_definition structs to * RETRO_ENVIRONMENT_SET_CORE_OPTIONS, or a 2D array of * retro_core_option_definition structs to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL. @@ -1132,8 +1140,8 @@ * GET_VARIABLE. * This allows the frontend to present these variables to * a user dynamically. - * This should only be called if RETRO_ENVIRONMENT_GET_ENHANCED_CORE_OPTIONS - * returns an API version of 1. + * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION + * returns an API version of >= 1. * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. * This should be called the first time as early as * possible (ideally in retro_set_environment). @@ -1169,8 +1177,6 @@ * i.e. it should be feasible to cycle through options * without a keyboard. * - * First entry should be treated as a default. - * * Example entry: * { * "foo_option", @@ -1196,8 +1202,8 @@ * GET_VARIABLE. * This allows the frontend to present these variables to * a user dynamically. - * This should only be called if RETRO_ENVIRONMENT_GET_ENHANCED_CORE_OPTIONS - * returns an API version of 1. + * This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION + * returns an API version of >= 1. * This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES. * This should be called the first time as early as * possible (ideally in retro_set_environment). @@ -1257,7 +1263,131 @@ * * 'data' points to an unsigned variable */ - + +#define RETRO_ENVIRONMENT_GET_DISK_CONTROL_INTERFACE_VERSION 57 + /* unsigned * -- + * Unsigned value is the API version number of the disk control + * interface supported by the frontend. If callback return false, + * API version is assumed to be 0. + * + * In legacy code, the disk control interface is defined by passing + * a struct of type retro_disk_control_callback to + * RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE. + * This may be still be done regardless of the disk control + * interface version. + * + * If version is >= 1 however, the disk control interface may + * instead be defined by passing a struct of type + * retro_disk_control_ext_callback to + * RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE. + * This allows the core to provide additional information about + * disk images to the frontend and/or enables extra + * disk control functionality by the frontend. + */ + +#define RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE 58 + /* const struct retro_disk_control_ext_callback * -- + * Sets an interface which frontend can use to eject and insert + * disk images, and also obtain information about individual + * disk image files registered by the core. + * This is used for games which consist of multiple images and + * must be manually swapped out by the user (e.g. PSX, floppy disk + * based systems). + */ + +#define RETRO_ENVIRONMENT_GET_MESSAGE_INTERFACE_VERSION 59 + /* unsigned * -- + * Unsigned value is the API version number of the message + * interface supported by the frontend. If callback returns + * false, API version is assumed to be 0. + * + * In legacy code, messages may be displayed in an + * implementation-specific manner by passing a struct + * of type retro_message to RETRO_ENVIRONMENT_SET_MESSAGE. + * This may be still be done regardless of the message + * interface version. + * + * If version is >= 1 however, messages may instead be + * displayed by passing a struct of type retro_message_ext + * to RETRO_ENVIRONMENT_SET_MESSAGE_EXT. This allows the + * core to specify message logging level, priority and + * destination (OSD, logging interface or both). + */ + +#define RETRO_ENVIRONMENT_SET_MESSAGE_EXT 60 + /* const struct retro_message_ext * -- + * Sets a message to be displayed in an implementation-specific + * manner for a certain amount of 'frames'. Additionally allows + * the core to specify message logging level, priority and + * destination (OSD, logging interface or both). + * Should not be used for trivial messages, which should simply be + * logged via RETRO_ENVIRONMENT_GET_LOG_INTERFACE (or as a + * fallback, stderr). + */ + +#define RETRO_ENVIRONMENT_GET_INPUT_MAX_USERS 61 + /* unsigned * -- + * Unsigned value is the number of active input devices + * provided by the frontend. This may change between + * frames, but will remain constant for the duration + * of each frame. + * If callback returns true, a core need not poll any + * input device with an index greater than or equal to + * the number of active devices. + * If callback returns false, the number of active input + * devices is unknown. In this case, all input devices + * should be considered active. + */ + +#define RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK 62 + /* const struct retro_audio_buffer_status_callback * -- + * Lets the core know the occupancy level of the frontend + * audio buffer. Can be used by a core to attempt frame + * skipping in order to avoid buffer under-runs. + * A core may pass NULL to disable buffer status reporting + * in the frontend. + */ + +#define RETRO_ENVIRONMENT_SET_MINIMUM_AUDIO_LATENCY 63 + /* const unsigned * -- + * Sets minimum frontend audio latency in milliseconds. + * Resultant audio latency may be larger than set value, + * or smaller if a hardware limit is encountered. A frontend + * is expected to honour requests up to 512 ms. + * + * - If value is less than current frontend + * audio latency, callback has no effect + * - If value is zero, default frontend audio + * latency is set + * + * May be used by a core to increase audio latency and + * therefore decrease the probability of buffer under-runs + * (crackling) when performing 'intensive' operations. + * A core utilising RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK + * to implement audio-buffer-based frame skipping may achieve + * optimal results by setting the audio latency to a 'high' + * (typically 6x or 8x) integer multiple of the expected + * frame time. + * + * WARNING: This can only be called from within retro_run(). + * Calling this can require a full reinitialization of audio + * drivers in the frontend, so it is important to call it very + * sparingly, and usually only with the users explicit consent. + * An eventual driver reinitialize will happen so that audio + * callbacks happening after this call within the same retro_run() + * call will target the newly initialized driver. + */ + +#define RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE 64 + /* const struct retro_fastforwarding_override * -- + * Used by a libretro core to override the current + * fastforwarding mode of the frontend. + * If NULL is passed to this function, the frontend + * will return true if fastforwarding override + * functionality is supported (no change in + * fastforwarding state will occur in this case). + */ + /* VFS functionality */ /* File paths: @@ -2147,6 +2277,30 @@ retro_usec_t reference; }; +/* Notifies a libretro core of the current occupancy + * level of the frontend audio buffer. + * + * - active: 'true' if audio buffer is currently + * in use. Will be 'false' if audio is + * disabled in the frontend + * + * - occupancy: Given as a value in the range [0,100], + * corresponding to the occupancy percentage + * of the audio buffer + * + * - underrun_likely: 'true' if the frontend expects an + * audio buffer underrun during the + * next frame (indicates that a core + * should attempt frame skipping) + * + * It will be called right before retro_run() every frame. */ +typedef void (RETRO_CALLCONV *retro_audio_buffer_status_callback_t)( + bool active, unsigned occupancy, bool underrun_likely); +struct retro_audio_buffer_status_callback +{ + retro_audio_buffer_status_callback_t callback; +}; + /* Pass this to retro_video_refresh_t if rendering to hardware. * Passing NULL to retro_video_refresh_t is still a frame dupe as normal. * */ @@ -2307,7 +2461,8 @@ retro_keyboard_event_t callback; }; -/* Callbacks for RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE. +/* Callbacks for RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE & + * RETRO_ENVIRONMENT_SET_DISK_CONTROL_EXT_INTERFACE. * Should be set for implementations which can swap out multiple disk * images in runtime. * @@ -2365,6 +2520,53 @@ * with replace_image_index. */ typedef bool (RETRO_CALLCONV *retro_add_image_index_t)(void); +/* Sets initial image to insert in drive when calling + * core_load_game(). + * Since we cannot pass the initial index when loading + * content (this would require a major API change), this + * is set by the frontend *before* calling the core's + * retro_load_game()/retro_load_game_special() implementation. + * A core should therefore cache the index/path values and handle + * them inside retro_load_game()/retro_load_game_special(). + * - If 'index' is invalid (index >= get_num_images()), the + * core should ignore the set value and instead use 0 + * - 'path' is used purely for error checking - i.e. when + * content is loaded, the core should verify that the + * disk specified by 'index' has the specified file path. + * This is to guard against auto selecting the wrong image + * if (for example) the user should modify an existing M3U + * playlist. We have to let the core handle this because + * set_initial_image() must be called before loading content, + * i.e. the frontend cannot access image paths in advance + * and thus cannot perform the error check itself. + * If set path and content path do not match, the core should + * ignore the set 'index' value and instead use 0 + * Returns 'false' if index or 'path' are invalid, or core + * does not support this functionality + */ +typedef bool (RETRO_CALLCONV *retro_set_initial_image_t)(unsigned index, const char *path); + +/* Fetches the path of the specified disk image file. + * Returns 'false' if index is invalid (index >= get_num_images()) + * or path is otherwise unavailable. + */ +typedef bool (RETRO_CALLCONV *retro_get_image_path_t)(unsigned index, char *path, size_t len); + +/* Fetches a core-provided 'label' for the specified disk + * image file. In the simplest case this may be a file name + * (without extension), but for cores with more complex + * content requirements information may be provided to + * facilitate user disk swapping - for example, a core + * running floppy-disk-based content may uniquely label + * save disks, data disks, level disks, etc. with names + * corresponding to in-game disk change prompts (so the + * frontend can provide better user guidance than a 'dumb' + * disk index value). + * Returns 'false' if index is invalid (index >= get_num_images()) + * or label is otherwise unavailable. + */ +typedef bool (RETRO_CALLCONV *retro_get_image_label_t)(unsigned index, char *label, size_t len); + struct retro_disk_control_callback { retro_set_eject_state_t set_eject_state; @@ -2378,6 +2580,27 @@ retro_add_image_index_t add_image_index; }; +struct retro_disk_control_ext_callback +{ + retro_set_eject_state_t set_eject_state; + retro_get_eject_state_t get_eject_state; + + retro_get_image_index_t get_image_index; + retro_set_image_index_t set_image_index; + retro_get_num_images_t get_num_images; + + retro_replace_image_index_t replace_image_index; + retro_add_image_index_t add_image_index; + + /* NOTE: Frontend will only attempt to record/restore + * last used disk index if both set_initial_image() + * and get_image_path() are implemented */ + retro_set_initial_image_t set_initial_image; /* Optional - may be NULL */ + + retro_get_image_path_t get_image_path; /* Optional - may be NULL */ + retro_get_image_label_t get_image_label; /* Optional - may be NULL */ +}; + enum retro_pixel_format { /* 0RGB1555, native endian. @@ -2408,6 +2631,104 @@ unsigned frames; /* Duration in frames of message. */ }; +enum retro_message_target +{ + RETRO_MESSAGE_TARGET_ALL = 0, + RETRO_MESSAGE_TARGET_OSD, + RETRO_MESSAGE_TARGET_LOG +}; + +enum retro_message_type +{ + RETRO_MESSAGE_TYPE_NOTIFICATION = 0, + RETRO_MESSAGE_TYPE_NOTIFICATION_ALT, + RETRO_MESSAGE_TYPE_STATUS, + RETRO_MESSAGE_TYPE_PROGRESS +}; + +struct retro_message_ext +{ + /* Message string to be displayed/logged */ + const char *msg; + /* Duration (in ms) of message when targeting the OSD */ + unsigned duration; + /* Message priority when targeting the OSD + * > When multiple concurrent messages are sent to + * the frontend and the frontend does not have the + * capacity to display them all, messages with the + * *highest* priority value should be shown + * > There is no upper limit to a message priority + * value (within the bounds of the unsigned data type) + * > In the reference frontend (RetroArch), the same + * priority values are used for frontend-generated + * notifications, which are typically assigned values + * between 0 and 3 depending upon importance */ + unsigned priority; + /* Message logging level (info, warn, error, etc.) */ + enum retro_log_level level; + /* Message destination: OSD, logging interface or both */ + enum retro_message_target target; + /* Message 'type' when targeting the OSD + * > RETRO_MESSAGE_TYPE_NOTIFICATION: Specifies that a + * message should be handled in identical fashion to + * a standard frontend-generated notification + * > RETRO_MESSAGE_TYPE_NOTIFICATION_ALT: Specifies that + * message is a notification that requires user attention + * or action, but that it should be displayed in a manner + * that differs from standard frontend-generated notifications. + * This would typically correspond to messages that should be + * displayed immediately (independently from any internal + * frontend message queue), and/or which should be visually + * distinguishable from frontend-generated notifications. + * For example, a core may wish to inform the user of + * information related to a disk-change event. It is + * expected that the frontend itself may provide a + * notification in this case; if the core sends a + * message of type RETRO_MESSAGE_TYPE_NOTIFICATION, an + * uncomfortable 'double-notification' may occur. A message + * of RETRO_MESSAGE_TYPE_NOTIFICATION_ALT should therefore + * be presented such that visual conflict with regular + * notifications does not occur + * > RETRO_MESSAGE_TYPE_STATUS: Indicates that message + * is not a standard notification. This typically + * corresponds to 'status' indicators, such as a core's + * internal FPS, which are intended to be displayed + * either permanently while a core is running, or in + * a manner that does not suggest user attention or action + * is required. 'Status' type messages should therefore be + * displayed in a different on-screen location and in a manner + * easily distinguishable from both standard frontend-generated + * notifications and messages of type RETRO_MESSAGE_TYPE_NOTIFICATION_ALT + * > RETRO_MESSAGE_TYPE_PROGRESS: Indicates that message reports + * the progress of an internal core task. For example, in cases + * where a core itself handles the loading of content from a file, + * this may correspond to the percentage of the file that has been + * read. Alternatively, an audio/video playback core may use a + * message of type RETRO_MESSAGE_TYPE_PROGRESS to display the current + * playback position as a percentage of the runtime. 'Progress' type + * messages should therefore be displayed as a literal progress bar, + * where: + * - 'retro_message_ext.msg' is the progress bar title/label + * - 'retro_message_ext.progress' determines the length of + * the progress bar + * NOTE: Message type is a *hint*, and may be ignored + * by the frontend. If a frontend lacks support for + * displaying messages via alternate means than standard + * frontend-generated notifications, it will treat *all* + * messages as having the type RETRO_MESSAGE_TYPE_NOTIFICATION */ + enum retro_message_type type; + /* Task progress when targeting the OSD and message is + * of type RETRO_MESSAGE_TYPE_PROGRESS + * > -1: Unmetered/indeterminate + * > 0-100: Current progress percentage + * NOTE: Since message type is a hint, a frontend may ignore + * progress values. Where relevant, a core should therefore + * include progress percentage within the message string, + * such that the message intent remains clear when displayed + * as a standard frontend-generated notification */ + int8_t progress; +}; + /* Describes how the libretro implementation maps a libretro input bind * to its internal input system through a human readable string. * This string can be used to better let a user configure input. */ @@ -2428,7 +2749,7 @@ struct retro_system_info { /* All pointers are owned by libretro implementation, and pointers must - * remain valid until retro_deinit() is called. */ + * remain valid until it is unloaded. */ const char *library_name; /* Descriptive name of library. Should not * contain any version numbers, etc. */ @@ -2522,8 +2843,20 @@ }; /* Maximum number of values permitted for a core option - * NOTE: This may be increased on a core-by-core basis - * if required (doing so has no effect on the frontend) */ + * > Note: We have to set a maximum value due the limitations + * of the C language - i.e. it is not possible to create an + * array of structs each containing a variable sized array, + * so the retro_core_option_definition values array must + * have a fixed size. The size limit of 128 is a balancing + * act - it needs to be large enough to support all 'sane' + * core options, but setting it too large may impact low memory + * platforms. In practise, if a core option has more than + * 128 values then the implementation is likely flawed. + * To quote the above API reference: + * "The number of possible options should be very limited + * i.e. it should be feasible to cycle through options + * without a keyboard." + */ #define RETRO_NUM_CORE_OPTION_VALUES_MAX 128 struct retro_core_option_value @@ -2615,6 +2948,47 @@ Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. */ }; +/* Used by a libretro core to override the current + * fastforwarding mode of the frontend */ +struct retro_fastforwarding_override +{ + /* Specifies the runtime speed multiplier that + * will be applied when 'fastforward' is true. + * For example, a value of 5.0 when running 60 FPS + * content will cap the fast-forward rate at 300 FPS. + * Note that the target multiplier may not be achieved + * if the host hardware has insufficient processing + * power. + * Setting a value of 0.0 (or greater than 0.0 but + * less than 1.0) will result in an uncapped + * fast-forward rate (limited only by hardware + * capacity). + * If the value is negative, it will be ignored + * (i.e. the frontend will use a runtime speed + * multiplier of its own choosing) */ + float ratio; + + /* If true, fastforwarding mode will be enabled. + * If false, fastforwarding mode will be disabled. */ + bool fastforward; + + /* If true, and if supported by the frontend, an + * on-screen notification will be displayed while + * 'fastforward' is true. + * If false, and if supported by the frontend, any + * on-screen fast-forward notifications will be + * suppressed */ + bool notification; + + /* If true, the core will have sole control over + * when fastforwarding mode is enabled/disabled; + * the frontend will not be able to change the + * state set by 'fastforward' until either + * 'inhibit_toggle' is set to false, or the core + * is unloaded */ + bool inhibit_toggle; +}; + /* Callbacks */ /* Environment callback. Gives implementations a way of performing
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libretro_d3d.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libretro_d3d.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------------- * The following license statement only applies to this libretro API header (libretro_d3d.h)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libretro_dspfilter.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libretro_dspfilter.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this libretro API header (libretro_dspfilter.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/libretro_gskit_ps2.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libretro_gskit_ps2.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------------- * The following license statement only applies to this libretro API header (libretro_d3d.h) @@ -33,7 +33,17 @@ #include <gsKit.h> -#define RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION 1 +#define RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION 2 + +struct retro_hw_ps2_insets +{ + float top; + float left; + float bottom; + float right; +}; + +#define empty_ps2_insets (struct retro_hw_ps2_insets){0.f, 0.f, 0.f, 0.f} struct retro_hw_render_interface_gskit_ps2 { @@ -47,7 +57,7 @@ * in this interface. */ GSTEXTURE *coreTexture; - bool clearTexture; + struct retro_hw_ps2_insets padding; }; typedef struct retro_hw_render_interface_gskit_ps2 RETRO_HW_RENDER_INTEFACE_GSKIT_PS2;
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/libretro_vulkan.h
Added
@@ -0,0 +1,397 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------------- + * The following license statement only applies to this libretro API header (libretro_vulkan.h) + * --------------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBRETRO_VULKAN_H__ +#define LIBRETRO_VULKAN_H__ + +#include <libretro.h> +#include <vulkan/vulkan.h> + +#define RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION 5 +#define RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN_VERSION 1 + +struct retro_vulkan_image +{ + VkImageView image_view; + VkImageLayout image_layout; + VkImageViewCreateInfo create_info; +}; + +typedef void (*retro_vulkan_set_image_t)(void *handle, + const struct retro_vulkan_image *image, + uint32_t num_semaphores, + const VkSemaphore *semaphores, + uint32_t src_queue_family); + +typedef uint32_t (*retro_vulkan_get_sync_index_t)(void *handle); +typedef uint32_t (*retro_vulkan_get_sync_index_mask_t)(void *handle); +typedef void (*retro_vulkan_set_command_buffers_t)(void *handle, + uint32_t num_cmd, + const VkCommandBuffer *cmd); +typedef void (*retro_vulkan_wait_sync_index_t)(void *handle); +typedef void (*retro_vulkan_lock_queue_t)(void *handle); +typedef void (*retro_vulkan_unlock_queue_t)(void *handle); +typedef void (*retro_vulkan_set_signal_semaphore_t)(void *handle, VkSemaphore semaphore); + +typedef const VkApplicationInfo *(*retro_vulkan_get_application_info_t)(void); + +struct retro_vulkan_context +{ + VkPhysicalDevice gpu; + VkDevice device; + VkQueue queue; + uint32_t queue_family_index; + VkQueue presentation_queue; + uint32_t presentation_queue_family_index; +}; + +typedef bool (*retro_vulkan_create_device_t)( + struct retro_vulkan_context *context, + VkInstance instance, + VkPhysicalDevice gpu, + VkSurfaceKHR surface, + PFN_vkGetInstanceProcAddr get_instance_proc_addr, + const char **required_device_extensions, + unsigned num_required_device_extensions, + const char **required_device_layers, + unsigned num_required_device_layers, + const VkPhysicalDeviceFeatures *required_features); + +typedef void (*retro_vulkan_destroy_device_t)(void); + +/* Note on thread safety: + * The Vulkan API is heavily designed around multi-threading, and + * the libretro interface for it should also be threading friendly. + * A core should be able to build command buffers and submit + * command buffers to the GPU from any thread. + */ + +struct retro_hw_render_context_negotiation_interface_vulkan +{ + /* Must be set to RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN. */ + enum retro_hw_render_context_negotiation_interface_type interface_type; + /* Must be set to RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN_VERSION. */ + unsigned interface_version; + + /* If non-NULL, returns a VkApplicationInfo struct that the frontend can use instead of + * its "default" application info. + */ + retro_vulkan_get_application_info_t get_application_info; + + /* If non-NULL, the libretro core will choose one or more physical devices, + * create one or more logical devices and create one or more queues. + * The core must prepare a designated PhysicalDevice, Device, Queue and queue family index + * which the frontend will use for its internal operation. + * + * If gpu is not VK_NULL_HANDLE, the physical device provided to the frontend must be this PhysicalDevice. + * The core is still free to use other physical devices. + * + * The frontend will request certain extensions and layers for a device which is created. + * The core must ensure that the queue and queue_family_index support GRAPHICS and COMPUTE. + * + * If surface is not VK_NULL_HANDLE, the core must consider presentation when creating the queues. + * If presentation to "surface" is supported on the queue, presentation_queue must be equal to queue. + * If not, a second queue must be provided in presentation_queue and presentation_queue_index. + * If surface is not VK_NULL_HANDLE, the instance from frontend will have been created with supported for + * VK_KHR_surface extension. + * + * The core is free to set its own queue priorities. + * Device provided to frontend is owned by the frontend, but any additional device resources must be freed by core + * in destroy_device callback. + * + * If this function returns true, a PhysicalDevice, Device and Queues are initialized. + * If false, none of the above have been initialized and the frontend will attempt + * to fallback to "default" device creation, as if this function was never called. + */ + retro_vulkan_create_device_t create_device; + + /* If non-NULL, this callback is called similar to context_destroy for HW_RENDER_INTERFACE. + * However, it will be called even if context_reset was not called. + * This can happen if the context never succeeds in being created. + * destroy_device will always be called before the VkInstance + * of the frontend is destroyed if create_device was called successfully so that the core has a chance of + * tearing down its own device resources. + * + * Only auxillary resources should be freed here, i.e. resources which are not part of retro_vulkan_context. + */ + retro_vulkan_destroy_device_t destroy_device; +}; + +struct retro_hw_render_interface_vulkan +{ + /* Must be set to RETRO_HW_RENDER_INTERFACE_VULKAN. */ + enum retro_hw_render_interface_type interface_type; + /* Must be set to RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION. */ + unsigned interface_version; + + /* Opaque handle to the Vulkan backend in the frontend + * which must be passed along to all function pointers + * in this interface. + * + * The rationale for including a handle here (which libretro v1 + * doesn't currently do in general) is: + * + * - Vulkan cores should be able to be freely threaded without lots of fuzz. + * This would break frontends which currently rely on TLS + * to deal with multiple cores loaded at the same time. + * - Fixing this in general is TODO for an eventual libretro v2. + */ + void *handle; + + /* The Vulkan instance the context is using. */ + VkInstance instance; + /* The physical device used. */ + VkPhysicalDevice gpu; + /* The logical device used. */ + VkDevice device; + + /* Allows a core to fetch all its needed symbols without having to link + * against the loader itself. */ + PFN_vkGetDeviceProcAddr get_device_proc_addr; + PFN_vkGetInstanceProcAddr get_instance_proc_addr; + + /* The queue the core must use to submit data. + * This queue and index must remain constant throughout the lifetime + * of the context. + * + * This queue will be the queue that supports graphics and compute + * if the device supports compute. + */ + VkQueue queue; + unsigned queue_index; + + /* Before calling retro_video_refresh_t with RETRO_HW_FRAME_BUFFER_VALID, + * set which image to use for this frame. + * + * If num_semaphores is non-zero, the frontend will wait for the + * semaphores provided to be signaled before using the results further + * in the pipeline. + * + * Semaphores provided by a single call to set_image will only be + * waited for once (waiting for a semaphore resets it). + * E.g. set_image, video_refresh, and then another + * video_refresh without set_image, + * but same image will only wait for semaphores once. + * + * For this reason, ownership transfer will only occur if semaphores + * are waited on for a particular frame in the frontend. + * + * Using semaphores is optional for synchronization purposes, + * but if not using + * semaphores, an image memory barrier in vkCmdPipelineBarrier + * should be used in the graphics_queue. + * Example: + * + * vkCmdPipelineBarrier(cmd, + * srcStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, + * dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + * image_memory_barrier = { + * srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + * dstAccessMask = VK_ACCESS_SHADER_READ_BIT, + * }); + * + * The use of pipeline barriers instead of semaphores is encouraged + * as it is simpler and more fine-grained. A layout transition + * must generally happen anyways which requires a + * pipeline barrier. + * + * The image passed to set_image must have imageUsage flags set to at least + * VK_IMAGE_USAGE_TRANSFER_SRC_BIT and VK_IMAGE_USAGE_SAMPLED_BIT. + * The core will naturally want to use flags such as + * VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT and/or + * VK_IMAGE_USAGE_TRANSFER_DST_BIT depending + * on how the final image is created. + * + * The image must also have been created with MUTABLE_FORMAT bit set if + * 8-bit formats are used, so that the frontend can reinterpret sRGB + * formats as it sees fit. + * + * Images passed to set_image should be created with TILING_OPTIMAL. + * The image layout should be transitioned to either + * VK_IMAGE_LAYOUT_GENERIC or VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL. + * The actual image layout used must be set in image_layout. + * + * The image must be a 2D texture which may or not be layered + * and/or mipmapped. + * + * The image must be suitable for linear sampling. + * While the image_view is typically the only field used, + * the frontend may want to reinterpret the texture as sRGB vs. + * non-sRGB for example so the VkImageViewCreateInfo used to + * create the image view must also be passed in. + * + * The data in the pointer to the image struct will not be copied + * as the pNext field in create_info cannot be reliably deep-copied. + * The image pointer passed to set_image must be valid until + * retro_video_refresh_t has returned. + * + * If frame duping is used when passing NULL to retro_video_refresh_t, + * the frontend is free to either use the latest image passed to + * set_image or reuse the older pointer passed to set_image the + * frame RETRO_HW_FRAME_BUFFER_VALID was last used. + * + * Essentially, the lifetime of the pointer passed to + * retro_video_refresh_t should be extended if frame duping is used + * so that the frontend can reuse the older pointer. + * + * The image itself however, must not be touched by the core until + * wait_sync_index has been completed later. The frontend may perform + * layout transitions on the image, so even read-only access is not defined. + * The exception to read-only rule is if GENERAL layout is used for the image. + * In this case, the frontend is not allowed to perform any layout transitions, + * so concurrent reads from core and frontend are allowed. + * + * If frame duping is used, or if set_command_buffers is used, + * the frontend will not wait for any semaphores. + * + * The src_queue_family is used to specify which queue family + * the image is currently owned by. If using multiple queue families + * (e.g. async compute), the frontend will need to acquire ownership of the + * image before rendering with it and release the image afterwards. + * + * If src_queue_family is equal to the queue family (queue_index), + * no ownership transfer will occur. + * Similarly, if src_queue_family is VK_QUEUE_FAMILY_IGNORED, + * no ownership transfer will occur. + * + * The frontend will always release ownership back to src_queue_family. + * Waiting for frontend to complete with wait_sync_index() ensures that + * the frontend has released ownership back to the application. + * Note that in Vulkan, transfering ownership is a two-part process. + * + * Example frame: + * - core releases ownership from src_queue_index to queue_index with VkImageMemoryBarrier. + * - core calls set_image with src_queue_index. + * - Frontend will acquire the image with src_queue_index -> queue_index as well, completing the ownership transfer. + * - Frontend renders the frame. + * - Frontend releases ownership with queue_index -> src_queue_index. + * - Next time image is used, core must acquire ownership from queue_index ... + * + * Since the frontend releases ownership, we cannot necessarily dupe the frame because + * the core needs to make the roundtrip of ownership transfer. + */ + retro_vulkan_set_image_t set_image; + + /* Get the current sync index for this frame which is obtained in + * frontend by calling e.g. vkAcquireNextImageKHR before calling + * retro_run(). + * + * This index will correspond to which swapchain buffer is currently + * the active one. + * + * Knowing this index is very useful for maintaining safe asynchronous CPU + * and GPU operation without stalling. + * + * The common pattern for synchronization is to receive fences when + * submitting command buffers to Vulkan (vkQueueSubmit) and add this fence + * to a list of fences for frame number get_sync_index(). + * + * Next time we receive the same get_sync_index(), we can wait for the + * fences from before, which will usually return immediately as the + * frontend will generally also avoid letting the GPU run ahead too much. + * + * After the fence has signaled, we know that the GPU has completed all + * GPU work related to work submitted in the frame we last saw get_sync_index(). + * + * This means we can safely reuse or free resources allocated in this frame. + * + * In theory, even if we wait for the fences correctly, it is not technically + * safe to write to the image we earlier passed to the frontend since we're + * not waiting for the frontend GPU jobs to complete. + * + * The frontend will guarantee that the appropriate pipeline barrier + * in graphics_queue has been used such that + * VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT cannot + * start until the frontend is done with the image. + */ + retro_vulkan_get_sync_index_t get_sync_index; + + /* Returns a bitmask of how many swapchain images we currently have + * in the frontend. + * + * If bit #N is set in the return value, get_sync_index can return N. + * Knowing this value is useful for preallocating per-frame management + * structures ahead of time. + * + * While this value will typically remain constant throughout the + * applications lifecycle, it may for example change if the frontend + * suddently changes fullscreen state and/or latency. + * + * If this value ever changes, it is safe to assume that the device + * is completely idle and all synchronization objects can be deleted + * right away as desired. + */ + retro_vulkan_get_sync_index_mask_t get_sync_index_mask; + + /* Instead of submitting the command buffer to the queue first, the core + * can pass along its command buffer to the frontend, and the frontend + * will submit the command buffer together with the frontends command buffers. + * + * This has the advantage that the overhead of vkQueueSubmit can be + * amortized into a single call. For this mode, semaphores in set_image + * will be ignored, so vkCmdPipelineBarrier must be used to synchronize + * the core and frontend. + * + * The command buffers in set_command_buffers are only executed once, + * even if frame duping is used. + * + * If frame duping is used, set_image should be used for the frames + * which should be duped instead. + * + * Command buffers passed to the frontend with set_command_buffers + * must not actually be submitted to the GPU until retro_video_refresh_t + * is called. + * + * The frontend must submit the command buffer before submitting any + * other command buffers provided by set_command_buffers. */ + retro_vulkan_set_command_buffers_t set_command_buffers; + + /* Waits on CPU for device activity for the current sync index to complete. + * This is useful since the core will not have a relevant fence to sync with + * when the frontend is submitting the command buffers. */ + retro_vulkan_wait_sync_index_t wait_sync_index; + + /* If the core submits command buffers itself to any of the queues provided + * in this interface, the core must lock and unlock the frontend from + * racing on the VkQueue. + * + * Queue submission can happen on any thread. + * Even if queue submission happens on the same thread as retro_run(), + * the lock/unlock functions must still be called. + * + * NOTE: Queue submissions are heavy-weight. */ + retro_vulkan_lock_queue_t lock_queue; + retro_vulkan_unlock_queue_t unlock_queue; + + /* Sets a semaphore which is signaled when the image in set_image can safely be reused. + * The semaphore is consumed next call to retro_video_refresh_t. + * The semaphore will be signalled even for duped frames. + * The semaphore will be signalled only once, so set_signal_semaphore should be called every frame. + * The semaphore may be VK_NULL_HANDLE, which disables semaphore signalling for next call to retro_video_refresh_t. + * + * This is mostly useful to support use cases where you're rendering to a single image that + * is recycled in a ping-pong fashion with the frontend to save memory (but potentially less throughput). + */ + retro_vulkan_set_signal_semaphore_t set_signal_semaphore; +}; + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/lists
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/lists/dir_list.h
Added
@@ -0,0 +1,99 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (dir_list.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_DIR_LIST_H +#define __LIBRETRO_SDK_DIR_LIST_H + +#include <retro_common_api.h> +#include <boolean.h> + +#include <lists/string_list.h> + +RETRO_BEGIN_DECLS + +/** + * dir_list_append: + * @list : existing list to append to. + * @dir : directory path. + * @ext : allowed extensions of file directory entries to include. + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively + * + * Create a directory listing, appending to an existing list + * + * Returns: true success, false in case of error. + **/ +bool dir_list_append(struct string_list *list, const char *dir, const char *ext, + bool include_dirs, bool include_hidden, bool include_compressed, bool recursive); + +/** + * dir_list_new: + * @dir : directory path. + * @ext : allowed extensions of file directory entries to include. + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : include compressed files, even when not part of ext. + * @recursive : list directory contents recursively + * + * Create a directory listing. + * + * Returns: pointer to a directory listing of type 'struct string_list *' on success, + * NULL in case of error. Has to be freed manually. + **/ +struct string_list *dir_list_new(const char *dir, const char *ext, + bool include_dirs, bool include_hidden, bool include_compressed, bool recursive); + +/* Warning: 'list' must zero initialised before + * calling this function, otherwise memory leaks/ + * undefined behaviour will occur */ +bool dir_list_initialize(struct string_list *list, + const char *dir, + const char *ext, bool include_dirs, + bool include_hidden, bool include_compressed, + bool recursive); + +/** + * dir_list_sort: + * @list : pointer to the directory listing. + * @dir_first : move the directories in the listing to the top? + * + * Sorts a directory listing. + * + **/ +void dir_list_sort(struct string_list *list, bool dir_first); + +/** + * dir_list_free: + * @list : pointer to the directory listing + * + * Frees a directory listing. + * + **/ +void dir_list_free(struct string_list *list); + +bool dir_list_deinitialize(struct string_list *list); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/lists/file_list.h
Added
@@ -0,0 +1,148 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (file_list.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FILE_LIST_H__ +#define __LIBRETRO_SDK_FILE_LIST_H__ + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +#include <stddef.h> +#include <stdlib.h> + +#include <boolean.h> + +struct item_file +{ + void *userdata; + void *actiondata; + char *path; + char *label; + char *alt; + size_t directory_ptr; + size_t entry_idx; + unsigned type; +}; + +typedef struct file_list +{ + struct item_file *list; + + size_t capacity; + size_t size; +} file_list_t; + +void *file_list_get_userdata_at_offset(const file_list_t *list, + size_t index); + +void *file_list_get_actiondata_at_offset(const file_list_t *list, + size_t index); + +/** + * @brief frees the list + * + * NOTE: This function will also free() the entries actiondata + * and userdata fields if they are non-null. If you store complex + * or non-contiguous data there, make sure you free it's fields + * before calling this function or you might get a memory leak. + * + * @param list List to be freed + */ +void file_list_free(file_list_t *list); + +bool file_list_deinitialize(file_list_t *list); + +bool file_list_initialize(file_list_t *list); + +/** + * @brief makes the list big enough to contain at least nitems + * + * This function will not change the capacity if nitems is smaller + * than the current capacity. + * + * @param list The list to open for input + * @param nitems Number of items to reserve space for + * @return whether or not the operation succeeded + */ +bool file_list_reserve(file_list_t *list, size_t nitems); + +bool file_list_append(file_list_t *userdata, const char *path, + const char *label, unsigned type, size_t current_directory_ptr, + size_t entry_index); + +bool file_list_prepend(file_list_t *list, + const char *path, const char *label, + unsigned type, size_t directory_ptr, + size_t entry_idx); + +bool file_list_insert(file_list_t *list, + const char *path, const char *label, + unsigned type, size_t directory_ptr, + size_t entry_idx, + size_t idx); + +void file_list_pop(file_list_t *list, size_t *directory_ptr); + +void file_list_clear(file_list_t *list); + +void file_list_get_last(const file_list_t *list, + const char **path, const char **label, + unsigned *type, size_t *entry_idx); + +void *file_list_get_last_actiondata(const file_list_t *list); + +size_t file_list_get_size(const file_list_t *list); + +size_t file_list_get_directory_ptr(const file_list_t *list); + +void file_list_get_at_offset(const file_list_t *list, size_t index, + const char **path, const char **label, + unsigned *type, size_t *entry_idx); + +void file_list_free_userdata(const file_list_t *list, size_t index); + +void file_list_free_actiondata(const file_list_t *list, size_t idx); + +void file_list_set_label_at_offset(file_list_t *list, size_t index, + const char *label); + +void file_list_get_label_at_offset(const file_list_t *list, size_t index, + const char **label); + +void file_list_set_alt_at_offset(file_list_t *list, size_t index, + const char *alt); + +void file_list_set_userdata(const file_list_t *list, size_t idx, void *ptr); + +void file_list_set_actiondata(const file_list_t *list, size_t idx, void *ptr); + +void file_list_sort_on_alt(file_list_t *list); + +void file_list_sort_on_type(file_list_t *list); + +bool file_list_search(const file_list_t *list, const char *needle, + size_t *index); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/lists/linked_list.h
Added
@@ -0,0 +1,298 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (linked_list.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_LINKED_LIST_H +#define __LIBRETRO_SDK_LINKED_LIST_H + +#include <retro_common_api.h> + +#include <boolean.h> +#include <stddef.h> + +RETRO_BEGIN_DECLS + +/** + * Represents a linked list. Contains any number of elements. + */ +typedef struct linked_list linked_list_t; + +/** + * Represents an iterator for iterating over a linked list. The iterator can + * go through the linked list forwards or backwards. + */ +typedef struct linked_list_iterator linked_list_iterator_t; + +/** + * Creates a new linked list with no elements. + * + * @return New linked list + */ +linked_list_t *linked_list_new(void); + +/** + * @brief frees the memory used by the linked list + * + * Frees all of the memory used by this linked list. The values of all + * remaining elements are freed using the "free_value" function. Does + * nothing if "list" is NULL. + * + * @param list linked list to free + * @param free_value function to use to free remaining values + */ +void linked_list_free(linked_list_t *list, void (*free_value)(void *value)); + +/** + * @brief adds an element to the linked list + * + * Add a new element to the end of this linked list. Does nothing if + * "list" is NULL. + * + * @param list list to add the element to + * @param value new value to add to the linked list + */ +void linked_list_add(linked_list_t *list, void *value); + +/** + * @brief inserts a value into the linked list + * + * Inserts a value into the linked list at the specified index. Does + * nothing if "list" is NULL. + * + * @param list list to insert the value into + * @param index index where the value should be inserted at (can be equal to list size) + * @param value value to insert into the linked list + */ +void linked_list_insert(linked_list_t *list, size_t index, void *value); + +/** + * @brief Get the value in the linked list at the provided index. + * + * Return the value vstored in the linked list at the provided index. Does + * nothing if "list" is NULL. + * + * @param list list to get the value from + * @param index index of the value to return + * @return value in the list at the provided index + */ +void *linked_list_get(linked_list_t *list, size_t index); + +/** + * @brief Get the first value that is matched by the provided function + * + * Return the first value that the function matches. The matches function + * parameters are value from the linked list and the provided state. + * + * @param list list to get the value from + * @param matches function to test the values with + * @param usrptr user data to pass to the matches function + * @return first value that matches otherwise NULL + */ +void *linked_list_get_first_matching(linked_list_t *list, bool (*matches)(void *item, void *usrptr), void *usrptr); + +/** + * @brief Get the last value that is matched by the provided function + * + * Return the last value that the function matches. The matches function + * parameters are value from the linked list and the provided state. + * + * @param list list to get the value from + * @param matches function to test the values with + * @param usrptr user data to pass to the matches function + * @return last value that matches otherwise NULL + */ +void *linked_list_get_last_matching(linked_list_t *list, bool (*matches)(void *item, void *usrptr), void *usrptr); + +/** + * @brief Remove the element at the provided index + * + * Removes the element of the linked list at the provided index. + * + * @param list linked list to remove the element from + * @param index index of the element to remove + * @return value of the element that was removed, NULL if list is NULL or + * index is invalid + */ +void *linked_list_remove_at(linked_list_t *list, size_t index); + +/** + * @brief Remove the first element with the provided value + * + * Removes the first element with a value equal to the provided value. + * Does nothing if "list" is NULL. + * + * @param list linked list to remove the element from + * @param value value of the element to remove + * @return value if a matching element was removed + */ +void *linked_list_remove_first(linked_list_t *list, void *value); + +/** + * @brief Remove the last element with the provided value + * + * Removes the last element with a value equal to the provided value. + * Does nothing if "list" is NULL. + * + * @param list linked list to remove the element from + * @param value value of the element to remove + * @return value if a matching element was removed + */ +void *linked_list_remove_last(linked_list_t *list, void *value); + +/** + * @brief Remove all elements with the provided value + * + * Removes all elements with a value equal to the provided value. + * Does nothing if "list" is NULL. + * + * @param list linked list to remove the elements from + * @param value value of the elements to remove + * @return value if any matching element(s) where removed + */ +void *linked_list_remove_all(linked_list_t *list, void *value); + +/** + * @brief Remove the first matching element + * + * Removes the first matching element from the linked list. The "matches" function + * is used to test for matching element values. Does nothing if "list" is NULL. + * + * @param list linked list to remove the element from + * @param matches function to use for testing element values for a match + * @return value if a matching element was removed + */ +void *linked_list_remove_first_matching(linked_list_t *list, bool (*matches)(void *value)); + +/** + * @brief Remove the last matching element + * + * Removes the last matching element from the linked list. The "matches" function + * is used to test for matching element values. + * + * @param list linked list to remove the element from + * @param matches function to use for testing element value for a match + * @return value if a matching element was removed + */ +void *linked_list_remove_last_matching(linked_list_t *list, bool (*matches)(void *value)); + +/** + * @brief Remove all matching elements + * + * Removes all matching elements from the linked list. The "matches" function + * is used to test for matching element values. Does nothing if "list" is NULL. + * + * @param list linked list to remove the elements from + * @param matches function to use for testing element values for a match + */ +void linked_list_remove_all_matching(linked_list_t *list, bool (*matches)(void *value)); + +/** + * @brief Replace the value of the element at the provided index + * + * Replaces the value of the element at the provided index. The linked list must + * contain an element at the index. + * + * @param list linked list to replace the value in + * @param index index of the element to replace the value of + * @param value new value for the selected element + * @return whether an element was updated + */ +bool linked_list_set_at(linked_list_t *list, size_t index, void *value); + +/** + * @brief Get the size of the linked list + * + * Returns the number of elements in the linked list. + * + * @param linked list to get the size of + * @return number of elements in the linked list, 0 if linked list is NULL + */ +size_t linked_list_size(linked_list_t *list); + +/** + * @brief Get an iterator for the linked list + * + * Returns a new iterator for the linked list. Can be either a forward or backward + * iterator. + * + * @param list linked list to iterate over + * @param forward true for a forward iterator, false for backwards + * @return new iterator for the linked list in the specified direction, NULL if + * "list" is NULL + */ +linked_list_iterator_t *linked_list_iterator(linked_list_t *list, bool forward); + +/** + * @brief Move to the next element in the linked list + * + * Moves the iterator to the next element in the linked list. The direction is + * specified when retrieving a new iterator. + * + * @param iterator iterator for the current element + * @return iterator for the next element, NULL if iterator is NULL or "iterator" + * is at the last element + */ +linked_list_iterator_t *linked_list_iterator_next(linked_list_iterator_t *iterator); + +/** + * @brief Get the value of the element for the iterator + * + * Returns the value of the element that the iterator is at. + * + * @param iterator iterator for the current element + * @return value of the element for the iterator + */ +void *linked_list_iterator_value(linked_list_iterator_t *iterator); + +/** + * @brief Remove the element that the iterator is at + * + * Removes the element that the iterator is at. The iterator is updated to the + * next element. + * + * @param iterator iterator for the current element + * @return updated iterator or NULL if the last element was removed + */ +linked_list_iterator_t *linked_list_iterator_remove(linked_list_iterator_t *iterator); + +/** + * @brief Release the memory for the iterator + * + * Frees the memory for the provided iterator. Does nothing if "iterator" is NULL. + * + * @param iterator iterator to free + */ +void linked_list_iterator_free(linked_list_iterator_t *iterator); + +/** + * @brief Apply the provided function to all values in the linked list + * + * Apply the provied function to all values in the linked list. The values are applied + * in the forward direction. Does nothing if "list" is NULL. + * + * @param list linked list to apply the function to + * @param fn function to apply to all elements + */ +void linked_list_foreach(linked_list_t *list, void (*fn)(size_t index, void *value)); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/lists/string_list.h
Added
@@ -0,0 +1,186 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (string_list.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_STRING_LIST_H +#define __LIBRETRO_SDK_STRING_LIST_H + +#include <retro_common_api.h> + +#include <boolean.h> +#include <stdlib.h> +#include <stddef.h> + +RETRO_BEGIN_DECLS + +union string_list_elem_attr +{ + bool b; + int i; + void *p; +}; + +struct string_list_elem +{ + char *data; + void *userdata; + union string_list_elem_attr attr; +}; + +struct string_list +{ + struct string_list_elem *elems; + size_t size; + size_t cap; +}; + +/** + * string_list_find_elem: + * @list : pointer to string list + * @elem : element to find inside the string list. + * + * Searches for an element (@elem) inside the string list. + * + * Returns: true (1) if element could be found, otherwise false (0). + */ +int string_list_find_elem(const struct string_list *list, const char *elem); + +/** + * string_list_find_elem_prefix: + * @list : pointer to string list + * @prefix : prefix to append to @elem + * @elem : element to find inside the string list. + * + * Searches for an element (@elem) inside the string list. Will + * also search for the same element prefixed by @prefix. + * + * Returns: true (1) if element could be found, otherwise false (0). + */ +bool string_list_find_elem_prefix(const struct string_list *list, + const char *prefix, const char *elem); + +/** + * string_split: + * @str : string to turn into a string list + * @delim : delimiter character to use for splitting the string. + * + * Creates a new string list based on string @str, delimited by @delim. + * + * Returns: new string list if successful, otherwise NULL. + */ +struct string_list *string_split(const char *str, const char *delim); + +bool string_split_noalloc(struct string_list *list, + const char *str, const char *delim); + +/** + * string_separate: + * @str : string to turn into a string list + * @delim : delimiter character to use for separating the string. + * + * Creates a new string list based on string @str, delimited by @delim. + * Includes empty strings - i.e. two adjacent delimiters will resolve + * to a string list element of "". + * + * Returns: new string list if successful, otherwise NULL. + */ +struct string_list *string_separate(char *str, const char *delim); + +bool string_separate_noalloc(struct string_list *list, + char *str, const char *delim); + +bool string_list_deinitialize(struct string_list *list); + +bool string_list_initialize(struct string_list *list); + +/** + * string_list_new: + * + * Creates a new string list. Has to be freed manually. + * + * Returns: new string list if successful, otherwise NULL. + */ +struct string_list *string_list_new(void); + +/** + * string_list_append: + * @list : pointer to string list + * @elem : element to add to the string list + * @attr : attributes of new element. + * + * Appends a new element to the string list. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool string_list_append(struct string_list *list, const char *elem, + union string_list_elem_attr attr); + +/** + * string_list_append_n: + * @list : pointer to string list + * @elem : element to add to the string list + * @length : read at most this many bytes from elem + * @attr : attributes of new element. + * + * Appends a new element to the string list. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool string_list_append_n(struct string_list *list, const char *elem, + unsigned length, union string_list_elem_attr attr); + +/** + * string_list_free + * @list : pointer to string list object + * + * Frees a string list. + */ +void string_list_free(struct string_list *list); + +/** + * string_list_join_concat: + * @buffer : buffer that @list will be joined to. + * @size : length of @buffer. + * @list : pointer to string list. + * @delim : delimiter character for @list. + * + * A string list will be joined/concatenated as a + * string to @buffer, delimited by @delim. + */ +void string_list_join_concat(char *buffer, size_t size, + const struct string_list *list, const char *sep); + +/** + * string_list_set: + * @list : pointer to string list + * @idx : index of element in string list + * @str : value for the element. + * + * Set value of element inside string list. + **/ +void string_list_set(struct string_list *list, unsigned idx, + const char *str); + +struct string_list *string_list_clone(const struct string_list *src); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/lrc_hash.h
Added
@@ -0,0 +1,95 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (lrc_hash.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_HASH_H +#define __LIBRETRO_SDK_HASH_H + +#include <stdint.h> +#include <stddef.h> + +#include <compat/msvc.h> +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <retro_inline.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +/** + * sha256_hash: + * @out : Output. + * @in : Input. + * @size : Size of @out. + * + * Hashes SHA256 and outputs a human readable string. + **/ +void sha256_hash(char *out, const uint8_t *in, size_t size); + +int sha1_calculate(const char *path, char *result); + +uint32_t djb2_calculate(const char *str); + +/* Any 32-bit or wider unsigned integer data type will do */ +typedef unsigned int MD5_u32plus; + +typedef struct { + MD5_u32plus lo, hi; + MD5_u32plus a, b, c, d; + unsigned char buffer[64]; + MD5_u32plus block[16]; +} MD5_CTX; + +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * See md5.c for more information. + */ + +void MD5_Init(MD5_CTX *ctx); +void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); +void MD5_Final(unsigned char *result, MD5_CTX *ctx); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/math/complex.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/math/complex.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (complex.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/math/float_minmax.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/math/float_minmax.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (float_minmax.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/math/fxp.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/math/fxp.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (fxp.h).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/media
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/media/media_detect_cd.h
Added
@@ -0,0 +1,61 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (media_detect_cd.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_MEDIA_DETECT_CD_H +#define __LIBRETRO_SDK_MEDIA_DETECT_CD_H + +#include <retro_common_api.h> +#include <boolean.h> + +RETRO_BEGIN_DECLS + +enum media_detect_cd_system +{ + MEDIA_CD_SYSTEM_MEGA_CD, + MEDIA_CD_SYSTEM_SATURN, + MEDIA_CD_SYSTEM_DREAMCAST, + MEDIA_CD_SYSTEM_PSX, + MEDIA_CD_SYSTEM_3DO, + MEDIA_CD_SYSTEM_PC_ENGINE_CD +}; + +typedef struct +{ + char title[256]; + char system[128]; + char region[128]; + char serial[64]; + char maker[64]; + char version[32]; + char release_date[32]; + enum media_detect_cd_system system_id; +} media_detect_cd_info_t; + +/* Fill in "info" with detected CD info. Use this when you want to open a specific track file directly, and the pregap is known. */ +bool media_detect_cd_info(const char *path, uint64_t pregap_bytes, media_detect_cd_info_t *info); + +/* Fill in "info" with detected CD info. Use this when you have a cue file and want it parsed to find the first data track and any pregap info. */ +bool media_detect_cd_info_cue(const char *path, media_detect_cd_info_t *info); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/memalign.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/memalign.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (memalign.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/memmap.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/memmap.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (memmap.h). @@ -26,7 +26,7 @@ #include <stdio.h> #include <stdint.h> -#if defined(__CELLOS_LV2__) || defined(PSP) || defined(PS2) || defined(GEKKO) || defined(VITA) || defined(_XBOX) || defined(_3DS) || defined(WIIU) || defined(SWITCH) +#if defined(PSP) || defined(PS2) || defined(GEKKO) || defined(VITA) || defined(_XBOX) || defined(_3DS) || defined(WIIU) || defined(SWITCH) || defined(HAVE_LIBNX) || defined(__PS3__) || defined(__PSL1GHT__) /* No mman available */ #elif defined(_WIN32) && !defined(_XBOX) #include <windows.h>
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_compat.h
Added
@@ -0,0 +1,240 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_compat.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIBRETRO_SDK_NETPLAY_COMPAT_H__ +#define LIBRETRO_SDK_NETPLAY_COMPAT_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <boolean.h> +#include <retro_inline.h> +#include <stdint.h> + +#if defined(_WIN32) && !defined(_XBOX) +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif + +#define WIN32_LEAN_AND_MEAN + +#include <winsock2.h> +#include <windows.h> +#include <ws2tcpip.h> + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +#elif defined(_XBOX) + +#define NOD3D +#include <xtl.h> +#include <io.h> + +#elif defined(GEKKO) + +#include <network.h> + +#elif defined(VITA) + +#include <psp2/net/net.h> +#include <psp2/net/netctl.h> + +#define sockaddr_in SceNetSockaddrIn +#define sockaddr SceNetSockaddr +#define sendto sceNetSendto +#define recvfrom sceNetRecvfrom +#define socket(a,b,c) sceNetSocket("unknown",a,b,c) +#define bind sceNetBind +#define accept sceNetAccept +#define setsockopt sceNetSetsockopt +#define connect sceNetConnect +#define listen sceNetListen +#define send sceNetSend +#define recv sceNetRecv +#define MSG_DONTWAIT SCE_NET_MSG_DONTWAIT +#define AF_INET SCE_NET_AF_INET +#define AF_UNSPEC 0 +#define INADDR_ANY SCE_NET_INADDR_ANY +#define INADDR_NONE 0xffffffff +#define SOCK_STREAM SCE_NET_SOCK_STREAM +#define SOCK_DGRAM SCE_NET_SOCK_DGRAM +#define SOL_SOCKET SCE_NET_SOL_SOCKET +#define SO_REUSEADDR SCE_NET_SO_REUSEADDR +#define SO_SNDBUF SCE_NET_SO_SNDBUF +#define SO_SNDTIMEO SCE_NET_SO_SNDTIMEO +#define SO_NBIO SCE_NET_SO_NBIO +#define htonl sceNetHtonl +#define ntohl sceNetNtohl +#define htons sceNetHtons +#define socklen_t unsigned int + +struct hostent +{ + char *h_name; + char **h_aliases; + int h_addrtype; + int h_length; + char **h_addr_list; + char *h_addr; +}; + +struct SceNetInAddr inet_aton(const char *ip_addr); + +#else +#include <sys/select.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> + +#ifndef __PSL1GHT__ +#include <netinet/tcp.h> +#endif + +#include <arpa/inet.h> +#include <netdb.h> +#include <fcntl.h> + +#if !defined(__PSL1GHT__) && defined(__PS3__) +#include <netex/libnetctl.h> +#else +#include <signal.h> +#endif + +#endif + +#include <errno.h> + +#ifdef GEKKO +#define sendto(s, msg, len, flags, addr, tolen) net_sendto(s, msg, len, 0, addr, 8) +#define socket(domain, type, protocol) net_socket(domain, type, protocol) +#define bind(s, name, namelen) net_bind(s, name, namelen) +#define listen(s, backlog) net_listen(s, backlog) +#define accept(s, addr, addrlen) net_accept(s, addr, addrlen) +#define connect(s, addr, addrlen) net_connect(s, addr, addrlen) +#define send(s, data, size, flags) net_send(s, data, size, flags) +#define recv(s, mem, len, flags) net_recv(s, mem, len, flags) +#define recvfrom(s, mem, len, flags, from, fromlen) net_recvfrom(s, mem, len, flags, from, fromlen) +#define select(maxfdp1, readset, writeset, exceptset, timeout) net_select(maxfdp1, readset, writeset, exceptset, timeout) +#endif + +static INLINE bool isagain(int bytes) +{ +#if defined(_WIN32) + if (bytes != SOCKET_ERROR) + return false; + if (WSAGetLastError() != WSAEWOULDBLOCK) + return false; + return true; +#elif !defined(__PSL1GHT__) && defined(__PS3__) + return (sys_net_errno == SYS_NET_EWOULDBLOCK) || (sys_net_errno == SYS_NET_EAGAIN); +#elif defined(VITA) + return (bytes<0 && (bytes == SCE_NET_ERROR_EAGAIN || bytes == SCE_NET_ERROR_EWOULDBLOCK)); +#elif defined(WIIU) + return (bytes == -1) && ((socketlasterr() == SO_SUCCESS) || (socketlasterr() == SO_EWOULDBLOCK)); +#else + return (bytes < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)); +#endif +} + +#ifdef _XBOX +#define socklen_t int + +#ifndef h_addr +#define h_addr h_addr_list[0] /* for backward compatibility */ +#endif + +#ifndef SO_KEEPALIVE +#define SO_KEEPALIVE 0 /* verify if correct */ +#endif +#endif + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +#ifndef _WIN32 +#include <sys/time.h> +#include <unistd.h> +#endif + +/* Compatibility layer for legacy or incomplete BSD socket implementations. + * Only for IPv4. Mostly useful for the consoles which do not support + * anything reasonably modern on the socket API side of things. */ + +#ifdef HAVE_SOCKET_LEGACY + +#define sockaddr_storage sockaddr_in +#define addrinfo addrinfo_retro__ + +struct addrinfo +{ + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + struct sockaddr *ai_addr; + char *ai_canonname; + struct addrinfo *ai_next; +}; + +#ifndef AI_PASSIVE +#define AI_PASSIVE 1 +#endif + +/* gai_strerror() not used, so we skip that. */ + +#endif + +uint16_t inet_htons(uint16_t hostshort); + +int inet_ptrton(int af, const char *src, void *dst); + +int getaddrinfo_retro(const char *node, const char *service, + struct addrinfo *hints, struct addrinfo **res); + +void freeaddrinfo_retro(struct addrinfo *res); + +/** + * network_init: + * + * Platform specific socket library initialization. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool network_init(void); + +/** + * network_deinit: + * + * Deinitialize platform specific socket libraries. + **/ +void network_deinit(void); + +const char *inet_ntop_compat(int af, const void *src, char *dst, socklen_t cnt); + +bool udp_send_packet(const char *host, uint16_t port, const char *msg); + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_http.h
Added
@@ -0,0 +1,81 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_http.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_SDK_NET_HTTP_H +#define _LIBRETRO_SDK_NET_HTTP_H + +#include <stdint.h> +#include <boolean.h> +#include <string.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +struct http_t; +struct http_connection_t; + +struct http_connection_t *net_http_connection_new(const char *url, const char *method, const char *data); + +bool net_http_connection_iterate(struct http_connection_t *conn); + +bool net_http_connection_done(struct http_connection_t *conn); + +void net_http_connection_free(struct http_connection_t *conn); + +void net_http_connection_set_user_agent(struct http_connection_t* conn, const char* user_agent); + +const char *net_http_connection_url(struct http_connection_t *conn); + +struct http_t *net_http_new(struct http_connection_t *conn); + +/* You can use this to call net_http_update + * only when something will happen; select() it for reading. */ +int net_http_fd(struct http_t *state); + +/* Returns true if it's done, or if something broke. + * 'total' will be 0 if it's not known. */ +bool net_http_update(struct http_t *state, size_t* progress, size_t* total); + +/* 200, 404, or whatever. */ +int net_http_status(struct http_t *state); + +bool net_http_error(struct http_t *state); + +/* Returns the downloaded data. The returned buffer is owned by the + * HTTP handler; it's freed by net_http_delete. + * + * If the status is not 20x and accept_error is false, it returns NULL. */ +uint8_t* net_http_data(struct http_t *state, size_t* len, bool accept_error); + +/* Cleans up all memory. */ +void net_http_delete(struct http_t *state); + +/* URL Encode a string */ +void net_http_urlencode(char **dest, const char *source); + +/* Re-encode a full URL */ +void net_http_urlencode_full(char *dest, const char *source, size_t size); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_http_parse.h
Added
@@ -0,0 +1,53 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_http.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_SDK_NET_HTTP_PARSE_H +#define _LIBRETRO_SDK_NET_HTTP_PARSE_H + +#include <stdint.h> +#include <boolean.h> +#include <string.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +/** + * string_parse_html_anchor: + * @line : Buffer where the <a> tag is stored + * @link : Buffer to store the link URL in + * @name : Buffer to store the link URL in + * @link_size : Size of the link buffer including the NUL-terminator + * @name_size : Size of the name buffer including the NUL-terminator + * + * Parses an HTML anchor link stored in @line in the form of: <a href="/path/to/url">Title</a> + * The buffer pointed to by @link is filled with the URL path the link points to, + * and @name is filled with the title portion of the link. + * + * Returns: 0 if URL was parsed completely, otherwise 1. + **/ +int string_parse_html_anchor(const char *line, char *link, char *name, + size_t link_size, size_t name_size); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_ifinfo.h
Added
@@ -0,0 +1,55 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_ifinfo.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_NET_IFINFO_H +#define _LIBRETRO_NET_IFINFO_H + +#include <stdint.h> +#include <stddef.h> + +#include <boolean.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +struct net_ifinfo_entry +{ + char *name; + char *host; +}; + +struct net_ifinfo +{ + struct net_ifinfo_entry *entries; + size_t size; +}; + +typedef struct net_ifinfo net_ifinfo_t; + +void net_ifinfo_free(net_ifinfo_t *list); + +bool net_ifinfo_new(net_ifinfo_t *list); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_natt.h
Added
@@ -0,0 +1,84 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_natt.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_SDK_NET_NATT_H +#define _LIBRETRO_SDK_NET_NATT_H + +#include <net/net_compat.h> +#include <net/net_socket.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +struct natt_status +{ + /** nfds for select when checking for input */ + int nfds; + + /** The fdset to be selected upon to check for responses */ + fd_set fds; + + /** True if there might be a request outstanding */ + bool request_outstanding; + + /** True if we've resolved an external IPv4 address */ + bool have_inet4; + + /** External IPv4 address */ + struct sockaddr_in ext_inet4_addr; + + /** True if we've resolved an external IPv6 address */ + bool have_inet6; + +#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) && !defined(_3DS) + /** External IPv6 address */ + struct sockaddr_in6 ext_inet6_addr; +#endif + + /** Internal status (currently unused) */ + void *internal; +}; + +/** + * Initialize global NAT traversal structures (must be called once to use other + * functions) */ +void natt_init(void); + +/** Initialize a NAT traversal status object */ +bool natt_new(struct natt_status *status); + +/** Free a NAT traversal status object */ +void natt_free(struct natt_status *status); + +/** + * Make a port forwarding request when only the port is known. Forwards any + * address it can find. */ +bool natt_open_port_any(struct natt_status *status, uint16_t port, + enum socket_protocol proto); + +/** Check for port forwarding responses */ +bool natt_read(struct natt_status *status); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_socket.h
Added
@@ -0,0 +1,99 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_socket.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_SDK_NET_SOCKET_H +#define _LIBRETRO_SDK_NET_SOCKET_H + +#include <stdint.h> +#include <boolean.h> +#include <string.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +enum socket_domain +{ + SOCKET_DOMAIN_INET = 0 +}; + +enum socket_type +{ + SOCKET_TYPE_DATAGRAM = 0, + SOCKET_TYPE_STREAM, + SOCKET_TYPE_SEQPACKET +}; + +enum socket_protocol +{ + SOCKET_PROTOCOL_NONE = 0, + SOCKET_PROTOCOL_TCP, + SOCKET_PROTOCOL_UDP +}; + +typedef struct socket_target +{ + unsigned port; + const char *server; + enum socket_domain domain; + enum socket_protocol prot; +} socket_target_t; + +int socket_init(void **address, uint16_t port, const char *server, enum socket_type type); + +int socket_next(void **address); + +int socket_close(int fd); + +bool socket_set_block(int fd, bool block); + +/* TODO: all callers should be converted to socket_set_block() */ +bool socket_nonblock(int fd); + +int socket_select(int nfds, fd_set *readfs, fd_set *writefds, + fd_set *errorfds, struct timeval *timeout); + +int socket_send_all_blocking(int fd, const void *data_, size_t size, bool no_signal); + +ssize_t socket_send_all_nonblocking(int fd, const void *data_, size_t size, + bool no_signal); + +int socket_receive_all_blocking(int fd, void *data_, size_t size); + +ssize_t socket_receive_all_nonblocking(int fd, bool *error, + void *data_, size_t size); + +bool socket_bind(int fd, void *data); + +int socket_connect(int fd, void *data, bool timeout_enable); + +int socket_create( + const char *name, + enum socket_domain domain_type, + enum socket_type socket_type, + enum socket_protocol protocol_type); + +void socket_set_target(void *data, socket_target_t *in_addr); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/net/net_socket_ssl.h
Added
@@ -0,0 +1,50 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_socket.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_SDK_NET_SOCKET_SSL_H +#define _LIBRETRO_SDK_NET_SOCKET_SSL_H + +#include <stdlib.h> +#include <boolean.h> +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +void* ssl_socket_init(int fd, const char *domain); + +int ssl_socket_connect(void *state_data, void *data, bool timeout_enable, bool nonblock); + +int ssl_socket_send_all_blocking(void *state_data, const void *data_, size_t size, bool no_signal); + +ssize_t ssl_socket_send_all_nonblocking(void *state_data, const void *data_, size_t size, bool no_signal); + +int ssl_socket_receive_all_blocking(void *state_data, void *data_, size_t size); + +ssize_t ssl_socket_receive_all_nonblocking(void *state_data, bool *error, void *data_, size_t size); + +void ssl_socket_close(void *state_data); + +void ssl_socket_free(void *state_data); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/playlists
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/playlists/label_sanitization.h
Added
@@ -0,0 +1,37 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (label_sanitization.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include <stddef.h> +#include <boolean.h> + +void label_sanitize(char *label, bool (*left)(char*), bool (*right)(char*)); + +void label_remove_parens(char *label); + +void label_remove_brackets(char *label); + +void label_remove_parens_and_brackets(char *label); + +void label_keep_region(char *label); + +void label_keep_disc(char *label); + +void label_keep_region_and_disc(char *label);
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/queues
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/queues/fifo_queue.h
Added
@@ -0,0 +1,75 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (fifo_queue.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_FIFO_BUFFER_H +#define __LIBRETRO_SDK_FIFO_BUFFER_H + +#include <stdint.h> +#include <stddef.h> +#include <stdlib.h> + +#include <retro_common_api.h> +#include <retro_inline.h> +#include <boolean.h> + +RETRO_BEGIN_DECLS + +#define FIFO_READ_AVAIL(buffer) (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first) + +#define FIFO_WRITE_AVAIL(buffer) (((buffer)->size - 1) - (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first)) + +#define FIFO_READ_AVAIL_NONPTR(buffer) (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first) + +#define FIFO_WRITE_AVAIL_NONPTR(buffer) (((buffer).size - 1) - (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first)) + +struct fifo_buffer +{ + uint8_t *buffer; + size_t size; + size_t first; + size_t end; +}; + +typedef struct fifo_buffer fifo_buffer_t; + +fifo_buffer_t *fifo_new(size_t size); + +bool fifo_initialize(fifo_buffer_t *buf, size_t size); + +static INLINE void fifo_clear(fifo_buffer_t *buffer) +{ + buffer->first = 0; + buffer->end = 0; +} + +void fifo_write(fifo_buffer_t *buffer, const void *in_buf, size_t size); + +void fifo_read(fifo_buffer_t *buffer, void *in_buf, size_t size); + +void fifo_free(fifo_buffer_t *buffer); + +bool fifo_deinitialize(fifo_buffer_t *buffer); + + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/queues/generic_queue.h
Added
@@ -0,0 +1,208 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (generic_queue.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_GENERIC_QUEUE_H +#define __LIBRETRO_SDK_GENERIC_QUEUE_H + +#include <retro_common_api.h> + +#include <boolean.h> +#include <stddef.h> + +RETRO_BEGIN_DECLS + +/** + * Represents a generic queue. Can contain any number of elements. Each element contains + * a value of type "void *". Can be used as a FIFO or LIFO queue. + */ +typedef struct generic_queue generic_queue_t; + +/** + * Represents an iterator for iterating over a queue. + */ +typedef struct generic_queue_iterator generic_queue_iterator_t; + +/** + * Creates a new queue with no elements. + * + * @return New queue + */ +generic_queue_t *generic_queue_new(void); + +/** + * @brief frees the memory used by the queue + * + * Frees all of the memory used by this queue. The values of all + * remaining elements are freed using the "free_value" function. Does + * nothing if "queue" is NULL. + * + * @param queue queue to free + * @param free_value function to use to free remaining values + */ +void generic_queue_free(generic_queue_t *queue, void (*free_value)(void *value)); + +/** + * @brief Push a new value onto the queue + * + * Pushes a new value onto the end of the queue. Does nothing if "queue" + * is NULL. + * + * @param queue queue to the push the value onto + * @param value value to push onto the queue + */ +void generic_queue_push(generic_queue_t *queue, void *value); + +/** + * @brief Remove the last value from the queue + * + * Removes the last element from the queue. Does nothing if the queue is + * NULL. + * + * @param queue queue to get the value from + * @return value of the last element, NULL if queue is empty or NULL + */ +void *generic_queue_pop(generic_queue_t *queue); + +/** + * @brief Get the last value from the queue + * + * Returns the value of the last element in the queue. Returns NULL if the + * queue is NULL or empty. + * + * @param queue queue to get the last value from + * @return value of the last element or NULL + */ +void *generic_queue_peek(generic_queue_t *queue); + +/** + * @brief Get the first value from the queue + * + * Returns the value of the first element in the queue. Returns NULL if the + * queue is NULL or empty. + * + * @param queue queue to get the first value from + * @return value of the first element or NULL + */ +void *generic_queue_peek_first(generic_queue_t *queue); + +/** + * @brief Push a new value onto the front of the queue + * + * Pushes a new value onto the front of the queue. Does nothing if "queue" + * is NULL. + * + * @param queue queue to the push the value onto + * @param value value to push onto the queue + */ +void generic_queue_shift(generic_queue_t *queue, void *value); + +/** + * @brief Remove the first value from the queue + * + * Removes the first element from the queue. Does nothing if the queue is + * NULL. + * + * @param queue queue to get the value from + * @return value of the last element, NULL if queue is empty or NULL + */ +void *generic_queue_unshift(generic_queue_t *queue); + +/** + * @brief Get the size of the queue + * + * Returns the number of elements in the queue. + * + * @param queue queue to get the size of + * @return number of elements in the queue, 0 if queue is NULL + */ +size_t generic_queue_length(generic_queue_t *queue); + +/** + * @brief Remove the first element in the queue with the provided value + * + * Removes the first element with a value matching the provided value. Does + * nothing if queue is NULL. + * + * @param queue queue to remove the element from + * @param value value to look for in the queue + * @return the value of the element removed, NULL if no element was removed + */ +void *generic_queue_remove(generic_queue_t *queue, void *value); + +/** + * @brief Get an iterator for the queue + * + * Returns a new iterator for the queue. Can be either a forward or backward + * iterator. + * + * @param queue queue to iterate over + * @param forward true for a forward iterator, false for backwards + * @return new iterator for the queue in the specified direction, NULL if + * "queue" is NULL + */ +generic_queue_iterator_t *generic_queue_iterator(generic_queue_t *queue, bool forward); + +/** + * @brief Move to the next element in the queue + * + * Moves the iterator to the next element in the queue. The direction is + * specified when retrieving a new iterator. + * + * @param iterator iterator for the current element + * @return iterator for the next element, NULL if iterator is NULL or "iterator" + * is at the last element + */ +generic_queue_iterator_t *generic_queue_iterator_next(generic_queue_iterator_t *iterator); + +/** + * @brief Get the value of the element for the iterator + * + * Returns the value of the element that the iterator is at. + * + * @param iterator iterator for the current element + * @return value of the element for the iterator + */ +void *generic_queue_iterator_value(generic_queue_iterator_t *iterator); + +/** + * @brief Remove the element that the iterator is at + * + * Removes the element that the iterator is at. The iterator is updated to the + * next element. + * + * @param iterator iterator for the current element + * @return updated iterator or NULL if the last element was removed + */ +generic_queue_iterator_t *generic_queue_iterator_remove(generic_queue_iterator_t *iterator); + +/** + * @brief Release the memory for the iterator + * + * Frees the memory for the provided iterator. Does nothing if "iterator" is NULL. + * + * @param iterator iterator to free + */ +void generic_queue_iterator_free(generic_queue_iterator_t *iterator); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/queues/message_queue.h
Added
@@ -0,0 +1,156 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (message_queue.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_MSG_QUEUE_H +#define __LIBRETRO_SDK_MSG_QUEUE_H + +#include <stddef.h> + +#include <retro_common_api.h> +#include <boolean.h> + +RETRO_BEGIN_DECLS + +enum message_queue_icon +{ + MESSAGE_QUEUE_ICON_DEFAULT = 0 /* default icon is tied to category */ +}; + +enum message_queue_category +{ + MESSAGE_QUEUE_CATEGORY_INFO = 0, + MESSAGE_QUEUE_CATEGORY_ERROR, + MESSAGE_QUEUE_CATEGORY_WARNING, + MESSAGE_QUEUE_CATEGORY_SUCCESS +}; + +typedef struct queue_elem +{ + char *msg; + char *title; + unsigned duration; + unsigned prio; + enum message_queue_icon icon; + enum message_queue_category category; +} queue_elem_t; + +typedef struct msg_queue +{ + char *tmp_msg; + queue_elem_t **elems; + size_t ptr; + size_t size; +} msg_queue_t; + +typedef struct +{ + unsigned duration; + unsigned prio; + enum message_queue_icon icon; + enum message_queue_category category; + char msg[1024]; + char title[1024]; +} msg_queue_entry_t; + +/** + * msg_queue_new: + * @size : maximum size of message + * + * Creates a message queue with maximum size different messages. + * + * Returns: NULL if allocation error, pointer to a message queue + * if successful. Has to be freed manually. + **/ +msg_queue_t *msg_queue_new(size_t size); + +bool msg_queue_initialize(msg_queue_t *queue, size_t size); + +/** + * msg_queue_push: + * @queue : pointer to queue object + * @msg : message to add to the queue + * @prio : priority level of the message + * @duration : how many times the message can be pulled + * before it vanishes (E.g. show a message for + * 3 seconds @ 60fps = 180 duration). + * + * Push a new message onto the queue. + **/ +void msg_queue_push(msg_queue_t *queue, const char *msg, + unsigned prio, unsigned duration, + char *title, + enum message_queue_icon icon, enum message_queue_category category); + +/** + * msg_queue_pull: + * @queue : pointer to queue object + * + * Pulls highest priority message in queue. + * + * Returns: NULL if no message in queue, otherwise a string + * containing the message. + **/ +const char *msg_queue_pull(msg_queue_t *queue); + +/** + * msg_queue_extract: + * @queue : pointer to queue object + * @queue_entry : pointer to external queue entry struct + * + * Removes highest priority message from queue, copying + * contents into queue_entry struct. + * + * Returns: false if no messages in queue, otherwise true + **/ +bool msg_queue_extract(msg_queue_t *queue, msg_queue_entry_t *queue_entry); + +/** + * msg_queue_size: + * @queue : pointer to queue object + * + * Fetches number of messages in queue. + * + * Returns: Number of messages in queue. + **/ +size_t msg_queue_size(msg_queue_t *queue); + +/** + * msg_queue_clear: + * @queue : pointer to queue object + * + * Clears out everything in the queue. + **/ +void msg_queue_clear(msg_queue_t *queue); + +/** + * msg_queue_free: + * @queue : pointer to queue object + * + * Frees message queue.. + **/ +void msg_queue_free(msg_queue_t *queue); + +bool msg_queue_deinitialize(msg_queue_t *queue); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/queues/task_queue.h
Added
@@ -0,0 +1,260 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (task_queue.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_TASK_QUEUE_H__ +#define __LIBRETRO_SDK_TASK_QUEUE_H__ + +#include <stdint.h> +#include <stddef.h> +#include <boolean.h> + +#include <retro_common.h> +#include <retro_common_api.h> + +#include <libretro.h> + +RETRO_BEGIN_DECLS + +enum task_type +{ + TASK_TYPE_NONE, + /* Only one blocking task can exist in the queue at a time. + * Attempts to add a new one while another is running is + * ignored. + */ + TASK_TYPE_BLOCKING +}; + +typedef struct retro_task retro_task_t; +typedef void (*retro_task_callback_t)(retro_task_t *task, + void *task_data, + void *user_data, const char *error); + +typedef void (*retro_task_handler_t)(retro_task_t *task); + +typedef bool (*retro_task_finder_t)(retro_task_t *task, + void *userdata); + +typedef void (*retro_task_queue_msg_t)(retro_task_t *task, + const char *msg, + unsigned prio, unsigned duration, bool flush); + +typedef bool (*retro_task_retriever_t)(retro_task_t *task, void *data); + +typedef bool (*retro_task_condition_fn_t)(void *data); + +typedef struct +{ + char *source_file; +} decompress_task_data_t; + +struct retro_task +{ + /* when the task should run (0 for as soon as possible) */ + retro_time_t when; + + retro_task_handler_t handler; + + /* always called from the main loop */ + retro_task_callback_t callback; + + /* task cleanup handler to free allocated resources, will + * be called immediately after running the main callback */ + retro_task_handler_t cleanup; + + /* created by the handler, destroyed by the user */ + void *task_data; + + /* owned by the user */ + void *user_data; + + /* created and destroyed by the code related to the handler */ + void *state; + + /* created by task handler; destroyed by main loop + * (after calling the callback) */ + char *error; + + void (*progress_cb)(retro_task_t*); + + /* handler can modify but will be + * free()d automatically if non-NULL. */ + char *title; + + /* frontend userdata + * (e.g. associate a sticky notification to a task) */ + void *frontend_userdata; + + /* don't touch this. */ + retro_task_t *next; + + /* -1 = unmetered/indeterminate, 0-100 = current progress percentage */ + int8_t progress; + + /* task identifier */ + uint32_t ident; + + enum task_type type; + + /* if set to true, frontend will + use an alternative look for the + task progress display */ + bool alternative_look; + + /* set to true by the handler to signal + * the task has finished executing. */ + bool finished; + + /* set to true by the task system + * to signal the task *must* end. */ + bool cancelled; + + /* if true no OSD messages will be displayed. */ + bool mute; +}; + +typedef struct task_finder_data +{ + retro_task_finder_t func; + void *userdata; +} task_finder_data_t; + +typedef struct task_retriever_info +{ + struct task_retriever_info *next; + void *data; +} task_retriever_info_t; + +typedef struct task_retriever_data +{ + task_retriever_info_t *list; + retro_task_handler_t handler; + retro_task_retriever_t func; + size_t element_size; +} task_retriever_data_t; + +void *task_queue_retriever_info_next(task_retriever_info_t **link); + +void task_queue_retriever_info_free(task_retriever_info_t *list); + +/** + * Signals a task to end without waiting for + * it to complete. */ +void task_queue_cancel_task(void *task); + +void task_set_finished(retro_task_t *task, bool finished); + +void task_set_mute(retro_task_t *task, bool mute); + +void task_set_error(retro_task_t *task, char *error); + +void task_set_progress(retro_task_t *task, int8_t progress); + +void task_set_title(retro_task_t *task, char *title); + +void task_set_data(retro_task_t *task, void *data); + +void task_set_cancelled(retro_task_t *task, bool cancelled); + +void task_free_title(retro_task_t *task); + +bool task_get_cancelled(retro_task_t *task); + +bool task_get_finished(retro_task_t *task); + +bool task_get_mute(retro_task_t *task); + +char* task_get_error(retro_task_t *task); + +int8_t task_get_progress(retro_task_t *task); + +char* task_get_title(retro_task_t *task); + +void* task_get_data(retro_task_t *task); + +void task_queue_set_threaded(void); + +void task_queue_unset_threaded(void); + +bool task_queue_is_threaded(void); + +/** + * Calls func for every running task + * until it returns true. + * Returns a task or NULL if not found. + */ +bool task_queue_find(task_finder_data_t *find_data); + +/** + * Calls func for every running task when handler + * parameter matches task handler, allowing the + * list parameter to be filled with user-defined + * data. + */ +void task_queue_retrieve(task_retriever_data_t *data); + + /* Checks for finished tasks + * Takes the finished tasks, if any, + * and runs their callbacks. + * This must only be called from the main thread. */ +void task_queue_check(void); + +/* Pushes a task + * The task will start as soon as possible. + * If a second blocking task is attempted, false will be returned + * and the task will be ignored. */ +bool task_queue_push(retro_task_t *task); + +/* Blocks until all non-scheduled tasks have finished. + * Will return early if cond is not NULL + * and cond(data) returns false. + * This must only be called from the main thread. */ +void task_queue_wait(retro_task_condition_fn_t cond, void* data); + +/* Sends a signal to terminate all the tasks. + * + * This won't terminate the tasks immediately. + * They will finish as soon as possible. + * + * This must only be called from the main thread. */ +void task_queue_reset(void); + +/* Deinitializes the task system. + * This deinitializes the task system. + * The tasks that are running at + * the moment will stay on hold */ +void task_queue_deinit(void); + +/* Initializes the task system. + * This initializes the task system + * and chooses an appropriate + * implementation according to the settings. + * + * This must only be called from the main thread. */ +void task_queue_init(bool threaded, retro_task_queue_msg_t msg_push); + +/* Allocates and inits a new retro_task_t */ +retro_task_t *task_init(void); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_assert.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_assert.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_assert.h). @@ -27,9 +27,7 @@ #ifdef RARCH_INTERNAL #include <stdio.h> -#define retro_assert(cond) do { \ - if (!(cond)) { printf("Assertion failed at %s:%d.\n", __FILE__, __LINE__); abort(); } \ -} while(0) +#define retro_assert(cond) ((void)( (cond) || (printf("Assertion failed at %s:%d.\n", __FILE__, __LINE__), abort(), 0) )) #else #define retro_assert(cond) assert(cond) #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_common.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_common.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_common.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_common_api.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_common_api.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_common_api.h). @@ -89,7 +89,9 @@ /* C++11 says this one isn't needed, but apparently (some versions of) mingw require it anyways */ /* https://stackoverflow.com/questions/8132399/how-to-printf-uint64-t-fails-with-spurious-trailing-in-format */ /* https://github.com/libretro/RetroArch/issues/6009 */ -#define __STDC_FORMAT_MACROS +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS 1 +#endif #include <inttypes.h> #endif #ifndef PRId64
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_dirent.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_dirent.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2019 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_dirent.h). @@ -25,7 +25,6 @@ #include <libretro.h> #include <retro_common_api.h> -#include <retro_miscellaneous.h> #include <boolean.h>
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_endianness.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_endianness.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_endianness.h). @@ -31,40 +31,97 @@ #define SWAP16 _byteswap_ushort #define SWAP32 _byteswap_ulong #else -#define SWAP16(x) ((uint16_t)( \ - (((uint16_t)(x) & 0x00ff) << 8) | \ - (((uint16_t)(x) & 0xff00) >> 8) \ - )) -#define SWAP32(x) ((uint32_t)( \ - (((uint32_t)(x) & 0x000000ff) << 24) | \ - (((uint32_t)(x) & 0x0000ff00) << 8) | \ - (((uint32_t)(x) & 0x00ff0000) >> 8) | \ - (((uint32_t)(x) & 0xff000000) >> 24) \ - )) +static INLINE uint16_t SWAP16(uint16_t x) +{ + return ((x & 0x00ff) << 8) | + ((x & 0xff00) >> 8); +} + +static INLINE uint32_t SWAP32(uint32_t x) +{ + return ((x & 0x000000ff) << 24) | + ((x & 0x0000ff00) << 8) | + ((x & 0x00ff0000) >> 8) | + ((x & 0xff000000) >> 24); +} + #endif #if defined(_MSC_VER) && _MSC_VER <= 1200 -#define SWAP64(val) \ - ((((uint64_t)(val) & 0x00000000000000ff) << 56) \ - | (((uint64_t)(val) & 0x000000000000ff00) << 40) \ - | (((uint64_t)(val) & 0x0000000000ff0000) << 24) \ - | (((uint64_t)(val) & 0x00000000ff000000) << 8) \ - | (((uint64_t)(val) & 0x000000ff00000000) >> 8) \ - | (((uint64_t)(val) & 0x0000ff0000000000) >> 24) \ - | (((uint64_t)(val) & 0x00ff000000000000) >> 40) \ - | (((uint64_t)(val) & 0xff00000000000000) >> 56)) +static INLINE uint64_t SWAP64(uint64_t val) +{ + return + ((val & 0x00000000000000ff) << 56) + | ((val & 0x000000000000ff00) << 40) + | ((val & 0x0000000000ff0000) << 24) + | ((val & 0x00000000ff000000) << 8) + | ((val & 0x000000ff00000000) >> 8) + | ((val & 0x0000ff0000000000) >> 24) + | ((val & 0x00ff000000000000) >> 40) + | ((val & 0xff00000000000000) >> 56); +} #else -#define SWAP64(val) \ - ((((uint64_t)(val) & 0x00000000000000ffULL) << 56) \ - | (((uint64_t)(val) & 0x000000000000ff00ULL) << 40) \ - | (((uint64_t)(val) & 0x0000000000ff0000ULL) << 24) \ - | (((uint64_t)(val) & 0x00000000ff000000ULL) << 8) \ - | (((uint64_t)(val) & 0x000000ff00000000ULL) >> 8) \ - | (((uint64_t)(val) & 0x0000ff0000000000ULL) >> 24) \ - | (((uint64_t)(val) & 0x00ff000000000000ULL) >> 40) \ - | (((uint64_t)(val) & 0xff00000000000000ULL) >> 56)) +static INLINE uint64_t SWAP64(uint64_t val) +{ + return ((val & 0x00000000000000ffULL) << 56) + | ((val & 0x000000000000ff00ULL) << 40) + | ((val & 0x0000000000ff0000ULL) << 24) + | ((val & 0x00000000ff000000ULL) << 8) + | ((val & 0x000000ff00000000ULL) >> 8) + | ((val & 0x0000ff0000000000ULL) >> 24) + | ((val & 0x00ff000000000000ULL) >> 40) + | ((val & 0xff00000000000000ULL) >> 56); +} #endif + +#if defined (LSB_FIRST) || defined (MSB_FIRST) +# warning Defining MSB_FIRST and LSB_FIRST in compile options is deprecated +# undef LSB_FIRST +# undef MSB_FIRST +#endif + +#ifdef _MSC_VER +/* MSVC pre-defines macros depending on target arch */ +#if defined (_M_IX86) || defined (_M_AMD64) || defined (_M_ARM) || defined (_M_ARM64) +#define LSB_FIRST 1 +#elif _M_PPC +#define MSB_FIRST 1 +#else +/* MSVC can run on _M_ALPHA and _M_IA64 too, but they're both bi-endian; need to find what mode MSVC runs them at */ +#error "unknown platform, can't determine endianness" +#endif +#else +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define MSB_FIRST 1 +#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define LSB_FIRST 1 +#else +#error "Invalid endianness macros" +#endif +#endif + +#if defined(MSB_FIRST) && defined(LSB_FIRST) +# error "Bug in LSB_FIRST/MSB_FIRST definition" +#endif + +#if !defined(MSB_FIRST) && !defined(LSB_FIRST) +# error "Bug in LSB_FIRST/MSB_FIRST definition" +#endif + +#ifdef MSB_FIRST +# define RETRO_IS_BIG_ENDIAN 1 +# define RETRO_IS_LITTLE_ENDIAN 0 +/* For compatibility */ +# define WORDS_BIGENDIAN 1 +#else +# define RETRO_IS_BIG_ENDIAN 0 +# define RETRO_IS_LITTLE_ENDIAN 1 +/* For compatibility */ +# undef WORDS_BIGENDIAN +#endif + + /** * is_little_endian: * @@ -73,23 +130,7 @@ * Returns: greater than 0 if little-endian, * otherwise big-endian. **/ -#if defined(MSB_FIRST) -#define is_little_endian() (0) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) -#define is_little_endian() (1) -#else -static INLINE uint8_t is_little_endian(void) -{ - union - { - uint16_t x; - uint8_t y[2]; - } u; - - u.x = 1; - return u.y[0]; -} -#endif +#define is_little_endian() RETRO_IS_LITTLE_ENDIAN /** * swap_if_big64: @@ -101,17 +142,10 @@ * otherwise returns same value. **/ -#if defined(MSB_FIRST) +#if RETRO_IS_BIG_ENDIAN #define swap_if_big64(val) (SWAP64(val)) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) +#elif RETRO_IS_LITTLE_ENDIAN #define swap_if_big64(val) (val) -#else -static INLINE uint64_t swap_if_big64(uint64_t val) -{ - if (is_little_endian()) - return val; - return SWAP64(val); -} #endif /** @@ -124,17 +158,10 @@ * otherwise returns same value. **/ -#if defined(MSB_FIRST) +#if RETRO_IS_BIG_ENDIAN #define swap_if_big32(val) (SWAP32(val)) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) +#elif RETRO_IS_LITTLE_ENDIAN #define swap_if_big32(val) (val) -#else -static INLINE uint32_t swap_if_big32(uint32_t val) -{ - if (is_little_endian()) - return val; - return SWAP32(val); -} #endif /** @@ -147,17 +174,10 @@ * otherwise returns same value. **/ -#if defined(MSB_FIRST) +#if RETRO_IS_BIG_ENDIAN #define swap_if_little64(val) (val) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) +#elif RETRO_IS_LITTLE_ENDIAN #define swap_if_little64(val) (SWAP64(val)) -#else -static INLINE uint64_t swap_if_little64(uint64_t val) -{ - if (is_little_endian()) - return SWAP64(val); - return val; -} #endif /** @@ -170,17 +190,10 @@ * otherwise returns same value. **/ -#if defined(MSB_FIRST) +#if RETRO_IS_BIG_ENDIAN #define swap_if_little32(val) (val) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) +#elif RETRO_IS_LITTLE_ENDIAN #define swap_if_little32(val) (SWAP32(val)) -#else -static INLINE uint32_t swap_if_little32(uint32_t val) -{ - if (is_little_endian()) - return SWAP32(val); - return val; -} #endif /** @@ -193,17 +206,10 @@ * otherwise returns same value. **/ -#if defined(MSB_FIRST) +#if RETRO_IS_BIG_ENDIAN #define swap_if_big16(val) (SWAP16(val)) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) +#elif RETRO_IS_LITTLE_ENDIAN #define swap_if_big16(val) (val) -#else -static INLINE uint16_t swap_if_big16(uint16_t val) -{ - if (is_little_endian()) - return val; - return SWAP16(val); -} #endif /** @@ -216,17 +222,10 @@ * otherwise returns same value. **/ -#if defined(MSB_FIRST) +#if RETRO_IS_BIG_ENDIAN #define swap_if_little16(val) (val) -#elif defined(__x86_64) || defined(__i386) || defined(_M_IX86) || defined(_M_X64) +#elif RETRO_IS_LITTLE_ENDIAN #define swap_if_little16(val) (SWAP16(val)) -#else -static INLINE uint16_t swap_if_little16(uint16_t val) -{ - if (is_little_endian()) - return SWAP16(val); - return val; -} #endif /** @@ -255,4 +254,326 @@ return swap_if_little32(*addr); } +/** + * retro_cpu_to_le16: + * @val : unsigned 16-bit value + * + * Convert unsigned 16-bit value from system to little-endian. + * + * Returns: Little-endian representation of val. + **/ + +#define retro_cpu_to_le16(val) swap_if_big16(val) + +/** + * retro_cpu_to_le32: + * @val : unsigned 32-bit value + * + * Convert unsigned 32-bit value from system to little-endian. + * + * Returns: Little-endian representation of val. + **/ + +#define retro_cpu_to_le32(val) swap_if_big32(val) + +/** + * retro_cpu_to_le64: + * @val : unsigned 64-bit value + * + * Convert unsigned 64-bit value from system to little-endian. + * + * Returns: Little-endian representation of val. + **/ + +#define retro_cpu_to_le64(val) swap_if_big64(val) + +/** + * retro_le_to_cpu16: + * @val : unsigned 16-bit value + * + * Convert unsigned 16-bit value from little-endian to native. + * + * Returns: Native representation of little-endian val. + **/ + +#define retro_le_to_cpu16(val) swap_if_big16(val) + +/** + * retro_le_to_cpu32: + * @val : unsigned 32-bit value + * + * Convert unsigned 32-bit value from little-endian to native. + * + * Returns: Native representation of little-endian val. + **/ + +#define retro_le_to_cpu32(val) swap_if_big32(val) + +/** + * retro_le_to_cpu16: + * @val : unsigned 64-bit value + * + * Convert unsigned 64-bit value from little-endian to native. + * + * Returns: Native representation of little-endian val. + **/ + +#define retro_le_to_cpu64(val) swap_if_big64(val) + +/** + * retro_cpu_to_be16: + * @val : unsigned 16-bit value + * + * Convert unsigned 16-bit value from system to big-endian. + * + * Returns: Big-endian representation of val. + **/ + +#define retro_cpu_to_be16(val) swap_if_little16(val) + +/** + * retro_cpu_to_be32: + * @val : unsigned 32-bit value + * + * Convert unsigned 32-bit value from system to big-endian. + * + * Returns: Big-endian representation of val. + **/ + +#define retro_cpu_to_be32(val) swap_if_little32(val) + +/** + * retro_cpu_to_be64: + * @val : unsigned 64-bit value + * + * Convert unsigned 64-bit value from system to big-endian. + * + * Returns: Big-endian representation of val. + **/ + +#define retro_cpu_to_be64(val) swap_if_little64(val) + +/** + * retro_be_to_cpu16: + * @val : unsigned 16-bit value + * + * Convert unsigned 16-bit value from big-endian to native. + * + * Returns: Native representation of big-endian val. + **/ + +#define retro_be_to_cpu16(val) swap_if_little16(val) + +/** + * retro_be_to_cpu32: + * @val : unsigned 32-bit value + * + * Convert unsigned 32-bit value from big-endian to native. + * + * Returns: Native representation of big-endian val. + **/ + +#define retro_be_to_cpu32(val) swap_if_little32(val) + +/** + * retro_be_to_cpu64: + * @val : unsigned 64-bit value + * + * Convert unsigned 64-bit value from big-endian to native. + * + * Returns: Native representation of big-endian val. + **/ + +#define retro_be_to_cpu64(val) swap_if_little64(val) + +#ifdef __GNUC__ +/* This attribute means that the same memory may be referred through + pointers to different size of the object (aliasing). E.g. that u8 * + and u32 * may actually be pointing to the same object. */ +#define MAY_ALIAS __attribute__((__may_alias__)) +#else +#define MAY_ALIAS +#endif + +#pragma pack(push, 1) +struct retro_unaligned_uint16_s +{ + uint16_t val; +} MAY_ALIAS; +struct retro_unaligned_uint32_s +{ + uint32_t val; +} MAY_ALIAS; +struct retro_unaligned_uint64_s +{ + uint64_t val; +} MAY_ALIAS; +#pragma pack(pop) + +typedef struct retro_unaligned_uint16_s retro_unaligned_uint16_t; +typedef struct retro_unaligned_uint32_s retro_unaligned_uint32_t; +typedef struct retro_unaligned_uint64_s retro_unaligned_uint64_t; + +/* L-value references to unaligned pointers. */ +#define retro_unaligned16(p) (((retro_unaligned_uint16_t *)p)->val) +#define retro_unaligned32(p) (((retro_unaligned_uint32_t *)p)->val) +#define retro_unaligned64(p) (((retro_unaligned_uint64_t *)p)->val) + +/** + * retro_get_unaligned_16be: + * @addr : pointer to unsigned 16-bit value + * + * Convert unsigned unaligned 16-bit value from big-endian to native. + * + * Returns: Native representation of big-endian val. + **/ + +static INLINE uint16_t retro_get_unaligned_16be(void *addr) { + return retro_be_to_cpu16(retro_unaligned16(addr)); +} + +/** + * retro_get_unaligned_32be: + * @addr : pointer to unsigned 32-bit value + * + * Convert unsigned unaligned 32-bit value from big-endian to native. + * + * Returns: Native representation of big-endian val. + **/ + +static INLINE uint32_t retro_get_unaligned_32be(void *addr) { + return retro_be_to_cpu32(retro_unaligned32(addr)); +} + +/** + * retro_get_unaligned_64be: + * @addr : pointer to unsigned 64-bit value + * + * Convert unsigned unaligned 64-bit value from big-endian to native. + * + * Returns: Native representation of big-endian val. + **/ + +static INLINE uint64_t retro_get_unaligned_64be(void *addr) { + return retro_be_to_cpu64(retro_unaligned64(addr)); +} + +/** + * retro_get_unaligned_16le: + * @addr : pointer to unsigned 16-bit value + * + * Convert unsigned unaligned 16-bit value from little-endian to native. + * + * Returns: Native representation of little-endian val. + **/ + +static INLINE uint16_t retro_get_unaligned_16le(void *addr) { + return retro_le_to_cpu16(retro_unaligned16(addr)); +} + +/** + * retro_get_unaligned_32le: + * @addr : pointer to unsigned 32-bit value + * + * Convert unsigned unaligned 32-bit value from little-endian to native. + * + * Returns: Native representation of little-endian val. + **/ + +static INLINE uint32_t retro_get_unaligned_32le(void *addr) { + return retro_le_to_cpu32(retro_unaligned32(addr)); +} + +/** + * retro_get_unaligned_64le: + * @addr : pointer to unsigned 64-bit value + * + * Convert unsigned unaligned 64-bit value from little-endian to native. + * + * Returns: Native representation of little-endian val. + **/ + +static INLINE uint64_t retro_get_unaligned_64le(void *addr) { + return retro_le_to_cpu64(retro_unaligned64(addr)); +} + +/** + * retro_set_unaligned_16le: + * @addr : pointer to unsigned 16-bit value + * @val : value to store + * + * Convert native value to unsigned unaligned 16-bit little-endian value + * + **/ + +static INLINE void retro_set_unaligned_16le(void *addr, uint16_t v) { + retro_unaligned16(addr) = retro_cpu_to_le16(v); +} + +/** + * retro_set_unaligned_32le: + * @addr : pointer to unsigned 32-bit value + * @val : value to store + * + * Convert native value to unsigned unaligned 32-bit little-endian value + * + **/ + +static INLINE void retro_set_unaligned_32le(void *addr, uint32_t v) { + retro_unaligned32(addr) = retro_cpu_to_le32(v); +} + +/** + * retro_set_unaligned_32le: + * @addr : pointer to unsigned 32-bit value + * @val : value to store + * + * Convert native value to unsigned unaligned 32-bit little-endian value + * + **/ + +static INLINE void retro_set_unaligned_64le(void *addr, uint64_t v) { + retro_unaligned64(addr) = retro_cpu_to_le64(v); +} + +/** + * retro_set_unaligned_16be: + * @addr : pointer to unsigned 16-bit value + * @val : value to store + * + * Convert native value to unsigned unaligned 16-bit big-endian value + * + **/ + +static INLINE void retro_set_unaligned_16be(void *addr, uint16_t v) { + retro_unaligned16(addr) = retro_cpu_to_be16(v); +} + +/** + * retro_set_unaligned_32be: + * @addr : pointer to unsigned 32-bit value + * @val : value to store + * + * Convert native value to unsigned unaligned 32-bit big-endian value + * + **/ + +static INLINE void retro_set_unaligned_32be(void *addr, uint32_t v) { + retro_unaligned32(addr) = retro_cpu_to_be32(v); +} + +/** + * retro_set_unaligned_32be: + * @addr : pointer to unsigned 32-bit value + * @val : value to store + * + * Convert native value to unsigned unaligned 32-bit big-endian value + * + **/ + +static INLINE void retro_set_unaligned_64be(void *addr, uint64_t v) { + retro_unaligned64(addr) = retro_cpu_to_be64(v); +} + + #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_environment.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_environment.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_environment.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_inline.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_inline.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_inline.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_math.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_math.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_math.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_miscellaneous.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_miscellaneous.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_miscellaneous.h). @@ -30,17 +30,17 @@ #include <boolean.h> #include <retro_inline.h> -#if defined(_WIN32) && !defined(_XBOX) +#if defined(_WIN32) + +#if defined(_XBOX) +#include <Xtl.h> +#else #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> -#elif defined(_WIN32) && defined(_XBOX) -#include <Xtl.h> #endif -#if defined(__CELLOS_LV2__) -#include <sys/fs_external.h> #endif #include <limits.h> @@ -75,9 +75,7 @@ } #ifndef PATH_MAX_LENGTH -#if defined(__CELLOS_LV2__) -#define PATH_MAX_LENGTH CELL_FS_MAX_FS_PATH_LENGTH -#elif defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(ORBIS) +#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(ORBIS) || defined(__PSL1GHT__) || defined(__PS3__) #define PATH_MAX_LENGTH 512 #else #define PATH_MAX_LENGTH 4096 @@ -106,8 +104,8 @@ #define BIT16_GET(a, bit) (((a) >> ((bit) & 15)) & 1) #define BIT16_CLEAR_ALL(a) ((a) = 0) -#define BIT32_SET(a, bit) ((a) |= (1 << ((bit) & 31))) -#define BIT32_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 31))) +#define BIT32_SET(a, bit) ((a) |= (UINT32_C(1) << ((bit) & 31))) +#define BIT32_CLEAR(a, bit) ((a) &= ~(UINT32_C(1) << ((bit) & 31))) #define BIT32_GET(a, bit) (((a) >> ((bit) & 31)) & 1) #define BIT32_CLEAR_ALL(a) ((a) = 0) @@ -116,8 +114,8 @@ #define BIT64_GET(a, bit) (((a) >> ((bit) & 63)) & 1) #define BIT64_CLEAR_ALL(a) ((a) = 0) -#define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (1 << ((bit) & 31))) -#define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31))) +#define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (UINT32_C(1) << ((bit) & 31))) +#define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(UINT32_C(1) << ((bit) & 31))) #define BIT128_GET(a, bit) (((a).data[(bit) >> 5] >> ((bit) & 31)) & 1) #define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a)) @@ -136,6 +134,16 @@ #define BIT256_GET_PTR(a, bit) BIT256_GET(*a, bit) #define BIT256_CLEAR_ALL_PTR(a) BIT256_CLEAR_ALL(*a) +#define BIT512_SET(a, bit) BIT256_SET(a, bit) +#define BIT512_CLEAR(a, bit) BIT256_CLEAR(a, bit) +#define BIT512_GET(a, bit) BIT256_GET(a, bit) +#define BIT512_CLEAR_ALL(a) BIT256_CLEAR_ALL(a) + +#define BIT512_SET_PTR(a, bit) BIT512_SET(*a, bit) +#define BIT512_CLEAR_PTR(a, bit) BIT512_CLEAR(*a, bit) +#define BIT512_GET_PTR(a, bit) BIT512_GET(*a, bit) +#define BIT512_CLEAR_ALL_PTR(a) BIT512_CLEAR_ALL(*a) + #define BITS_COPY16_PTR(a,bits) \ { \ BIT128_CLEAR_ALL_PTR(a); \ @@ -148,6 +156,13 @@ BITS_GET_ELEM_PTR(a, 0) = (bits); \ } +#define BITS_COPY64_PTR(a,bits) \ +{ \ + BIT128_CLEAR_ALL_PTR(a); \ + BITS_GET_ELEM_PTR(a, 0) = (bits); \ + BITS_GET_ELEM_PTR(a, 1) = (bits >> 32); \ +} + /* Helper macros and struct to keep track of many booleans. */ /* This struct has 256 bits. */ typedef struct @@ -155,6 +170,12 @@ uint32_t data[8]; } retro_bits_t; +/* This struct has 512 bits. */ +typedef struct +{ + uint32_t data[16]; +} retro_bits_512_t; + #ifdef _WIN32 # ifdef _WIN64 # define PRI_SIZET PRIu64 @@ -165,8 +186,8 @@ # define PRI_SIZET "u" # endif # endif -#elif PS2 -# define PRI_SIZET "lu" +#elif defined(PS2) +# define PRI_SIZET "u" #else # if (SIZE_MAX == 0xFFFF) # define PRI_SIZET "hu"
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/retro_timers.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/retro_timers.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (retro_timers.h). @@ -25,10 +25,10 @@ #include <stdint.h> -#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__) -#include <sys/timer.h> -#elif defined(XENON) +#if defined(XENON) #include <time/time.h> +#elif !defined(__PSL1GHT__) && defined(__PS3__) +#include <sys/timer.h> #elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__) #include <unistd.h> #elif defined(WIIU) @@ -37,8 +37,6 @@ #include <pspthreadman.h> #elif defined(VITA) #include <psp2/kernel/threadmgr.h> -#elif defined(PS2) -#include <SDL/SDL_timer.h> #elif defined(_3DS) #include <3ds.h> #else @@ -68,7 +66,7 @@ static int nanosleepDOS(const struct timespec *rqtp, struct timespec *rmtp) { - usleep(1000000 * rqtp->tv_sec + rqtp->tv_nsec / 1000); + usleep(1000000L * rqtp->tv_sec + rqtp->tv_nsec / 1000); if (rmtp) rmtp->tv_sec = rmtp->tv_nsec=0; @@ -85,32 +83,30 @@ * * Sleeps for a specified amount of milliseconds (@msec). **/ -static INLINE void retro_sleep(unsigned msec) -{ -#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__) - sys_timer_usleep(1000 * msec); -#elif defined(PSP) || defined(VITA) - sceKernelDelayThread(1000 * msec); -#elif defined(PS2) - SDL_Delay(msec); +#if defined(PSP) || defined(VITA) +#define retro_sleep(msec) (sceKernelDelayThread(1000 * (msec))) #elif defined(_3DS) - svcSleepThread(1000000 * (s64)msec); +#define retro_sleep(msec) (svcSleepThread(1000000 * (s64)(msec))) #elif defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP - SleepEx(msec, FALSE); +#define retro_sleep(msec) (SleepEx((msec), FALSE)) #elif defined(_WIN32) - Sleep(msec); +#define retro_sleep(msec) (Sleep((msec))) #elif defined(XENON) - udelay(1000 * msec); +#define retro_sleep(msec) (udelay(1000 * (msec))) +#elif !defined(__PSL1GHT__) && defined(__PS3__) +#define retro_sleep(msec) (sys_timer_usleep(1000 * (msec))) #elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__) - usleep(1000 * msec); +#define retro_sleep(msec) (usleep(1000 * (msec))) #elif defined(WIIU) - OSSleepTicks(ms_to_ticks(msec)); +#define retro_sleep(msec) (OSSleepTicks(ms_to_ticks((msec)))) #else - struct timespec tv = {0}; - tv.tv_sec = msec / 1000; - tv.tv_nsec = (msec % 1000) * 1000000; - nanosleep(&tv, NULL); -#endif +#define retro_sleep(msec) \ +{ \ + struct timespec tv = {0}; \ + tv.tv_sec = msec / 1000; \ + tv.tv_nsec = (msec % 1000) * 1000000; \ + nanosleep(&tv, NULL); \ } +#endif #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/rthreads/async_job.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/rthreads/async_job.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2015 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (async_job.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/rthreads/rthreads.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/rthreads/rthreads.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (rthreads.h). @@ -132,6 +132,15 @@ void slock_lock(slock_t *lock); /** + * slock_try_lock: + * @lock : pointer to mutex object + * + * Attempts to lock a mutex. If a mutex is already locked by + * another thread, return false. If the lock is acquired, return true. +**/ +bool slock_try_lock(slock_t *lock); + +/** * slock_unlock: * @lock : pointer to mutex object * @@ -236,11 +245,25 @@ /** * @brief Binds thread specific data to a key * @param tls - * @return whether the operation suceeded or not + * @return Whether the operation suceeded or not */ bool sthread_tls_set(sthread_tls_t *tls, const void *data); #endif +/* + * @brief Get thread ID of specified thread + * @param thread + * @return The ID of the specified thread + */ +uintptr_t sthread_get_thread_id(sthread_t *thread); + +/* + * @brief Get thread ID of the current thread + * @param + * @return The ID of the current thread + */ +uintptr_t sthread_get_current_thread_id(void); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/rthreads/tpool.h
Added
@@ -0,0 +1,96 @@ +/* + * Copyright (c) 2010-2020 The RetroArch team + * Copyright (c) 2017 John Schember <john@nachtimwald.com> + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (tpool.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE + */ + +#ifndef __LIBRETRO_SDK_TPOOL_H__ +#define __LIBRETRO_SDK_TPOOL_H__ + +#include <retro_common_api.h> + +#include <boolean.h> + +#include <retro_inline.h> +#include <retro_miscellaneous.h> + +RETRO_BEGIN_DECLS + +struct tpool; +typedef struct tpool tpool_t; + +/** + * (*thread_func_t): + * @arg : Argument. + * + * Callback function that the pool will call to do work. + **/ +typedef void (*thread_func_t)(void *arg); + +/** + * tpool_create: + * @num : Number of threads the pool should have. + * If 0 defaults to 2. + * + * Create a thread pool. + * + * Returns: pool. + */ +tpool_t *tpool_create(size_t num); + +/** + * tpool_destroy: + * @tp : Thread pool. + * + * Destory a thread pool + * The pool can be destroyed while there is outstanding work to process. All + * outstanding unprocessed work will be discareded. There may be a delay before + * this function returns because it will block for work that is processing to + * complete. + **/ +void tpool_destroy(tpool_t *tp); + +/** + * tpool_add_work: + * @tp : Thread pool. + * @func : Function the pool should call. + * @arg : Argument to pass to func. + * + * Add work to a thread pool. + * + * Returns: true if work was added, otherwise false. + **/ +bool tpool_add_work(tpool_t *tp, thread_func_t func, void *arg); + +/** + * tpool_wait: + * @tp Thread pool. + * + * Wait for all work in the pool to be completed. + */ +void tpool_wait(tpool_t *tp); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/chd_stream.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/chd_stream.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (chd_stream.h). @@ -57,6 +57,10 @@ ssize_t chdstream_get_size(chdstream_t *stream); +uint32_t chdstream_get_track_start(chdstream_t* stream); + +uint32_t chdstream_get_frame_size(chdstream_t* stream); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/file_stream.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/file_stream.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (file_stream.h). @@ -36,6 +36,7 @@ #include <boolean.h> #include <stdarg.h> +#include <vfs/vfs_implementation.h> #define FILESTREAM_REQUIRED_VFS_VERSION 2 @@ -60,7 +61,7 @@ * Opens a file for reading or writing, depending on the requested mode. * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ -RFILE *filestream_open(const char *path, unsigned mode, unsigned hints); +RFILE* filestream_open(const char *path, unsigned mode, unsigned hints); int64_t filestream_seek(RFILE *stream, int64_t offset, int seek_position); @@ -76,7 +77,7 @@ int64_t filestream_read_file(const char *path, void **buf, int64_t *len); -char *filestream_gets(RFILE *stream, char *s, size_t len); +char* filestream_gets(RFILE *stream, char *s, size_t len); int filestream_getc(RFILE *stream); @@ -100,11 +101,14 @@ int filestream_rename(const char *old_path, const char *new_path); -const char *filestream_get_path(RFILE *stream); +const char* filestream_get_path(RFILE *stream); bool filestream_exists(const char *path); -char *filestream_getline(RFILE *stream); +/* Returned pointer must be freed by the caller. */ +char* filestream_getline(RFILE *stream); + +libretro_vfs_implementation_file* filestream_get_vfs_handle(RFILE *stream); RETRO_END_DECLS
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/file_stream_transforms.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/file_stream_transforms.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (file_stream_transforms.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/interface_stream.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/interface_stream.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (interface_stream.h). @@ -36,7 +36,8 @@ { INTFSTREAM_FILE = 0, INTFSTREAM_MEMORY, - INTFSTREAM_CHD + INTFSTREAM_CHD, + INTFSTREAM_RZIP }; typedef struct intfstream_internal intfstream_internal_t, intfstream_t; @@ -74,6 +75,11 @@ int64_t intfstream_write(intfstream_internal_t *intf, const void *s, uint64_t len); +int intfstream_printf(intfstream_internal_t *intf, + const char* format, ...); + +int64_t intfstream_get_ptr(intfstream_internal_t *intf); + char *intfstream_gets(intfstream_internal_t *intf, char *buffer, uint64_t len); @@ -86,6 +92,8 @@ int64_t intfstream_tell(intfstream_internal_t *intf); +int intfstream_eof(intfstream_internal_t *intf); + void intfstream_putc(intfstream_internal_t *intf, int c); int intfstream_close(intfstream_internal_t *intf); @@ -94,15 +102,29 @@ int intfstream_flush(intfstream_internal_t *intf); -intfstream_t* intfstream_open_file(const char *path, +uint32_t intfstream_get_offset_to_start(intfstream_internal_t *intf); + +uint32_t intfstream_get_frame_size(intfstream_internal_t *intf); + +bool intfstream_is_compressed(intfstream_internal_t *intf); + +bool intfstream_get_crc(intfstream_internal_t *intf, uint32_t *crc); + +intfstream_t *intfstream_open_file(const char *path, unsigned mode, unsigned hints); intfstream_t *intfstream_open_memory(void *data, unsigned mode, unsigned hints, uint64_t size); +intfstream_t *intfstream_open_writable_memory(void *data, + unsigned mode, unsigned hints, uint64_t size); + intfstream_t *intfstream_open_chd_track(const char *path, unsigned mode, unsigned hints, int32_t track); +intfstream_t *intfstream_open_rzip_file(const char *path, + unsigned mode); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/memory_stream.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/memory_stream.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (memory_stream.h). @@ -56,6 +56,8 @@ uint64_t memstream_get_last_size(void); +uint64_t memstream_get_ptr(memstream_t *stream); + RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/rzip_stream.h
Added
@@ -0,0 +1,188 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rzip_stream.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef _LIBRETRO_SDK_FILE_RZIP_STREAM_H +#define _LIBRETRO_SDK_FILE_RZIP_STREAM_H + +#include <stdio.h> +#include <stdint.h> +#include <stddef.h> +#include <stdarg.h> + +#include <retro_common_api.h> + +RETRO_BEGIN_DECLS + +/* Rudimentary interface for streaming data to/from a + * zlib-compressed chunk-based RZIP archive file. + * + * This is somewhat less efficient than using regular + * gzip code, but this is by design - the intention here + * is to create an interface that integrates seamlessly + * with normal RetroArch functionality, using only + * standard/existing libretro-common routines. + * (Actual efficiency is pretty good, regardless: + * archived file size is almost identical to a solid + * zip file, and compression/decompression speed is + * not substantially worse than external archiving tools; + * it is certainly acceptable for use in real-time + * frontend applications) + * + * When reading existing files, uncompressed content + * is handled automatically. File type (compressed/ + * uncompressed) is detected via the RZIP header. + * + * ## RZIP file format: + * + * <file id header>: 8 bytes + * - [#][R][Z][I][P][v][file format version][#] + * <uncompressed chunk size>: 4 bytes, little endian order + * - nominal (maximum) size of each uncompressed + * chunk, in bytes + * <total uncompressed data size>: 8 bytes, little endian order + * <size of next compressed chunk>: 4 bytes, little endian order + * - size on-disk of next compressed data + * chunk, in bytes + * <next compressed chunk>: n bytes of zlib compressed data + * ... + * <size of next compressed chunk> : repeated until end of file + * <next compressed chunk> : + * + */ + +/* Prevent direct access to rzipstream_t members */ +typedef struct rzipstream rzipstream_t; + +/* File Open */ + +/* Opens a new or existing RZIP file + * > Supported 'mode' values are: + * - RETRO_VFS_FILE_ACCESS_READ + * - RETRO_VFS_FILE_ACCESS_WRITE + * > When reading, 'path' may reference compressed + * or uncompressed data + * Returns NULL if arguments are invalid, file + * is invalid or an IO error occurs */ +rzipstream_t* rzipstream_open(const char *path, unsigned mode); + +/* File Read */ + +/* Reads (a maximum of) 'len' bytes from an RZIP file. + * Returns actual number of bytes read, or -1 in + * the event of an error */ +int64_t rzipstream_read(rzipstream_t *stream, void *data, int64_t len); + +/* Reads next character from an RZIP file. + * Returns character value, or EOF if no data + * remains. + * Note: Always returns EOF if file is open + * for writing. */ +int rzipstream_getc(rzipstream_t *stream); + +/* Reads one line from an RZIP file and stores it + * in the character array pointed to by 's'. + * It stops reading when either (len-1) characters + * are read, the newline character is read, or the + * end-of-file is reached, whichever comes first. + * On success, returns 's'. In the event of an error, + * or if end-of-file is reached and no characters + * have been read, returns NULL. */ +char* rzipstream_gets(rzipstream_t *stream, char *s, size_t len); + +/* Reads all data from file specified by 'path' and + * copies it to 'buf'. + * - 'buf' will be allocated and must be free()'d manually. + * - Allocated 'buf' size is equal to 'len'. + * Returns false in the event of an error */ +bool rzipstream_read_file(const char *path, void **buf, int64_t *len); + +/* File Write */ + +/* Writes 'len' bytes to an RZIP file. + * Returns actual number of bytes written, or -1 + * in the event of an error */ +int64_t rzipstream_write(rzipstream_t *stream, const void *data, int64_t len); + +/* Writes a single character to an RZIP file. + * Returns character written, or EOF in the event + * of an error */ +int rzipstream_putc(rzipstream_t *stream, int c); + +/* Writes a variable argument list to an RZIP file. + * Ugly 'internal' function, required to enable + * 'printf' support in the higher level 'interface_stream'. + * Returns actual number of bytes written, or -1 + * in the event of an error */ +int rzipstream_vprintf(rzipstream_t *stream, const char* format, va_list args); + +/* Writes formatted output to an RZIP file. + * Returns actual number of bytes written, or -1 + * in the event of an error */ +int rzipstream_printf(rzipstream_t *stream, const char* format, ...); + +/* Writes contents of 'data' buffer to file + * specified by 'path'. + * Returns false in the event of an error */ +bool rzipstream_write_file(const char *path, const void *data, int64_t len); + +/* File Control */ + +/* Sets file position to the beginning of the + * specified RZIP file. + * Note: It is not recommended to rewind a file + * that is open for writing, since the caller + * may end up with a file containing junk data + * at the end (harmless, but a waste of space). */ +void rzipstream_rewind(rzipstream_t *stream); + +/* File Status */ + +/* Returns total size (in bytes) of the *uncompressed* + * data in an RZIP file. + * (If reading an uncompressed file, this corresponds + * to the 'physical' file size in bytes) + * Returns -1 in the event of a error. */ +int64_t rzipstream_get_size(rzipstream_t *stream); + +/* Returns EOF when no further *uncompressed* data + * can be read from an RZIP file. */ +int rzipstream_eof(rzipstream_t *stream); + +/* Returns the offset of the current byte of *uncompressed* + * data relative to the beginning of an RZIP file. + * Returns -1 in the event of a error. */ +int64_t rzipstream_tell(rzipstream_t *stream); + +/* Returns true if specified RZIP file contains + * compressed content */ +bool rzipstream_is_compressed(rzipstream_t *stream); + +/* File Close */ + +/* Closes RZIP file. If file is open for writing, + * flushes any remaining buffered data to disk. + * Returns -1 in the event of a error. */ +int rzipstream_close(rzipstream_t *stream); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/stdin_stream.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/stdin_stream.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (stdin_stream.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/streams/trans_stream.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/streams/trans_stream.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (trans_stream.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/string/stdstring.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/string/stdstring.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (stdstring.h). @@ -35,69 +35,84 @@ RETRO_BEGIN_DECLS +#define STRLEN_CONST(x) ((sizeof((x))-1)) + +#define strcpy_literal(a, b) strcpy(a, b) + +#define string_is_not_equal(a, b) !string_is_equal((a), (b)) + +#define string_is_not_equal_fast(a, b, size) (memcmp(a, b, size) != 0) +#define string_is_equal_fast(a, b, size) (memcmp(a, b, size) == 0) + +#define TOLOWER(c) ((c) | (lr_char_props[(unsigned char)(c)] & 0x20)) +#define TOUPPER(c) ((c) & ~(lr_char_props[(unsigned char)(c)] & 0x20)) + +/* C standard says \f \v are space, but this one disagrees */ +#define ISSPACE(c) (lr_char_props[(unsigned char)(c)] & 0x80) + +#define ISDIGIT(c) (lr_char_props[(unsigned char)(c)] & 0x40) +#define ISALPHA(c) (lr_char_props[(unsigned char)(c)] & 0x20) +#define ISLOWER(c) (lr_char_props[(unsigned char)(c)] & 0x04) +#define ISUPPER(c) (lr_char_props[(unsigned char)(c)] & 0x02) +#define ISALNUM(c) (lr_char_props[(unsigned char)(c)] & 0x60) +#define ISUALPHA(c) (lr_char_props[(unsigned char)(c)] & 0x28) +#define ISUALNUM(c) (lr_char_props[(unsigned char)(c)] & 0x68) +#define IS_XDIGIT(c) (lr_char_props[(unsigned char)(c)] & 0x01) + +/* Deprecated alias, all callers should use string_is_equal_case_insensitive instead */ +#define string_is_equal_noncase string_is_equal_case_insensitive + static INLINE bool string_is_empty(const char *data) { - return (data == NULL) || (*data == '\0'); + return !data || (*data == '\0'); } static INLINE bool string_is_equal(const char *a, const char *b) { - if (!a || !b) - return false; - while(*a && (*a == *b)) - { - a++; - b++; - } - return (*(const unsigned char*)a - *(const unsigned char*)b) == 0; + return (a && b) ? !strcmp(a, b) : false; } -static INLINE bool string_is_not_equal(const char *a, const char *b) +static INLINE bool string_starts_with_size(const char *str, const char *prefix, + size_t size) { - return !string_is_equal(a, b); + return (str && prefix) ? !strncmp(prefix, str, size) : false; } -#define string_add_pair_open(s, size) strlcat((s), " (", (size)) -#define string_add_pair_close(s, size) strlcat((s), ")", (size)) -#define string_add_bracket_open(s, size) strlcat((s), "{", (size)) -#define string_add_bracket_close(s, size) strlcat((s), "}", (size)) -#define string_add_single_quote(s, size) strlcat((s), "'", (size)) -#define string_add_quote(s, size) strlcat((s), "\"", (size)) -#define string_add_colon(s, size) strlcat((s), ":", (size)) -#define string_add_glob_open(s, size) strlcat((s), "glob('*", (size)) -#define string_add_glob_close(s, size) strlcat((s), "*')", (size)) - -static INLINE void string_add_between_pairs(char *s, const char *str, - size_t size) +static INLINE bool string_starts_with(const char *str, const char *prefix) { - string_add_pair_open(s, size); - strlcat(s, str, size); - string_add_pair_close(s, size); + return (str && prefix) ? !strncmp(prefix, str, strlen(prefix)) : false; } -#define string_is_not_equal_fast(a, b, size) (memcmp(a, b, size) != 0) -#define string_is_equal_fast(a, b, size) (memcmp(a, b, size) == 0) - -static INLINE bool string_is_equal_case_insensitive(const char *a, - const char *b) +static INLINE bool string_ends_with_size(const char *str, const char *suffix, + size_t str_len, size_t suffix_len) { - int result = 0; - const unsigned char *p1 = (const unsigned char*)a; - const unsigned char *p2 = (const unsigned char*)b; + return (str_len < suffix_len) ? false : + !memcmp(suffix, str + (str_len - suffix_len), suffix_len); +} - if (!a || !b) +static INLINE bool string_ends_with(const char *str, const char *suffix) +{ + if (!str || !suffix) return false; - if (p1 == p2) - return true; - - while ((result = tolower (*p1) - tolower (*p2++)) == 0) - if (*p1++ == '\0') - break; + return string_ends_with_size(str, suffix, strlen(str), strlen(suffix)); +} - return (result == 0); +/* Returns the length of 'str' (c.f. strlen()), but only + * checks the first 'size' characters + * - If 'str' is NULL, returns 0 + * - If 'str' is not NULL and no '\0' character is found + * in the first 'size' characters, returns 'size' */ +static INLINE size_t strlen_size(const char *str, size_t size) +{ + size_t i = 0; + if (str) + while (i < size && str[i]) i++; + return i; } -static INLINE bool string_is_equal_noncase(const char *a, const char *b) + +static INLINE bool string_is_equal_case_insensitive(const char *a, + const char *b) { int result = 0; const unsigned char *p1 = (const unsigned char*)a; @@ -106,7 +121,7 @@ if (!a || !b) return false; if (p1 == p2) - return false; + return true; while ((result = tolower (*p1) - tolower (*p2++)) == 0) if (*p1++ == '\0') @@ -119,7 +134,7 @@ char *string_to_lower(char *s); -char *string_ucwords(char* s); +char *string_ucwords(char *s); char *string_replace_substring(const char *in, const char *pattern, const char *by); @@ -133,7 +148,50 @@ /* Remove leading and trailing whitespaces */ char *string_trim_whitespace(char *const s); -char *word_wrap(char* buffer, const char *string, int line_width, bool unicode); +/* max_lines == 0 means no limit */ +char *word_wrap(char *buffer, const char *string, + int line_width, bool unicode, unsigned max_lines); + +/* Splits string into tokens seperated by 'delim' + * > Returned token string must be free()'d + * > Returns NULL if token is not found + * > After each call, 'str' is set to the position after the + * last found token + * > Tokens *include* empty strings + * Usage example: + * char *str = "1,2,3,4,5,6,7,,,10,"; + * char **str_ptr = &str; + * char *token = NULL; + * while ((token = string_tokenize(str_ptr, ","))) + * { + * printf("%s\n", token); + * free(token); + * token = NULL; + * } + */ +char* string_tokenize(char **str, const char *delim); + +/* Removes every instance of character 'c' from 'str' */ +void string_remove_all_chars(char *str, char c); + +/* Replaces every instance of character 'find' in 'str' + * with character 'replace' */ +void string_replace_all_chars(char *str, char find, char replace); + +/* Converts string to unsigned integer. + * Returns 0 if string is invalid */ +unsigned string_to_unsigned(const char *str); + +/* Converts hexadecimal string to unsigned integer. + * Handles optional leading '0x'. + * Returns 0 if string is invalid */ +unsigned string_hex_to_unsigned(const char *str); + +char *string_init(const char *src); + +void string_set(char **string, const char *src); + +extern const unsigned char lr_char_props[256]; RETRO_END_DECLS
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/time
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/time/rtime.h
Added
@@ -0,0 +1,48 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rtime.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_RTIME_H__ +#define __LIBRETRO_SDK_RTIME_H__ + +#include <retro_common_api.h> + +#include <stdint.h> +#include <stddef.h> +#include <time.h> + +RETRO_BEGIN_DECLS + +/* TODO/FIXME: Move all generic time handling functions + * to this file */ + +/* Must be called before using rtime_localtime() */ +void rtime_init(void); + +/* Must be called upon program termination */ +void rtime_deinit(void); + +/* Thread-safe wrapper for localtime() */ +struct tm *rtime_localtime(const time_t *timep, struct tm *result); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/vfs/vfs.h
Added
@@ -0,0 +1,111 @@ +/* Copyright (C) 2010-2020 The RetroArch team +* +* --------------------------------------------------------------------------------------- +* The following license statement only applies to this file (vfs_implementation.h). +* --------------------------------------------------------------------------------------- +* +* Permission is hereby granted, free of charge, +* to any person obtaining a copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation the rights to +* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef __LIBRETRO_SDK_VFS_H +#define __LIBRETRO_SDK_VFS_H + +#include <retro_common_api.h> +#include <boolean.h> + +#ifdef RARCH_INTERNAL +#ifndef VFS_FRONTEND +#define VFS_FRONTEND +#endif +#endif + +RETRO_BEGIN_DECLS + +#ifdef _WIN32 +typedef void* HANDLE; +#endif + +#ifdef HAVE_CDROM +typedef struct +{ + int64_t byte_pos; + char *cue_buf; + size_t cue_len; + unsigned cur_lba; + unsigned last_frame_lba; + unsigned char cur_min; + unsigned char cur_sec; + unsigned char cur_frame; + unsigned char cur_track; + unsigned char last_frame[2352]; + char drive; + bool last_frame_valid; +} vfs_cdrom_t; +#endif + +enum vfs_scheme +{ + VFS_SCHEME_NONE = 0, + VFS_SCHEME_CDROM +}; + +#ifndef __WINRT__ +#ifdef VFS_FRONTEND +struct retro_vfs_file_handle +#else +struct libretro_vfs_implementation_file +#endif +{ +#ifdef HAVE_CDROM + vfs_cdrom_t cdrom; /* int64_t alignment */ +#endif + int64_t size; + uint64_t mappos; + uint64_t mapsize; + FILE *fp; +#ifdef _WIN32 + HANDLE fh; +#endif + char *buf; + char* orig_path; + uint8_t *mapped; + int fd; + unsigned hints; + enum vfs_scheme scheme; +}; +#endif + +/* Replace the following symbol with something appropriate + * to signify the file is being compiled for a front end instead of a core. + * This allows the same code to act as reference implementation + * for VFS and as fallbacks for when the front end does not provide VFS functionality. + */ + +#ifdef VFS_FRONTEND +typedef struct retro_vfs_file_handle libretro_vfs_implementation_file; +#else +typedef struct libretro_vfs_implementation_file libretro_vfs_implementation_file; +#endif + +#ifdef VFS_FRONTEND +typedef struct retro_vfs_dir_handle libretro_vfs_implementation_dir; +#else +typedef struct libretro_vfs_implementation_dir libretro_vfs_implementation_dir; +#endif + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/include/vfs/vfs_implementation.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/vfs/vfs_implementation.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2019 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (vfs_implementation.h). @@ -23,30 +23,13 @@ #ifndef __LIBRETRO_SDK_VFS_IMPLEMENTATION_H #define __LIBRETRO_SDK_VFS_IMPLEMENTATION_H +#include <stdio.h> #include <stdint.h> #include <libretro.h> +#include <retro_environment.h> +#include <vfs/vfs.h> -/* Replace the following symbol with something appropriate - * to signify the file is being compiled for a front end instead of a core. - * This allows the same code to act as reference implementation - * for VFS and as fallbacks for when the front end does not provide VFS functionality. - */ - -#ifdef VFS_FRONTEND -typedef struct retro_vfs_file_handle libretro_vfs_implementation_file; -#else -typedef struct libretro_vfs_implementation_file libretro_vfs_implementation_file; -#endif - -#ifdef VFS_FRONTEND -typedef struct retro_vfs_dir_handle libretro_vfs_implementation_dir; -#else -typedef struct libretro_vfs_implementation_dir libretro_vfs_implementation_dir; -#endif - -#ifdef __cplusplus -extern "C" { -#endif +RETRO_BEGIN_DECLS libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, unsigned mode, unsigned hints); @@ -88,8 +71,6 @@ int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *dirstream); -#ifdef __cplusplus -} -#endif +RETRO_END_DECLS #endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/vfs/vfs_implementation_cdrom.h
Added
@@ -0,0 +1,52 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (vfs_implementation_cdrom.h). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __LIBRETRO_SDK_VFS_IMPLEMENTATION_CDROM_H +#define __LIBRETRO_SDK_VFS_IMPLEMENTATION_CDROM_H + +#include <vfs/vfs.h> +#include <cdrom/cdrom.h> + +RETRO_BEGIN_DECLS + +int64_t retro_vfs_file_seek_cdrom(libretro_vfs_implementation_file *stream, int64_t offset, int whence); + +void retro_vfs_file_open_cdrom( + libretro_vfs_implementation_file *stream, + const char *path, unsigned mode, unsigned hints); + +int retro_vfs_file_close_cdrom(libretro_vfs_implementation_file *stream); + +int64_t retro_vfs_file_tell_cdrom(libretro_vfs_implementation_file *stream); + +int64_t retro_vfs_file_read_cdrom(libretro_vfs_implementation_file *stream, + void *s, uint64_t len); + +int retro_vfs_file_error_cdrom(libretro_vfs_implementation_file *stream); + +const cdrom_toc_t* retro_vfs_file_get_cdrom_toc(void); + +const vfs_cdrom_t* retro_vfs_file_get_cdrom_position(const libretro_vfs_implementation_file *stream); + +RETRO_END_DECLS + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/vulkan
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/include/vulkan/vulkan_symbol_wrapper.h
Added
@@ -0,0 +1,354 @@ + +/* This header is autogenerated by vulkan_loader_generator.py */ +#ifndef VULKAN_SYMBOL_WRAPPER_H +#define VULKAN_SYMBOL_WRAPPER_H +#define VK_NO_PROTOTYPES +#include <vulkan/vulkan.h> + +#ifdef __cplusplus +extern "C" { +#endif + +extern PFN_vkCreateInstance vulkan_symbol_wrapper_vkCreateInstance; +#define vkCreateInstance vulkan_symbol_wrapper_vkCreateInstance +extern PFN_vkEnumerateInstanceExtensionProperties vulkan_symbol_wrapper_vkEnumerateInstanceExtensionProperties; +#define vkEnumerateInstanceExtensionProperties vulkan_symbol_wrapper_vkEnumerateInstanceExtensionProperties +extern PFN_vkEnumerateInstanceLayerProperties vulkan_symbol_wrapper_vkEnumerateInstanceLayerProperties; +#define vkEnumerateInstanceLayerProperties vulkan_symbol_wrapper_vkEnumerateInstanceLayerProperties +extern PFN_vkDestroyInstance vulkan_symbol_wrapper_vkDestroyInstance; +#define vkDestroyInstance vulkan_symbol_wrapper_vkDestroyInstance +extern PFN_vkEnumeratePhysicalDevices vulkan_symbol_wrapper_vkEnumeratePhysicalDevices; +#define vkEnumeratePhysicalDevices vulkan_symbol_wrapper_vkEnumeratePhysicalDevices +extern PFN_vkGetPhysicalDeviceFeatures vulkan_symbol_wrapper_vkGetPhysicalDeviceFeatures; +#define vkGetPhysicalDeviceFeatures vulkan_symbol_wrapper_vkGetPhysicalDeviceFeatures +extern PFN_vkGetPhysicalDeviceFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceFormatProperties; +#define vkGetPhysicalDeviceFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceFormatProperties +extern PFN_vkGetPhysicalDeviceImageFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceImageFormatProperties; +#define vkGetPhysicalDeviceImageFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceImageFormatProperties +extern PFN_vkGetPhysicalDeviceProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceProperties; +#define vkGetPhysicalDeviceProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceProperties +extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceQueueFamilyProperties; +#define vkGetPhysicalDeviceQueueFamilyProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceQueueFamilyProperties +extern PFN_vkGetPhysicalDeviceMemoryProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceMemoryProperties; +#define vkGetPhysicalDeviceMemoryProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceMemoryProperties +extern PFN_vkGetDeviceProcAddr vulkan_symbol_wrapper_vkGetDeviceProcAddr; +#define vkGetDeviceProcAddr vulkan_symbol_wrapper_vkGetDeviceProcAddr +extern PFN_vkCreateDevice vulkan_symbol_wrapper_vkCreateDevice; +#define vkCreateDevice vulkan_symbol_wrapper_vkCreateDevice +extern PFN_vkDestroyDevice vulkan_symbol_wrapper_vkDestroyDevice; +#define vkDestroyDevice vulkan_symbol_wrapper_vkDestroyDevice +extern PFN_vkEnumerateDeviceExtensionProperties vulkan_symbol_wrapper_vkEnumerateDeviceExtensionProperties; +#define vkEnumerateDeviceExtensionProperties vulkan_symbol_wrapper_vkEnumerateDeviceExtensionProperties +extern PFN_vkEnumerateDeviceLayerProperties vulkan_symbol_wrapper_vkEnumerateDeviceLayerProperties; +#define vkEnumerateDeviceLayerProperties vulkan_symbol_wrapper_vkEnumerateDeviceLayerProperties +extern PFN_vkGetDeviceQueue vulkan_symbol_wrapper_vkGetDeviceQueue; +#define vkGetDeviceQueue vulkan_symbol_wrapper_vkGetDeviceQueue +extern PFN_vkQueueSubmit vulkan_symbol_wrapper_vkQueueSubmit; +#define vkQueueSubmit vulkan_symbol_wrapper_vkQueueSubmit +extern PFN_vkQueueWaitIdle vulkan_symbol_wrapper_vkQueueWaitIdle; +#define vkQueueWaitIdle vulkan_symbol_wrapper_vkQueueWaitIdle +extern PFN_vkDeviceWaitIdle vulkan_symbol_wrapper_vkDeviceWaitIdle; +#define vkDeviceWaitIdle vulkan_symbol_wrapper_vkDeviceWaitIdle +extern PFN_vkAllocateMemory vulkan_symbol_wrapper_vkAllocateMemory; +#define vkAllocateMemory vulkan_symbol_wrapper_vkAllocateMemory +extern PFN_vkFreeMemory vulkan_symbol_wrapper_vkFreeMemory; +#define vkFreeMemory vulkan_symbol_wrapper_vkFreeMemory +extern PFN_vkMapMemory vulkan_symbol_wrapper_vkMapMemory; +#define vkMapMemory vulkan_symbol_wrapper_vkMapMemory +extern PFN_vkUnmapMemory vulkan_symbol_wrapper_vkUnmapMemory; +#define vkUnmapMemory vulkan_symbol_wrapper_vkUnmapMemory +extern PFN_vkFlushMappedMemoryRanges vulkan_symbol_wrapper_vkFlushMappedMemoryRanges; +#define vkFlushMappedMemoryRanges vulkan_symbol_wrapper_vkFlushMappedMemoryRanges +extern PFN_vkInvalidateMappedMemoryRanges vulkan_symbol_wrapper_vkInvalidateMappedMemoryRanges; +#define vkInvalidateMappedMemoryRanges vulkan_symbol_wrapper_vkInvalidateMappedMemoryRanges +extern PFN_vkGetDeviceMemoryCommitment vulkan_symbol_wrapper_vkGetDeviceMemoryCommitment; +#define vkGetDeviceMemoryCommitment vulkan_symbol_wrapper_vkGetDeviceMemoryCommitment +extern PFN_vkBindBufferMemory vulkan_symbol_wrapper_vkBindBufferMemory; +#define vkBindBufferMemory vulkan_symbol_wrapper_vkBindBufferMemory +extern PFN_vkBindImageMemory vulkan_symbol_wrapper_vkBindImageMemory; +#define vkBindImageMemory vulkan_symbol_wrapper_vkBindImageMemory +extern PFN_vkGetBufferMemoryRequirements vulkan_symbol_wrapper_vkGetBufferMemoryRequirements; +#define vkGetBufferMemoryRequirements vulkan_symbol_wrapper_vkGetBufferMemoryRequirements +extern PFN_vkGetImageMemoryRequirements vulkan_symbol_wrapper_vkGetImageMemoryRequirements; +#define vkGetImageMemoryRequirements vulkan_symbol_wrapper_vkGetImageMemoryRequirements +extern PFN_vkGetImageSparseMemoryRequirements vulkan_symbol_wrapper_vkGetImageSparseMemoryRequirements; +#define vkGetImageSparseMemoryRequirements vulkan_symbol_wrapper_vkGetImageSparseMemoryRequirements +extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceSparseImageFormatProperties; +#define vkGetPhysicalDeviceSparseImageFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceSparseImageFormatProperties +extern PFN_vkQueueBindSparse vulkan_symbol_wrapper_vkQueueBindSparse; +#define vkQueueBindSparse vulkan_symbol_wrapper_vkQueueBindSparse +extern PFN_vkCreateFence vulkan_symbol_wrapper_vkCreateFence; +#define vkCreateFence vulkan_symbol_wrapper_vkCreateFence +extern PFN_vkDestroyFence vulkan_symbol_wrapper_vkDestroyFence; +#define vkDestroyFence vulkan_symbol_wrapper_vkDestroyFence +extern PFN_vkResetFences vulkan_symbol_wrapper_vkResetFences; +#define vkResetFences vulkan_symbol_wrapper_vkResetFences +extern PFN_vkGetFenceStatus vulkan_symbol_wrapper_vkGetFenceStatus; +#define vkGetFenceStatus vulkan_symbol_wrapper_vkGetFenceStatus +extern PFN_vkWaitForFences vulkan_symbol_wrapper_vkWaitForFences; +#define vkWaitForFences vulkan_symbol_wrapper_vkWaitForFences +extern PFN_vkCreateSemaphore vulkan_symbol_wrapper_vkCreateSemaphore; +#define vkCreateSemaphore vulkan_symbol_wrapper_vkCreateSemaphore +extern PFN_vkDestroySemaphore vulkan_symbol_wrapper_vkDestroySemaphore; +#define vkDestroySemaphore vulkan_symbol_wrapper_vkDestroySemaphore +extern PFN_vkCreateEvent vulkan_symbol_wrapper_vkCreateEvent; +#define vkCreateEvent vulkan_symbol_wrapper_vkCreateEvent +extern PFN_vkDestroyEvent vulkan_symbol_wrapper_vkDestroyEvent; +#define vkDestroyEvent vulkan_symbol_wrapper_vkDestroyEvent +extern PFN_vkGetEventStatus vulkan_symbol_wrapper_vkGetEventStatus; +#define vkGetEventStatus vulkan_symbol_wrapper_vkGetEventStatus +extern PFN_vkSetEvent vulkan_symbol_wrapper_vkSetEvent; +#define vkSetEvent vulkan_symbol_wrapper_vkSetEvent +extern PFN_vkResetEvent vulkan_symbol_wrapper_vkResetEvent; +#define vkResetEvent vulkan_symbol_wrapper_vkResetEvent +extern PFN_vkCreateQueryPool vulkan_symbol_wrapper_vkCreateQueryPool; +#define vkCreateQueryPool vulkan_symbol_wrapper_vkCreateQueryPool +extern PFN_vkDestroyQueryPool vulkan_symbol_wrapper_vkDestroyQueryPool; +#define vkDestroyQueryPool vulkan_symbol_wrapper_vkDestroyQueryPool +extern PFN_vkGetQueryPoolResults vulkan_symbol_wrapper_vkGetQueryPoolResults; +#define vkGetQueryPoolResults vulkan_symbol_wrapper_vkGetQueryPoolResults +extern PFN_vkCreateBuffer vulkan_symbol_wrapper_vkCreateBuffer; +#define vkCreateBuffer vulkan_symbol_wrapper_vkCreateBuffer +extern PFN_vkDestroyBuffer vulkan_symbol_wrapper_vkDestroyBuffer; +#define vkDestroyBuffer vulkan_symbol_wrapper_vkDestroyBuffer +extern PFN_vkCreateBufferView vulkan_symbol_wrapper_vkCreateBufferView; +#define vkCreateBufferView vulkan_symbol_wrapper_vkCreateBufferView +extern PFN_vkDestroyBufferView vulkan_symbol_wrapper_vkDestroyBufferView; +#define vkDestroyBufferView vulkan_symbol_wrapper_vkDestroyBufferView +extern PFN_vkCreateImage vulkan_symbol_wrapper_vkCreateImage; +#define vkCreateImage vulkan_symbol_wrapper_vkCreateImage +extern PFN_vkDestroyImage vulkan_symbol_wrapper_vkDestroyImage; +#define vkDestroyImage vulkan_symbol_wrapper_vkDestroyImage +extern PFN_vkGetImageSubresourceLayout vulkan_symbol_wrapper_vkGetImageSubresourceLayout; +#define vkGetImageSubresourceLayout vulkan_symbol_wrapper_vkGetImageSubresourceLayout +extern PFN_vkCreateImageView vulkan_symbol_wrapper_vkCreateImageView; +#define vkCreateImageView vulkan_symbol_wrapper_vkCreateImageView +extern PFN_vkDestroyImageView vulkan_symbol_wrapper_vkDestroyImageView; +#define vkDestroyImageView vulkan_symbol_wrapper_vkDestroyImageView +extern PFN_vkCreateShaderModule vulkan_symbol_wrapper_vkCreateShaderModule; +#define vkCreateShaderModule vulkan_symbol_wrapper_vkCreateShaderModule +extern PFN_vkDestroyShaderModule vulkan_symbol_wrapper_vkDestroyShaderModule; +#define vkDestroyShaderModule vulkan_symbol_wrapper_vkDestroyShaderModule +extern PFN_vkCreatePipelineCache vulkan_symbol_wrapper_vkCreatePipelineCache; +#define vkCreatePipelineCache vulkan_symbol_wrapper_vkCreatePipelineCache +extern PFN_vkDestroyPipelineCache vulkan_symbol_wrapper_vkDestroyPipelineCache; +#define vkDestroyPipelineCache vulkan_symbol_wrapper_vkDestroyPipelineCache +extern PFN_vkGetPipelineCacheData vulkan_symbol_wrapper_vkGetPipelineCacheData; +#define vkGetPipelineCacheData vulkan_symbol_wrapper_vkGetPipelineCacheData +extern PFN_vkMergePipelineCaches vulkan_symbol_wrapper_vkMergePipelineCaches; +#define vkMergePipelineCaches vulkan_symbol_wrapper_vkMergePipelineCaches +extern PFN_vkCreateGraphicsPipelines vulkan_symbol_wrapper_vkCreateGraphicsPipelines; +#define vkCreateGraphicsPipelines vulkan_symbol_wrapper_vkCreateGraphicsPipelines +extern PFN_vkCreateComputePipelines vulkan_symbol_wrapper_vkCreateComputePipelines; +#define vkCreateComputePipelines vulkan_symbol_wrapper_vkCreateComputePipelines +extern PFN_vkDestroyPipeline vulkan_symbol_wrapper_vkDestroyPipeline; +#define vkDestroyPipeline vulkan_symbol_wrapper_vkDestroyPipeline +extern PFN_vkCreatePipelineLayout vulkan_symbol_wrapper_vkCreatePipelineLayout; +#define vkCreatePipelineLayout vulkan_symbol_wrapper_vkCreatePipelineLayout +extern PFN_vkDestroyPipelineLayout vulkan_symbol_wrapper_vkDestroyPipelineLayout; +#define vkDestroyPipelineLayout vulkan_symbol_wrapper_vkDestroyPipelineLayout +extern PFN_vkCreateSampler vulkan_symbol_wrapper_vkCreateSampler; +#define vkCreateSampler vulkan_symbol_wrapper_vkCreateSampler +extern PFN_vkDestroySampler vulkan_symbol_wrapper_vkDestroySampler; +#define vkDestroySampler vulkan_symbol_wrapper_vkDestroySampler +extern PFN_vkCreateDescriptorSetLayout vulkan_symbol_wrapper_vkCreateDescriptorSetLayout; +#define vkCreateDescriptorSetLayout vulkan_symbol_wrapper_vkCreateDescriptorSetLayout +extern PFN_vkDestroyDescriptorSetLayout vulkan_symbol_wrapper_vkDestroyDescriptorSetLayout; +#define vkDestroyDescriptorSetLayout vulkan_symbol_wrapper_vkDestroyDescriptorSetLayout +extern PFN_vkCreateDescriptorPool vulkan_symbol_wrapper_vkCreateDescriptorPool; +#define vkCreateDescriptorPool vulkan_symbol_wrapper_vkCreateDescriptorPool +extern PFN_vkDestroyDescriptorPool vulkan_symbol_wrapper_vkDestroyDescriptorPool; +#define vkDestroyDescriptorPool vulkan_symbol_wrapper_vkDestroyDescriptorPool +extern PFN_vkResetDescriptorPool vulkan_symbol_wrapper_vkResetDescriptorPool; +#define vkResetDescriptorPool vulkan_symbol_wrapper_vkResetDescriptorPool +extern PFN_vkAllocateDescriptorSets vulkan_symbol_wrapper_vkAllocateDescriptorSets; +#define vkAllocateDescriptorSets vulkan_symbol_wrapper_vkAllocateDescriptorSets +extern PFN_vkFreeDescriptorSets vulkan_symbol_wrapper_vkFreeDescriptorSets; +#define vkFreeDescriptorSets vulkan_symbol_wrapper_vkFreeDescriptorSets +extern PFN_vkUpdateDescriptorSets vulkan_symbol_wrapper_vkUpdateDescriptorSets; +#define vkUpdateDescriptorSets vulkan_symbol_wrapper_vkUpdateDescriptorSets +extern PFN_vkCreateFramebuffer vulkan_symbol_wrapper_vkCreateFramebuffer; +#define vkCreateFramebuffer vulkan_symbol_wrapper_vkCreateFramebuffer +extern PFN_vkDestroyFramebuffer vulkan_symbol_wrapper_vkDestroyFramebuffer; +#define vkDestroyFramebuffer vulkan_symbol_wrapper_vkDestroyFramebuffer +extern PFN_vkCreateRenderPass vulkan_symbol_wrapper_vkCreateRenderPass; +#define vkCreateRenderPass vulkan_symbol_wrapper_vkCreateRenderPass +extern PFN_vkDestroyRenderPass vulkan_symbol_wrapper_vkDestroyRenderPass; +#define vkDestroyRenderPass vulkan_symbol_wrapper_vkDestroyRenderPass +extern PFN_vkGetRenderAreaGranularity vulkan_symbol_wrapper_vkGetRenderAreaGranularity; +#define vkGetRenderAreaGranularity vulkan_symbol_wrapper_vkGetRenderAreaGranularity +extern PFN_vkCreateCommandPool vulkan_symbol_wrapper_vkCreateCommandPool; +#define vkCreateCommandPool vulkan_symbol_wrapper_vkCreateCommandPool +extern PFN_vkDestroyCommandPool vulkan_symbol_wrapper_vkDestroyCommandPool; +#define vkDestroyCommandPool vulkan_symbol_wrapper_vkDestroyCommandPool +extern PFN_vkResetCommandPool vulkan_symbol_wrapper_vkResetCommandPool; +#define vkResetCommandPool vulkan_symbol_wrapper_vkResetCommandPool +extern PFN_vkAllocateCommandBuffers vulkan_symbol_wrapper_vkAllocateCommandBuffers; +#define vkAllocateCommandBuffers vulkan_symbol_wrapper_vkAllocateCommandBuffers +extern PFN_vkFreeCommandBuffers vulkan_symbol_wrapper_vkFreeCommandBuffers; +#define vkFreeCommandBuffers vulkan_symbol_wrapper_vkFreeCommandBuffers +extern PFN_vkBeginCommandBuffer vulkan_symbol_wrapper_vkBeginCommandBuffer; +#define vkBeginCommandBuffer vulkan_symbol_wrapper_vkBeginCommandBuffer +extern PFN_vkEndCommandBuffer vulkan_symbol_wrapper_vkEndCommandBuffer; +#define vkEndCommandBuffer vulkan_symbol_wrapper_vkEndCommandBuffer +extern PFN_vkResetCommandBuffer vulkan_symbol_wrapper_vkResetCommandBuffer; +#define vkResetCommandBuffer vulkan_symbol_wrapper_vkResetCommandBuffer +extern PFN_vkCmdBindPipeline vulkan_symbol_wrapper_vkCmdBindPipeline; +#define vkCmdBindPipeline vulkan_symbol_wrapper_vkCmdBindPipeline +extern PFN_vkCmdSetViewport vulkan_symbol_wrapper_vkCmdSetViewport; +#define vkCmdSetViewport vulkan_symbol_wrapper_vkCmdSetViewport +extern PFN_vkCmdSetScissor vulkan_symbol_wrapper_vkCmdSetScissor; +#define vkCmdSetScissor vulkan_symbol_wrapper_vkCmdSetScissor +extern PFN_vkCmdSetLineWidth vulkan_symbol_wrapper_vkCmdSetLineWidth; +#define vkCmdSetLineWidth vulkan_symbol_wrapper_vkCmdSetLineWidth +extern PFN_vkCmdSetDepthBias vulkan_symbol_wrapper_vkCmdSetDepthBias; +#define vkCmdSetDepthBias vulkan_symbol_wrapper_vkCmdSetDepthBias +extern PFN_vkCmdSetBlendConstants vulkan_symbol_wrapper_vkCmdSetBlendConstants; +#define vkCmdSetBlendConstants vulkan_symbol_wrapper_vkCmdSetBlendConstants +extern PFN_vkCmdSetDepthBounds vulkan_symbol_wrapper_vkCmdSetDepthBounds; +#define vkCmdSetDepthBounds vulkan_symbol_wrapper_vkCmdSetDepthBounds +extern PFN_vkCmdSetStencilCompareMask vulkan_symbol_wrapper_vkCmdSetStencilCompareMask; +#define vkCmdSetStencilCompareMask vulkan_symbol_wrapper_vkCmdSetStencilCompareMask +extern PFN_vkCmdSetStencilWriteMask vulkan_symbol_wrapper_vkCmdSetStencilWriteMask; +#define vkCmdSetStencilWriteMask vulkan_symbol_wrapper_vkCmdSetStencilWriteMask +extern PFN_vkCmdSetStencilReference vulkan_symbol_wrapper_vkCmdSetStencilReference; +#define vkCmdSetStencilReference vulkan_symbol_wrapper_vkCmdSetStencilReference +extern PFN_vkCmdBindDescriptorSets vulkan_symbol_wrapper_vkCmdBindDescriptorSets; +#define vkCmdBindDescriptorSets vulkan_symbol_wrapper_vkCmdBindDescriptorSets +extern PFN_vkCmdBindIndexBuffer vulkan_symbol_wrapper_vkCmdBindIndexBuffer; +#define vkCmdBindIndexBuffer vulkan_symbol_wrapper_vkCmdBindIndexBuffer +extern PFN_vkCmdBindVertexBuffers vulkan_symbol_wrapper_vkCmdBindVertexBuffers; +#define vkCmdBindVertexBuffers vulkan_symbol_wrapper_vkCmdBindVertexBuffers +extern PFN_vkCmdDraw vulkan_symbol_wrapper_vkCmdDraw; +#define vkCmdDraw vulkan_symbol_wrapper_vkCmdDraw +extern PFN_vkCmdDrawIndexed vulkan_symbol_wrapper_vkCmdDrawIndexed; +#define vkCmdDrawIndexed vulkan_symbol_wrapper_vkCmdDrawIndexed +extern PFN_vkCmdDrawIndirect vulkan_symbol_wrapper_vkCmdDrawIndirect; +#define vkCmdDrawIndirect vulkan_symbol_wrapper_vkCmdDrawIndirect +extern PFN_vkCmdDrawIndexedIndirect vulkan_symbol_wrapper_vkCmdDrawIndexedIndirect; +#define vkCmdDrawIndexedIndirect vulkan_symbol_wrapper_vkCmdDrawIndexedIndirect +extern PFN_vkCmdDispatch vulkan_symbol_wrapper_vkCmdDispatch; +#define vkCmdDispatch vulkan_symbol_wrapper_vkCmdDispatch +extern PFN_vkCmdDispatchIndirect vulkan_symbol_wrapper_vkCmdDispatchIndirect; +#define vkCmdDispatchIndirect vulkan_symbol_wrapper_vkCmdDispatchIndirect +extern PFN_vkCmdCopyBuffer vulkan_symbol_wrapper_vkCmdCopyBuffer; +#define vkCmdCopyBuffer vulkan_symbol_wrapper_vkCmdCopyBuffer +extern PFN_vkCmdCopyImage vulkan_symbol_wrapper_vkCmdCopyImage; +#define vkCmdCopyImage vulkan_symbol_wrapper_vkCmdCopyImage +extern PFN_vkCmdBlitImage vulkan_symbol_wrapper_vkCmdBlitImage; +#define vkCmdBlitImage vulkan_symbol_wrapper_vkCmdBlitImage +extern PFN_vkCmdCopyBufferToImage vulkan_symbol_wrapper_vkCmdCopyBufferToImage; +#define vkCmdCopyBufferToImage vulkan_symbol_wrapper_vkCmdCopyBufferToImage +extern PFN_vkCmdCopyImageToBuffer vulkan_symbol_wrapper_vkCmdCopyImageToBuffer; +#define vkCmdCopyImageToBuffer vulkan_symbol_wrapper_vkCmdCopyImageToBuffer +extern PFN_vkCmdUpdateBuffer vulkan_symbol_wrapper_vkCmdUpdateBuffer; +#define vkCmdUpdateBuffer vulkan_symbol_wrapper_vkCmdUpdateBuffer +extern PFN_vkCmdFillBuffer vulkan_symbol_wrapper_vkCmdFillBuffer; +#define vkCmdFillBuffer vulkan_symbol_wrapper_vkCmdFillBuffer +extern PFN_vkCmdClearColorImage vulkan_symbol_wrapper_vkCmdClearColorImage; +#define vkCmdClearColorImage vulkan_symbol_wrapper_vkCmdClearColorImage +extern PFN_vkCmdClearDepthStencilImage vulkan_symbol_wrapper_vkCmdClearDepthStencilImage; +#define vkCmdClearDepthStencilImage vulkan_symbol_wrapper_vkCmdClearDepthStencilImage +extern PFN_vkCmdClearAttachments vulkan_symbol_wrapper_vkCmdClearAttachments; +#define vkCmdClearAttachments vulkan_symbol_wrapper_vkCmdClearAttachments +extern PFN_vkCmdResolveImage vulkan_symbol_wrapper_vkCmdResolveImage; +#define vkCmdResolveImage vulkan_symbol_wrapper_vkCmdResolveImage +extern PFN_vkCmdSetEvent vulkan_symbol_wrapper_vkCmdSetEvent; +#define vkCmdSetEvent vulkan_symbol_wrapper_vkCmdSetEvent +extern PFN_vkCmdResetEvent vulkan_symbol_wrapper_vkCmdResetEvent; +#define vkCmdResetEvent vulkan_symbol_wrapper_vkCmdResetEvent +extern PFN_vkCmdWaitEvents vulkan_symbol_wrapper_vkCmdWaitEvents; +#define vkCmdWaitEvents vulkan_symbol_wrapper_vkCmdWaitEvents +extern PFN_vkCmdPipelineBarrier vulkan_symbol_wrapper_vkCmdPipelineBarrier; +#define vkCmdPipelineBarrier vulkan_symbol_wrapper_vkCmdPipelineBarrier +extern PFN_vkCmdBeginQuery vulkan_symbol_wrapper_vkCmdBeginQuery; +#define vkCmdBeginQuery vulkan_symbol_wrapper_vkCmdBeginQuery +extern PFN_vkCmdEndQuery vulkan_symbol_wrapper_vkCmdEndQuery; +#define vkCmdEndQuery vulkan_symbol_wrapper_vkCmdEndQuery +extern PFN_vkCmdResetQueryPool vulkan_symbol_wrapper_vkCmdResetQueryPool; +#define vkCmdResetQueryPool vulkan_symbol_wrapper_vkCmdResetQueryPool +extern PFN_vkCmdWriteTimestamp vulkan_symbol_wrapper_vkCmdWriteTimestamp; +#define vkCmdWriteTimestamp vulkan_symbol_wrapper_vkCmdWriteTimestamp +extern PFN_vkCmdCopyQueryPoolResults vulkan_symbol_wrapper_vkCmdCopyQueryPoolResults; +#define vkCmdCopyQueryPoolResults vulkan_symbol_wrapper_vkCmdCopyQueryPoolResults +extern PFN_vkCmdPushConstants vulkan_symbol_wrapper_vkCmdPushConstants; +#define vkCmdPushConstants vulkan_symbol_wrapper_vkCmdPushConstants +extern PFN_vkCmdBeginRenderPass vulkan_symbol_wrapper_vkCmdBeginRenderPass; +#define vkCmdBeginRenderPass vulkan_symbol_wrapper_vkCmdBeginRenderPass +extern PFN_vkCmdNextSubpass vulkan_symbol_wrapper_vkCmdNextSubpass; +#define vkCmdNextSubpass vulkan_symbol_wrapper_vkCmdNextSubpass +extern PFN_vkCmdEndRenderPass vulkan_symbol_wrapper_vkCmdEndRenderPass; +#define vkCmdEndRenderPass vulkan_symbol_wrapper_vkCmdEndRenderPass +extern PFN_vkCmdExecuteCommands vulkan_symbol_wrapper_vkCmdExecuteCommands; +#define vkCmdExecuteCommands vulkan_symbol_wrapper_vkCmdExecuteCommands +extern PFN_vkDestroySurfaceKHR vulkan_symbol_wrapper_vkDestroySurfaceKHR; +#define vkDestroySurfaceKHR vulkan_symbol_wrapper_vkDestroySurfaceKHR +extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceSupportKHR; +#define vkGetPhysicalDeviceSurfaceSupportKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceSupportKHR +extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +#define vkGetPhysicalDeviceSurfaceCapabilitiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceCapabilitiesKHR +extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceFormatsKHR; +#define vkGetPhysicalDeviceSurfaceFormatsKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceFormatsKHR +extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfacePresentModesKHR; +#define vkGetPhysicalDeviceSurfacePresentModesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfacePresentModesKHR +extern PFN_vkCreateSwapchainKHR vulkan_symbol_wrapper_vkCreateSwapchainKHR; +#define vkCreateSwapchainKHR vulkan_symbol_wrapper_vkCreateSwapchainKHR +extern PFN_vkDestroySwapchainKHR vulkan_symbol_wrapper_vkDestroySwapchainKHR; +#define vkDestroySwapchainKHR vulkan_symbol_wrapper_vkDestroySwapchainKHR +extern PFN_vkGetSwapchainImagesKHR vulkan_symbol_wrapper_vkGetSwapchainImagesKHR; +#define vkGetSwapchainImagesKHR vulkan_symbol_wrapper_vkGetSwapchainImagesKHR +extern PFN_vkAcquireNextImageKHR vulkan_symbol_wrapper_vkAcquireNextImageKHR; +#define vkAcquireNextImageKHR vulkan_symbol_wrapper_vkAcquireNextImageKHR +extern PFN_vkQueuePresentKHR vulkan_symbol_wrapper_vkQueuePresentKHR; +#define vkQueuePresentKHR vulkan_symbol_wrapper_vkQueuePresentKHR +extern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceDisplayPropertiesKHR; +#define vkGetPhysicalDeviceDisplayPropertiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceDisplayPropertiesKHR +extern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceDisplayPlanePropertiesKHR; +#define vkGetPhysicalDeviceDisplayPlanePropertiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceDisplayPlanePropertiesKHR +extern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vulkan_symbol_wrapper_vkGetDisplayPlaneSupportedDisplaysKHR; +#define vkGetDisplayPlaneSupportedDisplaysKHR vulkan_symbol_wrapper_vkGetDisplayPlaneSupportedDisplaysKHR +extern PFN_vkGetDisplayModePropertiesKHR vulkan_symbol_wrapper_vkGetDisplayModePropertiesKHR; +#define vkGetDisplayModePropertiesKHR vulkan_symbol_wrapper_vkGetDisplayModePropertiesKHR +extern PFN_vkCreateDisplayModeKHR vulkan_symbol_wrapper_vkCreateDisplayModeKHR; +#define vkCreateDisplayModeKHR vulkan_symbol_wrapper_vkCreateDisplayModeKHR +extern PFN_vkGetDisplayPlaneCapabilitiesKHR vulkan_symbol_wrapper_vkGetDisplayPlaneCapabilitiesKHR; +#define vkGetDisplayPlaneCapabilitiesKHR vulkan_symbol_wrapper_vkGetDisplayPlaneCapabilitiesKHR +extern PFN_vkCreateDisplayPlaneSurfaceKHR vulkan_symbol_wrapper_vkCreateDisplayPlaneSurfaceKHR; +#define vkCreateDisplayPlaneSurfaceKHR vulkan_symbol_wrapper_vkCreateDisplayPlaneSurfaceKHR +extern PFN_vkCreateSharedSwapchainsKHR vulkan_symbol_wrapper_vkCreateSharedSwapchainsKHR; +#define vkCreateSharedSwapchainsKHR vulkan_symbol_wrapper_vkCreateSharedSwapchainsKHR +extern PFN_vkCreateDebugReportCallbackEXT vulkan_symbol_wrapper_vkCreateDebugReportCallbackEXT; +#define vkCreateDebugReportCallbackEXT vulkan_symbol_wrapper_vkCreateDebugReportCallbackEXT +extern PFN_vkDestroyDebugReportCallbackEXT vulkan_symbol_wrapper_vkDestroyDebugReportCallbackEXT; +#define vkDestroyDebugReportCallbackEXT vulkan_symbol_wrapper_vkDestroyDebugReportCallbackEXT +extern PFN_vkDebugReportMessageEXT vulkan_symbol_wrapper_vkDebugReportMessageEXT; +#define vkDebugReportMessageEXT vulkan_symbol_wrapper_vkDebugReportMessageEXT +extern PFN_vkDebugMarkerSetObjectTagEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectTagEXT; +#define vkDebugMarkerSetObjectTagEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectTagEXT +extern PFN_vkDebugMarkerSetObjectNameEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectNameEXT; +#define vkDebugMarkerSetObjectNameEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectNameEXT +extern PFN_vkCmdDebugMarkerBeginEXT vulkan_symbol_wrapper_vkCmdDebugMarkerBeginEXT; +#define vkCmdDebugMarkerBeginEXT vulkan_symbol_wrapper_vkCmdDebugMarkerBeginEXT +extern PFN_vkCmdDebugMarkerEndEXT vulkan_symbol_wrapper_vkCmdDebugMarkerEndEXT; +#define vkCmdDebugMarkerEndEXT vulkan_symbol_wrapper_vkCmdDebugMarkerEndEXT +extern PFN_vkCmdDebugMarkerInsertEXT vulkan_symbol_wrapper_vkCmdDebugMarkerInsertEXT; +#define vkCmdDebugMarkerInsertEXT vulkan_symbol_wrapper_vkCmdDebugMarkerInsertEXT + +void vulkan_symbol_wrapper_init(PFN_vkGetInstanceProcAddr get_instance_proc_addr); +PFN_vkGetInstanceProcAddr vulkan_symbol_wrapper_instance_proc_addr(void); +VkBool32 vulkan_symbol_wrapper_load_global_symbols(void); +VkBool32 vulkan_symbol_wrapper_load_core_instance_symbols(VkInstance instance); +VkBool32 vulkan_symbol_wrapper_load_core_symbols(VkInstance instance); +VkBool32 vulkan_symbol_wrapper_load_core_device_symbols(VkDevice device); +VkBool32 vulkan_symbol_wrapper_load_instance_symbol(VkInstance instance, const char *name, PFN_vkVoidFunction *ppSymbol); +VkBool32 vulkan_symbol_wrapper_load_device_symbol(VkDevice device, const char *name, PFN_vkVoidFunction *ppSymbol); + +#define VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, name, pfn) vulkan_symbol_wrapper_load_instance_symbol(instance, name, (PFN_vkVoidFunction*) &(pfn)) +#define VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(instance, name) vulkan_symbol_wrapper_load_instance_symbol(instance, #name, (PFN_vkVoidFunction*) & name) +#define VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, name, pfn) vulkan_symbol_wrapper_load_device_symbol(device, name, (PFN_vkVoidFunction*) &(pfn)) +#define VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_EXTENSION_SYMBOL(device, name) vulkan_symbol_wrapper_load_device_symbol(device, #name, (PFN_vkVoidFunction*) & name) + +#ifdef __cplusplus +} +#endif +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/aarch64.c
Added
@@ -0,0 +1,128 @@ +/* + libco.aarch64 (2017-06-26) + author: webgeek1234 + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +#ifndef __APPLE__ +#include <malloc.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local uint64_t co_active_buffer[64]; +static thread_local cothread_t co_active_handle; + +asm ( + ".globl co_switch_aarch64\n" + ".globl _co_switch_aarch64\n" + "co_switch_aarch64:\n" + "_co_switch_aarch64:\n" + " stp x8, x9, [x1]\n" + " stp x10, x11, [x1, #16]\n" + " stp x12, x13, [x1, #32]\n" + " stp x14, x15, [x1, #48]\n" + " str x19, [x1, #72]\n" + " stp x20, x21, [x1, #80]\n" + " stp x22, x23, [x1, #96]\n" + " stp x24, x25, [x1, #112]\n" + " stp x26, x27, [x1, #128]\n" + " stp x28, x29, [x1, #144]\n" + " mov x16, sp\n" + " stp x16, x30, [x1, #160]\n" + + " ldp x8, x9, [x0]\n" + " ldp x10, x11, [x0, #16]\n" + " ldp x12, x13, [x0, #32]\n" + " ldp x14, x15, [x0, #48]\n" + " ldr x19, [x0, #72]\n" + " ldp x20, x21, [x0, #80]\n" + " ldp x22, x23, [x0, #96]\n" + " ldp x24, x25, [x0, #112]\n" + " ldp x26, x27, [x0, #128]\n" + " ldp x28, x29, [x0, #144]\n" + " ldp x16, x17, [x0, #160]\n" + " mov sp, x16\n" + " br x17\n" + ); + +/* ASM */ +void co_switch_aarch64(cothread_t handle, cothread_t current); + +static void crash(void) +{ + /* Called only if cothread_t entrypoint returns. */ + assert(0); +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) +{ + size = (size + 1023) & ~1023; + cothread_t handle = 0; +#if HAVE_POSIX_MEMALIGN >= 1 + if (posix_memalign(&handle, 1024, size + 512) < 0) + return 0; +#else + handle = memalign(1024, size + 512); +#endif + + if (!handle) + return handle; + + uint64_t *ptr = (uint64_t*)handle; + /* Non-volatiles. */ + ptr[0] = 0; /* x8 */ + ptr[1] = 0; /* x9 */ + ptr[2] = 0; /* x10 */ + ptr[3] = 0; /* x11 */ + ptr[4] = 0; /* x12 */ + ptr[5] = 0; /* x13 */ + ptr[6] = 0; /* x14 */ + ptr[7] = 0; /* x15 */ + ptr[8] = 0; /* padding */ + ptr[9] = 0; /* x19 */ + ptr[10] = 0; /* x20 */ + ptr[11] = 0; /* x21 */ + ptr[12] = 0; /* x22 */ + ptr[13] = 0; /* x23 */ + ptr[14] = 0; /* x24 */ + ptr[15] = 0; /* x25 */ + ptr[16] = 0; /* x26 */ + ptr[17] = 0; /* x27 */ + ptr[18] = 0; /* x28 */ + ptr[20] = (uintptr_t)ptr + size + 512 - 16; /* x30, stack pointer */ + ptr[19] = ptr[20]; /* x29, frame pointer */ + ptr[21] = (uintptr_t)entrypoint; /* PC (link register x31 gets saved here). */ + return handle; +} + +cothread_t co_active(void) +{ + if (!co_active_handle) + co_active_handle = co_active_buffer; + return co_active_handle; +} + +void co_delete(cothread_t handle) +{ + free(handle); +} + +void co_switch(cothread_t handle) +{ + cothread_t co_previous_handle = co_active(); + co_switch_aarch64(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/amd64.c
Added
@@ -0,0 +1,223 @@ +/* + libco.amd64 (2009-10-12) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include <libco.h> +#include <assert.h> +#include <stdlib.h> + +#if defined(__GNUC__) && !defined(_WIN32) && !defined(__cplusplus) +#define CO_USE_INLINE_ASM +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local long long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +#ifndef CO_USE_INLINE_ASM +static void (*co_swap)(cothread_t, cothread_t) = 0; +#endif + +#ifdef _WIN32 +/* ABI: Win64 */ + /* On windows handle is allocated by malloc and there it's guaranteed to + have at least 16-byte alignment. Hence we don't need to align + it in order to use movaps. */ +static unsigned char co_swap_function[] = { + 0x48, 0x89, 0x22, /* mov [rdx],rsp */ + 0x48, 0x8b, 0x21, /* mov rsp,[rcx] */ + 0x58, /* pop rax */ + 0x48, 0x89, 0x6a, 0x08, /* mov [rdx+ 8],rbp */ + 0x48, 0x89, 0x72, 0x10, /* mov [rdx+16],rsi */ + 0x48, 0x89, 0x7a, 0x18, /* mov [rdx+24],rdi */ + 0x48, 0x89, 0x5a, 0x20, /* mov [rdx+32],rbx */ + 0x4c, 0x89, 0x62, 0x28, /* mov [rdx+40],r12 */ + 0x4c, 0x89, 0x6a, 0x30, /* mov [rdx+48],r13 */ + 0x4c, 0x89, 0x72, 0x38, /* mov [rdx+56],r14 */ + 0x4c, 0x89, 0x7a, 0x40, /* mov [rdx+64],r15 */ + #if !defined(LIBCO_NO_SSE) + 0x0f, 0x29, 0x72, 0x50, /* movaps [rdx+ 80],xmm6 */ + 0x0f, 0x29, 0x7a, 0x60, /* movaps [rdx+ 96],xmm7 */ + 0x44, 0x0f, 0x29, 0x42, 0x70, /* movaps [rdx+112],xmm8 */ + 0x48, 0x83, 0xc2, 0x70, /* add rdx,112 */ + 0x44, 0x0f, 0x29, 0x4a, 0x10, /* movaps [rdx+ 16],xmm9 */ + 0x44, 0x0f, 0x29, 0x52, 0x20, /* movaps [rdx+ 32],xmm10 */ + 0x44, 0x0f, 0x29, 0x5a, 0x30, /* movaps [rdx+ 48],xmm11 */ + 0x44, 0x0f, 0x29, 0x62, 0x40, /* movaps [rdx+ 64],xmm12 */ + 0x44, 0x0f, 0x29, 0x6a, 0x50, /* movaps [rdx+ 80],xmm13 */ + 0x44, 0x0f, 0x29, 0x72, 0x60, /* movaps [rdx+ 96],xmm14 */ + 0x44, 0x0f, 0x29, 0x7a, 0x70, /* movaps [rdx+112],xmm15 */ + #endif + 0x48, 0x8b, 0x69, 0x08, /* mov rbp,[rcx+ 8] */ + 0x48, 0x8b, 0x71, 0x10, /* mov rsi,[rcx+16] */ + 0x48, 0x8b, 0x79, 0x18, /* mov rdi,[rcx+24] */ + 0x48, 0x8b, 0x59, 0x20, /* mov rbx,[rcx+32] */ + 0x4c, 0x8b, 0x61, 0x28, /* mov r12,[rcx+40] */ + 0x4c, 0x8b, 0x69, 0x30, /* mov r13,[rcx+48] */ + 0x4c, 0x8b, 0x71, 0x38, /* mov r14,[rcx+56] */ + 0x4c, 0x8b, 0x79, 0x40, /* mov r15,[rcx+64] */ + #if !defined(LIBCO_NO_SSE) + 0x0f, 0x28, 0x71, 0x50, /* movaps xmm6, [rcx+ 80] */ + 0x0f, 0x28, 0x79, 0x60, /* movaps xmm7, [rcx+ 96] */ + 0x44, 0x0f, 0x28, 0x41, 0x70, /* movaps xmm8, [rcx+112] */ + 0x48, 0x83, 0xc1, 0x70, /* add rcx,112 */ + 0x44, 0x0f, 0x28, 0x49, 0x10, /* movaps xmm9, [rcx+ 16] */ + 0x44, 0x0f, 0x28, 0x51, 0x20, /* movaps xmm10,[rcx+ 32] */ + 0x44, 0x0f, 0x28, 0x59, 0x30, /* movaps xmm11,[rcx+ 48] */ + 0x44, 0x0f, 0x28, 0x61, 0x40, /* movaps xmm12,[rcx+ 64] */ + 0x44, 0x0f, 0x28, 0x69, 0x50, /* movaps xmm13,[rcx+ 80] */ + 0x44, 0x0f, 0x28, 0x71, 0x60, /* movaps xmm14,[rcx+ 96] */ + 0x44, 0x0f, 0x28, 0x79, 0x70, /* movaps xmm15,[rcx+112] */ + #endif + 0xff, 0xe0, /* jmp rax */ +}; + +#include <windows.h> + +static void co_init(void) +{ + DWORD old_privileges; + VirtualProtect(co_swap_function, + sizeof(co_swap_function), PAGE_EXECUTE_READWRITE, &old_privileges); +} +#else +/* ABI: SystemV */ +#ifndef CO_USE_INLINE_ASM +static unsigned char co_swap_function[] = { + 0x48, 0x89, 0x26, /* mov [rsi],rsp */ + 0x48, 0x8b, 0x27, /* mov rsp,[rdi] */ + 0x58, /* pop rax */ + 0x48, 0x89, 0x6e, 0x08, /* mov [rsi+0x08],rbp */ + 0x48, 0x89, 0x5e, 0x10, /* mov [rsi+0x10],rbx */ + 0x4c, 0x89, 0x66, 0x18, /* mov [rsi+0x18],r12 */ + 0x4c, 0x89, 0x6e, 0x20, /* mov [rsi+0x20],r13 */ + 0x4c, 0x89, 0x76, 0x28, /* mov [rsi+0x28],r14 */ + 0x4c, 0x89, 0x7e, 0x30, /* mov [rsi+0x30],r15 */ + 0x48, 0x8b, 0x6f, 0x08, /* mov rbp,[rdi+0x08] */ + 0x48, 0x8b, 0x5f, 0x10, /* mov rbx,[rdi+0x10] */ + 0x4c, 0x8b, 0x67, 0x18, /* mov r12,[rdi+0x18] */ + 0x4c, 0x8b, 0x6f, 0x20, /* mov r13,[rdi+0x20] */ + 0x4c, 0x8b, 0x77, 0x28, /* mov r14,[rdi+0x28] */ + 0x4c, 0x8b, 0x7f, 0x30, /* mov r15,[rdi+0x30] */ + 0xff, 0xe0, /* jmp rax */ +}; + +#include <unistd.h> +#include <sys/mman.h> + +static void co_init(void) +{ + unsigned long long addr = (unsigned long long)co_swap_function; + unsigned long long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long long size = (addr - base) + sizeof(co_swap_function); + mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC); +} +#else +static void co_init(void) {} +#endif +#endif + +static void crash(void) +{ + assert(0); /* called only if cothread_t entrypoint returns */ +} + +cothread_t co_active(void) +{ + if (!co_active_handle) + co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) +{ + cothread_t handle; + +#ifndef CO_USE_INLINE_ASM + if(!co_swap) + { + co_init(); + co_swap = (void (*)(cothread_t, cothread_t))co_swap_function; + } +#endif + + if (!co_active_handle) + co_active_handle = &co_active_buffer; + size += 512; /* allocate additional space for storage */ + size &= ~15; /* align stack to 16-byte boundary */ + +#ifdef __GENODE__ + if((handle = (cothread_t)genode_alloc_secondary_stack(size))) + { + long long *p = (long long*)((char*)handle); /* OS returns top of stack */ + *--p = (long long)crash; /* crash if entrypoint returns */ + *--p = (long long)entrypoint; /* start of function */ + *(long long*)handle = (long long)p; /* stack pointer */ + } +#else + if((handle = (cothread_t)malloc(size))) + { + long long *p = (long long*)((char*)handle + size); /* seek to top of stack */ + *--p = (long long)crash; /* crash if entrypoint returns */ + *--p = (long long)entrypoint; /* start of function */ + *(long long*)handle = (long long)p; /* stack pointer */ + } +#endif + + return handle; +} + +void co_delete(cothread_t handle) +{ +#ifdef __GENODE__ + genode_free_secondary_stack(handle); +#else + free(handle); +#endif +} + +#ifndef CO_USE_INLINE_ASM +void co_switch(cothread_t handle) +{ + register cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} +#else +#ifdef __APPLE__ +#define ASM_PREFIX "_" +#else +#define ASM_PREFIX "" +#endif +__asm__( +".intel_syntax noprefix \n" +".globl " ASM_PREFIX "co_switch \n" +ASM_PREFIX "co_switch: \n" +"mov rsi, [rip+" ASM_PREFIX "co_active_handle]\n" +"mov [rsi],rsp \n" +"mov [rsi+0x08],rbp \n" +"mov [rsi+0x10],rbx \n" +"mov [rsi+0x18],r12 \n" +"mov [rsi+0x20],r13 \n" +"mov [rsi+0x28],r14 \n" +"mov [rsi+0x30],r15 \n" +"mov [rip+" ASM_PREFIX "co_active_handle], rdi\n" +"mov rsp,[rdi] \n" +"mov rbp,[rdi+0x08] \n" +"mov rbx,[rdi+0x10] \n" +"mov r12,[rdi+0x18] \n" +"mov r13,[rdi+0x20] \n" +"mov r14,[rdi+0x28] \n" +"mov r15,[rdi+0x30] \n" +"ret \n" +".att_syntax \n" +); +#endif + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/armeabi.c
Added
@@ -0,0 +1,109 @@ +/* + libco.armeabi (2013-04-05) + author: Themaister + license: public domain +*/ + +#define LIBCO_C +#include <libco.h> +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +#ifndef __APPLE__ +#include <malloc.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local uint32_t co_active_buffer[64]; +static thread_local cothread_t co_active_handle; + +__asm__ ( +#if defined(__thumb2__) + ".align 2\n" + ".globl co_switch_arm\n" + ".globl _co_switch_arm\n" + ".thumb\n" + ".thumb_func\n" + ".type co_switch_arm, %function\n" + ".type _co_switch_arm, %function\n" + "co_switch_arm:\n" + "_co_switch_arm:\n" + " mov r3, sp\n" + " stmia r1!, {r4, r5, r6, r7, r8, r9, r10, r11}\n" + " stmia r1!, {r3, lr}\n" + " ldmia r0!, {r4, r5, r6, r7, r8, r9, r10, r11}\n" + " ldmfd r0!, { r3 }\n" + " mov sp, r3\n" + " ldmfd r0!, { r3 }\n" + " mov pc, r3\n" +#else + ".arm\n" + ".align 4\n" + ".globl co_switch_arm\n" + ".globl _co_switch_arm\n" + "co_switch_arm:\n" + "_co_switch_arm:\n" + " stmia r1!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, lr}\n" + " ldmia r0!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, pc}\n" +#endif + ); + +/* ASM */ +void co_switch_arm(cothread_t handle, cothread_t current); + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) +{ + size = (size + 1023) & ~1023; + cothread_t handle = 0; +#if defined(__APPLE__) || HAVE_POSIX_MEMALIGN >= 1 + if (posix_memalign(&handle, 1024, size + 256) < 0) + return 0; +#else + handle = memalign(1024, size + 256); +#endif + + if (!handle) + return handle; + + uint32_t *ptr = (uint32_t*)handle; + /* Non-volatiles. */ + ptr[0] = 0; /* r4 */ + ptr[1] = 0; /* r5 */ + ptr[2] = 0; /* r6 */ + ptr[3] = 0; /* r7 */ + ptr[4] = 0; /* r8 */ + ptr[5] = 0; /* r9 */ + ptr[6] = 0; /* r10 */ + ptr[7] = 0; /* r11 */ + /* Align stack to 64-bit */ + ptr[8] = (uintptr_t)ptr + size + 256 - 8; /* r13, stack pointer */ + ptr[9] = (uintptr_t)entrypoint; /* r15, PC (link register r14 gets saved here). */ + return handle; +} + +cothread_t co_active(void) +{ + if (!co_active_handle) + co_active_handle = co_active_buffer; + return co_active_handle; +} + +void co_delete(cothread_t handle) +{ + free(handle); +} + +void co_switch(cothread_t handle) +{ + cothread_t co_previous_handle = co_active(); + co_switch_arm(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/fiber.c
Added
@@ -0,0 +1,71 @@ +/* + libco.win (2008-01-28) + authors: Nach, byuu + license: public domain +*/ + +#define LIBCO_C +#include <libco.h> +#define WINVER 0x0400 +#define _WIN32_WINNT 0x0400 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local cothread_t co_active_ = 0; + +static void __stdcall co_thunk(void *coentry) +{ + ((void (*)(void))coentry)(); +} + +cothread_t co_active(void) +{ + if(!co_active_) + { +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + ConvertThreadToFiberEx(0, FIBER_FLAG_FLOAT_SWITCH); +#else + ConvertThreadToFiber(0); +#endif + co_active_ = GetCurrentFiber(); + } + return co_active_; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) +{ + if(!co_active_) + { +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + ConvertThreadToFiberEx(0, FIBER_FLAG_FLOAT_SWITCH); +#else + ConvertThreadToFiber(0); +#endif + co_active_ = GetCurrentFiber(); + } + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + return (cothread_t)CreateFiberEx(heapsize, heapsize, FIBER_FLAG_FLOAT_SWITCH, co_thunk, (void*)coentry); +#else + return (cothread_t)CreateFiber(heapsize, co_thunk, (void*)coentry); +#endif +} + +void co_delete(cothread_t cothread) +{ + DeleteFiber(cothread); +} + +void co_switch(cothread_t cothread) +{ + co_active_ = cothread; + SwitchToFiber(cothread); +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/genode.cpp
Added
@@ -0,0 +1,29 @@ +/* + libco.genode_secondary_stack (2018-09-15) + author: Emery Hemingway + license: public domain +*/ + +/* Genode include */ +#include <base/thread.h> + +/* Libco include */ +#include <libco.h> + +extern "C" +void *genode_alloc_secondary_stack(unsigned long stack_size) +{ + try { + return Genode::Thread::myself()->alloc_secondary_stack("libco", stack_size); } + catch (...) { + Genode::error("libco: failed to allocate ", stack_size, " byte secondary stack"); + return nullptr; + } + +} + +extern "C" +void genode_free_secondary_stack(void *stack) +{ + Genode::Thread::myself()->free_secondary_stack(stack); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/libco.c
Added
@@ -0,0 +1,45 @@ +/* + libco + auto-selection module + license: public domain +*/ + +#ifdef __GENODE__ +void *genode_alloc_secondary_stack(unsigned long stack_size); +void genode_free_secondary_stack(void *stack); +#endif + +#if defined _MSC_VER + #include <Windows.h> + #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #include "fiber.c" + #elif defined _M_IX86 + #include "x86.c" + #elif defined _M_AMD64 + #include "amd64.c" + #else + #include "fiber.c" + #endif +#elif defined __GNUC__ + #if defined __i386__ + #include "x86.c" + #elif defined __amd64__ + #include "amd64.c" + #elif defined _ARCH_PPC + #include "ppc.c" + #elif defined(__aarch64__) + #include "aarch64.c" + #elif defined(PS2) + #include "ps2.c" + #elif defined(PSP) + #include "psp1.c" + #elif defined VITA + #include "scefiber.c" + #elif defined(__ARM_EABI__) || defined(__arm__) + #include "armeabi.c" + #else + #include "sjlj.c" + #endif +#else + #error "libco: unsupported processor, compiler or operating system" +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/ppc.c
Added
@@ -0,0 +1,407 @@ +/* + libco.ppc (2010-10-17) + author: blargg + license: public domain +*/ + +/* PowerPC 32/64 using embedded or external asm, with optional +floating-point and AltiVec save/restore */ + +#define LIBCO_C +#include <libco.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> + +#define LIBCO_MPROTECT (__unix__ && !LIBCO_PPC_ASM) + +#if LIBCO_MPROTECT + #include <unistd.h> + #include <sys/mman.h> +#endif + +/* State format (offsets in 32-bit words) + ++0 Pointer to swap code + Rest of function descriptor for entry function ++8 PC ++10 SP + Special regs + GPRs + FPRs + VRs + stack +*/ + +enum { state_size = 1024 }; +enum { above_stack = 2048 }; +enum { stack_align = 256 }; + +static thread_local cothread_t co_active_handle = 0; + +/**** Determine environment ****/ + +#define LIBCO_PPC64 (_ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__) + +/* Whether function calls are indirect through a descriptor, +or are directly to function */ +#ifndef LIBCO_PPCDESC + #if !_CALL_SYSV && (_CALL_AIX || _CALL_AIXDESC || LIBCO_PPC64) + #define LIBCO_PPCDESC 1 + #endif +#endif + +#ifdef LIBCO_PPC_ASM + + #ifdef __cplusplus + extern "C" + #endif + + /* Swap code is in ppc.S */ + void co_swap_asm( cothread_t, cothread_t ); + #define CO_SWAP_ASM( x, y ) co_swap_asm( x, y ) + +#else + +/* Swap code is here in array. Please leave dieassembly comments, +as they make it easy to see what it does, and reorder instructions +if one wants to see whether that improves performance. */ +static const uint32_t libco_ppc_code [] = { +#if LIBCO_PPC64 + 0x7d000026, /* mfcr r8 */ + 0xf8240028, /* std r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0xf9c40048, /* std r14,72(r4) */ + 0xf9e40050, /* std r15,80(r4) */ + 0xfa040058, /* std r16,88(r4) */ + 0xfa240060, /* std r17,96(r4) */ + 0xfa440068, /* std r18,104(r4) */ + 0xfa640070, /* std r19,112(r4) */ + 0xfa840078, /* std r20,120(r4) */ + 0xfaa40080, /* std r21,128(r4) */ + 0xfac40088, /* std r22,136(r4) */ + 0xfae40090, /* std r23,144(r4) */ + 0xfb040098, /* std r24,152(r4) */ + 0xfb2400a0, /* std r25,160(r4) */ + 0xfb4400a8, /* std r26,168(r4) */ + 0xfb6400b0, /* std r27,176(r4) */ + 0xfb8400b8, /* std r28,184(r4) */ + 0xfba400c0, /* std r29,192(r4) */ + 0xfbc400c8, /* std r30,200(r4) */ + 0xfbe400d0, /* std r31,208(r4) */ + 0xf9240020, /* std r9,32(r4) */ + 0xe8e30020, /* ld r7,32(r3) */ + 0xe8230028, /* ld r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030,/*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0xe9c30048, /* ld r14,72(r3) */ + 0xe9e30050, /* ld r15,80(r3) */ + 0xea030058, /* ld r16,88(r3) */ + 0xea230060, /* ld r17,96(r3) */ + 0xea430068, /* ld r18,104(r3) */ + 0xea630070, /* ld r19,112(r3) */ + 0xea830078, /* ld r20,120(r3) */ + 0xeaa30080, /* ld r21,128(r3) */ + 0xeac30088, /* ld r22,136(r3) */ + 0xeae30090, /* ld r23,144(r3) */ + 0xeb030098, /* ld r24,152(r3) */ + 0xeb2300a0, /* ld r25,160(r3) */ + 0xeb4300a8, /* ld r26,168(r3) */ + 0xeb6300b0, /* ld r27,176(r3) */ + 0xeb8300b8, /* ld r28,184(r3) */ + 0xeba300c0, /* ld r29,192(r3) */ + 0xebc300c8, /* ld r30,200(r3) */ + 0xebe300d0, /* ld r31,208(r3) */ + 0x7ccff120, /* mtcr r6 */ +#else + 0x7d000026, /* mfcr r8 */ + 0x90240028, /* stw r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0x91a4003c, /* stw r13,60(r4) */ + 0x91c40040, /* stw r14,64(r4) */ + 0x91e40044, /* stw r15,68(r4) */ + 0x92040048, /* stw r16,72(r4) */ + 0x9224004c, /* stw r17,76(r4) */ + 0x92440050, /* stw r18,80(r4) */ + 0x92640054, /* stw r19,84(r4) */ + 0x92840058, /* stw r20,88(r4) */ + 0x92a4005c, /* stw r21,92(r4) */ + 0x92c40060, /* stw r22,96(r4) */ + 0x92e40064, /* stw r23,100(r4) */ + 0x93040068, /* stw r24,104(r4) */ + 0x9324006c, /* stw r25,108(r4) */ + 0x93440070, /* stw r26,112(r4) */ + 0x93640074, /* stw r27,116(r4) */ + 0x93840078, /* stw r28,120(r4) */ + 0x93a4007c, /* stw r29,124(r4) */ + 0x93c40080, /* stw r30,128(r4) */ + 0x93e40084, /* stw r31,132(r4) */ + 0x91240020, /* stw r9,32(r4) */ + 0x80e30020, /* lwz r7,32(r3) */ + 0x80230028, /* lwz r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030,/*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0x81a3003c, /* lwz r13,60(r3) */ + 0x81c30040, /* lwz r14,64(r3) */ + 0x81e30044, /* lwz r15,68(r3) */ + 0x82030048, /* lwz r16,72(r3) */ + 0x8223004c, /* lwz r17,76(r3) */ + 0x82430050, /* lwz r18,80(r3) */ + 0x82630054, /* lwz r19,84(r3) */ + 0x82830058, /* lwz r20,88(r3) */ + 0x82a3005c, /* lwz r21,92(r3) */ + 0x82c30060, /* lwz r22,96(r3) */ + 0x82e30064, /* lwz r23,100(r3) */ + 0x83030068, /* lwz r24,104(r3) */ + 0x8323006c, /* lwz r25,108(r3) */ + 0x83430070, /* lwz r26,112(r3) */ + 0x83630074, /* lwz r27,116(r3) */ + 0x83830078, /* lwz r28,120(r3) */ + 0x83a3007c, /* lwz r29,124(r3) */ + 0x83c30080, /* lwz r30,128(r3) */ + 0x83e30084, /* lwz r31,132(r3) */ + 0x7ccff120, /* mtcr r6 */ +#endif + +#ifndef LIBCO_PPC_NOFP + 0xd9c400e0, /* stfd f14,224(r4) */ + 0xd9e400e8, /* stfd f15,232(r4) */ + 0xda0400f0, /* stfd f16,240(r4) */ + 0xda2400f8, /* stfd f17,248(r4) */ + 0xda440100, /* stfd f18,256(r4) */ + 0xda640108, /* stfd f19,264(r4) */ + 0xda840110, /* stfd f20,272(r4) */ + 0xdaa40118, /* stfd f21,280(r4) */ + 0xdac40120, /* stfd f22,288(r4) */ + 0xdae40128, /* stfd f23,296(r4) */ + 0xdb040130, /* stfd f24,304(r4) */ + 0xdb240138, /* stfd f25,312(r4) */ + 0xdb440140, /* stfd f26,320(r4) */ + 0xdb640148, /* stfd f27,328(r4) */ + 0xdb840150, /* stfd f28,336(r4) */ + 0xdba40158, /* stfd f29,344(r4) */ + 0xdbc40160, /* stfd f30,352(r4) */ + 0xdbe40168, /* stfd f31,360(r4) */ + 0xc9c300e0, /* lfd f14,224(r3) */ + 0xc9e300e8, /* lfd f15,232(r3) */ + 0xca0300f0, /* lfd f16,240(r3) */ + 0xca2300f8, /* lfd f17,248(r3) */ + 0xca430100, /* lfd f18,256(r3) */ + 0xca630108, /* lfd f19,264(r3) */ + 0xca830110, /* lfd f20,272(r3) */ + 0xcaa30118, /* lfd f21,280(r3) */ + 0xcac30120, /* lfd f22,288(r3) */ + 0xcae30128, /* lfd f23,296(r3) */ + 0xcb030130, /* lfd f24,304(r3) */ + 0xcb230138, /* lfd f25,312(r3) */ + 0xcb430140, /* lfd f26,320(r3) */ + 0xcb630148, /* lfd f27,328(r3) */ + 0xcb830150, /* lfd f28,336(r3) */ + 0xcba30158, /* lfd f29,344(r3) */ + 0xcbc30160, /* lfd f30,352(r3) */ + 0xcbe30168, /* lfd f31,360(r3) */ +#endif + +#ifdef __ALTIVEC__ + 0x7ca042a6, /* mfvrsave r5 */ + 0x39040180, /* addi r8,r4,384 */ + 0x39240190, /* addi r9,r4,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x90a40034, /* stw r5,52(r4) */ + 0x4182005c, /* beq- 2 */ + 0x7e8041ce, /* stvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea049ce, /* stvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec041ce, /* stvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee049ce, /* stvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0041ce, /* stvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2049ce, /* stvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4041ce, /* stvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6049ce, /* stvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8041ce, /* stvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa049ce, /* stvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc041ce, /* stvx v30,r0,r8 */ + 0x7fe049ce, /* stvx v31,r0,r9 */ + 0x80a30034,/*2:lwz r5,52(r3) */ + 0x39030180, /* addi r8,r3,384 */ + 0x39230190, /* addi r9,r3,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x7ca043a6, /* mtvrsave r5 */ + 0x4d820420, /* beqctr */ + 0x7e8040ce, /* lvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea048ce, /* lvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec040ce, /* lvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee048ce, /* lvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0040ce, /* lvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2048ce, /* lvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4040ce, /* lvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6048ce, /* lvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8040ce, /* lvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa048ce, /* lvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc040ce, /* lvx v30,r0,r8 */ + 0x7fe048ce, /* lvx v31,r0,r9 */ +#endif + + 0x4e800420, /* bctr */ +}; + + #if LIBCO_PPCDESC + /* Function call goes through indirect descriptor */ + #define CO_SWAP_ASM( x, y ) \ + ((void (*)( cothread_t, cothread_t )) (uintptr_t) x)( x, y ) + #else + /* Function call goes directly to code */ + #define CO_SWAP_ASM( x, y ) \ + ((void (*)( cothread_t, cothread_t )) (uintptr_t) libco_ppc_code)( x, y ) + #endif + +#endif + +static uint32_t* co_create_( unsigned size, uintptr_t entry ) +{ + uint32_t* t = (uint32_t*) malloc( size ); + + (void) entry; + + #if LIBCO_PPCDESC + if ( t ) + { + /* Copy entry's descriptor */ + memcpy( t, (void*) entry, sizeof (void*) * 3 ); + + /* Set function pointer to swap routine */ + #ifdef LIBCO_PPC_ASM + *(const void**) t = *(void**) &co_swap_asm; + #else + *(const void**) t = libco_ppc_code; + #endif + } + #endif + + return t; +} + +cothread_t co_create( unsigned int size, void (*entry_)( void ) ) +{ + uintptr_t entry = (uintptr_t) entry_; + uint32_t* t = NULL; + + /* Be sure main thread was successfully allocated */ + if ( co_active() ) + { + size += state_size + above_stack + stack_align; + t = co_create_( size, entry ); + } + + if ( t ) + { + uintptr_t sp; + int shift; + + /* Save current registers into new thread, so that any special ones will + have proper values when thread is begun */ + CO_SWAP_ASM( t, t ); + + #if LIBCO_PPCDESC + /* Get real address */ + entry = (uintptr_t) *(void**) entry; + #endif + + /* Put stack near end of block, and align */ + sp = (uintptr_t) t + size - above_stack; + sp -= sp % stack_align; + + /* On PPC32, we save and restore GPRs as 32 bits. For PPC64, we + save and restore them as 64 bits, regardless of the size the ABI + uses. So, we manually write pointers at the proper size. We always + save and restore at the same address, and since PPC is big-endian, + we must put the low byte first on PPC32. */ + + /* If uintptr_t is 32 bits, >>32 is undefined behavior, so we do two shifts + and don't have to care how many bits uintptr_t is. */ + #if LIBCO_PPC64 + shift = 16; + #else + shift = 0; + #endif + + /* Set up so entry will be called on next swap */ + t [8] = (uint32_t) (entry >> shift >> shift); + t [9] = (uint32_t) entry; + + t [10] = (uint32_t) (sp >> shift >> shift); + t [11] = (uint32_t) sp; + } + + return t; +} + +void co_delete( cothread_t t ) +{ + free(t); +} + +static void co_init_( void ) +{ +#if LIBCO_MPROTECT + /* TODO: pre- and post-pad PPC code so that this doesn't make other + data executable and writable */ + long page_size = sysconf( _SC_PAGESIZE ); + if ( page_size > 0 ) + { + uintptr_t align = page_size; + uintptr_t begin = (uintptr_t) libco_ppc_code; + uintptr_t end = begin + sizeof libco_ppc_code; + + /* Align beginning and end */ + end += align - 1; + end -= end % align; + begin -= begin % align; + + mprotect( (void*) begin, end - begin, PROT_READ | PROT_WRITE | PROT_EXEC ); + } +#endif + + co_active_handle = co_create_( state_size, (uintptr_t) &co_switch ); +} + +cothread_t co_active(void) +{ + if (!co_active_handle) + co_init_(); + + return co_active_handle; +} + +void co_switch(cothread_t t) +{ + cothread_t old = co_active_handle; + co_active_handle = t; + + CO_SWAP_ASM( t, old ); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/ps2.c
Added
@@ -0,0 +1,66 @@ +#define LIBCO_C +#include "libco.h" + +#include <stdlib.h> +#include <stdint.h> +#include <kernel.h> + +/* Since cothread_t is a void pointer it must contain an address. We can't return a reference to a local variable + * because it would go out of scope, so we create a static variable instead so we can return a reference to it. + */ +static int32_t active_thread_id = -1; +extern void *_gp; + +cothread_t co_active() +{ + active_thread_id = GetThreadId(); + return &active_thread_id; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) +{ + /* Similar scenario as with active_thread_id except there will only be one active_thread_id while there could be many + * new threads each with their own handle, so we create them on the heap instead and delete them manually when they're + * no longer needed in co_delete(). + */ + cothread_t handle = malloc(sizeof(cothread_t)); + ee_thread_t thread; + + // u8 threadStack[size/8] __attribute__ ((aligned(16))); + void *threadStack = (void *)malloc(size); + + if ( threadStack== NULL) + { + printf("libco: ERROR: creating threadStack\n"); + return(-1); + } + + thread.stack_size = size; + thread.gp_reg = &_gp; + thread.func = (void *)entrypoint; + thread.stack = threadStack; + thread.option = 0; + thread.initial_priority = 1; + + int32_t new_thread_id = CreateThread(&thread); + if (new_thread_id < 0) + printf("libco: ERROR: creating thread\n"); + + StartThread(new_thread_id, NULL); + *(uint32_t *)handle = new_thread_id; + return handle; +} + +void co_delete(cothread_t handle) +{ + TerminateThread(*(uint32_t *)handle); + DeleteThread(*(uint32_t *)handle); + free(handle); +} + +void co_switch(cothread_t handle) +{ + WakeupThread(*(uint32_t *)handle); + /* Sleep the currently active thread so the new thread can start */ + SleepThread(); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/psp1.c
Added
@@ -0,0 +1,41 @@ +#define LIBCO_C +#include "libco.h" + +#include <stdlib.h> +#include <pspthreadman.h> + +typedef void (*entrypoint_t)(void); + +cothread_t co_active() +{ + return (void *) sceKernelGetThreadId(); +} + +static int thread_wrap(unsigned int argc, void *argp) +{ + entrypoint_t entrypoint = *(entrypoint_t *) argp; + sceKernelSleepThread(); + entrypoint(); + return 0; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) +{ + SceUID new_thread_id = sceKernelCreateThread("cothread", thread_wrap, 0x12, size, 0, NULL); + sceKernelStartThread(new_thread_id, sizeof (entrypoint), &entrypoint); + return (void *) new_thread_id; +} + +void co_delete(cothread_t handle) +{ + SceUID id = (SceUID) handle; + sceKernelTerminateDeleteThread(id); +} + +void co_switch(cothread_t handle) +{ + SceUID id = (SceUID) handle; + sceKernelWakeupThread(id); + /* Sleep the currently active thread so the new thread can start */ + sceKernelSleepThread(); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/psp2.c
Added
@@ -0,0 +1,113 @@ +/* +libco.arm (2015-06-18) +license: public domain +*/ + +#define LIBCO_C +#include "libco.h" + +#include <assert.h> +#include <stdlib.h> +#include <unistd.h> +#include <psp2/kernel/sysmem.h> +#include <stdio.h> +#include <string.h> + +#define FOUR_KB_ALIGN(x) align(x, 12) +#define MB_ALIGN(x) align(x, 20) + +#ifdef __cplusplus +extern "C" { +#endif + + static inline int align(int x, int n) + { + return (((x >> n) + 1) << n); + } + + static thread_local unsigned long co_active_buffer[64]; + static thread_local cothread_t co_active_handle = 0; + static void(*co_swap)(cothread_t, cothread_t) = 0; + static int block; + static uint32_t co_swap_function[] = { + 0xe8a16ff0, /* stmia r1!, {r4-r11,sp,lr} */ + 0xe8b0aff0, /* ldmia r0!, {r4-r11,sp,pc} */ + 0xe12fff1e, /* bx lr */ + }; + + static void co_init(void) + { + int ret; + void *base; + + block = sceKernelAllocMemBlockForVM("libco", + MB_ALIGN(FOUR_KB_ALIGN(sizeof co_swap_function))); + if (block < 0) + return; + + /* get base address */ + ret = sceKernelGetMemBlockBase(block, &base); + if (ret < 0) + return; + + /* set domain to be writable by user */ + ret = sceKernelOpenVMDomain(); + if (ret < 0) + return; + + memcpy(base, co_swap_function, sizeof co_swap_function); + + /* set domain back to read-only */ + ret = sceKernelCloseVMDomain(); + if (ret < 0) + return; + + /* flush icache */ + ret = sceKernelSyncVMDomain(block, base, + MB_ALIGN(FOUR_KB_ALIGN(sizeof co_swap_function))); + if (ret < 0) + return; + + co_swap = (void(*)(cothread_t, cothread_t))base; + } + + cothread_t co_active(void) + { + if (!co_active_handle) co_active_handle = &co_active_buffer; + return co_active_handle; + } + + cothread_t co_create(unsigned int size, void(*entrypoint)(void)) + { + unsigned long* handle = 0; + if (!co_swap) + co_init(); + if (!co_active_handle) co_active_handle = &co_active_buffer; + size += 256; + size &= ~15; + + if ((handle = (unsigned long*)malloc(size))) + { + unsigned long* p = (unsigned long*)((unsigned char*)handle + size); + handle[8] = (unsigned long)p; + handle[9] = (unsigned long)entrypoint; + } + + return handle; + } + + void co_delete(cothread_t handle) + { + free(handle); + sceKernelFreeMemBlock(block); + } + + void co_switch(cothread_t handle) + { + cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); + } + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/scefiber.c
Added
@@ -0,0 +1,96 @@ +/* + libco.win (2016-09-06) + authors: frangarcj + license: public domain +*/ + +#define LIBCO_C +#include <libco.h> +#include <stdlib.h> +#include <psp2/sysmodule.h> + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local cothread_t co_active_ = 0; + +typedef struct SceFiber { + char reserved[128]; +} SceFiber __attribute__( ( aligned ( 8 ) ) ) ; + +int32_t _sceFiberInitializeImpl(SceFiber* fiber, char* name, void* entry, uint32_t argOnInitialize, void* addrContext, int32_t sizeContext, void* params); + +int32_t sceFiberFinalize(SceFiber* fiber); + +int32_t sceFiberRun(SceFiber* fiber, uint32_t argOnRunTo, uint32_t* argOnRun); + +int32_t sceFiberSwitch(SceFiber* fiber, uint32_t argOnRunTo, uint32_t* argOnRun); + +int32_t sceFiberReturnToThread(uint32_t argOnReturn, uint32_t* argOnRun); + +static void co_thunk(uint32_t argOnInitialize, uint32_t argOnRun) +{ + ((void (*)(void))argOnInitialize)(); +} + +cothread_t co_active(void) +{ + if(!co_active_) + { + sceSysmoduleLoadModule(SCE_SYSMODULE_FIBER); + co_active_ = (cothread_t)1; + } + return co_active_; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) +{ + SceFiber* tailFiber = malloc(sizeof(SceFiber)); + char * m_contextBuffer = malloc(sizeof(char)*heapsize); + if(!co_active_) + { + sceSysmoduleLoadModule(SCE_SYSMODULE_FIBER); + co_active_ = (cothread_t)1; + } + + //_sceFiberInitializeImpl + int ret = _sceFiberInitializeImpl(tailFiber, "tailFiber", co_thunk, (uint32_t)coentry, (void*) m_contextBuffer, heapsize, NULL); + if(ret==0){ + return (cothread_t)tailFiber; + }else{ + return (cothread_t)ret; + } + +} + +void co_delete(cothread_t cothread) +{ + if(cothread == (cothread_t)1){ + return; + } + sceFiberFinalize((SceFiber*)cothread); +} + +void co_switch(cothread_t cothread) +{ + + uint32_t argOnReturn = 0; + if(cothread == (cothread_t)1){ + co_active_ = cothread; + sceFiberReturnToThread(0, NULL); + }else{ + SceFiber* theFiber = (SceFiber*)cothread; + if(co_active_ == (cothread_t)1){ + co_active_ = cothread; + sceFiberRun(theFiber, 0, &argOnReturn); + }else{ + co_active_ = cothread; + sceFiberSwitch(theFiber, 0, &argOnReturn); + } + } +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/sjlj.c
Added
@@ -0,0 +1,115 @@ +/* + libco.sjlj (2008-01-28) + author: Nach + license: public domain +*/ + +/* + * Note this was designed for UNIX systems. Based on ideas expressed in a paper + * by Ralf Engelschall. + * For SJLJ on other systems, one would want to rewrite springboard() and + * co_create() and hack the jmb_buf stack pointer. + */ + +#define LIBCO_C +#include <libco.h> +#include <stdlib.h> +#include <signal.h> +#include <setjmp.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + sigjmp_buf context; + void (*coentry)(void); + void *stack; +} cothread_struct; + +static thread_local cothread_struct co_primary; +static thread_local cothread_struct *creating, *co_running = 0; + +static void springboard(int ignored) +{ + if(sigsetjmp(creating->context, 0)) + co_running->coentry(); +} + +cothread_t co_active(void) +{ + if (!co_running) + co_running = &co_primary; + return (cothread_t)co_running; +} + +cothread_t co_create(unsigned int size, void (*coentry)(void)) +{ + if(!co_running) + co_running = &co_primary; + + cothread_struct *thread = (cothread_struct*)malloc(sizeof(cothread_struct)); + + if(thread) + { + stack_t stack; + stack_t old_stack; + + struct sigaction handler = {{0}}; + struct sigaction old_handler = {{0}}; + + thread->coentry = thread->stack = 0; + + stack.ss_flags = 0; + stack.ss_size = size; + thread->stack = stack.ss_sp = malloc(size); + + if(stack.ss_sp && !sigaltstack(&stack, &old_stack)) + { + handler.sa_handler = springboard; + handler.sa_flags = SA_ONSTACK; + sigemptyset(&handler.sa_mask); + creating = thread; + + if(!sigaction(SIGUSR1, &handler, &old_handler)) + { + if(!raise(SIGUSR1)) + thread->coentry = coentry; + sigaltstack(&old_stack, 0); + sigaction(SIGUSR1, &old_handler, 0); + } + } + + if(thread->coentry != coentry) + { + co_delete(thread); + thread = 0; + } + } + + return (cothread_t)thread; +} + +void co_delete(cothread_t cothread) +{ + if (cothread) + { + if(((cothread_struct*)cothread)->stack) + free(((cothread_struct*)cothread)->stack); + free(cothread); + } +} + +void co_switch(cothread_t cothread) +{ + if (!sigsetjmp(co_running->context, 0)) + { + co_running = (cothread_struct*)cothread; + siglongjmp(co_running->context, 1); + } +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/ucontext.c
Added
@@ -0,0 +1,81 @@ +/* + libco.ucontext (2008-01-28) + author: Nach + license: public domain +*/ + +/* + * WARNING: the overhead of POSIX ucontext is very high, + * assembly versions of libco or libco_sjlj should be much faster + * + * This library only exists for two reasons: + * 1 - as an initial test for the viability of a ucontext implementation + * 2 - to demonstrate the power and speed of libco over existing implementations, + * such as pth (which defaults to wrapping ucontext on unix targets) + * + * Use this library only as a *last resort* + */ + +#define LIBCO_C +#include <libco.h> +#include <stdlib.h> +#include <ucontext.h> + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local ucontext_t co_primary; +static thread_local ucontext_t *co_running = 0; + +cothread_t co_active(void) +{ + if (!co_running) + co_running = &co_primary; + return (cothread_t)co_running; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) +{ + if (!co_running) + co_running = &co_primary; + ucontext_t *thread = (ucontext_t*)malloc(sizeof(ucontext_t)); + + if(thread) + { + if((!getcontext(thread) && !(thread->uc_stack.ss_sp = 0)) && (thread->uc_stack.ss_sp = malloc(heapsize))) + { + thread->uc_link = co_running; + thread->uc_stack.ss_size = heapsize; + makecontext(thread, coentry, 0); + } + else + { + co_delete((cothread_t)thread); + thread = 0; + } + } + return (cothread_t)thread; +} + +void co_delete(cothread_t cothread) +{ + if (!cothread) + return; + + if(((ucontext_t*)cothread)->uc_stack.ss_sp) + free(((ucontext_t*)cothread)->uc_stack.ss_sp); + free(cothread); +} + +void co_switch(cothread_t cothread) +{ + ucontext_t *old_thread = co_running; + + co_running = (ucontext_t*)cothread; + swapcontext(old_thread, co_running); +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/libco/x86.c
Added
@@ -0,0 +1,117 @@ +/* + libco.x86 (2009-10-12) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include <libco.h> +#include <assert.h> +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) + #define fastcall __fastcall +#elif defined(__GNUC__) + #define fastcall __attribute__((fastcall)) +#else + #error "libco: please define fastcall macro" +#endif + +static thread_local long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +static void (fastcall *co_swap)(cothread_t, cothread_t) = 0; + +//ABI: fastcall +static unsigned char co_swap_function[] = { + 0x89, 0x22, /* mov [edx],esp */ + 0x8b, 0x21, /* mov esp,[ecx] */ + 0x58, /* pop eax */ + 0x89, 0x6a, 0x04, /* mov [edx+0x04],ebp */ + 0x89, 0x72, 0x08, /* mov [edx+0x08],esi */ + 0x89, 0x7a, 0x0c, /* mov [edx+0x0c],edi */ + 0x89, 0x5a, 0x10, /* mov [edx+0x10],ebx */ + 0x8b, 0x69, 0x04, /* mov ebp,[ecx+0x04] */ + 0x8b, 0x71, 0x08, /* mov esi,[ecx+0x08] */ + 0x8b, 0x79, 0x0c, /* mov edi,[ecx+0x0c] */ + 0x8b, 0x59, 0x10, /* mov ebx,[ecx+0x10] */ + 0xff, 0xe0, /* jmp eax */ +}; + +#ifdef _WIN32 +#include <windows.h> + +static void co_init(void) +{ + DWORD old_privileges; + VirtualProtect(co_swap_function, + sizeof co_swap_function, PAGE_EXECUTE_READWRITE, &old_privileges); +} +#else +#include <unistd.h> +#include <sys/mman.h> + +static void co_init(void) +{ + unsigned long addr = (unsigned long)co_swap_function; + unsigned long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long size = (addr - base) + sizeof co_swap_function; + mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC); +} +#endif + +static void crash(void) +{ + assert(0); /* called only if cothread_t entrypoint returns */ +} + +cothread_t co_active(void) +{ + if(!co_active_handle) + co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) +{ + cothread_t handle; + if(!co_swap) + { + co_init(); + co_swap = (void (fastcall*)(cothread_t, cothread_t))co_swap_function; + } + + if(!co_active_handle) + co_active_handle = &co_active_buffer; + + size += 256; /* allocate additional space for storage */ + size &= ~15; /* align stack to 16-byte boundary */ + + if((handle = (cothread_t)malloc(size))) + { + long *p = (long*)((char*)handle + size); /* seek to top of stack */ + *--p = (long)crash; /* crash if entrypoint returns */ + *--p = (long)entrypoint; /* start of function */ + *(long*)handle = (long)p; /* stack pointer */ + } + + return handle; +} + +void co_delete(cothread_t handle) +{ + free(handle); +} + +void co_switch(cothread_t handle) +{ + register cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/lists
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/lists/dir_list.c
Added
@@ -0,0 +1,280 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (dir_list.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> + +#if defined(_WIN32) && defined(_XBOX) +#include <xtl.h> +#elif defined(_WIN32) +#include <windows.h> +#endif + +#include <lists/dir_list.h> +#include <lists/string_list.h> +#include <file/file_path.h> + +#include <compat/strl.h> +#include <retro_dirent.h> + +#include <string/stdstring.h> +#include <retro_miscellaneous.h> + +static int qstrcmp_plain(const void *a_, const void *b_) +{ + const struct string_list_elem *a = (const struct string_list_elem*)a_; + const struct string_list_elem *b = (const struct string_list_elem*)b_; + + return strcasecmp(a->data, b->data); +} + +static int qstrcmp_dir(const void *a_, const void *b_) +{ + const struct string_list_elem *a = (const struct string_list_elem*)a_; + const struct string_list_elem *b = (const struct string_list_elem*)b_; + int a_type = a->attr.i; + int b_type = b->attr.i; + + /* Sort directories before files. */ + if (a_type != b_type) + return b_type - a_type; + return strcasecmp(a->data, b->data); +} + +/** + * dir_list_sort: + * @list : pointer to the directory listing. + * @dir_first : move the directories in the listing to the top? + * + * Sorts a directory listing. + * + **/ +void dir_list_sort(struct string_list *list, bool dir_first) +{ + if (list) + qsort(list->elems, list->size, sizeof(struct string_list_elem), + dir_first ? qstrcmp_dir : qstrcmp_plain); +} + +/** + * dir_list_free: + * @list : pointer to the directory listing + * + * Frees a directory listing. + * + **/ +void dir_list_free(struct string_list *list) +{ + string_list_free(list); +} + +bool dir_list_deinitialize(struct string_list *list) +{ + if (!list) + return false; + return string_list_deinitialize(list); +} + +/** + * dir_list_read: + * @dir : directory path. + * @list : the string list to add files to + * @ext_list : the string list of extensions to include + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively + * + * Add files within a directory to an existing string list + * + * Returns: -1 on error, 0 on success. + **/ +static int dir_list_read(const char *dir, + struct string_list *list, struct string_list *ext_list, + bool include_dirs, bool include_hidden, + bool include_compressed, bool recursive) +{ + struct RDIR *entry = retro_opendir_include_hidden(dir, include_hidden); + + if (!entry || retro_dirent_error(entry)) + goto error; + + while (retro_readdir(entry)) + { + union string_list_elem_attr attr; + char file_path[PATH_MAX_LENGTH]; + const char *name = retro_dirent_get_name(entry); + + if (name[0] == '.') + { + /* Do not include hidden files and directories */ + if (!include_hidden) + continue; + + /* char-wise comparisons to avoid string comparison */ + + /* Do not include current dir */ + if (name[1] == '\0') + continue; + /* Do not include parent dir */ + if (name[1] == '.' && name[2] == '\0') + continue; + } + + file_path[0] = '\0'; + fill_pathname_join(file_path, dir, name, sizeof(file_path)); + + if (retro_dirent_is_dir(entry, NULL)) + { + if (recursive) + dir_list_read(file_path, list, ext_list, include_dirs, + include_hidden, include_compressed, recursive); + + if (!include_dirs) + continue; + attr.i = RARCH_DIRECTORY; + } + else + { + const char *file_ext = path_get_extension(name); + + attr.i = RARCH_FILETYPE_UNSET; + + /* + * If the file format is explicitly supported by the libretro-core, we + * need to immediately load it and not designate it as a compressed file. + * + * Example: .zip could be supported as a image by the core and as a + * compressed_file. In that case, we have to interpret it as a image. + * + * */ + if (string_list_find_elem_prefix(ext_list, ".", file_ext)) + attr.i = RARCH_PLAIN_FILE; + else + { + bool is_compressed_file; + if ((is_compressed_file = path_is_compressed_file(file_path))) + attr.i = RARCH_COMPRESSED_ARCHIVE; + + if (ext_list && + (!is_compressed_file || !include_compressed)) + continue; + } + } + + if (!string_list_append(list, file_path, attr)) + goto error; + } + + retro_closedir(entry); + + return 0; + +error: + if (entry) + retro_closedir(entry); + return -1; +} + +/** + * dir_list_append: + * @list : existing list to append to. + * @dir : directory path. + * @ext : allowed extensions of file directory entries to include. + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively + * + * Create a directory listing, appending to an existing list + * + * Returns: true success, false in case of error. + **/ +bool dir_list_append(struct string_list *list, + const char *dir, + const char *ext, bool include_dirs, + bool include_hidden, bool include_compressed, + bool recursive) +{ + bool ret = false; + struct string_list ext_list = {0}; + struct string_list *ext_list_ptr = NULL; + + if (ext) + { + string_list_initialize(&ext_list); + string_split_noalloc(&ext_list, ext, "|"); + ext_list_ptr = &ext_list; + } + ret = dir_list_read(dir, list, ext_list_ptr, + include_dirs, include_hidden, include_compressed, recursive) != -1; + string_list_deinitialize(&ext_list); + return ret; +} + +/** + * dir_list_new: + * @dir : directory path. + * @ext : allowed extensions of file directory entries to include. + * @include_dirs : include directories as part of the finished directory listing? + * @include_hidden : include hidden files and directories as part of the finished directory listing? + * @include_compressed : Only include files which match ext. Do not try to match compressed files, etc. + * @recursive : list directory contents recursively + * + * Create a directory listing. + * + * Returns: pointer to a directory listing of type 'struct string_list *' on success, + * NULL in case of error. Has to be freed manually. + **/ +struct string_list *dir_list_new(const char *dir, + const char *ext, bool include_dirs, + bool include_hidden, bool include_compressed, + bool recursive) +{ + struct string_list *list = string_list_new(); + + if (!list) + return NULL; + + if (!dir_list_append(list, dir, ext, include_dirs, + include_hidden, include_compressed, recursive)) + { + string_list_free(list); + return NULL; + } + + return list; +} + +/* Warning: 'list' must zero initialised before + * calling this function, otherwise memory leaks/ + * undefined behaviour will occur */ +bool dir_list_initialize(struct string_list *list, + const char *dir, + const char *ext, bool include_dirs, + bool include_hidden, bool include_compressed, + bool recursive) +{ + if (!list || !string_list_initialize(list)) + return false; + return dir_list_append(list, dir, ext, include_dirs, + include_hidden, include_compressed, recursive); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/lists/file_list.c
Added
@@ -0,0 +1,451 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (file_list.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_common.h> +#include <lists/file_list.h> +#include <string/stdstring.h> +#include <compat/strcasestr.h> + +static bool file_list_deinitialize_internal(file_list_t *list) +{ + size_t i; + for (i = 0; i < list->size; i++) + { + file_list_free_userdata(list, i); + file_list_free_actiondata(list, i); + + if (list->list[i].path) + free(list->list[i].path); + list->list[i].path = NULL; + + if (list->list[i].label) + free(list->list[i].label); + list->list[i].label = NULL; + + if (list->list[i].alt) + free(list->list[i].alt); + list->list[i].alt = NULL; + } + if (list->list) + free(list->list); + list->list = NULL; + return true; +} + +bool file_list_initialize(file_list_t *list) +{ + if (!list) + return false; + + list->list = NULL; + list->capacity = 0; + list->size = 0; + + return true; +} + +bool file_list_reserve(file_list_t *list, size_t nitems) +{ + const size_t item_size = sizeof(struct item_file); + struct item_file *new_data; + + if (nitems < list->capacity || nitems > (size_t)-1/item_size) + return false; + + new_data = (struct item_file*)realloc(list->list, nitems * item_size); + + if (!new_data) + return false; + + memset(&new_data[list->capacity], 0, item_size * (nitems - list->capacity)); + + list->list = new_data; + list->capacity = nitems; + + return true; +} + +bool file_list_prepend(file_list_t *list, + const char *path, const char *label, + unsigned type, size_t directory_ptr, + size_t entry_idx) +{ + return file_list_insert(list, path, + label, type, + directory_ptr, entry_idx, + 0 + ); +} + +bool file_list_insert(file_list_t *list, + const char *path, const char *label, + unsigned type, size_t directory_ptr, + size_t entry_idx, + size_t idx) +{ + int i; + + /* Expand file list if needed */ + if (list->size >= list->capacity) + if (!file_list_reserve(list, list->capacity * 2 + 1)) + return false; + + for (i = (unsigned)list->size; i > (int)idx; i--) + { + struct item_file *copy = (struct item_file*) + malloc(sizeof(struct item_file)); + + copy->path = NULL; + copy->label = NULL; + copy->alt = NULL; + copy->type = 0; + copy->directory_ptr = 0; + copy->entry_idx = 0; + copy->userdata = NULL; + copy->actiondata = NULL; + + memcpy(copy, &list->list[i-1], sizeof(struct item_file)); + + memcpy(&list->list[i-1], &list->list[i], sizeof(struct item_file)); + memcpy(&list->list[i], copy, sizeof(struct item_file)); + + free(copy); + } + + list->list[idx].path = NULL; + list->list[idx].label = NULL; + list->list[idx].alt = NULL; + list->list[idx].type = type; + list->list[idx].directory_ptr = directory_ptr; + list->list[idx].entry_idx = entry_idx; + list->list[idx].userdata = NULL; + list->list[idx].actiondata = NULL; + + if (label) + list->list[idx].label = strdup(label); + if (path) + list->list[idx].path = strdup(path); + + list->size++; + + return true; +} + +bool file_list_append(file_list_t *list, + const char *path, const char *label, + unsigned type, size_t directory_ptr, + size_t entry_idx) +{ + unsigned idx = (unsigned)list->size; + /* Expand file list if needed */ + if (idx >= list->capacity) + if (!file_list_reserve(list, list->capacity * 2 + 1)) + return false; + + list->list[idx].path = NULL; + list->list[idx].label = NULL; + list->list[idx].alt = NULL; + list->list[idx].type = type; + list->list[idx].directory_ptr = directory_ptr; + list->list[idx].entry_idx = entry_idx; + list->list[idx].userdata = NULL; + list->list[idx].actiondata = NULL; + + if (label) + list->list[idx].label = strdup(label); + if (path) + list->list[idx].path = strdup(path); + + list->size++; + + return true; +} + +size_t file_list_get_size(const file_list_t *list) +{ + if (!list) + return 0; + return list->size; +} + +size_t file_list_get_directory_ptr(const file_list_t *list) +{ + size_t size = list ? list->size : 0; + return list->list[size].directory_ptr; +} + +void file_list_pop(file_list_t *list, size_t *directory_ptr) +{ + if (!list) + return; + + if (list->size != 0) + { + --list->size; + if (list->list[list->size].path) + free(list->list[list->size].path); + list->list[list->size].path = NULL; + + if (list->list[list->size].label) + free(list->list[list->size].label); + list->list[list->size].label = NULL; + } + + if (directory_ptr) + *directory_ptr = list->list[list->size].directory_ptr; +} + +void file_list_free(file_list_t *list) +{ + if (!list) + return; + file_list_deinitialize_internal(list); + free(list); +} + +bool file_list_deinitialize(file_list_t *list) +{ + if (!list) + return false; + if (!file_list_deinitialize_internal(list)) + return false; + list->capacity = 0; + list->size = 0; + return true; +} + +void file_list_clear(file_list_t *list) +{ + size_t i; + + if (!list) + return; + + for (i = 0; i < list->size; i++) + { + if (list->list[i].path) + free(list->list[i].path); + list->list[i].path = NULL; + + if (list->list[i].label) + free(list->list[i].label); + list->list[i].label = NULL; + + if (list->list[i].alt) + free(list->list[i].alt); + list->list[i].alt = NULL; + } + + list->size = 0; +} + +void file_list_set_label_at_offset(file_list_t *list, size_t idx, + const char *label) +{ + if (!list) + return; + + if (list->list[idx].label) + free(list->list[idx].label); + list->list[idx].alt = NULL; + + if (label) + list->list[idx].label = strdup(label); +} + +void file_list_get_label_at_offset(const file_list_t *list, size_t idx, + const char **label) +{ + if (!label || !list) + return; + + *label = list->list[idx].path; + if (list->list[idx].label) + *label = list->list[idx].label; +} + +void file_list_set_alt_at_offset(file_list_t *list, size_t idx, + const char *alt) +{ + if (!list || !alt) + return; + + if (list->list[idx].alt) + free(list->list[idx].alt); + list->list[idx].alt = NULL; + + if (alt) + list->list[idx].alt = strdup(alt); +} + +static int file_list_alt_cmp(const void *a_, const void *b_) +{ + const struct item_file *a = (const struct item_file*)a_; + const struct item_file *b = (const struct item_file*)b_; + const char *cmp_a = a->alt ? a->alt : a->path; + const char *cmp_b = b->alt ? b->alt : b->path; + return strcasecmp(cmp_a, cmp_b); +} + +static int file_list_type_cmp(const void *a_, const void *b_) +{ + const struct item_file *a = (const struct item_file*)a_; + const struct item_file *b = (const struct item_file*)b_; + if (a->type < b->type) + return -1; + if (a->type == b->type) + return 0; + + return 1; +} + +void file_list_sort_on_alt(file_list_t *list) +{ + qsort(list->list, list->size, sizeof(list->list[0]), file_list_alt_cmp); +} + +void file_list_sort_on_type(file_list_t *list) +{ + qsort(list->list, list->size, sizeof(list->list[0]), file_list_type_cmp); +} + +void *file_list_get_userdata_at_offset(const file_list_t *list, size_t idx) +{ + if (!list) + return NULL; + return list->list[idx].userdata; +} + +void file_list_set_userdata(const file_list_t *list, size_t idx, void *ptr) +{ + if (list && ptr) + list->list[idx].userdata = ptr; +} + +void file_list_set_actiondata(const file_list_t *list, size_t idx, void *ptr) +{ + if (list && ptr) + list->list[idx].actiondata = ptr; +} + +void *file_list_get_actiondata_at_offset(const file_list_t *list, size_t idx) +{ + if (!list) + return NULL; + return list->list[idx].actiondata; +} + +void file_list_free_actiondata(const file_list_t *list, size_t idx) +{ + if (!list) + return; + if (list->list[idx].actiondata) + free(list->list[idx].actiondata); + list->list[idx].actiondata = NULL; +} + +void file_list_free_userdata(const file_list_t *list, size_t idx) +{ + if (!list) + return; + if (list->list[idx].userdata) + free(list->list[idx].userdata); + list->list[idx].userdata = NULL; +} + +void *file_list_get_last_actiondata(const file_list_t *list) +{ + if (!list) + return NULL; + return list->list[list->size - 1].actiondata; +} + +void file_list_get_at_offset(const file_list_t *list, size_t idx, + const char **path, const char **label, unsigned *file_type, + size_t *entry_idx) +{ + if (!list) + return; + + if (path) + *path = list->list[idx].path; + if (label) + *label = list->list[idx].label; + if (file_type) + *file_type = list->list[idx].type; + if (entry_idx) + *entry_idx = list->list[idx].entry_idx; +} + +void file_list_get_last(const file_list_t *list, + const char **path, const char **label, + unsigned *file_type, size_t *entry_idx) +{ + if (list && list->size) + file_list_get_at_offset(list, list->size - 1, path, label, file_type, entry_idx); +} + +bool file_list_search(const file_list_t *list, const char *needle, size_t *idx) +{ + size_t i; + bool ret = false; + + if (!list) + return false; + + for (i = 0; i < list->size; i++) + { + const char *str = NULL; + const char *alt = list->list[i].alt + ? list->list[i].alt + : list->list[i].path; + + if (!alt) + { + file_list_get_label_at_offset(list, i, &alt); + if (!alt) + continue; + } + + str = (const char *)strcasestr(alt, needle); + if (str == alt) + { + /* Found match with first chars, best possible match. */ + *idx = i; + ret = true; + break; + } + else if (str && !ret) + { + /* Found mid-string match, but try to find a match with + * first characters before we settle. */ + *idx = i; + ret = true; + } + } + + return ret; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/lists/linked_list.c
Added
@@ -0,0 +1,479 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (linked_list.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <boolean.h> +#include <stddef.h> +#include <stdlib.h> + +#include <lists/linked_list.h> + +struct linked_list_item_t +{ + void *value; + struct linked_list_item_t *previous; + struct linked_list_item_t *next; +}; + +struct linked_list +{ + struct linked_list_item_t *first_item; + struct linked_list_item_t *last_item; + size_t length; +}; + +struct linked_list_iterator +{ + linked_list_t *list; + struct linked_list_item_t *item; + bool forward; +}; + +linked_list_t *linked_list_new(void) +{ + linked_list_t *list; + + list = (linked_list_t *)calloc(sizeof(linked_list_t), 1); + return list; +} + +void linked_list_free(linked_list_t *list, void (*free_value)(void *value)) +{ + if (!list) + { + return; + } + + while (list->first_item) + { + struct linked_list_item_t *next; + + next = list->first_item->next; + if (free_value) + free_value(list->first_item->value); + free(list->first_item); + + list->first_item = next; + } + + free (list); +} + +void linked_list_add(linked_list_t *list, void *value) +{ + struct linked_list_item_t *new_item; + + if (!list) + return; + + new_item = (struct linked_list_item_t *)malloc(sizeof(struct linked_list_item_t)); + new_item->value = value; + new_item->previous = list->last_item; + new_item->next = NULL; + + if (list->length == 0) + list->first_item = new_item; + else + list->last_item->next = new_item; + + list->last_item = new_item; + list->length++; +} + +void linked_list_insert(linked_list_t *list, size_t index, void *value) +{ + size_t i; + struct linked_list_item_t *previous_item; + struct linked_list_item_t *next_item; + struct linked_list_item_t *new_item; + + if (!list || index > list->length) + return; + + previous_item = NULL; + next_item = list->first_item; + for (i = 1; i <= index; i++) + { + previous_item = next_item; + next_item = next_item->next; + } + + new_item = (struct linked_list_item_t *)malloc(sizeof(struct linked_list_item_t)); + new_item->value = value; + + if (previous_item) + previous_item->next = new_item; + else + list->first_item = new_item; + new_item->previous = previous_item; + + if (next_item) + next_item->previous = new_item; + else + list->last_item = new_item; + new_item->next = next_item; + + list->length++; +} + +void *linked_list_get(linked_list_t *list, size_t index) +{ + size_t i; + struct linked_list_item_t *item; + + if (!list) + return NULL; + + if (index >= list->length) + return NULL; + + item = list->first_item; + for (i = 1; i <= index; i++) + item = item->next; + + return item->value; +} + +void *linked_list_get_first_matching(linked_list_t *list, bool (*matches)(void *item, void *usrptr), void *usrptr) +{ + struct linked_list_item_t *item; + + if (!list || !matches) + return NULL; + + for (item = list->first_item; item; item = item->next) + { + if (matches(item->value, usrptr)) + return item->value; + } + + return NULL; +} + +void *linked_list_get_last_matching(linked_list_t *list, bool (*matches)(void *item, void *usrptr), void *usrptr) +{ + struct linked_list_item_t *item; + + if (!list || !matches) + return NULL; + + for (item = list->last_item; item; item = item->previous) + { + if (matches(item->value, usrptr)) + return item->value; + } + + return NULL; +} + +static void _linked_list_remove_item(linked_list_t *list, struct linked_list_item_t *item) +{ + struct linked_list_item_t *previous_item; + struct linked_list_item_t *next_item; + + previous_item = item->previous; + next_item = item->next; + free(item); + list->length--; + + if (previous_item) + previous_item->next = next_item; + else + list->first_item = next_item; + + if (next_item) + next_item->previous = previous_item; + else + list->last_item = previous_item; +} + +void *linked_list_remove_at(linked_list_t *list, size_t index) +{ + size_t i = 0; + struct linked_list_item_t *item; + void *value; + + if (!list || list->length == 0 || index >= list->length) + return NULL; + + item = list->first_item; + for (i = 1; i <= index; i++) + item = item->next; + + value = item->value; + _linked_list_remove_item(list, item); + return value; +} + +void *linked_list_remove_first(linked_list_t *list, void *value) +{ + struct linked_list_item_t *item; + + if (!list) + return NULL; + + for (item = list->first_item; item; item = item->next) + { + if (item->value == value) + break; + } + + if (item) + { + _linked_list_remove_item(list, item); + return value; + } + + return NULL; +} + +void *linked_list_remove_last(linked_list_t *list, void *value) +{ + struct linked_list_item_t *item; + + if (!list) + return NULL; + + for (item = list->last_item; item; item = item->previous) + { + if (item->value == value) + break; + } + + if (item) + { + _linked_list_remove_item(list, item); + return value; + } + + return NULL; +} + +void *linked_list_remove_all(linked_list_t *list, void *value) +{ + struct linked_list_item_t *item; + bool found = false; + + if (!list) + return NULL; + + for (item = list->first_item; item;) + { + if (item->value == value) + { + struct linked_list_item_t *next_item; + + next_item = item->next; + _linked_list_remove_item(list, item); + found = true; + item = next_item; + } else + { + item = item->next; + } + } + + return found ? value : NULL; +} + +void *linked_list_remove_first_matching(linked_list_t *list, bool (*matches)(void *value)) +{ + struct linked_list_item_t *item; + + if (!list) + return NULL; + + for (item = list->first_item; item; item = item->next) + { + if (matches(item->value)) + break; + } + + if (item) + { + void *value; + + value = item->value; + _linked_list_remove_item(list, item); + return value; + } + + return NULL; +} + +void *linked_list_remove_last_matching(linked_list_t *list, bool (*matches)(void *value)) +{ + struct linked_list_item_t *item; + + if (!list) + return NULL; + + for (item = list->last_item; item; item = item->previous) + { + if (matches(item->value)) + break; + } + + if (item) + { + void *value; + + value = item->value; + _linked_list_remove_item(list, item); + return value; + } + + return NULL; +} + +void linked_list_remove_all_matching(linked_list_t *list, bool (*matches)(void *value)) +{ + struct linked_list_item_t *item; + + if (!list) + return; + + for (item = list->first_item; item;) + { + if (matches(item->value)) + { + struct linked_list_item_t *next_item; + + next_item = item->next; + _linked_list_remove_item(list, item); + item = next_item; + } else + { + item = item->next; + } + } +} + +bool linked_list_set_at(linked_list_t *list, size_t index, void *value) +{ + struct linked_list_item_t *item; + size_t i; + + if (!list || list->length == 0 || index >= list->length) + return false; + + item = list->first_item; + for (i = 1; i <= index; i++) + item = item->next; + + if (item) + { + item->value = value; + return true; + } + + return false; +} + +size_t linked_list_size(linked_list_t *list) +{ + if (list) + return list->length; + + return 0; +} + +linked_list_iterator_t *linked_list_iterator(linked_list_t *list, bool forward) +{ + linked_list_iterator_t *iterator; + + if (!list || !list->first_item) + return NULL; + + iterator = (linked_list_iterator_t *)malloc(sizeof(linked_list_iterator_t)); + iterator->list = list; + iterator->item = forward ? list->first_item : list->last_item; + iterator->forward = forward; + + return iterator; +} + +linked_list_iterator_t *linked_list_iterator_next(linked_list_iterator_t *iterator) +{ + struct linked_list_item_t *item; + + if (!iterator) + return NULL; + + item = iterator->forward ? iterator->item->next : iterator->item->previous; + if (item) + { + iterator->item = item; + return iterator; + } else + { + free(iterator); + return NULL; + } +} + +void *linked_list_iterator_value(linked_list_iterator_t *iterator) +{ + if (iterator) + return iterator->item->value; + + return NULL; +} + +linked_list_iterator_t *linked_list_iterator_remove(linked_list_iterator_t *iterator) +{ + struct linked_list_item_t *next_item; + + if (!iterator) + return NULL; + + next_item = iterator->forward ? iterator->item->next : iterator->item->previous; + _linked_list_remove_item(iterator->list, iterator->item); + + if (next_item) + { + iterator->item = next_item; + return iterator; + } else + { + free(iterator); + return NULL; + } +} + +void linked_list_iterator_free(linked_list_iterator_t *iterator) +{ + if (iterator) + free(iterator); +} + +void linked_list_foreach(linked_list_t *list, void (*fn)(size_t index, void *value)) +{ + size_t i; + struct linked_list_item_t *item; + + if (!list || !fn) + return; + + i = 0; + for (item = list->first_item; item; item = item->next) + fn(i++, item->value); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/lists/string_list.c
Added
@@ -0,0 +1,554 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (string_list.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdint.h> +#include <string.h> + +#include <lists/string_list.h> +#include <compat/strl.h> +#include <compat/posix_string.h> +#include <string/stdstring.h> + +static bool string_list_deinitialize_internal(struct string_list *list) +{ + if (!list) + return false; + + if (list->elems) + { + unsigned i; + for (i = 0; i < list->size; i++) + { + if (list->elems[i].data) + free(list->elems[i].data); + if (list->elems[i].userdata) + free(list->elems[i].userdata); + list->elems[i].data = NULL; + list->elems[i].userdata = NULL; + } + + free(list->elems); + } + + list->elems = NULL; + + return true; +} + +/** + * string_list_capacity: + * @list : pointer to string list + * @cap : new capacity for string list. + * + * Change maximum capacity of string list's size. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +static bool string_list_capacity(struct string_list *list, size_t cap) +{ + struct string_list_elem *new_data = (struct string_list_elem*) + realloc(list->elems, cap * sizeof(*new_data)); + + if (!new_data) + return false; + + if (cap > list->cap) + memset(&new_data[list->cap], 0, sizeof(*new_data) * (cap - list->cap)); + + list->elems = new_data; + list->cap = cap; + return true; +} + +/** + * string_list_free + * @list : pointer to string list object + * + * Frees a string list. + */ +void string_list_free(struct string_list *list) +{ + if (!list) + return; + + string_list_deinitialize_internal(list); + + free(list); +} + +bool string_list_deinitialize(struct string_list *list) +{ + if (!list) + return false; + if (!string_list_deinitialize_internal(list)) + return false; + list->elems = NULL; + list->size = 0; + list->cap = 0; + return true; +} + +/** + * string_list_new: + * + * Creates a new string list. Has to be freed manually. + * + * Returns: new string list if successful, otherwise NULL. + */ +struct string_list *string_list_new(void) +{ + struct string_list_elem * + elems = NULL; + struct string_list *list = (struct string_list*) + malloc(sizeof(*list)); + if (!list) + return NULL; + + if (!(elems = (struct string_list_elem*) + calloc(32, sizeof(*elems)))) + { + string_list_free(list); + return NULL; + } + + list->elems = elems; + list->size = 0; + list->cap = 32; + + return list; +} + +bool string_list_initialize(struct string_list *list) +{ + struct string_list_elem * + elems = NULL; + if (!list) + return false; + if (!(elems = (struct string_list_elem*) + calloc(32, sizeof(*elems)))) + { + string_list_deinitialize(list); + return false; + } + list->elems = elems; + list->size = 0; + list->cap = 32; + return true; +} + +/** + * string_list_append: + * @list : pointer to string list + * @elem : element to add to the string list + * @attr : attributes of new element. + * + * Appends a new element to the string list. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool string_list_append(struct string_list *list, const char *elem, + union string_list_elem_attr attr) +{ + char *data_dup = NULL; + + /* Note: If 'list' is incorrectly initialised + * (i.e. if struct is zero initialised and + * string_list_initialize() is not called on + * it) capacity will be zero. This will cause + * a segfault. Handle this case by forcing the new + * capacity to a fixed size of 32 */ + if (list->size >= list->cap && + !string_list_capacity(list, + (list->cap > 0) ? (list->cap * 2) : 32)) + return false; + + data_dup = strdup(elem); + if (!data_dup) + return false; + + list->elems[list->size].data = data_dup; + list->elems[list->size].attr = attr; + + list->size++; + return true; +} + +/** + * string_list_append_n: + * @list : pointer to string list + * @elem : element to add to the string list + * @length : read at most this many bytes from elem + * @attr : attributes of new element. + * + * Appends a new element to the string list. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool string_list_append_n(struct string_list *list, const char *elem, + unsigned length, union string_list_elem_attr attr) +{ + char *data_dup = NULL; + + if (list->size >= list->cap && + !string_list_capacity(list, list->cap * 2)) + return false; + + data_dup = (char*)malloc(length + 1); + + if (!data_dup) + return false; + + strlcpy(data_dup, elem, length + 1); + + list->elems[list->size].data = data_dup; + list->elems[list->size].attr = attr; + + list->size++; + return true; +} + +/** + * string_list_set: + * @list : pointer to string list + * @idx : index of element in string list + * @str : value for the element. + * + * Set value of element inside string list. + **/ +void string_list_set(struct string_list *list, + unsigned idx, const char *str) +{ + free(list->elems[idx].data); + list->elems[idx].data = strdup(str); +} + +/** + * string_list_join_concat: + * @buffer : buffer that @list will be joined to. + * @size : length of @buffer. + * @list : pointer to string list. + * @delim : delimiter character for @list. + * + * A string list will be joined/concatenated as a + * string to @buffer, delimited by @delim. + */ +void string_list_join_concat(char *buffer, size_t size, + const struct string_list *list, const char *delim) +{ + size_t i; + size_t len = strlen_size(buffer, size); + + /* If buffer is already 'full', nothing + * further can be added + * > This condition will also be triggered + * if buffer is not NUL-terminated, + * in which case any attempt to increment + * buffer or decrement size would lead to + * undefined behaviour */ + if (len >= size) + return; + + buffer += len; + size -= len; + + for (i = 0; i < list->size; i++) + { + strlcat(buffer, list->elems[i].data, size); + if ((i + 1) < list->size) + strlcat(buffer, delim, size); + } +} + +/** + * string_split: + * @str : string to turn into a string list + * @delim : delimiter character to use for splitting the string. + * + * Creates a new string list based on string @str, delimited by @delim. + * + * Returns: new string list if successful, otherwise NULL. + */ +struct string_list *string_split(const char *str, const char *delim) +{ + char *save = NULL; + char *copy = NULL; + const char *tmp = NULL; + struct string_list *list = string_list_new(); + + if (!list) + return NULL; + + copy = strdup(str); + if (!copy) + goto error; + + tmp = strtok_r(copy, delim, &save); + while (tmp) + { + union string_list_elem_attr attr; + + attr.i = 0; + + if (!string_list_append(list, tmp, attr)) + goto error; + + tmp = strtok_r(NULL, delim, &save); + } + + free(copy); + return list; + +error: + string_list_free(list); + free(copy); + return NULL; +} + +bool string_split_noalloc(struct string_list *list, + const char *str, const char *delim) +{ + char *save = NULL; + char *copy = NULL; + const char *tmp = NULL; + + if (!list) + return false; + + copy = strdup(str); + if (!copy) + return false; + + tmp = strtok_r(copy, delim, &save); + while (tmp) + { + union string_list_elem_attr attr; + + attr.i = 0; + + if (!string_list_append(list, tmp, attr)) + { + free(copy); + return false; + } + + tmp = strtok_r(NULL, delim, &save); + } + + free(copy); + return true; +} + +/** + * string_separate: + * @str : string to turn into a string list + * @delim : delimiter character to use for separating the string. + * + * Creates a new string list based on string @str, delimited by @delim. + * Includes empty strings - i.e. two adjacent delimiters will resolve + * to a string list element of "". + * + * Returns: new string list if successful, otherwise NULL. + */ +struct string_list *string_separate(char *str, const char *delim) +{ + char *token = NULL; + char **str_ptr = NULL; + struct string_list *list = NULL; + + /* Sanity check */ + if (!str || string_is_empty(delim)) + goto error; + + str_ptr = &str; + list = string_list_new(); + + if (!list) + goto error; + + token = string_tokenize(str_ptr, delim); + while (token) + { + union string_list_elem_attr attr; + + attr.i = 0; + + if (!string_list_append(list, token, attr)) + goto error; + + free(token); + token = NULL; + + token = string_tokenize(str_ptr, delim); + } + + return list; + +error: + if (token) + free(token); + if (list) + string_list_free(list); + return NULL; +} + +bool string_separate_noalloc( + struct string_list *list, + char *str, const char *delim) +{ + char *token = NULL; + char **str_ptr = NULL; + + /* Sanity check */ + if (!str || string_is_empty(delim) || !list) + return false; + + str_ptr = &str; + token = string_tokenize(str_ptr, delim); + + while (token) + { + union string_list_elem_attr attr; + + attr.i = 0; + + if (!string_list_append(list, token, attr)) + { + free(token); + return false; + } + + free(token); + token = string_tokenize(str_ptr, delim); + } + + return true; +} + +/** + * string_list_find_elem: + * @list : pointer to string list + * @elem : element to find inside the string list. + * + * Searches for an element (@elem) inside the string list. + * + * Returns: true (1) if element could be found, otherwise false (0). + */ +int string_list_find_elem(const struct string_list *list, const char *elem) +{ + size_t i; + + if (!list) + return false; + + for (i = 0; i < list->size; i++) + { + if (string_is_equal_noncase(list->elems[i].data, elem)) + return (int)(i + 1); + } + + return false; +} + +/** + * string_list_find_elem_prefix: + * @list : pointer to string list + * @prefix : prefix to append to @elem + * @elem : element to find inside the string list. + * + * Searches for an element (@elem) inside the string list. Will + * also search for the same element prefixed by @prefix. + * + * Returns: true (1) if element could be found, otherwise false (0). + */ +bool string_list_find_elem_prefix(const struct string_list *list, + const char *prefix, const char *elem) +{ + size_t i; + char prefixed[255]; + + if (!list) + return false; + + prefixed[0] = '\0'; + + strlcpy(prefixed, prefix, sizeof(prefixed)); + strlcat(prefixed, elem, sizeof(prefixed)); + + for (i = 0; i < list->size; i++) + { + if (string_is_equal_noncase(list->elems[i].data, elem) || + string_is_equal_noncase(list->elems[i].data, prefixed)) + return true; + } + + return false; +} + +struct string_list *string_list_clone( + const struct string_list *src) +{ + unsigned i; + struct string_list_elem + *elems = NULL; + struct string_list + *dest = (struct string_list*) + malloc(sizeof(struct string_list)); + + if (!dest) + return NULL; + + dest->elems = NULL; + dest->size = src->size; + dest->cap = src->cap; + if (dest->cap < dest->size) + dest->cap = dest->size; + + elems = (struct string_list_elem*) + calloc(dest->cap, sizeof(struct string_list_elem)); + + if (!elems) + { + free(dest); + return NULL; + } + + dest->elems = elems; + + for (i = 0; i < src->size; i++) + { + const char *_src = src->elems[i].data; + size_t len = _src ? strlen(_src) : 0; + + dest->elems[i].data = NULL; + dest->elems[i].attr = src->elems[i].attr; + + if (len != 0) + { + char *result = (char*)malloc(len + 1); + strcpy(result, _src); + dest->elems[i].data = result; + } + } + + return dest; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/lists/vector_list.c
Added
@@ -0,0 +1,95 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (vector_list.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <boolean.h> +#include <stdlib.h> +#include <stddef.h> + +/* default type is void*, override by defining VECTOR_LIST_TYPE before inclusion */ +#ifndef VECTOR_LIST_TYPE +#define VECTOR_LIST_TYPE void* +#define VECTOR_LIST_TYPE_DEFINED +#endif + +/* default name is void, override by defining VECTOR_LIST_NAME before inclusion */ +#ifndef VECTOR_LIST_NAME +#define VECTOR_LIST_NAME void +#define VECTOR_LIST_NAME_DEFINED +#endif + +#define CAT_I(a,b) a##b +#define CAT(a,b) CAT_I(a, b) +#define MAKE_TYPE_NAME() CAT(VECTOR_LIST_NAME, _vector_list) +#define TYPE_NAME() MAKE_TYPE_NAME() + +struct TYPE_NAME() +{ + /* VECTOR_LIST_TYPE for pointers will expand to a pointer-to-pointer */ + VECTOR_LIST_TYPE *data; + unsigned size; + unsigned count; +}; + +static struct TYPE_NAME()* CAT(TYPE_NAME(), _new(void)) +{ + struct TYPE_NAME() *list = (struct TYPE_NAME()*)calloc(1, sizeof(*list)); + + list->size = 8; + list->data = (VECTOR_LIST_TYPE*)calloc(list->size, sizeof(*list->data)); + + return list; +} + +static bool CAT(TYPE_NAME(), _append(struct TYPE_NAME() *list, VECTOR_LIST_TYPE elem)) +{ + if (list->size == list->count) + { + list->size *= 2; + list->data = (VECTOR_LIST_TYPE*)realloc(list->data, list->size * sizeof(*list->data)); + + if (!list->data) + return false; + } + + list->data[list->count] = elem; + list->count++; + + return true; +} + +static void CAT(TYPE_NAME(), _free(struct TYPE_NAME() *list)) +{ + if (list) + { + if (list->data) + free(list->data); + free(list); + } +} + +#ifdef VECTOR_LIST_TYPE_DEFINED +#undef VECTOR_LIST_TYPE +#endif + +#ifdef VECTOR_LIST_NAME_DEFINED +#undef VECTOR_LIST_NAME +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/media
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/media/media_detect_cd.c
Added
@@ -0,0 +1,527 @@ +/* Copyright (C) 2010-2020 The RetroArch team +* +* --------------------------------------------------------------------------------------- +* The following license statement only applies to this file (media_detect_cd.c). +* --------------------------------------------------------------------------------------- +* +* Permission is hereby granted, free of charge, +* to any person obtaining a copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation the rights to +* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include <media/media_detect_cd.h> +#include <streams/file_stream.h> +#include <string/stdstring.h> +#include <file/file_path.h> +#include <retro_miscellaneous.h> + +/*#define MEDIA_CUE_PARSE_DEBUG*/ + +static void media_zero_trailing_spaces(char *buf, size_t len) +{ + int i; + + for (i = len - 1; i >= 0; i--) + { + if (buf[i] == ' ') + buf[i] = '\0'; + else if (buf[i] != '\0') + break; + } +} + +static bool media_skip_spaces(const char **buf, size_t len) +{ + bool found = false; + unsigned i; + + if (!buf || !*buf || !**buf) + return false; + + for (i = 0; i < len; i++) + { + if ((*buf)[i] == ' ' || (*buf)[i] == '\t') + continue; + + *buf += i; + found = true; + break; + } + + if (found) + return true; + + return false; +} + +/* Fill in "info" with detected CD info. Use this when you have a cue file and want it parsed to find the first data track and any pregap info. */ +bool media_detect_cd_info_cue(const char *path, media_detect_cd_info_t *info) +{ + RFILE *file = NULL; + char *line = NULL; + char track_path[PATH_MAX_LENGTH] = {0}; + char track_abs_path[PATH_MAX_LENGTH] = {0}; + char track_mode[11] = {0}; + bool found_file = false; + bool found_track = false; + unsigned first_data_track = 0; + uint64_t data_track_pregap_bytes = 0; + + if (string_is_empty(path) || !info) + return false; + + file = filestream_open(path, RETRO_VFS_FILE_ACCESS_READ, 0); + + if (!file) + { +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("[MEDIA] Could not open cue path for reading: %s\n", path); + fflush(stdout); +#endif + return false; + } + + while (!filestream_eof(file) && (line = filestream_getline(file))) + { + size_t len = 0; + const char *command = NULL; + + if (string_is_empty(line)) + { + free(line); + continue; + } + + len = strlen(line); + command = line; + + media_skip_spaces(&command, len); + + if (!found_file && !strncasecmp(command, "FILE", 4)) + { + const char *file = command + 4; + media_skip_spaces(&file, len - 4); + + if (!string_is_empty(file)) + { + const char *file_end = NULL; + size_t file_len = 0; + bool quoted = false; + + if (file[0] == '"') + { + quoted = true; + file++; + } + + if (quoted) + file_end = strchr(file, '\"'); + else + file_end = strchr(file, ' '); + + if (file_end) + { + file_len = file_end - file; + memcpy(track_path, file, file_len); + found_file = true; +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("Found file: %s\n", track_path); + fflush(stdout); +#endif + } + } + } + else if (found_file && !found_track && !strncasecmp(command, "TRACK", 5)) + { + const char *track = command + 5; + media_skip_spaces(&track, len - 5); + + if (!string_is_empty(track)) + { + unsigned track_number = 0; + sscanf(track, "%d", (int*)&track_number); +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("Found track: %d\n", track_number); + fflush(stdout); +#endif + track++; + + if (track[0] && track[0] != ' ' && track[0] != '\t') + track++; + + if (!string_is_empty(track)) + { + media_skip_spaces(&track, strlen(track)); +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("Found track type: %s\n", track); + fflush(stdout); +#endif + if (!strncasecmp(track, "MODE", 4)) + { + first_data_track = track_number; + found_track = true; + strlcpy(track_mode, track, sizeof(track_mode)); + } + else + found_file = false; + } + } + } + else if (found_file && found_track && first_data_track && !strncasecmp(command, "INDEX", 5)) + { + const char *index = command + 5; + media_skip_spaces(&index, len - 5); + + if (!string_is_empty(index)) + { + unsigned index_number = 0; + sscanf(index, "%d", (int*)&index_number); + + if (index_number == 1) + { + const char *pregap = index + 1; + + if (pregap[0] && pregap[0] != ' ' && pregap[0] != '\t') + pregap++; + + if (!string_is_empty(pregap)) + { + media_skip_spaces(&pregap, strlen(pregap)); + found_file = false; + found_track = false; + + if (first_data_track && !string_is_empty(track_mode)) + { + unsigned track_sector_size = 0; + unsigned track_mode_number = 0; + + if (strlen(track_mode) == 10) + { + sscanf(track_mode, "MODE%d/%d", (int*)&track_mode_number, (int*)&track_sector_size); +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("Found track mode %d with sector size %d\n", track_mode_number, track_sector_size); + fflush(stdout); +#endif + if ((track_mode_number == 1 || track_mode_number == 2) && track_sector_size) + { + unsigned min = 0; + unsigned sec = 0; + unsigned frame = 0; + sscanf(pregap, "%02d:%02d:%02d", (int*)&min, (int*)&sec, (int*)&frame); + + if (min || sec || frame || strstr(pregap, "00:00:00")) + { + data_track_pregap_bytes = ((min * 60 + sec) * 75 + frame) * track_sector_size; +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("Found pregap of %02d:%02d:%02d (bytes: %" PRIu64 ")\n", min, sec, frame, data_track_pregap_bytes); + fflush(stdout); +#endif + break; + } + } + } + } + } + } + } + } + + free(line); + } + + filestream_close(file); + + if (!string_is_empty(track_path)) + { + if (strstr(track_path, "/") || strstr(track_path, "\\")) + { +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("using path %s\n", track_path); + fflush(stdout); +#endif + return media_detect_cd_info(track_path, data_track_pregap_bytes, info); + } + + fill_pathname_basedir(track_abs_path, path, sizeof(track_abs_path)); + strlcat(track_abs_path, track_path, sizeof(track_abs_path)); +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("using abs path %s\n", track_abs_path); + fflush(stdout); +#endif + return media_detect_cd_info(track_abs_path, data_track_pregap_bytes, info); + } + + return true; +} + +/* Fill in "info" with detected CD info. Use this when you want to open a specific track file directly, and the pregap is known. */ +bool media_detect_cd_info(const char *path, uint64_t pregap_bytes, media_detect_cd_info_t *info) +{ + RFILE *file; + + if (string_is_empty(path) || !info) + return false; + + file = filestream_open(path, RETRO_VFS_FILE_ACCESS_READ, 0); + + if (!file) + { +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("[MEDIA] Could not open path for reading: %s\n", path); + fflush(stdout); +#endif + return false; + } + + { + unsigned offset = 0; + unsigned sector_size = 0; + unsigned buf_size = 17 * 2352; + char *buf = (char*)calloc(1, buf_size); + int64_t read_bytes = 0; + + if (!buf) + return false; + + if (pregap_bytes) + filestream_seek(file, pregap_bytes, RETRO_VFS_SEEK_POSITION_START); + + read_bytes = filestream_read(file, buf, buf_size); + + if (read_bytes != buf_size) + { +#ifdef MEDIA_CUE_PARSE_DEBUG + printf("[MEDIA] Could not read from media: got %" PRId64 " bytes instead of %d.\n", read_bytes, buf_size); + fflush(stdout); +#endif + filestream_close(file); + free(buf); + return false; + } + + /* 12-byte sync field at the start of every sector, common to both mode1 and mode2 data tracks + * (when at least sync data is requested). This is a CD-ROM standard feature and not specific to any game devices, + * and as such should not be part of any system-specific detection or "magic" bytes. + * Depending on what parts of a sector were requested from the disc, the user data might start at + * byte offset 0, 4, 8, 12, 16 or 24. Cue sheets only specify the total number of bytes requested from the sectors + * of a track (like 2048 or 2352) and it is then assumed based on the size/mode as to what fields are present. */ + if (!memcmp(buf, "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", 12)) + { + /* Assume track data contains all fields. */ + sector_size = 2352; + + if (buf[15] == 2) + { + /* assume Mode 2 formed (formless is rarely used) */ + offset = 24; + } + else + { + /* assume Mode 1 */ + offset = 16; + } + } + else + { + /* Assume sectors only contain user data instead. */ + offset = 0; + sector_size = 2048; + } + + if (!memcmp(buf + offset, "SEGADISCSYSTEM", + STRLEN_CONST("SEGADISCSYSTEM"))) + { + const char *title_pos = NULL; + const char *serial_pos = NULL; +#if 0 + bool title_found = false; +#endif + + /* All discs currently in Redump for MCD start with SEGADISCSYSTEM. There are other strings mentioned elsewhere online, + * but I have not seen any real examples of them. */ + info->system_id = MEDIA_CD_SYSTEM_MEGA_CD; + + strcpy_literal(info->system, "Sega CD / Mega CD"); + + title_pos = buf + offset + 0x150; + + if (media_skip_spaces(&title_pos, 48)) + { + memcpy(info->title, title_pos, 48 - (title_pos - (buf + offset + 0x150))); + media_zero_trailing_spaces(info->title, sizeof(info->title)); + } + else + strcpy_literal(info->title, "N/A"); + + serial_pos = buf + offset + 0x183; + + if (media_skip_spaces(&serial_pos, 8)) + { + memcpy(info->serial, serial_pos, 8 - (serial_pos - (buf + offset + 0x183))); + media_zero_trailing_spaces(info->serial, sizeof(info->serial)); + } + else + strcpy_literal(info->serial, "N/A"); + } + else if (!memcmp(buf + offset, "SEGA SEGASATURN", + STRLEN_CONST("SEGA SEGASATURN"))) + { + const char *title_pos = NULL; + const char *serial_pos = NULL; + const char *version_pos = NULL; + const char *release_date_pos = NULL; +#if 0 + bool title_found = false; +#endif + + info->system_id = MEDIA_CD_SYSTEM_SATURN; + + strcpy_literal(info->system, "Sega Saturn"); + + title_pos = buf + offset + 0x60; + + if (media_skip_spaces(&title_pos, 112)) + { + memcpy(info->title, title_pos, 112 - (title_pos - (buf + offset + 0x60))); + media_zero_trailing_spaces(info->title, sizeof(info->title)); + } + else + strcpy_literal(info->title, "N/A"); + + serial_pos = buf + offset + 0x20; + + if (media_skip_spaces(&serial_pos, 10)) + { + memcpy(info->serial, serial_pos, 10 - (serial_pos - (buf + offset + 0x20))); + media_zero_trailing_spaces(info->serial, sizeof(info->serial)); + } + else + strcpy_literal(info->serial, "N/A"); + + version_pos = buf + offset + 0x2a; + + if (media_skip_spaces(&version_pos, 6)) + { + memcpy(info->version, version_pos, 6 - (version_pos - (buf + offset + 0x2a))); + media_zero_trailing_spaces(info->version, sizeof(info->version)); + } + else + strcpy_literal(info->version, "N/A"); + + release_date_pos = buf + offset + 0x30; + + if (media_skip_spaces(&release_date_pos, 8)) + { + memcpy(info->release_date, release_date_pos, 8 - (release_date_pos - (buf + offset + 0x30))); + media_zero_trailing_spaces(info->release_date, sizeof(info->release_date)); + } + else + strcpy_literal(info->release_date, "N/A"); + } + else if (!memcmp(buf + offset, "SEGA SEGAKATANA", STRLEN_CONST("SEGA SEGAKATANA"))) + { + const char *title_pos = NULL; + const char *serial_pos = NULL; + const char *version_pos = NULL; + const char *release_date_pos = NULL; +#if 0 + bool title_found = false; +#endif + + info->system_id = MEDIA_CD_SYSTEM_DREAMCAST; + + strcpy_literal(info->system, "Sega Dreamcast"); + + title_pos = buf + offset + 0x80; + + if (media_skip_spaces(&title_pos, 96)) + { + memcpy(info->title, title_pos, 96 - (title_pos - (buf + offset + 0x80))); + media_zero_trailing_spaces(info->title, sizeof(info->title)); + } + else + strcpy_literal(info->title, "N/A"); + + serial_pos = buf + offset + 0x40; + + if (media_skip_spaces(&serial_pos, 10)) + { + memcpy(info->serial, serial_pos, 10 - (serial_pos - (buf + offset + 0x40))); + media_zero_trailing_spaces(info->serial, sizeof(info->serial)); + } + else + strcpy_literal(info->serial, "N/A"); + + version_pos = buf + offset + 0x4a; + + if (media_skip_spaces(&version_pos, 6)) + { + memcpy(info->version, version_pos, 6 - (version_pos - (buf + offset + 0x4a))); + media_zero_trailing_spaces(info->version, sizeof(info->version)); + } + else + strcpy_literal(info->version, "N/A"); + + release_date_pos = buf + offset + 0x50; + + if (media_skip_spaces(&release_date_pos, 8)) + { + memcpy(info->release_date, release_date_pos, 8 - (release_date_pos - (buf + offset + 0x50))); + media_zero_trailing_spaces(info->release_date, sizeof(info->release_date)); + } + else + strcpy_literal(info->release_date, "N/A"); + } + /* Primary Volume Descriptor fields of ISO9660 */ + else if (!memcmp(buf + offset + (16 * sector_size), "\1CD001\1\0PLAYSTATION", 19)) + { + const char *title_pos = NULL; +#if 0 + bool title_found = false; +#endif + + info->system_id = MEDIA_CD_SYSTEM_PSX; + + strcpy_literal(info->system, "Sony PlayStation"); + + title_pos = buf + offset + (16 * sector_size) + 40; + + if (media_skip_spaces(&title_pos, 32)) + { + memcpy(info->title, title_pos, 32 - (title_pos - (buf + offset + (16 * sector_size) + 40))); + media_zero_trailing_spaces(info->title, sizeof(info->title)); + } + else + strcpy_literal(info->title, "N/A"); + } + else if (!memcmp(buf + offset, "\x01\x5a\x5a\x5a\x5a\x5a\x01\x00\x00\x00\x00\x00", 12)) + { + info->system_id = MEDIA_CD_SYSTEM_3DO; + + strcpy_literal(info->system, "3DO"); + } + else if (!memcmp(buf + offset + 0x950, "PC Engine CD-ROM SYSTEM", 23)) + { + info->system_id = MEDIA_CD_SYSTEM_PC_ENGINE_CD; + + strcpy_literal(info->system, "TurboGrafx-CD / PC-Engine CD"); + } + + free(buf); + } + + filestream_close(file); + + return true; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/memmap
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/memmap/memalign.c
Added
@@ -0,0 +1,63 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (memalign.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <stdlib.h> + +#include <memalign.h> + +void *memalign_alloc(size_t boundary, size_t size) +{ + void **place = NULL; + uintptr_t addr = 0; + void *ptr = (void*)malloc(boundary + size + sizeof(uintptr_t)); + if (!ptr) + return NULL; + + addr = ((uintptr_t)ptr + sizeof(uintptr_t) + boundary) + & ~(boundary - 1); + place = (void**)addr; + place[-1] = ptr; + + return (void*)addr; +} + +void memalign_free(void *ptr) +{ + void **p = NULL; + if (!ptr) + return; + + p = (void**)ptr; + free(p[-1]); +} + +void *memalign_alloc_aligned(size_t size) +{ +#if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_M_X64) || defined(_WIN64) + return memalign_alloc(64, size); +#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(GEKKO) || defined(_M_IX86) + return memalign_alloc(32, size); +#else + return memalign_alloc(32, size); +#endif +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/memmap/memmap.c
Added
@@ -0,0 +1,163 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (memmap.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdint.h> +#include <memmap.h> + +#ifndef PROT_READ +#define PROT_READ 0x1 /* Page can be read */ +#endif + +#ifndef PROT_WRITE +#define PROT_WRITE 0x2 /* Page can be written. */ +#endif + +#ifndef PROT_READWRITE +#define PROT_READWRITE 0x3 /* Page can be written to and read from. */ +#endif + +#ifndef PROT_EXEC +#define PROT_EXEC 0x4 /* Page can be executed. */ +#endif + +#ifndef PROT_NONE +#define PROT_NONE 0x0 /* Page can not be accessed. */ +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif + +#ifdef _WIN32 +void* mmap(void *addr, size_t len, int prot, int flags, + int fildes, size_t offset) +{ + void *map = (void*)NULL; + HANDLE handle = INVALID_HANDLE_VALUE; + + switch (prot) + { + case PROT_READ: + default: + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes), 0, PAGE_READONLY, 0, + len, 0); + if (!handle) + break; + map = (void*)MapViewOfFile(handle, FILE_MAP_READ, 0, 0, len); + CloseHandle(handle); + break; + case PROT_WRITE: + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes),0,PAGE_READWRITE,0, + len, 0); + if (!handle) + break; + map = (void*)MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, len); + CloseHandle(handle); + break; + case PROT_READWRITE: + handle = CreateFileMapping((HANDLE) + _get_osfhandle(fildes),0,PAGE_READWRITE,0, + len, 0); + if (!handle) + break; + map = (void*)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, len); + CloseHandle(handle); + break; + } + + if (map == (void*)NULL) + return((void*)MAP_FAILED); + return((void*) ((int8_t*)map + offset)); +} + +int munmap(void *addr, size_t length) +{ + if (!UnmapViewOfFile(addr)) + return -1; + return 0; +} + +int mprotect(void *addr, size_t len, int prot) +{ + /* Incomplete, just assumes PAGE_EXECUTE_READWRITE right now + * instead of correctly handling prot */ + prot = 0; + if (prot & (PROT_READ | PROT_WRITE | PROT_EXEC)) + prot = PAGE_EXECUTE_READWRITE; + return VirtualProtect(addr, len, prot, 0); +} + +#elif !defined(HAVE_MMAN) +void* mmap(void *addr, size_t len, int prot, int flags, + int fildes, size_t offset) +{ + return malloc(len); +} + +int munmap(void *addr, size_t len) +{ + free(addr); + return 0; +} + +int mprotect(void *addr, size_t len, int prot) +{ + /* stub - not really needed at this point + * since this codepath has no dynarecs. */ + return 0; +} + +#endif + +#if defined(__MACH__) && defined(__arm__) +#include <libkern/OSCacheControl.h> +#endif + +int memsync(void *start, void *end) +{ + size_t len = (char*)end - (char*)start; +#if defined(__MACH__) && defined(__arm__) + sys_dcache_flush(start ,len); + sys_icache_invalidate(start, len); + return 0; +#elif defined(__arm__) && !defined(__QNX__) + (void)len; + __clear_cache(start, end); + return 0; +#elif defined(HAVE_MMAN) + return msync(start, len, MS_SYNC | MS_INVALIDATE +#ifdef __QNX__ + MS_CACHE_ONLY +#endif + ); +#else + (void)len; + return 0; +#endif +} + +int memprotect(void *addr, size_t len) +{ + return mprotect(addr, len, PROT_READ | PROT_WRITE | PROT_EXEC); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_compat.c
Added
@@ -0,0 +1,648 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_compat.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <sys/types.h> +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include <net/net_compat.h> +#include <net/net_socket.h> +#include <retro_timers.h> +#include <compat/strl.h> + +#if defined(_XBOX) +/* TODO - implement h_length and h_addrtype */ +struct hostent +{ + int h_addrtype; /* host address type */ + int h_length; /* length of addresses */ + char **h_addr_list; /* list of addresses */ +}; + +struct hostent *gethostbyname(const char *name) +{ + WSAEVENT event; + static struct hostent he; + static struct in_addr addr; + static char *addr_ptr = NULL; + XNDNS *dns = NULL; + + he.h_addr_list = &addr_ptr; + addr_ptr = (char*)&addr; + + if (!name) + return NULL; + + event = WSACreateEvent(); + XNetDnsLookup(name, event, &dns); + if (!dns) + goto error; + + WaitForSingleObject((HANDLE)event, INFINITE); + if (dns->iStatus) + goto error; + + memcpy(&addr, dns->aina, sizeof(addr)); + + WSACloseEvent(event); + XNetDnsRelease(dns); + + return &he; + +error: + if (event) + WSACloseEvent(event); + return NULL; +} +#elif defined(VITA) +static void *_net_compat_net_memory = NULL; +#define COMPAT_NET_INIT_SIZE 512*1024 +#define INET_ADDRSTRLEN sizeof(struct sockaddr_in) +#define MAX_NAME 512 + +typedef uint32_t in_addr_t; + +struct in_addr +{ + in_addr_t s_addr; +}; + +char *inet_ntoa(struct SceNetInAddr in) +{ + static char ip_addr[INET_ADDRSTRLEN + 1]; + + if (!inet_ntop_compat(AF_INET, &in, ip_addr, INET_ADDRSTRLEN)) + strlcpy(ip_addr, "Invalid", sizeof(ip_addr)); + + return ip_addr; +} + +struct SceNetInAddr inet_aton(const char *ip_addr) +{ + SceNetInAddr inaddr; + + inet_ptrton(AF_INET, ip_addr, &inaddr); + return inaddr; +} + +unsigned int inet_addr(const char *cp) +{ + return inet_aton(cp).s_addr; +} + +struct hostent *gethostbyname(const char *name) +{ + int err; + static struct hostent ent; + static char sname[MAX_NAME] = {0}; + static struct SceNetInAddr saddr = {0}; + static char *addrlist[2] = {(char *) &saddr, NULL }; + int rid = sceNetResolverCreate("resolver", NULL, 0); + + if(rid < 0) + return NULL; + + err = sceNetResolverStartNtoa(rid, name, &saddr, 0,0,0); + sceNetResolverDestroy(rid); + if(err < 0) + return NULL; + + addrlist[0] = inet_ntoa(saddr); + ent.h_name = sname; + ent.h_aliases = 0; + ent.h_addrtype = AF_INET; + ent.h_length = sizeof(struct in_addr); + ent.h_addr_list = addrlist; + ent.h_addr = addrlist[0]; + + return &ent; +} + +int retro_epoll_fd; +#elif defined(_3DS) +#include <malloc.h> +#include <3ds/types.h> +#include <3ds/services/soc.h> +#define SOC_ALIGN 0x1000 +#define SOC_BUFFERSIZE 0x100000 +static u32* _net_compat_net_memory; +#endif + +#if defined(_WIN32) +int inet_aton(const char *cp, struct in_addr *inp) +{ + uint32_t addr = 0; +#ifndef _XBOX + if (cp == 0 || inp == 0) + return -1; +#endif + + addr = inet_addr(cp); + if (addr == INADDR_NONE || addr == INADDR_ANY) + return -1; + + inp->s_addr = addr; + return 1; +} +#endif + +int getaddrinfo_retro(const char *node, const char *service, + struct addrinfo *hints, struct addrinfo **res) +{ + struct sockaddr_in *in_addr = NULL; + struct addrinfo *info = NULL; + + (void)in_addr; + (void)info; + + if (!hints->ai_family) + { +#if defined(_WIN32) || defined(HAVE_SOCKET_LEGACY) || defined(WIIU) + hints->ai_family = AF_INET; +#else + hints->ai_family = AF_UNSPEC; +#endif + } + +#if defined(WIIU) + if (!node) + { + /* Wii U's socket library chokes on NULL node */ + if (hints->ai_flags & AI_PASSIVE) + node = "0.0.0.0"; + else + node = "127.0.0.1"; + } +#endif + +#ifdef HAVE_SOCKET_LEGACY + info = (struct addrinfo*)calloc(1, sizeof(*info)); + if (!info) + goto error; + + info->ai_family = AF_INET; + info->ai_socktype = hints->ai_socktype; + in_addr = (struct sockaddr_in*) + calloc(1, sizeof(*in_addr)); + + if (!in_addr) + goto error; + + info->ai_addrlen = sizeof(*in_addr); + in_addr->sin_family = AF_INET; + in_addr->sin_port = inet_htons(strtoul(service, NULL, 0)); + + if (!node && (hints->ai_flags & AI_PASSIVE)) + in_addr->sin_addr.s_addr = INADDR_ANY; + else if (node && isdigit((unsigned char)*node)) + in_addr->sin_addr.s_addr = inet_addr(node); + else if (node && !isdigit((unsigned char)*node)) + { + struct hostent *host = (struct hostent*)gethostbyname(node); + + if (!host || !host->h_addr_list[0]) + goto error; + + in_addr->sin_family = host->h_addrtype; + +#if defined(AF_INET6) && !defined(__PS3__) || defined(VITA) + /* TODO/FIXME - In case we ever want to support IPv6 */ + in_addr->sin_addr.s_addr = inet_addr(host->h_addr_list[0]); +#else + memcpy(&in_addr->sin_addr, host->h_addr, host->h_length); +#endif + } + else + goto error; + + info->ai_addr = (struct sockaddr*)in_addr; + *res = info; + + return 0; + +error: + if (in_addr) + free(in_addr); + if (info) + free(info); + return -1; +#else + return getaddrinfo(node, service, hints, res); +#endif +} + +void freeaddrinfo_retro(struct addrinfo *res) +{ +#ifdef HAVE_SOCKET_LEGACY + free(res->ai_addr); + free(res); +#else + freeaddrinfo(res); +#endif +} + +/** + * network_init: + * + * Platform specific socket library initialization. + * + * Returns: true (1) if successful, otherwise false (0). + **/ +bool network_init(void) +{ +#ifdef _WIN32 + WSADATA wsaData; +#endif + static bool inited = false; + if (inited) + return true; + +#if defined(_WIN32) + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) + { + network_deinit(); + return false; + } +#elif defined(__PSL1GHT__) || defined(__PS3__) + int timeout_count = 10; + + sysModuleLoad(SYSMODULE_NET); + netInitialize(); + + if (netCtlInit() < 0) + return false; + + for (;;) + { + int state; + if (netCtlGetState(&state) < 0) + return false; + + if (state == NET_CTL_STATE_IPObtained) + break; + + retro_sleep(500); + timeout_count--; + if (timeout_count < 0) + return 0; + } +#elif defined(VITA) + SceNetInitParam initparam; + + if (sceNetShowNetstat() == SCE_NET_ERROR_ENOTINIT) + { + _net_compat_net_memory = malloc(COMPAT_NET_INIT_SIZE); + + initparam.memory = _net_compat_net_memory; + initparam.size = COMPAT_NET_INIT_SIZE; + initparam.flags = 0; + + sceNetInit(&initparam); + + sceNetCtlInit(); + } + + retro_epoll_fd = sceNetEpollCreate("epoll", 0); +#elif defined(GEKKO) + char t[16]; + if (if_config(t, NULL, NULL, TRUE, 10) < 0) + return false; +#elif defined(WIIU) + socket_lib_init(); +#elif defined(_3DS) + _net_compat_net_memory = (u32*)memalign(SOC_ALIGN, SOC_BUFFERSIZE); + if (!_net_compat_net_memory) + return false; + Result ret = socInit(_net_compat_net_memory, SOC_BUFFERSIZE);//WIFI init + if (ret != 0) + return false; +#else + signal(SIGPIPE, SIG_IGN); /* Do not like SIGPIPE killing our app. */ +#endif + + inited = true; + return true; +} + +/** + * network_deinit: + * + * Deinitialize platform specific socket libraries. + **/ +void network_deinit(void) +{ +#if defined(_WIN32) + WSACleanup(); +#elif defined(__PSL1GHT__) || defined(__PS3__) + netCtlTerm(); + netFinalizeNetwork(); + sysModuleUnload(SYSMODULE_NET); +#elif defined(VITA) + sceNetCtlTerm(); + sceNetTerm(); + + if (_net_compat_net_memory) + { + free(_net_compat_net_memory); + _net_compat_net_memory = NULL; + } +#elif defined(GEKKO) && !defined(HW_DOL) + net_deinit(); +#elif defined(_3DS) + socExit(); + + if(_net_compat_net_memory) + { + free(_net_compat_net_memory); + _net_compat_net_memory = NULL; + } +#endif +} + +uint16_t inet_htons(uint16_t hostshort) +{ +#if defined(VITA) || defined(__ORBIS__) + return sceNetHtons(hostshort); +#else + return htons(hostshort); +#endif +} + + +int inet_ptrton(int af, const char *src, void *dst) +{ +#if defined(VITA) || defined(__ORBIS__) + return sceNetInetPton(af, src, dst); +#elif defined(GEKKO) || defined(_WIN32) + /* TODO/FIXME - should use InetPton on Vista and later */ + return inet_aton(src, (struct in_addr*)dst); +#else + return inet_pton(af, src, dst); +#endif +} + +struct in_addr6_compat +{ + unsigned char ip_addr[16]; +}; + +#ifdef _XBOX + +#ifndef IM_IN6ADDRSZ +#define IM_IN6ADDRSZ 16 +#endif + +#ifndef IM_INT16SZ +#define IM_INT16SZ 2 +#endif + +#ifndef IM_INADDRSZ +#define IM_INADDRSZ 4 +#endif +/* Taken from https://github.com/skywind3000/easenet/blob/master/inetbase.c + */ + +/* convert presentation format to network format */ +static const char * +inet_ntop4x(const unsigned char *src, char *dst, size_t size) +{ + char tmp[64]; + size_t len = snprintf(tmp, + sizeof(tmp), + "%u.%u.%u.%u", src[0], src[1], src[2], src[3]); + + if (len >= size) + goto error; + + memcpy(dst, tmp, len + 1); + return dst; + +error: + errno = ENOSPC; + return NULL; +} + +/* convert presentation format to network format */ +static const char * +inet_ntop6x(const unsigned char *src, char *dst, size_t size) +{ + char tmp[64], *tp; + int i, inc; + struct { int base, len; } best, cur; + unsigned int words[IM_IN6ADDRSZ / IM_INT16SZ]; + + memset(words, '\0', sizeof(words)); + best.base = best.len = 0; + cur.base = cur.len = 0; + + for (i = 0; i < IM_IN6ADDRSZ; i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + + best.base = -1; + cur.base = -1; + + for (i = 0; i < (IM_IN6ADDRSZ / IM_INT16SZ); i++) + { + if (words[i] == 0) + { + if (cur.base == -1) + { + cur.base = i; + cur.len = 1; + } + else cur.len++; + } + else + { + if (cur.base != -1) + { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; + } + } + } + if (cur.base != -1) + { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + if (best.base != -1 && best.len < 2) + best.base = -1; + + tp = tmp; + for (i = 0; i < (IM_IN6ADDRSZ / IM_INT16SZ); i++) + { + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) + { + if (i == best.base) + *tp++ = ':'; + continue; + } + + if (i != 0) + *tp++ = ':'; + if (i == 6 && best.base == 0 && + (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) + { + if (!inet_ntop4x(src+12, tp, sizeof(tmp) - (tp - tmp))) + return NULL; + tp += strlen(tp); + break; + } + inc = sprintf(tp, "%x", words[i]); + tp += inc; + } + + if (best.base != -1 && (best.base + best.len) == + (IM_IN6ADDRSZ / IM_INT16SZ)) + *tp++ = ':'; + + *tp++ = '\0'; + + if ((size_t)(tp - tmp) > size) + goto error; + + memcpy(dst, tmp, tp - tmp); + return dst; + +error: + errno = ENOSPC; + return NULL; +} + +/* convert network format to presentation format */ +/* another inet_ntop, supports AF_INET/AF_INET6 */ +static const char *isockaddr_ntop(int af, + const void *src, char *dst, size_t size) +{ + switch (af) + { + case AF_INET: + return inet_ntop4x((const unsigned char*)src, dst, size); +#ifdef AF_INET6 + case AF_INET6: + return inet_ntop6x((const unsigned char*)src, dst, size); +#endif + default: + if (af == -6) + return inet_ntop6x((const unsigned char*)src, dst, size); + errno = EAFNOSUPPORT; + return NULL; + } +} +#endif + +const char *inet_ntop_compat(int af, const void *src, char *dst, socklen_t cnt) +{ +#if defined(VITA) || defined(__ORBIS__) + return sceNetInetNtop(af,src,dst,cnt); +#elif defined(WIIU) + return inet_ntop(af, src, dst, cnt); +#elif defined(_XBOX) + return isockaddr_ntop(af, src, dst, cnt); +#elif defined(_WIN32) + if (af == AF_INET) + { + struct sockaddr_in in; + memset(&in, 0, sizeof(in)); + in.sin_family = AF_INET; + memcpy(&in.sin_addr, src, sizeof(struct in_addr)); + getnameinfo((struct sockaddr *)&in, sizeof(struct + sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST); + return dst; + } +#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) + else if (af == AF_INET6) + { + struct sockaddr_in6 in; + memset(&in, 0, sizeof(in)); + in.sin6_family = AF_INET6; + memcpy(&in.sin6_addr, src, sizeof(struct in_addr6_compat)); + getnameinfo((struct sockaddr *)&in, sizeof(struct + sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST); + return dst; + } +#endif + else + return NULL; +#else + return inet_ntop(af, src, dst, cnt); +#endif +} + +bool udp_send_packet(const char *host, + uint16_t port, const char *msg) +{ + char port_buf[16] = {0}; + struct addrinfo hints = {0}; + struct addrinfo *res = NULL; + const struct addrinfo *tmp = NULL; + int fd = -1; + bool ret = true; + + hints.ai_socktype = SOCK_DGRAM; + + snprintf(port_buf, sizeof(port_buf), "%hu", (unsigned short)port); + + if (getaddrinfo_retro(host, port_buf, &hints, &res) != 0) + return false; + + /* Send to all possible targets. + * "localhost" might resolve to several different IPs. */ + tmp = (const struct addrinfo*)res; + while (tmp) + { + ssize_t len, ret_len; + + fd = socket(tmp->ai_family, tmp->ai_socktype, tmp->ai_protocol); + if (fd < 0) + { + ret = false; + goto end; + } + + len = strlen(msg); + ret_len = sendto(fd, msg, len, 0, tmp->ai_addr, tmp->ai_addrlen); + + if (ret_len < len) + { + ret = false; + goto end; + } + + socket_close(fd); + fd = -1; + tmp = tmp->ai_next; + } + +end: + freeaddrinfo_retro(res); + if (fd >= 0) + socket_close(fd); + return ret; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_http.c
Added
@@ -0,0 +1,1115 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_http.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> + +#include <net/net_http.h> +#include <net/net_compat.h> +#include <net/net_socket.h> +#ifdef HAVE_SSL +#include <net/net_socket_ssl.h> +#endif +#include <compat/strl.h> +#include <string/stdstring.h> +#include <string.h> +#include <retro_common_api.h> +#include <retro_miscellaneous.h> + +enum +{ + P_HEADER_TOP = 0, + P_HEADER, + P_BODY, + P_BODY_CHUNKLEN, + P_DONE, + P_ERROR +}; + +enum +{ + T_FULL = 0, + T_LEN, + T_CHUNK +}; + +struct http_socket_state_t +{ + void *ssl_ctx; + int fd; + bool ssl; +}; + +struct http_t +{ + char *data; + struct http_socket_state_t sock_state; /* ptr alignment */ + size_t pos; + size_t len; + size_t buflen; + int status; + char part; + char bodytype; + bool error; +}; + +struct http_connection_t +{ + char *domain; + char *location; + char *urlcopy; + char *scan; + char *methodcopy; + char *contenttypecopy; + char *postdatacopy; + char* useragentcopy; + struct http_socket_state_t sock_state; /* ptr alignment */ + int port; +}; + +/* URL Encode a string + caller is responsible for deleting the destination buffer */ +void net_http_urlencode(char **dest, const char *source) +{ + static const char urlencode_lut[256] = + { + 0, /* 0 */ + 0, /* 1 */ + 0, /* 2 */ + 0, /* 3 */ + 0, /* 4 */ + 0, /* 5 */ + 0, /* 6 */ + 0, /* 7 */ + 0, /* 8 */ + 0, /* 9 */ + 0, /* 10 */ + 0, /* 11 */ + 0, /* 12 */ + 0, /* 13 */ + 0, /* 14 */ + 0, /* 15 */ + 0, /* 16 */ + 0, /* 17 */ + 0, /* 18 */ + 0, /* 19 */ + 0, /* 20 */ + 0, /* 21 */ + 0, /* 22 */ + 0, /* 23 */ + 0, /* 24 */ + 0, /* 25 */ + 0, /* 26 */ + 0, /* 27 */ + 0, /* 28 */ + 0, /* 29 */ + 0, /* 30 */ + 0, /* 31 */ + 0, /* 32 */ + 0, /* 33 */ + 0, /* 34 */ + 0, /* 35 */ + 0, /* 36 */ + 0, /* 37 */ + 0, /* 38 */ + 0, /* 39 */ + 0, /* 40 */ + 0, /* 41 */ + '*', /* 42 */ + 0, /* 43 */ + 0, /* 44 */ + '-', /* 45 */ + '.', /* 46 */ + '/', /* 47 */ + '0', /* 48 */ + '1', /* 49 */ + '2', /* 50 */ + '3', /* 51 */ + '4', /* 52 */ + '5', /* 53 */ + '6', /* 54 */ + '7', /* 55 */ + '8', /* 56 */ + '9', /* 57 */ + 0, /* 58 */ + 0, /* 59 */ + 0, /* 60 */ + 0, /* 61 */ + 0, /* 62 */ + 0, /* 63 */ + 0, /* 64 */ + 'A', /* 65 */ + 'B', /* 66 */ + 'C', /* 67 */ + 'D', /* 68 */ + 'E', /* 69 */ + 'F', /* 70 */ + 'G', /* 71 */ + 'H', /* 72 */ + 'I', /* 73 */ + 'J', /* 74 */ + 'K', /* 75 */ + 'L', /* 76 */ + 'M', /* 77 */ + 'N', /* 78 */ + 'O', /* 79 */ + 'P', /* 80 */ + 'Q', /* 81 */ + 'R', /* 82 */ + 'S', /* 83 */ + 'T', /* 84 */ + 'U', /* 85 */ + 'V', /* 86 */ + 'W', /* 87 */ + 'X', /* 88 */ + 'Y', /* 89 */ + 'Z', /* 90 */ + 0, /* 91 */ + 0, /* 92 */ + 0, /* 93 */ + 0, /* 94 */ + '_', /* 95 */ + 0, /* 96 */ + 'a', /* 97 */ + 'b', /* 98 */ + 'c', /* 99 */ + 'd', /* 100 */ + 'e', /* 101 */ + 'f', /* 102 */ + 'g', /* 103 */ + 'h', /* 104 */ + 'i', /* 105 */ + 'j', /* 106 */ + 'k', /* 107 */ + 'l', /* 108 */ + 'm', /* 109 */ + 'n', /* 110 */ + 'o', /* 111 */ + 'p', /* 112 */ + 'q', /* 113 */ + 'r', /* 114 */ + 's', /* 115 */ + 't', /* 116 */ + 'u', /* 117 */ + 'v', /* 118 */ + 'w', /* 119 */ + 'x', /* 120 */ + 'y', /* 121 */ + 'z', /* 122 */ + 0, /* 123 */ + 0, /* 124 */ + 0, /* 125 */ + 0, /* 126 */ + 0, /* 127 */ + 0, /* 128 */ + 0, /* 129 */ + 0, /* 130 */ + 0, /* 131 */ + 0, /* 132 */ + 0, /* 133 */ + 0, /* 134 */ + 0, /* 135 */ + 0, /* 136 */ + 0, /* 137 */ + 0, /* 138 */ + 0, /* 139 */ + 0, /* 140 */ + 0, /* 141 */ + 0, /* 142 */ + 0, /* 143 */ + 0, /* 144 */ + 0, /* 145 */ + 0, /* 146 */ + 0, /* 147 */ + 0, /* 148 */ + 0, /* 149 */ + 0, /* 150 */ + 0, /* 151 */ + 0, /* 152 */ + 0, /* 153 */ + 0, /* 154 */ + 0, /* 155 */ + 0, /* 156 */ + 0, /* 157 */ + 0, /* 158 */ + 0, /* 159 */ + 0, /* 160 */ + 0, /* 161 */ + 0, /* 162 */ + 0, /* 163 */ + 0, /* 164 */ + 0, /* 165 */ + 0, /* 166 */ + 0, /* 167 */ + 0, /* 168 */ + 0, /* 169 */ + 0, /* 170 */ + 0, /* 171 */ + 0, /* 172 */ + 0, /* 173 */ + 0, /* 174 */ + 0, /* 175 */ + 0, /* 176 */ + 0, /* 177 */ + 0, /* 178 */ + 0, /* 179 */ + 0, /* 180 */ + 0, /* 181 */ + 0, /* 182 */ + 0, /* 183 */ + 0, /* 184 */ + 0, /* 185 */ + 0, /* 186 */ + 0, /* 187 */ + 0, /* 188 */ + 0, /* 189 */ + 0, /* 190 */ + 0, /* 191 */ + 0, /* 192 */ + 0, /* 193 */ + 0, /* 194 */ + 0, /* 195 */ + 0, /* 196 */ + 0, /* 197 */ + 0, /* 198 */ + 0, /* 199 */ + 0, /* 200 */ + 0, /* 201 */ + 0, /* 202 */ + 0, /* 203 */ + 0, /* 204 */ + 0, /* 205 */ + 0, /* 206 */ + 0, /* 207 */ + 0, /* 208 */ + 0, /* 209 */ + 0, /* 210 */ + 0, /* 211 */ + 0, /* 212 */ + 0, /* 213 */ + 0, /* 214 */ + 0, /* 215 */ + 0, /* 216 */ + 0, /* 217 */ + 0, /* 218 */ + 0, /* 219 */ + 0, /* 220 */ + 0, /* 221 */ + 0, /* 222 */ + 0, /* 223 */ + 0, /* 224 */ + 0, /* 225 */ + 0, /* 226 */ + 0, /* 227 */ + 0, /* 228 */ + 0, /* 229 */ + 0, /* 230 */ + 0, /* 231 */ + 0, /* 232 */ + 0, /* 233 */ + 0, /* 234 */ + 0, /* 235 */ + 0, /* 236 */ + 0, /* 237 */ + 0, /* 238 */ + 0, /* 239 */ + 0, /* 240 */ + 0, /* 241 */ + 0, /* 242 */ + 0, /* 243 */ + 0, /* 244 */ + 0, /* 245 */ + 0, /* 246 */ + 0, /* 247 */ + 0, /* 248 */ + 0, /* 249 */ + 0, /* 250 */ + 0, /* 251 */ + 0, /* 252 */ + 0, /* 253 */ + 0, /* 254 */ + 0 /* 255 */ + }; + + /* Assume every character will be encoded, so we need 3 times the space. */ + size_t len = strlen(source) * 3 + 1; + size_t count = len; + char *enc = (char*)calloc(1, len); + *dest = enc; + + for (; *source; source++) + { + int written = 0; + + /* any non-ASCII character will just be encoded without question */ + if ((unsigned)*source < sizeof(urlencode_lut) && urlencode_lut[(unsigned)*source]) + written = snprintf(enc, count, "%c", urlencode_lut[(unsigned)*source]); + else + written = snprintf(enc, count, "%%%02X", *source & 0xFF); + + if (written > 0) + count -= written; + + while (*++enc); + } + + (*dest)[len - 1] = '\0'; +} + +/* Re-encode a full URL */ +void net_http_urlencode_full(char *dest, + const char *source, size_t size) +{ + size_t buf_pos = 0; + char *tmp = NULL; + char url_domain[PATH_MAX_LENGTH] = {0}; + char url_path[PATH_MAX_LENGTH] = {0}; + int count = 0; + + strlcpy(url_path, source, sizeof(url_path)); + tmp = url_path; + + while (count < 3 && tmp[0] != '\0') + { + tmp = strchr(tmp, '/'); + count++; + tmp++; + } + + strlcpy(url_domain, source, tmp - url_path); + + strlcpy(url_path, + source + strlen(url_domain) + 1, + strlen(tmp) + 1 + ); + + tmp = NULL; + net_http_urlencode(&tmp, url_path); + buf_pos = strlcpy(dest, url_domain, size); + dest[buf_pos] = '/'; + dest[buf_pos+1] = '\0'; + strlcat(dest, tmp, size); + free (tmp); +} + +static int net_http_new_socket(struct http_connection_t *conn) +{ + int ret; + struct addrinfo *addr = NULL, *next_addr = NULL; + int fd = socket_init( + (void**)&addr, conn->port, conn->domain, SOCKET_TYPE_STREAM); +#ifdef HAVE_SSL + if (conn->sock_state.ssl) + { + if (!(conn->sock_state.ssl_ctx = ssl_socket_init(fd, conn->domain))) + return -1; + } +#endif + + next_addr = addr; + + while (fd >= 0) + { +#ifdef HAVE_SSL + if (conn->sock_state.ssl) + { + ret = ssl_socket_connect(conn->sock_state.ssl_ctx, + (void*)next_addr, true, true); + + if (ret >= 0) + break; + + ssl_socket_close(conn->sock_state.ssl_ctx); + } + else +#endif + { + ret = socket_connect(fd, (void*)next_addr, true); + + if (ret >= 0 && socket_nonblock(fd)) + break; + + socket_close(fd); + } + + fd = socket_next((void**)&next_addr); + } + + if (addr) + freeaddrinfo_retro(addr); + + conn->sock_state.fd = fd; + + return fd; +} + +static void net_http_send_str( + struct http_socket_state_t *sock_state, bool *error, const char *text) +{ + size_t text_size; + if (*error) + return; + text_size = strlen(text); +#ifdef HAVE_SSL + if (sock_state->ssl) + { + if (!ssl_socket_send_all_blocking( + sock_state->ssl_ctx, text, text_size, true)) + *error = true; + } + else +#endif + { + if (!socket_send_all_blocking( + sock_state->fd, text, text_size, true)) + *error = true; + } +} + +struct http_connection_t *net_http_connection_new(const char *url, + const char *method, const char *data) +{ + struct http_connection_t *conn = (struct http_connection_t*)malloc( + sizeof(*conn)); + + if (!conn) + return NULL; + + if (!url) + { + free(conn); + return NULL; + } + + conn->domain = NULL; + conn->location = NULL; + conn->urlcopy = NULL; + conn->scan = NULL; + conn->methodcopy = NULL; + conn->contenttypecopy = NULL; + conn->postdatacopy = NULL; + conn->useragentcopy = NULL; + conn->port = 0; + conn->sock_state.fd = 0; + conn->sock_state.ssl = false; + conn->sock_state.ssl_ctx= NULL; + + if (method) + conn->methodcopy = strdup(method); + + if (data) + conn->postdatacopy = strdup(data); + + conn->urlcopy = strdup(url); + if (!conn->urlcopy) + goto error; + + if (!strncmp(url, "http://", STRLEN_CONST("http://"))) + conn->scan = conn->urlcopy + STRLEN_CONST("http://"); + else if (!strncmp(url, "https://", STRLEN_CONST("https://"))) + { + conn->scan = conn->urlcopy + STRLEN_CONST("https://"); + conn->sock_state.ssl = true; + } + else + goto error; + + if (string_is_empty(conn->scan)) + goto error; + + conn->domain = conn->scan; + + return conn; + +error: + if (conn->urlcopy) + free(conn->urlcopy); + if (conn->methodcopy) + free(conn->methodcopy); + if (conn->postdatacopy) + free(conn->postdatacopy); + conn->urlcopy = NULL; + conn->methodcopy = NULL; + conn->postdatacopy = NULL; + free(conn); + return NULL; +} + +bool net_http_connection_iterate(struct http_connection_t *conn) +{ + if (!conn) + return false; + + while (*conn->scan != '/' && *conn->scan != ':' && *conn->scan != '\0') + conn->scan++; + + return true; +} + +bool net_http_connection_done(struct http_connection_t *conn) +{ + int has_port = 0; + + if (!conn || !conn->domain || !*conn->domain) + return false; + + if (*conn->scan == ':') + { + /* domain followed by port, split off the port */ + *conn->scan++ = '\0'; + + if (!isdigit((int)(*conn->scan))) + return false; + + conn->port = (int)strtoul(conn->scan, &conn->scan, 10); + has_port = 1; + } + else if (conn->port == 0) + { + /* port not specified, default to standard HTTP or HTTPS port */ + if (conn->sock_state.ssl) + conn->port = 443; + else + conn->port = 80; + } + + if (*conn->scan == '/') + { + /* domain followed by location - split off the location */ + /* site.com/path.html or site.com:80/path.html */ + *conn->scan = '\0'; + conn->location = conn->scan + 1; + return true; + } + else if (!*conn->scan) + { + /* domain with no location - point location at empty string */ + /* site.com or site.com:80 */ + conn->location = conn->scan; + return true; + } + else if (*conn->scan == '?') + { + /* domain with no location, but still has query parms - point location at the query parms */ + /* site.com?param=3 or site.com:80?param=3 */ + if (!has_port) + { + /* if there wasn't a port, we have to expand the urlcopy so we can separate the two parts */ + size_t domain_len = strlen(conn->domain); + size_t location_len = strlen(conn->scan); + char* urlcopy = (char*)malloc(domain_len + location_len + 2); + memcpy(urlcopy, conn->domain, domain_len); + urlcopy[domain_len] = '\0'; + memcpy(urlcopy + domain_len + 1, conn->scan, location_len + 1); + + free(conn->urlcopy); + conn->domain = conn->urlcopy = urlcopy; + conn->location = conn->scan = urlcopy + domain_len + 1; + } + else + { + /* there was a port, so overwriting the : will terminate the domain and we can just point at the ? */ + conn->location = conn->scan; + } + + return true; + } + + /* invalid character after domain/port */ + return false; +} + +void net_http_connection_free(struct http_connection_t *conn) +{ + if (!conn) + return; + + if (conn->urlcopy) + free(conn->urlcopy); + + if (conn->methodcopy) + free(conn->methodcopy); + + if (conn->contenttypecopy) + free(conn->contenttypecopy); + + if (conn->postdatacopy) + free(conn->postdatacopy); + + if (conn->useragentcopy) + free(conn->useragentcopy); + + conn->urlcopy = NULL; + conn->methodcopy = NULL; + conn->contenttypecopy = NULL; + conn->postdatacopy = NULL; + conn->useragentcopy = NULL; + + free(conn); +} + +void net_http_connection_set_user_agent( + struct http_connection_t* conn, const char* user_agent) +{ + if (conn->useragentcopy) + free(conn->useragentcopy); + + conn->useragentcopy = user_agent ? strdup(user_agent) : NULL; +} + +const char *net_http_connection_url(struct http_connection_t *conn) +{ + return conn->urlcopy; +} + +struct http_t *net_http_new(struct http_connection_t *conn) +{ + bool error = false; + int fd = -1; + struct http_t *state = NULL; + + if (!conn) + goto error; + + fd = net_http_new_socket(conn); + + if (fd < 0) + goto error; + + error = false; + + /* This is a bit lazy, but it works. */ + if (conn->methodcopy) + { + net_http_send_str(&conn->sock_state, &error, conn->methodcopy); + net_http_send_str(&conn->sock_state, &error, " /"); + } + else + { + net_http_send_str(&conn->sock_state, &error, "GET /"); + } + + net_http_send_str(&conn->sock_state, &error, conn->location); + net_http_send_str(&conn->sock_state, &error, " HTTP/1.1\r\n"); + + net_http_send_str(&conn->sock_state, &error, "Host: "); + net_http_send_str(&conn->sock_state, &error, conn->domain); + + if (!conn->port) + { + char portstr[16]; + + portstr[0] = '\0'; + + snprintf(portstr, sizeof(portstr), ":%i", conn->port); + net_http_send_str(&conn->sock_state, &error, portstr); + } + + net_http_send_str(&conn->sock_state, &error, "\r\n"); + + /* This is not being set anywhere yet */ + if (conn->contenttypecopy) + { + net_http_send_str(&conn->sock_state, &error, "Content-Type: "); + net_http_send_str(&conn->sock_state, &error, conn->contenttypecopy); + net_http_send_str(&conn->sock_state, &error, "\r\n"); + } + + if (conn->methodcopy && (string_is_equal(conn->methodcopy, "POST"))) + { + size_t post_len, len; + char *len_str = NULL; + + if (!conn->postdatacopy) + goto error; + + if (!conn->contenttypecopy) + net_http_send_str(&conn->sock_state, &error, + "Content-Type: application/x-www-form-urlencoded\r\n"); + + net_http_send_str(&conn->sock_state, &error, "Content-Length: "); + + post_len = strlen(conn->postdatacopy); +#ifdef _WIN32 + len = snprintf(NULL, 0, "%" PRIuPTR, post_len); + len_str = (char*)malloc(len + 1); + snprintf(len_str, len + 1, "%" PRIuPTR, post_len); +#else + len = snprintf(NULL, 0, "%llu", (long long unsigned)post_len); + len_str = (char*)malloc(len + 1); + snprintf(len_str, len + 1, "%llu", (long long unsigned)post_len); +#endif + + len_str[len] = '\0'; + + net_http_send_str(&conn->sock_state, &error, len_str); + net_http_send_str(&conn->sock_state, &error, "\r\n"); + + free(len_str); + } + + net_http_send_str(&conn->sock_state, &error, "User-Agent: "); + if (conn->useragentcopy) + net_http_send_str(&conn->sock_state, &error, conn->useragentcopy); + else + net_http_send_str(&conn->sock_state, &error, "libretro"); + net_http_send_str(&conn->sock_state, &error, "\r\n"); + + net_http_send_str(&conn->sock_state, &error, "Connection: close\r\n"); + net_http_send_str(&conn->sock_state, &error, "\r\n"); + + if (conn->methodcopy && (string_is_equal(conn->methodcopy, "POST"))) + net_http_send_str(&conn->sock_state, &error, conn->postdatacopy); + + if (error) + goto error; + + state = (struct http_t*)malloc(sizeof(struct http_t)); + state->sock_state = conn->sock_state; + state->status = -1; + state->data = NULL; + state->part = P_HEADER_TOP; + state->bodytype = T_FULL; + state->error = false; + state->pos = 0; + state->len = 0; + state->buflen = 512; + state->data = (char*)malloc(state->buflen); + + if (!state->data) + goto error; + + return state; + +error: + if (conn) + { + if (conn->methodcopy) + free(conn->methodcopy); + if (conn->contenttypecopy) + free(conn->contenttypecopy); + conn->methodcopy = NULL; + conn->contenttypecopy = NULL; + conn->postdatacopy = NULL; + } +#ifdef HAVE_SSL + if (conn && conn->sock_state.ssl && conn->sock_state.ssl_ctx && fd >= 0) + { + ssl_socket_close(conn->sock_state.ssl_ctx); + ssl_socket_free(conn->sock_state.ssl_ctx); + conn->sock_state.ssl_ctx = NULL; + } +#else + if (fd >= 0) + socket_close(fd); +#endif + if (state) + free(state); + return NULL; +} + +int net_http_fd(struct http_t *state) +{ + if (!state) + return -1; + return state->sock_state.fd; +} + +bool net_http_update(struct http_t *state, size_t* progress, size_t* total) +{ + ssize_t newlen = 0; + + if (!state || state->error) + goto fail; + + if (state->part < P_BODY) + { + if (state->error) + newlen = -1; + else + { +#ifdef HAVE_SSL + if (state->sock_state.ssl && state->sock_state.ssl_ctx) + newlen = ssl_socket_receive_all_nonblocking(state->sock_state.ssl_ctx, &state->error, + (uint8_t*)state->data + state->pos, + state->buflen - state->pos); + else +#endif + newlen = socket_receive_all_nonblocking(state->sock_state.fd, &state->error, + (uint8_t*)state->data + state->pos, + state->buflen - state->pos); + } + + if (newlen < 0) + goto fail; + + if (state->pos + newlen >= state->buflen - 64) + { + state->buflen *= 2; + state->data = (char*)realloc(state->data, state->buflen); + } + state->pos += newlen; + + while (state->part < P_BODY) + { + char *dataend = state->data + state->pos; + char *lineend = (char*)memchr(state->data, '\n', state->pos); + + if (!lineend) + break; + + *lineend='\0'; + + if (lineend != state->data && lineend[-1]=='\r') + lineend[-1]='\0'; + + if (state->part == P_HEADER_TOP) + { + if (strncmp(state->data, "HTTP/1.", STRLEN_CONST("HTTP/1."))!=0) + goto fail; + state->status = (int)strtoul(state->data + + STRLEN_CONST("HTTP/1.1 "), NULL, 10); + state->part = P_HEADER; + } + else + { + if (!strncmp(state->data, "Content-Length: ", + STRLEN_CONST("Content-Length: "))) + { + state->bodytype = T_LEN; + state->len = strtol(state->data + + STRLEN_CONST("Content-Length: "), NULL, 10); + } + if (string_is_equal(state->data, "Transfer-Encoding: chunked")) + state->bodytype = T_CHUNK; + + /* TODO: save headers somewhere */ + if (state->data[0]=='\0') + { + state->part = P_BODY; + if (state->bodytype == T_CHUNK) + state->part = P_BODY_CHUNKLEN; + } + } + + memmove(state->data, lineend + 1, dataend-(lineend+1)); + state->pos = (dataend-(lineend + 1)); + } + if (state->part >= P_BODY) + { + newlen = state->pos; + state->pos = 0; + } + } + + if (state->part >= P_BODY && state->part < P_DONE) + { + if (!newlen) + { + if (state->error) + newlen = -1; + else + { +#ifdef HAVE_SSL + if (state->sock_state.ssl && state->sock_state.ssl_ctx) + newlen = ssl_socket_receive_all_nonblocking( + state->sock_state.ssl_ctx, + &state->error, + (uint8_t*)state->data + state->pos, + state->buflen - state->pos); + else +#endif + newlen = socket_receive_all_nonblocking( + state->sock_state.fd, + &state->error, + (uint8_t*)state->data + state->pos, + state->buflen - state->pos); + } + + if (newlen < 0) + { + if (state->bodytype == T_FULL) + { + state->part = P_DONE; + state->data = (char*)realloc(state->data, state->len); + } + else + goto fail; + newlen=0; + } + + if (state->pos + newlen >= state->buflen - 64) + { + state->buflen *= 2; + state->data = (char*)realloc(state->data, state->buflen); + } + } + +parse_again: + if (state->bodytype == T_CHUNK) + { + if (state->part == P_BODY_CHUNKLEN) + { + state->pos += newlen; + if (state->pos - state->len >= 2) + { + /* + * len=start of chunk including \r\n + * pos=end of data + */ + + char *fullend = state->data + state->pos; + char *end = (char*)memchr(state->data + state->len + 2, '\n', + state->pos - state->len - 2); + + if (end) + { + size_t chunklen = strtoul(state->data+state->len, NULL, 16); + state->pos = state->len; + end++; + + memmove(state->data+state->len, end, fullend-end); + + state->len = chunklen; + newlen = (fullend - end); + + /* + len=num bytes + newlen=unparsed bytes after \n + pos=start of chunk including \r\n + */ + + state->part = P_BODY; + if (state->len == 0) + { + state->part = P_DONE; + state->len = state->pos; + state->data = (char*)realloc(state->data, state->len); + } + goto parse_again; + } + } + } + else if (state->part == P_BODY) + { + if ((size_t)newlen >= state->len) + { + state->pos += state->len; + newlen -= state->len; + state->len = state->pos; + state->part = P_BODY_CHUNKLEN; + goto parse_again; + } + else + { + state->pos += newlen; + state->len -= newlen; + } + } + } + else + { + state->pos += newlen; + + if (state->pos == state->len) + { + state->part = P_DONE; + state->data = (char*)realloc(state->data, state->len); + } + if (state->pos > state->len) + goto fail; + } + } + + if (progress) + *progress = state->pos; + + if (total) + { + if (state->bodytype == T_LEN) + *total=state->len; + else + *total=0; + } + + return (state->part == P_DONE); + +fail: + if (state) + { + state->error = true; + state->part = P_ERROR; + state->status = -1; + } + + return true; +} + +int net_http_status(struct http_t *state) +{ + if (!state) + return -1; + return state->status; +} + +uint8_t* net_http_data(struct http_t *state, size_t* len, bool accept_error) +{ + if (!state) + return NULL; + + if (!accept_error && net_http_error(state)) + { + if (len) + *len=0; + return NULL; + } + + if (len) + *len=state->len; + + return (uint8_t*)state->data; +} + +void net_http_delete(struct http_t *state) +{ + if (!state) + return; + + if (state->sock_state.fd >= 0) + { + socket_close(state->sock_state.fd); +#ifdef HAVE_SSL + if (state->sock_state.ssl && state->sock_state.ssl_ctx) + { + ssl_socket_free(state->sock_state.ssl_ctx); + state->sock_state.ssl_ctx = NULL; + } +#endif + } + free(state); +} + +bool net_http_error(struct http_t *state) +{ + return (state->error || state->status<200 || state->status>299); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_http_parse.c
Added
@@ -0,0 +1,86 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_http_parse.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <compat/strcasestr.h> + +/** + * string_parse_html_anchor: + * @line : Buffer where the <a> tag is stored + * @link : Buffer to store the link URL in + * @name : Buffer to store the link URL in + * @link_size : Size of the link buffer including the NUL-terminator + * @name_size : Size of the name buffer including the NUL-terminator + * + * Parses an HTML anchor link stored in @line in the form of: <a href="/path/to/url">Title</a> + * The buffer pointed to by @link is filled with the URL path the link points to, + * and @name is filled with the title portion of the link. + * + * Returns: 0 if URL was parsed completely, otherwise 1. + **/ +int string_parse_html_anchor(const char *line, char *link, char *name, + size_t link_size, size_t name_size) +{ + if (!line || !link || !name) + return 1; + + memset(link, 0, link_size); + memset(name, 0, name_size); + + line = strcasestr(line, "<a href=\""); + + if (!line) + return 1; + + line += 9; + + if (line && *line) + { + if (!*link) + { + const char *end = strstr(line, "\""); + + if (!end) + return 1; + + memcpy(link, line, end - line); + + *(link + (end - line)) = '\0'; + line += end - line; + } + + if (!*name) + { + const char *start = strstr(line, "\">"); + const char *end = start ? strstr(start, "</a>") : NULL; + + if (!start || !end) + return 1; + + memcpy(name, start + 2, end - start - 2); + + *(name + (end - start - 2)) = '\0'; + } + } + + return 0; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_ifinfo.c
Added
@@ -0,0 +1,258 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_ifinfo.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <retro_miscellaneous.h> + +#if defined(_WIN32) && !defined(_XBOX) +#include <winsock2.h> +#include <iphlpapi.h> +#include <ws2tcpip.h> +#else +#include <arpa/inet.h> +#include <sys/socket.h> +#include <netdb.h> + +#ifdef WANT_IFADDRS +#include <compat/ifaddrs.h> +#else +#if !defined HAVE_LIBNX && !defined(_3DS) +#include <ifaddrs.h> +#endif +#endif +#endif + +#include <net/net_ifinfo.h> + +#if defined(BSD) +#include <netinet/in.h> +#endif + +void net_ifinfo_free(net_ifinfo_t *list) +{ + unsigned k; + + if (!list) + return; + + for (k = 0; k < list->size; k++) + { + struct net_ifinfo_entry *ptr = + (struct net_ifinfo_entry*)&list->entries[k]; + + if (*ptr->name) + free(ptr->name); + if (*ptr->host) + free(ptr->host); + + ptr->name = NULL; + ptr->host = NULL; + } + free(list->entries); +} + +#if defined(HAVE_LIBNX) || defined(_3DS) +static void convert_ip(char *dst, size_t size, uint32_t ip, bool inverted) +{ + unsigned char bytes[4]; + bytes[0] = ip & 0xFF; + bytes[1] = (ip >> 8) & 0xFF; + bytes[2] = (ip >> 16) & 0xFF; + bytes[3] = (ip >> 24) & 0xFF; + + if (inverted) + snprintf(dst, size, "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]); + else + snprintf(dst, size, "%d.%d.%d.%d", bytes[3], bytes[2], bytes[1], bytes[0]); +} +#endif + +bool net_ifinfo_new(net_ifinfo_t *list) +{ + unsigned k = 0; +#if defined(HAVE_LIBNX) || defined(_3DS) + uint32_t id; + Result rc; + + char hostname[128]; + struct net_ifinfo_entry *ptr = NULL; + + memset(list, 0, sizeof(net_ifinfo_t)); + + /* loopback */ + convert_ip(hostname, sizeof(hostname), INADDR_LOOPBACK, false); + + ptr = (struct net_ifinfo_entry*) + realloc(list->entries, (k+1) * sizeof(struct net_ifinfo_entry)); + + if (!ptr) + goto error; + + list->entries = ptr; + + list->entries[k].name = strdup("lo"); + list->entries[k].host = strdup(hostname); + list->size = k + 1; + + k++; + + /* + actual interface + can be wlan or eth (with a wiiu adapter) + so we just use "switch" as a name + */ +#if defined(_3DS) + convert_ip(hostname, sizeof(hostname), gethostid(), true); +#else + rc = nifmGetCurrentIpAddress(&id); + + if (!R_SUCCEEDED(rc)) /* not connected to any network */ + return true; + + convert_ip(hostname, sizeof(hostname), id, true); +#endif + + ptr = (struct net_ifinfo_entry*) + realloc(list->entries, (k+1) * sizeof(struct net_ifinfo_entry)); + + if (!ptr) + goto error; + + list->entries = ptr; +#if defined(_3DS) + list->entries[k].name = strdup("wlan"); +#else + list->entries[k].name = strdup("switch"); +#endif + list->entries[k].host = strdup(hostname); + list->size = k + 1; + + return true; +#elif defined(_WIN32) && !defined(_XBOX) + PIP_ADAPTER_ADDRESSES adapter_addresses = NULL, aa = NULL; + PIP_ADAPTER_UNICAST_ADDRESS ua = NULL; +#ifdef _WIN32_WINNT_WINXP + DWORD size = 0; + DWORD rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &size); + + adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size); + + rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, adapter_addresses, &size); + + memset(list, 0, sizeof(net_ifinfo_t)); + + if (rv != ERROR_SUCCESS) + goto error; +#endif + for (aa = adapter_addresses; aa != NULL; aa = aa->Next) + { + char name[PATH_MAX_LENGTH]; + memset(name, 0, sizeof(name)); + + WideCharToMultiByte(CP_ACP, 0, aa->FriendlyName, wcslen(aa->FriendlyName), + name, PATH_MAX_LENGTH, NULL, NULL); + + for (ua = aa->FirstUnicastAddress; ua != NULL; ua = ua->Next) + { + char host[PATH_MAX_LENGTH]; + struct net_ifinfo_entry *ptr = (struct net_ifinfo_entry*) + realloc(list->entries, (k+1) * sizeof(struct net_ifinfo_entry)); + + if (!ptr) + goto error; + + list->entries = ptr; + + memset(host, 0, sizeof(host)); + + getnameinfo(ua->Address.lpSockaddr, ua->Address.iSockaddrLength, + host, sizeof(host), NULL, NI_MAXSERV, NI_NUMERICHOST); + + list->entries[k].name = strdup(name); + list->entries[k].host = strdup(host); + list->size = k + 1; + + k++; + } + } + + free(adapter_addresses); +#else + struct ifaddrs *ifa = NULL; + struct ifaddrs *ifaddr = NULL; + + memset(list, 0, sizeof(net_ifinfo_t)); + + if (getifaddrs(&ifaddr) == -1) + goto error; + + if (!list) + goto error; + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) + { + char host[NI_MAXHOST]; + struct net_ifinfo_entry *ptr = NULL; + + if (!ifa->ifa_addr) + continue; + + if (ifa->ifa_addr->sa_family != AF_INET) + continue; + + if (getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), + host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) != 0) + goto error; + + ptr = (struct net_ifinfo_entry*) + realloc(list->entries, (k+1) * sizeof(struct net_ifinfo_entry)); + + if (!ptr) + goto error; + + list->entries = ptr; + + list->entries[k].name = strdup(ifa->ifa_name); + list->entries[k].host = strdup(host); + list->size = k + 1; + + k++; + } + + freeifaddrs(ifaddr); +#endif + return true; + +error: +#ifdef _WIN32 + if (adapter_addresses) + free(adapter_addresses); +#elif !defined(HAVE_LIBNX) && !defined(_3DS) + freeifaddrs(ifaddr); +#endif + net_ifinfo_free(list); + + return false; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_natt.c
Added
@@ -0,0 +1,253 @@ +/* Copyright (C) 2016-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_natt.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> + +#include <net/net_compat.h> +#include <net/net_ifinfo.h> +#include <retro_miscellaneous.h> + +#include <string/stdstring.h> +#include <net/net_natt.h> + +#if HAVE_MINIUPNPC +#include <miniupnpc/miniwget.h> +#include <miniupnpc/miniupnpc.h> +#include <miniupnpc/upnpcommands.h> + +#if MINIUPNPC_API_VERSION < 16 +#undef HAVE_MINIUPNPC +#endif +#endif + +#if HAVE_MINIUPNPC +static struct UPNPUrls urls; +static struct IGDdatas data; +#endif + +void natt_init(void) +{ +#ifndef HAVE_SOCKET_LEGACY +#if HAVE_MINIUPNPC + struct UPNPDev * devlist; + struct UPNPDev * dev; + char * descXML; + int descXMLsize = 0; + int upnperror = 0; + memset(&urls, 0, sizeof(struct UPNPUrls)); + memset(&data, 0, sizeof(struct IGDdatas)); + devlist = upnpDiscover(2000, NULL, NULL, 0, 0, 2, &upnperror); + if (devlist) + { + dev = devlist; + while (dev) + { + if (strstr (dev->st, "InternetGatewayDevice")) + break; + dev = dev->pNext; + } + if (!dev) + dev = devlist; + + descXML = (char *) miniwget(dev->descURL, &descXMLsize, 0, NULL); + if (descXML) + { + parserootdesc(descXML, descXMLsize, &data); + free (descXML); + descXML = 0; + GetUPNPUrls (&urls, &data, dev->descURL, 0); + } + freeUPNPDevlist(devlist); + } +#endif +#endif +} + +bool natt_new(struct natt_status *status) +{ + memset(status, 0, sizeof(struct natt_status)); + return true; +} + +void natt_free(struct natt_status *status) { } + +static bool natt_open_port(struct natt_status *status, + struct sockaddr *addr, socklen_t addrlen, enum socket_protocol proto) +{ +#ifndef HAVE_SOCKET_LEGACY +#if HAVE_MINIUPNPC + int r; + char host[PATH_MAX_LENGTH], ext_host[PATH_MAX_LENGTH], + port_str[6], ext_port_str[6]; + struct addrinfo hints = {0}; + const char *proto_str = NULL; + struct addrinfo *ext_addrinfo = NULL; + + /* if NAT traversal is uninitialized or unavailable, oh well */ + if (!urls.controlURL || !urls.controlURL[0]) + return false; + + /* figure out the internal info */ + if (getnameinfo(addr, addrlen, host, PATH_MAX_LENGTH, + port_str, 6, NI_NUMERICHOST|NI_NUMERICSERV) != 0) + return false; + + proto_str = (proto == SOCKET_PROTOCOL_UDP) ? "UDP" : "TCP"; + + /* add the port mapping */ + r = UPNP_AddAnyPortMapping(urls.controlURL, + data.first.servicetype, port_str, + port_str, host, "retroarch", + proto_str, NULL, "3600", ext_port_str); + + if (r != 0) + { + /* try the older AddPortMapping */ + memcpy(ext_port_str, port_str, 6); + r = UPNP_AddPortMapping(urls.controlURL, + data.first.servicetype, port_str, + port_str, host, "retroarch", + proto_str, NULL, "3600"); + } + if (r != 0) + return false; + + /* get the external IP */ + r = UPNP_GetExternalIPAddress(urls.controlURL, + data.first.servicetype, ext_host); + if (r != 0) + return false; + + /* update the status */ + if (getaddrinfo_retro(ext_host, + ext_port_str, &hints, &ext_addrinfo) != 0) + return false; + + if (ext_addrinfo->ai_family == AF_INET && + ext_addrinfo->ai_addrlen >= sizeof(struct sockaddr_in)) + { + status->have_inet4 = true; + status->ext_inet4_addr = *((struct sockaddr_in *) + ext_addrinfo->ai_addr); + } +#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) + else if (ext_addrinfo->ai_family == AF_INET6 && + ext_addrinfo->ai_addrlen >= sizeof(struct sockaddr_in6)) + { + status->have_inet6 = true; + status->ext_inet6_addr = *((struct sockaddr_in6 *) + ext_addrinfo->ai_addr); + } +#endif + else + { + freeaddrinfo_retro(ext_addrinfo); + return false; + } + + freeaddrinfo_retro(ext_addrinfo); + return true; + +#else + return false; +#endif +#else + return false; +#endif +} + +bool natt_open_port_any(struct natt_status *status, + uint16_t port, enum socket_protocol proto) +{ +#if !defined(HAVE_SOCKET_LEGACY) && (!defined(SWITCH) || defined(SWITCH) && defined(HAVE_LIBNX)) + size_t i; + char port_str[6]; + struct net_ifinfo list; + struct addrinfo hints = {0}, *addr; + bool ret = false; + + snprintf(port_str, sizeof(port_str), "%hu", port); + + /* get our interfaces */ + if (!net_ifinfo_new(&list)) + return false; + + /* loop through them */ + for (i = 0; i < list.size; i++) + { + struct net_ifinfo_entry *entry = list.entries + i; + + /* ignore localhost */ + if ( string_is_equal(entry->host, "127.0.0.1") || + string_is_equal(entry->host, "::1")) + continue; + + /* make a request for this host */ + if (getaddrinfo_retro(entry->host, port_str, &hints, &addr) == 0) + { + ret = natt_open_port(status, addr->ai_addr, + addr->ai_addrlen, proto) || ret; + freeaddrinfo_retro(addr); + } + } + + net_ifinfo_free(&list); + + return ret; + +#else + return false; +#endif +} + +bool natt_read(struct natt_status *status) +{ + /* MiniUPNPC is always synchronous, so there's nothing to read here. + * Reserved for future backends. */ + return false; +} + +#if 0 +/* If we want to remove redirects in the future, this is a + * sample of how to do that. */ + +void upnp_rem_redir (int port) +{ + int t; + char port_str[16]; + + printf("TB : upnp_rem_redir (%d)\n", port); + + if(urls.controlURL[0] == '\0') + { + printf("TB : the init was not done !\n"); + return; + } + + snprintf(port_str, sizeof(port_str), "%d", port); + UPNP_DeletePortMapping(urls.controlURL, + data.first.servicetype, port_str, "TCP", NULL); +} +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_socket.c
Added
@@ -0,0 +1,366 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_socket.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include <stdio.h> + +#ifdef _MSC_VER +#include <compat/msvc.h> +#endif + +#include <net/net_compat.h> +#include <net/net_socket.h> + +int socket_init(void **address, uint16_t port, const char *server, enum socket_type type) +{ + char port_buf[16]; + struct addrinfo hints = {0}; + struct addrinfo **addrinfo = (struct addrinfo**)address; + struct addrinfo *addr = NULL; + + if (!network_init()) + goto error; + + switch (type) + { + case SOCKET_TYPE_DATAGRAM: + hints.ai_socktype = SOCK_DGRAM; + break; + case SOCKET_TYPE_STREAM: + hints.ai_socktype = SOCK_STREAM; + break; + case SOCKET_TYPE_SEQPACKET: + /* TODO/FIXME - implement? */ + break; + } + + if (!server) + hints.ai_flags = AI_PASSIVE; + + port_buf[0] = '\0'; + + snprintf(port_buf, sizeof(port_buf), "%hu", (unsigned short)port); + + if (getaddrinfo_retro(server, port_buf, &hints, addrinfo) != 0) + goto error; + + addr = (struct addrinfo*)*addrinfo; + + if (!addr) + goto error; + + return socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); + +error: + return -1; +} + +int socket_next(void **addrinfo) +{ + struct addrinfo *addr = (struct addrinfo*)*addrinfo; + if ((*addrinfo = addr = addr->ai_next)) + return socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); + else + return -1; +} + +ssize_t socket_receive_all_nonblocking(int fd, bool *error, + void *data_, size_t size) +{ + const uint8_t *data = (const uint8_t*)data_; + ssize_t ret = recv(fd, (char*)data, size, 0); + + if (ret > 0) + return ret; + + if (ret == 0) + { + /* Socket closed */ + *error = true; + return -1; + } + + if (isagain((int)ret)) + return 0; + + *error = true; + return -1; +} + +int socket_receive_all_blocking(int fd, void *data_, size_t size) +{ + const uint8_t *data = (const uint8_t*)data_; + + while (size) + { + ssize_t ret = recv(fd, (char*)data, size, 0); + if (ret <= 0) + return false; + + data += ret; + size -= ret; + } + + return true; +} + +bool socket_set_block(int fd, bool block) +{ +#if !defined(__PSL1GHT__) && defined(__PS3__) || defined(VITA) || defined(WIIU) + int i = !block; + setsockopt(fd, SOL_SOCKET, SO_NBIO, &i, sizeof(int)); + return true; +#elif defined(_WIN32) + u_long mode = !block; + return ioctlsocket(fd, FIONBIO, &mode) == 0; +#else + return fcntl(fd, F_SETFL, (fcntl(fd, F_GETFL) & ~O_NONBLOCK) | (block ? 0 : O_NONBLOCK)) == 0; +#endif +} + +bool socket_nonblock(int fd) +{ + return socket_set_block(fd, false); +} + +int socket_close(int fd) +{ +#if defined(_WIN32) && !defined(_XBOX360) + /* WinSock has headers from the stone age. */ + return closesocket(fd); +#elif !defined(__PSL1GHT__) && defined(__PS3__) || defined(WIIU) + return socketclose(fd); +#elif defined(VITA) + return sceNetSocketClose(fd); +#else + return close(fd); +#endif +} + +int socket_select(int nfds, fd_set *readfs, fd_set *writefds, + fd_set *errorfds, struct timeval *timeout) +{ +#if !defined(__PSL1GHT__) && defined(__PS3__) + return socketselect(nfds, readfs, writefds, errorfds, timeout); +#elif defined(VITA) + extern int retro_epoll_fd; + SceNetEpollEvent ev = {0}; + + ev.events = SCE_NET_EPOLLIN | SCE_NET_EPOLLHUP; + ev.data.fd = nfds; + + if((sceNetEpollControl(retro_epoll_fd, SCE_NET_EPOLL_CTL_ADD, nfds, &ev))) + { + int ret = sceNetEpollWait(retro_epoll_fd, &ev, 1, 0); + sceNetEpollControl(retro_epoll_fd, SCE_NET_EPOLL_CTL_DEL, nfds, NULL); + return ret; + } + return 0; +#else + return select(nfds, readfs, writefds, errorfds, timeout); +#endif +} + +int socket_send_all_blocking(int fd, const void *data_, size_t size, + bool no_signal) +{ + const uint8_t *data = (const uint8_t*)data_; + + while (size) + { + ssize_t ret = send(fd, (const char*)data, size, + no_signal ? MSG_NOSIGNAL : 0); + if (ret <= 0) + { + if (isagain((int)ret)) + continue; + + return false; + } + + data += ret; + size -= ret; + } + + return true; +} + +ssize_t socket_send_all_nonblocking(int fd, const void *data_, size_t size, + bool no_signal) +{ + const uint8_t *data = (const uint8_t*)data_; + ssize_t sent = 0; + + while (size) + { + ssize_t ret = send(fd, (const char*)data, size, + no_signal ? MSG_NOSIGNAL : 0); + if (ret < 0) + { + if (isagain((int)ret)) + break; + + return -1; + } + else if (ret == 0) + break; + + data += ret; + size -= ret; + sent += ret; + } + + return sent; +} + +bool socket_bind(int fd, void *data) +{ + int yes = 1; + struct addrinfo *res = (struct addrinfo*)data; + setsockopt(fd, SOL_SOCKET, + SO_REUSEADDR, (const char*)&yes, sizeof(int)); + if (bind(fd, res->ai_addr, res->ai_addrlen) < 0) + return false; + return true; +} + +int socket_connect(int fd, void *data, bool timeout_enable) +{ + struct addrinfo *addr = (struct addrinfo*)data; + +#if !defined(_WIN32) && !defined(VITA) && !defined(WIIU) && !defined(_3DS) + if (timeout_enable) + { + struct timeval timeout; + timeout.tv_sec = 4; + timeout.tv_usec = 0; + + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof timeout); + } +#endif + + return connect(fd, addr->ai_addr, addr->ai_addrlen); +} + +static int domain_get(enum socket_domain type) +{ + switch (type) + { + case SOCKET_DOMAIN_INET: +#ifdef VITA + return SCE_NET_AF_INET; +#else + return AF_INET; +#endif + default: + break; + } + + return 0; +} + +int socket_create( + const char *name, + enum socket_domain domain_type, + enum socket_type socket_type, + enum socket_protocol protocol_type) +{ + int type = 0; + int protocol = 0; + int domain = domain_get(domain_type); +#ifdef VITA + + switch (socket_type) + { + case SOCKET_TYPE_DATAGRAM: + type = SCE_NET_SOCK_DGRAM; + break; + case SOCKET_TYPE_STREAM: + type = SCE_NET_SOCK_STREAM; + break; + case SOCKET_TYPE_SEQPACKET: + /* TODO/FIXME - implement */ + break; + } + + switch (protocol_type) + { + case SOCKET_PROTOCOL_NONE: + protocol = 0; + break; + case SOCKET_PROTOCOL_TCP: + protocol = SCE_NET_IPPROTO_TCP; + break; + case SOCKET_PROTOCOL_UDP: + protocol = SCE_NET_IPPROTO_UDP; + break; + } + + return sceNetSocket(name, domain, type, protocol); +#else + switch (socket_type) + { + case SOCKET_TYPE_DATAGRAM: + type = SOCK_DGRAM; + break; + case SOCKET_TYPE_STREAM: + type = SOCK_STREAM; + break; + case SOCKET_TYPE_SEQPACKET: + /* TODO/FIXME - implement */ + break; + } + + switch (protocol_type) + { + case SOCKET_PROTOCOL_NONE: + protocol = 0; + break; + case SOCKET_PROTOCOL_TCP: + protocol = IPPROTO_TCP; + break; + case SOCKET_PROTOCOL_UDP: + protocol = IPPROTO_UDP; + break; + } + + return socket(domain, type, protocol); +#endif +} + +void socket_set_target(void *data, socket_target_t *in_addr) +{ + struct sockaddr_in *out_target = (struct sockaddr_in*)data; + + out_target->sin_port = inet_htons(in_addr->port); + out_target->sin_family = domain_get(in_addr->domain); +#ifdef VITA + out_target->sin_addr = inet_aton(in_addr->server); +#else +#ifdef GEKKO + out_target->sin_len = 8; +#endif + + inet_ptrton(AF_INET, in_addr->server, &out_target->sin_addr); + +#endif +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_socket_ssl_bear.c
Added
@@ -0,0 +1,370 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_socket.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <net/net_socket_ssl.h> +#include <net/net_socket.h> +#include <encodings/base64.h> +#include <streams/file_stream.h> +#include <string/stdstring.h> + +#include "../../deps/bearssl-0.6/inc/bearssl.h" + +struct ssl_state +{ + int fd; + br_ssl_client_context sc; + br_x509_minimal_context xc; + uint8_t iobuf[BR_SSL_BUFSIZE_BIDI]; +}; + +/* TODO/FIXME - static global variables */ +static br_x509_trust_anchor TAs[500] = {}; +static size_t TAs_NUM = 0; + +static uint8_t* current_vdn; +static size_t current_vdn_size; + +static uint8_t* blobdup(const void * src, size_t len) +{ + uint8_t * ret = malloc(len); + memcpy(ret, src, len); + return ret; +} +static void vdn_append(void* dest_ctx, const void * src, size_t len) +{ + current_vdn = realloc(current_vdn, current_vdn_size + len); + memcpy(current_vdn+current_vdn_size, src, len); + current_vdn_size += len; +} + +static bool append_cert_x509(void* x509, size_t len) +{ + br_x509_pkey* pk; + br_x509_decoder_context dc; + br_x509_trust_anchor* ta = &TAs[TAs_NUM]; + + current_vdn = NULL; + current_vdn_size = 0; + + br_x509_decoder_init(&dc, vdn_append, NULL); + br_x509_decoder_push(&dc, x509, len); + pk = br_x509_decoder_get_pkey(&dc); + if (!pk || !br_x509_decoder_isCA(&dc)) + return false; + + ta->dn.len = current_vdn_size; + ta->dn.data = current_vdn; + ta->flags = BR_X509_TA_CA; + + switch (pk->key_type) + { + case BR_KEYTYPE_RSA: + ta->pkey.key_type = BR_KEYTYPE_RSA; + ta->pkey.key.rsa.nlen = pk->key.rsa.nlen; + ta->pkey.key.rsa.n = blobdup(pk->key.rsa.n, pk->key.rsa.nlen); + ta->pkey.key.rsa.elen = pk->key.rsa.elen; + ta->pkey.key.rsa.e = blobdup(pk->key.rsa.e, pk->key.rsa.elen); + break; + case BR_KEYTYPE_EC: + ta->pkey.key_type = BR_KEYTYPE_EC; + ta->pkey.key.ec.curve = pk->key.ec.curve; + ta->pkey.key.ec.qlen = pk->key.ec.qlen; + ta->pkey.key.ec.q = blobdup(pk->key.ec.q, pk->key.ec.qlen); + break; + default: + return false; + } + + TAs_NUM++; + return true; +} + +static char* delete_linebreaks(char* in) +{ + char* iter_in; + char* iter_out; + while (*in == '\n') + in++; + + iter_in = in; + + while (*iter_in != '\n' && *iter_in != '\0') + iter_in++; + iter_out = iter_in; + while (*iter_in != '\0') + { + while (*iter_in == '\n') + iter_in++; + *iter_out++ = *iter_in++; + } + + return in; +} + +/* this rearranges its input, it's easier to implement + * that way and caller doesn't need it anymore anyways */ +static void append_certs_pem_x509(char * certs_pem) +{ + void * cert_bin; + int cert_bin_len; + char *cert = certs_pem; + char *cert_end = certs_pem; + + for (;;) + { + cert = strstr(cert_end, "-----BEGIN CERTIFICATE-----"); + if (!cert) + break; + cert += STRLEN_CONST("-----BEGIN CERTIFICATE-----"); + cert_end = strstr(cert, "-----END CERTIFICATE-----"); + + *cert_end = '\0'; + cert = delete_linebreaks(cert); + + cert_bin = unbase64(cert, cert_end-cert, &cert_bin_len); + append_cert_x509(cert_bin, cert_bin_len); + free(cert_bin); + + cert_end++; /* skip the NUL we just added */ + } +} + +/* TODO: not thread safe, rthreads doesn't provide any + * statically allocatable mutex/etc */ +static void initialize(void) +{ + void* certs_pem; + if (TAs_NUM) + return; + /* filestream_read_file appends a NUL */ + filestream_read_file("/etc/ssl/certs/ca-certificates.crt", &certs_pem, NULL); + append_certs_pem_x509((char*)certs_pem); + free(certs_pem); +} + +void* ssl_socket_init(int fd, const char *domain) +{ + struct ssl_state *state = (struct ssl_state*)calloc(1, sizeof(*state)); + + initialize(); + + br_ssl_client_init_full(&state->sc, &state->xc, TAs, TAs_NUM); + br_ssl_engine_set_buffer(&state->sc.eng, + state->iobuf, sizeof(state->iobuf), true); + br_ssl_client_reset(&state->sc, domain, false); + + state->fd = fd; + return state; +} + +static bool process_inner(struct ssl_state *state, bool blocking) +{ + bool dummy; + size_t buflen; + ssize_t bytes; + uint8_t *buf = br_ssl_engine_sendrec_buf(&state->sc.eng, &buflen); + + if (buflen) + { + if (blocking) + bytes = (socket_send_all_blocking(state->fd, buf, buflen, true) + ? buflen + : -1); + else + bytes = socket_send_all_nonblocking(state->fd, buf, buflen, true); + + if (bytes > 0) + br_ssl_engine_sendrec_ack(&state->sc.eng, bytes); + if (bytes < 0) + return false; + /* if we did something, return immediately so we + * don't try to read if Bear still wants to send */ + return true; + } + + buf = br_ssl_engine_recvrec_buf(&state->sc.eng, &buflen); + if (buflen) + { + /* if the socket is blocking, socket_receive_all_nonblocking blocks, + * but only to read at least 1 byte which is exactly what we want */ + bytes = socket_receive_all_nonblocking(state->fd, &dummy, buf, buflen); + if (bytes > 0) + br_ssl_engine_recvrec_ack(&state->sc.eng, bytes); + if (bytes < 0) + return false; + } + + return true; +} + +int ssl_socket_connect(void *state_data, + void *data, bool timeout_enable, bool nonblock) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + unsigned bearstate; + + if (socket_connect(state->fd, data, timeout_enable)) + return -1; + + for (;;) + { + if (!process_inner(state, true)) + return -1; + + bearstate = br_ssl_engine_current_state(&state->sc.eng); + if (bearstate & BR_SSL_SENDAPP) + break; /* handshake done */ + if (bearstate & BR_SSL_CLOSED) + return -1; /* failed */ + } + + return 1; +} + +ssize_t ssl_socket_receive_all_nonblocking(void *state_data, + bool *error, void *data_, size_t size) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + uint8_t * bear_data; + size_t bear_data_size; + + socket_set_block(state->fd, false); + + if (!process_inner(state, false)) + { + *error = true; + return -1; + } + + bear_data = br_ssl_engine_recvapp_buf(&state->sc.eng, &bear_data_size); + if (bear_data_size > size) bear_data_size = size; + memcpy(data_, bear_data, bear_data_size); + if (bear_data_size) + br_ssl_engine_recvapp_ack(&state->sc.eng, bear_data_size); + + return bear_data_size; +} + +int ssl_socket_receive_all_blocking(void *state_data, + void *data_, size_t size) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + uint8_t *data = (uint8_t*)data_; + uint8_t * bear_data; + size_t bear_data_size; + + socket_set_block(state->fd, true); + + for (;;) + { + bear_data = br_ssl_engine_recvapp_buf(&state->sc.eng, &bear_data_size); + if (bear_data_size > size) + bear_data_size = size; + memcpy(data, bear_data, bear_data_size); + if (bear_data_size) + br_ssl_engine_recvapp_ack(&state->sc.eng, bear_data_size); + data += bear_data_size; + size -= bear_data_size; + + if (size) + process_inner(state, true); + else + break; + } + return 1; +} + +int ssl_socket_send_all_blocking(void *state_data, + const void *data_, size_t size, bool no_signal) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + const uint8_t *data = (const uint8_t*)data_; + uint8_t * bear_data; + size_t bear_data_size; + + socket_set_block(state->fd, true); + + for (;;) + { + bear_data = br_ssl_engine_sendapp_buf(&state->sc.eng, &bear_data_size); + if (bear_data_size > size) + bear_data_size = size; + memcpy(bear_data, data_, bear_data_size); + if (bear_data_size) + br_ssl_engine_sendapp_ack(&state->sc.eng, bear_data_size); + data += bear_data_size; + size -= bear_data_size; + + if (size) + process_inner(state, true); + else + break; + } + + br_ssl_engine_flush(&state->sc.eng, false); + process_inner(state, false); + return 1; +} + +ssize_t ssl_socket_send_all_nonblocking(void *state_data, + const void *data_, size_t size, bool no_signal) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + uint8_t * bear_data; + size_t bear_data_size; + + socket_set_block(state->fd, false); + + bear_data = br_ssl_engine_sendapp_buf(&state->sc.eng, &bear_data_size); + if (bear_data_size > size) + bear_data_size = size; + memcpy(bear_data, data_, bear_data_size); + if (bear_data_size) + { + br_ssl_engine_sendapp_ack(&state->sc.eng, bear_data_size); + br_ssl_engine_flush(&state->sc.eng, false); + } + + if (!process_inner(state, false)) + return -1; + + return bear_data_size; +} + +void ssl_socket_close(void *state_data) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + + br_ssl_engine_close(&state->sc.eng); + process_inner(state, false); /* send close notification */ + socket_close(state->fd); /* but immediately close socket + and don't worry about recipient + getting our message */ +} + +void ssl_socket_free(void *state_data) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + /* BearSSL does zero allocations of its own, + * so other than this struct, there is nothing to free */ + free(state); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/net/net_socket_ssl_mbed.c
Added
@@ -0,0 +1,279 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_socket.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <string.h> +#include <net/net_compat.h> +#include <net/net_socket.h> +#include <net/net_socket_ssl.h> + +#if defined(HAVE_BUILTINMBEDTLS) +#include "../../deps/mbedtls/mbedtls/config.h" +#include "../../deps/mbedtls/mbedtls/certs.h" +#include "../../deps/mbedtls/mbedtls/debug.h" +#include "../../deps/mbedtls/mbedtls/platform.h" +#include "../../deps/mbedtls/mbedtls/net_sockets.h" +#include "../../deps/mbedtls/mbedtls/ssl.h" +#include "../../deps/mbedtls/mbedtls/ctr_drbg.h" +#include "../../deps/mbedtls/mbedtls/entropy.h" +#else +#include <mbedtls/config.h> +#include <mbedtls/certs.h> +#include <mbedtls/debug.h> +#include <mbedtls/platform.h> +#include <mbedtls/net_sockets.h> +#include <mbedtls/ssl.h> +#include <mbedtls/ctr_drbg.h> +#include <mbedtls/entropy.h> +#endif + +/* Not part of the mbedtls upstream source */ +#include "../../deps/mbedtls/cacert.h" + +#define DEBUG_LEVEL 0 + +struct ssl_state +{ + mbedtls_net_context net_ctx; + mbedtls_ssl_context ctx; + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_ssl_config conf; +#if defined(MBEDTLS_X509_CRT_PARSE_C) + mbedtls_x509_crt ca; +#endif + const char *domain; +}; + +static void ssl_debug(void *ctx, int level, + const char *file, int line, + const char *str) +{ + fprintf((FILE*)ctx, "%s:%04d: %s", file, line, str); + fflush((FILE*)ctx); +} + +void* ssl_socket_init(int fd, const char *domain) +{ + static const char *pers = "libretro"; + struct ssl_state *state = (struct ssl_state*)calloc(1, sizeof(*state)); + + state->domain = domain; + +#if defined(MBEDTLS_DEBUG_C) + mbedtls_debug_set_threshold(DEBUG_LEVEL); +#endif + + mbedtls_net_init(&state->net_ctx); + mbedtls_ssl_init(&state->ctx); + mbedtls_ssl_config_init(&state->conf); +#if defined(MBEDTLS_X509_CRT_PARSE_C) + mbedtls_x509_crt_init(&state->ca); +#endif + mbedtls_ctr_drbg_init(&state->ctr_drbg); + mbedtls_entropy_init(&state->entropy); + + state->net_ctx.fd = fd; + + if (mbedtls_ctr_drbg_seed(&state->ctr_drbg, mbedtls_entropy_func, &state->entropy, (const unsigned char*)pers, strlen(pers)) != 0) + goto error; + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + if (mbedtls_x509_crt_parse(&state->ca, (const unsigned char*)cacert_pem, sizeof(cacert_pem) / sizeof(cacert_pem[0])) < 0) + goto error; +#endif + + return state; + +error: + if (state) + free(state); + return NULL; +} + +int ssl_socket_connect(void *state_data, + void *data, bool timeout_enable, bool nonblock) +{ + int ret, flags; + struct ssl_state *state = (struct ssl_state*)state_data; + + if (socket_connect(state->net_ctx.fd, data, timeout_enable)) + return -1; + + if (mbedtls_ssl_config_defaults(&state->conf, + MBEDTLS_SSL_IS_CLIENT, + MBEDTLS_SSL_TRANSPORT_STREAM, + MBEDTLS_SSL_PRESET_DEFAULT) != 0) + return -1; + + mbedtls_ssl_conf_authmode(&state->conf, MBEDTLS_SSL_VERIFY_OPTIONAL); + mbedtls_ssl_conf_ca_chain(&state->conf, &state->ca, NULL); + mbedtls_ssl_conf_rng(&state->conf, mbedtls_ctr_drbg_random, &state->ctr_drbg); + mbedtls_ssl_conf_dbg(&state->conf, ssl_debug, stderr); + + if (mbedtls_ssl_setup(&state->ctx, &state->conf) != 0) + return -1; + +#if defined(MBEDTLS_X509_CRT_PARSE_C) + if (mbedtls_ssl_set_hostname(&state->ctx, state->domain) != 0) + return -1; +#endif + + mbedtls_ssl_set_bio(&state->ctx, &state->net_ctx, mbedtls_net_send, mbedtls_net_recv, NULL); + + while ((ret = mbedtls_ssl_handshake(&state->ctx)) != 0) + { + if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) + return -1; + } + + if ((flags = mbedtls_ssl_get_verify_result(&state->ctx)) != 0) + { + char vrfy_buf[512]; + mbedtls_x509_crt_verify_info(vrfy_buf, sizeof(vrfy_buf), " ! ", flags); + } + + return state->net_ctx.fd; +} + +ssize_t ssl_socket_receive_all_nonblocking(void *state_data, + bool *error, void *data_, size_t size) +{ + ssize_t ret; + struct ssl_state *state = (struct ssl_state*)state_data; + const uint8_t *data = (const uint8_t*)data_; + /* mbedtls_ssl_read wants non-const data but it only reads it, so this cast is safe */ + + mbedtls_net_set_nonblock(&state->net_ctx); + + ret = mbedtls_ssl_read(&state->ctx, (unsigned char*)data, size); + + if (ret > 0) + return ret; + + if (ret == 0) + { + /* Socket closed */ + *error = true; + return -1; + } + + if (isagain((int)ret) || ret == MBEDTLS_ERR_SSL_WANT_READ) + return 0; + + *error = true; + return -1; +} + +int ssl_socket_receive_all_blocking(void *state_data, + void *data_, size_t size) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + const uint8_t *data = (const uint8_t*)data_; + + mbedtls_net_set_block(&state->net_ctx); + + for (;;) + { + /* mbedtls_ssl_read wants non-const data but it only reads it, + * so this cast is safe */ + int ret = mbedtls_ssl_read(&state->ctx, (unsigned char*)data, size); + + if ( ret == MBEDTLS_ERR_SSL_WANT_READ || + ret == MBEDTLS_ERR_SSL_WANT_WRITE) + continue; + + if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) + break; + + if (ret == 0) + break; /* normal EOF */ + + if (ret < 0) + return -1; + } + + return 1; +} + +int ssl_socket_send_all_blocking(void *state_data, + const void *data_, size_t size, bool no_signal) +{ + int ret; + struct ssl_state *state = (struct ssl_state*)state_data; + const uint8_t *data = (const uint8_t*)data_; + + mbedtls_net_set_block(&state->net_ctx); + + while ((ret = mbedtls_ssl_write(&state->ctx, data, size)) <= 0) + { + if ( ret != MBEDTLS_ERR_SSL_WANT_READ && + ret != MBEDTLS_ERR_SSL_WANT_WRITE) + return false; + } + + return true; +} + +ssize_t ssl_socket_send_all_nonblocking(void *state_data, + const void *data_, size_t size, bool no_signal) +{ + int ret; + ssize_t sent = size; + struct ssl_state *state = (struct ssl_state*)state_data; + const uint8_t *data = (const uint8_t*)data_; + + mbedtls_net_set_nonblock(&state->net_ctx); + + ret = mbedtls_ssl_write(&state->ctx, data, size); + + if (ret <= 0) + return -1; + + return sent; +} + +void ssl_socket_close(void *state_data) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + + mbedtls_ssl_close_notify(&state->ctx); + + socket_close(state->net_ctx.fd); +} + +void ssl_socket_free(void *state_data) +{ + struct ssl_state *state = (struct ssl_state*)state_data; + + if (!state) + return; + + mbedtls_ssl_free(&state->ctx); + mbedtls_ssl_config_free(&state->conf); + mbedtls_ctr_drbg_free(&state->ctr_drbg); + mbedtls_entropy_free(&state->entropy); +#if defined(MBEDTLS_X509_CRT_PARSE_C) + mbedtls_x509_crt_free(&state->ca); +#endif + + free(state); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/playlists
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/playlists/label_sanitization.c
Added
@@ -0,0 +1,198 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (label_sanitization.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <playlists/label_sanitization.h> +#include <compat/strl.h> +#include <retro_miscellaneous.h> +#include <string/stdstring.h> +#include <string.h> + +#define DISC_STRINGS_LENGTH 3 +#define REGION_STRINGS_LENGTH 20 + +const char *disc_strings[DISC_STRINGS_LENGTH] = { + "(CD", + "(Disc", + "(Disk" +}; + +/* + * We'll use the standard No-Intro regions for now. + */ +const char *region_strings[REGION_STRINGS_LENGTH] = { + "(Australia)", /* Don’t use with Europe */ + "(Brazil)", + "(Canada)", /* Don’t use with USA */ + "(China)", + "(France)", + "(Germany)", + "(Hong Kong)", + "(Italy)", + "(Japan)", + "(Korea)", + "(Netherlands)", + "(Spain)", + "(Sweden)", + "(USA)", /* Includes Canada */ + "(World)", + "(Europe)", /* Includes Australia */ + "(Asia)", + "(Japan, USA)", + "(Japan, Europe)", + "(USA, Europe)" +}; + +/* + * Does not work with nested blocks. + */ +void label_sanitize(char *label, bool (*left)(char*), bool (*right)(char*)) +{ + bool copy = true; + int rindex = 0; + int lindex = 0; + char new_label[PATH_MAX_LENGTH]; + + for (; lindex < PATH_MAX_LENGTH && label[lindex] != '\0'; lindex++) + { + if (copy) + { + /* check for the start of the range */ + if ((*left)(&label[lindex])) + copy = false; + + if (copy) + new_label[rindex++] = label[lindex]; + } + else if ((*right)(&label[lindex])) + copy = true; + } + + new_label[rindex] = '\0'; + + strlcpy(label, new_label, PATH_MAX_LENGTH); +} + +static bool left_parens(char *left) +{ + return left[0] == '('; +} + +static bool right_parens(char *right) +{ + return right[0] == ')'; +} + +static bool left_brackets(char *left) +{ + return left[0] == '['; +} + +static bool right_brackets(char *right) +{ + return right[0] == ']'; +} + +static bool left_parens_or_brackets(char *left) +{ + return left[0] == '(' || left[0] == '['; +} + +static bool right_parens_or_brackets(char *right) +{ + return right[0] == ')' || right[0] == ']'; +} + +static bool left_exclusion(char *left, + const char **strings, const size_t strings_count) +{ + unsigned i; + char exclusion_string[32]; + char comparison_string[32]; + + strlcpy(exclusion_string, left, sizeof(exclusion_string)); + string_to_upper(exclusion_string); + + for (i = 0; i < (unsigned)strings_count; i++) + { + strlcpy(comparison_string, strings[i], sizeof(comparison_string)); + string_to_upper(comparison_string); + + if (string_starts_with(exclusion_string, + comparison_string)) + return true; + } + + return false; +} + +static bool left_parens_or_brackets_excluding_region(char *left) +{ + return left_parens_or_brackets(left) + && !left_exclusion(left, region_strings, REGION_STRINGS_LENGTH); +} + +static bool left_parens_or_brackets_excluding_disc(char *left) +{ + return left_parens_or_brackets(left) + && !left_exclusion(left, disc_strings, DISC_STRINGS_LENGTH); +} + +static bool left_parens_or_brackets_excluding_region_or_disc(char *left) +{ + return left_parens_or_brackets(left) + && !left_exclusion(left, region_strings, REGION_STRINGS_LENGTH) + && !left_exclusion(left, disc_strings, DISC_STRINGS_LENGTH); +} + +void label_remove_parens(char *label) +{ + label_sanitize(label, left_parens, right_parens); +} + +void label_remove_brackets(char *label) +{ + label_sanitize(label, left_brackets, right_brackets); +} + +void label_remove_parens_and_brackets(char *label) +{ + label_sanitize(label, left_parens_or_brackets, + right_parens_or_brackets); +} + +void label_keep_region(char *label) +{ + label_sanitize(label, left_parens_or_brackets_excluding_region, + right_parens_or_brackets); +} + +void label_keep_disc(char *label) +{ + label_sanitize(label, left_parens_or_brackets_excluding_disc, + right_parens_or_brackets); +} + +void label_keep_region_and_disc(char *label) +{ + label_sanitize(label, left_parens_or_brackets_excluding_region_or_disc, + right_parens_or_brackets); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/queues
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/queues/fifo_queue.c
Added
@@ -0,0 +1,126 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (fifo_queue.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> +#include <string.h> + +#include <retro_common_api.h> +#include <retro_inline.h> +#include <boolean.h> + +#include <queues/fifo_queue.h> + +static bool fifo_initialize_internal(fifo_buffer_t *buf, size_t size) +{ + uint8_t *buffer = (uint8_t*)calloc(1, size + 1); + + if (!buffer) + return false; + + buf->buffer = buffer; + buf->size = size + 1; + buf->first = 0; + buf->end = 0; + + return true; +} + +bool fifo_initialize(fifo_buffer_t *buf, size_t size) +{ + if (!buf) + return false; + return fifo_initialize_internal(buf, size); +} + +void fifo_free(fifo_buffer_t *buffer) +{ + if (!buffer) + return; + + free(buffer->buffer); + free(buffer); +} + +bool fifo_deinitialize(fifo_buffer_t *buffer) +{ + if (!buffer) + return false; + + if (buffer->buffer) + free(buffer->buffer); + buffer->buffer = NULL; + buffer->size = 0; + buffer->first = 0; + buffer->end = 0; + + return true; +} + +fifo_buffer_t *fifo_new(size_t size) +{ + fifo_buffer_t *buf = (fifo_buffer_t*)malloc(sizeof(*buf)); + + if (!buf) + return NULL; + + if (!fifo_initialize_internal(buf, size)) + { + free(buf); + return NULL; + } + + return buf; +} + +void fifo_write(fifo_buffer_t *buffer, const void *in_buf, size_t size) +{ + size_t first_write = size; + size_t rest_write = 0; + + if (buffer->end + size > buffer->size) + { + first_write = buffer->size - buffer->end; + rest_write = size - first_write; + } + + memcpy(buffer->buffer + buffer->end, in_buf, first_write); + memcpy(buffer->buffer, (const uint8_t*)in_buf + first_write, rest_write); + + buffer->end = (buffer->end + size) % buffer->size; +} + +void fifo_read(fifo_buffer_t *buffer, void *in_buf, size_t size) +{ + size_t first_read = size; + size_t rest_read = 0; + + if (buffer->first + size > buffer->size) + { + first_read = buffer->size - buffer->first; + rest_read = size - first_read; + } + + memcpy(in_buf, (const uint8_t*)buffer->buffer + buffer->first, first_read); + memcpy((uint8_t*)in_buf + first_read, buffer->buffer, rest_read); + + buffer->first = (buffer->first + size) % buffer->size; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/queues/generic_queue.c
Added
@@ -0,0 +1,303 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (generic_queue.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <boolean.h> +#include <stddef.h> +#include <stdlib.h> + +#include <queues/generic_queue.h> + +struct generic_queue_item_t +{ + void *value; + struct generic_queue_item_t *previous; + struct generic_queue_item_t *next; +}; + +struct generic_queue +{ + struct generic_queue_item_t *first_item; + struct generic_queue_item_t *last_item; + size_t length; +}; + +struct generic_queue_iterator +{ + generic_queue_t *queue; + struct generic_queue_item_t *item; + bool forward; +}; + +generic_queue_t *generic_queue_new(void) +{ + return (generic_queue_t *)calloc(1, sizeof(generic_queue_t)); +} + +void generic_queue_free(generic_queue_t *queue, void (*free_value)(void *value)) +{ + struct generic_queue_item_t *next_item; + + if (!queue) + return; + + while (queue->first_item) + { + if (free_value) + free_value(queue->first_item->value); + + next_item = queue->first_item->next; + free(queue->first_item); + queue->first_item = next_item; + } + + free(queue); +} + +void generic_queue_push(generic_queue_t *queue, void *value) +{ + struct generic_queue_item_t *new_item; + + new_item = (struct generic_queue_item_t *)calloc(1, sizeof(struct generic_queue_item_t)); + new_item->value = value; + new_item->previous = queue->last_item; + new_item->next = NULL; + + queue->last_item = new_item; + queue->length++; + + if (!queue->first_item) + queue->first_item = new_item; + else + new_item->previous->next = new_item; +} + +void *generic_queue_pop(generic_queue_t *queue) +{ + void *value; + struct generic_queue_item_t *item; + + if (!queue || !queue->last_item) + return NULL; + + item = queue->last_item; + queue->last_item = queue->last_item->previous; + queue->length--; + + if (queue->length == 0) + queue->first_item = NULL; + + value = item->value; + free(item); + + return value; +} + +void *generic_queue_peek(generic_queue_t *queue) +{ + if (!queue || !queue->last_item) + return NULL; + + return queue->last_item->value; +} + +void *generic_queue_peek_first(generic_queue_t *queue) +{ + if (!queue || !queue->first_item) + return NULL; + + return queue->first_item->value; +} + +void generic_queue_shift(generic_queue_t *queue, void *value) +{ + struct generic_queue_item_t *new_item; + + if (!queue) + return; + + new_item = (struct generic_queue_item_t *)calloc(1, sizeof(struct generic_queue_item_t)); + new_item->value = value; + new_item->previous = NULL; + new_item->next = queue->first_item; + + queue->first_item = new_item; + queue->length++; + + if (!queue->last_item) + queue->last_item = new_item; + else + new_item->next->previous = new_item; +} + +void *generic_queue_unshift(generic_queue_t *queue) +{ + void *value; + struct generic_queue_item_t *item; + + if (!queue || !queue->first_item) + return NULL; + + item = queue->first_item; + queue->first_item = queue->first_item->next; + queue->length--; + + if (queue->length == 0) + queue->last_item = NULL; + + value = item->value; + free(item); + + return value; +} + +size_t generic_queue_length(generic_queue_t *queue) +{ + if (queue) + return queue->length; + + return 0; +} + +void *generic_queue_remove(generic_queue_t *queue, void *value) +{ + struct generic_queue_item_t *item; + + if (!queue) + return NULL; + + for (item = queue->first_item; item; item = item->next) + { + if (item->value == value) + { + if (item->previous) + item->previous->next = item->next; + else + queue->first_item = item->next; + + if (item->next) + item->next->previous = item->previous; + else + queue->last_item = item->previous; + + free(item); + queue->length--; + + return value; + } + } + + return NULL; +} + +generic_queue_iterator_t *generic_queue_iterator(generic_queue_t *queue, bool forward) +{ + if (queue && queue->first_item) + { + generic_queue_iterator_t *iterator; + + iterator = (generic_queue_iterator_t *)malloc(sizeof(generic_queue_iterator_t)); + iterator->queue = queue; + iterator->item = forward ? queue->first_item : queue->last_item; + iterator->forward = forward; + + return iterator; + } + + return NULL; +} + +generic_queue_iterator_t *generic_queue_iterator_next(generic_queue_iterator_t *iterator) +{ + if (iterator) + { + struct generic_queue_item_t *item; + + item = iterator->forward ? iterator->item->next : iterator->item->previous; + if (item) + { + iterator->item = item; + return iterator; + } else + { + free(iterator); + return NULL; + } + } + + return NULL; +} + +void *generic_queue_iterator_value(generic_queue_iterator_t *iterator) +{ + if (iterator) + return iterator->item->value; + + return NULL; +} + +generic_queue_iterator_t *generic_queue_iterator_remove(generic_queue_iterator_t *iterator) +{ + struct generic_queue_item_t *item; + + if (!iterator) + return NULL; + + item = iterator->forward ? iterator->queue->first_item : iterator->queue->last_item; + while (item) + { + if (iterator->item == item) + { + if (iterator->queue->first_item == item) + iterator->queue->first_item = item->next; + else + item->previous->next = item->next; + + if (iterator->queue->last_item == item) + iterator->queue->last_item = item->previous; + else + item->next->previous = item->previous; + + iterator->queue->length--; + + iterator->item = iterator->forward ? item->next : item->previous; + free(item); + if (iterator->item) + { + return iterator; + } else + { + free(iterator); + return NULL; + } + } + + item = iterator->forward ? item->next : item->previous; + } + + return iterator; +} + +void generic_queue_iterator_free(generic_queue_iterator_t *iterator) +{ + if (iterator) + free(iterator); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/queues/message_queue.c
Added
@@ -0,0 +1,351 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (message_queue.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> +#include <string.h> + +#include <boolean.h> +#include <queues/message_queue.h> +#include <compat/strl.h> +#include <compat/posix_string.h> + +static bool msg_queue_initialize_internal(msg_queue_t *queue, size_t size) +{ + struct queue_elem **elems = (struct queue_elem**)calloc(size + 1, + sizeof(struct queue_elem*)); + + if (!elems) + return false; + + queue->tmp_msg = NULL; + queue->elems = elems; + queue->ptr = 1; + queue->size = size + 1; + + return true; +} + +/** + * msg_queue_new: + * @size : maximum size of message + * + * Creates a message queue with maximum size different messages. + * + * Returns: NULL if allocation error, pointer to a message queue + * if successful. Has to be freed manually. + **/ +msg_queue_t *msg_queue_new(size_t size) +{ + msg_queue_t *queue = (msg_queue_t*)malloc(sizeof(*queue)); + + if (!queue) + return NULL; + + if (!msg_queue_initialize_internal(queue, size)) + { + free(queue); + return NULL; + } + + return queue; +} + +bool msg_queue_initialize(msg_queue_t *queue, size_t size) +{ + if (!queue) + return false; + return msg_queue_initialize_internal(queue, size); +} + +/** + * msg_queue_free: + * @queue : pointer to queue object + * + * Frees message queue.. + **/ +void msg_queue_free(msg_queue_t *queue) +{ + if (!queue) + return; + msg_queue_clear(queue); + free(queue->elems); + free(queue); +} + +bool msg_queue_deinitialize(msg_queue_t *queue) +{ + if (!queue) + return false; + msg_queue_clear(queue); + free(queue->elems); + queue->elems = NULL; + queue->tmp_msg = NULL; + queue->ptr = 0; + queue->size = 0; + return true; +} + +/** + * msg_queue_push: + * @queue : pointer to queue object + * @msg : message to add to the queue + * @prio : priority level of the message + * @duration : how many times the message can be pulled + * before it vanishes (E.g. show a message for + * 3 seconds @ 60fps = 180 duration). + * + * Push a new message onto the queue. + **/ +void msg_queue_push(msg_queue_t *queue, const char *msg, + unsigned prio, unsigned duration, + char *title, + enum message_queue_icon icon, enum message_queue_category category) +{ + size_t tmp_ptr = 0; + struct queue_elem *new_elem = NULL; + + if (!queue || queue->ptr >= queue->size) + return; + + new_elem = (struct queue_elem*)malloc( + sizeof(struct queue_elem)); + if (!new_elem) + return; + + new_elem->duration = duration; + new_elem->prio = prio; + new_elem->msg = msg ? strdup(msg) : NULL; + new_elem->title = title ? strdup(title) : NULL; + new_elem->icon = icon; + new_elem->category = category; + + queue->elems[queue->ptr] = new_elem; + + tmp_ptr = queue->ptr++; + + while (tmp_ptr > 1) + { + struct queue_elem *parent = queue->elems[tmp_ptr >> 1]; + struct queue_elem *child = queue->elems[tmp_ptr]; + + if (child->prio <= parent->prio) + break; + + queue->elems[tmp_ptr >> 1] = child; + queue->elems[tmp_ptr] = parent; + + tmp_ptr >>= 1; + } +} + +/** + * msg_queue_clear: + * @queue : pointer to queue object + * + * Clears out everything in the queue. + **/ +void msg_queue_clear(msg_queue_t *queue) +{ + size_t i; + + if (!queue) + return; + + for (i = 1; i < queue->ptr; i++) + { + if (queue->elems[i]) + { + free(queue->elems[i]->msg); + free(queue->elems[i]->title); + free(queue->elems[i]); + queue->elems[i] = NULL; + } + } + queue->ptr = 1; + free(queue->tmp_msg); + queue->tmp_msg = NULL; +} + +/** + * msg_queue_pull: + * @queue : pointer to queue object + * + * Pulls highest priority message in queue. + * + * Returns: NULL if no message in queue, otherwise a string + * containing the message. + **/ +const char *msg_queue_pull(msg_queue_t *queue) +{ + struct queue_elem *front = NULL, *last = NULL; + size_t tmp_ptr = 1; + + (void)tmp_ptr; + + /* Nothing in queue. */ + if (!queue || queue->ptr == 1) + return NULL; + + front = (struct queue_elem*)queue->elems[1]; + front->duration--; + if (front->duration > 0) + return front->msg; + + free(queue->tmp_msg); + queue->tmp_msg = front->msg; + front->msg = NULL; + + last = (struct queue_elem*)queue->elems[--queue->ptr]; + queue->elems[1] = last; + free(front->title); + free(front); + + for (;;) + { + struct queue_elem *parent = NULL; + struct queue_elem *child = NULL; + size_t switch_index = tmp_ptr; + bool left = (tmp_ptr * 2 <= queue->ptr) + && (queue->elems[tmp_ptr] < queue->elems[tmp_ptr * 2]); + bool right = (tmp_ptr * 2 + 1 <= queue->ptr) + && (queue->elems[tmp_ptr] < queue->elems[tmp_ptr * 2 + 1]); + + if (!left && !right) + break; + + if (left && !right) + switch_index <<= 1; + else if (right && !left) + switch_index += switch_index + 1; + else + { + if (queue->elems[tmp_ptr * 2] + >= queue->elems[tmp_ptr * 2 + 1]) + switch_index <<= 1; + else + switch_index += switch_index + 1; + } + + parent = (struct queue_elem*)queue->elems[tmp_ptr]; + child = (struct queue_elem*)queue->elems[switch_index]; + queue->elems[tmp_ptr] = child; + queue->elems[switch_index] = parent; + tmp_ptr = switch_index; + } + + return queue->tmp_msg; +} + +/** + * msg_queue_extract: + * @queue : pointer to queue object + * @queue_entry : pointer to external queue entry struct + * + * Removes highest priority message from queue, copying + * contents into queue_entry struct. + * + * Returns: false if no messages in queue, otherwise true + **/ +bool msg_queue_extract(msg_queue_t *queue, msg_queue_entry_t *queue_entry) +{ + struct queue_elem *front = NULL, *last = NULL; + size_t tmp_ptr = 1; + + /* Ensure arguments are valid and queue is not + * empty */ + if (!queue || queue->ptr == 1 || !queue_entry) + return false; + + front = (struct queue_elem*)queue->elems[1]; + last = (struct queue_elem*)queue->elems[--queue->ptr]; + queue->elems[1] = last; + + /* Copy element parameters */ + queue_entry->duration = front->duration; + queue_entry->prio = front->prio; + queue_entry->icon = front->icon; + queue_entry->category = front->category; + queue_entry->msg[0] = '\0'; + queue_entry->title[0] = '\0'; + + if (front->msg) + strlcpy(queue_entry->msg, front->msg, sizeof(queue_entry->msg)); + + if (front->title) + strlcpy(queue_entry->title, front->title, sizeof(queue_entry->title)); + + /* Delete element */ + free(front->msg); + free(front->title); + free(front); + + for (;;) + { + struct queue_elem *parent = NULL; + struct queue_elem *child = NULL; + size_t switch_index = tmp_ptr; + bool left = (tmp_ptr * 2 <= queue->ptr) + && (queue->elems[tmp_ptr] < queue->elems[tmp_ptr * 2]); + bool right = (tmp_ptr * 2 + 1 <= queue->ptr) + && (queue->elems[tmp_ptr] < queue->elems[tmp_ptr * 2 + 1]); + + if (!left && !right) + break; + + if (left && !right) + switch_index <<= 1; + else if (right && !left) + switch_index += switch_index + 1; + else + { + if (queue->elems[tmp_ptr * 2] + >= queue->elems[tmp_ptr * 2 + 1]) + switch_index <<= 1; + else + switch_index += switch_index + 1; + } + + parent = (struct queue_elem*)queue->elems[tmp_ptr]; + child = (struct queue_elem*)queue->elems[switch_index]; + queue->elems[tmp_ptr] = child; + queue->elems[switch_index] = parent; + tmp_ptr = switch_index; + } + + return true; +} + +/** + * msg_queue_size: + * @queue : pointer to queue object + * + * Fetches number of messages in queue. + * + * Returns: Number of messages in queue. + **/ +size_t msg_queue_size(msg_queue_t *queue) +{ + if (!queue || queue->ptr <= 1) + return 0; + + return queue->ptr - 1; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/queues/task_queue.c
Added
@@ -0,0 +1,918 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (task_queue.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> + +#include <queues/task_queue.h> + +#include <features/features_cpu.h> + +#ifdef HAVE_THREADS +#include <rthreads/rthreads.h> +#define SLOCK_LOCK(x) slock_lock(x) +#define SLOCK_UNLOCK(x) slock_unlock(x) +#else +#define SLOCK_LOCK(x) +#define SLOCK_UNLOCK(x) +#endif + +typedef struct +{ + retro_task_t *front; + retro_task_t *back; +} task_queue_t; + +struct retro_task_impl +{ + retro_task_queue_msg_t msg_push; + void (*push_running)(retro_task_t *); + void (*cancel)(void *); + void (*reset)(void); + void (*wait)(retro_task_condition_fn_t, void *); + void (*gather)(void); + bool (*find)(retro_task_finder_t, void*); + void (*retrieve)(task_retriever_data_t *data); + void (*init)(void); + void (*deinit)(void); +}; + +/* TODO/FIXME - static globals */ +static retro_task_queue_msg_t msg_push_bak = NULL; +static task_queue_t tasks_running = {NULL, NULL}; +static task_queue_t tasks_finished = {NULL, NULL}; + +static struct retro_task_impl *impl_current = NULL; +static bool task_threaded_enable = false; + +#ifdef HAVE_THREADS +static slock_t *running_lock = NULL; +static slock_t *finished_lock = NULL; +static slock_t *property_lock = NULL; +static slock_t *queue_lock = NULL; +static scond_t *worker_cond = NULL; +static sthread_t *worker_thread = NULL; +static bool worker_continue = true; +/* use running_lock when touching it */ +#endif + +static void task_queue_msg_push(retro_task_t *task, + unsigned prio, unsigned duration, + bool flush, const char *fmt, ...) +{ + char buf[1024]; + va_list ap; + + buf[0] = '\0'; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + + if (impl_current->msg_push) + impl_current->msg_push(task, buf, prio, duration, flush); +} + +static void task_queue_push_progress(retro_task_t *task) +{ + if (task->title && !task->mute) + { + if (task->finished) + { + if (task->error) + task_queue_msg_push(task, 1, 60, true, "%s: %s", + "Task failed", task->title); + else + task_queue_msg_push(task, 1, 60, false, "100%%: %s", task->title); + } + else + { + if (task->progress >= 0 && task->progress <= 100) + task_queue_msg_push(task, 1, 60, true, "%i%%: %s", + task->progress, task->title); + else + task_queue_msg_push(task, 1, 60, false, "%s...", task->title); + } + + if (task->progress_cb) + task->progress_cb(task); + } +} + +static void task_queue_put(task_queue_t *queue, retro_task_t *task) +{ + task->next = NULL; + + if (queue->front) + { + /* Make sure to insert in order - the queue is + * sorted by 'when' so items that aren't scheduled + * to run immediately are at the back of the queue. + * Items with the same 'when' are inserted after + * all the other items with the same 'when'. + * This primarily affects items with a 'when' of 0. + */ + if (queue->back) + { + if (queue->back->when > task->when) + { + retro_task_t** prev = &queue->front; + while (*prev && (*prev)->when <= task->when) + prev = &((*prev)->next); + + task->next = *prev; + *prev = task; + return; + } + + queue->back->next = task; + } + } + else + queue->front = task; + + queue->back = task; +} + +static retro_task_t *task_queue_get(task_queue_t *queue) +{ + retro_task_t *task = queue->front; + + if (task) + { + queue->front = task->next; + task->next = NULL; + } + + return task; +} + +static void retro_task_internal_gather(void) +{ + retro_task_t *task = NULL; + while ((task = task_queue_get(&tasks_finished))) + { + task_queue_push_progress(task); + + if (task->callback) + task->callback(task, task->task_data, task->user_data, task->error); + + if (task->cleanup) + task->cleanup(task); + + if (task->error) + free(task->error); + + if (task->title) + free(task->title); + + free(task); + } +} + +static void retro_task_regular_push_running(retro_task_t *task) +{ + task_queue_put(&tasks_running, task); +} + +static void retro_task_regular_cancel(void *task) +{ + retro_task_t *t = (retro_task_t*)task; + t->cancelled = true; +} + +static void retro_task_regular_gather(void) +{ + retro_task_t *task = NULL; + retro_task_t *queue = NULL; + retro_task_t *next = NULL; + + while ((task = task_queue_get(&tasks_running))) + { + task->next = queue; + queue = task; + } + + for (task = queue; task; task = next) + { + next = task->next; + + if (!task->when || task->when < cpu_features_get_time_usec()) + { + task->handler(task); + + task_queue_push_progress(task); + } + + if (task->finished) + task_queue_put(&tasks_finished, task); + else + retro_task_regular_push_running(task); + } + + retro_task_internal_gather(); +} + +static void retro_task_regular_wait(retro_task_condition_fn_t cond, void* data) +{ + while ((tasks_running.front && !tasks_running.front->when) && (!cond || cond(data))) + retro_task_regular_gather(); +} + +static void retro_task_regular_reset(void) +{ + retro_task_t *task = tasks_running.front; + + for (; task; task = task->next) + task->cancelled = true; +} + +static void retro_task_regular_init(void) { } +static void retro_task_regular_deinit(void) { } + +static bool retro_task_regular_find(retro_task_finder_t func, void *user_data) +{ + retro_task_t *task = tasks_running.front; + + for (; task; task = task->next) + { + if (func(task, user_data)) + return true; + } + + return false; +} + +static void retro_task_regular_retrieve(task_retriever_data_t *data) +{ + retro_task_t *task = NULL; + task_retriever_info_t *tail = NULL; + + /* Parse all running tasks and handle matching handlers */ + for (task = tasks_running.front; task != NULL; task = task->next) + { + task_retriever_info_t *info = NULL; + if (task->handler != data->handler) + continue; + + /* Create new link */ + info = (task_retriever_info_t*) + malloc(sizeof(task_retriever_info_t)); + info->data = malloc(data->element_size); + info->next = NULL; + + /* Call retriever function and fill info-specific data */ + if (!data->func(task, info->data)) + { + free(info->data); + free(info); + continue; + } + + /* Add link to list */ + if (data->list) + { + if (tail) + { + tail->next = info; + tail = tail->next; + } + else + tail = info; + } + else + { + data->list = info; + tail = data->list; + } + } +} + +static struct retro_task_impl impl_regular = { + NULL, + retro_task_regular_push_running, + retro_task_regular_cancel, + retro_task_regular_reset, + retro_task_regular_wait, + retro_task_regular_gather, + retro_task_regular_find, + retro_task_regular_retrieve, + retro_task_regular_init, + retro_task_regular_deinit +}; + +#ifdef HAVE_THREADS + +/* 'queue_lock' must be held for the duration of this function */ +static void task_queue_remove(task_queue_t *queue, retro_task_t *task) +{ + retro_task_t *t = NULL; + retro_task_t *front = NULL; + + front = queue->front; + + /* Remove first element if needed */ + if (task == front) + { + queue->front = task->next; + if (queue->back == task) /* if only element, also update back */ + queue->back = NULL; + task->next = NULL; + return; + } + + /* Parse queue */ + t = front; + + while (t && t->next) + { + /* Remove task and update queue */ + if (t->next == task) + { + t->next = task->next; + task->next = NULL; + + /* When removing the tail of the queue, update the tail pointer */ + if (queue->back == task) + { + if (queue->back == task) + queue->back = t; + } + break; + } + + /* Update iterator */ + t = t->next; + } +} + +static void retro_task_threaded_push_running(retro_task_t *task) +{ + slock_lock(running_lock); + slock_lock(queue_lock); + task_queue_put(&tasks_running, task); + scond_signal(worker_cond); + slock_unlock(queue_lock); + slock_unlock(running_lock); +} + +static void retro_task_threaded_cancel(void *task) +{ + retro_task_t *t; + + slock_lock(running_lock); + + for (t = tasks_running.front; t; t = t->next) + { + if (t == task) + { + t->cancelled = true; + break; + } + } + + slock_unlock(running_lock); +} + +static void retro_task_threaded_gather(void) +{ + retro_task_t *task = NULL; + + slock_lock(property_lock); + slock_lock(running_lock); + for (task = tasks_running.front; task; task = task->next) + task_queue_push_progress(task); + + slock_unlock(running_lock); + + slock_lock(finished_lock); + retro_task_internal_gather(); + slock_unlock(finished_lock); + slock_unlock(property_lock); +} + +static void retro_task_threaded_wait(retro_task_condition_fn_t cond, void* data) +{ + bool wait = false; + + do + { + retro_task_threaded_gather(); + + slock_lock(running_lock); + wait = (tasks_running.front && !tasks_running.front->when); + slock_unlock(running_lock); + } while (wait && (!cond || cond(data))); +} + +static void retro_task_threaded_reset(void) +{ + retro_task_t *task = NULL; + + slock_lock(running_lock); + for (task = tasks_running.front; task; task = task->next) + task->cancelled = true; + slock_unlock(running_lock); +} + +static bool retro_task_threaded_find( + retro_task_finder_t func, void *user_data) +{ + retro_task_t *task = NULL; + bool result = false; + + slock_lock(running_lock); + for (task = tasks_running.front; task; task = task->next) + { + if (func(task, user_data)) + { + result = true; + break; + } + } + slock_unlock(running_lock); + + return result; +} + +static void retro_task_threaded_retrieve(task_retriever_data_t *data) +{ + /* Protect access to running tasks */ + slock_lock(running_lock); + + /* Call regular retrieve function */ + retro_task_regular_retrieve(data); + + /* Release access to running tasks */ + slock_unlock(running_lock); +} + +static void threaded_worker(void *userdata) +{ + (void)userdata; + + for (;;) + { + retro_task_t *task = NULL; + bool finished = false; + + if (!worker_continue) + break; /* should we keep running until all tasks finished? */ + + slock_lock(running_lock); + + /* Get first task to run */ + task = tasks_running.front; + if (!task) + { + scond_wait(worker_cond, running_lock); + slock_unlock(running_lock); + continue; + } + + if (task->when) + { + retro_time_t now = cpu_features_get_time_usec(); + retro_time_t delay = task->when - now - 500; /* allow half a millisecond for context switching */ + if (delay > 0) + { + scond_wait_timeout(worker_cond, running_lock, delay); + slock_unlock(running_lock); + continue; + } + } + + slock_unlock(running_lock); + + task->handler(task); + + slock_lock(property_lock); + finished = task->finished; + slock_unlock(property_lock); + + /* Update queue */ + if (!finished) + { + /* Move the task to the back of the queue */ + /* mimics retro_task_threaded_push_running, + * but also includes a task_queue_remove */ + slock_lock(running_lock); + slock_lock(queue_lock); + + /* do nothing if only item in queue */ + if (task->next) + { + task_queue_remove(&tasks_running, task); + task_queue_put(&tasks_running, task); + scond_signal(worker_cond); + } + slock_unlock(queue_lock); + slock_unlock(running_lock); + } + else + { + /* Remove task from running queue */ + slock_lock(running_lock); + slock_lock(queue_lock); + task_queue_remove(&tasks_running, task); + slock_unlock(queue_lock); + slock_unlock(running_lock); + + /* Add task to finished queue */ + slock_lock(finished_lock); + task_queue_put(&tasks_finished, task); + slock_unlock(finished_lock); + } + } +} + +static void retro_task_threaded_init(void) +{ + running_lock = slock_new(); + finished_lock = slock_new(); + property_lock = slock_new(); + queue_lock = slock_new(); + worker_cond = scond_new(); + + slock_lock(running_lock); + worker_continue = true; + slock_unlock(running_lock); + + worker_thread = sthread_create(threaded_worker, NULL); +} + +static void retro_task_threaded_deinit(void) +{ + slock_lock(running_lock); + worker_continue = false; + scond_signal(worker_cond); + slock_unlock(running_lock); + + sthread_join(worker_thread); + + scond_free(worker_cond); + slock_free(running_lock); + slock_free(finished_lock); + slock_free(property_lock); + slock_free(queue_lock); + + worker_thread = NULL; + worker_cond = NULL; + running_lock = NULL; + finished_lock = NULL; + property_lock = NULL; + queue_lock = NULL; +} + +static struct retro_task_impl impl_threaded = { + NULL, + retro_task_threaded_push_running, + retro_task_threaded_cancel, + retro_task_threaded_reset, + retro_task_threaded_wait, + retro_task_threaded_gather, + retro_task_threaded_find, + retro_task_threaded_retrieve, + retro_task_threaded_init, + retro_task_threaded_deinit +}; +#endif + +/* Deinitializes the task system. + * This deinitializes the task system. + * The tasks that are running at + * the moment will stay on hold */ +void task_queue_deinit(void) +{ + if (impl_current) + impl_current->deinit(); + impl_current = NULL; +} + +void task_queue_init(bool threaded, retro_task_queue_msg_t msg_push) +{ + impl_current = &impl_regular; + +#ifdef HAVE_THREADS + if (threaded) + { + task_threaded_enable = true; + impl_current = &impl_threaded; + } +#endif + + msg_push_bak = msg_push; + + impl_current->msg_push = msg_push; + impl_current->init(); +} + +void task_queue_set_threaded(void) +{ + task_threaded_enable = true; +} + +void task_queue_unset_threaded(void) +{ + task_threaded_enable = false; +} + +bool task_queue_is_threaded(void) +{ + return task_threaded_enable; +} + +bool task_queue_find(task_finder_data_t *find_data) +{ + if (!impl_current->find(find_data->func, find_data->userdata)) + return false; + return true; +} + +void task_queue_retrieve(task_retriever_data_t *data) +{ + impl_current->retrieve(data); +} + +void task_queue_check(void) +{ +#ifdef HAVE_THREADS + bool current_threaded = (impl_current == &impl_threaded); + bool want_threaded = task_threaded_enable; + + if (want_threaded != current_threaded) + task_queue_deinit(); + + if (!impl_current) + task_queue_init(want_threaded, msg_push_bak); +#endif + + impl_current->gather(); +} + +bool task_queue_push(retro_task_t *task) +{ + /* Ignore this task if a related one is already running */ + if (task->type == TASK_TYPE_BLOCKING) + { + retro_task_t *running = NULL; + bool found = false; + + SLOCK_LOCK(queue_lock); + running = tasks_running.front; + + for (; running; running = running->next) + { + if (running->type == TASK_TYPE_BLOCKING) + { + found = true; + break; + } + } + + SLOCK_UNLOCK(queue_lock); + + /* skip this task, user must try again later */ + if (found) + return false; + } + + /* The lack of NULL checks in the following functions + * is proposital to ensure correct control flow by the users. */ + impl_current->push_running(task); + + return true; +} + +void task_queue_wait(retro_task_condition_fn_t cond, void* data) +{ + impl_current->wait(cond, data); +} + +void task_queue_reset(void) +{ + impl_current->reset(); +} + +/** + * Signals a task to end without waiting for + * it to complete. */ +void task_queue_cancel_task(void *task) +{ + impl_current->cancel(task); +} + +void *task_queue_retriever_info_next(task_retriever_info_t **link) +{ + void *data = NULL; + + /* Grab data and move to next link */ + if (*link) + { + data = (*link)->data; + *link = (*link)->next; + } + + return data; +} + +void task_queue_retriever_info_free(task_retriever_info_t *list) +{ + task_retriever_info_t *info; + + /* Free links including retriever-specific data */ + while (list) + { + info = list->next; + free(list->data); + free(list); + list = info; + } +} + +void task_set_finished(retro_task_t *task, bool finished) +{ + SLOCK_LOCK(property_lock); + task->finished = finished; + SLOCK_UNLOCK(property_lock); +} + +void task_set_mute(retro_task_t *task, bool mute) +{ + SLOCK_LOCK(property_lock); + task->mute = mute; + SLOCK_UNLOCK(property_lock); +} + +void task_set_error(retro_task_t *task, char *error) +{ + SLOCK_LOCK(property_lock); + task->error = error; + SLOCK_UNLOCK(property_lock); +} + +void task_set_progress(retro_task_t *task, int8_t progress) +{ + SLOCK_LOCK(property_lock); + task->progress = progress; + SLOCK_UNLOCK(property_lock); +} + +void task_set_title(retro_task_t *task, char *title) +{ + SLOCK_LOCK(property_lock); + task->title = title; + SLOCK_UNLOCK(property_lock); +} + +void task_set_data(retro_task_t *task, void *data) +{ + SLOCK_LOCK(running_lock); + task->task_data = data; + SLOCK_UNLOCK(running_lock); +} + +void task_set_cancelled(retro_task_t *task, bool cancelled) +{ + SLOCK_LOCK(running_lock); + task->cancelled = cancelled; + SLOCK_UNLOCK(running_lock); +} + +void task_free_title(retro_task_t *task) +{ + SLOCK_LOCK(property_lock); + if (task->title) + free(task->title); + task->title = NULL; + SLOCK_UNLOCK(property_lock); +} + +void* task_get_data(retro_task_t *task) +{ + void *data = NULL; + + SLOCK_LOCK(running_lock); + data = task->task_data; + SLOCK_UNLOCK(running_lock); + + return data; +} + +bool task_get_cancelled(retro_task_t *task) +{ + bool cancelled = false; + + SLOCK_LOCK(running_lock); + cancelled = task->cancelled; + SLOCK_UNLOCK(running_lock); + + return cancelled; +} + +bool task_get_finished(retro_task_t *task) +{ + bool finished = false; + + SLOCK_LOCK(property_lock); + finished = task->finished; + SLOCK_UNLOCK(property_lock); + + return finished; +} + +bool task_get_mute(retro_task_t *task) +{ + bool mute = false; + + SLOCK_LOCK(property_lock); + mute = task->mute; + SLOCK_UNLOCK(property_lock); + + return mute; +} + +char* task_get_error(retro_task_t *task) +{ + char *error = NULL; + + SLOCK_LOCK(property_lock); + error = task->error; + SLOCK_UNLOCK(property_lock); + + return error; +} + +int8_t task_get_progress(retro_task_t *task) +{ + int8_t progress = 0; + + SLOCK_LOCK(property_lock); + progress = task->progress; + SLOCK_UNLOCK(property_lock); + + return progress; +} + +char* task_get_title(retro_task_t *task) +{ + char *title = NULL; + + SLOCK_LOCK(property_lock); + title = task->title; + SLOCK_UNLOCK(property_lock); + + return title; +} + +retro_task_t *task_init(void) +{ + /* TODO/FIXME - static local global */ + static uint32_t task_count = 0; + retro_task_t *task = (retro_task_t*)malloc(sizeof(*task)); + + if (!task) + return NULL; + + task->handler = NULL; + task->callback = NULL; + task->cleanup = NULL; + task->finished = false; + task->cancelled = false; + task->mute = false; + task->task_data = NULL; + task->user_data = NULL; + task->state = NULL; + task->error = NULL; + task->progress = 0; + task->progress_cb = NULL; + task->title = NULL; + task->type = TASK_TYPE_NONE; + task->ident = task_count++; + task->frontend_userdata = NULL; + task->alternative_look = false; + task->next = NULL; + task->when = 0; + + return task; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/rthreads/ctr_pthread.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/rthreads/ctr_pthread.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (gx_pthread.h). @@ -30,14 +30,120 @@ #include <errno.h> #include <retro_inline.h> -#define STACKSIZE (4 * 1024) +#define STACKSIZE (32 * 1024) + +#ifndef PTHREAD_SCOPE_PROCESS +/* An earlier version of devkitARM does not define the pthread types. Can remove in r54+. */ typedef Thread pthread_t; typedef LightLock pthread_mutex_t; typedef void* pthread_mutexattr_t; typedef int pthread_attr_t; -typedef LightEvent pthread_cond_t; +typedef uint32_t pthread_cond_t; typedef int pthread_condattr_t; +#endif + +#ifndef USE_CTRULIB_2 +/* Backported CondVar API from libctru 2.0, and under its license: + https://github.com/devkitPro/libctru + Slightly modified for compatibility with older libctru. */ + +typedef s32 CondVar; + +static INLINE Result syncArbitrateAddress(s32* addr, ArbitrationType type, s32 value) +{ + return svcArbitrateAddress(__sync_get_arbiter(), (u32)addr, type, value, 0); +} + +static INLINE Result syncArbitrateAddressWithTimeout(s32* addr, ArbitrationType type, s32 value, s64 timeout_ns) +{ + return svcArbitrateAddress(__sync_get_arbiter(), (u32)addr, type, value, timeout_ns); +} + +static INLINE void __dmb(void) +{ + __asm__ __volatile__("mcr p15, 0, %[val], c7, c10, 5" :: [val] "r" (0) : "memory"); +} + +static INLINE void CondVar_BeginWait(CondVar* cv, LightLock* lock) +{ + s32 val; + do + val = __ldrex(cv) - 1; + while (__strex(cv, val)); + LightLock_Unlock(lock); +} + +static INLINE bool CondVar_EndWait(CondVar* cv, s32 num_threads) +{ + bool hasWaiters; + s32 val; + + do { + val = __ldrex(cv); + hasWaiters = val < 0; + if (hasWaiters) + { + if (num_threads < 0) + val = 0; + else if (val <= -num_threads) + val += num_threads; + else + val = 0; + } + } while (__strex(cv, val)); + + return hasWaiters; +} + +static INLINE void CondVar_Init(CondVar* cv) +{ + *cv = 0; +} + +static INLINE void CondVar_Wait(CondVar* cv, LightLock* lock) +{ + CondVar_BeginWait(cv, lock); + syncArbitrateAddress(cv, ARBITRATION_WAIT_IF_LESS_THAN, 0); + LightLock_Lock(lock); +} + +static INLINE int CondVar_WaitTimeout(CondVar* cv, LightLock* lock, s64 timeout_ns) +{ + CondVar_BeginWait(cv, lock); + + bool timedOut = false; + Result rc = syncArbitrateAddressWithTimeout(cv, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 0, timeout_ns); + if (R_DESCRIPTION(rc) == RD_TIMEOUT) + { + timedOut = CondVar_EndWait(cv, 1); + __dmb(); + } + + LightLock_Lock(lock); + return timedOut; +} + +static INLINE void CondVar_WakeUp(CondVar* cv, s32 num_threads) +{ + __dmb(); + if (CondVar_EndWait(cv, num_threads)) + syncArbitrateAddress(cv, ARBITRATION_SIGNAL, num_threads); + else + __dmb(); +} + +static INLINE void CondVar_Signal(CondVar* cv) +{ + CondVar_WakeUp(cv, 1); +} + +static INLINE void CondVar_Broadcast(CondVar* cv) +{ + CondVar_WakeUp(cv, ARBITRATION_SIGNAL_ALL); +} +/* End libctru 2.0 backport */ +#endif /* libctru threads return void but pthreads return void pointer */ static bool mutex_inited = false; @@ -56,11 +162,18 @@ { s32 prio = 0; Thread new_ctr_thread; + int procnum = -2; // use default cpu + bool isNew3DS; + + APT_CheckNew3DS(&isNew3DS); + + if (isNew3DS) + procnum = 2; if (!mutex_inited) { - LightLock_Init(&safe_double_thread_launch); - mutex_inited = true; + LightLock_Init(&safe_double_thread_launch); + mutex_inited = true; } /*Must wait if attempting to launch 2 threads at once to prevent corruption of function pointer*/ @@ -69,27 +182,27 @@ svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); start_routine_jump = start_routine; - new_ctr_thread = threadCreate(ctr_thread_launcher, arg, STACKSIZE, prio - 1, -1/*No affinity, use any CPU*/, false); + new_ctr_thread = threadCreate(ctr_thread_launcher, arg, STACKSIZE, prio - 1, procnum, false); if (!new_ctr_thread) { - LightLock_Unlock(&safe_double_thread_launch); - return EAGAIN; + LightLock_Unlock(&safe_double_thread_launch); + return EAGAIN; } - *thread = new_ctr_thread; + *thread = (pthread_t)new_ctr_thread; return 0; } static INLINE pthread_t pthread_self(void) { - return threadGetCurrent(); + return (pthread_t)threadGetCurrent(); } static INLINE int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) { - LightLock_Init(mutex); + LightLock_Init((LightLock *)mutex); return 0; } @@ -101,12 +214,13 @@ static INLINE int pthread_mutex_lock(pthread_mutex_t *mutex) { - return LightLock_TryLock(mutex); + LightLock_Lock((LightLock *)mutex); + return 0; } static INLINE int pthread_mutex_unlock(pthread_mutex_t *mutex) { - LightLock_Unlock(mutex); + LightLock_Unlock((LightLock *)mutex); return 0; } @@ -115,80 +229,95 @@ /*Yes the pointer to int cast is not ideal*/ /*threadExit((int)retval);*/ (void)retval; + + threadExit(0); } static INLINE int pthread_detach(pthread_t thread) { - /* FIXME: pthread_detach equivalent missing? */ - (void)thread; + threadDetach((Thread)thread); return 0; } static INLINE int pthread_join(pthread_t thread, void **retval) { /*retval is ignored*/ - return threadJoin(thread, U64_MAX); + if(threadJoin((Thread)thread, INT64_MAX)) + return -1; + + threadFree((Thread)thread); + + return 0; } static INLINE int pthread_mutex_trylock(pthread_mutex_t *mutex) { - return LightLock_TryLock(mutex); + return LightLock_TryLock((LightLock *)mutex); } static INLINE int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { - LightEvent_Wait(cond); + CondVar_Wait((CondVar *)cond, (LightLock *)mutex); return 0; } static INLINE int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) { - while (true) - { - struct timespec now = {0}; - /* Missing clock_gettime*/ - struct timeval tm; - - gettimeofday(&tm, NULL); - now.tv_sec = tm.tv_sec; - now.tv_nsec = tm.tv_usec * 1000; - if (LightEvent_TryWait(cond) != 0 || now.tv_sec > abstime->tv_sec || (now.tv_sec == abstime->tv_sec && now.tv_nsec > abstime->tv_nsec)) - break; - } - - return 0; + struct timespec now = {0}; + /* Missing clock_gettime*/ + struct timeval tm; + int retval = 0; + + do { + gettimeofday(&tm, NULL); + now.tv_sec = tm.tv_sec; + now.tv_nsec = tm.tv_usec * 1000; + s64 timeout = (abstime->tv_sec - now.tv_sec) * 1000000000 + (abstime->tv_nsec - now.tv_nsec); + + if (timeout < 0) + { + retval = ETIMEDOUT; + break; + } + + if (!CondVar_WaitTimeout((CondVar *)cond, (LightLock *)mutex, timeout)) { + break; + } + } while (1); + + return retval; } static INLINE int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) { - LightEvent_Init(cond, RESET_ONESHOT); + CondVar_Init((CondVar *)cond); return 0; } static INLINE int pthread_cond_signal(pthread_cond_t *cond) { - LightEvent_Signal(cond); + CondVar_Signal((CondVar *)cond); return 0; } static INLINE int pthread_cond_broadcast(pthread_cond_t *cond) { - LightEvent_Signal(cond); + CondVar_Broadcast((CondVar *)cond); return 0; } static INLINE int pthread_cond_destroy(pthread_cond_t *cond) { - /*nothing to destroy*/ + /*Nothing to destroy*/ return 0; } static INLINE int pthread_equal(pthread_t t1, pthread_t t2) { - if (threadGetHandle(t1) == threadGetHandle(t2)) + if (threadGetHandle((Thread)t1) == threadGetHandle((Thread)t2)) return 1; return 0; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/rthreads/gx_pthread.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/rthreads/gx_pthread.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (gx_pthread.h). @@ -84,10 +84,13 @@ typedef OSThread pthread_t; typedef mutex_t pthread_mutex_t; +typedef OSCond pthread_cond_t; + +#if defined(GX_PTHREAD_LEGACY) typedef void* pthread_mutexattr_t; typedef int pthread_attr_t; -typedef OSCond pthread_cond_t; typedef OSCond pthread_condattr_t; +#endif static INLINE int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/rthreads/psp_pthread.h -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/rthreads/psp_pthread.h
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2017 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (psp_pthread.h).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/rthreads/rthreads.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/rthreads/rthreads.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (rthreads.c). @@ -50,9 +50,6 @@ #include "gx_pthread.h" #elif defined(_3DS) #include "ctr_pthread.h" -#elif defined(__CELLOS_LV2__) -#include <pthread.h> -#include <sys/sys_time.h> #else #include <pthread.h> #include <time.h> @@ -95,9 +92,9 @@ #ifdef USE_WIN32_THREADS /* The syntax we'll use is mind-bending unless we use a struct. Plus, we might want to store more info later */ /* This will be used as a linked list immplementing a queue of waiting threads */ -struct QueueEntry +struct queue_entry { - struct QueueEntry *next; + struct queue_entry *next; }; #endif @@ -117,7 +114,7 @@ HANDLE event; /* the head of the queue; NULL if queue is empty */ - struct QueueEntry *head; + struct queue_entry *head; /* equivalent to the queue length */ int waiters; @@ -164,7 +161,7 @@ } /* TODO/FIXME - this needs to be implemented for Switch/3DS */ -#if !defined(SWITCH) && !defined(USE_WIN32_THREADS) && !defined(_3DS) && !defined(GEKKO) && !defined(__HAIKU__) +#if !defined(SWITCH) && !defined(USE_WIN32_THREADS) && !defined(_3DS) && !defined(GEKKO) && !defined(__HAIKU__) && !defined(EMSCRIPTEN) #define HAVE_THREAD_ATTR #endif @@ -191,12 +188,12 @@ #endif bool thread_created = false; struct thread_data *data = NULL; - sthread_t *thread = (sthread_t*)calloc(1, sizeof(*thread)); + sthread_t *thread = (sthread_t*)malloc(sizeof(*thread)); if (!thread) return NULL; - data = (struct thread_data*)calloc(1, sizeof(*data)); + data = (struct thread_data*)malloc(sizeof(*data)); if (!data) goto error; @@ -204,14 +201,17 @@ data->userdata = userdata; #ifdef USE_WIN32_THREADS - thread->thread = CreateThread(NULL, 0, thread_wrap, data, 0, &thread->id); + thread->id = 0; + thread->thread = CreateThread(NULL, 0, thread_wrap, + data, 0, &thread->id); thread_created = !!thread->thread; #else + thread->id = 0; #ifdef HAVE_THREAD_ATTR pthread_attr_init(&thread_attr); - if ( (thread_priority >= 1) && (thread_priority <= 100) ) + if ((thread_priority >= 1) && (thread_priority <= 100)) { struct sched_param sp; memset(&sp, 0, sizeof(struct sched_param)); @@ -268,7 +268,9 @@ free(thread); return 0; #else - return pthread_detach(thread->id); + int ret = pthread_detach(thread->id); + free(thread); + return ret; #endif } @@ -330,11 +332,12 @@ if (!lock) return NULL; + #ifdef USE_WIN32_THREADS InitializeCriticalSection(&lock->lock); - mutex_created = true; + mutex_created = true; #else - mutex_created = (pthread_mutex_init(&lock->lock, NULL) == 0); + mutex_created = (pthread_mutex_init(&lock->lock, NULL) == 0); #endif if (!mutex_created) @@ -386,6 +389,24 @@ } /** + * slock_try_lock: + * @lock : pointer to mutex object + * + * Attempts to lock a mutex. If a mutex is already locked by + * another thread, return false. If the lock is acquired, return true. +**/ +bool slock_try_lock(slock_t *lock) +{ + if (!lock) + return false; +#ifdef USE_WIN32_THREADS + return TryEnterCriticalSection(&lock->lock); +#else + return pthread_mutex_trylock(&lock->lock)==0; +#endif +} + +/** * slock_unlock: * @lock : pointer to mutex object * @@ -419,7 +440,6 @@ return NULL; #ifdef USE_WIN32_THREADS - /* This is very complex because recreating condition variable semantics * with Win32 parts is not easy. * @@ -445,9 +465,10 @@ * * Note: We might could simplify this using vista+ condition variables, * but we wanted an XP compatible solution. */ - cond->event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (!cond->event) goto error; - cond->hot_potato = CreateEvent(NULL, FALSE, FALSE, NULL); + cond->event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!cond->event) + goto error; + cond->hot_potato = CreateEvent(NULL, FALSE, FALSE, NULL); if (!cond->hot_potato) { CloseHandle(cond->event); @@ -455,9 +476,6 @@ } InitializeCriticalSection(&cond->cs); - cond->waiters = cond->wakens = 0; - cond->head = NULL; - #else if (pthread_cond_init(&cond->cond, NULL) != 0) goto error; @@ -494,8 +512,8 @@ #ifdef USE_WIN32_THREADS static bool _scond_wait_win32(scond_t *cond, slock_t *lock, DWORD dwMilliseconds) { - struct QueueEntry myentry; - struct QueueEntry **ptr; + struct queue_entry myentry; + struct queue_entry **ptr; #if _WIN32_WINNT >= 0x0500 || defined(_XBOX) static LARGE_INTEGER performanceCounterFrequency; @@ -641,7 +659,7 @@ { /* It's not our turn and we're out of time. Give up. * Remove ourself from the queue and bail. */ - struct QueueEntry* curr = cond->head; + struct queue_entry *curr = cond->head; while (curr->next != &myentry) curr = curr->next; @@ -843,7 +861,7 @@ mach_port_deallocate(mach_task_self(), cclock); now.tv_sec = mts.tv_sec; now.tv_nsec = mts.tv_nsec; -#elif defined(__CELLOS_LV2__) +#elif !defined(__PSL1GHT__) && defined(__PS3__) sys_time_sec_t s; sys_time_nsec_t n; @@ -851,7 +869,7 @@ now.tv_sec = s; now.tv_nsec = n; #elif defined(PS2) - int tickms = clock(); + int tickms = ps2_clock(); now.tv_sec = tickms/1000; now.tv_nsec = tickms * 1000; #elif defined(__mips__) || defined(VITA) || defined(_3DS) @@ -921,3 +939,19 @@ #endif } #endif + +uintptr_t sthread_get_thread_id(sthread_t *thread) +{ + if (!thread) + return 0; + return (uintptr_t)thread->id; +} + +uintptr_t sthread_get_current_thread_id(void) +{ +#ifdef USE_WIN32_THREADS + return (uintptr_t)GetCurrentThreadId(); +#else + return (uintptr_t)pthread_self(); +#endif +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/rthreads/tpool.c
Added
@@ -0,0 +1,268 @@ +/* + * Copyright (c) 2010-2020 The RetroArch team + * Copyright (c) 2017 John Schember <john@nachtimwald.com> + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (tpool.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE + */ + +#include <stdlib.h> +#include <boolean.h> + +#include <rthreads/rthreads.h> +#include <rthreads/tpool.h> + +/* Work object which will sit in a queue + * waiting for the pool to process it. + * + * It is a singly linked list acting as a FIFO queue. */ +struct tpool_work +{ + thread_func_t func; /* Function to be called. */ + void *arg; /* Data to be passed to func. */ + struct tpool_work *next; /* Next work item in the queue. */ +}; +typedef struct tpool_work tpool_work_t; + +struct tpool +{ + tpool_work_t *work_first; /* First work item in the work queue. */ + tpool_work_t *work_last; /* Last work item in the work queue. */ + slock_t *work_mutex; /* Mutex protecting inserting and removing work from the work queue. */ + scond_t *work_cond; /* Conditional to signal when there is work to process. */ + scond_t *working_cond; /* Conditional to signal when there is no work processing. + This will also signal when there are no threads running. */ + size_t working_cnt; /* The number of threads processing work (Not waiting for work). */ + size_t thread_cnt; /* Total number of threads within the pool. */ + bool stop; /* Marker to tell the work threads to exit. */ +}; + +static tpool_work_t *tpool_work_create(thread_func_t func, void *arg) +{ + tpool_work_t *work; + + if (!func) + return NULL; + + work = (tpool_work_t*)calloc(1, sizeof(*work)); + work->func = func; + work->arg = arg; + work->next = NULL; + return work; +} + +static void tpool_work_destroy(tpool_work_t *work) +{ + if (work) + free(work); +} + +/* Pull the first work item out of the queue. */ +static tpool_work_t *tpool_work_get(tpool_t *tp) +{ + tpool_work_t *work; + + if (!tp) + return NULL; + + work = tp->work_first; + if (!work) + return NULL; + + if (!work->next) + { + tp->work_first = NULL; + tp->work_last = NULL; + } + else + tp->work_first = work->next; + + return work; +} + +static void tpool_worker(void *arg) +{ + tpool_work_t *work = NULL; + tpool_t *tp = (tpool_t*)arg; + + for (;;) + { + slock_lock(tp->work_mutex); + /* Keep running until told to stop. */ + if (tp->stop) + break; + + /* If there is no work in the queue wait in the conditional until + * there is work to take. */ + if (!tp->work_first) + scond_wait(tp->work_cond, tp->work_mutex); + + /* Try to pull work from the queue. */ + work = tpool_work_get(tp); + tp->working_cnt++; + slock_unlock(tp->work_mutex); + + /* Call the work function and let it process. + * + * work can legitimately be NULL. Since multiple threads from the pool + * will wake when there is work, a thread might not get any work. 1 + * piece of work and 2 threads, both will wake but with 1 only work 1 + * will get the work and the other won't. + * + * working_cnt has been increment and work could be NULL. While it's + * not true there is work processing the thread is considered working + * because it's not waiting in the conditional. Pedantic but... + */ + if (work) + { + work->func(work->arg); + tpool_work_destroy(work); + } + + slock_lock(tp->work_mutex); + tp->working_cnt--; + /* Since we're in a lock no work can be added or removed form the queue. + * Also, the working_cnt can't be changed (except the thread holding the lock). + * At this point if there isn't any work processing and if there is no work + * signal this is the case. */ + if (!tp->stop && tp->working_cnt == 0 && !tp->work_first) + scond_signal(tp->working_cond); + slock_unlock(tp->work_mutex); + } + + tp->thread_cnt--; + if (tp->thread_cnt == 0) + scond_signal(tp->working_cond); + slock_unlock(tp->work_mutex); +} + +tpool_t *tpool_create(size_t num) +{ + tpool_t *tp; + sthread_t *thread; + size_t i; + + if (num == 0) + num = 2; + + tp = (tpool_t*)calloc(1, sizeof(*tp)); + tp->thread_cnt = num; + + tp->work_mutex = slock_new(); + tp->work_cond = scond_new(); + tp->working_cond = scond_new(); + + tp->work_first = NULL; + tp->work_last = NULL; + + /* Create the requested number of thread and detach them. */ + for (i = 0; i < num; i++) + { + thread = sthread_create(tpool_worker, tp); + sthread_detach(thread); + } + + return tp; +} + +void tpool_destroy(tpool_t *tp) +{ + tpool_work_t *work; + tpool_work_t *work2; + + if (!tp) + return; + + /* Take all work out of the queue and destroy it. */ + slock_lock(tp->work_mutex); + work = tp->work_first; + while (work) + { + work2 = work->next; + tpool_work_destroy(work); + work = work2; + } + + /* Tell the worker threads to stop. */ + tp->stop = true; + scond_broadcast(tp->work_cond); + slock_unlock(tp->work_mutex); + + /* Wait for all threads to stop. */ + tpool_wait(tp); + + slock_free(tp->work_mutex); + scond_free(tp->work_cond); + scond_free(tp->working_cond); + + free(tp); +} + +bool tpool_add_work(tpool_t *tp, thread_func_t func, void *arg) +{ + tpool_work_t *work; + + if (!tp) + return false; + + work = tpool_work_create(func, arg); + if (!work) + return false; + + slock_lock(tp->work_mutex); + if (!tp->work_first) + { + tp->work_first = work; + tp->work_last = tp->work_first; + } + else + { + tp->work_last->next = work; + tp->work_last = work; + } + + scond_broadcast(tp->work_cond); + slock_unlock(tp->work_mutex); + + return true; +} + +void tpool_wait(tpool_t *tp) +{ + if (!tp) + return; + + slock_lock(tp->work_mutex); + + for (;;) + { + /* working_cond is dual use. It signals when we're not stopping but the + * working_cnt is 0 indicating there isn't any work processing. If we + * are stopping it will trigger when there aren't any threads running. */ + if ((!tp->stop && tp->working_cnt != 0) || (tp->stop && tp->thread_cnt != 0)) + scond_wait(tp->working_cond, tp->work_mutex); + else + break; + } + + slock_unlock(tp->work_mutex); +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/rthreads/xenon_sdl_threads.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/rthreads/xenon_sdl_threads.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (xenon_sdl_threads.c).
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/fnmatch
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/fnmatch/Makefile
Added
@@ -0,0 +1,24 @@ +TARGET := compat_fnmatch_test + +LIBRETRO_COMM_DIR := ../../.. + +SOURCES := \ + compat_fnmatch_test.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_fnmatch.c + +OBJS := $(SOURCES:.c=.o) + +CFLAGS += -Wall -pedantic -std=gnu99 -g -I$(LIBRETRO_COMM_DIR)/include + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/fnmatch/compat_fnmatch_test.c
Added
@@ -0,0 +1,58 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (compat_fnmatch_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <assert.h> +#include <stddef.h> + +#include <compat/fnmatch.h> + +int main(void) +{ + assert(rl_fnmatch("TEST", "TEST", 0) == 0); + assert(rl_fnmatch("TE?T", "TEST", 0) == 0); + assert(rl_fnmatch("TE[Ssa]T", "TEST", 0) == 0); + assert(rl_fnmatch("TE[Ssda]T", "TEsT", 0) == 0); + assert(rl_fnmatch("TE[Ssda]T", "TEdT", 0) == 0); + assert(rl_fnmatch("TE[Ssda]T", "TEaT", 0) == 0); + assert(rl_fnmatch("TEST*", "TEST", 0) == 0); + assert(rl_fnmatch("TEST**", "TEST", 0) == 0); + assert(rl_fnmatch("TE*ST*", "TEST", 0) == 0); + assert(rl_fnmatch("TE**ST*", "TEST", 0) == 0); + assert(rl_fnmatch("TE**ST*", "TExST", 0) == 0); + assert(rl_fnmatch("TE**ST", "TEST", 0) == 0); + assert(rl_fnmatch("TE**ST", "TExST", 0) == 0); + assert(rl_fnmatch("TE\\**ST", "TE*xST", 0) == 0); + assert(rl_fnmatch("*.*", "test.jpg", 0) == 0); + assert(rl_fnmatch("*.jpg", "test.jpg", 0) == 0); + assert(rl_fnmatch("*.[Jj][Pp][Gg]", "test.jPg", 0) == 0); + assert(rl_fnmatch("*.[Jj]*[Gg]", "test.jPg", 0) == 0); + assert(rl_fnmatch("TEST?", "TEST", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TES[asd", "TEST", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TEST\\", "TEST", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TEST*S", "TEST", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TE**ST", "TExT", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TE\\*T", "TExT", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TES?", "TES", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TE", "TEST", 0) == FNM_NOMATCH); + assert(rl_fnmatch("TEST!", "TEST", 0) == FNM_NOMATCH); + assert(rl_fnmatch("DSAD", "TEST", 0) == FNM_NOMATCH); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/snprintf
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/snprintf/Makefile
Added
@@ -0,0 +1,25 @@ +TARGET := snprintf + +CORE_DIR := . +LIBRETRO_COMM_DIR := ../../.. + +SOURCES_C := \ + $(CORE_DIR)/snprintf_test.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_snprintf.c + +OBJS := $(SOURCES_C:.c=.o) + +CFLAGS += -Wall -pedantic -std=gnu99 -I$(LIBRETRO_COMM_DIR)/include + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/snprintf/snprintf_test.c
Added
@@ -0,0 +1,51 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (snprintf_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> + +#include <compat/strl.h> + +int main(int argc, char *argv[]) +{ + char s[128]; + char *variable = "test1"; + char *variable2 = "test2"; + char *variable3 = "test3"; + char *variable4 = "test4"; + char *variable5 = "test5"; + char *variable6 = "test6"; + int ret = snprintf(s, + sizeof(s), "%s%s%s%s%s%s%s%s%s%s%s", variable, + " : ", variable2, + " : ", variable3, + " : ", variable4, + " : ", variable5, + " : ", variable6 + ); + + fprintf(stderr, "[%d], %s\n", ret, s); + + return 0; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/strl
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/strl/Makefile
Added
@@ -0,0 +1,25 @@ +TARGET := strl + +CORE_DIR := . +LIBRETRO_COMM_DIR := ../../.. + +SOURCES_C := \ + $(CORE_DIR)/strl_test.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.c + +OBJS := $(SOURCES_C:.c=.o) + +CFLAGS += -Wall -pedantic -std=gnu99 -I$(LIBRETRO_COMM_DIR)/include + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/compat/strl/strl_test.c
Added
@@ -0,0 +1,54 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (strl_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <string.h> + +#include <compat/strl.h> + +int main(int argc, char *argv[]) +{ + char s[128]; + char *variable = "test1"; + char *variable2 = "test2"; + char *variable3 = "test3"; + char *variable4 = "test4"; + char *variable5 = "test5"; + char *variable6 = "test6"; + int ret = strlcpy(s, variable, sizeof(s)); + ret = strlcat(s, " : ", sizeof(s)); + ret = strlcat(s, variable2,sizeof(s)); + ret = strlcat(s, " : ", sizeof(s)); + ret = strlcat(s, variable3,sizeof(s)); + ret = strlcat(s, " : ", sizeof(s)); + ret = strlcat(s, variable4,sizeof(s)); + ret = strlcat(s, " : ", sizeof(s)); + ret = strlcat(s, variable5,sizeof(s)); + ret = strlcat(s, " : ", sizeof(s)); + ret = strlcat(s, variable6,sizeof(s)); + + fprintf(stderr, "[%d], %s\n", ret, s); + + return 0; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/README.md
Added
@@ -0,0 +1,53 @@ +## Adding 'enhanced' core options to a core + +The basic steps for updating a core to support core options v1 are as follows: + +- Copy `example_default/libretro_core_options.h` to the same directory as `libretro.c/.cpp` + +- Copy `example_default/libretro_core_options_intl.h` to the same directory as `libretro.c/.cpp` + +- Add `#include "libretro_core_options.h"` to `libretro.c/.cpp` + +- Replace any existing calls of `RETRO_ENVIRONMENT_SET_VARIABLES` with `libretro_set_core_options(retro_environment_t environ_cb)` + (Note: `libretro_set_core_options()` should be called as early as possible - preferably in `retro_set_environment()` + and no later than `retro_load_game()`) + +- Open `libretro_core_options.h` and replace the contents of the existing `option_defs_us` struct array with all required core option parameters. + +## Adding core option translations + +To add a translation, simply: + +- Copy the contents of `option_defs_us` *from* `libretro_core_options.h` *to* `libretro_core_options_intl.h` into a new struct array with the appropriate language suffix + +- Translate all human-readable strings + +- Add the new struct array to the appropriate location in the `option_defs_intl` array inside `libretro_core_options.h` + +This is most easily understood by considering the example in `example_translation/`. Here a French translation has been added (`option_defs_fr`), with comments explaining the appropriate formatting requirements. + +NOTE: Since translations involve the use of UTF-8 characters, `libretro_core_options_intl.h` must include a BOM marker. *This renders translations incompatible with c89 builds*. When performing a c89 build, the flag `HAVE_NO_LANGEXTRA` *must* be defined (e.g. `-DHAVE_NO_LANGEXTRA`). This will disable all translations. + +## Disabling core options on unsupported frontends + +Sometimes it is desirable to only show a particular core option if the frontend supports the new core options v1 API. For example: + +- The API v1 allows cores to hide options dynamically + +- We can therefore create a specific 'toggle display' option to hide or show a number of other options (e.g. advanced settings) + +- On frontends that do not support API v1, this 'toggle display' option will have no function - it should therefore be omitted + +This can be handled easily by editing the `libretro_set_core_options()` function to ignore certain core name (key) values when generating option variable arrays for old-style frontends. Again, this is most easily understood by considering the example in `example_hide_option/libretro_core_options.h`: + +- Here, a `mycore_show_speedhacks` option is added to `option_defs_us` + +- On line 227, the following comparison allows the option to be skipped: + (Note that another `strcmp()` may be added for each option to be omitted) + +```c +if (strcmp(key, "mycore_show_speedhacks") == 0) + continue; +``` + +For any cores that require this functionality, `example_hide_option/libretro_core_options.h` should be used as a template in place of `example_default/libretro_core_options.h`
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_default
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_default/libretro_core_options.h
Added
@@ -0,0 +1,287 @@ +#ifndef LIBRETRO_CORE_OPTIONS_H__ +#define LIBRETRO_CORE_OPTIONS_H__ + +#include <stdlib.h> +#include <string.h> + +#include <libretro.h> +#include <retro_inline.h> + +#ifndef HAVE_NO_LANGEXTRA +#include "libretro_core_options_intl.h" +#endif + +/* + ******************************** + * VERSION: 1.3 + ******************************** + * + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ + +/* RETRO_LANGUAGE_ENGLISH */ + +/* Default language: + * - All other languages must include the same keys and values + * - Will be used as a fallback in the event that frontend language + * is not available + * - Will be used as a fallback for any missing entries in + * frontend language definition */ + +struct retro_core_option_definition option_defs_us[] = { + { + "mycore_region", /* key (option name) */ + "Console Region", /* description (label) */ + "Specify which region the system is from.", /* sublabel */ + { + { "auto", "Auto" }, /* value_1, value_1_label */ + { "ntsc-j", "Japan" }, /* value_2, value_2_label */ + { "ntsc-u", "America" }, /* value_3, value_3_label */ + { "pal", "Europe" }, /* value_4, value_4_label */ + { NULL, NULL }, + }, + "auto" /* default_value */ + }, + { + "mycore_video_scale", + "Video Scale", + "Set internal video scale factor.", + { + { "1x", NULL }, /* If value itself is human-readable (e.g. a number) */ + { "2x", NULL }, /* and can displayed directly, the value_label should */ + { "3x", NULL }, /* be set to NULL */ + { "4x", NULL }, + { NULL, NULL }, + }, + "3x" + }, + { + "mycore_overclock", + "Reduce Slowdown", + "Enable CPU overclock (unsafe).", + { + { "enabled", NULL }, /* If value is equal to 'enabled' or 'disabled', */ + { "disabled", NULL }, /* value_label should be set to NULL */ + { NULL, NULL }, + }, + "disabled" + }, + { NULL, NULL, NULL, {{0}}, NULL }, +}; + +/* + ******************************** + * Language Mapping + ******************************** +*/ + +#ifndef HAVE_NO_LANGEXTRA +struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { + option_defs_us, /* RETRO_LANGUAGE_ENGLISH */ + NULL, /* RETRO_LANGUAGE_JAPANESE */ + NULL, /* RETRO_LANGUAGE_FRENCH */ + NULL, /* RETRO_LANGUAGE_SPANISH */ + NULL, /* RETRO_LANGUAGE_GERMAN */ + NULL, /* RETRO_LANGUAGE_ITALIAN */ + NULL, /* RETRO_LANGUAGE_DUTCH */ + NULL, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + NULL, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + NULL, /* RETRO_LANGUAGE_RUSSIAN */ + NULL, /* RETRO_LANGUAGE_KOREAN */ + NULL, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + NULL, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + NULL, /* RETRO_LANGUAGE_ESPERANTO */ + NULL, /* RETRO_LANGUAGE_POLISH */ + NULL, /* RETRO_LANGUAGE_VIETNAMESE */ + NULL, /* RETRO_LANGUAGE_ARABIC */ + NULL, /* RETRO_LANGUAGE_GREEK */ + NULL, /* RETRO_LANGUAGE_TURKISH */ + NULL, /* RETRO_LANGUAGE_SLOVAK */ + NULL, /* RETRO_LANGUAGE_PERSIAN */ + NULL, /* RETRO_LANGUAGE_HEBREW */ + NULL, /* RETRO_LANGUAGE_ASTURIAN */ + NULL, /* RETRO_LANGUAGE_FINNISH */ + +}; +#endif + +/* + ******************************** + * Functions + ******************************** +*/ + +/* Handles configuration/setting of core options. + * Should be called as early as possible - ideally inside + * retro_set_environment(), and no later than retro_load_game() + * > We place the function body in the header to avoid the + * necessity of adding more .c files (i.e. want this to + * be as painless as possible for core devs) + */ + +static INLINE void libretro_set_core_options(retro_environment_t environ_cb) +{ + unsigned version = 0; + + if (!environ_cb) + return; + + if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1)) + { +#ifndef HAVE_NO_LANGEXTRA + struct retro_core_options_intl core_options_intl; + unsigned language = 0; + + core_options_intl.us = option_defs_us; + core_options_intl.local = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) && + (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH)) + core_options_intl.local = option_defs_intl[language]; + + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl); +#else + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us); +#endif + } + else + { + size_t i; + size_t num_options = 0; + struct retro_variable *variables = NULL; + char **values_buf = NULL; + + /* Determine number of options */ + for (;;) + { + if (!option_defs_us[num_options].key) + break; + num_options++; + } + + /* Allocate arrays */ + variables = (struct retro_variable *)calloc(num_options + 1, sizeof(struct retro_variable)); + values_buf = (char **)calloc(num_options, sizeof(char *)); + + if (!variables || !values_buf) + goto error; + + /* Copy parameters from option_defs_us array */ + for (i = 0; i < num_options; i++) + { + const char *key = option_defs_us[i].key; + const char *desc = option_defs_us[i].desc; + const char *default_value = option_defs_us[i].default_value; + struct retro_core_option_value *values = option_defs_us[i].values; + size_t buf_len = 3; + size_t default_index = 0; + + values_buf[i] = NULL; + + if (desc) + { + size_t num_values = 0; + + /* Determine number of values */ + for (;;) + { + if (!values[num_values].value) + break; + + /* Check if this is the default value */ + if (default_value) + if (strcmp(values[num_values].value, default_value) == 0) + default_index = num_values; + + buf_len += strlen(values[num_values].value); + num_values++; + } + + /* Build values string */ + if (num_values > 0) + { + size_t j; + + buf_len += num_values - 1; + buf_len += strlen(desc); + + values_buf[i] = (char *)calloc(buf_len, sizeof(char)); + if (!values_buf[i]) + goto error; + + strcpy(values_buf[i], desc); + strcat(values_buf[i], "; "); + + /* Default value goes first */ + strcat(values_buf[i], values[default_index].value); + + /* Add remaining values */ + for (j = 0; j < num_values; j++) + { + if (j != default_index) + { + strcat(values_buf[i], "|"); + strcat(values_buf[i], values[j].value); + } + } + } + } + + variables[i].key = key; + variables[i].value = values_buf[i]; + } + + /* Set variables */ + environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); + +error: + + /* Clean up */ + if (values_buf) + { + for (i = 0; i < num_options; i++) + { + if (values_buf[i]) + { + free(values_buf[i]); + values_buf[i] = NULL; + } + } + + free(values_buf); + values_buf = NULL; + } + + if (variables) + { + free(variables); + variables = NULL; + } + } +} + +#ifdef __cplusplus +} +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_default/libretro_core_options_intl.h
Added
@@ -0,0 +1,90 @@ +#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__ +#define LIBRETRO_CORE_OPTIONS_INTL_H__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900) +/* https://support.microsoft.com/en-us/kb/980263 */ +#pragma execution_character_set("utf-8") +#pragma warning(disable:4566) +#endif + +#include <libretro.h> + +/* + ******************************** + * VERSION: 1.3 + ******************************** + * + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ + +/* RETRO_LANGUAGE_JAPANESE */ + +/* RETRO_LANGUAGE_FRENCH */ + +/* RETRO_LANGUAGE_SPANISH */ + +/* RETRO_LANGUAGE_GERMAN */ + +/* RETRO_LANGUAGE_ITALIAN */ + +/* RETRO_LANGUAGE_DUTCH */ + +/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + +/* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + +/* RETRO_LANGUAGE_RUSSIAN */ + +/* RETRO_LANGUAGE_KOREAN */ + +/* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + +/* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + +/* RETRO_LANGUAGE_ESPERANTO */ + +/* RETRO_LANGUAGE_POLISH */ + +/* RETRO_LANGUAGE_VIETNAMESE */ + +/* RETRO_LANGUAGE_ARABIC */ + +/* RETRO_LANGUAGE_GREEK */ + +/* RETRO_LANGUAGE_TURKISH */ + +/* RETRO_LANGUAGE_SLOVAK */ + +/* RETRO_LANGUAGE_PERSIAN */ + +/* RETRO_LANGUAGE_HEBREW */ + +/* RETRO_LANGUAGE_ASTURIAN */ + +/* RETRO_LANGUAGE_FINNISH */ + +#ifdef __cplusplus +} +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_hide_option
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_hide_option/libretro_core_options.h
Added
@@ -0,0 +1,313 @@ +#ifndef LIBRETRO_CORE_OPTIONS_H__ +#define LIBRETRO_CORE_OPTIONS_H__ + +#include <stdlib.h> +#include <string.h> + +#include <libretro.h> +#include <retro_inline.h> + +#ifndef HAVE_NO_LANGEXTRA +#include "libretro_core_options_intl.h" +#endif + +/* + ******************************** + * VERSION: 1.3 + ******************************** + * + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ + +/* RETRO_LANGUAGE_ENGLISH */ + +/* Default language: + * - All other languages must include the same keys and values + * - Will be used as a fallback in the event that frontend language + * is not available + * - Will be used as a fallback for any missing entries in + * frontend language definition */ + +struct retro_core_option_definition option_defs_us[] = { + { + "mycore_region", /* key (option name) */ + "Console Region", /* description (label) */ + "Specify which region the system is from.", /* sublabel */ + { + { "auto", "Auto" }, /* value_1, value_1_label */ + { "ntsc-j", "Japan" }, /* value_2, value_2_label */ + { "ntsc-u", "America" }, /* value_3, value_3_label */ + { "pal", "Europe" }, /* value_4, value_4_label */ + { NULL, NULL }, + }, + "auto" /* default_value */ + }, + { + "mycore_video_scale", + "Video Scale", + "Set internal video scale factor.", + { + { "1x", NULL }, /* If value itself is human-readable (e.g. a number) */ + { "2x", NULL }, /* and can displayed directly, the value_label should */ + { "3x", NULL }, /* be set to NULL */ + { "4x", NULL }, + { NULL, NULL }, + }, + "3x" + }, + /* This 'mycore_show_speedhacks' option will only be shown + * if the frontend supports core options API v1. + * It will be hidden on older frontends. + * See line 227 */ + { + "mycore_show_speedhacks", + "Show Unsafe Settings", + "Enable configuration of emulation speed hacks.", + { + { "enabled", NULL }, + { "disabled", NULL }, + { NULL, NULL}, + }, + "disabled" + }, + { + "mycore_overclock", + "Reduce Slowdown", + "Enable CPU overclock (unsafe).", + { + { "enabled", NULL }, /* If value is equal to 'enabled' or 'disabled', */ + { "disabled", NULL }, /* value_label should be set to NULL */ + { NULL, NULL }, + }, + "disabled" + }, + { NULL, NULL, NULL, {{0}}, NULL }, +}; + +/* + ******************************** + * Language Mapping + ******************************** +*/ + +#ifndef HAVE_NO_LANGEXTRA +struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { + option_defs_us, /* RETRO_LANGUAGE_ENGLISH */ + NULL, /* RETRO_LANGUAGE_JAPANESE */ + NULL, /* RETRO_LANGUAGE_FRENCH */ + NULL, /* RETRO_LANGUAGE_SPANISH */ + NULL, /* RETRO_LANGUAGE_GERMAN */ + NULL, /* RETRO_LANGUAGE_ITALIAN */ + NULL, /* RETRO_LANGUAGE_DUTCH */ + NULL, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + NULL, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + NULL, /* RETRO_LANGUAGE_RUSSIAN */ + NULL, /* RETRO_LANGUAGE_KOREAN */ + NULL, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + NULL, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + NULL, /* RETRO_LANGUAGE_ESPERANTO */ + NULL, /* RETRO_LANGUAGE_POLISH */ + NULL, /* RETRO_LANGUAGE_VIETNAMESE */ + NULL, /* RETRO_LANGUAGE_ARABIC */ + NULL, /* RETRO_LANGUAGE_GREEK */ + NULL, /* RETRO_LANGUAGE_TURKISH */ + NULL, /* RETRO_LANGUAGE_SLOVAK */ + NULL, /* RETRO_LANGUAGE_PERSIAN */ + NULL, /* RETRO_LANGUAGE_HEBREW */ + NULL, /* RETRO_LANGUAGE_ASTURIAN */ + NULL, /* RETRO_LANGUAGE_FINNISH */ +}; +#endif + +/* + ******************************** + * Functions + ******************************** +*/ + +/* Handles configuration/setting of core options. + * Should be called as early as possible - ideally inside + * retro_set_environment(), and no later than retro_load_game() + * > We place the function body in the header to avoid the + * necessity of adding more .c files (i.e. want this to + * be as painless as possible for core devs) + */ + +static INLINE void libretro_set_core_options(retro_environment_t environ_cb) +{ + unsigned version = 0; + + if (!environ_cb) + return; + + if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1)) + { +#ifndef HAVE_NO_LANGEXTRA + struct retro_core_options_intl core_options_intl; + unsigned language = 0; + + core_options_intl.us = option_defs_us; + core_options_intl.local = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) && + (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH)) + core_options_intl.local = option_defs_intl[language]; + + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl); +#else + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us); +#endif + } + else + { + size_t i; + size_t option_index = 0; + size_t num_options = 0; + struct retro_variable *variables = NULL; + char **values_buf = NULL; + + /* Determine number of options + * > Note: We are going to skip a number of irrelevant + * core options when building the retro_variable array, + * but we'll allocate space for all of them. The difference + * in resource usage is negligible, and this allows us to + * keep the code 'cleaner' */ + for (;;) + { + if (!option_defs_us[num_options].key) + break; + num_options++; + } + + /* Allocate arrays */ + variables = (struct retro_variable *)calloc(num_options + 1, sizeof(struct retro_variable)); + values_buf = (char **)calloc(num_options, sizeof(char *)); + + if (!variables || !values_buf) + goto error; + + /* Copy parameters from option_defs_us array */ + for (i = 0; i < num_options; i++) + { + const char *key = option_defs_us[i].key; + const char *desc = option_defs_us[i].desc; + const char *default_value = option_defs_us[i].default_value; + struct retro_core_option_value *values = option_defs_us[i].values; + size_t buf_len = 3; + size_t default_index = 0; + + values_buf[i] = NULL; + + /* Skip options that are irrelevant when using the + * old style core options interface */ + if (strcmp(key, "mycore_show_speedhacks") == 0) + continue; + + if (desc) + { + size_t num_values = 0; + + /* Determine number of values */ + for (;;) + { + if (!values[num_values].value) + break; + + /* Check if this is the default value */ + if (default_value) + if (strcmp(values[num_values].value, default_value) == 0) + default_index = num_values; + + buf_len += strlen(values[num_values].value); + num_values++; + } + + /* Build values string */ + if (num_values > 0) + { + size_t j; + + buf_len += num_values - 1; + buf_len += strlen(desc); + + values_buf[i] = (char *)calloc(buf_len, sizeof(char)); + if (!values_buf[i]) + goto error; + + strcpy(values_buf[i], desc); + strcat(values_buf[i], "; "); + + /* Default value goes first */ + strcat(values_buf[i], values[default_index].value); + + /* Add remaining values */ + for (j = 0; j < num_values; j++) + { + if (j != default_index) + { + strcat(values_buf[i], "|"); + strcat(values_buf[i], values[j].value); + } + } + } + } + + variables[option_index].key = key; + variables[option_index].value = values_buf[i]; + option_index++; + } + + /* Set variables */ + environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); + +error: + + /* Clean up */ + if (values_buf) + { + for (i = 0; i < num_options; i++) + { + if (values_buf[i]) + { + free(values_buf[i]); + values_buf[i] = NULL; + } + } + + free(values_buf); + values_buf = NULL; + } + + if (variables) + { + free(variables); + variables = NULL; + } + } +} + +#ifdef __cplusplus +} +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_hide_option/libretro_core_options_intl.h
Added
@@ -0,0 +1,90 @@ +#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__ +#define LIBRETRO_CORE_OPTIONS_INTL_H__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900) +/* https://support.microsoft.com/en-us/kb/980263 */ +#pragma execution_character_set("utf-8") +#pragma warning(disable:4566) +#endif + +#include <libretro.h> + +/* + ******************************** + * VERSION: 1.3 + ******************************** + * + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ + +/* RETRO_LANGUAGE_JAPANESE */ + +/* RETRO_LANGUAGE_FRENCH */ + +/* RETRO_LANGUAGE_SPANISH */ + +/* RETRO_LANGUAGE_GERMAN */ + +/* RETRO_LANGUAGE_ITALIAN */ + +/* RETRO_LANGUAGE_DUTCH */ + +/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + +/* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + +/* RETRO_LANGUAGE_RUSSIAN */ + +/* RETRO_LANGUAGE_KOREAN */ + +/* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + +/* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + +/* RETRO_LANGUAGE_ESPERANTO */ + +/* RETRO_LANGUAGE_POLISH */ + +/* RETRO_LANGUAGE_VIETNAMESE */ + +/* RETRO_LANGUAGE_ARABIC */ + +/* RETRO_LANGUAGE_GREEK */ + +/* RETRO_LANGUAGE_TURKISH */ + +/* RETRO_LANGUAGE_SLOVAK */ + +/* RETRO_LANGUAGE_PERSIAN */ + +/* RETRO_LANGUAGE_HEBREW */ + +/* RETRO_LANGUAGE_ASTURIAN */ + +/* RETRO_LANGUAGE_FINNISH */ + +#ifdef __cplusplus +} +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_translation
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_translation/libretro_core_options.h
Added
@@ -0,0 +1,286 @@ +#ifndef LIBRETRO_CORE_OPTIONS_H__ +#define LIBRETRO_CORE_OPTIONS_H__ + +#include <stdlib.h> +#include <string.h> + +#include <libretro.h> +#include <retro_inline.h> + +#ifndef HAVE_NO_LANGEXTRA +#include "libretro_core_options_intl.h" +#endif + +/* + ******************************** + * VERSION: 1.3 + ******************************** + * + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ + +/* RETRO_LANGUAGE_ENGLISH */ + +/* Default language: + * - All other languages must include the same keys and values + * - Will be used as a fallback in the event that frontend language + * is not available + * - Will be used as a fallback for any missing entries in + * frontend language definition */ + +struct retro_core_option_definition option_defs_us[] = { + { + "mycore_region", /* key (option name) */ + "Console Region", /* description (label) */ + "Specify which region the system is from.", /* sublabel */ + { + { "auto", "Auto" }, /* value_1, value_1_label */ + { "ntsc-j", "Japan" }, /* value_2, value_2_label */ + { "ntsc-u", "America" }, /* value_3, value_3_label */ + { "pal", "Europe" }, /* value_4, value_4_label */ + { NULL, NULL }, + }, + "auto" /* default_value */ + }, + { + "mycore_video_scale", + "Video Scale", + "Set internal video scale factor.", + { + { "1x", NULL }, /* If value itself is human-readable (e.g. a number) */ + { "2x", NULL }, /* and can displayed directly, the value_label should */ + { "3x", NULL }, /* be set to NULL */ + { "4x", NULL }, + { NULL, NULL }, + }, + "3x" + }, + { + "mycore_overclock", + "Reduce Slowdown", + "Enable CPU overclock (unsafe).", + { + { "enabled", NULL }, /* If value is equal to 'enabled' or 'disabled', */ + { "disabled", NULL }, /* value_label should be set to NULL */ + { NULL, NULL }, + }, + "disabled" + }, + { NULL, NULL, NULL, {{0}}, NULL }, +}; + +/* + ******************************** + * Language Mapping + ******************************** +*/ + +#ifndef HAVE_NO_LANGEXTRA +struct retro_core_option_definition *option_defs_intl[RETRO_LANGUAGE_LAST] = { + option_defs_us, /* RETRO_LANGUAGE_ENGLISH */ + NULL, /* RETRO_LANGUAGE_JAPANESE */ + option_defs_fr, /* RETRO_LANGUAGE_FRENCH */ + NULL, /* RETRO_LANGUAGE_SPANISH */ + NULL, /* RETRO_LANGUAGE_GERMAN */ + NULL, /* RETRO_LANGUAGE_ITALIAN */ + NULL, /* RETRO_LANGUAGE_DUTCH */ + NULL, /* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + NULL, /* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + NULL, /* RETRO_LANGUAGE_RUSSIAN */ + NULL, /* RETRO_LANGUAGE_KOREAN */ + NULL, /* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + NULL, /* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + NULL, /* RETRO_LANGUAGE_ESPERANTO */ + NULL, /* RETRO_LANGUAGE_POLISH */ + NULL, /* RETRO_LANGUAGE_VIETNAMESE */ + NULL, /* RETRO_LANGUAGE_ARABIC */ + NULL, /* RETRO_LANGUAGE_GREEK */ + NULL, /* RETRO_LANGUAGE_TURKISH */ + NULL, /* RETRO_LANGUAGE_SLOVAK */ + NULL, /* RETRO_LANGUAGE_PERSIAN */ + NULL, /* RETRO_LANGUAGE_HEBREW */ + NULL, /* RETRO_LANGUAGE_ASTURIAN */ + NULL, /* RETRO_LANGUAGE_FINNISH */ +}; +#endif + +/* + ******************************** + * Functions + ******************************** +*/ + +/* Handles configuration/setting of core options. + * Should be called as early as possible - ideally inside + * retro_set_environment(), and no later than retro_load_game() + * > We place the function body in the header to avoid the + * necessity of adding more .c files (i.e. want this to + * be as painless as possible for core devs) + */ + +static INLINE void libretro_set_core_options(retro_environment_t environ_cb) +{ + unsigned version = 0; + + if (!environ_cb) + return; + + if (environ_cb(RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION, &version) && (version >= 1)) + { +#ifndef HAVE_NO_LANGEXTRA + struct retro_core_options_intl core_options_intl; + unsigned language = 0; + + core_options_intl.us = option_defs_us; + core_options_intl.local = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_LANGUAGE, &language) && + (language < RETRO_LANGUAGE_LAST) && (language != RETRO_LANGUAGE_ENGLISH)) + core_options_intl.local = option_defs_intl[language]; + + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL, &core_options_intl); +#else + environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS, &option_defs_us); +#endif + } + else + { + size_t i; + size_t num_options = 0; + struct retro_variable *variables = NULL; + char **values_buf = NULL; + + /* Determine number of options */ + for (;;) + { + if (!option_defs_us[num_options].key) + break; + num_options++; + } + + /* Allocate arrays */ + variables = (struct retro_variable *)calloc(num_options + 1, sizeof(struct retro_variable)); + values_buf = (char **)calloc(num_options, sizeof(char *)); + + if (!variables || !values_buf) + goto error; + + /* Copy parameters from option_defs_us array */ + for (i = 0; i < num_options; i++) + { + const char *key = option_defs_us[i].key; + const char *desc = option_defs_us[i].desc; + const char *default_value = option_defs_us[i].default_value; + struct retro_core_option_value *values = option_defs_us[i].values; + size_t buf_len = 3; + size_t default_index = 0; + + values_buf[i] = NULL; + + if (desc) + { + size_t num_values = 0; + + /* Determine number of values */ + for (;;) + { + if (!values[num_values].value) + break; + + /* Check if this is the default value */ + if (default_value) + if (strcmp(values[num_values].value, default_value) == 0) + default_index = num_values; + + buf_len += strlen(values[num_values].value); + num_values++; + } + + /* Build values string */ + if (num_values > 0) + { + size_t j; + + buf_len += num_values - 1; + buf_len += strlen(desc); + + values_buf[i] = (char *)calloc(buf_len, sizeof(char)); + if (!values_buf[i]) + goto error; + + strcpy(values_buf[i], desc); + strcat(values_buf[i], "; "); + + /* Default value goes first */ + strcat(values_buf[i], values[default_index].value); + + /* Add remaining values */ + for (j = 0; j < num_values; j++) + { + if (j != default_index) + { + strcat(values_buf[i], "|"); + strcat(values_buf[i], values[j].value); + } + } + } + } + + variables[i].key = key; + variables[i].value = values_buf[i]; + } + + /* Set variables */ + environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); + +error: + + /* Clean up */ + if (values_buf) + { + for (i = 0; i < num_options; i++) + { + if (values_buf[i]) + { + free(values_buf[i]); + values_buf[i] = NULL; + } + } + + free(values_buf); + values_buf = NULL; + } + + if (variables) + { + free(variables); + variables = NULL; + } + } +} + +#ifdef __cplusplus +} +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/core_options/example_translation/libretro_core_options_intl.h
Added
@@ -0,0 +1,125 @@ +#ifndef LIBRETRO_CORE_OPTIONS_INTL_H__ +#define LIBRETRO_CORE_OPTIONS_INTL_H__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1500 && _MSC_VER < 1900) +/* https://support.microsoft.com/en-us/kb/980263 */ +#pragma execution_character_set("utf-8") +#pragma warning(disable:4566) +#endif + +#include <libretro.h> + +/* + ******************************** + * VERSION: 1.3 + ******************************** + * + * - 1.3: Move translations to libretro_core_options_intl.h + * - libretro_core_options_intl.h includes BOM and utf-8 + * fix for MSVC 2010-2013 + * - Added HAVE_NO_LANGEXTRA flag to disable translations + * on platforms/compilers without BOM support + * - 1.2: Use core options v1 interface when + * RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION is >= 1 + * (previously required RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION == 1) + * - 1.1: Support generation of core options v0 retro_core_option_value + * arrays containing options with a single value + * - 1.0: First commit +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ******************************** + * Core Option Definitions + ******************************** +*/ + +/* RETRO_LANGUAGE_JAPANESE */ + +/* RETRO_LANGUAGE_FRENCH */ + +struct retro_core_option_definition option_defs_fr[] = { + { + "mycore_region", /* key must match option_defs_us entry */ + "Région de la console", /* translated description */ + "Spécifiez la région d'origine du système.", /* translated sublabel */ + { + { "auto", "Auto" }, /* value must match option_defs_us entry */ + { "ntsc-j", "Japon" }, /* > only value_label should be translated */ + { "ntsc-u", "Amérique" }, + { "pal", "L'Europe" }, + { NULL, NULL }, + }, + NULL /* default_value is taken from option_defs_us -> can set to NULL here */ + }, + { + "mycore_video_scale", + "Échelle vidéo", + "Définir le facteur d'échelle vidéo interne.", + { + { NULL, NULL }, /* If value_labels do not require translation (e.g. numbers), values may be omitted */ + }, + NULL + }, + { + "mycore_overclock", + "Réduire le ralentissement", + "Activer l'overclocking du processeur (non sécurisé).", + { + { NULL, NULL }, /* 'enabled' and 'disabled' values should not be translated */ + }, + NULL + }, + { NULL, NULL, NULL, {{0}}, NULL }, +}; + +/* RETRO_LANGUAGE_SPANISH */ + +/* RETRO_LANGUAGE_GERMAN */ + +/* RETRO_LANGUAGE_ITALIAN */ + +/* RETRO_LANGUAGE_DUTCH */ + +/* RETRO_LANGUAGE_PORTUGUESE_BRAZIL */ + +/* RETRO_LANGUAGE_PORTUGUESE_PORTUGAL */ + +/* RETRO_LANGUAGE_RUSSIAN */ + +/* RETRO_LANGUAGE_KOREAN */ + +/* RETRO_LANGUAGE_CHINESE_TRADITIONAL */ + +/* RETRO_LANGUAGE_CHINESE_SIMPLIFIED */ + +/* RETRO_LANGUAGE_ESPERANTO */ + +/* RETRO_LANGUAGE_POLISH */ + +/* RETRO_LANGUAGE_VIETNAMESE */ + +/* RETRO_LANGUAGE_ARABIC */ + +/* RETRO_LANGUAGE_GREEK */ + +/* RETRO_LANGUAGE_TURKISH */ + +/* RETRO_LANGUAGE_SLOVAK */ + +/* RETRO_LANGUAGE_PERSIAN */ + +/* RETRO_LANGUAGE_HEBREW */ + +/* RETRO_LANGUAGE_ASTURIAN */ + +/* RETRO_LANGUAGE_FINNISH */ + +#ifdef __cplusplus +} +#endif + +#endif
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/file/config_file
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/file/config_file/Makefile
Added
@@ -0,0 +1,36 @@ +TARGET := config_file_test + +LIBRETRO_COMM_DIR := ../../.. + +SOURCES := \ + config_file_test.c \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_posix_string.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ + $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.c \ + $(LIBRETRO_COMM_DIR)/file/config_file.c \ + $(LIBRETRO_COMM_DIR)/lists/string_list.c \ + $(LIBRETRO_COMM_DIR)/string/stdstring.c \ + $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ + $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c \ + $(LIBRETRO_COMM_DIR)/time/rtime.c + +OBJS := $(SOURCES:.c=.o) + +CFLAGS += -Wall -pedantic -std=gnu99 -g -I$(LIBRETRO_COMM_DIR)/include + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/file/config_file/config_file_test.c
Added
@@ -0,0 +1,78 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (config_file_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <ctype.h> +#include <errno.h> + +#include <file/config_file.h> + +static void test_config_file_parse_contains( + const char *cfgtext, + const char *key, const char *val) +{ + char *cfgtext_copy = strdup(cfgtext); + config_file_t *cfg = config_file_new_from_string(cfgtext_copy, NULL); + char *out = NULL; + bool ok = false; + + free(cfgtext_copy); + + if (!cfg) + abort(); + + ok = config_get_string(cfg, key, &out); + if (ok != (bool)val) + abort(); + if (!val) + return; + + if (!out) + out = strdup(""); + if (strcmp(out, val) != 0) + { + printf("[FAILED] Key [%s] Doesn't contain val [%s]\n", key, val); + abort(); + } + printf("[SUCCESS] Key [%s] contains val [%s]\n", key, val); + free(out); +} + +int main(void) +{ + test_config_file_parse_contains("foo = \"bar\"\n", "foo", "bar"); + test_config_file_parse_contains("foo = \"bar\"", "foo", "bar"); + test_config_file_parse_contains("foo = \"bar\"\r\n", "foo", "bar"); + test_config_file_parse_contains("foo = \"bar\"", "foo", "bar"); + + test_config_file_parse_contains("foo = \"\"\n", "foo", ""); + test_config_file_parse_contains("foo = \"\"", "foo", ""); + test_config_file_parse_contains("foo = \"\"\r\n", "foo", ""); + test_config_file_parse_contains("foo = \"\"", "foo", ""); + + test_config_file_parse_contains("foo = \"\"\n", "bar", NULL); + test_config_file_parse_contains("foo = \"\"", "bar", NULL); + test_config_file_parse_contains("foo = \"\"\r\n", "bar", NULL); + test_config_file_parse_contains("foo = \"\"", "bar", NULL); +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/formats/png/Makefile -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/formats/png/Makefile
Changed
@@ -32,8 +32,11 @@ $(LIBRETRO_COMM_DIR)/file/archive_file.c \ $(LIBRETRO_COMM_DIR)/file/archive_file_zlib.c \ $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.c \ $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c \ + $(LIBRETRO_COMM_DIR)/streams/interface_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/memory_stream.c \ $(LIBRETRO_COMM_DIR)/streams/trans_stream.c \ $(LIBRETRO_COMM_DIR)/streams/trans_stream_zlib.c \ $(LIBRETRO_COMM_DIR)/streams/trans_stream_pipe.c \
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/formats/png/rpng_test.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/formats/png/rpng_test.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2017 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (rpng_test.c). @@ -65,7 +65,7 @@ goto end; } - if (!rpng_set_buf_ptr(rpng, (uint8_t*)ptr)) + if (!rpng_set_buf_ptr(rpng, (uint8_t*)ptr, file_len)) { ret = false; goto end;
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/formats/xml
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/formats/xml/Makefile
Added
@@ -0,0 +1,32 @@ +TARGET := rxml + +LIBRETRO_XML_DIR := ../../../formats/xml +LIBRETRO_COMM_DIR := ../../../ +LIBRETRO_DEPS_DIR := ../../../../deps + +SOURCES := \ + rxml_test.c \ + $(LIBRETRO_XML_DIR)/rxml.c \ + $(LIBRETRO_DEPS_DIR)/yxml/yxml.c \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ + $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ + $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c + +OBJS := $(SOURCES:.c=.o) + +CFLAGS += -DRXML_TEST -Wall -pedantic -std=gnu99 -g -I$(LIBRETRO_COMM_DIR)/include + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/formats/xml/rxml_test.c
Added
@@ -0,0 +1,66 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rxml_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <formats/rxml.h> +#include <stdio.h> + +static void print_siblings(struct rxml_node *node, unsigned level) +{ + fprintf(stderr, "\n%*sName: %s\n", level * 4, "", node->name); + if (node->data) + fprintf(stderr, "%*sData: %s\n", level * 4, "", node->data); + + for (const struct rxml_attrib_node *attrib = + node->attrib; attrib; attrib = attrib->next) + fprintf(stderr, "%*s Attrib: %s = %s\n", level * 4, "", + attrib->attrib, attrib->value); + + if (node->children) + print_siblings(node->children, level + 1); + + if (node->next) + print_siblings(node->next, level); +} + +static void rxml_log_document(const char *path) +{ + rxml_document_t *doc = rxml_load_document(path); + if (!doc) + { + fprintf(stderr, "rxml: Failed to load document: %s\n", path); + return; + } + + print_siblings(rxml_root_node(doc), 0); + rxml_free_document(doc); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: %s <path>\n", argv[0]); + return 1; + } + + rxml_log_document(argv[1]); +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/net/Makefile -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/net/Makefile
Changed
@@ -1,4 +1,4 @@ -TARGETS = http_test net_ifinfo +TARGETS = http_test http_parse_test net_ifinfo LIBRETRO_COMM_DIR := ../.. @@ -37,6 +37,19 @@ HTTP_TEST_OBJS := $(HTTP_TEST_C:.c=.o) +HTTP_PARSE_TEST_C = \ + $(LIBRETRO_COMM_DIR)/net/net_http.c \ + $(LIBRETRO_COMM_DIR)/net/net_http_parse.c \ + $(LIBRETRO_COMM_DIR)/net/net_compat.c \ + $(LIBRETRO_COMM_DIR)/net/net_socket.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ + $(LIBRETRO_COMM_DIR)/string/stdstring.c \ + net_http_parse_test.c + +HTTP_PARSE_TEST_OBJS := $(HTTP_PARSE_TEST_C:.c=.o) + NET_IFINFO_C = \ $(LIBRETRO_COMM_DIR)/net/net_ifinfo.c \ net_ifinfo_test.c @@ -54,6 +67,9 @@ %.o: %.c $(CC) $(INCFLAGS) $< -c $(CFLAGS) -o $@ +http_parse_test: $(HTTP_PARSE_TEST_OBJS) + $(CC) $(INCFLAGS) $(HTTP_PARSE_TEST_OBJS) $(CFLAGS) -o $@ + http_test: $(HTTP_TEST_OBJS) $(CC) $(INCFLAGS) $(HTTP_TEST_OBJS) $(CFLAGS) -o $@ @@ -61,4 +77,4 @@ $(CC) $(INCFLAGS) $(NET_IFINFO_OBJS) $(CFLAGS) -o $@ clean: - rm -rf $(TARGETS) $(HTTP_TEST_OBJS) $(NET_IFINFO_OBJS) + rm -rf $(TARGETS) $(HTTP_TEST_OBJS) $(HTTP_PARSE_TEST_OBJS) $(NET_IFINFO_OBJS)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/net/net_http_parse_test.c
Added
@@ -0,0 +1,39 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (net_http_parse_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <compat/strcasestr.h> + +int main(int argc, char *argv[]) +{ + char link[1024]; + char name[1024]; + const char *line = "<a href=\"http://www.test.com/somefile.zip\">Test</a>\n"; + + link[0] = name[0] = '\0'; + + string_parse_html_anchor(line, link, name, sizeof(link), sizeof(name)); + + printf("link: %s\nname: %s\n", link, name); + + return 1; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/net/net_http_test.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/net/net_http_test.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2017 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (net_http_test.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/net/net_ifinfo_test.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/net/net_ifinfo_test.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2017 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (net_ifinfo_test.c).
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/net/udp-test.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/net/udp-test.c
Changed
@@ -23,37 +23,33 @@ int main(void) { - struct sockaddr_in si_other; - int s, i, slen=sizeof(si_other); - - if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) - { - die("socket"); - } - - memset((char *) &si_other, 0, sizeof(si_other)); - si_other.sin_family = AF_INET; - si_other.sin_port = htons(PORT); - - if (inet_aton(SERVER , &si_other.sin_addr) == 0) - { - fprintf(stderr, "inet_aton() failed\n"); - exit(1); - } - while(1) - { - - char message[10]="128"; - //send the message - if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1) - { - die("sendto()"); - } - /* sleep for 1 frame (60hz) */ - usleep(16*1000); - - } - - close(s); - return 0; -} \ No newline at end of file + struct sockaddr_in si_other; + int s, i, slen=sizeof(si_other); + + if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) + die("socket"); + + memset((char *) &si_other, 0, sizeof(si_other)); + si_other.sin_family = AF_INET; + si_other.sin_port = htons(PORT); + + if (inet_aton(SERVER , &si_other.sin_addr) == 0) + { + fprintf(stderr, "inet_aton() failed\n"); + exit(1); + } + + for (;;) + { + char message[10]="128"; + /* send the message */ + if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1) + die("sendto()"); + + /* sleep for 1 frame (60hz) */ + usleep(16*1000); + } + + close(s); + return 0; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/streams
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/streams/rzip
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/streams/rzip/Makefile
Added
@@ -0,0 +1,102 @@ +TARGET := rzip + +LIBRETRO_COMM_DIR := ../../.. +LIBRETRO_DEPS_DIR := ../../../../deps + +# Attempt to detect target platform +ifeq '$(findstring ;,$(PATH))' ';' + UNAME := Windows +else + UNAME := $(shell uname 2>/dev/null || echo Unknown) + UNAME := $(patsubst CYGWIN%,Cygwin,$(UNAME)) + UNAME := $(patsubst MSYS%,MSYS,$(UNAME)) + UNAME := $(patsubst MINGW%,MSYS,$(UNAME)) +endif + +# Add '.exe' extension on Windows platforms +ifeq ($(UNAME), Windows) + TARGET := rzip.exe +endif +ifeq ($(UNAME), MSYS) + TARGET := rzip.exe +endif + +SOURCES := \ + rzip.c \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_strcasestr.c \ + $(LIBRETRO_COMM_DIR)/compat/compat_posix_string.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.c \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.c \ + $(LIBRETRO_COMM_DIR)/file/file_path.c \ + $(LIBRETRO_COMM_DIR)/file/file_path_io.c \ + $(LIBRETRO_COMM_DIR)/string/stdstring.c \ + $(LIBRETRO_COMM_DIR)/streams/file_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/file_stream_transforms.c \ + $(LIBRETRO_COMM_DIR)/streams/interface_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/memory_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/rzip_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/stdin_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream_pipe.c \ + $(LIBRETRO_COMM_DIR)/streams/trans_stream_zlib.c \ + $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.c \ + $(LIBRETRO_COMM_DIR)/time/rtime.c + +ifneq ($(wildcard $(LIBRETRO_DEPS_DIR)/*),) + # If we are building from inside the RetroArch + # directory (i.e. if an 'external' deps directory + # is avaiable), bake in zlib support + SOURCES += \ + $(LIBRETRO_DEPS_DIR)/libz/adler32.c \ + $(LIBRETRO_DEPS_DIR)/libz/libz-crc32.c \ + $(LIBRETRO_DEPS_DIR)/libz/deflate.c \ + $(LIBRETRO_DEPS_DIR)/libz/gzclose.c \ + $(LIBRETRO_DEPS_DIR)/libz/gzlib.c \ + $(LIBRETRO_DEPS_DIR)/libz/gzread.c \ + $(LIBRETRO_DEPS_DIR)/libz/gzwrite.c \ + $(LIBRETRO_DEPS_DIR)/libz/inffast.c \ + $(LIBRETRO_DEPS_DIR)/libz/inflate.c \ + $(LIBRETRO_DEPS_DIR)/libz/inftrees.c \ + $(LIBRETRO_DEPS_DIR)/libz/trees.c \ + $(LIBRETRO_DEPS_DIR)/libz/zutil.c + INCLUDE_DIRS := -I$(LIBRETRO_COMM_DIR)/include/compat/zlib +else + # If this is a stand-alone libretro-common directory, + # rely on system zlib library (note: only likely to + # work on Unix-based platforms...) + LDFLAGS += -lz +endif + +OBJS := $(SOURCES:.c=.o) +INCLUDE_DIRS += -I$(LIBRETRO_COMM_DIR)/include +CFLAGS += -DHAVE_ZLIB -Wall -pedantic -std=gnu99 $(INCLUDE_DIRS) + +# Silence "ISO C does not support the 'I64' ms_printf length modifier" +# warnings when using MinGW +ifeq ($(UNAME), Windows) + CFLAGS += -Wno-format +endif +ifeq ($(UNAME), MSYS) + CFLAGS += -Wno-format +endif + +ifeq ($(DEBUG), 1) + CFLAGS += -O0 -g -DDEBUG -D_DEBUG +else + CFLAGS += -O2 -DNDEBUG +endif + +all: $(TARGET) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) $(OBJS) + +.PHONY: clean
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/streams/rzip/rzip.c
Added
@@ -0,0 +1,364 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (config_file_test.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <ctype.h> +#include <inttypes.h> +#include <errno.h> +#include <time.h> + +#include <string/stdstring.h> +#include <file/file_path.h> +#include <streams/interface_stream.h> +#include <streams/file_stream.h> +#include <streams/rzip_stream.h> +#include <retro_miscellaneous.h> + +#define FILE_TRANSFER_CHUNK_SIZE 4096 + +enum rzip_action_type +{ + RZIP_ACTION_QUERY = 0, + RZIP_ACTION_COMPRESS, + RZIP_ACTION_EXTRACT +}; + +static void rand_str(char *dst, size_t len) +{ + char charset[] = "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + while (len-- > 0) + { + size_t i = (double)rand() / RAND_MAX * (sizeof(charset) - 1); + *dst++ = charset[i]; + } + *dst = '\0'; +} + +int main(int argc, char *argv[]) +{ + char in_file_path[PATH_MAX_LENGTH]; + char out_file_path[PATH_MAX_LENGTH]; + enum rzip_action_type action = RZIP_ACTION_QUERY; + intfstream_t *in_file = NULL; + intfstream_t *out_file = NULL; + int64_t in_file_size = 0; + int64_t in_file_raw_size = 0; + int64_t out_file_size = 0; + int64_t file_size_diff = 0; + int64_t total_data_read = 0; + bool in_file_compressed = false; + bool valid_args = false; + bool in_place = false; + int ret = 1; + + in_file_path[0] = '\0'; + out_file_path[0] = '\0'; + + /* Parse arguments */ + if ((argc > 1) && !string_is_empty(argv[1])) + { + valid_args = true; + + if (string_is_equal(argv[1], "i")) + action = RZIP_ACTION_QUERY; + else if (string_is_equal(argv[1], "a")) + action = RZIP_ACTION_COMPRESS; + else if (string_is_equal(argv[1], "x")) + action = RZIP_ACTION_EXTRACT; + else + valid_args = false; + } + + /* Get input file path */ + if (valid_args && (argc > 2) && !string_is_empty(argv[2])) + { + strlcpy(in_file_path, argv[2], sizeof(in_file_path)); + path_resolve_realpath(in_file_path, sizeof(in_file_path), true); + valid_args = valid_args && !string_is_empty(in_file_path); + } + else + valid_args = false; + + /* Ensure arguments are valid */ + if (!valid_args) + { + fprintf(stderr, "Usage:\n"); + fprintf(stderr, "- Query file status: %s i <input file>\n", argv[0]); + fprintf(stderr, "- Compress file: %s a <input file> <output file (optional)>\n", argv[0]); + fprintf(stderr, "- Extract file: %s x <input file> <output file (optional)>\n", argv[0]); + fprintf(stderr, "Omitting <output file> will overwrite <input file>\n"); + goto end; + } + + /* Ensure that input file exists */ + if (!path_is_valid(in_file_path)) + { + fprintf(stderr, "ERROR: Input file does not exist: %s\n", in_file_path); + goto end; + } + + /* Get output file path, if specified */ + if ((argc > 3) && !string_is_empty(argv[3])) + { + strlcpy(out_file_path, argv[3], sizeof(out_file_path)); + path_resolve_realpath(out_file_path, sizeof(out_file_path), true); + } + + /* If we are compressing/extracting and an + * output file was not specified, generate a + * temporary output file path */ + if ((action != RZIP_ACTION_QUERY) && + string_is_empty(out_file_path)) + { + const char *in_file_name = path_basename(in_file_path); + char in_file_dir[PATH_MAX_LENGTH]; + + in_file_dir[0] = '\0'; + + fill_pathname_parent_dir(in_file_dir, in_file_path, sizeof(in_file_dir)); + + if (string_is_empty(in_file_name)) + { + fprintf(stderr, "ERROR: Invalid input file: %s\n", in_file_path); + goto end; + } + + srand((unsigned int)time(NULL)); + + for (;;) + { + char tmp_str[10] = {0}; + + /* Generate 'random' file name */ + rand_str(tmp_str, sizeof(tmp_str) - 1); + tmp_str[0] = '.'; + + out_file_path[0] = '\0'; + + if (!string_is_empty(in_file_dir)) + fill_pathname_join(out_file_path, in_file_dir, + tmp_str, sizeof(out_file_path)); + else + strlcpy(out_file_path, tmp_str, sizeof(out_file_path)); + + strlcat(out_file_path, ".", sizeof(out_file_path)); + strlcat(out_file_path, in_file_name, sizeof(out_file_path)); + path_resolve_realpath(out_file_path, sizeof(out_file_path), true); + + if (!path_is_valid(out_file_path)) + break; + } + + in_place = true; + } + + /* Ensure that input and output files + * are different */ + if (string_is_equal(in_file_path, out_file_path)) + { + fprintf(stderr, "ERROR: Input and output are the same file: %s\n", in_file_path); + goto end; + } + + /* Get input file size */ + in_file_size = (int64_t)path_get_size(in_file_path); + + if (in_file_size < 1) + { + fprintf(stderr, "ERROR: Input file is empty: %s\n", in_file_path); + goto end; + } + + /* Open input file + * > Always use RZIP interface */ + in_file = intfstream_open_rzip_file( + in_file_path, RETRO_VFS_FILE_ACCESS_READ); + + if (!in_file) + { + fprintf(stderr, "ERROR: Failed to open input file: %s\n", in_file_path); + goto end; + } + + /* Get input file compression status */ + in_file_compressed = intfstream_is_compressed(in_file); + + /* Get raw (uncompressed) input file size */ + in_file_raw_size = intfstream_get_size(in_file); + + /* If this is a query operation, just + * print current state */ + if (action == RZIP_ACTION_QUERY) + { + printf("%s: %s\n", + in_file_compressed ? "File is in RZIP format" : "File is NOT in RZIP format", + in_file_path); + printf(" Size on disk: %" PRIi64 " bytes\n", in_file_size); + if (in_file_compressed) + printf(" Uncompressed size: %" PRIi64 " bytes\n", in_file_raw_size); + goto end; + } + + /* Check whether file is already in the + * requested state */ + if ((in_file_compressed && (action == RZIP_ACTION_COMPRESS)) || + (!in_file_compressed && (action == RZIP_ACTION_EXTRACT))) + { + printf("Input file is %s: %s\n", + in_file_compressed ? + "already in RZIP format - cannot compress" : + "not in RZIP format - cannot extract", + in_file_path); + goto end; + } + + /* Check whether output file already exists */ + if (path_is_valid(out_file_path)) + { + char reply[8]; + + reply[0] = '\0'; + + printf("WARNING: Output file already exists: %s\n", out_file_path); + printf(" Overwrite? [Y/n]: "); + fgets(reply, sizeof(reply), stdin); + if (reply[0] != 'Y') + goto end; + } + + /* Open output file */ + if (in_file_compressed) + out_file = intfstream_open_file( + out_file_path, RETRO_VFS_FILE_ACCESS_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + else + out_file = intfstream_open_rzip_file( + out_file_path, RETRO_VFS_FILE_ACCESS_WRITE); + + if (!out_file) + { + fprintf(stderr, "ERROR: Failed to open output file: %s\n", out_file_path); + goto end; + } + + /* Start file transfer */ + printf("%s file\n", in_file_compressed ? "Extracting" : "Compressing"); + printf(" From: %s\n", in_file_path); + printf(" To: %s\n", in_place ? in_file_path : out_file_path); + + for (;;) + { + int64_t data_written = 0; + uint8_t buffer[FILE_TRANSFER_CHUNK_SIZE]; + /* Read a single chunk from input file */ + int64_t data_read = intfstream_read( + in_file, buffer, sizeof(buffer)); + + if (data_read < 0) + { + fprintf(stderr, "ERROR: Failed to read from input file: %s\n", in_file_path); + goto end; + } + + total_data_read += data_read; + + /* Check whether we have reached the end of the file */ + if (data_read == 0) + { + /* Close files */ + intfstream_flush(out_file); + intfstream_close(out_file); + free(out_file); + out_file = NULL; + + intfstream_close(in_file); + free(in_file); + in_file = NULL; + + break; + } + + /* Write chunk to backup file */ + data_written = intfstream_write(out_file, buffer, data_read); + + if (data_written != data_read) + { + fprintf(stderr, "ERROR: Failed to write to output file: %s\n", out_file_path); + goto end; + } + + /* Update progress */ + printf("\rProgress: %" PRIi64 " %%", total_data_read * 100 / in_file_raw_size); + fflush(stdout); + } + printf("\rProgress: 100 %%\n"); + + /* Display final status 'report' */ + printf("%s complete:\n", in_file_compressed ? "Extraction" : "Compression"); + + out_file_size = (int64_t)path_get_size(out_file_path); + file_size_diff = (in_file_size > out_file_size) ? + (in_file_size - out_file_size) : + (out_file_size - in_file_size); + + printf(" %" PRIi64 " -> %" PRIi64 " bytes [%" PRIi64 " %% %s]\n", + in_file_size, out_file_size, + file_size_diff * 100 / in_file_size, + (out_file_size >= in_file_size) ? + "increase" : "decrease"); + + /* If this was an in-place operation, + * replace input file with output file */ + if (in_place) + { + filestream_delete(in_file_path); + if (filestream_rename(out_file_path, in_file_path)) + { + fprintf(stderr, "ERROR: Failed to rename temporary file\n"); + fprintf(stderr, " From: %s\n", out_file_path); + fprintf(stderr, " To: %s\n", in_file_path); + goto end; + } + } + + ret = 0; + +end: + if (in_file) + { + intfstream_close(in_file); + free(in_file); + } + + if (out_file) + { + intfstream_close(out_file); + free(out_file); + } + + return ret; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/samples/utils/Makefile -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/utils/Makefile
Changed
@@ -52,6 +52,7 @@ EXE_EXT = .exe endif +PWD_DIR := . LIBRETRO_COMM_DIR := ../.. CORE_DIR := $(LIBRETRO_COMM_DIR)/utils @@ -67,23 +68,33 @@ asflags += -mfpu=neon endif -OBJS += $(CORE_DIR)/djb2.o \ - $(CORE_DIR)/md5.o \ - $(CORE_DIR)/sha1.o \ - $(CORE_DIR)/sha1_main.o \ - $(CORE_DIR)/crc32.o +DJB2_OBJS := $(CORE_DIR)/djb2.o + +MD5_OBJS := $(CORE_DIR)/md5.o \ + $(PWD_DIR)/md5_test.o + +SHA1_OBJS := $(CORE_DIR)/sha1.o \ + $(PWD_DIR)/sha1_main.o + +CRC32_OBJS := $(PWD_DIR)/crc32.o \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.o \ + $(LIBRETRO_COMM_DIR)/compat/compat_strl.o \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.o \ + $(LIBRETRO_COMM_DIR)/streams/file_stream.o \ + $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.o \ + $(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.o UTILS := djb2$(EXE_EXT) md5$(EXE_EXT) sha1$(EXE_EXT) crc32$(EXE_EXT) all: $(UTILS) -djb2$(EXE_EXT): $(CORE_DIR)/djb2.o +djb2$(EXE_EXT): $(DJB2_OBJS) -md5$(EXE_EXT): $(CORE_DIR)/md5.o +md5$(EXE_EXT): $(MD5_OBJS) -sha1$(EXE_EXT): $(CORE_DIR)/sha1.o $(CORE_DIR)/sha1_main.o +sha1$(EXE_EXT): $(SHA1_OBJS) -crc32$(EXE_EXT): $(CORE_DIR)/crc32.o $(CORE_DIR)/../encodings/encoding_crc32.o +crc32$(EXE_EXT): $(CRC32_OBJS) %.o: %.S $(CC) -c -o $@ $(asflags) $(LDFLAGS) $(ASMFLAGS) $<
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/utils/crc32.c
Changed
(renamed from src/libretro-common/utils/crc32.c)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/utils/md5_test.c
Added
@@ -0,0 +1,85 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer <solar at openwall.com> + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * (This is a heavily cut-down "BSD license".) + * + * This differs from Colin Plumb's older public domain implementation in that + * no exactly 32-bit integer data type is required (any 32-bit or wider + * unsigned integer data type will do), there's no compile-time endianness + * configuration, and the function prototypes match OpenSSL's. No code from + * Colin Plumb's implementation has been reused; this comment merely compares + * the properties of the two independent implementations. + * + * The primary goals of this implementation are portability and ease of use. + * It is meant to be fast, but not as fast as possible. Some known + * optimizations are not included to reduce source code size and avoid + * compile-time configuration. + */ +#include <stdio.h> +#include <string.h> + +#include <lrc_hash.h> + +int main (int argc, char *argv[]) +{ + /* For each command line argument in turn: + ** filename -- prints message digest and name of file + */ + int i; + MD5_CTX ctx; + FILE* file; + size_t numread; + char buffer[16384]; + unsigned char result[16]; + + for (i = 1; i < argc; i++) + { + MD5_Init(&ctx); + file = fopen(argv[i], "rb"); + + if (file) + { + do + { + numread = fread((void*)buffer, 1, sizeof(buffer), file); + + if (numread) + { + MD5_Update(&ctx,(void*)buffer, numread); + } + } + while (numread); + + fclose(file); + MD5_Final(result, &ctx); + printf("%02x%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x%02x%02x %s\n", + result[ 0 ], result[ 1 ], result[ 2 ], result[ 3 ], + result[ 4 ], result[ 5 ], result[ 6 ], result[ 7 ], + result[ 8 ], result[ 9 ], result[ 10 ], result[ 11 ], + result[ 12 ], result[ 13 ], result[ 14 ], result[ 15 ], + argv[i]); + } + } + + return 0; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/samples/utils/sha1_main.c
Added
@@ -0,0 +1,189 @@ +/* + * sha.cpp + * + * Copyright (C) 1998, 2009 + * Paul E. Jones <paulej@packetizer.com> + * All Rights Reserved + * + ***************************************************************************** + * $Id: sha.c 12 2009-06-22 19:34:25Z paulej $ + ***************************************************************************** + * + * Description: + * This utility will display the message digest (fingerprint) for + * the specified file(s). + * + * Portability Issues: + * None. + */ + +#include <stdio.h> +#include <string.h> +#ifdef _WIN32 +#include <io.h> +#endif +#include <fcntl.h> +#include <string/stdstring.h> +/*#include "sha1.h"*/ + +/* + * Function prototype + */ +void usage(void); + +/* + * main + * + * Description: + * This is the entry point for the program + * + * Parameters: + * argc: [in] + * This is the count of arguments in the argv array + * argv: [in] + * This is an array of filenames for which to compute message + * digests + * + * Returns: + * Nothing. + * + * Comments: + * + */ +typedef struct SHA1Context +{ + unsigned Message_Digest[5]; /* Message Digest (output) */ + + unsigned Length_Low; /* Message length in bits */ + unsigned Length_High; /* Message length in bits */ + + unsigned char Message_Block[64]; /* 512-bit message blocks */ + int Message_Block_Index; /* Index into message block array */ + + int Computed; /* Is the digest computed? */ + int Corrupted; /* Is the message digest corruped? */ +} SHA1Context; + +int main(int argc, char *argv[]) +{ + struct SHA1Context sha; /* SHA-1 context */ + FILE *fp; /* File pointer for reading files*/ + char c; /* Character read from file */ + int i; /* Counter */ + int reading_stdin; /* Are we reading standard in? */ + int read_stdin = 0; /* Have we read stdin? */ + + /* + * Check the program arguments and print usage information if -? + * or --help is passed as the first argument. + */ + if (argc > 1 && (string_is_equal(argv[1],"-?") || + string_is_equal(argv[1],"--help"))) + { + usage(); + return 1; + } + + /* + * For each filename passed in on the command line, calculate the + * SHA-1 value and display it. + */ + for (i = 0; i < argc; i++) + { + /* + * We start the counter at 0 to guarantee entry into the for + * loop. So if 'i' is zero, we will increment it now. If there + * is no argv[1], we will use STDIN below. + */ + if (i == 0) + i++; + + if (argc == 1 || string_is_equal(argv[i],"-")) + { +#ifdef WIN32 + setmode(fileno(stdin), _O_BINARY); +#endif + fp = stdin; + reading_stdin = 1; + } + else + { + if (!(fp = fopen(argv[i],"rb"))) + { + fprintf(stderr, + "sha: unable to open file %s\n", + argv[i]); + return 2; + } + reading_stdin = 0; + } + + /* + * We do not want to read STDIN multiple times + */ + if (reading_stdin) + { + if (read_stdin) + continue; + + read_stdin = 1; + } + + /* + * Reset the SHA-1 context and process input + */ + SHA1Reset(&sha); + + c = fgetc(fp); + while(!feof(fp)) + { + SHA1Input(&sha, &c, 1); + c = fgetc(fp); + } + + if (!reading_stdin) + fclose(fp); + + if (!SHA1Result(&sha)) + { + fprintf(stderr, + "sha: could not compute message digest for %s\n", + reading_stdin?"STDIN":argv[i]); + } + else + { + printf( "%08X %08X %08X %08X %08X - %s\n", + sha.Message_Digest[0], + sha.Message_Digest[1], + sha.Message_Digest[2], + sha.Message_Digest[3], + sha.Message_Digest[4], + reading_stdin?"STDIN":argv[i]); + } + } + + return 0; +} + +/* + * usage + * + * Description: + * This function will display program usage information to the + * user. + * + * Parameters: + * None. + * + * Returns: + * Nothing. + * + * Comments: + * + */ +void usage(void) +{ + printf("usage: sha <file> [<file> ...]\n"); + printf("\tThis program will display the message digest\n"); + printf("\tfor files using the Secure Hashing Algorithm (SHA-1).\n"); +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/chd_stream.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/chd_stream.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (chd_stream.c). @@ -29,6 +29,7 @@ #include <streams/chd_stream.h> #include <retro_endianness.h> #include <libchdr/chd.h> +#include <string/stdstring.h> #define SECTOR_SIZE 2352 #define SUBCODE_SIZE 96 @@ -37,16 +38,8 @@ struct chdstream { chd_file *chd; - /* Should we swap bytes? */ - bool swab; - /* Size of frame taken from each hunk */ - uint32_t frame_size; - /* Offset of data within frame */ - uint32_t frame_offset; - /* Number of frames per hunk */ - uint32_t frames_per_hunk; - /* First frame of track in chd */ - uint32_t track_frame; + /* Loaded hunk */ + uint8_t *hunkmem; /* Byte offset where track data starts (after pregap) */ size_t track_start; /* Byte offset where track data ends */ @@ -55,15 +48,20 @@ size_t offset; /* Loaded hunk number */ int32_t hunknum; - /* Loaded hunk */ - uint8_t *hunkmem; + /* Size of frame taken from each hunk */ + uint32_t frame_size; + /* Offset of data within frame */ + uint32_t frame_offset; + /* Number of frames per hunk */ + uint32_t frames_per_hunk; + /* First frame of track in chd */ + uint32_t track_frame; + /* Should we swap bytes? */ + bool swab; }; -typedef struct metadata { - char type[64]; - char subtype[32]; - char pgtype[32]; - char pgsub[32]; +typedef struct metadata +{ uint32_t frame_offset; uint32_t frames; uint32_t pad; @@ -71,6 +69,10 @@ uint32_t pregap; uint32_t postgap; uint32_t track; + char type[64]; + char subtype[32]; + char pgtype[32]; + char pgsub[32]; } metadata_t; static uint32_t padding_frames(uint32_t frames) @@ -165,8 +167,11 @@ *meta = iter; return true; } - else if (track == CHDSTREAM_TRACK_PRIMARY && largest_track != 0) + + if (track == CHDSTREAM_TRACK_PRIMARY && largest_track != 0) return chdstream_find_track_number(fd, largest_track, meta); + + return false; } switch (track) @@ -181,7 +186,7 @@ case CHDSTREAM_TRACK_PRIMARY: if (strcmp(iter.type, "AUDIO") && iter.frames > largest_size) { - largest_size = iter.frames; + largest_size = iter.frames; largest_track = iter.track; } break; @@ -202,63 +207,64 @@ chdstream_t *chdstream_open(const char *path, int32_t track) { metadata_t meta; - uint32_t pregap = 0; - const chd_header *hd = NULL; - chdstream_t *stream = NULL; - chd_file *chd = NULL; - chd_error err = chd_open(path, CHD_OPEN_READ, NULL, &chd); + uint32_t pregap = 0; + uint8_t *hunkmem = NULL; + const chd_header *hd = NULL; + chdstream_t *stream = NULL; + chd_file *chd = NULL; + chd_error err = chd_open(path, CHD_OPEN_READ, NULL, &chd); if (err != CHDERR_NONE) - goto error; + return NULL; if (!chdstream_find_track(chd, track, &meta)) goto error; - stream = (chdstream_t*)calloc(1, sizeof(*stream)); + stream = (chdstream_t*)malloc(sizeof(*stream)); if (!stream) goto error; - hd = chd_get_header(chd); - stream->hunkmem = (uint8_t*)malloc(hd->hunkbytes); - if (!stream->hunkmem) + stream->chd = NULL; + stream->swab = false; + stream->frame_size = 0; + stream->frame_offset = 0; + stream->frames_per_hunk = 0; + stream->track_frame = 0; + stream->track_start = 0; + stream->track_end = 0; + stream->offset = 0; + stream->hunkmem = NULL; + stream->hunknum = -1; + + hd = chd_get_header(chd); + hunkmem = (uint8_t*)malloc(hd->hunkbytes); + if (!hunkmem) goto error; - if (!strcmp(meta.type, "MODE1_RAW")) - { - stream->frame_size = SECTOR_SIZE; - stream->frame_offset = 0; - } - else if (!strcmp(meta.type, "MODE2_RAW")) - { - stream->frame_size = SECTOR_SIZE; - stream->frame_offset = 0; - } - else if (!strcmp(meta.type, "AUDIO")) + stream->hunkmem = hunkmem; + + if (string_is_equal(meta.type, "MODE1_RAW")) + stream->frame_size = SECTOR_SIZE; + else if (string_is_equal(meta.type, "MODE2_RAW")) + stream->frame_size = SECTOR_SIZE; + else if (string_is_equal(meta.type, "AUDIO")) { - stream->frame_size = SECTOR_SIZE; - stream->frame_offset = 0; - stream->swab = true; + stream->frame_size = SECTOR_SIZE; + stream->swab = true; } else - { - stream->frame_size = hd->unitbytes; - stream->frame_offset = 0; - } + stream->frame_size = hd->unitbytes; /* Only include pregap data if it was in the track file */ - if (!strcmp(meta.type, meta.pgtype)) - pregap = meta.pregap; - else - pregap = 0; + if (meta.pgtype[0] != 'V') + pregap = meta.pregap; stream->chd = chd; stream->frames_per_hunk = hd->hunkbytes / hd->unitbytes; stream->track_frame = meta.frame_offset; - stream->track_start = (size_t) pregap * stream->frame_size; - stream->track_end = stream->track_start + - (size_t) meta.frames * stream->frame_size; - stream->offset = 0; - stream->hunknum = -1; + stream->track_start = (size_t)pregap * stream->frame_size; + stream->track_end = stream->track_start + + (size_t)meta.frames * stream->frame_size; return stream; @@ -274,35 +280,32 @@ void chdstream_close(chdstream_t *stream) { - if (stream) - { - if (stream->hunkmem) - free(stream->hunkmem); - if (stream->chd) - chd_close(stream->chd); - free(stream); - } + if (!stream) + return; + + if (stream->hunkmem) + free(stream->hunkmem); + if (stream->chd) + chd_close(stream->chd); + free(stream); } static bool chdstream_load_hunk(chdstream_t *stream, uint32_t hunknum) { - chd_error err; uint16_t *array; - uint32_t i; - uint32_t count; if (hunknum == stream->hunknum) return true; - err = chd_read(stream->chd, hunknum, stream->hunkmem); - if (err != CHDERR_NONE) + if (chd_read(stream->chd, hunknum, stream->hunkmem) != CHDERR_NONE) return false; if (stream->swab) { - count = chd_get_header(stream->chd)->hunkbytes / 2; - array = (uint16_t*) stream->hunkmem; + uint32_t i; + uint32_t count = chd_get_header(stream->chd)->hunkbytes / 2; + array = (uint16_t*)stream->hunkmem; for (i = 0; i < count; ++i) array[i] = SWAP16(array[i]); } @@ -314,40 +317,37 @@ ssize_t chdstream_read(chdstream_t *stream, void *data, size_t bytes) { size_t end; - uint32_t frame_offset; - uint32_t hunk_offset; - uint32_t chd_frame; - uint32_t hunk; - uint32_t amount; size_t data_offset = 0; const chd_header *hd = chd_get_header(stream->chd); uint8_t *out = (uint8_t*)data; if (stream->track_end - stream->offset < bytes) - bytes = stream->track_end - stream->offset; + bytes = stream->track_end - stream->offset; + + end = stream->offset + bytes; - end = stream->offset + bytes; while (stream->offset < end) { - frame_offset = stream->offset % stream->frame_size; - amount = stream->frame_size - frame_offset; + uint32_t frame_offset = stream->offset % stream->frame_size; + uint32_t amount = stream->frame_size - frame_offset; + if (amount > end - stream->offset) - amount = end - stream->offset; + amount = (uint32_t)(end - stream->offset); /* In pregap */ if (stream->offset < stream->track_start) memset(out + data_offset, 0, amount); else { - chd_frame = stream->track_frame + - (stream->offset - stream->track_start) / stream->frame_size; - hunk = chd_frame / stream->frames_per_hunk; - hunk_offset = (chd_frame % stream->frames_per_hunk) * hd->unitbytes; + uint32_t chd_frame = (uint32_t)(stream->track_frame + + (stream->offset - stream->track_start) / stream->frame_size); + uint32_t hunk = chd_frame / stream->frames_per_hunk; + uint32_t hunk_offset = (chd_frame % stream->frames_per_hunk) + * hd->unitbytes; if (!chdstream_load_hunk(stream, hunk)) - { return -1; - } + memcpy(out + data_offset, stream->hunkmem + frame_offset + hunk_offset + stream->frame_offset, amount); @@ -380,7 +380,7 @@ buffer[offset++] = c; if (offset < len) - buffer[offset] = '\0'; + buffer[offset] = '\0'; return buffer; } @@ -426,5 +426,27 @@ ssize_t chdstream_get_size(chdstream_t *stream) { - return stream->track_end; + return stream->track_end - stream->track_start; +} + +uint32_t chdstream_get_track_start(chdstream_t *stream) +{ + uint32_t i; + metadata_t meta; + uint32_t frame_offset = 0; + + for (i = 0; chdstream_get_meta(stream->chd, i, &meta); ++i) + { + if (stream->track_frame == frame_offset) + return meta.pregap * stream->frame_size; + + frame_offset += meta.frames + meta.extra; + } + + return 0; +} + +uint32_t chdstream_get_frame_size(chdstream_t *stream) +{ + return stream->frame_size; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/file_stream.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/file_stream.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (file_stream.c). @@ -31,11 +31,23 @@ #include "config.h" #endif +#ifdef _MSC_VER +#include <compat/msvc.h> +#endif + +#include <string/stdstring.h> #include <streams/file_stream.h> #define VFS_FRONTEND #include <vfs/vfs_implementation.h> -static const int64_t vfs_error_return_value = -1; +#define VFS_ERROR_RETURN_VALUE -1 + +struct RFILE +{ + struct retro_vfs_file_handle *hfile; + bool error_flag; + bool eof_flag; +}; static retro_vfs_get_path_t filestream_get_path_cb = NULL; static retro_vfs_open_t filestream_open_cb = NULL; @@ -50,18 +62,12 @@ static retro_vfs_remove_t filestream_remove_cb = NULL; static retro_vfs_rename_t filestream_rename_cb = NULL; -struct RFILE -{ - struct retro_vfs_file_handle *hfile; - bool error_flag; - bool eof_flag; -}; - /* VFS Initialization */ void filestream_vfs_init(const struct retro_vfs_interface_info* vfs_info) { - const struct retro_vfs_interface* vfs_iface; + const struct retro_vfs_interface * + vfs_iface = vfs_info->iface; filestream_get_path_cb = NULL; filestream_open_cb = NULL; @@ -76,9 +82,9 @@ filestream_remove_cb = NULL; filestream_rename_cb = NULL; - vfs_iface = vfs_info->iface; - - if (vfs_info->required_interface_version < FILESTREAM_REQUIRED_VFS_VERSION + if ( + (vfs_info->required_interface_version < + FILESTREAM_REQUIRED_VFS_VERSION) || !vfs_iface) return; @@ -99,19 +105,24 @@ /* Callback wrappers */ bool filestream_exists(const char *path) { - RFILE *dummy = NULL; + RFILE *dummy = NULL; if (!path || !*path) return false; - dummy = filestream_open(path, + dummy = filestream_open( + path, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE); if (!dummy) return false; - filestream_close(dummy); + if (filestream_close(dummy) != 0) + if (dummy) + free(dummy); + + dummy = NULL; return true; } @@ -119,12 +130,13 @@ { int64_t output; - if (filestream_size_cb != NULL) + if (filestream_size_cb) output = filestream_size_cb(stream->hfile); else - output = retro_vfs_file_size_impl((libretro_vfs_implementation_file*)stream->hfile); + output = retro_vfs_file_size_impl( + (libretro_vfs_implementation_file*)stream->hfile); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; return output; @@ -134,12 +146,13 @@ { int64_t output; - if (filestream_truncate_cb != NULL) + if (filestream_truncate_cb) output = filestream_truncate_cb(stream->hfile, length); else - output = retro_vfs_file_truncate_impl((libretro_vfs_implementation_file*)stream->hfile, length); + output = retro_vfs_file_truncate_impl( + (libretro_vfs_implementation_file*)stream->hfile, length); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; return output; @@ -154,12 +167,12 @@ * Opens a file for reading or writing, depending on the requested mode. * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ -RFILE *filestream_open(const char *path, unsigned mode, unsigned hints) +RFILE* filestream_open(const char *path, unsigned mode, unsigned hints) { struct retro_vfs_file_handle *fp = NULL; RFILE* output = NULL; - if (filestream_open_cb != NULL) + if (filestream_open_cb) fp = (struct retro_vfs_file_handle*) filestream_open_cb(path, mode, hints); else @@ -176,7 +189,7 @@ return output; } -char *filestream_gets(RFILE *stream, char *s, size_t len) +char* filestream_gets(RFILE *stream, char *s, size_t len) { int c = 0; char *p = s; @@ -203,10 +216,8 @@ int filestream_getc(RFILE *stream) { char c = 0; - if (!stream) - return 0; - if(filestream_read(stream, &c, 1) == 1) - return (int)c; + if (stream && filestream_read(stream, &c, 1) == 1) + return (int)(unsigned char)c; return EOF; } @@ -215,12 +226,14 @@ char buf[4096]; char subfmt[64]; va_list args; - const char * bufiter = buf; - int64_t startpos = filestream_tell(stream); int ret = 0; + int64_t startpos = filestream_tell(stream); int64_t maxlen = filestream_read(stream, buf, sizeof(buf)-1); + if (maxlen <= 0) + return EOF; + buf[maxlen] = '\0'; va_start(args, format); @@ -230,7 +243,6 @@ if (*format == '%') { int sublen; - char* subfmtiter = subfmt; bool asterisk = false; @@ -240,19 +252,25 @@ if (*format == '*') { - asterisk = true; + asterisk = true; *subfmtiter++ = *format++; } - while (isdigit(*format)) *subfmtiter++ = *format++; /* width */ + while (ISDIGIT((unsigned char)*format)) + *subfmtiter++ = *format++; /* width */ /* length */ if (*format == 'h' || *format == 'l') { - if (format[1] == format[0]) *subfmtiter++ = *format++; - *subfmtiter++ = *format++; + if (format[1] == format[0]) + *subfmtiter++ = *format++; + *subfmtiter++ = *format++; } - else if (*format == 'j' || *format == 'z' || *format == 't' || *format == 'L') + else if ( + *format == 'j' || + *format == 'z' || + *format == 't' || + *format == 'L') { *subfmtiter++ = *format++; } @@ -260,31 +278,44 @@ /* specifier - always a single character (except ]) */ if (*format == '[') { - while (*format != ']') *subfmtiter++ = *format++; - *subfmtiter++ = *format++; + while (*format != ']') + *subfmtiter++ = *format++; + *subfmtiter++ = *format++; } - else *subfmtiter++ = *format++; + else + *subfmtiter++ = *format++; + + *subfmtiter++ = '%'; + *subfmtiter++ = 'n'; + *subfmtiter++ = '\0'; - *subfmtiter++ = '%'; - *subfmtiter++ = 'n'; - *subfmtiter++ = '\0'; + if (sizeof(void*) != sizeof(long*)) + abort(); /* all pointers must have the same size */ - if (sizeof(void*) != sizeof(long*)) abort(); /* all pointers must have the same size */ if (asterisk) { - if (sscanf(bufiter, subfmt, &sublen) != 0) break; + int v = sscanf(bufiter, subfmt, &sublen); + if (v == EOF) + return EOF; + if (v != 0) + break; } else { - if (sscanf(bufiter, subfmt, va_arg(args, void*), &sublen) != 1) break; + int v = sscanf(bufiter, subfmt, va_arg(args, void*), &sublen); + if (v == EOF) + return EOF; + if (v != 1) + break; } ret++; bufiter += sublen; } - else if (isspace(*format)) + else if (isspace((unsigned char)*format)) { - while (isspace(*bufiter)) bufiter++; + while (isspace((unsigned char)*bufiter)) + bufiter++; format++; } else @@ -297,7 +328,8 @@ } va_end(args); - filestream_seek(stream, startpos+(bufiter-buf), RETRO_VFS_SEEK_POSITION_START); + filestream_seek(stream, startpos+(bufiter-buf), + RETRO_VFS_SEEK_POSITION_START); return ret; } @@ -306,14 +338,17 @@ { int64_t output; - if (filestream_seek_cb != NULL) + if (filestream_seek_cb) output = filestream_seek_cb(stream->hfile, offset, seek_position); else - output = retro_vfs_file_seek_impl((libretro_vfs_implementation_file*)stream->hfile, offset, seek_position); + output = retro_vfs_file_seek_impl( + (libretro_vfs_implementation_file*)stream->hfile, + offset, seek_position); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; - stream->eof_flag = false; + + stream->eof_flag = false; return output; } @@ -327,12 +362,13 @@ { int64_t output; - if (filestream_size_cb != NULL) + if (filestream_size_cb) output = filestream_tell_cb(stream->hfile); else - output = retro_vfs_file_tell_impl((libretro_vfs_implementation_file*)stream->hfile); + output = retro_vfs_file_tell_impl( + (libretro_vfs_implementation_file*)stream->hfile); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; return output; @@ -344,23 +380,23 @@ return; filestream_seek(stream, 0L, RETRO_VFS_SEEK_POSITION_START); stream->error_flag = false; - stream->eof_flag = false; + stream->eof_flag = false; } int64_t filestream_read(RFILE *stream, void *s, int64_t len) { int64_t output; - if (filestream_read_cb != NULL) + if (filestream_read_cb) output = filestream_read_cb(stream->hfile, s, len); else output = retro_vfs_file_read_impl( (libretro_vfs_implementation_file*)stream->hfile, s, len); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; if (output < len) - stream->eof_flag = true; + stream->eof_flag = true; return output; } @@ -369,12 +405,13 @@ { int output; - if (filestream_flush_cb != NULL) + if (filestream_flush_cb) output = filestream_flush_cb(stream->hfile); else - output = retro_vfs_file_flush_impl((libretro_vfs_implementation_file*)stream->hfile); + output = retro_vfs_file_flush_impl( + (libretro_vfs_implementation_file*)stream->hfile); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; return output; @@ -382,7 +419,7 @@ int filestream_delete(const char *path) { - if (filestream_remove_cb != NULL) + if (filestream_remove_cb) return filestream_remove_cb(path); return retro_vfs_file_remove_impl(path); @@ -390,30 +427,32 @@ int filestream_rename(const char *old_path, const char *new_path) { - if (filestream_rename_cb != NULL) + if (filestream_rename_cb) return filestream_rename_cb(old_path, new_path); return retro_vfs_file_rename_impl(old_path, new_path); } -const char *filestream_get_path(RFILE *stream) +const char* filestream_get_path(RFILE *stream) { - if (filestream_get_path_cb != NULL) + if (filestream_get_path_cb) return filestream_get_path_cb(stream->hfile); - return retro_vfs_file_get_path_impl((libretro_vfs_implementation_file*)stream->hfile); + return retro_vfs_file_get_path_impl( + (libretro_vfs_implementation_file*)stream->hfile); } int64_t filestream_write(RFILE *stream, const void *s, int64_t len) { int64_t output; - if (filestream_write_cb != NULL) + if (filestream_write_cb) output = filestream_write_cb(stream->hfile, s, len); else - output = retro_vfs_file_write_impl((libretro_vfs_implementation_file*)stream->hfile, s, len); + output = retro_vfs_file_write_impl( + (libretro_vfs_implementation_file*)stream->hfile, s, len); - if (output == vfs_error_return_value) + if (output == VFS_ERROR_RETURN_VALUE) stream->error_flag = true; return output; @@ -424,13 +463,16 @@ char c_char = (char)c; if (!stream) return EOF; - return filestream_write(stream, &c_char, 1)==1 ? c : EOF; + return filestream_write(stream, &c_char, 1) == 1 + ? (int)(unsigned char)c + : EOF; } int filestream_vprintf(RFILE *stream, const char* format, va_list args) { static char buffer[8 * 1024]; - int64_t num_chars = vsprintf(buffer, format, args); + int64_t num_chars = vsnprintf(buffer, sizeof(buffer), + format, args); if (num_chars < 0) return -1; @@ -462,10 +504,11 @@ int output; struct retro_vfs_file_handle* fp = stream->hfile; - if (filestream_close_cb != NULL) + if (filestream_close_cb) output = filestream_close_cb(fp); else - output = retro_vfs_file_close_impl((libretro_vfs_implementation_file*)fp); + output = retro_vfs_file_close_impl( + (libretro_vfs_implementation_file*)fp); if (output == 0) free(stream); @@ -478,10 +521,11 @@ * @path : path to file. * @buf : buffer to allocate and read the contents of the * file into. Needs to be freed manually. + * @len : optional output integer containing bytes read. * * Read the contents of a file into @buf. * - * Returns: number of items read, -1 on error. + * Returns: non zero on success. */ int64_t filestream_read_file(const char *path, void **buf, int64_t *len) { @@ -494,8 +538,8 @@ if (!file) { - fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); - goto error; + *buf = NULL; + return 0; } content_buf_size = filestream_get_size(file); @@ -512,12 +556,11 @@ ret = filestream_read(file, content_buf, (int64_t)content_buf_size); if (ret < 0) - { - fprintf(stderr, "Failed to read %s: %s\n", path, strerror(errno)); goto error; - } - filestream_close(file); + if (filestream_close(file) != 0) + if (file) + free(file); *buf = content_buf; @@ -532,7 +575,8 @@ error: if (file) - filestream_close(file); + if (filestream_close(file) != 0) + free(file); if (content_buf) free(content_buf); if (len) @@ -561,7 +605,9 @@ return false; ret = filestream_write(file, data, size); - filestream_close(file); + if (filestream_close(file) != 0) + if (file) + free(file); if (ret != size) return false; @@ -569,13 +615,14 @@ return true; } -char *filestream_getline(RFILE *stream) +/* Returned pointer must be freed by the caller. */ +char* filestream_getline(RFILE *stream) { - char* newline_tmp = NULL; + char *newline_tmp = NULL; size_t cur_size = 8; size_t idx = 0; int in = 0; - char* newline = (char*)malloc(9); + char *newline = (char*)malloc(9); if (!stream || !newline) { @@ -609,3 +656,8 @@ newline[idx] = '\0'; return newline; } + +libretro_vfs_implementation_file* filestream_get_vfs_handle(RFILE *stream) +{ + return (libretro_vfs_implementation_file*)stream->hfile; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/file_stream_transforms.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/file_stream_transforms.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (file_stream_transforms.c). @@ -99,7 +99,7 @@ int64_t rfread(void* buffer, size_t elem_size, size_t elem_count, RFILE* stream) { - return filestream_read(stream, buffer, elem_size * elem_count); + return (filestream_read(stream, buffer, elem_size * elem_count) / elem_size); } char *rfgets(char *buffer, int maxCount, RFILE* stream)
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/interface_stream.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/interface_stream.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (interface_stream.c). @@ -28,11 +28,13 @@ #ifdef HAVE_CHD #include <streams/chd_stream.h> #endif +#if defined(HAVE_ZLIB) +#include <streams/rzip_stream.h> +#endif +#include <encodings/crc32.h> struct intfstream_internal { - enum intfstream_type type; - struct { RFILE *fp; @@ -40,21 +42,28 @@ struct { + memstream_t *fp; struct { uint8_t *data; uint64_t size; } buf; - memstream_t *fp; bool writable; } memory; #ifdef HAVE_CHD struct { - int32_t track; chdstream_t *fp; + int32_t track; } chd; #endif +#if defined(HAVE_ZLIB) + struct + { + rzipstream_t *fp; + } rzip; +#endif + enum intfstream_type type; }; int64_t intfstream_get_size(intfstream_internal_t *intf) @@ -74,6 +83,12 @@ #else break; #endif + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_get_size(intf->rzip.fp); +#else + break; +#endif } return 0; @@ -99,6 +114,9 @@ #ifdef HAVE_CHD #endif break; + case INTFSTREAM_RZIP: + /* Unsupported */ + return false; } return true; @@ -131,6 +149,15 @@ #else return false; #endif + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + intf->rzip.fp = rzipstream_open(path, mode); + if (!intf->rzip.fp) + return false; + break; +#else + return false; +#endif } return true; @@ -147,6 +174,7 @@ return filestream_flush(intf->file.fp); case INTFSTREAM_MEMORY: case INTFSTREAM_CHD: + case INTFSTREAM_RZIP: /* Should we stub this for these interfaces? */ break; } @@ -175,6 +203,12 @@ chdstream_close(intf->chd.fp); #endif return 0; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + if (intf->rzip.fp) + return rzipstream_close(intf->rzip.fp); +#endif + return 0; } return -1; @@ -186,12 +220,24 @@ if (!info) goto error; - intf = (intfstream_internal_t*)calloc(1, sizeof(*intf)); + intf = (intfstream_internal_t*)malloc(sizeof(*intf)); if (!intf) goto error; - intf->type = info->type; + intf->type = info->type; + intf->file.fp = NULL; + intf->memory.buf.data = NULL; + intf->memory.buf.size = 0; + intf->memory.fp = NULL; + intf->memory.writable = false; +#ifdef HAVE_CHD + intf->chd.track = 0; + intf->chd.fp = NULL; +#endif +#ifdef HAVE_ZLIB + intf->rzip.fp = NULL; +#endif switch (intf->type) { @@ -209,6 +255,8 @@ #else goto error; #endif + case INTFSTREAM_RZIP: + break; } return intf; @@ -219,7 +267,8 @@ return NULL; } -int64_t intfstream_seek(intfstream_internal_t *intf, int64_t offset, int whence) +int64_t intfstream_seek( + intfstream_internal_t *intf, int64_t offset, int whence) { if (!intf) return -1; @@ -252,6 +301,9 @@ #else break; #endif + case INTFSTREAM_RZIP: + /* Unsupported */ + break; } return -1; @@ -274,6 +326,12 @@ #else break; #endif + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_read(intf->rzip.fp, s, len); +#else + break; +#endif } return -1; @@ -293,6 +351,66 @@ return memstream_write(intf->memory.fp, s, len); case INTFSTREAM_CHD: return -1; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_write(intf->rzip.fp, s, len); +#else + return -1; +#endif + } + + return 0; +} + +int intfstream_printf(intfstream_internal_t *intf, + const char* format, ...) +{ + va_list vl; + int result; + + if (!intf) + return 0; + + switch (intf->type) + { + case INTFSTREAM_FILE: + va_start(vl, format); + result = filestream_vprintf(intf->file.fp, format, vl); + va_end(vl); + return result; + case INTFSTREAM_MEMORY: + return -1; + case INTFSTREAM_CHD: + return -1; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + va_start(vl, format); + result = rzipstream_vprintf(intf->rzip.fp, format, vl); + va_end(vl); + return result; +#else + return -1; +#endif + } + + return 0; +} + +int64_t intfstream_get_ptr(intfstream_internal_t* intf) +{ + if (!intf) + return 0; + + switch (intf->type) + { + case INTFSTREAM_FILE: + return -1; + case INTFSTREAM_MEMORY: + return memstream_get_ptr(intf->memory.fp); + case INTFSTREAM_CHD: + return -1; + case INTFSTREAM_RZIP: + return -1; } return 0; @@ -318,6 +436,12 @@ #else break; #endif + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_gets(intf->rzip.fp, buffer, (size_t)len); +#else + break; +#endif } return NULL; @@ -340,6 +464,12 @@ #else break; #endif + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_getc(intf->rzip.fp); +#else + break; +#endif } return -1; @@ -362,6 +492,40 @@ #else break; #endif + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return (int64_t)rzipstream_tell(intf->rzip.fp); +#else + break; +#endif + } + + return -1; +} + +int intfstream_eof(intfstream_internal_t *intf) +{ + if (!intf) + return -1; + + switch (intf->type) + { + case INTFSTREAM_FILE: + return filestream_eof(intf->file.fp); + case INTFSTREAM_MEMORY: + /* TODO: Add this functionality to + * memory_stream interface */ + break; + case INTFSTREAM_CHD: + /* TODO: Add this functionality to + * chd_stream interface */ + break; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_eof(intf->rzip.fp); +#else + break; +#endif } return -1; @@ -382,6 +546,11 @@ chdstream_rewind(intf->chd.fp); #endif break; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + rzipstream_rewind(intf->rzip.fp); +#endif + break; } } @@ -400,7 +569,89 @@ break; case INTFSTREAM_CHD: break; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + rzipstream_putc(intf->rzip.fp, c); +#else + break; +#endif + } +} + +uint32_t intfstream_get_offset_to_start(intfstream_internal_t *intf) +{ + if (intf) + { +#ifdef HAVE_CHD + if (intf->type == INTFSTREAM_CHD) + return chdstream_get_track_start(intf->chd.fp); +#endif + } + + return 0; +} + +uint32_t intfstream_get_frame_size(intfstream_internal_t *intf) +{ + if (intf) + { +#ifdef HAVE_CHD + if (intf->type == INTFSTREAM_CHD) + return chdstream_get_frame_size(intf->chd.fp); +#endif + } + + return 0; +} + +bool intfstream_is_compressed(intfstream_internal_t *intf) +{ + if (!intf) + return false; + + switch (intf->type) + { + case INTFSTREAM_FILE: + return false; + case INTFSTREAM_MEMORY: + return false; + case INTFSTREAM_CHD: + return true; + case INTFSTREAM_RZIP: +#if defined(HAVE_ZLIB) + return rzipstream_is_compressed(intf->rzip.fp); +#else + break; +#endif } + + return false; +} + +bool intfstream_get_crc(intfstream_internal_t *intf, uint32_t *crc) +{ + int64_t data_read = 0; + uint32_t accumulator = 0; + uint8_t buffer[4096]; + + if (!intf || !crc) + return false; + + /* Ensure we start at the beginning of the file */ + intfstream_rewind(intf); + + while ((data_read = intfstream_read(intf, buffer, sizeof(buffer))) > 0) + accumulator = encoding_crc32(accumulator, buffer, (size_t)data_read); + + if (data_read < 0) + return false; + + *crc = accumulator; + + /* Reset file to the beginning */ + intfstream_rewind(intf); + + return true; } intfstream_t* intfstream_open_file(const char *path, @@ -441,7 +692,35 @@ info.memory.writable = false; fd = (intfstream_t*)intfstream_init(&info); + if (!fd) + return NULL; + + if (!intfstream_open(fd, NULL, mode, hints)) + goto error; + + return fd; + +error: + if (fd) + { + intfstream_close(fd); + free(fd); + } + return NULL; +} + +intfstream_t *intfstream_open_writable_memory(void *data, + unsigned mode, unsigned hints, uint64_t size) +{ + intfstream_info_t info; + intfstream_t *fd = NULL; + + info.type = INTFSTREAM_MEMORY; + info.memory.buf.data = (uint8_t*)data; + info.memory.buf.size = size; + info.memory.writable = true; + fd = (intfstream_t*)intfstream_init(&info); if (!fd) return NULL; @@ -486,3 +765,29 @@ } return NULL; } + +intfstream_t* intfstream_open_rzip_file(const char *path, + unsigned mode) +{ + intfstream_info_t info; + intfstream_t *fd = NULL; + + info.type = INTFSTREAM_RZIP; + fd = (intfstream_t*)intfstream_init(&info); + + if (!fd) + return NULL; + + if (!intfstream_open(fd, path, mode, RETRO_VFS_FILE_ACCESS_HINT_NONE)) + goto error; + + return fd; + +error: + if (fd) + { + intfstream_close(fd); + free(fd); + } + return NULL; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/memory_stream.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/memory_stream.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (memory_stream.c). @@ -26,29 +26,24 @@ #include <streams/memory_stream.h> +/* TODO/FIXME - static globals */ static uint8_t* g_buffer = NULL; static uint64_t g_size = 0; static uint64_t last_file_size = 0; struct memstream { - uint8_t *buf; uint64_t size; uint64_t ptr; uint64_t max_ptr; + uint8_t *buf; unsigned writing; }; -static void memstream_update_pos(memstream_t *stream) -{ - if (stream && stream->ptr > stream->max_ptr) - stream->max_ptr = stream->ptr; -} - void memstream_set_buffer(uint8_t *buffer, uint64_t size) { g_buffer = buffer; - g_size = size; + g_size = size; } uint64_t memstream_get_last_size(void) @@ -56,30 +51,26 @@ return last_file_size; } -static void memstream_init(memstream_t *stream, - uint8_t *buffer, uint64_t max_size, unsigned writing) -{ - if (!stream) - return; - - stream->buf = buffer; - stream->size = max_size; - stream->ptr = 0; - stream->max_ptr = 0; - stream->writing = writing; -} - memstream_t *memstream_open(unsigned writing) { - memstream_t *stream; + memstream_t *stream; if (!g_buffer || !g_size) return NULL; - stream = (memstream_t*)calloc(1, sizeof(*stream)); - memstream_init(stream, g_buffer, g_size, writing); + stream = (memstream_t*)malloc(sizeof(*stream)); + + if (!stream) + return NULL; + + stream->buf = g_buffer; + stream->size = g_size; + stream->ptr = 0; + stream->max_ptr = 0; + stream->writing = writing; + + g_buffer = NULL; + g_size = 0; - g_buffer = NULL; - g_size = 0; return stream; } @@ -92,6 +83,11 @@ free(stream); } +uint64_t memstream_get_ptr(memstream_t *stream) +{ + return stream->ptr; +} + uint64_t memstream_read(memstream_t *stream, void *data, uint64_t bytes) { uint64_t avail = 0; @@ -99,17 +95,19 @@ if (!stream) return 0; - avail = stream->size - stream->ptr; + avail = stream->size - stream->ptr; if (bytes > avail) - bytes = avail; + bytes = avail; memcpy(data, stream->buf + stream->ptr, (size_t)bytes); - stream->ptr += bytes; - memstream_update_pos(stream); + stream->ptr += bytes; + if (stream->ptr > stream->max_ptr) + stream->max_ptr = stream->ptr; return bytes; } -uint64_t memstream_write(memstream_t *stream, const void *data, uint64_t bytes) +uint64_t memstream_write(memstream_t *stream, + const void *data, uint64_t bytes) { uint64_t avail = 0; @@ -122,7 +120,8 @@ memcpy(stream->buf + stream->ptr, data, (size_t)bytes); stream->ptr += bytes; - memstream_update_pos(stream); + if (stream->ptr > stream->max_ptr) + stream->max_ptr = stream->ptr; return bytes; } @@ -176,7 +175,8 @@ return EOF; ret = stream->buf[stream->ptr++]; - memstream_update_pos(stream); + if (stream->ptr > stream->max_ptr) + stream->max_ptr = stream->ptr; return ret; } @@ -186,5 +186,6 @@ if (stream->ptr < stream->size) stream->buf[stream->ptr++] = c; - memstream_update_pos(stream); + if (stream->ptr > stream->max_ptr) + stream->max_ptr = stream->ptr; }
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/rzip_stream.c
Added
@@ -0,0 +1,1119 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rzip_stream.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <string/stdstring.h> +#include <file/file_path.h> + +#include <streams/file_stream.h> +#include <streams/trans_stream.h> + +#include <streams/rzip_stream.h> + +/* Current RZIP file format version */ +#define RZIP_VERSION 1 + +/* Compression level + * > zlib default of 6 provides the best + * balance between file size and + * compression speed */ +#define RZIP_COMPRESSION_LEVEL 6 + +/* Default chunk size: 128kb */ +#define RZIP_DEFAULT_CHUNK_SIZE 131072 + +/* Header sizes (in bytes) */ +#define RZIP_HEADER_SIZE 20 +#define RZIP_CHUNK_HEADER_SIZE 4 + +/* Holds all metadata for an RZIP file stream */ +struct rzipstream +{ + uint64_t size; + /* virtual_ptr: Used to track how much + * uncompressed data has been read */ + uint64_t virtual_ptr; + RFILE* file; + const struct trans_stream_backend *deflate_backend; + void *deflate_stream; + const struct trans_stream_backend *inflate_backend; + void *inflate_stream; + uint8_t *in_buf; + uint8_t *out_buf; + uint32_t in_buf_size; + uint32_t in_buf_ptr; + uint32_t out_buf_size; + uint32_t out_buf_ptr; + uint32_t out_buf_occupancy; + uint32_t chunk_size; + bool is_compressed; + bool is_writing; +}; + +/* Header Functions */ + +/* Reads header information from RZIP file + * > Detects whether file is compressed or + * uncompressed data + * > If compressed, extracts uncompressed + * file/chunk sizes */ +static bool rzipstream_read_file_header(rzipstream_t *stream) +{ + unsigned i; + int64_t length; + uint8_t header_bytes[RZIP_HEADER_SIZE]; + + if (!stream) + return false; + + for (i = 0; i < RZIP_HEADER_SIZE; i++) + header_bytes[i] = 0; + + /* Attempt to read header bytes */ + length = filestream_read(stream->file, header_bytes, sizeof(header_bytes)); + if (length <= 0) + return false; + + /* If file length is less than header size + * then assume this is uncompressed data */ + if (length < RZIP_HEADER_SIZE) + goto file_uncompressed; + + /* Check 'magic numbers' - first 8 bytes + * of header */ + if ((header_bytes[0] != 35) || /* # */ + (header_bytes[1] != 82) || /* R */ + (header_bytes[2] != 90) || /* Z */ + (header_bytes[3] != 73) || /* I */ + (header_bytes[4] != 80) || /* P */ + (header_bytes[5] != 118) || /* v */ + (header_bytes[6] != RZIP_VERSION) || /* file format version number */ + (header_bytes[7] != 35)) /* # */ + goto file_uncompressed; + + /* Get uncompressed chunk size - next 4 bytes */ + stream->chunk_size = ((uint32_t)header_bytes[11] << 24) | + ((uint32_t)header_bytes[10] << 16) | + ((uint32_t)header_bytes[9] << 8) | + (uint32_t)header_bytes[8]; + if (stream->chunk_size == 0) + return false; + + /* Get total uncompressed data size - next 8 bytes */ + stream->size = ((uint64_t)header_bytes[19] << 56) | + ((uint64_t)header_bytes[18] << 48) | + ((uint64_t)header_bytes[17] << 40) | + ((uint64_t)header_bytes[16] << 32) | + ((uint64_t)header_bytes[15] << 24) | + ((uint64_t)header_bytes[14] << 16) | + ((uint64_t)header_bytes[13] << 8) | + (uint64_t)header_bytes[12]; + if (stream->size == 0) + return false; + + stream->is_compressed = true; + return true; + +file_uncompressed: + + /* Reset file to start */ + filestream_seek(stream->file, 0, SEEK_SET); + + /* Get 'raw' file size */ + stream->size = filestream_get_size(stream->file); + + stream->is_compressed = false; + return true; +} + +/* Writes header information to RZIP file + * > ID 'magic numbers' + uncompressed + * file/chunk sizes */ +static bool rzipstream_write_file_header(rzipstream_t *stream) +{ + unsigned i; + int64_t length; + uint8_t header_bytes[RZIP_HEADER_SIZE]; + + if (!stream) + return false; + + /* Populate header array */ + for (i = 0; i < RZIP_HEADER_SIZE; i++) + header_bytes[i] = 0; + + /* > 'Magic numbers' - first 8 bytes */ + header_bytes[0] = 35; /* # */ + header_bytes[1] = 82; /* R */ + header_bytes[2] = 90; /* Z */ + header_bytes[3] = 73; /* I */ + header_bytes[4] = 80; /* P */ + header_bytes[5] = 118; /* v */ + header_bytes[6] = RZIP_VERSION; /* file format version number */ + header_bytes[7] = 35; /* # */ + + /* > Uncompressed chunk size - next 4 bytes */ + header_bytes[11] = (stream->chunk_size >> 24) & 0xFF; + header_bytes[10] = (stream->chunk_size >> 16) & 0xFF; + header_bytes[9] = (stream->chunk_size >> 8) & 0xFF; + header_bytes[8] = stream->chunk_size & 0xFF; + + /* > Total uncompressed data size - next 8 bytes */ + header_bytes[19] = (stream->size >> 56) & 0xFF; + header_bytes[18] = (stream->size >> 48) & 0xFF; + header_bytes[17] = (stream->size >> 40) & 0xFF; + header_bytes[16] = (stream->size >> 32) & 0xFF; + header_bytes[15] = (stream->size >> 24) & 0xFF; + header_bytes[14] = (stream->size >> 16) & 0xFF; + header_bytes[13] = (stream->size >> 8) & 0xFF; + header_bytes[12] = stream->size & 0xFF; + + /* Reset file to start */ + filestream_seek(stream->file, 0, SEEK_SET); + + /* Write header bytes */ + length = filestream_write(stream->file, + header_bytes, sizeof(header_bytes)); + if (length != RZIP_HEADER_SIZE) + return false; + + return true; +} + +/* Stream Initialisation/De-initialisation */ + +/* Initialises all members of an rzipstream_t struct, + * reading config from existing file header if available */ +static bool rzipstream_init_stream( + rzipstream_t *stream, const char *path, bool is_writing) +{ + unsigned file_mode; + + if (!stream) + return false; + + /* Ensure stream has valid initial values */ + stream->size = 0; + stream->chunk_size = RZIP_DEFAULT_CHUNK_SIZE; + stream->file = NULL; + stream->deflate_backend = NULL; + stream->deflate_stream = NULL; + stream->inflate_backend = NULL; + stream->inflate_stream = NULL; + stream->in_buf = NULL; + stream->in_buf_size = 0; + stream->in_buf_ptr = 0; + stream->out_buf = NULL; + stream->out_buf_size = 0; + stream->out_buf_ptr = 0; + stream->out_buf_occupancy = 0; + + /* Check whether this is a read or write stream */ + stream->is_writing = is_writing; + if (stream->is_writing) + { + /* Written files are always compressed */ + stream->is_compressed = true; + file_mode = RETRO_VFS_FILE_ACCESS_WRITE; + } + /* For read files, must get compression status + * from file itself... */ + else + file_mode = RETRO_VFS_FILE_ACCESS_READ; + + /* Open file */ + stream->file = filestream_open( + path, file_mode, RETRO_VFS_FILE_ACCESS_HINT_NONE); + if (!stream->file) + return false; + + /* If file is open for writing, output header + * (Size component cannot be written until + * file is closed...) */ + if (stream->is_writing) + { + /* Note: could just write zeros here, but + * still want to identify this as an RZIP + * file if writing fails partway through */ + if (!rzipstream_write_file_header(stream)) + return false; + } + /* If file is open for reading, parse any existing + * header */ + else if (!rzipstream_read_file_header(stream)) + return false; + + /* Initialise appropriate transform stream + * and determine associated buffer sizes */ + if (stream->is_writing) + { + /* Compression */ + stream->deflate_backend = trans_stream_get_zlib_deflate_backend(); + if (!stream->deflate_backend) + return false; + + stream->deflate_stream = stream->deflate_backend->stream_new(); + if (!stream->deflate_stream) + return false; + + /* Set compression level */ + if (!stream->deflate_backend->define( + stream->deflate_stream, "level", RZIP_COMPRESSION_LEVEL)) + return false; + + /* Buffers + * > Input: uncompressed + * > Output: compressed */ + stream->in_buf_size = stream->chunk_size; + stream->out_buf_size = stream->chunk_size * 2; + /* > Account for minimum zlib overhead + * of 11 bytes... */ + stream->out_buf_size = + (stream->out_buf_size < (stream->in_buf_size + 11)) ? + stream->out_buf_size + 11 : + stream->out_buf_size; + + /* Redundant safety check */ + if ((stream->in_buf_size == 0) || + (stream->out_buf_size == 0)) + return false; + } + /* When reading, don't need an inflate transform + * stream (or buffers) if source file is uncompressed */ + else if (stream->is_compressed) + { + /* Decompression */ + stream->inflate_backend = trans_stream_get_zlib_inflate_backend(); + if (!stream->inflate_backend) + return false; + + stream->inflate_stream = stream->inflate_backend->stream_new(); + if (!stream->inflate_stream) + return false; + + /* Buffers + * > Input: compressed + * > Output: uncompressed + * Note 1: Actual compressed chunk sizes are read + * from the file - just allocate a sensible + * default to minimise memory reallocations + * Note 2: If file header is valid, output buffer + * should have a size of exactly stream->chunk_size. + * Allocate some additional space, just for + * redundant safety... */ + stream->in_buf_size = stream->chunk_size * 2; + stream->out_buf_size = stream->chunk_size + (stream->chunk_size >> 2); + + /* Redundant safety check */ + if ((stream->in_buf_size == 0) || + (stream->out_buf_size == 0)) + return false; + } + + /* Allocate buffers */ + if (stream->in_buf_size > 0) + { + stream->in_buf = (uint8_t *)calloc(stream->in_buf_size, 1); + if (!stream->in_buf) + return false; + } + + if (stream->out_buf_size > 0) + { + stream->out_buf = (uint8_t *)calloc(stream->out_buf_size, 1); + if (!stream->out_buf) + return false; + } + + return true; +} + +/* free()'s all members of an rzipstream_t struct + * > Also closes associated file, if currently open */ +static int rzipstream_free_stream(rzipstream_t *stream) +{ + int ret = 0; + + if (!stream) + return -1; + + /* Free transform streams */ + if (stream->deflate_stream && stream->deflate_backend) + stream->deflate_backend->stream_free(stream->deflate_stream); + + stream->deflate_stream = NULL; + stream->deflate_backend = NULL; + + if (stream->inflate_stream && stream->inflate_backend) + stream->inflate_backend->stream_free(stream->inflate_stream); + + stream->inflate_stream = NULL; + stream->inflate_backend = NULL; + + /* Free buffers */ + if (stream->in_buf) + free(stream->in_buf); + stream->in_buf = NULL; + + if (stream->out_buf) + free(stream->out_buf); + stream->out_buf = NULL; + + /* Close file */ + if (stream->file) + ret = filestream_close(stream->file); + stream->file = NULL; + + free(stream); + + return ret; +} + +/* File Open */ + +/* Opens a new or existing RZIP file + * > Supported 'mode' values are: + * - RETRO_VFS_FILE_ACCESS_READ + * - RETRO_VFS_FILE_ACCESS_WRITE + * > When reading, 'path' may reference compressed + * or uncompressed data + * Returns NULL if arguments are invalid, file + * is invalid or an IO error occurs */ +rzipstream_t* rzipstream_open(const char *path, unsigned mode) +{ + rzipstream_t *stream = NULL; + + /* Sanity check + * > Only RETRO_VFS_FILE_ACCESS_READ and + * RETRO_VFS_FILE_ACCESS_WRITE are supported */ + if (string_is_empty(path) || + ((mode != RETRO_VFS_FILE_ACCESS_READ) && + (mode != RETRO_VFS_FILE_ACCESS_WRITE))) + return NULL; + + /* If opening in read mode, ensure file exists */ + if ((mode == RETRO_VFS_FILE_ACCESS_READ) && + !path_is_valid(path)) + return NULL; + + /* Allocate stream object */ + stream = (rzipstream_t*)malloc(sizeof(*stream)); + if (!stream) + return NULL; + + stream->is_compressed = false; + stream->is_writing = false; + stream->size = 0; + stream->chunk_size = 0; + stream->virtual_ptr = 0; + stream->file = NULL; + stream->deflate_backend = NULL; + stream->deflate_stream = NULL; + stream->inflate_backend = NULL; + stream->inflate_stream = NULL; + stream->in_buf = NULL; + stream->in_buf_size = 0; + stream->in_buf_ptr = 0; + stream->out_buf = NULL; + stream->out_buf_size = 0; + stream->out_buf_ptr = 0; + stream->out_buf_occupancy = 0; + + /* Initialise stream */ + if (!rzipstream_init_stream( + stream, path, + (mode == RETRO_VFS_FILE_ACCESS_WRITE))) + { + rzipstream_free_stream(stream); + return NULL; + } + + return stream; +} + +/* File Read */ + +/* Reads and decompresses the next chunk of data + * in the RZIP file */ +static bool rzipstream_read_chunk(rzipstream_t *stream) +{ + unsigned i; + int64_t length; + uint8_t chunk_header_bytes[RZIP_CHUNK_HEADER_SIZE]; + uint32_t compressed_chunk_size; + uint32_t inflate_read; + uint32_t inflate_written; + + if (!stream || !stream->inflate_backend || !stream->inflate_stream) + return false; + + for (i = 0; i < RZIP_CHUNK_HEADER_SIZE; i++) + chunk_header_bytes[i] = 0; + + /* Attempt to read chunk header bytes */ + length = filestream_read( + stream->file, chunk_header_bytes, sizeof(chunk_header_bytes)); + if (length != RZIP_CHUNK_HEADER_SIZE) + return false; + + /* Get size of next compressed chunk */ + compressed_chunk_size = ((uint32_t)chunk_header_bytes[3] << 24) | + ((uint32_t)chunk_header_bytes[2] << 16) | + ((uint32_t)chunk_header_bytes[1] << 8) | + (uint32_t)chunk_header_bytes[0]; + if (compressed_chunk_size == 0) + return false; + + /* Resize input buffer, if required */ + if (compressed_chunk_size > stream->in_buf_size) + { + free(stream->in_buf); + stream->in_buf = NULL; + + stream->in_buf_size = compressed_chunk_size; + stream->in_buf = (uint8_t *)calloc(stream->in_buf_size, 1); + if (!stream->in_buf) + return false; + + /* Note: Uncompressed data size is fixed, and read + * from the file header - we therefore don't attempt + * to resize the output buffer (if it's too small, then + * that's an error condition) */ + } + + /* Read compressed chunk from file */ + length = filestream_read( + stream->file, stream->in_buf, compressed_chunk_size); + if (length != compressed_chunk_size) + return false; + + /* Decompress chunk data */ + stream->inflate_backend->set_in( + stream->inflate_stream, + stream->in_buf, compressed_chunk_size); + + stream->inflate_backend->set_out( + stream->inflate_stream, + stream->out_buf, stream->out_buf_size); + + /* Note: We have to set 'flush == true' here, otherwise we + * can't guarantee that the entire chunk will be written + * to the output buffer - this is inefficient, but not + * much we can do... */ + if (!stream->inflate_backend->trans( + stream->inflate_stream, true, + &inflate_read, &inflate_written, NULL)) + return false; + + /* Error checking */ + if (inflate_read != compressed_chunk_size) + return false; + + if ((inflate_written == 0) || + (inflate_written > stream->out_buf_size)) + return false; + + /* Record current output buffer occupancy + * and reset pointer */ + stream->out_buf_occupancy = inflate_written; + stream->out_buf_ptr = 0; + + return true; +} + +/* Reads (a maximum of) 'len' bytes from an RZIP file. + * Returns actual number of bytes read, or -1 in + * the event of an error */ +int64_t rzipstream_read(rzipstream_t *stream, void *data, int64_t len) +{ + int64_t data_len = len; + uint8_t *data_ptr = (uint8_t *)data; + int64_t data_read = 0; + + if (!stream || stream->is_writing || !data) + return -1; + + /* If we are reading uncompressed data, simply + * 'pass on' the direct file access request */ + if (!stream->is_compressed) + return filestream_read(stream->file, data, len); + + /* Process input data */ + while (data_len > 0) + { + int64_t read_size = 0; + + /* Check whether we have reached the end + * of the file */ + if (stream->virtual_ptr >= stream->size) + return data_read; + + /* If everything in the output buffer has already + * been read, grab and extract the next chunk + * from disk */ + if (stream->out_buf_ptr >= stream->out_buf_occupancy) + if (!rzipstream_read_chunk(stream)) + return -1; + + /* Get amount of data to 'read out' this loop + * > i.e. minimum of remaining output buffer + * occupancy and remaining 'read data' size */ + read_size = stream->out_buf_occupancy - stream->out_buf_ptr; + if (read_size > data_len) + read_size = data_len; + + /* Copy as much cached data as possible into + * the read buffer */ + memcpy(data_ptr, stream->out_buf + stream->out_buf_ptr, read_size); + + /* Increment pointers and remaining length */ + stream->out_buf_ptr += read_size; + data_ptr += read_size; + data_len -= read_size; + + stream->virtual_ptr += read_size; + + data_read += read_size; + } + + return data_read; +} + +/* Reads next character from an RZIP file. + * Returns character value, or EOF if no data + * remains. + * Note: Always returns EOF if file is open + * for writing. */ +int rzipstream_getc(rzipstream_t *stream) +{ + char c = 0; + + if (!stream || stream->is_writing) + return EOF; + + /* Attempt to read a single character */ + if (rzipstream_read(stream, &c, 1) == 1) + return (int)(unsigned char)c; + + return EOF; +} + +/* Reads one line from an RZIP file and stores it + * in the character array pointed to by 's'. + * It stops reading when either (len-1) characters + * are read, the newline character is read, or the + * end-of-file is reached, whichever comes first. + * On success, returns 's'. In the event of an error, + * or if end-of-file is reached and no characters + * have been read, returns NULL. */ +char* rzipstream_gets(rzipstream_t *stream, char *s, size_t len) +{ + size_t str_len; + int c = 0; + char *str_ptr = s; + + if (!stream || stream->is_writing || (len == 0)) + return NULL; + + /* Read bytes until newline or EOF is reached, + * or string buffer is full */ + for (str_len = (len - 1); str_len > 0; str_len--) + { + /* Get next character */ + c = rzipstream_getc(stream); + + /* Check for newline and EOF */ + if ((c == '\n') || (c == EOF)) + break; + + /* Copy character to string buffer */ + *str_ptr++ = c; + } + + /* Add NUL termination */ + *str_ptr = '\0'; + + /* Check whether EOF has been reached without + * reading any characters */ + if ((str_ptr == s) && (c == EOF)) + return NULL; + + return (s); +} + +/* Reads all data from file specified by 'path' and + * copies it to 'buf'. + * - 'buf' will be allocated and must be free()'d manually. + * - Allocated 'buf' size is equal to 'len'. + * Returns false in the event of an error */ +bool rzipstream_read_file(const char *path, void **buf, int64_t *len) +{ + int64_t bytes_read = 0; + void *content_buf = NULL; + int64_t content_buf_size = 0; + rzipstream_t *stream = NULL; + + if (!buf) + return false; + + /* Attempt to open file */ + stream = rzipstream_open(path, RETRO_VFS_FILE_ACCESS_READ); + + if (!stream) + { + *buf = NULL; + return false; + } + + /* Get file size */ + content_buf_size = rzipstream_get_size(stream); + + if (content_buf_size < 0) + goto error; + + if ((int64_t)(uint64_t)(content_buf_size + 1) != (content_buf_size + 1)) + goto error; + + /* Allocate buffer */ + content_buf = malloc((size_t)(content_buf_size + 1)); + + if (!content_buf) + goto error; + + /* Read file contents */ + bytes_read = rzipstream_read(stream, content_buf, content_buf_size); + + if (bytes_read < 0) + goto error; + + /* Close file */ + rzipstream_close(stream); + stream = NULL; + + /* Add NUL termination for easy/safe handling of strings. + * Will only work with sane character formatting (Unix). */ + ((char*)content_buf)[bytes_read] = '\0'; + + /* Assign buffer */ + *buf = content_buf; + + /* Assign length value, if required */ + if (len) + *len = bytes_read; + + return true; + +error: + + if (stream) + rzipstream_close(stream); + stream = NULL; + + if (content_buf) + free(content_buf); + content_buf = NULL; + + if (len) + *len = -1; + + *buf = NULL; + + return false; +} + +/* File Write */ + +/* Compresses currently cached data and writes it + * as the next RZIP file chunk */ +static bool rzipstream_write_chunk(rzipstream_t *stream) +{ + unsigned i; + int64_t length; + uint8_t chunk_header_bytes[RZIP_CHUNK_HEADER_SIZE]; + uint32_t deflate_read; + uint32_t deflate_written; + + if (!stream || !stream->deflate_backend || !stream->deflate_stream) + return false; + + for (i = 0; i < RZIP_CHUNK_HEADER_SIZE; i++) + chunk_header_bytes[i] = 0; + + /* Compress data currently held in input buffer */ + stream->deflate_backend->set_in( + stream->deflate_stream, + stream->in_buf, stream->in_buf_ptr); + + stream->deflate_backend->set_out( + stream->deflate_stream, + stream->out_buf, stream->out_buf_size); + + /* Note: We have to set 'flush == true' here, otherwise we + * can't guarantee that the entire chunk will be written + * to the output buffer - this is inefficient, but not + * much we can do... */ + if (!stream->deflate_backend->trans( + stream->deflate_stream, true, + &deflate_read, &deflate_written, NULL)) + return false; + + /* Error checking */ + if (deflate_read != stream->in_buf_ptr) + return false; + + if ((deflate_written == 0) || + (deflate_written > stream->out_buf_size)) + return false; + + /* Write compressed chunk size to file */ + chunk_header_bytes[3] = (deflate_written >> 24) & 0xFF; + chunk_header_bytes[2] = (deflate_written >> 16) & 0xFF; + chunk_header_bytes[1] = (deflate_written >> 8) & 0xFF; + chunk_header_bytes[0] = deflate_written & 0xFF; + + length = filestream_write( + stream->file, chunk_header_bytes, sizeof(chunk_header_bytes)); + if (length != RZIP_CHUNK_HEADER_SIZE) + return false; + + /* Write compressed data to file */ + length = filestream_write( + stream->file, stream->out_buf, deflate_written); + + if (length != deflate_written) + return false; + + /* Reset input buffer pointer */ + stream->in_buf_ptr = 0; + + return true; +} + +/* Writes 'len' bytes to an RZIP file. + * Returns actual number of bytes written, or -1 + * in the event of an error */ +int64_t rzipstream_write(rzipstream_t *stream, const void *data, int64_t len) +{ + int64_t data_len = len; + const uint8_t *data_ptr = (const uint8_t *)data; + + if (!stream || !stream->is_writing || !data) + return -1; + + /* Process input data */ + while (data_len > 0) + { + int64_t cache_size = 0; + + /* If input buffer is full, compress and write to disk */ + if (stream->in_buf_ptr >= stream->in_buf_size) + if (!rzipstream_write_chunk(stream)) + return -1; + + /* Get amount of data to cache during this loop + * > i.e. minimum of space remaining in input buffer + * and remaining 'write data' size */ + cache_size = stream->in_buf_size - stream->in_buf_ptr; + if (cache_size > data_len) + cache_size = data_len; + + /* Copy as much data as possible into + * the input buffer */ + memcpy(stream->in_buf + stream->in_buf_ptr, data_ptr, cache_size); + + /* Increment pointers and remaining length */ + stream->in_buf_ptr += cache_size; + data_ptr += cache_size; + data_len -= cache_size; + + stream->size += cache_size; + stream->virtual_ptr += cache_size; + } + + /* We always write the specified number of bytes + * (unless rzipstream_write_chunk() fails, in + * which we register a complete failure...) */ + return len; +} + +/* Writes a single character to an RZIP file. + * Returns character written, or EOF in the event + * of an error */ +int rzipstream_putc(rzipstream_t *stream, int c) +{ + char c_char = (char)c; + + if (!stream || !stream->is_writing) + return EOF; + + return (rzipstream_write(stream, &c_char, 1) == 1) ? + (int)(unsigned char)c : EOF; +} + +/* Writes a variable argument list to an RZIP file. + * Ugly 'internal' function, required to enable + * 'printf' support in the higher level 'interface_stream'. + * Returns actual number of bytes written, or -1 + * in the event of an error */ +int rzipstream_vprintf(rzipstream_t *stream, const char* format, va_list args) +{ + static char buffer[8 * 1024] = {0}; + int64_t num_chars = vsnprintf(buffer, + sizeof(buffer), format, args); + + if (num_chars < 0) + return -1; + else if (num_chars == 0) + return 0; + + return (int)rzipstream_write(stream, buffer, num_chars); +} + +/* Writes formatted output to an RZIP file. + * Returns actual number of bytes written, or -1 + * in the event of an error */ +int rzipstream_printf(rzipstream_t *stream, const char* format, ...) +{ + va_list vl; + int result = 0; + + /* Initialise variable argument list */ + va_start(vl, format); + + /* Write variable argument list to file */ + result = rzipstream_vprintf(stream, format, vl); + + /* End using variable argument list */ + va_end(vl); + + return result; +} + +/* Writes contents of 'data' buffer to file + * specified by 'path'. + * Returns false in the event of an error */ +bool rzipstream_write_file(const char *path, const void *data, int64_t len) +{ + int64_t bytes_written = 0; + rzipstream_t *stream = NULL; + + if (!data) + return false; + + /* Attempt to open file */ + stream = rzipstream_open(path, RETRO_VFS_FILE_ACCESS_WRITE); + + if (!stream) + return false; + + /* Write contents of data buffer to file */ + bytes_written = rzipstream_write(stream, data, len); + + /* Close file */ + if (rzipstream_close(stream) == -1) + return false; + + /* Check that the correct number of bytes + * were written */ + if (bytes_written != len) + return false; + + return true; +} + +/* File Control */ + +/* Sets file position to the beginning of the + * specified RZIP file. + * Note: It is not recommended to rewind a file + * that is open for writing, since the caller + * may end up with a file containing junk data + * at the end (harmless, but a waste of space). */ +void rzipstream_rewind(rzipstream_t *stream) +{ + if (!stream) + return; + + /* Note: rzipstream_rewind() has no way of + * reporting errors (higher level interface + * requires a void return type) - so if anything + * goes wrong, all we can do is print to stderr + * and bail out... */ + + /* If we are handling uncompressed data, simply + * 'pass on' the direct file access request */ + if (!stream->is_compressed) + { + filestream_rewind(stream->file); + return; + } + + /* If no file access has yet occurred, file is + * already at the beginning -> do nothing */ + if (stream->virtual_ptr == 0) + return; + + /* Check whether we are reading or writing */ + if (stream->is_writing) + { + /* Reset file position to first chunk location */ + filestream_seek(stream->file, RZIP_HEADER_SIZE, SEEK_SET); + if (filestream_error(stream->file)) + { + fprintf( + stderr, + "rzipstream_rewind(): Failed to reset file position...\n"); + return; + } + + /* Reset pointers */ + stream->virtual_ptr = 0; + stream->in_buf_ptr = 0; + + /* Reset file size */ + stream->size = 0; + } + else + { + /* Check whether first file chunk is currently + * buffered in memory */ + if ((stream->virtual_ptr < stream->chunk_size) && + (stream->out_buf_ptr < stream->out_buf_occupancy)) + { + /* It is: No file access is therefore required + * > Just reset pointers */ + stream->virtual_ptr = 0; + stream->out_buf_ptr = 0; + } + else + { + /* It isn't: Have to re-read the first chunk + * from disk... */ + + /* Reset file position to first chunk location */ + filestream_seek(stream->file, RZIP_HEADER_SIZE, SEEK_SET); + if (filestream_error(stream->file)) + { + fprintf( + stderr, + "rzipstream_rewind(): Failed to reset file position...\n"); + return; + } + + /* Read chunk */ + if (!rzipstream_read_chunk(stream)) + { + fprintf( + stderr, + "rzipstream_rewind(): Failed to read first chunk of file...\n"); + return; + } + + /* Reset pointers */ + stream->virtual_ptr = 0; + stream->out_buf_ptr = 0; + } + } +} + +/* File Status */ + +/* Returns total size (in bytes) of the *uncompressed* + * data in an RZIP file. + * (If reading an uncompressed file, this corresponds + * to the 'physical' file size in bytes) + * Returns -1 in the event of a error. */ +int64_t rzipstream_get_size(rzipstream_t *stream) +{ + if (!stream) + return -1; + + if (stream->is_compressed) + return stream->size; + return filestream_get_size(stream->file); +} + +/* Returns EOF when no further *uncompressed* data + * can be read from an RZIP file. */ +int rzipstream_eof(rzipstream_t *stream) +{ + if (!stream) + return -1; + + if (stream->is_compressed) + return (stream->virtual_ptr >= stream->size) ? + EOF : 0; + return filestream_eof(stream->file); +} + +/* Returns the offset of the current byte of *uncompressed* + * data relative to the beginning of an RZIP file. + * Returns -1 in the event of a error. */ +int64_t rzipstream_tell(rzipstream_t *stream) +{ + if (!stream) + return -1; + + return (int64_t)stream->virtual_ptr; +} + +/* Returns true if specified RZIP file contains + * compressed content */ +bool rzipstream_is_compressed(rzipstream_t *stream) +{ + if (!stream) + return false; + + return stream->is_compressed; +} + +/* File Close */ + +/* Closes RZIP file. If file is open for writing, + * flushes any remaining buffered data to disk. + * Returns -1 in the event of a error. */ +int rzipstream_close(rzipstream_t *stream) +{ + if (!stream) + return -1; + + /* If we are writing, ensure that any + * remaining uncompressed data is flushed to + * disk and update file header */ + if (stream->is_writing) + { + if (stream->in_buf_ptr > 0) + if (!rzipstream_write_chunk(stream)) + goto error; + + if (!rzipstream_write_file_header(stream)) + goto error; + } + + /* Free stream + * > This also closes the file */ + return rzipstream_free_stream(stream); + +error: + /* Stream must be free()'d regardless */ + rzipstream_free_stream(stream); + return -1; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/stdin_stream.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/stdin_stream.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (stdin_stream.c). @@ -38,7 +38,7 @@ #include <retro_environment.h> #include <streams/stdin_stream.h> -#if (defined(_WIN32) && defined(_XBOX)) || defined(__CELLOS_LV2__) || defined(__WINRT__) +#if (defined(_WIN32) && defined(_XBOX)) || defined(__WINRT__) || !defined(__PSL1GHT__) && defined(__PS3__) size_t read_stdin(char *buf, size_t size) { /* Not implemented. */
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/trans_stream.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/trans_stream.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (trans_stream.c). @@ -45,9 +45,7 @@ uint32_t rd, wn; if (data && *data) - { rdata = *data; - } else { rdata = backend->stream_new();
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/trans_stream_pipe.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/trans_stream_pipe.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (trans_stream_pipe.c). @@ -34,7 +34,17 @@ static void *pipe_stream_new(void) { - return (struct pipe_trans_stream*)calloc(1, sizeof(struct pipe_trans_stream)); + struct pipe_trans_stream *stream = + (struct pipe_trans_stream*)malloc(sizeof(*stream)); + if (!stream) + return NULL; + + stream->in = NULL; + stream->out = NULL; + stream->in_size = 0; + stream->out_size = 0; + + return stream; } static void pipe_stream_free(void *data) @@ -45,15 +55,23 @@ static void pipe_set_in(void *data, const uint8_t *in, uint32_t in_size) { struct pipe_trans_stream *p = (struct pipe_trans_stream *) data; - p->in = in; - p->in_size = in_size; + + if (!p) + return; + + p->in = in; + p->in_size = in_size; } static void pipe_set_out(void *data, uint8_t *out, uint32_t out_size) { struct pipe_trans_stream *p = (struct pipe_trans_stream *) data; - p->out = out; - p->out_size = out_size; + + if (!p) + return; + + p->out = out; + p->out_size = out_size; } static bool pipe_trans( @@ -66,21 +84,19 @@ if (p->out_size < p->in_size) { memcpy(p->out, p->in, p->out_size); - *rd = *wn = p->out_size; - p->in += p->out_size; + *rd = *wn = p->out_size; + p->in += p->out_size; p->out += p->out_size; - *error = TRANS_STREAM_ERROR_BUFFER_FULL; + *error = TRANS_STREAM_ERROR_BUFFER_FULL; return false; } - else - { - memcpy(p->out, p->in, p->in_size); - *rd = *wn = p->in_size; - p->in += p->in_size; - p->out += p->in_size; - *error = TRANS_STREAM_ERROR_NONE; - return true; - } + + memcpy(p->out, p->in, p->in_size); + *rd = *wn = p->in_size; + p->in += p->in_size; + p->out += p->in_size; + *error = TRANS_STREAM_ERROR_NONE; + return true; } const struct trans_stream_backend pipe_backend = {
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/streams/trans_stream_zlib.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/streams/trans_stream_zlib.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (trans_stream_zlib.c). @@ -23,33 +23,73 @@ #include <stdlib.h> #include <string.h> -#include <compat/zlib.h> +#include <zlib.h> #include <string/stdstring.h> #include <streams/trans_stream.h> struct zlib_trans_stream { - bool inited; - int ex; /* window_bits or level */ z_stream z; + int ex; /* window_bits or level */ + bool inited; }; static void *zlib_deflate_stream_new(void) { - struct zlib_trans_stream *ret = (struct zlib_trans_stream*)calloc(1, sizeof(struct zlib_trans_stream)); + struct zlib_trans_stream *ret = (struct zlib_trans_stream*) + malloc(sizeof(*ret)); if (!ret) return NULL; - ret->ex = 9; - return (void *) ret; + ret->inited = false; + ret->ex = 9; + + ret->z.next_in = NULL; + ret->z.avail_in = 0; + ret->z.total_in = 0; + ret->z.next_out = NULL; + ret->z.avail_out = 0; + ret->z.total_out = 0; + + ret->z.msg = NULL; + ret->z.state = NULL; + + ret->z.zalloc = NULL; + ret->z.zfree = NULL; + ret->z.opaque = NULL; + + ret->z.data_type = 0; + ret->z.adler = 0; + ret->z.reserved = 0; + return (void *)ret; } static void *zlib_inflate_stream_new(void) { - struct zlib_trans_stream *ret = (struct zlib_trans_stream*)calloc(1, sizeof(struct zlib_trans_stream)); + struct zlib_trans_stream *ret = (struct zlib_trans_stream*) + malloc(sizeof(*ret)); if (!ret) return NULL; - ret->ex = MAX_WBITS; - return (void *) ret; + ret->inited = false; + ret->ex = MAX_WBITS; + + ret->z.next_in = NULL; + ret->z.avail_in = 0; + ret->z.total_in = 0; + ret->z.next_out = NULL; + ret->z.avail_out = 0; + ret->z.total_out = 0; + + ret->z.msg = NULL; + ret->z.state = NULL; + + ret->z.zalloc = NULL; + ret->z.zfree = NULL; + ret->z.opaque = NULL; + + ret->z.data_type = 0; + ret->z.adler = 0; + ret->z.reserved = 0; + return (void *)ret; } static void zlib_deflate_stream_free(void *data) @@ -222,9 +262,9 @@ zt->inited = true; } - pre_avail_in = z->avail_in; + pre_avail_in = z->avail_in; pre_avail_out = z->avail_out; - zret = inflate(z, flush ? Z_FINISH : Z_NO_FLUSH); + zret = inflate(z, flush ? Z_FINISH : Z_NO_FLUSH); if (zret == Z_OK) {
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/string/stdstring.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/string/stdstring.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2018 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (stdstring.c). @@ -22,10 +22,43 @@ #include <stdint.h> #include <ctype.h> +#include <string.h> #include <string/stdstring.h> #include <encodings/utf.h> +const uint8_t lr_char_props[256] = { + /*x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x80,0x00,0x00, /* 0x */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 1x */ + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 2x !"#$%&'()*+,-./ */ + 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x00,0x00,0x00,0x00, /* 3x 0123456789:;<=>? */ + 0x00,0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, /* 4x @ABCDEFGHIJKLMNO */ + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x08, /* 5x PQRSTUVWXYZ[\]^_ */ + 0x00,0x25,0x25,0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, /* 6x `abcdefghijklmno */ + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00, /* 7x pqrstuvwxyz{|}~ */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8x */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 9x */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Ax */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Bx */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Cx */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Dx */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Ex */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Fx */ +}; + +char *string_init(const char *src) +{ + return src ? strdup(src) : NULL; +} + +void string_set(char **string, const char *src) +{ + free(*string); + *string = string_init(src); +} + + char *string_to_upper(char *s) { char *cs = (char *)s; @@ -107,18 +140,18 @@ /* Remove leading whitespaces */ char *string_trim_whitespace_left(char *const s) { - if(s && *s) + if (s && *s) { size_t len = strlen(s); char *current = s; - while(*current && isspace((unsigned char)*current)) + while (*current && ISSPACE((unsigned char)*current)) { ++current; --len; } - if(s != current) + if (s != current) memmove(s, current, len + 1); } @@ -128,18 +161,18 @@ /* Remove trailing whitespaces */ char *string_trim_whitespace_right(char *const s) { - if(s && *s) + if (s && *s) { size_t len = strlen(s); char *current = s + len - 1; - while(current != s && isspace((unsigned char)*current)) + while (current != s && ISSPACE((unsigned char)*current)) { --current; --len; } - current[isspace((unsigned char)*current) ? 0 : 1] = '\0'; + current[ISSPACE((unsigned char)*current) ? 0 : 1] = '\0'; } return s; @@ -154,10 +187,11 @@ return s; } -char *word_wrap(char* buffer, const char *string, int line_width, bool unicode) +char *word_wrap(char* buffer, const char *string, int line_width, bool unicode, unsigned max_lines) { - unsigned i = 0; - unsigned len = (unsigned)strlen(string); + unsigned i = 0; + unsigned len = (unsigned)strlen(string); + unsigned lines = 1; while (i < len) { @@ -189,19 +223,26 @@ buffer[i] = string[i]; char_len--; i++; - } while(char_len); + } while (char_len); /* check for newlines embedded in the original input * and reset the index */ if (buffer[j] == '\n') + { + lines++; counter = 1; + } } /* check for whitespace */ if (string[i] == ' ') { - buffer[i] = '\n'; - i++; + if ((max_lines == 0 || lines < max_lines)) + { + buffer[i] = '\n'; + i++; + lines++; + } } else { @@ -210,12 +251,13 @@ /* check for nearest whitespace back in string */ for (k = i; k > 0; k--) { - if (string[k] != ' ') + if (string[k] != ' ' || (max_lines != 0 && lines >= max_lines)) continue; buffer[k] = '\n'; /* set string index back to character after this one */ i = k + 1; + lines++; break; } @@ -228,3 +270,148 @@ return buffer; } + +/* Splits string into tokens seperated by 'delim' + * > Returned token string must be free()'d + * > Returns NULL if token is not found + * > After each call, 'str' is set to the position after the + * last found token + * > Tokens *include* empty strings + * Usage example: + * char *str = "1,2,3,4,5,6,7,,,10,"; + * char **str_ptr = &str; + * char *token = NULL; + * while ((token = string_tokenize(str_ptr, ","))) + * { + * printf("%s\n", token); + * free(token); + * token = NULL; + * } + */ +char* string_tokenize(char **str, const char *delim) +{ + /* Taken from https://codereview.stackexchange.com/questions/216956/strtok-function-thread-safe-supports-empty-tokens-doesnt-change-string# */ + char *str_ptr = NULL; + char *delim_ptr = NULL; + char *token = NULL; + size_t token_len = 0; + + /* Sanity checks */ + if (!str || string_is_empty(delim)) + return NULL; + + str_ptr = *str; + + /* Note: we don't check string_is_empty() here, + * empty strings are valid */ + if (!str_ptr) + return NULL; + + /* Search for delimiter */ + delim_ptr = strstr(str_ptr, delim); + + if (delim_ptr) + token_len = delim_ptr - str_ptr; + else + token_len = strlen(str_ptr); + + /* Allocate token string */ + token = (char *)malloc((token_len + 1) * sizeof(char)); + + if (!token) + return NULL; + + /* Copy token */ + strlcpy(token, str_ptr, (token_len + 1) * sizeof(char)); + token[token_len] = '\0'; + + /* Update input string pointer */ + *str = delim_ptr ? delim_ptr + strlen(delim) : NULL; + + return token; +} + +/* Removes every instance of character 'c' from 'str' */ +void string_remove_all_chars(char *str, char c) +{ + char *read_ptr = NULL; + char *write_ptr = NULL; + + if (string_is_empty(str)) + return; + + read_ptr = str; + write_ptr = str; + + while (*read_ptr != '\0') + { + *write_ptr = *read_ptr++; + write_ptr += (*write_ptr != c) ? 1 : 0; + } + + *write_ptr = '\0'; +} + +/* Replaces every instance of character 'find' in 'str' + * with character 'replace' */ +void string_replace_all_chars(char *str, char find, char replace) +{ + char *str_ptr = str; + + if (string_is_empty(str)) + return; + + while ((str_ptr = strchr(str_ptr, find))) + *str_ptr++ = replace; +} + +/* Converts string to unsigned integer. + * Returns 0 if string is invalid */ +unsigned string_to_unsigned(const char *str) +{ + const char *ptr = NULL; + + if (string_is_empty(str)) + return 0; + + for (ptr = str; *ptr != '\0'; ptr++) + { + if (!ISDIGIT((unsigned char)*ptr)) + return 0; + } + + return (unsigned)strtoul(str, NULL, 10); +} + +/* Converts hexadecimal string to unsigned integer. + * Handles optional leading '0x'. + * Returns 0 if string is invalid */ +unsigned string_hex_to_unsigned(const char *str) +{ + const char *hex_str = str; + const char *ptr = NULL; + size_t len; + + if (string_is_empty(str)) + return 0; + + /* Remove leading '0x', if required */ + len = strlen(str); + + if (len >= 2) + if ((str[0] == '0') && + ((str[1] == 'x') || (str[1] == 'X'))) + hex_str = str + 2; + + if (string_is_empty(hex_str)) + return 0; + + /* Check for valid characters */ + for (ptr = hex_str; *ptr != '\0'; ptr++) + { + if (!isxdigit((unsigned char)*ptr)) + return 0; + } + + return (unsigned)strtoul(hex_str, NULL, 16); +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/hash
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/hash/test_hash.c
Added
@@ -0,0 +1,86 @@ +/* Copyright (C) 2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (test_stdstring.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <check.h> +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> + +#include <lrc_hash.h> + +#define SUITE_NAME "hash" + +START_TEST (test_sha256) +{ + char output[65]; + sha256_hash(output, (uint8_t*)"abc", 3); + ck_assert(!strcmp(output, + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")); +} +END_TEST + +START_TEST (test_sha1) +{ + char output[41]; + char tmpfile[512]; + FILE *fd; + tmpnam(tmpfile); + fd = fopen(tmpfile, "wb"); + ck_assert(fd != NULL); + fwrite("abc", 1, 3, fd); + fclose(fd); + sha1_calculate(tmpfile, output); + + ck_assert(!strcmp(output, + "A9993E364706816ABA3E25717850C26C9CD0D89D")); +} +END_TEST + +START_TEST (test_djb2) +{ + ck_assert_uint_eq(djb2_calculate("retroarch"), 0xFADF3BCF); +} +END_TEST + +Suite *create_suite(void) +{ + Suite *s = suite_create(SUITE_NAME); + + TCase *tc_core = tcase_create("Core"); + tcase_add_test(tc_core, test_sha256); + tcase_add_test(tc_core, test_sha1); + tcase_add_test(tc_core, test_djb2); + suite_add_tcase(s, tc_core); + + return s; +} + +int main(void) +{ + int num_fail; + Suite *s = create_suite(); + SRunner *sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + num_fail = srunner_ntests_failed(sr); + srunner_free(sr); + return (num_fail == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/lists
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/lists/test_linked_list.c
Added
@@ -0,0 +1,1300 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (test_linked_list.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <check.h> +#include <stdarg.h> +#include <stdlib.h> + +#include <lists/linked_list.h> + +#define SUITE_NAME "Linked List" + +static char *_value_1 = "value1"; +static char *_value_2 = "value2"; +static char *_value_3 = "value3"; + +START_TEST (test_linked_list_create) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_nonnull(list); + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_free) +{ + linked_list_t *queue = linked_list_new(); + linked_list_free(queue, NULL); + linked_list_free(NULL, NULL); +} +END_TEST + +static int _free_alloced_value_count; +static void _free_alloced_value(void *value) +{ + _free_alloced_value_count++; + free(value); +} + +START_TEST (test_linked_list_free_with_fn) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, malloc(1)); + linked_list_add(list, malloc(1)); + linked_list_add(list, malloc(1)); + + _free_alloced_value_count = 0; + linked_list_free(list, &_free_alloced_value); + + ck_assert_int_eq(3, _free_alloced_value_count); +} +END_TEST + +static void _verify_list(linked_list_t *list, int size, ...) +{ + va_list values_list; + void **values; + int i; + linked_list_iterator_t *iterator; + + values = (void **)malloc(size * sizeof(void *)); + + ck_assert_int_eq(linked_list_size(list), size); + + va_start(values_list, size); + for (i = 0; i < size; i++) + { + values[i] = va_arg(values_list, void *); + ck_assert_ptr_eq(values[i], linked_list_get(list, i)); + } + va_end(values_list); + + iterator = linked_list_iterator(list, true); + for (i = 0; i < size; i++) + { + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(values[i], linked_list_iterator_value(iterator)); + iterator = linked_list_iterator_next(iterator); + } + ck_assert_ptr_null(iterator); + + iterator = linked_list_iterator(list, false); + for (i = size - 1; i >= 0; i--) + { + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(values[i], linked_list_iterator_value(iterator)); + iterator = linked_list_iterator_next(iterator); + } + ck_assert_ptr_null(iterator); + + free(values); +} + +START_TEST (test_linked_list_add) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_insert_empty) +{ + linked_list_t *list = linked_list_new(); + linked_list_insert(list, 0, _value_1); + + ck_assert_int_eq(linked_list_size(list), 1); + ck_assert_ptr_eq(linked_list_get(list, 0), _value_1); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_insert_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + linked_list_insert(list, 0, _value_1); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_insert_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_3); + linked_list_insert(list, 1, _value_2); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_insert_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_insert(list, 2, _value_3); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_insert_invalid) +{ + linked_list_t *list = linked_list_new(); + linked_list_insert(list, 2, _value_1); + + ck_assert_int_eq(linked_list_size(list), 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_insert_null) +{ + linked_list_insert(NULL, 0, _value_1); +} +END_TEST + +START_TEST (test_linked_list_get_invalid) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_get(list, 2)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_get_null) +{ + ck_assert_ptr_null(linked_list_get(NULL, 0)); +} +END_TEST + +START_TEST (test_linked_list_get_first_matching_null) +{ + ck_assert_ptr_null(linked_list_get_first_matching(NULL, NULL, NULL)); +} +END_TEST + +START_TEST (test_linked_list_get_first_matching_function_null) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_get_first_matching(list, NULL, NULL)); + + linked_list_free(list, NULL); +} + +bool _matches_function(void *value, void *state) +{ + ck_assert_ptr_eq(_value_1, state); + return value == _value_2; +} + +START_TEST (test_linked_list_get_first_matching_no_match) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_get_first_matching(list, &_matches_function, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_get_first_matching_with_match) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(_value_2, linked_list_get_first_matching(list, &_matches_function, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_get_last_matching_null) +{ + ck_assert_ptr_null(linked_list_get_last_matching(NULL, NULL, NULL)); +} +END_TEST + +START_TEST (test_linked_list_get_last_matching_function_null) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_get_last_matching(list, NULL, NULL)); + + linked_list_free(list, NULL); +} + +START_TEST (test_linked_list_get_last_matching_no_match) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_get_last_matching(list, &_matches_function, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_get_last_matching_with_match) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(_value_2, linked_list_get_last_matching(list, &_matches_function, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_at_null) +{ + ck_assert_ptr_null(linked_list_remove_at(NULL, 0)); +} +END_TEST + +START_TEST (test_linked_list_remove_at_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_remove_at(list, 0)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_at_invalid) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_remove_at(list, 3); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_at_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_remove_at(list, 0); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_at_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_remove_at(list, 1); + + _verify_list(list, 2, _value_1, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_at_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_remove_at(list, 2); + + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_at_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + linked_list_remove_at(list, 0); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_null) +{ + ck_assert_ptr_null(linked_list_remove_first(NULL, _value_1)); +} +END_TEST + +START_TEST (test_linked_list_remove_first_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_remove_first(list, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_not_found) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_null(linked_list_remove_first(list, "foo")); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_first(list, _value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_first(list, _value_2), _value_2); + + _verify_list(list, 2, _value_1, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_first(list, _value_3), _value_3); + + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_first(list, _value_1), _value_1); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_multiple) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_first(list, _value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_1); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_null) +{ + ck_assert_ptr_null(linked_list_remove_last(NULL, _value_1)); +} +END_TEST + +START_TEST (test_linked_list_remove_last_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_remove_last(list, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_not_found) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_null(linked_list_remove_last(list, "foo")); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_last(list, _value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_last(list, _value_2), _value_2); + + _verify_list(list, 2, _value_1, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_last(list, _value_3), _value_3); + + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_last(list, _value_1), _value_1); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_multiple) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_last(list, _value_1), _value_1); + + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_null) +{ + ck_assert_ptr_null(linked_list_remove_all(NULL, _value_1)); +} +END_TEST + +START_TEST (test_linked_list_remove_all_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_remove_all(list, _value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_not_found) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_null(linked_list_remove_all(list, "foo")); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_all(list, _value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_all(list, _value_2), _value_2); + + _verify_list(list, 2, _value_1, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_all(list, _value_3), _value_3); + + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_all(list, _value_1), _value_1); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_multiple) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_all(list, _value_1), _value_1); + + _verify_list(list, 1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +bool _match_value_1(void *value) +{ + return _value_1 == value; +} + +bool _no_match(void *value) +{ + return false; +} + +START_TEST (test_linked_list_remove_first_matching_null) +{ + ck_assert_ptr_null(linked_list_remove_first_matching(NULL, &_match_value_1)); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_remove_first_matching(list, &_match_value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_not_found) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_null(linked_list_remove_first_matching(list, &_no_match)); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_first_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_first_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_first_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_first_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_first_matching_multiple) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_first_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_1); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_null) +{ + ck_assert_ptr_null(linked_list_remove_last_matching(NULL, &_match_value_1)); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_ptr_null(linked_list_remove_last_matching(list, &_match_value_1)); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_not_found) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_null(linked_list_remove_last_matching(list, &_no_match)); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_last_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + linked_list_add(list, _value_3); + + ck_assert_ptr_eq(linked_list_remove_last_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_last_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_last_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_last_matching_multiple) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + + ck_assert_ptr_eq(linked_list_remove_last_matching(list, &_match_value_1), _value_1); + + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_null) +{ + linked_list_remove_all_matching(NULL, &_match_value_1); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_empty) +{ + linked_list_t *list = linked_list_new(); + linked_list_remove_all_matching(list, &_match_value_1); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_not_found) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_remove_all_matching(list, &_no_match); + + _verify_list(list, 3, _value_1, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_remove_all_matching(list, &_match_value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + linked_list_add(list, _value_3); + + linked_list_remove_all_matching(list, &_match_value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + linked_list_add(list, _value_1); + + linked_list_remove_all_matching(list, &_match_value_1); + + _verify_list(list, 2, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_only) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + + linked_list_remove_all_matching(list, &_match_value_1); + + _verify_list(list, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_remove_all_matching_multiple) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_1); + + linked_list_remove_all_matching(list, &_match_value_1); + + _verify_list(list, 1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_set_at_null) +{ + ck_assert_int_eq(linked_list_set_at(NULL, 0, _value_1) == true, 0); +} +END_TEST + +START_TEST (test_linked_list_set_at_empty) +{ + linked_list_t *list = linked_list_new(); + ck_assert_int_eq(linked_list_set_at(list, 0, _value_1) == true, 0); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_set_at_invalid) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + ck_assert_int_eq(linked_list_set_at(list, 1, _value_2) == true, 0); + + linked_list_free(list, NULL); +} +END_TEST + +static char *_replacement_value = "foo"; + +START_TEST (test_linked_list_set_at_first) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_int_eq(linked_list_set_at(list, 0, _replacement_value) == false, 0); + + _verify_list(list, 3, _replacement_value, _value_2, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_set_at_middle) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_int_eq(linked_list_set_at(list, 1, _replacement_value) == false, 0); + + _verify_list(list, 3, _value_1, _replacement_value, _value_3); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_set_at_last) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + ck_assert_int_eq(linked_list_set_at(list, 2, _replacement_value) == false, 0); + + _verify_list(list, 3, _value_1, _value_2, _replacement_value); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_iterator_remove_null) +{ + ck_assert_ptr_null(linked_list_iterator_remove(NULL)); +} +END_TEST + +START_TEST (test_linked_list_iterator_remove_first) +{ + linked_list_t *list; + linked_list_iterator_t *iterator; + + list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + iterator = linked_list_iterator(list, true); + iterator = linked_list_iterator_remove(iterator); + + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(linked_list_iterator_value(iterator), _value_2); + _verify_list(list, 2, _value_2, _value_3); + + linked_list_iterator_free(iterator); + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_iterator_remove_middle) +{ + linked_list_t *list; + linked_list_iterator_t *iterator; + + list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + iterator = linked_list_iterator(list, true); + iterator = linked_list_iterator_next(iterator); + iterator = linked_list_iterator_remove(iterator); + + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(linked_list_iterator_value(iterator), _value_3); + _verify_list(list, 2, _value_1, _value_3); + + linked_list_iterator_free(iterator); + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_iterator_remove_last) +{ + linked_list_t *list; + linked_list_iterator_t *iterator; + + list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + iterator = linked_list_iterator(list, true); + iterator = linked_list_iterator_next(iterator); + iterator = linked_list_iterator_next(iterator); + iterator = linked_list_iterator_remove(iterator); + + ck_assert_ptr_null(iterator); + _verify_list(list, 2, _value_1, _value_2); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_iterator_free_null) +{ + linked_list_iterator_free(NULL); +} +END_TEST + +static size_t _foreach_count; +static void _foreach_fn(size_t index, void *value) +{ + _foreach_count++; +} + +START_TEST (test_linked_list_foreach_null_list) +{ + linked_list_foreach(NULL, _foreach_fn); +} +END_TEST + +START_TEST (test_linked_list_foreach_null_fn) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + linked_list_foreach(list, NULL); + + linked_list_free(list, NULL); +} +END_TEST + +START_TEST (test_linked_list_foreach_valid) +{ + linked_list_t *list = linked_list_new(); + linked_list_add(list, _value_1); + linked_list_add(list, _value_2); + linked_list_add(list, _value_3); + + _foreach_count = 0; + linked_list_foreach(list, &_foreach_fn); + ck_assert_uint_eq(3, _foreach_count); + + linked_list_free(list, NULL); +} + +Suite *create_suite(void) +{ + Suite *s = suite_create(SUITE_NAME); + + TCase *tc_core = tcase_create("Core"); + tcase_add_test(tc_core, test_linked_list_create); + tcase_add_test(tc_core, test_linked_list_free); + tcase_add_test(tc_core, test_linked_list_free_with_fn); + tcase_add_test(tc_core, test_linked_list_add); + tcase_add_test(tc_core, test_linked_list_insert_empty); + tcase_add_test(tc_core, test_linked_list_insert_first); + tcase_add_test(tc_core, test_linked_list_insert_middle); + tcase_add_test(tc_core, test_linked_list_insert_last); + tcase_add_test(tc_core, test_linked_list_insert_invalid); + tcase_add_test(tc_core, test_linked_list_insert_null); + tcase_add_test(tc_core, test_linked_list_get_invalid); + tcase_add_test(tc_core, test_linked_list_get_null); + tcase_add_test(tc_core, test_linked_list_get_first_matching_null); + tcase_add_test(tc_core, test_linked_list_get_first_matching_function_null); + tcase_add_test(tc_core, test_linked_list_get_first_matching_no_match); + tcase_add_test(tc_core, test_linked_list_get_first_matching_with_match); + tcase_add_test(tc_core, test_linked_list_get_last_matching_null); + tcase_add_test(tc_core, test_linked_list_get_last_matching_function_null); + tcase_add_test(tc_core, test_linked_list_get_last_matching_no_match); + tcase_add_test(tc_core, test_linked_list_get_last_matching_with_match); + tcase_add_test(tc_core, test_linked_list_remove_at_null); + tcase_add_test(tc_core, test_linked_list_remove_at_empty); + tcase_add_test(tc_core, test_linked_list_remove_at_invalid); + tcase_add_test(tc_core, test_linked_list_remove_at_first); + tcase_add_test(tc_core, test_linked_list_remove_at_middle); + tcase_add_test(tc_core, test_linked_list_remove_at_last); + tcase_add_test(tc_core, test_linked_list_remove_at_only); + tcase_add_test(tc_core, test_linked_list_remove_first_null); + tcase_add_test(tc_core, test_linked_list_remove_first_empty); + tcase_add_test(tc_core, test_linked_list_remove_first_not_found); + tcase_add_test(tc_core, test_linked_list_remove_first_first); + tcase_add_test(tc_core, test_linked_list_remove_first_middle); + tcase_add_test(tc_core, test_linked_list_remove_first_last); + tcase_add_test(tc_core, test_linked_list_remove_first_only); + tcase_add_test(tc_core, test_linked_list_remove_first_multiple); + tcase_add_test(tc_core, test_linked_list_remove_last_null); + tcase_add_test(tc_core, test_linked_list_remove_last_empty); + tcase_add_test(tc_core, test_linked_list_remove_last_not_found); + tcase_add_test(tc_core, test_linked_list_remove_last_first); + tcase_add_test(tc_core, test_linked_list_remove_last_middle); + tcase_add_test(tc_core, test_linked_list_remove_last_last); + tcase_add_test(tc_core, test_linked_list_remove_last_only); + tcase_add_test(tc_core, test_linked_list_remove_last_multiple); + tcase_add_test(tc_core, test_linked_list_remove_all_null); + tcase_add_test(tc_core, test_linked_list_remove_all_empty); + tcase_add_test(tc_core, test_linked_list_remove_all_not_found); + tcase_add_test(tc_core, test_linked_list_remove_all_first); + tcase_add_test(tc_core, test_linked_list_remove_all_middle); + tcase_add_test(tc_core, test_linked_list_remove_all_last); + tcase_add_test(tc_core, test_linked_list_remove_all_only); + tcase_add_test(tc_core, test_linked_list_remove_all_multiple); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_null); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_empty); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_not_found); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_first); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_middle); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_last); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_only); + tcase_add_test(tc_core, test_linked_list_remove_first_matching_multiple); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_null); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_empty); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_not_found); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_first); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_middle); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_last); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_only); + tcase_add_test(tc_core, test_linked_list_remove_last_matching_multiple); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_null); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_empty); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_not_found); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_first); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_middle); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_last); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_only); + tcase_add_test(tc_core, test_linked_list_remove_all_matching_multiple); + tcase_add_test(tc_core, test_linked_list_set_at_null); + tcase_add_test(tc_core, test_linked_list_set_at_empty); + tcase_add_test(tc_core, test_linked_list_set_at_invalid); + tcase_add_test(tc_core, test_linked_list_set_at_first); + tcase_add_test(tc_core, test_linked_list_set_at_middle); + tcase_add_test(tc_core, test_linked_list_set_at_last); + tcase_add_test(tc_core, test_linked_list_iterator_remove_null); + tcase_add_test(tc_core, test_linked_list_iterator_remove_first); + tcase_add_test(tc_core, test_linked_list_iterator_remove_middle); + tcase_add_test(tc_core, test_linked_list_iterator_remove_last); + tcase_add_test(tc_core, test_linked_list_iterator_free_null); + tcase_add_test(tc_core, test_linked_list_foreach_null_list); + tcase_add_test(tc_core, test_linked_list_foreach_null_fn); + tcase_add_test(tc_core, test_linked_list_foreach_valid); + suite_add_tcase(s, tc_core); + + return s; +} + +int main(void) +{ + int num_fail; + Suite *s = create_suite(); + SRunner *sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + num_fail = srunner_ntests_failed(sr); + srunner_free(sr); + return (num_fail == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/queues
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/queues/test_generic_queue.c
Added
@@ -0,0 +1,410 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (test_generic_queue.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include <check.h> +#include <stdarg.h> +#include <stdlib.h> + +#include <queues/generic_queue.h> + +#define SUITE_NAME "Generic Queue" + +static char *_value_1 = "value1"; +static char *_value_2 = "value2"; +static char *_value_3 = "value3"; + +START_TEST (test_generic_queue_create) +{ + generic_queue_t *queue = generic_queue_new(); + ck_assert_ptr_nonnull(queue); + generic_queue_free(queue, NULL); +} +END_TEST + +START_TEST (test_generic_queue_free) +{ + generic_queue_t *queue = generic_queue_new(); + generic_queue_free(queue, NULL); + generic_queue_free(NULL, NULL); +} +END_TEST + +START_TEST (test_generic_queue_push_pop) +{ + generic_queue_t *queue; + char *value; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + ck_assert_int_eq(generic_queue_length(queue), 1); + value = (char *) generic_queue_pop(queue); + ck_assert_ptr_eq(value, _value_1); + ck_assert_int_eq(generic_queue_length(queue), 0); + + generic_queue_push(queue, _value_2); + ck_assert_int_eq(generic_queue_length(queue), 1); + generic_queue_push(queue, _value_3); + ck_assert_int_eq(generic_queue_length(queue), 2); + value = (char *) generic_queue_pop(queue); + ck_assert_ptr_eq(value, _value_3); + ck_assert_int_eq(generic_queue_length(queue), 1); + value = (char *) generic_queue_pop(queue); + ck_assert_ptr_eq(value, _value_2); + ck_assert_int_eq(generic_queue_length(queue), 0); + + generic_queue_free(queue, NULL); +} +END_TEST + +START_TEST (test_generic_queue_peek) +{ + generic_queue_t *queue; + + queue = generic_queue_new(); + ck_assert_ptr_null(generic_queue_peek(queue)); + ck_assert_ptr_null(generic_queue_peek_first(queue)); + + generic_queue_push(queue, _value_1); + ck_assert_ptr_eq(_value_1, generic_queue_peek(queue)); + ck_assert_ptr_eq(_value_1, generic_queue_peek_first(queue)); + + generic_queue_push(queue, _value_2); + ck_assert_ptr_eq(_value_2, generic_queue_peek(queue)); + ck_assert_ptr_eq(_value_1, generic_queue_peek_first(queue)); + + generic_queue_push(queue, _value_3); + ck_assert_ptr_eq(_value_3, generic_queue_peek(queue)); + ck_assert_ptr_eq(_value_1, generic_queue_peek_first(queue)); + + generic_queue_free(queue, NULL); +} +END_TEST + +START_TEST (test_generic_queue_shift_unshift) +{ + generic_queue_t *queue; + char *value; + + queue = generic_queue_new(); + generic_queue_shift(queue, _value_1); + ck_assert_int_eq(generic_queue_length(queue), 1); + value = (char *) generic_queue_unshift(queue); + ck_assert_ptr_eq(value, _value_1); + ck_assert_int_eq(generic_queue_length(queue), 0); + + generic_queue_shift(queue, _value_2); + ck_assert_int_eq(generic_queue_length(queue), 1); + generic_queue_shift(queue, _value_3); + ck_assert_int_eq(generic_queue_length(queue), 2); + value = (char *) generic_queue_unshift(queue); + ck_assert_ptr_eq(value, _value_3); + ck_assert_int_eq(generic_queue_length(queue), 1); + value = (char *) generic_queue_unshift(queue); + ck_assert_ptr_eq(value, _value_2); + ck_assert_int_eq(generic_queue_length(queue), 0); + + generic_queue_free(queue, NULL); +} +END_TEST + +START_TEST (test_generic_queue_empty) +{ + generic_queue_t *queue; + + queue = generic_queue_new(); + ck_assert_ptr_null(generic_queue_pop(queue)); + ck_assert_ptr_null(generic_queue_unshift(queue)); + generic_queue_free(queue, NULL); +} +END_TEST + +void _free_value(void *value) +{ + return; +} + +START_TEST (test_generic_queue_iterator) +{ + generic_queue_t *queue; + generic_queue_iterator_t *iterator; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + iterator = generic_queue_iterator(queue, true); + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(generic_queue_iterator_value(iterator), _value_1); + iterator = generic_queue_iterator_next(iterator); + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(generic_queue_iterator_value(iterator), _value_2); + iterator = generic_queue_iterator_next(iterator); + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(generic_queue_iterator_value(iterator), _value_3); + iterator = generic_queue_iterator_next(iterator); + ck_assert_ptr_null(iterator); + + iterator = generic_queue_iterator(queue, false); + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(generic_queue_iterator_value(iterator), _value_3); + iterator = generic_queue_iterator_next(iterator); + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(generic_queue_iterator_value(iterator), _value_2); + iterator = generic_queue_iterator_next(iterator); + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(generic_queue_iterator_value(iterator), _value_1); + iterator = generic_queue_iterator_next(iterator); + ck_assert_ptr_null(iterator); + + generic_queue_free(queue, &_free_value); +} +END_TEST + +START_TEST (test_generic_queue_shift_free) +{ + generic_queue_t *queue; + + queue = generic_queue_new(); + + generic_queue_shift(queue, _value_1); + generic_queue_shift(queue, _value_2); + generic_queue_shift(queue, _value_3); + + generic_queue_free(queue, &_free_value); +} +END_TEST + +START_TEST (test_generic_queue_remove_one) +{ + generic_queue_t *queue; + generic_queue_iterator_t *iterator; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + + iterator = generic_queue_iterator(queue, true); + iterator = generic_queue_iterator_remove(iterator); + ck_assert_ptr_null(iterator); + ck_assert_int_eq(generic_queue_length(queue), 0); + + generic_queue_free(queue, NULL); +} +END_TEST + +static void _verify_queue_values(generic_queue_t *queue, int count, ...) +{ + va_list values_list; + void **values; + int i; + generic_queue_iterator_t *iterator; + + values = (void **)malloc(count * sizeof(void *)); + + ck_assert_int_eq(count, generic_queue_length(queue)); + + va_start(values_list, count); + for (i = 0; i < count; i++) + values[i] = va_arg(values_list, void *); + va_end(values_list); + + iterator = generic_queue_iterator(queue, true); + for (i = 0; i < count; i++) + { + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(values[i], generic_queue_iterator_value(iterator)); + iterator = generic_queue_iterator_next(iterator); + } + ck_assert_ptr_null(iterator); + + iterator = generic_queue_iterator(queue, false); + for (i = count - 1; i >= 0; i--) + { + ck_assert_ptr_nonnull(iterator); + ck_assert_ptr_eq(values[i], generic_queue_iterator_value(iterator)); + iterator = generic_queue_iterator_next(iterator); + } + ck_assert_ptr_null(iterator); + + free(values); +} + +START_TEST (test_generic_queue_iterator_remove_first) +{ + generic_queue_t *queue; + generic_queue_iterator_t *iterator; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + iterator = generic_queue_iterator(queue, true); + iterator = generic_queue_iterator_remove(iterator); + generic_queue_iterator_free(iterator); + + _verify_queue_values(queue, 2, _value_2, _value_3); + + generic_queue_free(queue, &_free_value); +} +END_TEST + +START_TEST (test_generic_queue_iterator_remove_middle) +{ + generic_queue_t *queue; + generic_queue_iterator_t *iterator; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + iterator = generic_queue_iterator(queue, true); + iterator = generic_queue_iterator_next(iterator); + iterator = generic_queue_iterator_remove(iterator); + generic_queue_iterator_free(iterator); + + _verify_queue_values(queue, 2, _value_1, _value_3); + + generic_queue_free(queue, &_free_value); +} +END_TEST + +START_TEST (test_generic_queue_iterator_remove_last) +{ + generic_queue_t *queue; + generic_queue_iterator_t *iterator; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + iterator = generic_queue_iterator(queue, false); + iterator = generic_queue_iterator_remove(iterator); + generic_queue_iterator_free(iterator); + + _verify_queue_values(queue, 2, _value_1, _value_2); + + generic_queue_free(queue, &_free_value); +} +END_TEST + +START_TEST (test_generic_queue_remove_first) +{ + generic_queue_t *queue; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + ck_assert_ptr_eq(generic_queue_remove(queue, _value_1), _value_1); + + _verify_queue_values(queue, 2, _value_2, _value_3); + + generic_queue_free(queue, &_free_value); +} + +START_TEST (test_generic_queue_remove_middle) +{ + generic_queue_t *queue; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + ck_assert_ptr_eq(generic_queue_remove(queue, _value_2), _value_2); + + _verify_queue_values(queue, 2, _value_1, _value_3); + + generic_queue_free(queue, &_free_value); +} + +START_TEST (test_generic_queue_remove_last) +{ + generic_queue_t *queue; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + generic_queue_push(queue, _value_2); + generic_queue_push(queue, _value_3); + + ck_assert_ptr_eq(generic_queue_remove(queue, _value_3), _value_3); + + _verify_queue_values(queue, 2, _value_1, _value_2); + + generic_queue_free(queue, &_free_value); +} + +START_TEST (test_generic_queue_iterator_free) +{ + generic_queue_t *queue; + generic_queue_iterator_t *iterator; + + queue = generic_queue_new(); + generic_queue_push(queue, _value_1); + iterator = generic_queue_iterator(queue, true); + + generic_queue_iterator_free(iterator); + generic_queue_iterator_free(NULL); + + generic_queue_free(queue, _free_value); +} +END_TEST + +Suite *create_suite(void) +{ + Suite *s = suite_create(SUITE_NAME); + + TCase *tc_core = tcase_create("Core"); + tcase_add_test(tc_core, test_generic_queue_create); + tcase_add_test(tc_core, test_generic_queue_free); + tcase_add_test(tc_core, test_generic_queue_push_pop); + tcase_add_test(tc_core, test_generic_queue_peek); + tcase_add_test(tc_core, test_generic_queue_shift_unshift); + tcase_add_test(tc_core, test_generic_queue_empty); + tcase_add_test(tc_core, test_generic_queue_iterator); + tcase_add_test(tc_core, test_generic_queue_shift_free); + tcase_add_test(tc_core, test_generic_queue_remove_one); + tcase_add_test(tc_core, test_generic_queue_iterator_remove_first); + tcase_add_test(tc_core, test_generic_queue_iterator_remove_middle); + tcase_add_test(tc_core, test_generic_queue_iterator_remove_last); + tcase_add_test(tc_core, test_generic_queue_remove_first); + tcase_add_test(tc_core, test_generic_queue_remove_middle); + tcase_add_test(tc_core, test_generic_queue_remove_last); + tcase_add_test(tc_core, test_generic_queue_iterator_free); + suite_add_tcase(s, tc_core); + + return s; +} + +int main(void) +{ + int num_fail; + Suite *s = create_suite(); + SRunner *sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + num_fail = srunner_ntests_failed(sr); + srunner_free(sr); + return (num_fail == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/string
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/string/test_stdstring.c
Added
@@ -0,0 +1,321 @@ +/* Copyright (C) 2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (test_stdstring.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <check.h> +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> + +#include <string/stdstring.h> +#include <encodings/utf.h> + +#define SUITE_NAME "stdstring" + +START_TEST (test_string_filter) +{ + char test1[] = "foo bar some string"; + char test2[] = ""; + string_remove_all_chars(test1, 's'); + string_remove_all_chars(test2, '0'); + string_remove_all_chars(NULL, 'a'); + ck_assert(!strcmp(test1, "foo bar ome tring")); + ck_assert(!strcmp(test2, "")); +} +END_TEST + +START_TEST (test_string_replace) +{ + char test1[] = "foo bar some string"; + string_replace_all_chars(test1, 's', 'S'); + string_replace_all_chars(NULL, 'a', 'A'); + ck_assert(!strcmp(test1, "foo bar Some String")); +} +END_TEST + +START_TEST (test_string_case) +{ + char test1[] = "foo"; + char test2[] = "01foOo[]_"; + ck_assert(!strcmp(string_to_upper(test1), "FOO")); + ck_assert(!strcmp(string_to_upper(test2), "01FOOO[]_")); + ck_assert(!strcmp(string_to_lower(test2), "01fooo[]_")); +} +END_TEST + +START_TEST (test_string_char_classify) +{ + ck_assert(ISSPACE(' ')); + ck_assert(ISSPACE('\n')); + ck_assert(ISSPACE('\r')); + ck_assert(ISSPACE('\t')); + ck_assert(!ISSPACE('a')); + + ck_assert(ISALPHA('a')); + ck_assert(ISALPHA('Z')); + ck_assert(!ISALPHA('5')); + + ck_assert(ISALNUM('a')); + ck_assert(ISALNUM('Z')); + ck_assert(ISALNUM('5')); +} +END_TEST + +START_TEST (test_string_num_conv) +{ + ck_assert_uint_eq(3, string_to_unsigned("3")); + ck_assert_uint_eq(2147483647, string_to_unsigned("2147483647")); + ck_assert_uint_eq(0, string_to_unsigned("foo")); + ck_assert_uint_eq(0, string_to_unsigned("-1")); + ck_assert_uint_eq(0, string_to_unsigned(NULL)); + + ck_assert_uint_eq(10, string_hex_to_unsigned("0xa")); + ck_assert_uint_eq(10, string_hex_to_unsigned("a")); + ck_assert_uint_eq(255, string_hex_to_unsigned("FF")); + ck_assert_uint_eq(255, string_hex_to_unsigned("0xff")); + ck_assert_uint_eq(0, string_hex_to_unsigned("0xfzzf")); + ck_assert_uint_eq(0, string_hex_to_unsigned("0x")); + ck_assert_uint_eq(0, string_hex_to_unsigned("0xx")); + ck_assert_uint_eq(0, string_hex_to_unsigned(NULL)); +} +END_TEST + +START_TEST (test_string_tokenizer) +{ + char *testinput = "@@1@@2@@3@@@@9@@@"; + char **ptr = &testinput; + char *token = NULL; + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "1")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "2")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "3")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "9")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token != NULL); + ck_assert(!strcmp(token, "@")); + free(token); + token = string_tokenize(ptr, "@@"); + ck_assert(token == NULL); +} +END_TEST + +START_TEST (test_string_replacesubstr) +{ + char *res = string_replace_substring("foobaarhellowooorldtest", "oo", "ooo"); + ck_assert(res != NULL); + ck_assert(!strcmp(res, "fooobaarhellowoooorldtest")); + free(res); +} +END_TEST + +START_TEST (test_string_trim) +{ + char test1[] = "\t \t\nhey there \n \n"; + char test2[] = "\t \t\nhey there \n \n"; + char test3[] = "\t \t\nhey there \n \n"; + ck_assert(string_trim_whitespace_left(test1) == (char*)test1); + ck_assert(!strcmp(test1, "hey there \n \n")); + ck_assert(string_trim_whitespace_right(test2) == (char*)test2); + ck_assert(!strcmp(test2, "\t \t\nhey there")); + ck_assert(string_trim_whitespace(test3) == (char*)test3); + ck_assert(!strcmp(test3, "hey there")); +} +END_TEST + +START_TEST (test_string_comparison) +{ + ck_assert(string_is_not_equal_fast("foo", "bar", 3)); + ck_assert(string_is_equal_fast("foo2", "foo2", 4)); + ck_assert(!string_is_equal_fast("foo1", "foo2", 4)); + ck_assert(string_is_equal_fast("foo1", "foo2", 3)); +} +END_TEST + +START_TEST (test_word_wrap) +{ + const char *testtxt = ( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam nec " + "enim quis orci euismod efficitur at nec arcu. Vivamus imperdiet est " + "feugiat massa rhoncus porttitor at vitae ante. Nunc a orci vel ipsum " + "tempor posuere sed a lacus. Ut erat odio, ultrices vitae iaculis " + "fringilla, iaculis ut eros.\nSed facilisis viverra lectus et " + "ullamcorper. Aenean risus ex, ornare eget scelerisque ac, imperdiet eu " + "ipsum. Morbi pellentesque erat metus, sit amet aliquet libero rutrum " + "et. Integer non ullamcorper tellus."); + const char *expected = ( + "Lorem ipsum dolor sit amet, consectetur\n" + "adipiscing elit. Nam nec enim quis orci\n" + "euismod efficitur at nec arcu. Vivamus\n" + "imperdiet est feugiat massa rhoncus\n" + "porttitor at vitae ante. Nunc a orci vel\n" + "ipsum tempor posuere sed a lacus. Ut\n" + "erat odio, ultrices vitae iaculis\n" + "fringilla, iaculis ut eros.\n" + "Sed facilisis viverra lectus et\n" + "ullamcorper. " + "Aenean risus ex, ornare eget scelerisque ac, imperdiet eu ipsum. Morbi " + "pellentesque erat metus, sit amet aliquet libero rutrum et. Integer " + "non ullamcorper tellus."); + + char output[1024]; + + word_wrap(output, testtxt, 40, true, 10); + ck_assert(!strcmp(output, expected)); +} +END_TEST + +START_TEST (test_strlcpy) +{ + char buf1[8]; + ck_assert_uint_eq(3, strlcpy(buf1, "foo", sizeof(buf1))); + ck_assert(!memcmp(buf1, "foo", 4)); + ck_assert_uint_eq(11, strlcpy(buf1, "foo12345678", sizeof(buf1))); + ck_assert(!memcmp(buf1, "foo1234", 8)); +} +END_TEST + +START_TEST (test_strlcat) +{ + char buf1[8]; + buf1[0] = 'f'; + buf1[1] = '\0'; + ck_assert_uint_eq(10, strlcat(buf1, "ooooooooo", sizeof(buf1))); + ck_assert(!memcmp(buf1, "foooooo\0", 8)); + ck_assert_uint_eq(13, strlcat(buf1, "123456", sizeof(buf1))); + ck_assert(!memcmp(buf1, "foooooo\0", 8)); +} +END_TEST + +START_TEST (test_strldup) +{ + char buf1[8] = "foo"; + char *tv1 = strldup(buf1, 16); + char *tv2 = strldup(buf1, 2); + ck_assert(tv1 != (char*)buf1); + ck_assert(tv2 != (char*)buf1); + ck_assert_uint_eq(strlen(tv2), 1); + ck_assert(tv2[0] == 'f' && tv2[1] == 0); + free(tv1); + free(tv2); +} +END_TEST + +START_TEST (test_utf8_conv_utf32) +{ + uint32_t output[12]; + const char test1[] = "aæ⠻จйγチℝ\xff"; + ck_assert_uint_eq(8, utf8_conv_utf32(output, 12, test1, strlen(test1))); + ck_assert_uint_eq(97, output[0]); + ck_assert_uint_eq(230, output[1]); + ck_assert_uint_eq(10299, output[2]); + ck_assert_uint_eq(3592, output[3]); + ck_assert_uint_eq(1081, output[4]); + ck_assert_uint_eq(947, output[5]); + ck_assert_uint_eq(12481, output[6]); + ck_assert_uint_eq(8477, output[7]); +} +END_TEST + +START_TEST (test_utf8_util) +{ + const char *test1 = "aæ⠻จ𠀤"; + const char **tptr = &test1; + char out[64]; + ck_assert_uint_eq(utf8len(test1), 5); + ck_assert_uint_eq(utf8len(NULL), 0); + ck_assert(&test1[1 + 2 + 3] == utf8skip(test1, 3)); + + ck_assert_uint_eq(97, utf8_walk(tptr)); + ck_assert_uint_eq(230, utf8_walk(tptr)); + ck_assert_uint_eq(10299, utf8_walk(tptr)); + ck_assert_uint_eq(3592, utf8_walk(tptr)); + ck_assert_uint_eq(131108, utf8_walk(tptr)); + + //ck_assert_uint_eq(1, utf8cpy(out, 64, test1, 1)); +} +END_TEST + +START_TEST (test_utf16_conv) +{ + const uint16_t test1[] = {0x0061, 0x00e6, 0x283b, 0x0e08, 0xd840, 0xdc24}; + char out[64]; + size_t outlen = sizeof(out); + ck_assert(utf16_conv_utf8((uint8_t*)out, &outlen, test1, sizeof(test1) / 2)); + ck_assert_uint_eq(outlen, 13); + ck_assert(!memcmp(out, "aæ⠻จ𠀤", 13)); +} +END_TEST + +Suite *create_suite(void) +{ + Suite *s = suite_create(SUITE_NAME); + + TCase *tc_core = tcase_create("Core"); + tcase_add_test(tc_core, test_string_comparison); + tcase_add_test(tc_core, test_string_num_conv); + tcase_add_test(tc_core, test_string_char_classify); + tcase_add_test(tc_core, test_string_case); + tcase_add_test(tc_core, test_string_filter); + tcase_add_test(tc_core, test_string_replace); + tcase_add_test(tc_core, test_string_tokenizer); + tcase_add_test(tc_core, test_string_trim); + tcase_add_test(tc_core, test_string_replacesubstr); + tcase_add_test(tc_core, test_word_wrap); + tcase_add_test(tc_core, test_strlcpy); + tcase_add_test(tc_core, test_strlcat); + tcase_add_test(tc_core, test_strldup); + tcase_add_test(tc_core, test_utf8_conv_utf32); + tcase_add_test(tc_core, test_utf16_conv); + tcase_add_test(tc_core, test_utf8_util); + suite_add_tcase(s, tc_core); + + return s; +} + +int main(void) +{ + int num_fail; + Suite *s = create_suite(); + SRunner *sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + num_fail = srunner_ntests_failed(sr); + srunner_free(sr); + return (num_fail == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/utils
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/test/utils/test_utils.c
Added
@@ -0,0 +1,112 @@ +/* Copyright (C) 2021 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (test_stdstring.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <check.h> +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> + +#include <utils/md5.h> +#include <encodings/crc32.h> + +#define SUITE_NAME "hash" + +START_TEST (test_md5) +{ + uint8_t output[16]; + MD5_CTX ctx; + MD5_Init(&ctx); + MD5_Final(output, &ctx); + ck_assert(!memcmp( + "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e", + output, 16)); + MD5_Init(&ctx); + MD5_Update(&ctx, "The quick brown fox jumps over the lazy dog", 43); + MD5_Final(output, &ctx); + ck_assert(!memcmp( + "\x9e\x10\x7d\x9d\x37\x2b\xb6\x82\x6b\xd8\x1d\x35\x42\xa4\x19\xd6", + output, 16)); + MD5_Init(&ctx); + MD5_Update(&ctx, "The quick brown fox jumps over the lazy dog", 43); + MD5_Update(&ctx, "The quick brown fox jumps over the lazy dog", 43); + MD5_Update(&ctx, "The quick brown fox jumps over the lazy dog", 43); + MD5_Final(output, &ctx); + ck_assert(!memcmp( + "\x4e\x67\xdb\x4a\x7a\x40\x6b\x0c\xfd\xad\xd8\x87\xcd\xe7\x88\x8e", + output, 16)); +} +END_TEST + +START_TEST (test_crc32) +{ + char buf1[] = "retroarch"; + char buf2[] = "12345678"; + char buf3[] = "The quick brown fox jumps over the lazy dog"; + uint32_t test1 = encoding_crc32(0, (uint8_t*)buf1, strlen(buf1)); + uint32_t test2 = encoding_crc32(0, (uint8_t*)buf2, strlen(buf2)); + uint32_t test3 = encoding_crc32(0, (uint8_t*)buf3, strlen(buf3)); + ck_assert_uint_eq(0x3cae141a, test1); + ck_assert_uint_eq(0x9ae0daaf, test2); + ck_assert_uint_eq(0x414fa339, test3); +} +END_TEST + +START_TEST (test_crc32_file) +{ + char tmpfile[512]; + FILE *fd; + tmpnam(tmpfile); + fd = fopen(tmpfile, "wb"); + ck_assert(fd != NULL); + fwrite("12345678", 1, 8, fd); + fclose(fd); + + ck_assert_uint_eq(file_crc32(0, tmpfile), 0x9ae0daaf); + /* Error checking */ + ck_assert_uint_eq(file_crc32(0, "/this/path/should/not/exist"), 0); + ck_assert_uint_eq(file_crc32(0, NULL), 0); +} +END_TEST + +Suite *create_suite(void) +{ + Suite *s = suite_create(SUITE_NAME); + + TCase *tc_core = tcase_create("Core"); + tcase_add_test(tc_core, test_md5); + tcase_add_test(tc_core, test_crc32); + tcase_add_test(tc_core, test_crc32_file); + suite_add_tcase(s, tc_core); + + return s; +} + +int main(void) +{ + int num_fail; + Suite *s = create_suite(); + SRunner *sr = srunner_create(s); + srunner_run_all(sr, CK_NORMAL); + num_fail = srunner_ntests_failed(sr); + srunner_free(sr); + return (num_fail == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/time
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/time/rtime.c
Added
@@ -0,0 +1,81 @@ +/* Copyright (C) 2010-2020 The RetroArch team + * + * --------------------------------------------------------------------------------------- + * The following license statement only applies to this file (rtime.c). + * --------------------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, + * to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifdef HAVE_THREADS +#include <rthreads/rthreads.h> +#include <retro_assert.h> +#include <stdlib.h> +#endif + +#include <string.h> +#include <time/rtime.h> + +#ifdef HAVE_THREADS +/* TODO/FIXME - global */ +slock_t *rtime_localtime_lock = NULL; +#endif + +/* Must be called before using rtime_localtime() */ +void rtime_init(void) +{ + rtime_deinit(); +#ifdef HAVE_THREADS + if (!rtime_localtime_lock) + rtime_localtime_lock = slock_new(); + + retro_assert(rtime_localtime_lock); +#endif +} + +/* Must be called upon program termination */ +void rtime_deinit(void) +{ +#ifdef HAVE_THREADS + if (rtime_localtime_lock) + { + slock_free(rtime_localtime_lock); + rtime_localtime_lock = NULL; + } +#endif +} + +/* Thread-safe wrapper for localtime() */ +struct tm *rtime_localtime(const time_t *timep, struct tm *result) +{ + struct tm *time_info = NULL; + + /* Lock mutex */ +#ifdef HAVE_THREADS + slock_lock(rtime_localtime_lock); +#endif + + time_info = localtime(timep); + if (time_info) + memcpy(result, time_info, sizeof(struct tm)); + + /* Unlock mutex */ +#ifdef HAVE_THREADS + slock_unlock(rtime_localtime_lock); +#endif + + return result; +}
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/utils/debugbreak
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/utils/debugbreak/debugbreak.c
Added
@@ -0,0 +1,92 @@ +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif + +#if _WIN32_WINNT < 0x0501 +#error Must target Windows NT 5.0.1 or later for DebugBreakProcess +#endif + +#include <Windows.h> + +#include <stdio.h> +#include <stddef.h> +#include <stdlib.h> + +/* Compile with this line: + +gcc -o debugbreak -mno-cygwin -mthreads debugbreak.c + +*/ + +static char errbuffer[256]; + +static const char *geterrstr(DWORD errcode) +{ +size_t skip = 0; +DWORD chars; +chars = FormatMessage( +FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, +NULL, errcode, 0, errbuffer, sizeof(errbuffer)-1, 0); +errbuffer[sizeof(errbuffer)-1] = 0; +if (chars) { +while (errbuffer[chars-1] == '\r' || errbuffer[chars-1] == '\n') { +errbuffer[--chars] = 0; +} +} +if (chars && errbuffer[chars-1] == '.') errbuffer[--chars] = 0; +if (chars >= 2 && errbuffer[0] == '%' && errbuffer[1] >= '0' +&& errbuffer[1] <= '9') +{ +skip = 2; +while (chars > skip && errbuffer[skip] == ' ') ++skip; +if (chars >= skip+2 && errbuffer[skip] == 'i' +&& errbuffer[skip+1] == 's') +{ +skip += 2; +while (chars > skip && errbuffer[skip] == ' ') ++skip; +} +} +if (chars > skip && errbuffer[skip] >= 'A' && errbuffer[skip] <= 'Z') { +errbuffer[skip] += 'a' - 'A'; +} +return errbuffer+skip; +} + +int main(int argc, char *argv[]) +{ + HANDLE proc; + unsigned proc_id = 0; + BOOL break_result; + + if (argc != 2) { + printf("Usage: debugbreak process_id_number\n"); + return 1; + } + proc_id = (unsigned) strtol(argv[1], NULL, 0); + if (proc_id == 0) { + printf("Invalid process id %u\n", proc_id); + return 1; + } + proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)proc_id); + if (proc == NULL) { + DWORD lastError = GetLastError(); + printf("Failed to open process %u\n", proc_id); + printf("Error code is %lu (%s)\n", (unsigned long)lastError, + geterrstr(lastError)); + return 1; + } + break_result = DebugBreakProcess(proc); + if (!break_result) { + DWORD lastError = GetLastError(); + printf("Failed to debug break process %u\n", proc_id); + printf("Error code is %lu (%s)\n", (unsigned long)lastError, + geterrstr(lastError)); + CloseHandle(proc); + return 1; + } + printf("DebugBreak sent successfully to process id %u\n", proc_id); + CloseHandle(proc); + return 0; +} + +/* END debugbreak.c */
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/utils/md5.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/utils/md5.c
Changed
@@ -34,7 +34,7 @@ * optimizations are not included to reduce source code size and avoid * compile-time configuration. */ -#include <rhash.h> +#include <lrc_hash.h> #include <string.h> @@ -293,54 +293,3 @@ memset(ctx, 0, sizeof(*ctx)); } - -#ifdef MD5_BUILD_UTILITY - -#include <stdio.h> - -int main (int argc, char *argv[]) -{ - /* For each command line argument in turn: - ** filename -- prints message digest and name of file - */ - int i; - MD5_CTX ctx; - FILE* file; - size_t numread; - char buffer[16384]; - unsigned char result[16]; - - for (i = 1; i < argc; i++) - { - MD5_Init(&ctx); - file = fopen(argv[i], "rb"); - - if (file) - { - do - { - numread = fread((void*)buffer, 1, sizeof(buffer), file); - - if (numread) - { - MD5_Update(&ctx,(void*)buffer, numread); - } - } - while (numread); - - fclose(file); - MD5_Final(result, &ctx); - printf("%02x%02x%02x%02x%02x%02x%02x%02x" - "%02x%02x%02x%02x%02x%02x%02x%02x %s\n", - result[ 0 ], result[ 1 ], result[ 2 ], result[ 3 ], - result[ 4 ], result[ 5 ], result[ 6 ], result[ 7 ], - result[ 8 ], result[ 9 ], result[ 10 ], result[ 11 ], - result[ 12 ], result[ 13 ], result[ 14 ], result[ 15 ], - argv[i]); - } - } - - return 0; -} - -#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/utils/sha1.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/utils/sha1.c
Changed
@@ -277,7 +277,7 @@ /* * Initialize the first 16 words in the array W */ - for(t = 0; t < 16; t++) + for (t = 0; t < 16; t++) { W[t] = ((unsigned) context->Message_Block[t * 4]) << 24; W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16; @@ -285,10 +285,8 @@ W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]); } - for(t = 16; t < 80; t++) - { + for (t = 16; t < 80; t++) W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); - } A = context->Message_Digest[0]; B = context->Message_Digest[1]; @@ -296,7 +294,7 @@ D = context->Message_Digest[3]; E = context->Message_Digest[4]; - for(t = 0; t < 20; t++) + for (t = 0; t < 20; t++) { temp = SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0]; @@ -308,7 +306,7 @@ A = temp; } - for(t = 20; t < 40; t++) + for (t = 20; t < 40; t++) { temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; temp &= 0xFFFFFFFF; @@ -319,7 +317,7 @@ A = temp; } - for(t = 40; t < 60; t++) + for (t = 40; t < 60; t++) { temp = SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; @@ -331,7 +329,7 @@ A = temp; } - for(t = 60; t < 80; t++) + for (t = 60; t < 80; t++) { temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; temp &= 0xFFFFFFFF;
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/vfs/vfs_implementation.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/vfs/vfs_implementation.c
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2010-2019 The RetroArch team +/* Copyright (C) 2010-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (vfs_implementation.c). @@ -41,18 +41,16 @@ # include <xtl.h> # define INVALID_FILE_ATTRIBUTES -1 # else -# include <io.h> + # include <fcntl.h> # include <direct.h> # include <windows.h> # endif +# include <io.h> #else # if defined(PSP) # include <pspiofilemgr.h> # endif -# if defined(PS2) -# include <fileXio_rpc.h> -# endif # include <sys/types.h> # include <sys/stat.h> # if !defined(VITA) @@ -61,20 +59,12 @@ # include <unistd.h> # if defined(ORBIS) # include <sys/fcntl.h> +# include <sys/dirent.h> # include <orbisFile.h> # endif #endif -#ifdef __CELLOS_LV2__ -#include <cell/cell_fs.h> -#define O_RDONLY CELL_FS_O_RDONLY -#define O_WRONLY CELL_FS_O_WRONLY -#define O_CREAT CELL_FS_O_CREAT -#define O_TRUNC CELL_FS_O_TRUNC -#define O_RDWR CELL_FS_O_RDWR -#else #include <fcntl.h> -#endif /* TODO: Some things are duplicated but I'm really afraid of breaking other platforms by touching this */ #if defined(VITA) @@ -90,16 +80,13 @@ # if defined(PSP) # include <pspiofilemgr.h> # endif -# if defined(PS2) -# include <fileXio_rpc.h> -# endif # include <sys/types.h> # include <sys/stat.h> # include <dirent.h> # include <unistd.h> #endif -#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) || defined(PS2) +#if defined(__QNX__) || defined(PSP) #include <unistd.h> /* stat() is defined here */ #endif @@ -143,20 +130,18 @@ #include <pspkernel.h> #endif -#if defined(PS2) -#include <fileXio_rpc.h> -#include <fileXio.h> +#if defined(__PS3__) || defined(__PSL1GHT__) +#include <defines/ps3_defines.h> +#if defined(__PSL1GHT__) +#include <lv2/sysfs.h> #endif - -#if defined(__CELLOS_LV2__) -#include <cell/cell_fs.h> #endif #if defined(VITA) #define FIO_S_ISDIR SCE_S_ISDIR #endif -#if (defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)) || defined(__QNX__) || defined(PSP) +#if defined(__QNX__) || defined(PSP) #include <unistd.h> /* stat() is defined here */ #endif @@ -169,18 +154,12 @@ #endif -#if defined(_WIN32) && !defined(_XBOX) -#if !defined(_MSC_VER) || (defined(_MSC_VER) && _MSC_VER >= 1400) +#if defined(_WIN32) +#if defined(_MSC_VER) && _MSC_VER >= 1400 #define ATLEAST_VC2005 #endif #endif -#ifdef RARCH_INTERNAL -#ifndef VFS_FRONTEND -#define VFS_FRONTEND -#endif -#endif - #include <vfs/vfs_implementation.h> #include <libretro.h> #include <memmap.h> @@ -188,48 +167,45 @@ #include <compat/fopen_utf8.h> #include <file/file_path.h> -#define RFILE_HINT_UNBUFFERED (1 << 8) +#ifdef HAVE_CDROM +#include <vfs/vfs_implementation_cdrom.h> +#endif -#ifdef VFS_FRONTEND -struct retro_vfs_file_handle -#else -struct libretro_vfs_implementation_file +#if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0) >= 200112) || (defined(__POSIX_VISIBLE) && __POSIX_VISIBLE >= 200112) || (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112) || __USE_LARGEFILE || (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) +#ifndef HAVE_64BIT_OFFSETS +#define HAVE_64BIT_OFFSETS #endif -{ - int fd; - unsigned hints; - int64_t size; - char *buf; - FILE *fp; - char* orig_path; -#if defined(HAVE_MMAP) - uint64_t mappos; - uint64_t mapsize; - uint8_t *mapped; #endif -}; -int64_t retro_vfs_file_seek_internal(libretro_vfs_implementation_file *stream, int64_t offset, int whence) +#define RFILE_HINT_UNBUFFERED (1 << 8) + +int64_t retro_vfs_file_seek_internal( + libretro_vfs_implementation_file *stream, + int64_t offset, int whence) { if (!stream) - goto error; + return -1; if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) { -/* VC2005 and up have a special 64-bit fseek */ +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + return retro_vfs_file_seek_cdrom(stream, offset, whence); +#endif #ifdef ATLEAST_VC2005 + /* VC2005 and up have a special 64-bit fseek */ return _fseeki64(stream->fp, offset, whence); -#elif defined(__CELLOS_LV2__) || defined(_MSC_VER) && _MSC_VER <= 1310 - return fseek(stream->fp, (long)offset, whence); -#elif defined(PS2) - return fioLseek(fileno(stream->fp), (off_t)offset, whence); #elif defined(ORBIS) - int ret = orbisLseek(stream->fd, offset, whence); - if (ret < 0) - return -1; - return 0; -#else + { + int ret = orbisLseek(stream->fd, offset, whence); + if (ret < 0) + return -1; + return 0; + } +#elif defined(HAVE_64BIT_OFFSETS) return fseeko(stream->fp, (off_t)offset, whence); +#else + return fseek(stream->fp, (long)offset, whence); #endif } #ifdef HAVE_MMAP @@ -245,22 +221,22 @@ { case SEEK_SET: if (offset < 0) - goto error; + return -1; stream->mappos = offset; break; case SEEK_CUR: - if ((offset < 0 && stream->mappos + offset > stream->mappos) || + if ( (offset < 0 && stream->mappos + offset > stream->mappos) || (offset > 0 && stream->mappos + offset < stream->mappos)) - goto error; + return -1; stream->mappos += offset; break; case SEEK_END: if (stream->mapsize + offset < stream->mapsize) - goto error; + return -1; stream->mappos = stream->mapsize + offset; break; @@ -269,13 +245,10 @@ } #endif - if (lseek(stream->fd, offset, whence) < 0) - goto error; + if (lseek(stream->fd, (off_t)offset, whence) < 0) + return -1; return 0; - -error: - return -1; } /** @@ -288,28 +261,75 @@ * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ -libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, unsigned mode, unsigned hints) +libretro_vfs_implementation_file *retro_vfs_file_open_impl( + const char *path, unsigned mode, unsigned hints) { - int flags = 0; - const char *mode_str = NULL; - libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); - +#if defined(VFS_FRONTEND) || defined(HAVE_CDROM) + int path_len = (int)strlen(path); +#endif #ifdef VFS_FRONTEND const char *dumb_prefix = "vfsonly://"; - int dumb_prefix_len = (int)strlen(dumb_prefix); - int path_len = (int)strlen(path); - - if (path_len >= dumb_prefix_len) - if (!memcmp(path, dumb_prefix, dumb_prefix_len)) - path += strlen(dumb_prefix); + size_t dumb_prefix_siz = STRLEN_CONST("vfsonly://"); + int dumb_prefix_len = (int)dumb_prefix_siz; +#endif +#ifdef HAVE_CDROM + const char *cdrom_prefix = "cdrom://"; + size_t cdrom_prefix_siz = STRLEN_CONST("cdrom://"); + int cdrom_prefix_len = (int)cdrom_prefix_siz; #endif + int flags = 0; + const char *mode_str = NULL; + libretro_vfs_implementation_file *stream = + (libretro_vfs_implementation_file*) + malloc(sizeof(*stream)); if (!stream) return NULL; - (void)flags; + stream->fd = 0; + stream->hints = hints; + stream->size = 0; + stream->buf = NULL; + stream->fp = NULL; +#ifdef _WIN32 + stream->fh = 0; +#endif + stream->orig_path = NULL; + stream->mappos = 0; + stream->mapsize = 0; + stream->mapped = NULL; + stream->scheme = VFS_SCHEME_NONE; + +#ifdef VFS_FRONTEND + if (path_len >= dumb_prefix_len) + if (!memcmp(path, dumb_prefix, dumb_prefix_len)) + path += dumb_prefix_siz; +#endif + +#ifdef HAVE_CDROM + stream->cdrom.cue_buf = NULL; + stream->cdrom.cue_len = 0; + stream->cdrom.byte_pos = 0; + stream->cdrom.drive = 0; + stream->cdrom.cur_min = 0; + stream->cdrom.cur_sec = 0; + stream->cdrom.cur_frame = 0; + stream->cdrom.cur_track = 0; + stream->cdrom.cur_lba = 0; + stream->cdrom.last_frame_lba = 0; + stream->cdrom.last_frame[0] = '\0'; + stream->cdrom.last_frame_valid = false; + + if (path_len > cdrom_prefix_len) + { + if (!memcmp(path, cdrom_prefix, cdrom_prefix_len)) + { + path += cdrom_prefix_siz; + stream->scheme = VFS_SCHEME_CDROM; + } + } +#endif - stream->hints = hints; stream->orig_path = strdup(path); #ifdef HAVE_MMAP @@ -335,9 +355,7 @@ flags = O_WRONLY | O_CREAT | O_TRUNC; #if !defined(ORBIS) -#if defined(PS2) - flags |= FIO_S_IRUSR | FIO_S_IWUSR; -#elif !defined(_WIN32) +#if !defined(_WIN32) flags |= S_IRUSR | S_IWUSR; #else flags |= O_BINARY; @@ -349,9 +367,7 @@ mode_str = "w+b"; flags = O_RDWR | O_CREAT | O_TRUNC; #if !defined(ORBIS) -#if defined(PS2) - flags |= FIO_S_IRUSR | FIO_S_IWUSR; -#elif !defined(_WIN32) +#if !defined(_WIN32) flags |= S_IRUSR | S_IWUSR; #else flags |= O_BINARY; @@ -365,9 +381,7 @@ flags = O_RDWR; #if !defined(ORBIS) -#if defined(PS2) - flags |= FIO_S_IRUSR | FIO_S_IWUSR; -#elif !defined(_WIN32) +#if !defined(_WIN32) flags |= S_IRUSR | S_IWUSR; #else flags |= O_BINARY; @@ -383,32 +397,63 @@ { #ifdef ORBIS int fd = orbisOpen(path, flags, 0644); - if( fd < 0) + if (fd < 0) { stream->fd = -1; goto error; } - stream->fd = fd; + stream->fd = fd; #else - FILE *fp = (FILE*)fopen_utf8(path, mode_str); + FILE *fp; +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + { + retro_vfs_file_open_cdrom(stream, path, mode, hints); +#if defined(_WIN32) && !defined(_XBOX) + if (!stream->fh) + goto error; +#else + if (!stream->fp) + goto error; +#endif + } + else +#endif + { + fp = (FILE*)fopen_utf8(path, mode_str); - if (!fp) - goto error; + if (!fp) + goto error; + stream->fp = fp; + } /* Regarding setvbuf: * * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html * - * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and + * If the size argument is not zero but buf is NULL, + * a buffer of the given size will be allocated immediately, and * released on close. This is an extension to ANSI C. * - * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. + * Since C89 does not support specifying a NULL buffer + * with a non-zero size, we create and track our own buffer for it. */ - /* TODO: this is only useful for a few platforms, find which and add ifdef */ - stream->fp = fp; -#if !defined(PS2) && !defined(PSP) - stream->buf = (char*)calloc(1, 0x4000); - setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); + /* TODO: this is only useful for a few platforms, + * find which and add ifdef */ +#if defined(_3DS) + if (stream->scheme != VFS_SCHEME_CDROM) + { + stream->buf = (char*)calloc(1, 0x10000); + if (stream->fp) + setvbuf(stream->fp, stream->buf, _IOFBF, 0x10000); + } +#elif !defined(PSP) + if (stream->scheme != VFS_SCHEME_CDROM) + { + stream->buf = (char*)calloc(1, 0x4000); + if (stream->fp) + setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); + } #endif #endif } @@ -427,7 +472,7 @@ free(path_wide); #endif #else - stream->fd = open(path, flags, 0); + stream->fd = open(path, flags, 0); #endif if (stream->fd == -1) @@ -457,12 +502,26 @@ stream->size = orbisLseek(stream->fd, 0, SEEK_END); orbisLseek(stream->fd, 0, SEEK_SET); #else - retro_vfs_file_seek_internal(stream, 0, SEEK_SET); - retro_vfs_file_seek_internal(stream, 0, SEEK_END); +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + { + retro_vfs_file_seek_cdrom(stream, 0, SEEK_SET); + retro_vfs_file_seek_cdrom(stream, 0, SEEK_END); + + stream->size = retro_vfs_file_tell_impl(stream); + + retro_vfs_file_seek_cdrom(stream, 0, SEEK_SET); + } + else +#endif + { + retro_vfs_file_seek_internal(stream, 0, SEEK_SET); + retro_vfs_file_seek_internal(stream, 0, SEEK_END); - stream->size = retro_vfs_file_tell_impl(stream); + stream->size = retro_vfs_file_tell_impl(stream); - retro_vfs_file_seek_internal(stream, 0, SEEK_SET); + retro_vfs_file_seek_internal(stream, 0, SEEK_SET); + } #endif return stream; @@ -476,6 +535,14 @@ if (!stream) return -1; +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + { + retro_vfs_file_close_cdrom(stream); + goto end; + } +#endif + if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) { if (stream->fp) @@ -493,15 +560,22 @@ { #ifdef ORBIS orbisClose(stream->fd); - stream->fd=-1; + stream->fd = -1; #else close(stream->fd); #endif } +#ifdef HAVE_CDROM +end: + if (stream->cdrom.cue_buf) + free(stream->cdrom.cue_buf); +#endif if (stream->buf) free(stream->buf); + if (stream->orig_path) free(stream->orig_path); + free(stream); return 0; @@ -509,6 +583,10 @@ int retro_vfs_file_error_impl(libretro_vfs_implementation_file *stream) { +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + return retro_vfs_file_error_cdrom(stream); +#endif #ifdef ORBIS /* TODO/FIXME - implement this? */ return 0; @@ -519,9 +597,9 @@ int64_t retro_vfs_file_size_impl(libretro_vfs_implementation_file *stream) { - if (!stream) - return 0; - return stream->size; + if (stream) + return stream->size; + return 0; } int64_t retro_vfs_file_truncate_impl(libretro_vfs_implementation_file *stream, int64_t length) @@ -530,10 +608,10 @@ return -1; #ifdef _WIN32 - if(_chsize(_fileno(stream->fp), length) != 0) + if (_chsize(_fileno(stream->fp), length) != 0) return -1; #elif !defined(VITA) && !defined(PSP) && !defined(PS2) && !defined(ORBIS) && (!defined(SWITCH) || defined(HAVE_LIBNX)) - if(ftruncate(fileno(stream->fp), length) != 0) + if (ftruncate(fileno(stream->fp), (off_t)length) != 0) return -1; #endif @@ -547,15 +625,23 @@ if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) { +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + return retro_vfs_file_tell_cdrom(stream); +#endif #ifdef ORBIS - int64_t ret = orbisLseek(stream->fd, 0, SEEK_CUR); - if(ret < 0) - return -1; - return ret; + { + int64_t ret = orbisLseek(stream->fd, 0, SEEK_CUR); + if (ret < 0) + return -1; + return ret; + } #else -/* VC2005 and up have a special 64-bit ftell */ #ifdef ATLEAST_VC2005 + /* VC2005 and up have a special 64-bit ftell */ return _ftelli64(stream->fp); +#elif defined(HAVE_64BIT_OFFSETS) + return ftello(stream->fp); #else return ftell(stream->fp); #endif @@ -564,7 +650,8 @@ #ifdef HAVE_MMAP /* Need to check stream->mapped because this function * is called in filestream_open() */ - if (stream->mapped && stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS) + if (stream->mapped && stream->hints & + RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS) return stream->mappos; #endif if (lseek(stream->fd, 0, SEEK_CUR) < 0) @@ -597,13 +684,16 @@ void *s, uint64_t len) { if (!stream || !s) - goto error; + return -1; if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) { +#ifdef HAVE_CDROM + if (stream->scheme == VFS_SCHEME_CDROM) + return retro_vfs_file_read_cdrom(stream, s, len); +#endif #ifdef ORBIS - int64_t ret = orbisRead(stream->fd, s, (size_t)len); - if( ret < 0) + if (orbisRead(stream->fd, s, (size_t)len) < 0) return -1; return 0; #else @@ -614,7 +704,7 @@ if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS) { if (stream->mappos > stream->mapsize) - goto error; + return -1; if (stream->mappos + len > stream->mapsize) len = stream->mapsize - stream->mappos; @@ -627,35 +717,29 @@ #endif return read(stream->fd, s, (size_t)len); - -error: - return -1; } int64_t retro_vfs_file_write_impl(libretro_vfs_implementation_file *stream, const void *s, uint64_t len) { if (!stream) - goto error; + return -1; if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) { #ifdef ORBIS - int64_t ret = orbisWrite(stream->fd, s, (size_t)len); - if( ret < 0) + if (orbisWrite(stream->fd, s, (size_t)len) < 0) return -1; return 0; #else return fwrite(s, 1, (size_t)len, stream->fp); #endif } + #ifdef HAVE_MMAP if (stream->hints & RETRO_VFS_FILE_ACCESS_HINT_FREQUENT_ACCESS) - goto error; + return -1; #endif return write(stream->fd, s, (size_t)len); - -error: - return -1; } int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream) @@ -665,22 +749,22 @@ #ifdef ORBIS return 0; #else - return fflush(stream->fp)==0 ? 0 : -1; + return fflush(stream->fp) == 0 ? 0 : -1; #endif } int retro_vfs_file_remove_impl(const char *path) { +#if defined(_WIN32) && !defined(_XBOX) + /* Win32 (no Xbox) */ + +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 char *path_local = NULL; +#else wchar_t *path_wide = NULL; - +#endif if (!path || !*path) return -1; - - (void)path_local; - (void)path_wide; - -#if defined(_WIN32) && !defined(_XBOX) #if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 path_local = utf8_to_local_string_alloc(path); @@ -704,85 +788,84 @@ return 0; } #endif -#else -#ifdef ORBIS - /* stub for now */ + return -1; +#elif defined(ORBIS) + /* Orbis + * TODO/FIXME - stub for now */ return 0; #else if (remove(path) == 0) return 0; -#endif -#endif return -1; +#endif } int retro_vfs_file_rename_impl(const char *old_path, const char *new_path) { +#if defined(_WIN32) && !defined(_XBOX) + /* Win32 (no Xbox) */ + int ret = -1; +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 char *old_path_local = NULL; - char *new_path_local = NULL; +#else wchar_t *old_path_wide = NULL; - wchar_t *new_path_wide = NULL; +#endif if (!old_path || !*old_path || !new_path || !*new_path) return -1; - (void)old_path_local; - (void)new_path_local; - (void)old_path_wide; - (void)new_path_wide; - -#if defined(_WIN32) && !defined(_XBOX) #if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 old_path_local = utf8_to_local_string_alloc(old_path); - new_path_local = utf8_to_local_string_alloc(new_path); if (old_path_local) { + char *new_path_local = utf8_to_local_string_alloc(new_path); + if (new_path_local) { - int ret = rename(old_path_local, new_path_local); - free(old_path_local); + if (rename(old_path_local, new_path_local) == 0) + ret = 0; free(new_path_local); - return ret==0 ? 0 : -1; } free(old_path_local); } - - if (new_path_local) - free(new_path_local); #else old_path_wide = utf8_to_utf16_string_alloc(old_path); - new_path_wide = utf8_to_utf16_string_alloc(new_path); if (old_path_wide) { + wchar_t *new_path_wide = utf8_to_utf16_string_alloc(new_path); + if (new_path_wide) { - int ret = _wrename(old_path_wide, new_path_wide); - free(old_path_wide); + if (_wrename(old_path_wide, new_path_wide) == 0) + ret = 0; free(new_path_wide); - return ret==0 ? 0 : -1; } free(old_path_wide); } - - if (new_path_wide) - free(new_path_wide); #endif - return -1; -#else -#ifdef ORBIS - /* stub for now */ + return ret; + +#elif defined(ORBIS) + /* Orbis */ + /* TODO/FIXME - Stub for now */ + if (!old_path || !*old_path || !new_path || !*new_path) + return -1; return 0; + #else - return rename(old_path, new_path)==0 ? 0 : -1; -#endif + /* Every other platform */ + if (!old_path || !*old_path || !new_path || !*new_path) + return -1; + return rename(old_path, new_path) == 0 ? 0 : -1; #endif } -const char *retro_vfs_file_get_path_impl(libretro_vfs_implementation_file *stream) +const char *retro_vfs_file_get_path_impl( + libretro_vfs_implementation_file *stream) { /* should never happen, do something noisy so caller can be fixed */ if (!stream) @@ -792,64 +875,85 @@ int retro_vfs_stat_impl(const char *path, int32_t *size) { - bool is_dir, is_character_special; -#if defined(ORBIS) - return 0; /* for now */ -#endif + bool is_dir = false; + bool is_character_special = false; #if defined(VITA) || defined(PSP) + /* Vita / PSP */ SceIoStat buf; - char *tmp = strdup(path); - size_t len = strlen(tmp); - if (tmp[len-1] == '/') - tmp[len-1] = '\0'; + int dir_ret; + char *tmp = NULL; + size_t len = 0; - if (sceIoGetstat(tmp, &buf) < 0) - { - free(tmp); + if (!path || !*path) return 0; - } - free(tmp); -#elif defined(PS2) - iox_stat_t buf; - char *tmp = strdup(path); - size_t len = strlen(tmp); + + tmp = strdup(path); + len = strlen(tmp); if (tmp[len-1] == '/') tmp[len-1] = '\0'; - if (fileXioGetStat(tmp, &buf) < 0) - { - free(tmp); - return 0; - } + dir_ret = sceIoGetstat(tmp, &buf); free(tmp); -#elif defined(__CELLOS_LV2__) - CellFsStat buf; - if (cellFsStat(path, &buf) < 0) - return 0; + if (dir_ret < 0) + return 0; + + if (size) + *size = (int32_t)buf.st_size; + + is_dir = FIO_S_ISDIR(buf.st_mode); +#elif defined(ORBIS) + /* Orbis */ + int dir_ret = 0; + + if (!path || !*path) + return 0; + + if (size) + *size = (int32_t)buf.st_size; + + dir_ret = orbisDopen(path); + is_dir = dir_ret > 0; + orbisDclose(dir_ret); + + is_character_special = S_ISCHR(buf.st_mode); +#elif defined(__PSL1GHT__) || defined(__PS3__) + /* Lowlevel Lv2 */ + sysFSStat buf; + + if (!path || !*path) + return 0; + if (sysFsStat(path, &buf) < 0) + return 0; + + if (size) + *size = (int32_t)buf.st_size; + + is_dir = ((buf.st_mode & S_IFMT) == S_IFDIR); #elif defined(_WIN32) + /* Windows */ DWORD file_info; struct _stat buf; - char *path_local = NULL; - wchar_t *path_wide = NULL; +#if defined(LEGACY_WIN32) + char *path_local = NULL; +#else + wchar_t *path_wide = NULL; +#endif if (!path || !*path) return 0; - (void)path_wide; - (void)path_local; - (void)file_info; - #if defined(LEGACY_WIN32) - path_local = utf8_to_local_string_alloc(path); - file_info = GetFileAttributes(path_local); + path_local = utf8_to_local_string_alloc(path); + file_info = GetFileAttributes(path_local); - _stat(path_local, &buf); + if (!string_is_empty(path_local)) + _stat(path_local, &buf); if (path_local) - free(path_local); + free(path_local); #else - path_wide = utf8_to_utf16_string_alloc(path); - file_info = GetFileAttributesW(path_wide); + path_wide = utf8_to_utf16_string_alloc(path); + file_info = GetFileAttributesW(path_wide); _wstat(path_wide, &buf); @@ -859,76 +963,116 @@ if (file_info == INVALID_FILE_ATTRIBUTES) return 0; -#else - struct stat buf; - if (stat(path, &buf) < 0) - return 0; -#endif if (size) -#if defined(PS2) - *size = (int32_t)buf.size; -#else *size = (int32_t)buf.st_size; -#endif -#if defined(VITA) || defined(PSP) - is_dir = FIO_S_ISDIR(buf.st_mode); -#elif defined(PS2) - is_dir = FIO_S_ISDIR(buf.mode); -#elif defined(__CELLOS_LV2__) - is_dir = ((buf.st_mode & S_IFMT) == S_IFDIR); -#elif defined(_WIN32) is_dir = (file_info & FILE_ATTRIBUTE_DIRECTORY); -#else - is_dir = S_ISDIR(buf.st_mode); -#endif -#if defined(VITA) || defined(PSP) || defined(PS2) || defined(__CELLOS_LV2__) || defined(_WIN32) - is_character_special = false; +#elif defined(GEKKO) + /* On GEKKO platforms, paths cannot have + * trailing slashes - we must therefore + * remove them */ + char *path_buf = NULL; + int stat_ret = -1; + struct stat stat_buf; + size_t len; + + if (string_is_empty(path)) + return 0; + + path_buf = strdup(path); + if (!path_buf) + return 0; + + len = strlen(path_buf); + if (len > 0) + if (path_buf[len - 1] == '/') + path_buf[len - 1] = '\0'; + + stat_ret = stat(path_buf, &stat_buf); + free(path_buf); + + if (stat_ret < 0) + return 0; + + if (size) + *size = (int32_t)stat_buf.st_size; + + is_dir = S_ISDIR(stat_buf.st_mode); + is_character_special = S_ISCHR(stat_buf.st_mode); + #else + /* Every other platform */ + struct stat buf; + + if (!path || !*path) + return 0; + if (stat(path, &buf) < 0) + return 0; + + if (size) + *size = (int32_t)buf.st_size; + + is_dir = S_ISDIR(buf.st_mode); is_character_special = S_ISCHR(buf.st_mode); #endif - return RETRO_VFS_STAT_IS_VALID | (is_dir ? RETRO_VFS_STAT_IS_DIRECTORY : 0) | (is_character_special ? RETRO_VFS_STAT_IS_CHARACTER_SPECIAL : 0); } -static bool path_mkdir_error(int ret) -{ #if defined(VITA) - return (ret == SCE_ERROR_ERRNO_EEXIST); +#define path_mkdir_error(ret) (((ret) == SCE_ERROR_ERRNO_EEXIST)) #elif defined(PSP) || defined(PS2) || defined(_3DS) || defined(WIIU) || defined(SWITCH) || defined(ORBIS) - return (ret == -1); +#define path_mkdir_error(ret) ((ret) == -1) #else - return (ret < 0 && errno == EEXIST); +#define path_mkdir_error(ret) ((ret) < 0 && errno == EEXIST) #endif -} int retro_vfs_mkdir_impl(const char *dir) { #if defined(_WIN32) #ifdef LEGACY_WIN32 - int ret = _mkdir(dir); + int ret = _mkdir(dir); #else - wchar_t *dirW = utf8_to_utf16_string_alloc(dir); - int ret = -1; + wchar_t *dir_w = utf8_to_utf16_string_alloc(dir); + int ret = -1; - if (dirW) + if (dir_w) { - ret = _wmkdir(dirW); - free(dirW); + ret = _wmkdir(dir_w); + free(dir_w); } #endif #elif defined(IOS) int ret = mkdir(dir, 0755); #elif defined(VITA) || defined(PSP) int ret = sceIoMkdir(dir, 0777); -#elif defined(PS2) - int ret =fileXioMkdir(dir, 0777); #elif defined(ORBIS) - int ret =orbisMkdir(dir, 0755); + int ret = orbisMkdir(dir, 0755); #elif defined(__QNX__) int ret = mkdir(dir, 0777); +#elif defined(GEKKO) + /* On GEKKO platforms, mkdir() fails if + * the path has a trailing slash. We must + * therefore remove it. */ + int ret = -1; + if (!string_is_empty(dir)) + { + char *dir_buf = strdup(dir); + + if (dir_buf) + { + size_t len = strlen(dir_buf); + + if (len > 0) + if (dir_buf[len - 1] == '/') + dir_buf[len - 1] = '\0'; + + ret = mkdir(dir_buf, 0750); + + free(dir_buf); + } + } #else int ret = mkdir(dir, 0750); #endif @@ -957,13 +1101,10 @@ #elif defined(VITA) || defined(PSP) SceUID directory; SceIoDirent entry; -#elif defined(PS2) - int directory; - iox_dirent_t entry; -#elif defined(__CELLOS_LV2__) - CellFsErrno error; +#elif defined(__PSL1GHT__) || defined(__PS3__) + int error; int directory; - CellFsDirent entry; + sysFSDirent entry; #elif defined(ORBIS) int directory; struct dirent entry; @@ -977,27 +1118,32 @@ { #if defined(_WIN32) return (rdir->directory == INVALID_HANDLE_VALUE); -#elif defined(VITA) || defined(PSP) || defined(PS2) || defined(ORBIS) +#elif defined(VITA) || defined(PSP) || defined(ORBIS) return (rdir->directory < 0); -#elif defined(__CELLOS_LV2__) - return (rdir->error != CELL_FS_SUCCEEDED); +#elif defined(__PSL1GHT__) || defined(__PS3__) + return (rdir->error != FS_SUCCEEDED); #else return !(rdir->directory); #endif } -libretro_vfs_implementation_dir *retro_vfs_opendir_impl(const char *name, bool include_hidden) +libretro_vfs_implementation_dir *retro_vfs_opendir_impl( + const char *name, bool include_hidden) { #if defined(_WIN32) + unsigned path_len; char path_buf[1024]; + size_t copied = 0; +#if defined(LEGACY_WIN32) char *path_local = NULL; +#else wchar_t *path_wide = NULL; - unsigned path_len; +#endif #endif libretro_vfs_implementation_dir *rdir; /*Reject null or empty string paths*/ - if (!name||(*name==0)) + if (!name || (*name == 0)) return NULL; /*Allocate RDIR struct. Tidied later with retro_closedir*/ @@ -1008,46 +1154,44 @@ rdir->orig_path = strdup(name); #if defined(_WIN32) - (void)path_wide; - (void)path_local; + path_buf[0] = '\0'; + path_len = strlen(name); - path_buf[0] = '\0'; - path_len = strlen(name); + copied = strlcpy(path_buf, name, sizeof(path_buf)); /* Non-NT platforms don't like extra slashes in the path */ - if (name[path_len - 1] == '\\') - snprintf(path_buf, sizeof(path_buf), "%s*", name); - else - snprintf(path_buf, sizeof(path_buf), "%s\\*", name); + if (name[path_len - 1] != '\\') + path_buf[copied++] = '\\'; + + path_buf[copied] = '*'; + path_buf[copied+1] = '\0'; #if defined(LEGACY_WIN32) - path_local = utf8_to_local_string_alloc(path_buf); - rdir->directory = FindFirstFile(path_local, &rdir->entry); + path_local = utf8_to_local_string_alloc(path_buf); + rdir->directory = FindFirstFile(path_local, &rdir->entry); if (path_local) free(path_local); #else - path_wide = utf8_to_utf16_string_alloc(path_buf); - rdir->directory = FindFirstFileW(path_wide, &rdir->entry); + path_wide = utf8_to_utf16_string_alloc(path_buf); + rdir->directory = FindFirstFileW(path_wide, &rdir->entry); if (path_wide) free(path_wide); #endif #elif defined(VITA) || defined(PSP) - rdir->directory = sceIoDopen(name); -#elif defined(PS2) - rdir->directory = fileXioDopen(name); + rdir->directory = sceIoDopen(name); #elif defined(_3DS) - rdir->directory = !string_is_empty(name) ? opendir(name) : NULL; - rdir->entry = NULL; -#elif defined(__CELLOS_LV2__) - rdir->error = cellFsOpendir(name, &rdir->directory); + rdir->directory = !string_is_empty(name) ? opendir(name) : NULL; + rdir->entry = NULL; +#elif defined(__PSL1GHT__) || defined(__PS3__) + rdir->error = sysFsOpendir(name, &rdir->directory); #elif defined(ORBIS) - rdir->directory = orbisDopen(name); + rdir->directory = orbisDopen(name); #else - rdir->directory = opendir(name); - rdir->entry = NULL; + rdir->directory = opendir(name); + rdir->entry = NULL; #endif #ifdef _WIN32 @@ -1067,7 +1211,7 @@ bool retro_vfs_readdir_impl(libretro_vfs_implementation_dir *rdir) { #if defined(_WIN32) - if(rdir->next) + if (rdir->next) #if defined(LEGACY_WIN32) return (FindNextFile(rdir->directory, &rdir->entry) != 0); #else @@ -1078,14 +1222,9 @@ return (rdir->directory != INVALID_HANDLE_VALUE); #elif defined(VITA) || defined(PSP) return (sceIoDread(rdir->directory, &rdir->entry) > 0); -#elif defined(PS2) - iox_dirent_t record; - int ret = fileXioDread(rdir->directory, &record); - rdir->entry = record; - return ( ret > 0); -#elif defined(__CELLOS_LV2__) +#elif defined(__PSL1GHT__) || defined(__PS3__) uint64_t nread; - rdir->error = cellFsReaddir(rdir->directory, &rdir->entry, &nread); + rdir->error = sysFsReaddir(rdir->directory, &rdir->entry, &nread); return (nread != 0); #elif defined(ORBIS) return (orbisDread(rdir->directory, &rdir->entry) > 0); @@ -1098,27 +1237,20 @@ { #if defined(_WIN32) #if defined(LEGACY_WIN32) - char *name_local = local_to_utf8_string_alloc(rdir->entry.cFileName); - memset(rdir->entry.cFileName, 0, sizeof(rdir->entry.cFileName)); - strlcpy(rdir->entry.cFileName, name_local, sizeof(rdir->entry.cFileName)); - - if (name_local) - free(name_local); + char *name = local_to_utf8_string_alloc(rdir->entry.cFileName); #else - char *name = utf16_to_utf8_string_alloc(rdir->entry.cFileName); + char *name = utf16_to_utf8_string_alloc(rdir->entry.cFileName); +#endif memset(rdir->entry.cFileName, 0, sizeof(rdir->entry.cFileName)); strlcpy((char*)rdir->entry.cFileName, name, sizeof(rdir->entry.cFileName)); - if (name) free(name); -#endif return (char*)rdir->entry.cFileName; -#elif defined(VITA) || defined(PSP) || defined(__CELLOS_LV2__) || defined(ORBIS) +#elif defined(VITA) || defined(PSP) || defined(ORBIS) || defined(__PSL1GHT__) || defined(__PS3__) return rdir->entry.d_name; -#elif defined(PS2) - return rdir->entry.name; #else - + if (!rdir || !rdir->entry) + return NULL; return rdir->entry->d_name; #endif } @@ -1129,21 +1261,18 @@ const WIN32_FIND_DATA *entry = (const WIN32_FIND_DATA*)&rdir->entry; return entry->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; #elif defined(PSP) || defined(VITA) - const SceIoDirent *entry = (const SceIoDirent*)&rdir->entry; + const SceIoDirent *entry = (const SceIoDirent*)&rdir->entry; #if defined(PSP) return (entry->d_stat.st_attr & FIO_SO_IFDIR) == FIO_SO_IFDIR; #elif defined(VITA) return SCE_S_ISDIR(entry->d_stat.st_mode); #endif -#elif defined(PS2) - const iox_dirent_t *entry = (const iox_dirent_t*)&rdir->entry; - return FIO_S_ISDIR(entry->stat.mode); -#elif defined(__CELLOS_LV2__) - CellFsDirent *entry = (CellFsDirent*)&rdir->entry; - return (entry->d_type == CELL_FS_TYPE_DIRECTORY); +#elif defined(__PSL1GHT__) || defined(__PS3__) + sysFSDirent *entry = (sysFSDirent*)&rdir->entry; + return (entry->d_type == FS_TYPE_DIR); #elif defined(ORBIS) - const struct dirent *entry = &rdir->entry; - if (entry->d_type==DT_DIR) + const struct dirent *entry = &rdir->entry; + if (entry->d_type == DT_DIR) return true; if (!(entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK)) return false; @@ -1177,10 +1306,8 @@ FindClose(rdir->directory); #elif defined(VITA) || defined(PSP) sceIoDclose(rdir->directory); -#elif defined(PS2) - fileXioDclose(rdir->directory); -#elif defined(__CELLOS_LV2__) - rdir->error = cellFsClosedir(rdir->directory); +#elif defined(__PSL1GHT__) || defined(__PS3__) + rdir->error = sysFsClosedir(rdir->directory); #elif defined(ORBIS) orbisDclose(rdir->directory); #else
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/vfs/vfs_implementation_cdrom.c
Added
@@ -0,0 +1,495 @@ +/* Copyright (C) 2010-2020 The RetroArch team +* +* --------------------------------------------------------------------------------------- +* The following license statement only applies to this file (vfs_implementation_cdrom.c). +* --------------------------------------------------------------------------------------- +* +* Permission is hereby granted, free of charge, +* to any person obtaining a copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation the rights to +* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include <vfs/vfs_implementation.h> +#include <file/file_path.h> +#include <compat/fopen_utf8.h> +#include <string/stdstring.h> +#include <cdrom/cdrom.h> + +#if defined(_WIN32) && !defined(_XBOX) +#include <windows.h> +#endif + +/* TODO/FIXME - static global variable */ +static cdrom_toc_t vfs_cdrom_toc = {0}; + +const cdrom_toc_t* retro_vfs_file_get_cdrom_toc(void) +{ + return &vfs_cdrom_toc; +} + +int64_t retro_vfs_file_seek_cdrom( + libretro_vfs_implementation_file *stream, + int64_t offset, int whence) +{ + const char *ext = path_get_extension(stream->orig_path); + + if (string_is_equal_noncase(ext, "cue")) + { + switch (whence) + { + case SEEK_SET: + stream->cdrom.byte_pos = offset; + break; + case SEEK_CUR: + stream->cdrom.byte_pos += offset; + break; + case SEEK_END: + stream->cdrom.byte_pos = (stream->cdrom.cue_len - 1) + offset; + break; + } + +#ifdef CDROM_DEBUG + printf("[CDROM] Seek: Path %s Offset %" PRIu64 " is now at %" PRIu64 "\n", + stream->orig_path, + offset, + stream->cdrom.byte_pos); + fflush(stdout); +#endif + } + else if (string_is_equal_noncase(ext, "bin")) + { + int lba = (offset / 2352); + unsigned char min = 0; + unsigned char sec = 0; + unsigned char frame = 0; +#ifdef CDROM_DEBUG + const char *seek_type = "SEEK_SET"; +#endif + + switch (whence) + { + case SEEK_CUR: + { + unsigned new_lba; +#ifdef CDROM_DEBUG + seek_type = "SEEK_CUR"; +#endif + stream->cdrom.byte_pos += offset; + new_lba = vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].lba + (stream->cdrom.byte_pos / 2352); + + cdrom_lba_to_msf(new_lba, &min, &sec, &frame); + } + break; + case SEEK_END: + { + ssize_t pregap_lba_len = (vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].audio + ? 0 + : (vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].lba - vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].lba_start)); + ssize_t lba_len = vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].track_size - pregap_lba_len; +#ifdef CDROM_DEBUG + seek_type = "SEEK_END"; +#endif + + cdrom_lba_to_msf(lba_len + lba, &min, &sec, &frame); + stream->cdrom.byte_pos = lba_len * 2352; + } + break; + case SEEK_SET: + default: + { +#ifdef CDROM_DEBUG + seek_type = "SEEK_SET"; +#endif + stream->cdrom.byte_pos = offset; + cdrom_lba_to_msf(vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].lba + (stream->cdrom.byte_pos / 2352), &min, &sec, &frame); + } + break; + } + + stream->cdrom.cur_min = min; + stream->cdrom.cur_sec = sec; + stream->cdrom.cur_frame = frame; + stream->cdrom.cur_lba = cdrom_msf_to_lba(min, sec, frame); + +#ifdef CDROM_DEBUG + printf( + "[CDROM] Seek %s: Path %s Offset %" PRIu64 " is now at %" PRIu64 " (MSF %02u:%02u:%02u) (LBA %u)...\n", + seek_type, + stream->orig_path, + offset, + stream->cdrom.byte_pos, + (unsigned)stream->cdrom.cur_min, + (unsigned)stream->cdrom.cur_sec, + (unsigned)stream->cdrom.cur_frame, + stream->cdrom.cur_lba); + fflush(stdout); +#endif + } + else + return -1; + + return 0; +} + +void retro_vfs_file_open_cdrom( + libretro_vfs_implementation_file *stream, + const char *path, unsigned mode, unsigned hints) +{ +#if defined(__linux__) && !defined(ANDROID) + char cdrom_path[] = "/dev/sg1"; + size_t path_len = strlen(path); + const char *ext = path_get_extension(path); + + stream->cdrom.cur_track = 1; + + if ( !string_is_equal_noncase(ext, "cue") + && !string_is_equal_noncase(ext, "bin")) + return; + + if (path_len >= STRLEN_CONST("drive1-track01.bin")) + { + if (!memcmp(path, "drive", STRLEN_CONST("drive"))) + { + if (!memcmp(path + 6, "-track", STRLEN_CONST("-track"))) + { + if (sscanf(path + 12, "%02u", (unsigned*)&stream->cdrom.cur_track)) + { +#ifdef CDROM_DEBUG + printf("[CDROM] Opening track %d\n", stream->cdrom.cur_track); + fflush(stdout); +#endif + } + } + } + } + + if (path_len >= STRLEN_CONST("drive1.cue")) + { + if (!memcmp(path, "drive", STRLEN_CONST("drive"))) + { + if (path[5] >= '0' && path[5] <= '9') + { + cdrom_path[7] = path[5]; + stream->cdrom.drive = path[5]; + vfs_cdrom_toc.drive = stream->cdrom.drive; + } + } + } + +#ifdef CDROM_DEBUG + printf("[CDROM] Open: Path %s URI %s\n", cdrom_path, path); + fflush(stdout); +#endif + stream->fp = (FILE*)fopen_utf8(cdrom_path, "r+b"); + + if (!stream->fp) + return; + + if (string_is_equal_noncase(ext, "cue")) + { + if (stream->cdrom.cue_buf) + { + free(stream->cdrom.cue_buf); + stream->cdrom.cue_buf = NULL; + } + + cdrom_write_cue(stream, + &stream->cdrom.cue_buf, + &stream->cdrom.cue_len, + stream->cdrom.drive, + &vfs_cdrom_toc.num_tracks, + &vfs_cdrom_toc); + cdrom_get_timeouts(stream, &vfs_cdrom_toc.timeouts); + +#ifdef CDROM_DEBUG + if (string_is_empty(stream->cdrom.cue_buf)) + { + printf("[CDROM] Error writing cue sheet.\n"); + fflush(stdout); + } + else + { + printf("[CDROM] CUE Sheet:\n%s\n", stream->cdrom.cue_buf); + fflush(stdout); + } +#endif + } +#endif +#if defined(_WIN32) && !defined(_XBOX) + char cdrom_path[] = "\\\\.\\D:"; + size_t path_len = strlen(path); + const char *ext = path_get_extension(path); + + if ( !string_is_equal_noncase(ext, "cue") + && !string_is_equal_noncase(ext, "bin")) + return; + + if (path_len >= STRLEN_CONST("d:/drive-track01.bin")) + { + if (!memcmp(path + 1, ":/drive-track", STRLEN_CONST(":/drive-track"))) + { + if (sscanf(path + 14, "%02u", (unsigned*)&stream->cdrom.cur_track)) + { +#ifdef CDROM_DEBUG + printf("[CDROM] Opening track %d\n", stream->cdrom.cur_track); + fflush(stdout); +#endif + } + } + } + + if (path_len >= STRLEN_CONST("d:/drive.cue")) + { + if (!memcmp(path + 1, ":/drive", STRLEN_CONST(":/drive"))) + { + if ((path[0] >= 'A' && path[0] <= 'Z') || (path[0] >= 'a' && path[0] <= 'z')) + { + cdrom_path[4] = path[0]; + stream->cdrom.drive = path[0]; + vfs_cdrom_toc.drive = stream->cdrom.drive; + } + } + } + +#ifdef CDROM_DEBUG + printf("[CDROM] Open: Path %s URI %s\n", cdrom_path, path); + fflush(stdout); +#endif + stream->fh = CreateFile(cdrom_path, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (stream->fh == INVALID_HANDLE_VALUE) + return; + + if (string_is_equal_noncase(ext, "cue")) + { + if (stream->cdrom.cue_buf) + { + free(stream->cdrom.cue_buf); + stream->cdrom.cue_buf = NULL; + } + + cdrom_write_cue(stream, + &stream->cdrom.cue_buf, + &stream->cdrom.cue_len, + stream->cdrom.drive, + &vfs_cdrom_toc.num_tracks, + &vfs_cdrom_toc); + cdrom_get_timeouts(stream, + &vfs_cdrom_toc.timeouts); + +#ifdef CDROM_DEBUG + if (string_is_empty(stream->cdrom.cue_buf)) + { + printf("[CDROM] Error writing cue sheet.\n"); + fflush(stdout); + } + else + { + printf("[CDROM] CUE Sheet:\n%s\n", stream->cdrom.cue_buf); + fflush(stdout); + } +#endif + } +#endif + if (vfs_cdrom_toc.num_tracks > 1 && stream->cdrom.cur_track) + { + stream->cdrom.cur_min = vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].min; + stream->cdrom.cur_sec = vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].sec; + stream->cdrom.cur_frame = vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].frame; + stream->cdrom.cur_lba = cdrom_msf_to_lba(stream->cdrom.cur_min, stream->cdrom.cur_sec, stream->cdrom.cur_frame); + } + else + { + stream->cdrom.cur_min = vfs_cdrom_toc.track[0].min; + stream->cdrom.cur_sec = vfs_cdrom_toc.track[0].sec; + stream->cdrom.cur_frame = vfs_cdrom_toc.track[0].frame; + stream->cdrom.cur_lba = cdrom_msf_to_lba(stream->cdrom.cur_min, stream->cdrom.cur_sec, stream->cdrom.cur_frame); + } +} + +int retro_vfs_file_close_cdrom(libretro_vfs_implementation_file *stream) +{ +#ifdef CDROM_DEBUG + printf("[CDROM] Close: Path %s\n", stream->orig_path); + fflush(stdout); +#endif + +#if defined(_WIN32) && !defined(_XBOX) + if (!stream->fh || !CloseHandle(stream->fh)) + return -1; +#else + if (!stream->fp || fclose(stream->fp)) + return -1; +#endif + + return 0; +} + +int64_t retro_vfs_file_tell_cdrom(libretro_vfs_implementation_file *stream) +{ + const char *ext = NULL; + if (!stream) + return -1; + + ext = path_get_extension(stream->orig_path); + + if (string_is_equal_noncase(ext, "cue")) + { +#ifdef CDROM_DEBUG + printf("[CDROM] (cue) Tell: Path %s Position %" PRIu64 "\n", stream->orig_path, stream->cdrom.byte_pos); + fflush(stdout); +#endif + return stream->cdrom.byte_pos; + } + else if (string_is_equal_noncase(ext, "bin")) + { +#ifdef CDROM_DEBUG + printf("[CDROM] (bin) Tell: Path %s Position %" PRId64 "\n", stream->orig_path, stream->cdrom.byte_pos); + fflush(stdout); +#endif + return stream->cdrom.byte_pos; + } + + return -1; +} + +int64_t retro_vfs_file_read_cdrom(libretro_vfs_implementation_file *stream, + void *s, uint64_t len) +{ + int rv; + const char *ext = path_get_extension(stream->orig_path); + + if (string_is_equal_noncase(ext, "cue")) + { + if ((int64_t)len >= (int64_t)stream->cdrom.cue_len + - stream->cdrom.byte_pos) + len = stream->cdrom.cue_len - stream->cdrom.byte_pos - 1; +#ifdef CDROM_DEBUG + printf( + "[CDROM] Read: Reading %" PRIu64 " bytes from cuesheet starting at %" PRIu64 "...\n", + len, + stream->cdrom.byte_pos); + fflush(stdout); +#endif + memcpy(s, stream->cdrom.cue_buf + stream->cdrom.byte_pos, len); + stream->cdrom.byte_pos += len; + + return len; + } + else if (string_is_equal_noncase(ext, "bin")) + { + unsigned char min = 0; + unsigned char sec = 0; + unsigned char frame = 0; + unsigned char rmin = 0; + unsigned char rsec = 0; + unsigned char rframe = 0; + size_t skip = stream->cdrom.byte_pos % 2352; + + if (stream->cdrom.byte_pos >= + vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].track_bytes) + return 0; + + if (stream->cdrom.byte_pos + len > + vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].track_bytes) + len -= (stream->cdrom.byte_pos + len) + - vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].track_bytes; + + cdrom_lba_to_msf(stream->cdrom.cur_lba, &min, &sec, &frame); + cdrom_lba_to_msf(stream->cdrom.cur_lba + - vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].lba, + &rmin, &rsec, &rframe); + +#ifdef CDROM_DEBUG + printf( + "[CDROM] Read: Reading %" PRIu64 " bytes from %s starting at byte offset %" PRIu64 " (rMSF %02u:%02u:%02u aMSF %02u:%02u:%02u) (LBA %u) skip %" PRIu64 "...\n", + len, + stream->orig_path, + stream->cdrom.byte_pos, + (unsigned)rmin, + (unsigned)rsec, + (unsigned)rframe, + (unsigned)min, + (unsigned)sec, + (unsigned)frame, + stream->cdrom.cur_lba, + skip); + fflush(stdout); +#endif + +#if 1 + rv = cdrom_read(stream, &vfs_cdrom_toc.timeouts, min, sec, + frame, s, (size_t)len, skip); +#else + rv = cdrom_read_lba(stream, stream->cdrom.cur_lba, s, + (size_t)len, skip); +#endif + + if (rv) + { +#ifdef CDROM_DEBUG + printf("[CDROM] Failed to read %" PRIu64 " bytes from CD.\n", len); + fflush(stdout); +#endif + return 0; + } + + stream->cdrom.byte_pos += len; + stream->cdrom.cur_lba = + vfs_cdrom_toc.track[stream->cdrom.cur_track - 1].lba + + (stream->cdrom.byte_pos / 2352); + + cdrom_lba_to_msf(stream->cdrom.cur_lba, + &stream->cdrom.cur_min, + &stream->cdrom.cur_sec, + &stream->cdrom.cur_frame); + +#ifdef CDROM_DEBUG + printf( + "[CDROM] read %" PRIu64 " bytes, position is now: %" PRIu64 " (MSF %02u:%02u:%02u) (LBA %u)\n", + len, + stream->cdrom.byte_pos, + (unsigned)stream->cdrom.cur_min, + (unsigned)stream->cdrom.cur_sec, + (unsigned)stream->cdrom.cur_frame, + cdrom_msf_to_lba( + stream->cdrom.cur_min, + stream->cdrom.cur_sec, + stream->cdrom.cur_frame) + ); + fflush(stdout); +#endif + + return len; + } + + return 0; +} + +int retro_vfs_file_error_cdrom(libretro_vfs_implementation_file *stream) +{ + return 0; +} + +const vfs_cdrom_t* retro_vfs_file_get_cdrom_position( + const libretro_vfs_implementation_file *stream) +{ + return &stream->cdrom; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-common/vfs/vfs_implementation_uwp.cpp -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/vfs/vfs_implementation_uwp.cpp
Changed
@@ -1,4 +1,4 @@ -/* Copyright (C) 2018-2019 The RetroArch team +/* Copyright (C) 2018-2020 The RetroArch team * * --------------------------------------------------------------------------------------- * The following license statement only applies to this file (vfs_implementation_uwp.cpp). @@ -20,6 +20,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include <retro_environment.h> + #include <ppl.h> #include <ppltasks.h> #include <stdio.h> @@ -42,223 +44,272 @@ #endif #endif +#include <vfs/vfs.h> #include <vfs/vfs_implementation.h> #include <libretro.h> #include <encodings/utf.h> #include <retro_miscellaneous.h> #include <file/file_path.h> #include <retro_assert.h> -#include <verbosity.h> #include <string/stdstring.h> #include <retro_environment.h> -#include <uwp/uwp_func.h> +#include <uwp/uwp_async.h> +#include <uwp/uwp_file_handle_access.h> namespace { - /* Dear Microsoft - * I really appreciate all the effort you took to not provide any - * synchronous file APIs and block all attempts to synchronously - * wait for the results of async tasks for "smooth user experience", - * but I'm not going to run and rewrite all RetroArch cores for - * async I/O. I hope you like this hack I made instead. - */ - template<typename T> - T RunAsync(std::function<concurrency::task<T>()> func) - { - volatile bool finished = false; - volatile Platform::Exception^ exception = nullptr; - volatile T result; - func().then([&finished, &exception, &result](concurrency::task<T> t) { - try - { - result = t.get(); - } - catch (Platform::Exception^ exception_) - { - exception = exception_; - } - finished = true; - }); - - /* Don't stall the UI thread - prevents a deadlock */ - Windows::UI::Core::CoreWindow^ corewindow = Windows::UI::Core::CoreWindow::GetForCurrentThread(); - while (!finished) - { - if (corewindow) - corewindow->Dispatcher->ProcessEvents(Windows::UI::Core::CoreProcessEventsOption::ProcessAllIfPresent); - } - - if (exception != nullptr) - throw exception; - return result; - } - - template<typename T> - T RunAsyncAndCatchErrors(std::function<concurrency::task<T>()> func, T valueOnError) - { - try - { - return RunAsync<T>(func); - } - catch (Platform::Exception^ e) - { - return valueOnError; - } - } - - void windowsize_path(wchar_t* path) - { - /* UWP deals with paths containing / instead of \ way worse than normal Windows */ - /* and RetroArch may sometimes mix them (e.g. on archive extraction) */ - if (!path) - return; - while (*path) - { - if (*path == '/') - *path = '\\'; - ++path; - } - } + void windowsize_path(wchar_t* path) + { + /* UWP deals with paths containing / instead of + * \ way worse than normal Windows */ + /* and RetroArch may sometimes mix them + * (e.g. on archive extraction) */ + if (!path) + return; + + while (*path) + { + if (*path == '/') + *path = '\\'; + ++path; + } + } } namespace { - /* Damn you, UWP, why no functions for that either */ - template<typename T> - concurrency::task<T^> GetItemFromPathAsync(Platform::String^ path) - { - static_assert(false, "StorageFile and StorageFolder only"); - } - template<> - concurrency::task<StorageFile^> GetItemFromPathAsync(Platform::String^ path) - { - return concurrency::create_task(StorageFile::GetFileFromPathAsync(path)); - } - template<> - concurrency::task<StorageFolder^> GetItemFromPathAsync(Platform::String^ path) - { - return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path)); - } - - template<typename T> - concurrency::task<T^> GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) - { - static_assert(false, "StorageFile and StorageFolder only"); - } - template<> - concurrency::task<StorageFile^> GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) - { - if (path->IsEmpty()) - retro_assert(false); /* Attempt to read a folder as a file - this really should have been caught earlier */ - return concurrency::create_task(folder->GetFileAsync(path)); - } - template<> - concurrency::task<StorageFolder^> GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) - { - if (path->IsEmpty()) - return concurrency::create_task(concurrency::create_async([folder]() { return folder; })); - return concurrency::create_task(folder->GetFolderAsync(path)); - } + /* Damn you, UWP, why no functions for that either */ + template<typename T> + concurrency::task<T^> GetItemFromPathAsync(Platform::String^ path) + { + static_assert(false, "StorageFile and StorageFolder only"); + } + template<> + concurrency::task<StorageFile^> GetItemFromPathAsync(Platform::String^ path) + { + return concurrency::create_task(StorageFile::GetFileFromPathAsync(path)); + } + template<> + concurrency::task<StorageFolder^> GetItemFromPathAsync(Platform::String^ path) + { + return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path)); + } + + template<typename T> + concurrency::task<T^> GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + { + static_assert(false, "StorageFile and StorageFolder only"); + } + template<> + concurrency::task<StorageFile^> GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + { + if (path->IsEmpty()) + retro_assert(false); /* Attempt to read a folder as a file - this really should have been caught earlier */ + return concurrency::create_task(folder->GetFileAsync(path)); + } + template<> + concurrency::task<StorageFolder^> GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + { + if (path->IsEmpty()) + return concurrency::create_task(concurrency::create_async([folder]() { return folder; })); + return concurrency::create_task(folder->GetFolderAsync(path)); + } } namespace { - /* A list of all StorageFolder objects returned using from the file picker */ - Platform::Collections::Vector<StorageFolder^> accessible_directories; - - concurrency::task<Platform::String^> TriggerPickerAddDialog() - { - auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker(); - folderPicker->SuggestedStartLocation = Windows::Storage::Pickers::PickerLocationId::Desktop; - folderPicker->FileTypeFilter->Append("*"); - - return concurrency::create_task(folderPicker->PickSingleFolderAsync()).then([](StorageFolder^ folder) { - if (folder == nullptr) - throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); - - /* TODO: check for duplicates */ - accessible_directories.Append(folder); - return folder->Path; - }); - } - - template<typename T> - concurrency::task<T^> LocateStorageItem(Platform::String^ path) - { - /* Look for a matching directory we can use */ - for each (StorageFolder^ folder in accessible_directories) - { - std::wstring folder_path = folder->Path->Data(); - /* Could be C:\ or C:\Users\somebody - remove the trailing slash to unify them */ - if (folder_path[folder_path.size() - 1] == '\\') - folder_path.erase(folder_path.size() - 1); - std::wstring file_path = path->Data(); - if (file_path.find(folder_path) == 0) - { - /* Found a match */ - file_path = file_path.length() > folder_path.length() ? file_path.substr(folder_path.length() + 1) : L""; - return concurrency::create_task(GetItemInFolderFromPathAsync<T>(folder, ref new Platform::String(file_path.data()))); - } - } - - /* No matches - try accessing directly, and fallback to user prompt */ - return concurrency::create_task(GetItemFromPathAsync<T>(path)).then([path](concurrency::task<T^> item) { - try - { - T^ storageItem = item.get(); - return concurrency::create_task(concurrency::create_async([storageItem]() { return storageItem; })); - } - catch (Platform::AccessDeniedException^ e) - { - Windows::UI::Popups::MessageDialog^ dialog = - ref new Windows::UI::Popups::MessageDialog("Path \"" + path + "\" is not currently accessible. Please open any containing directory to access it."); - dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Open file picker")); - dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Cancel")); - return concurrency::create_task(dialog->ShowAsync()).then([path](Windows::UI::Popups::IUICommand^ cmd) { - if (cmd->Label == "Open file picker") - { - return TriggerPickerAddDialog().then([path](Platform::String^ added_path) { - /* Retry */ - return LocateStorageItem<T>(path); - }); - } - else - { - throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); - } - }); - } - }); - } - - IStorageItem^ LocateStorageFileOrFolder(Platform::String^ path) - { - if (!path || path->IsEmpty()) - return nullptr; - - if (*(path->End() - 1) == '\\') - { - /* Ends with a slash, so it's definitely a directory */ - return RunAsyncAndCatchErrors<StorageFolder^>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFolder>(path)); - }, nullptr); - } - else - { - /* No final slash - probably a file (since RetroArch usually slash-terminates dirs), but there is still a chance it's a directory */ - IStorageItem^ item; - item = RunAsyncAndCatchErrors<StorageFile^>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFile>(path)); - }, nullptr); - if (!item) - { - item = RunAsyncAndCatchErrors<StorageFolder^>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFolder>(path)); - }, nullptr); - } - return item; - } - } + /* A list of all StorageFolder objects returned using from the file picker */ + Platform::Collections::Vector<StorageFolder^> accessible_directories; + + concurrency::task<Platform::String^> TriggerPickerAddDialog() + { + auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker(); + folderPicker->SuggestedStartLocation = Windows::Storage::Pickers::PickerLocationId::Desktop; + folderPicker->FileTypeFilter->Append("*"); + + return concurrency::create_task(folderPicker->PickSingleFolderAsync()).then([](StorageFolder^ folder) { + if (folder == nullptr) + throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); + + /* TODO: check for duplicates */ + accessible_directories.Append(folder); + return folder->Path; + }); + } + + template<typename T> + concurrency::task<T^> LocateStorageItem(Platform::String^ path) + { + /* Look for a matching directory we can use */ + for each (StorageFolder^ folder in accessible_directories) + { + std::wstring file_path; + std::wstring folder_path = folder->Path->Data(); + size_t folder_path_size = folder_path.size(); + /* Could be C:\ or C:\Users\somebody - remove the trailing slash to unify them */ + if (folder_path[folder_path_size - 1] == '\\') + folder_path.erase(folder_path_size - 1); + + file_path = path->Data(); + + if (file_path.find(folder_path) == 0) + { + /* Found a match */ + file_path = file_path.length() > folder_path.length() + ? file_path.substr(folder_path.length() + 1) + : L""; + return concurrency::create_task(GetItemInFolderFromPathAsync<T>(folder, ref new Platform::String(file_path.data()))); + } + } + + /* No matches - try accessing directly, and fallback to user prompt */ + return concurrency::create_task(GetItemFromPathAsync<T>(path)).then([&](concurrency::task<T^> item) { + try + { + T^ storageItem = item.get(); + return concurrency::create_task(concurrency::create_async([storageItem]() { return storageItem; })); + } + catch (Platform::AccessDeniedException^ e) + { + Windows::UI::Popups::MessageDialog^ dialog = + ref new Windows::UI::Popups::MessageDialog("Path \"" + path + "\" is not currently accessible. Please open any containing directory to access it."); + dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Open file picker")); + dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Cancel")); + return concurrency::create_task(dialog->ShowAsync()).then([path](Windows::UI::Popups::IUICommand^ cmd) { + if (cmd->Label == "Open file picker") + { + return TriggerPickerAddDialog().then([path](Platform::String^ added_path) { + /* Retry */ + return LocateStorageItem<T>(path); + }); + } + else + { + throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); + } + }); + } + }); + } + + IStorageItem^ LocateStorageFileOrFolder(Platform::String^ path) + { + if (!path || path->IsEmpty()) + return nullptr; + + if (*(path->End() - 1) == '\\') + { + /* Ends with a slash, so it's definitely a directory */ + return RunAsyncAndCatchErrors<StorageFolder^>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFolder>(path)); + }, nullptr); + } + else + { + /* No final slash - probably a file (since RetroArch usually slash-terminates dirs), but there is still a chance it's a directory */ + IStorageItem^ item; + item = RunAsyncAndCatchErrors<StorageFile^>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFile>(path)); + }, nullptr); + if (!item) + { + item = RunAsyncAndCatchErrors<StorageFolder^>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFolder>(path)); + }, nullptr); + } + return item; + } + } +} + + +/* This is some pure magic and I have absolutely no idea how it works */ +/* Wraps a raw buffer into a WinRT object */ +/* https://stackoverflow.com/questions/10520335/how-to-wrap-a-char-buffer-in-a-winrt-ibuffer-in-c */ +class NativeBuffer : + public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::WinRtClassicComMix>, + ABI::Windows::Storage::Streams::IBuffer, + Windows::Storage::Streams::IBufferByteAccess> +{ +public: + virtual ~NativeBuffer() + { + } + + HRESULT __stdcall RuntimeClassInitialize( + byte *buffer, uint32_t capacity, uint32_t length) + { + m_buffer = buffer; + m_capacity = capacity; + m_length = length; + return S_OK; + } + + HRESULT __stdcall Buffer(byte **value) + { + if (m_buffer == nullptr) + return E_INVALIDARG; + *value = m_buffer; + return S_OK; + } + + HRESULT __stdcall get_Capacity(uint32_t *value) + { + *value = m_capacity; + return S_OK; + } + + HRESULT __stdcall get_Length(uint32_t *value) + { + *value = m_length; + return S_OK; + } + + HRESULT __stdcall put_Length(uint32_t value) + { + if (value > m_capacity) + return E_INVALIDARG; + m_length = value; + return S_OK; + } + +private: + byte *m_buffer; + uint32_t m_capacity; + uint32_t m_length; +}; + +IBuffer^ CreateNativeBuffer(void* buf, uint32_t capacity, uint32_t length) +{ + Microsoft::WRL::ComPtr<NativeBuffer> nativeBuffer; + Microsoft::WRL::Details::MakeAndInitialize<NativeBuffer>(&nativeBuffer, (byte *)buf, capacity, length); + auto iinspectable = (IInspectable *)reinterpret_cast<IInspectable *>(nativeBuffer.Get()); + IBuffer ^buffer = reinterpret_cast<IBuffer ^>(iinspectable); + return buffer; +} + +/* Get a Win32 file handle out of IStorageFile */ +/* https://stackoverflow.com/questions/42799235/how-can-i-get-a-win32-handle-for-a-storagefile-or-storagefolder-in-uwp */ +HRESULT GetHandleFromStorageFile(Windows::Storage::StorageFile^ file, HANDLE* handle, HANDLE_ACCESS_OPTIONS accessMode) +{ + Microsoft::WRL::ComPtr<IUnknown> abiPointer(reinterpret_cast<IUnknown*>(file)); + Microsoft::WRL::ComPtr<IStorageItemHandleAccess> handleAccess; + if (SUCCEEDED(abiPointer.As(&handleAccess))) + { + HANDLE hFile = INVALID_HANDLE_VALUE; + + if (SUCCEEDED(handleAccess->Create(accessMode, + HANDLE_SHARING_OPTIONS::HSO_SHARE_READ, + HANDLE_OPTIONS::HO_NONE, + nullptr, + &hFile))) + { + *handle = hFile; + return S_OK; + } + } + + return E_FAIL; } #ifdef VFS_FRONTEND @@ -267,377 +318,631 @@ struct libretro_vfs_implementation_file #endif { - IRandomAccessStream^ fp; - char* orig_path; + IRandomAccessStream^ fp; + IBuffer^ bufferp; + HANDLE file_handle; + char* buffer; + char* orig_path; + size_t buffer_size; + int buffer_left; + size_t buffer_fill; }; -libretro_vfs_implementation_file *retro_vfs_file_open_impl(const char *path, unsigned mode, unsigned hints) +libretro_vfs_implementation_file *retro_vfs_file_open_impl( + const char *path, unsigned mode, unsigned hints) { - if (!path || !*path) - return NULL; - - if (!path_is_absolute(path)) - { - RARCH_WARN("Something tried to access files from current directory ('%s'). This is not allowed on UWP.\n", path); - return NULL; - } - - if (path_char_is_slash(path[strlen(path) - 1])) - { - RARCH_WARN("Trying to open a directory as file?! ('%s')\n", path); - return NULL; - } - - char* dirpath = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_basedir(dirpath, path, PATH_MAX_LENGTH); - wchar_t *dirpath_wide = utf8_to_utf16_string_alloc(dirpath); - windowsize_path(dirpath_wide); - Platform::String^ dirpath_str = ref new Platform::String(dirpath_wide); - free(dirpath_wide); - free(dirpath); - - char* filename = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_base(filename, path, PATH_MAX_LENGTH); - wchar_t *filename_wide = utf8_to_utf16_string_alloc(filename); - Platform::String^ filename_str = ref new Platform::String(filename_wide); - free(filename_wide); - free(filename); - - retro_assert(!dirpath_str->IsEmpty() && !filename_str->IsEmpty()); - - return RunAsyncAndCatchErrors<libretro_vfs_implementation_file*>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFolder>(dirpath_str)).then([=](StorageFolder^ dir) { - if (mode == RETRO_VFS_FILE_ACCESS_READ) - return dir->GetFileAsync(filename_str); - else - return dir->CreateFileAsync(filename_str, (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? - CreationCollisionOption::OpenIfExists : CreationCollisionOption::ReplaceExisting); - }).then([=](StorageFile^ file) { - FileAccessMode accessMode = mode == RETRO_VFS_FILE_ACCESS_READ ? - FileAccessMode::Read : FileAccessMode::ReadWrite; - return file->OpenAsync(accessMode); - }).then([=](IRandomAccessStream^ fpstream) { - libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); - if (!stream) - return (libretro_vfs_implementation_file*)NULL; - - stream->orig_path = strdup(path); - stream->fp = fpstream; - stream->fp->Seek(0); - return stream; - }); - }, NULL); + char dirpath[PATH_MAX_LENGTH]; + char filename[PATH_MAX_LENGTH]; + wchar_t *path_wide; + wchar_t *dirpath_wide; + wchar_t *filename_wide; + Platform::String^ path_str; + Platform::String^ filename_str; + Platform::String^ dirpath_str; + HANDLE file_handle = INVALID_HANDLE_VALUE; + DWORD desireAccess; + DWORD creationDisposition; + + if (!path || !*path) + return NULL; + + /* Something tried to access files from current directory. + * This is not allowed on UWP. */ + if (!path_is_absolute(path)) + return NULL; + + /* Trying to open a directory as file?! */ + if (PATH_CHAR_IS_SLASH(path[strlen(path) - 1])) + return NULL; + + dirpath[0] = filename[0] = '\0'; + + path_wide = utf8_to_utf16_string_alloc(path); + windowsize_path(path_wide); + path_str = ref new Platform::String(path_wide); + free(path_wide); + + fill_pathname_basedir(dirpath, path, sizeof(dirpath)); + dirpath_wide = utf8_to_utf16_string_alloc(dirpath); + windowsize_path(dirpath_wide); + dirpath_str = ref new Platform::String(dirpath_wide); + free(dirpath_wide); + + fill_pathname_base(filename, path, sizeof(filename)); + filename_wide = utf8_to_utf16_string_alloc(filename); + filename_str = ref new Platform::String(filename_wide); + free(filename_wide); + + retro_assert(!dirpath_str->IsEmpty() && !filename_str->IsEmpty()); + + /* Try Win32 first, this should work in AppData */ + if (mode == RETRO_VFS_FILE_ACCESS_READ) + { + desireAccess = GENERIC_READ; + creationDisposition = OPEN_ALWAYS; + } + else + { + desireAccess = GENERIC_WRITE; + creationDisposition = (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? + OPEN_ALWAYS : CREATE_ALWAYS; + } + + file_handle = CreateFile2(path_str->Data(), desireAccess, FILE_SHARE_READ, creationDisposition, NULL); + + if (file_handle != INVALID_HANDLE_VALUE) + { + libretro_vfs_implementation_file* stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); + if (!stream) + return (libretro_vfs_implementation_file*)NULL; + + stream->orig_path = strdup(path); + stream->fp = nullptr; + stream->file_handle = file_handle; + stream->buffer_left = 0; + stream->buffer_fill = 0; + return stream; + } + + /* Fallback to WinRT */ + return RunAsyncAndCatchErrors<libretro_vfs_implementation_file*>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFolder>(dirpath_str)).then([&](StorageFolder^ dir) { + if (mode == RETRO_VFS_FILE_ACCESS_READ) + return dir->GetFileAsync(filename_str); + else + return dir->CreateFileAsync(filename_str, (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? + CreationCollisionOption::OpenIfExists : CreationCollisionOption::ReplaceExisting); + }).then([&](StorageFile ^file) { + + HANDLE_CREATION_OPTIONS creationOptions; + HANDLE_ACCESS_OPTIONS handleAccess; + HRESULT hr; + + /* Try to use IStorageItemHandleAccess to get the file handle, + * with that we can use Win32 APIs for subsequent reads/writes + */ + if (mode == RETRO_VFS_FILE_ACCESS_READ) + { + handleAccess = HANDLE_ACCESS_OPTIONS::HAO_READ; + creationOptions = HANDLE_CREATION_OPTIONS::HCO_OPEN_ALWAYS; + } + else + { + handleAccess = HANDLE_ACCESS_OPTIONS::HAO_WRITE; + creationOptions = (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? + HANDLE_CREATION_OPTIONS::HCO_OPEN_ALWAYS : HANDLE_CREATION_OPTIONS::HCO_CREATE_ALWAYS; + + } + hr = GetHandleFromStorageFile(file, &file_handle, handleAccess); + + if (SUCCEEDED(hr)) + /* Success, let's return a null pointer and continue */ + return concurrency::create_task([&]() { return (IRandomAccessStream^) nullptr; }); + else + { + /* Failed, open a WinRT buffer of the file */ + FileAccessMode accessMode = (mode == RETRO_VFS_FILE_ACCESS_READ) ? + FileAccessMode::Read : FileAccessMode::ReadWrite; + return concurrency::create_task(file->OpenAsync(accessMode)); + } + }).then([&](IRandomAccessStream^ fpstream) { + libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); + if (!stream) + return (libretro_vfs_implementation_file*)NULL; + + stream->orig_path = strdup(path); + stream->fp = fpstream; + stream->file_handle = file_handle; + stream->buffer_left = 0; + stream->buffer_fill = 0; + + if (fpstream) + { + /* We are using WinRT. + * Preallocate a small buffer for manually buffered I/O, + * makes short read faster */ + stream->fp->Seek(0); + int buf_size = 8 * 1024; + stream->buffer = (char*)malloc(buf_size); + stream->bufferp = CreateNativeBuffer(stream->buffer, buf_size, 0); + stream->buffer_size = buf_size; + } + else + { + /* If we can use Win32 file API, buffering shouldn't be necessary */ + stream->buffer = NULL; + stream->bufferp = nullptr; + stream->buffer_size = 0; + } + return stream; + }); + }, NULL); } int retro_vfs_file_close_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return -1; - - /* Apparently, this is how you close a file in WinRT */ - /* Yes, really */ - stream->fp = nullptr; - - return 0; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) + CloseHandle(stream->file_handle); + else + { + /* Apparently, this is how you close a file in WinRT */ + /* Yes, really */ + stream->fp = nullptr; + free(stream->buffer); + } + + return 0; } int retro_vfs_file_error_impl(libretro_vfs_implementation_file *stream) { - return false; /* TODO */ + return false; /* TODO */ } int64_t retro_vfs_file_size_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return 0; - return stream->fp->Size; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return 0; + + if (stream->file_handle != INVALID_HANDLE_VALUE) + { + LARGE_INTEGER sz; + if (GetFileSizeEx(stream->file_handle, &sz)) + return sz.QuadPart; + return 0; + } + + return stream->fp->Size; } int64_t retro_vfs_file_truncate_impl(libretro_vfs_implementation_file *stream, int64_t length) { - if (!stream || !stream->fp) - return -1; - stream->fp->Size = length; - return 0; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) + { + int64_t p = retro_vfs_file_tell_impl(stream); + retro_vfs_file_seek_impl(stream, length, RETRO_VFS_SEEK_POSITION_START); + SetEndOfFile(stream->file_handle); + + if (p < length) + retro_vfs_file_seek_impl(stream, p, RETRO_VFS_SEEK_POSITION_START); + } + else + stream->fp->Size = length; + + return 0; } int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return -1; - return stream->fp->Position; -} - -int64_t retro_vfs_file_seek_impl(libretro_vfs_implementation_file *stream, int64_t offset, int seek_position) -{ - if (!stream || !stream->fp) - return -1; - - switch (seek_position) - { - case RETRO_VFS_SEEK_POSITION_START: - stream->fp->Seek(offset); - break; + LARGE_INTEGER _offset; + LARGE_INTEGER out; + _offset.QuadPart = 0; - case RETRO_VFS_SEEK_POSITION_CURRENT: - stream->fp->Seek(stream->fp->Position + offset); - break; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; - case RETRO_VFS_SEEK_POSITION_END: - stream->fp->Seek(stream->fp->Size - offset); - break; - } + if (stream->file_handle != INVALID_HANDLE_VALUE) + { + SetFilePointerEx(stream->file_handle, _offset, &out, FILE_CURRENT); + return out.QuadPart; + } - return 0; + return stream->fp->Position - stream->buffer_left; } -/* This is some pure magic and I have absolutely no idea how it works */ -/* Wraps a raw buffer into a WinRT object */ -/* https://stackoverflow.com/questions/10520335/how-to-wrap-a-char-buffer-in-a-winrt-ibuffer-in-c */ -class NativeBuffer : - public Microsoft::WRL::RuntimeClass<Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::WinRtClassicComMix>, - ABI::Windows::Storage::Streams::IBuffer, - Windows::Storage::Streams::IBufferByteAccess> +int64_t retro_vfs_file_seek_impl( + libretro_vfs_implementation_file *stream, + int64_t offset, int seek_position) { -public: - virtual ~NativeBuffer() - { - } - - HRESULT __stdcall RuntimeClassInitialize(byte *buffer, uint32_t capacity, uint32_t length) - { - m_buffer = buffer; - m_capacity = capacity; - m_length = length; - return S_OK; - } - - HRESULT __stdcall Buffer(byte **value) - { - if (m_buffer == nullptr) - return E_INVALIDARG; - *value = m_buffer; - return S_OK; - } - - HRESULT __stdcall get_Capacity(uint32_t *value) - { - *value = m_capacity; - return S_OK; - } - - HRESULT __stdcall get_Length(uint32_t *value) - { - *value = m_length; - return S_OK; - } - - HRESULT __stdcall put_Length(uint32_t value) - { - if (value > m_capacity) - return E_INVALIDARG; - m_length = value; - return S_OK; - } - -private: - byte *m_buffer; - uint32_t m_capacity; - uint32_t m_length; -}; - -IBuffer^ CreateNativeBuffer(void* buf, uint32_t capacity, uint32_t length) -{ - Microsoft::WRL::ComPtr<NativeBuffer> nativeBuffer; - Microsoft::WRL::Details::MakeAndInitialize<NativeBuffer>(&nativeBuffer, (byte *)buf, capacity, length); - auto iinspectable = (IInspectable *)reinterpret_cast<IInspectable *>(nativeBuffer.Get()); - IBuffer ^buffer = reinterpret_cast<IBuffer ^>(iinspectable); - return buffer; + LARGE_INTEGER _offset; + _offset.QuadPart = offset; + + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; + + switch (seek_position) + { + case RETRO_VFS_SEEK_POSITION_START: + if (stream->file_handle != INVALID_HANDLE_VALUE) + SetFilePointerEx(stream->file_handle, _offset, NULL, FILE_BEGIN); + else + stream->fp->Seek(offset); + break; + + case RETRO_VFS_SEEK_POSITION_CURRENT: + if (stream->file_handle != INVALID_HANDLE_VALUE) + SetFilePointerEx(stream->file_handle, _offset, NULL, FILE_CURRENT); + else + stream->fp->Seek(retro_vfs_file_tell_impl(stream) + offset); + break; + + case RETRO_VFS_SEEK_POSITION_END: + if (stream->file_handle != INVALID_HANDLE_VALUE) + SetFilePointerEx(stream->file_handle, _offset, NULL, FILE_END); + else + stream->fp->Seek(stream->fp->Size - offset); + break; + } + + /* For simplicity always flush the buffer on seek */ + stream->buffer_left = 0; + + return 0; } -int64_t retro_vfs_file_read_impl(libretro_vfs_implementation_file *stream, void *s, uint64_t len) +int64_t retro_vfs_file_read_impl( + libretro_vfs_implementation_file *stream, void *s, uint64_t len) { - if (!stream || !stream->fp || !s) - return -1; - - IBuffer^ buffer = CreateNativeBuffer(s, len, 0); - return RunAsyncAndCatchErrors<int64_t>([=]() { - return concurrency::create_task(stream->fp->ReadAsync(buffer, buffer->Capacity, InputStreamOptions::None)).then([=](IBuffer^ buf) { - retro_assert(buf == buffer); - return (int64_t)buffer->Length; - }); - }, -1); + int64_t ret; + int64_t bytes_read = 0; + IBuffer^ buffer; + + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE) || !s) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) + { + DWORD _bytes_read; + ReadFile(stream->file_handle, (char*)s, len, &_bytes_read, NULL); + return (int64_t)_bytes_read; + } + + if (len <= stream->buffer_size) + { + /* Small read, use manually buffered I/O */ + if (stream->buffer_left < len) + { + /* Exhaust the buffer */ + memcpy(s, + &stream->buffer[stream->buffer_fill - stream->buffer_left], + stream->buffer_left); + len -= stream->buffer_left; + bytes_read += stream->buffer_left; + stream->buffer_left = 0; + + /* Fill buffer */ + stream->buffer_left = RunAsyncAndCatchErrors<int64_t>([&]() { + return concurrency::create_task(stream->fp->ReadAsync(stream->bufferp, stream->bufferp->Capacity, InputStreamOptions::None)).then([&](IBuffer^ buf) { + retro_assert(stream->bufferp == buf); + return (int64_t)stream->bufferp->Length; + }); + }, -1); + stream->buffer_fill = stream->buffer_left; + + if (stream->buffer_left == -1) + { + stream->buffer_left = 0; + stream->buffer_fill = 0; + return -1; + } + + if (stream->buffer_left < len) + { + /* EOF */ + memcpy(&((char*)s)[bytes_read], + stream->buffer, stream->buffer_left); + bytes_read += stream->buffer_left; + stream->buffer_left = 0; + return bytes_read; + } + + memcpy(&((char*)s)[bytes_read], stream->buffer, len); + bytes_read += len; + stream->buffer_left -= len; + return bytes_read; + } + + /* Internal buffer already contains requested amount */ + memcpy(s, + &stream->buffer[stream->buffer_fill - stream->buffer_left], + len); + stream->buffer_left -= len; + return len; + } + + /* Big read exceeding buffer size, + * exhaust small buffer and read rest in one go */ + memcpy(s, &stream->buffer[stream->buffer_fill - stream->buffer_left], stream->buffer_left); + len -= stream->buffer_left; + bytes_read += stream->buffer_left; + stream->buffer_left = 0; + + buffer = CreateNativeBuffer(&((char*)s)[bytes_read], len, 0); + ret = RunAsyncAndCatchErrors<int64_t>([&]() { + return concurrency::create_task(stream->fp->ReadAsync(buffer, buffer->Capacity - bytes_read, InputStreamOptions::None)).then([&](IBuffer^ buf) { + retro_assert(buf == buffer); + return (int64_t)buffer->Length; + }); + }, -1); + + if (ret == -1) + return -1; + return bytes_read + ret; } -int64_t retro_vfs_file_write_impl(libretro_vfs_implementation_file *stream, const void *s, uint64_t len) +int64_t retro_vfs_file_write_impl( + libretro_vfs_implementation_file *stream, const void *s, uint64_t len) { - if (!stream || !stream->fp || !s) - return -1; - - IBuffer^ buffer = CreateNativeBuffer(const_cast<void*>(s), len, len); - return RunAsyncAndCatchErrors<int64_t>([=]() { - return concurrency::create_task(stream->fp->WriteAsync(buffer)).then([=](unsigned int written) { - return (int64_t)written; - }); - }, -1); + IBuffer^ buffer; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE) || !s) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) + { + DWORD bytes_written; + WriteFile(stream->file_handle, s, len, &bytes_written, NULL); + return (int64_t)bytes_written; + } + + /* const_cast to remove const modifier is undefined behaviour, but the buffer is only read, should be safe */ + buffer = CreateNativeBuffer(const_cast<void*>(s), len, len); + return RunAsyncAndCatchErrors<int64_t>([&]() { + return concurrency::create_task(stream->fp->WriteAsync(buffer)).then([&](unsigned int written) { + return (int64_t)written; + }); + }, -1); } int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return -1; - - return RunAsyncAndCatchErrors<int>([=]() { - return concurrency::create_task(stream->fp->FlushAsync()).then([=](bool this_value_is_not_even_documented_wtf) { - /* The bool value may be reporting an error or something, but just leave it alone for now */ - /* https://github.com/MicrosoftDocs/winrt-api/issues/841 */ - return 0; - }); - }, -1); + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE) || !stream->fp) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) + { + FlushFileBuffers(stream->file_handle); + return 0; + } + + return RunAsyncAndCatchErrors<int>([&]() { + return concurrency::create_task(stream->fp->FlushAsync()).then([&](bool this_value_is_not_even_documented_wtf) { + /* The bool value may be reporting an error or something, but just leave it alone for now */ + /* https://github.com/MicrosoftDocs/winrt-api/issues/841 */ + return 0; + }); + }, -1); } int retro_vfs_file_remove_impl(const char *path) { - if (!path || !*path) - return -1; - - wchar_t *path_wide = utf8_to_utf16_string_alloc(path); - windowsize_path(path_wide); - Platform::String^ path_str = ref new Platform::String(path_wide); - free(path_wide); - - return RunAsyncAndCatchErrors<int>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFile>(path_str)).then([=](StorageFile^ file) { - return file->DeleteAsync(StorageDeleteOption::PermanentDelete); - }).then([=]() { - return 0; - }); - }, -1); + BOOL result; + wchar_t *path_wide; + Platform::String^ path_str; + + if (!path || !*path) + return -1; + + path_wide = utf8_to_utf16_string_alloc(path); + windowsize_path(path_wide); + path_str = ref new Platform::String(path_wide); + free(path_wide); + + /* Try Win32 first, this should work in AppData */ + result = DeleteFileW(path_str->Data()); + if (result) + return 0; + + if (GetLastError() == ERROR_FILE_NOT_FOUND) + return -1; + + /* Fallback to WinRT */ + return RunAsyncAndCatchErrors<int>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFile>(path_str)).then([&](StorageFile^ file) { + return file->DeleteAsync(StorageDeleteOption::PermanentDelete); + }).then([&]() { + return 0; + }); + }, -1); } /* TODO: this may not work if trying to move a directory */ int retro_vfs_file_rename_impl(const char *old_path, const char *new_path) { - if (!old_path || !*old_path || !new_path || !*new_path) - return -1; - - wchar_t* old_path_wide = utf8_to_utf16_string_alloc(old_path); - Platform::String^ old_path_str = ref new Platform::String(old_path_wide); - free(old_path_wide); - - char* new_dir_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_basedir(new_dir_path, new_path, PATH_MAX_LENGTH); - wchar_t *new_dir_path_wide = utf8_to_utf16_string_alloc(new_dir_path); - windowsize_path(new_dir_path_wide); - Platform::String^ new_dir_path_str = ref new Platform::String(new_dir_path_wide); - free(new_dir_path_wide); - free(new_dir_path); - - char* new_file_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_base(new_file_name, new_path, PATH_MAX_LENGTH); - wchar_t *new_file_name_wide = utf8_to_utf16_string_alloc(new_file_name); - Platform::String^ new_file_name_str = ref new Platform::String(new_file_name_wide); - free(new_file_name_wide); - free(new_file_name); - - retro_assert(!old_path_str->IsEmpty() && !new_dir_path_str->IsEmpty() && !new_file_name_str->IsEmpty()); - - return RunAsyncAndCatchErrors<int>([=]() { - concurrency::task<StorageFile^> old_file_task = concurrency::create_task(LocateStorageItem<StorageFile>(old_path_str)); - concurrency::task<StorageFolder^> new_dir_task = concurrency::create_task(LocateStorageItem<StorageFolder>(new_dir_path_str)); - return concurrency::create_task([=] { - /* Run these two tasks in parallel */ - /* TODO: There may be some cleaner way to express this */ - concurrency::task_group group; - group.run([=] { return old_file_task; }); - group.run([=] { return new_dir_task; }); - group.wait(); - }).then([=]() { - return old_file_task.get()->MoveAsync(new_dir_task.get(), new_file_name_str, NameCollisionOption::ReplaceExisting); - }).then([=]() { - return 0; - }); - }, -1); + char new_file_name[PATH_MAX_LENGTH]; + char new_dir_path[PATH_MAX_LENGTH]; + wchar_t *new_file_name_wide; + wchar_t *old_path_wide, *new_dir_path_wide; + Platform::String^ old_path_str; + Platform::String^ new_dir_path_str; + Platform::String^ new_file_name_str; + + if (!old_path || !*old_path || !new_path || !*new_path) + return -1; + + new_file_name[0] = '\0'; + new_dir_path [0] = '\0'; + + old_path_wide = utf8_to_utf16_string_alloc(old_path); + old_path_str = ref new Platform::String(old_path_wide); + free(old_path_wide); + + fill_pathname_basedir(new_dir_path, new_path, sizeof(new_dir_path)); + new_dir_path_wide = utf8_to_utf16_string_alloc(new_dir_path); + windowsize_path(new_dir_path_wide); + new_dir_path_str = ref new Platform::String(new_dir_path_wide); + free(new_dir_path_wide); + + fill_pathname_base(new_file_name, new_path, sizeof(new_file_name)); + new_file_name_wide = utf8_to_utf16_string_alloc(new_file_name); + new_file_name_str = ref new Platform::String(new_file_name_wide); + free(new_file_name_wide); + + retro_assert(!old_path_str->IsEmpty() && !new_dir_path_str->IsEmpty() && !new_file_name_str->IsEmpty()); + + return RunAsyncAndCatchErrors<int>([&]() { + concurrency::task<StorageFile^> old_file_task = concurrency::create_task(LocateStorageItem<StorageFile>(old_path_str)); + concurrency::task<StorageFolder^> new_dir_task = concurrency::create_task(LocateStorageItem<StorageFolder>(new_dir_path_str)); + return concurrency::create_task([&] { + /* Run these two tasks in parallel */ + /* TODO: There may be some cleaner way to express this */ + concurrency::task_group group; + group.run([&] { return old_file_task; }); + group.run([&] { return new_dir_task; }); + group.wait(); + }).then([&]() { + return old_file_task.get()->MoveAsync(new_dir_task.get(), new_file_name_str, NameCollisionOption::ReplaceExisting); + }).then([&]() { + return 0; + }); + }, -1); } const char *retro_vfs_file_get_path_impl(libretro_vfs_implementation_file *stream) { - /* should never happen, do something noisy so caller can be fixed */ - if (!stream) - abort(); - return stream->orig_path; + /* should never happen, do something noisy so caller can be fixed */ + if (!stream) + abort(); + return stream->orig_path; } int retro_vfs_stat_impl(const char *path, int32_t *size) { - if (!path || !*path) - return 0; - - wchar_t *path_wide = utf8_to_utf16_string_alloc(path); - windowsize_path(path_wide); - Platform::String^ path_str = ref new Platform::String(path_wide); - free(path_wide); - - IStorageItem^ item = LocateStorageFileOrFolder(path_str); - if (!item) - return 0; - - return RunAsyncAndCatchErrors<int>([=]() { - return concurrency::create_task(item->GetBasicPropertiesAsync()).then([=](BasicProperties^ properties) { - if (size) - *size = properties->Size; - return item->IsOfType(StorageItemTypes::Folder) ? RETRO_VFS_STAT_IS_VALID | RETRO_VFS_STAT_IS_DIRECTORY : RETRO_VFS_STAT_IS_VALID; - }); - }, 0); + wchar_t *path_wide; + Platform::String^ path_str; + IStorageItem^ item; + DWORD file_info; + + if (!path || !*path) + return 0; + + path_wide = utf8_to_utf16_string_alloc(path); + windowsize_path(path_wide); + path_str = ref new Platform::String(path_wide); + free(path_wide); + + /* Try Win32 first, this should work in AppData */ + file_info = GetFileAttributesW(path_str->Data()); + if (file_info != INVALID_FILE_ATTRIBUTES) + { + HANDLE file_handle = CreateFile2(path_str->Data(), GENERIC_READ, FILE_SHARE_READ, OPEN_ALWAYS, NULL); + if (file_handle != INVALID_HANDLE_VALUE) + { + LARGE_INTEGER sz; + if (GetFileSizeEx(file_handle, &sz)) + { + if (size) + *size = sz.QuadPart; + } + CloseHandle(file_handle); + } + return (file_info & FILE_ATTRIBUTE_DIRECTORY) ? RETRO_VFS_STAT_IS_VALID | RETRO_VFS_STAT_IS_DIRECTORY : RETRO_VFS_STAT_IS_VALID; + } + + if (GetLastError() == ERROR_FILE_NOT_FOUND) + return 0; + + /* Fallback to WinRT */ + item = LocateStorageFileOrFolder(path_str); + if (!item) + return 0; + + return RunAsyncAndCatchErrors<int>([&]() { + return concurrency::create_task(item->GetBasicPropertiesAsync()).then([&](BasicProperties^ properties) { + if (size) + *size = properties->Size; + return item->IsOfType(StorageItemTypes::Folder) ? RETRO_VFS_STAT_IS_VALID | RETRO_VFS_STAT_IS_DIRECTORY : RETRO_VFS_STAT_IS_VALID; + }); + }, 0); } int retro_vfs_mkdir_impl(const char *dir) { - if (!dir || !*dir) - return -1; - - char* dir_local = strdup(dir); - /* If the path ends with a slash, we have to remove it for basename to work */ - char* tmp = dir_local + strlen(dir_local) - 1; - if (path_char_is_slash(*tmp)) - *tmp = 0; - - char* dir_name = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_base(dir_name, dir_local, PATH_MAX_LENGTH); - wchar_t *dir_name_wide = utf8_to_utf16_string_alloc(dir_name); - Platform::String^ dir_name_str = ref new Platform::String(dir_name_wide); - free(dir_name_wide); - free(dir_name); - - char* parent_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_parent_dir(parent_path, dir_local, PATH_MAX_LENGTH); - wchar_t *parent_path_wide = utf8_to_utf16_string_alloc(parent_path); - windowsize_path(parent_path_wide); - Platform::String^ parent_path_str = ref new Platform::String(parent_path_wide); - free(parent_path_wide); - free(parent_path); - - retro_assert(!dir_name_str->IsEmpty() && !parent_path_str->IsEmpty()); - - free(dir_local); - - return RunAsyncAndCatchErrors<int>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFolder>(parent_path_str)).then([=](StorageFolder^ parent) { - return parent->CreateFolderAsync(dir_name_str); - }).then([=](concurrency::task<StorageFolder^> new_dir) { - try - { - new_dir.get(); - } - catch (Platform::COMException^ e) - { - if (e->HResult == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) - return -2; - throw; - } - return 0; - }); - }, -1); + Platform::String^ parent_path_str; + Platform::String^ dir_name_str; + Platform::String^ dir_str; + wchar_t *dir_name_wide, *parent_path_wide, *dir_wide; + char *dir_local, *tmp; + char parent_path[PATH_MAX_LENGTH]; + char dir_name[PATH_MAX_LENGTH]; + BOOL result; + + if (!dir || !*dir) + return -1; + + dir_name[0] = '\0'; + + /* If the path ends with a slash, we have to remove + * it for basename to work */ + dir_local = strdup(dir); + tmp = dir_local + strlen(dir_local) - 1; + + if (PATH_CHAR_IS_SLASH(*tmp)) + *tmp = 0; + + dir_wide = utf8_to_utf16_string_alloc(dir_local); + windowsize_path(dir_wide); + dir_str = ref new Platform::String(dir_wide); + free(dir_wide); + + fill_pathname_base(dir_name, dir_local, sizeof(dir_name)); + dir_name_wide = utf8_to_utf16_string_alloc(dir_name); + dir_name_str = ref new Platform::String(dir_name_wide); + free(dir_name_wide); + + fill_pathname_parent_dir(parent_path, dir_local, sizeof(parent_path)); + parent_path_wide = utf8_to_utf16_string_alloc(parent_path); + windowsize_path(parent_path_wide); + parent_path_str = ref new Platform::String(parent_path_wide); + free(parent_path_wide); + + retro_assert(!dir_name_str->IsEmpty() + && !parent_path_str->IsEmpty()); + + free(dir_local); + + /* Try Win32 first, this should work in AppData */ + result = CreateDirectoryW(dir_str->Data(), NULL); + if (result) + return 0; + + if (GetLastError() == ERROR_ALREADY_EXISTS) + return -2; + + /* Fallback to WinRT */ + return RunAsyncAndCatchErrors<int>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFolder>( + parent_path_str)).then([&](StorageFolder^ parent) { + return parent->CreateFolderAsync(dir_name_str); + }).then([&](concurrency::task<StorageFolder^> new_dir) { + try + { + new_dir.get(); + } + catch (Platform::COMException^ e) + { + if (e->HResult == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) + return -2; + throw; + } + return 0; + }); + }, -1); } #ifdef VFS_FRONTEND @@ -646,112 +951,104 @@ struct libretro_vfs_implementation_dir #endif { - IVectorView<IStorageItem^>^ directory; - IIterator<IStorageItem^>^ entry; - char *entry_name; + IVectorView<IStorageItem^>^ directory; + IIterator<IStorageItem^>^ entry; + char *entry_name; }; libretro_vfs_implementation_dir *retro_vfs_opendir_impl(const char *name, bool include_hidden) { - libretro_vfs_implementation_dir *rdir; + wchar_t *name_wide; + Platform::String^ name_str; + libretro_vfs_implementation_dir *rdir; - if (!name || !*name) - return NULL; + if (!name || !*name) + return NULL; - rdir = (libretro_vfs_implementation_dir*)calloc(1, sizeof(*rdir)); - if (!rdir) - return NULL; + rdir = (libretro_vfs_implementation_dir*)calloc(1, sizeof(*rdir)); + if (!rdir) + return NULL; - wchar_t *name_wide = utf8_to_utf16_string_alloc(name); - windowsize_path(name_wide); - Platform::String^ name_str = ref new Platform::String(name_wide); - free(name_wide); + name_wide = utf8_to_utf16_string_alloc(name); + windowsize_path(name_wide); + name_str = ref new Platform::String(name_wide); + free(name_wide); - rdir->directory = RunAsyncAndCatchErrors<IVectorView<IStorageItem^>^>([=]() { - return concurrency::create_task(LocateStorageItem<StorageFolder>(name_str)).then([=](StorageFolder^ folder) { - return folder->GetItemsAsync(); - }); - }, nullptr); + rdir->directory = RunAsyncAndCatchErrors<IVectorView<IStorageItem^>^>([&]() { + return concurrency::create_task(LocateStorageItem<StorageFolder>(name_str)).then([&](StorageFolder^ folder) { + return folder->GetItemsAsync(); + }); + }, nullptr); - if (rdir->directory) - return rdir; + if (rdir->directory) + return rdir; - free(rdir); - return NULL; + free(rdir); + return NULL; } bool retro_vfs_readdir_impl(libretro_vfs_implementation_dir *rdir) { - if (!rdir->entry) - { - rdir->entry = rdir->directory->First(); - return rdir->entry->HasCurrent; - } - else - { - return rdir->entry->MoveNext(); - } + if (!rdir->entry) + { + rdir->entry = rdir->directory->First(); + return rdir->entry->HasCurrent; + } + return rdir->entry->MoveNext(); } -const char *retro_vfs_dirent_get_name_impl(libretro_vfs_implementation_dir *rdir) +const char *retro_vfs_dirent_get_name_impl( + libretro_vfs_implementation_dir *rdir) { - if (rdir->entry_name) - free(rdir->entry_name); - rdir->entry_name = utf16_to_utf8_string_alloc(rdir->entry->Current->Name->Data()); - return rdir->entry_name; + if (rdir->entry_name) + free(rdir->entry_name); + rdir->entry_name = utf16_to_utf8_string_alloc( + rdir->entry->Current->Name->Data()); + return rdir->entry_name; } bool retro_vfs_dirent_is_dir_impl(libretro_vfs_implementation_dir *rdir) { - return rdir->entry->Current->IsOfType(StorageItemTypes::Folder); + return rdir->entry->Current->IsOfType(StorageItemTypes::Folder); } int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *rdir) { - if (!rdir) - return -1; - - if (rdir->entry_name) - free(rdir->entry_name); - rdir->entry = nullptr; - rdir->directory = nullptr; - - free(rdir); - return 0; -} - -bool uwp_is_path_accessible_using_standard_io(char *path) -{ - char *relative_path_abbrev = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - fill_pathname_abbreviate_special(relative_path_abbrev, path, PATH_MAX_LENGTH * sizeof(char)); + if (!rdir) + return -1; - bool result = strlen(relative_path_abbrev) >= 2 && (relative_path_abbrev[0] == ':' || relative_path_abbrev[0] == '~') && path_char_is_slash(relative_path_abbrev[1]); + if (rdir->entry_name) + free(rdir->entry_name); + rdir->entry = nullptr; + rdir->directory = nullptr; - free(relative_path_abbrev); - return result; + free(rdir); + return 0; } bool uwp_drive_exists(const char *path) { - if (!path || !*path) - return 0; - - wchar_t *path_wide = utf8_to_utf16_string_alloc(path); - Platform::String^ path_str = ref new Platform::String(path_wide); - free(path_wide); - - return RunAsyncAndCatchErrors<bool>([=]() { - return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path_str)).then([](StorageFolder^ properties) { - return true; - }); - }, false); + wchar_t *path_wide; + Platform::String^ path_str; + if (!path || !*path) + return 0; + + path_wide = utf8_to_utf16_string_alloc(path); + path_str = ref new Platform::String(path_wide); + free(path_wide); + + return RunAsyncAndCatchErrors<bool>([&]() { + return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path_str)).then([](StorageFolder^ properties) { + return true; + }); + }, false); } char* uwp_trigger_picker(void) { - return RunAsyncAndCatchErrors<char*>([=]() { - return TriggerPickerAddDialog().then([](Platform::String^ path) { - return utf16_to_utf8_string_alloc(path->Data()); - }); - }, NULL); + return RunAsyncAndCatchErrors<char*>([&]() { + return TriggerPickerAddDialog().then([](Platform::String^ path) { + return utf16_to_utf8_string_alloc(path->Data()); + }); + }, NULL); }
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/vulkan
Added
+(directory)
View file
libretro-mame2003-0~git20210529.tar.xz/src/libretro-common/vulkan/vulkan_symbol_wrapper.c
Added
@@ -0,0 +1,484 @@ + +/* This header is autogenerated by vulkan_loader_generator.py */ +#include <vulkan/vulkan_symbol_wrapper.h> + +PFN_vkCreateInstance vulkan_symbol_wrapper_vkCreateInstance; +PFN_vkEnumerateInstanceExtensionProperties vulkan_symbol_wrapper_vkEnumerateInstanceExtensionProperties; +PFN_vkEnumerateInstanceLayerProperties vulkan_symbol_wrapper_vkEnumerateInstanceLayerProperties; +PFN_vkDestroyInstance vulkan_symbol_wrapper_vkDestroyInstance; +PFN_vkEnumeratePhysicalDevices vulkan_symbol_wrapper_vkEnumeratePhysicalDevices; +PFN_vkGetPhysicalDeviceFeatures vulkan_symbol_wrapper_vkGetPhysicalDeviceFeatures; +PFN_vkGetPhysicalDeviceFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceFormatProperties; +PFN_vkGetPhysicalDeviceImageFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceImageFormatProperties; +PFN_vkGetPhysicalDeviceProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceProperties; +PFN_vkGetPhysicalDeviceQueueFamilyProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceQueueFamilyProperties; +PFN_vkGetPhysicalDeviceMemoryProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceMemoryProperties; +PFN_vkGetDeviceProcAddr vulkan_symbol_wrapper_vkGetDeviceProcAddr; +PFN_vkCreateDevice vulkan_symbol_wrapper_vkCreateDevice; +PFN_vkDestroyDevice vulkan_symbol_wrapper_vkDestroyDevice; +PFN_vkEnumerateDeviceExtensionProperties vulkan_symbol_wrapper_vkEnumerateDeviceExtensionProperties; +PFN_vkEnumerateDeviceLayerProperties vulkan_symbol_wrapper_vkEnumerateDeviceLayerProperties; +PFN_vkGetDeviceQueue vulkan_symbol_wrapper_vkGetDeviceQueue; +PFN_vkQueueSubmit vulkan_symbol_wrapper_vkQueueSubmit; +PFN_vkQueueWaitIdle vulkan_symbol_wrapper_vkQueueWaitIdle; +PFN_vkDeviceWaitIdle vulkan_symbol_wrapper_vkDeviceWaitIdle; +PFN_vkAllocateMemory vulkan_symbol_wrapper_vkAllocateMemory; +PFN_vkFreeMemory vulkan_symbol_wrapper_vkFreeMemory; +PFN_vkMapMemory vulkan_symbol_wrapper_vkMapMemory; +PFN_vkUnmapMemory vulkan_symbol_wrapper_vkUnmapMemory; +PFN_vkFlushMappedMemoryRanges vulkan_symbol_wrapper_vkFlushMappedMemoryRanges; +PFN_vkInvalidateMappedMemoryRanges vulkan_symbol_wrapper_vkInvalidateMappedMemoryRanges; +PFN_vkGetDeviceMemoryCommitment vulkan_symbol_wrapper_vkGetDeviceMemoryCommitment; +PFN_vkBindBufferMemory vulkan_symbol_wrapper_vkBindBufferMemory; +PFN_vkBindImageMemory vulkan_symbol_wrapper_vkBindImageMemory; +PFN_vkGetBufferMemoryRequirements vulkan_symbol_wrapper_vkGetBufferMemoryRequirements; +PFN_vkGetImageMemoryRequirements vulkan_symbol_wrapper_vkGetImageMemoryRequirements; +PFN_vkGetImageSparseMemoryRequirements vulkan_symbol_wrapper_vkGetImageSparseMemoryRequirements; +PFN_vkGetPhysicalDeviceSparseImageFormatProperties vulkan_symbol_wrapper_vkGetPhysicalDeviceSparseImageFormatProperties; +PFN_vkQueueBindSparse vulkan_symbol_wrapper_vkQueueBindSparse; +PFN_vkCreateFence vulkan_symbol_wrapper_vkCreateFence; +PFN_vkDestroyFence vulkan_symbol_wrapper_vkDestroyFence; +PFN_vkResetFences vulkan_symbol_wrapper_vkResetFences; +PFN_vkGetFenceStatus vulkan_symbol_wrapper_vkGetFenceStatus; +PFN_vkWaitForFences vulkan_symbol_wrapper_vkWaitForFences; +PFN_vkCreateSemaphore vulkan_symbol_wrapper_vkCreateSemaphore; +PFN_vkDestroySemaphore vulkan_symbol_wrapper_vkDestroySemaphore; +PFN_vkCreateEvent vulkan_symbol_wrapper_vkCreateEvent; +PFN_vkDestroyEvent vulkan_symbol_wrapper_vkDestroyEvent; +PFN_vkGetEventStatus vulkan_symbol_wrapper_vkGetEventStatus; +PFN_vkSetEvent vulkan_symbol_wrapper_vkSetEvent; +PFN_vkResetEvent vulkan_symbol_wrapper_vkResetEvent; +PFN_vkCreateQueryPool vulkan_symbol_wrapper_vkCreateQueryPool; +PFN_vkDestroyQueryPool vulkan_symbol_wrapper_vkDestroyQueryPool; +PFN_vkGetQueryPoolResults vulkan_symbol_wrapper_vkGetQueryPoolResults; +PFN_vkCreateBuffer vulkan_symbol_wrapper_vkCreateBuffer; +PFN_vkDestroyBuffer vulkan_symbol_wrapper_vkDestroyBuffer; +PFN_vkCreateBufferView vulkan_symbol_wrapper_vkCreateBufferView; +PFN_vkDestroyBufferView vulkan_symbol_wrapper_vkDestroyBufferView; +PFN_vkCreateImage vulkan_symbol_wrapper_vkCreateImage; +PFN_vkDestroyImage vulkan_symbol_wrapper_vkDestroyImage; +PFN_vkGetImageSubresourceLayout vulkan_symbol_wrapper_vkGetImageSubresourceLayout; +PFN_vkCreateImageView vulkan_symbol_wrapper_vkCreateImageView; +PFN_vkDestroyImageView vulkan_symbol_wrapper_vkDestroyImageView; +PFN_vkCreateShaderModule vulkan_symbol_wrapper_vkCreateShaderModule; +PFN_vkDestroyShaderModule vulkan_symbol_wrapper_vkDestroyShaderModule; +PFN_vkCreatePipelineCache vulkan_symbol_wrapper_vkCreatePipelineCache; +PFN_vkDestroyPipelineCache vulkan_symbol_wrapper_vkDestroyPipelineCache; +PFN_vkGetPipelineCacheData vulkan_symbol_wrapper_vkGetPipelineCacheData; +PFN_vkMergePipelineCaches vulkan_symbol_wrapper_vkMergePipelineCaches; +PFN_vkCreateGraphicsPipelines vulkan_symbol_wrapper_vkCreateGraphicsPipelines; +PFN_vkCreateComputePipelines vulkan_symbol_wrapper_vkCreateComputePipelines; +PFN_vkDestroyPipeline vulkan_symbol_wrapper_vkDestroyPipeline; +PFN_vkCreatePipelineLayout vulkan_symbol_wrapper_vkCreatePipelineLayout; +PFN_vkDestroyPipelineLayout vulkan_symbol_wrapper_vkDestroyPipelineLayout; +PFN_vkCreateSampler vulkan_symbol_wrapper_vkCreateSampler; +PFN_vkDestroySampler vulkan_symbol_wrapper_vkDestroySampler; +PFN_vkCreateDescriptorSetLayout vulkan_symbol_wrapper_vkCreateDescriptorSetLayout; +PFN_vkDestroyDescriptorSetLayout vulkan_symbol_wrapper_vkDestroyDescriptorSetLayout; +PFN_vkCreateDescriptorPool vulkan_symbol_wrapper_vkCreateDescriptorPool; +PFN_vkDestroyDescriptorPool vulkan_symbol_wrapper_vkDestroyDescriptorPool; +PFN_vkResetDescriptorPool vulkan_symbol_wrapper_vkResetDescriptorPool; +PFN_vkAllocateDescriptorSets vulkan_symbol_wrapper_vkAllocateDescriptorSets; +PFN_vkFreeDescriptorSets vulkan_symbol_wrapper_vkFreeDescriptorSets; +PFN_vkUpdateDescriptorSets vulkan_symbol_wrapper_vkUpdateDescriptorSets; +PFN_vkCreateFramebuffer vulkan_symbol_wrapper_vkCreateFramebuffer; +PFN_vkDestroyFramebuffer vulkan_symbol_wrapper_vkDestroyFramebuffer; +PFN_vkCreateRenderPass vulkan_symbol_wrapper_vkCreateRenderPass; +PFN_vkDestroyRenderPass vulkan_symbol_wrapper_vkDestroyRenderPass; +PFN_vkGetRenderAreaGranularity vulkan_symbol_wrapper_vkGetRenderAreaGranularity; +PFN_vkCreateCommandPool vulkan_symbol_wrapper_vkCreateCommandPool; +PFN_vkDestroyCommandPool vulkan_symbol_wrapper_vkDestroyCommandPool; +PFN_vkResetCommandPool vulkan_symbol_wrapper_vkResetCommandPool; +PFN_vkAllocateCommandBuffers vulkan_symbol_wrapper_vkAllocateCommandBuffers; +PFN_vkFreeCommandBuffers vulkan_symbol_wrapper_vkFreeCommandBuffers; +PFN_vkBeginCommandBuffer vulkan_symbol_wrapper_vkBeginCommandBuffer; +PFN_vkEndCommandBuffer vulkan_symbol_wrapper_vkEndCommandBuffer; +PFN_vkResetCommandBuffer vulkan_symbol_wrapper_vkResetCommandBuffer; +PFN_vkCmdBindPipeline vulkan_symbol_wrapper_vkCmdBindPipeline; +PFN_vkCmdSetViewport vulkan_symbol_wrapper_vkCmdSetViewport; +PFN_vkCmdSetScissor vulkan_symbol_wrapper_vkCmdSetScissor; +PFN_vkCmdSetLineWidth vulkan_symbol_wrapper_vkCmdSetLineWidth; +PFN_vkCmdSetDepthBias vulkan_symbol_wrapper_vkCmdSetDepthBias; +PFN_vkCmdSetBlendConstants vulkan_symbol_wrapper_vkCmdSetBlendConstants; +PFN_vkCmdSetDepthBounds vulkan_symbol_wrapper_vkCmdSetDepthBounds; +PFN_vkCmdSetStencilCompareMask vulkan_symbol_wrapper_vkCmdSetStencilCompareMask; +PFN_vkCmdSetStencilWriteMask vulkan_symbol_wrapper_vkCmdSetStencilWriteMask; +PFN_vkCmdSetStencilReference vulkan_symbol_wrapper_vkCmdSetStencilReference; +PFN_vkCmdBindDescriptorSets vulkan_symbol_wrapper_vkCmdBindDescriptorSets; +PFN_vkCmdBindIndexBuffer vulkan_symbol_wrapper_vkCmdBindIndexBuffer; +PFN_vkCmdBindVertexBuffers vulkan_symbol_wrapper_vkCmdBindVertexBuffers; +PFN_vkCmdDraw vulkan_symbol_wrapper_vkCmdDraw; +PFN_vkCmdDrawIndexed vulkan_symbol_wrapper_vkCmdDrawIndexed; +PFN_vkCmdDrawIndirect vulkan_symbol_wrapper_vkCmdDrawIndirect; +PFN_vkCmdDrawIndexedIndirect vulkan_symbol_wrapper_vkCmdDrawIndexedIndirect; +PFN_vkCmdDispatch vulkan_symbol_wrapper_vkCmdDispatch; +PFN_vkCmdDispatchIndirect vulkan_symbol_wrapper_vkCmdDispatchIndirect; +PFN_vkCmdCopyBuffer vulkan_symbol_wrapper_vkCmdCopyBuffer; +PFN_vkCmdCopyImage vulkan_symbol_wrapper_vkCmdCopyImage; +PFN_vkCmdBlitImage vulkan_symbol_wrapper_vkCmdBlitImage; +PFN_vkCmdCopyBufferToImage vulkan_symbol_wrapper_vkCmdCopyBufferToImage; +PFN_vkCmdCopyImageToBuffer vulkan_symbol_wrapper_vkCmdCopyImageToBuffer; +PFN_vkCmdUpdateBuffer vulkan_symbol_wrapper_vkCmdUpdateBuffer; +PFN_vkCmdFillBuffer vulkan_symbol_wrapper_vkCmdFillBuffer; +PFN_vkCmdClearColorImage vulkan_symbol_wrapper_vkCmdClearColorImage; +PFN_vkCmdClearDepthStencilImage vulkan_symbol_wrapper_vkCmdClearDepthStencilImage; +PFN_vkCmdClearAttachments vulkan_symbol_wrapper_vkCmdClearAttachments; +PFN_vkCmdResolveImage vulkan_symbol_wrapper_vkCmdResolveImage; +PFN_vkCmdSetEvent vulkan_symbol_wrapper_vkCmdSetEvent; +PFN_vkCmdResetEvent vulkan_symbol_wrapper_vkCmdResetEvent; +PFN_vkCmdWaitEvents vulkan_symbol_wrapper_vkCmdWaitEvents; +PFN_vkCmdPipelineBarrier vulkan_symbol_wrapper_vkCmdPipelineBarrier; +PFN_vkCmdBeginQuery vulkan_symbol_wrapper_vkCmdBeginQuery; +PFN_vkCmdEndQuery vulkan_symbol_wrapper_vkCmdEndQuery; +PFN_vkCmdResetQueryPool vulkan_symbol_wrapper_vkCmdResetQueryPool; +PFN_vkCmdWriteTimestamp vulkan_symbol_wrapper_vkCmdWriteTimestamp; +PFN_vkCmdCopyQueryPoolResults vulkan_symbol_wrapper_vkCmdCopyQueryPoolResults; +PFN_vkCmdPushConstants vulkan_symbol_wrapper_vkCmdPushConstants; +PFN_vkCmdBeginRenderPass vulkan_symbol_wrapper_vkCmdBeginRenderPass; +PFN_vkCmdNextSubpass vulkan_symbol_wrapper_vkCmdNextSubpass; +PFN_vkCmdEndRenderPass vulkan_symbol_wrapper_vkCmdEndRenderPass; +PFN_vkCmdExecuteCommands vulkan_symbol_wrapper_vkCmdExecuteCommands; +PFN_vkDestroySurfaceKHR vulkan_symbol_wrapper_vkDestroySurfaceKHR; +PFN_vkGetPhysicalDeviceSurfaceSupportKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceSupportKHR; +PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfaceFormatsKHR; +PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceSurfacePresentModesKHR; +PFN_vkCreateSwapchainKHR vulkan_symbol_wrapper_vkCreateSwapchainKHR; +PFN_vkDestroySwapchainKHR vulkan_symbol_wrapper_vkDestroySwapchainKHR; +PFN_vkGetSwapchainImagesKHR vulkan_symbol_wrapper_vkGetSwapchainImagesKHR; +PFN_vkAcquireNextImageKHR vulkan_symbol_wrapper_vkAcquireNextImageKHR; +PFN_vkQueuePresentKHR vulkan_symbol_wrapper_vkQueuePresentKHR; +PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceDisplayPropertiesKHR; +PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vulkan_symbol_wrapper_vkGetPhysicalDeviceDisplayPlanePropertiesKHR; +PFN_vkGetDisplayPlaneSupportedDisplaysKHR vulkan_symbol_wrapper_vkGetDisplayPlaneSupportedDisplaysKHR; +PFN_vkGetDisplayModePropertiesKHR vulkan_symbol_wrapper_vkGetDisplayModePropertiesKHR; +PFN_vkCreateDisplayModeKHR vulkan_symbol_wrapper_vkCreateDisplayModeKHR; +PFN_vkGetDisplayPlaneCapabilitiesKHR vulkan_symbol_wrapper_vkGetDisplayPlaneCapabilitiesKHR; +PFN_vkCreateDisplayPlaneSurfaceKHR vulkan_symbol_wrapper_vkCreateDisplayPlaneSurfaceKHR; +PFN_vkCreateSharedSwapchainsKHR vulkan_symbol_wrapper_vkCreateSharedSwapchainsKHR; +PFN_vkCreateDebugReportCallbackEXT vulkan_symbol_wrapper_vkCreateDebugReportCallbackEXT; +PFN_vkDestroyDebugReportCallbackEXT vulkan_symbol_wrapper_vkDestroyDebugReportCallbackEXT; +PFN_vkDebugReportMessageEXT vulkan_symbol_wrapper_vkDebugReportMessageEXT; +PFN_vkDebugMarkerSetObjectTagEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectTagEXT; +PFN_vkDebugMarkerSetObjectNameEXT vulkan_symbol_wrapper_vkDebugMarkerSetObjectNameEXT; +PFN_vkCmdDebugMarkerBeginEXT vulkan_symbol_wrapper_vkCmdDebugMarkerBeginEXT; +PFN_vkCmdDebugMarkerEndEXT vulkan_symbol_wrapper_vkCmdDebugMarkerEndEXT; +PFN_vkCmdDebugMarkerInsertEXT vulkan_symbol_wrapper_vkCmdDebugMarkerInsertEXT; + +static PFN_vkGetInstanceProcAddr GetInstanceProcAddr; +void vulkan_symbol_wrapper_init(PFN_vkGetInstanceProcAddr get_instance_proc_addr) +{ + GetInstanceProcAddr = get_instance_proc_addr; +} + +PFN_vkGetInstanceProcAddr vulkan_symbol_wrapper_instance_proc_addr(void) +{ + return GetInstanceProcAddr; +} + +VkBool32 vulkan_symbol_wrapper_load_instance_symbol(VkInstance instance, const char *name, PFN_vkVoidFunction *ppSymbol) +{ + *ppSymbol = GetInstanceProcAddr(instance, name); + return *ppSymbol != NULL; +} + +VkBool32 vulkan_symbol_wrapper_load_device_symbol(VkDevice device, const char *name, PFN_vkVoidFunction *ppSymbol) +{ + *ppSymbol = vkGetDeviceProcAddr(device, name); + return *ppSymbol != NULL; +} + +VkBool32 vulkan_symbol_wrapper_load_global_symbols(void) +{ + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(NULL, "vkCreateInstance", vkCreateInstance)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(NULL, "vkEnumerateInstanceExtensionProperties", vkEnumerateInstanceExtensionProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(NULL, "vkEnumerateInstanceLayerProperties", vkEnumerateInstanceLayerProperties)) return VK_FALSE; + return VK_TRUE; +} + +VkBool32 vulkan_symbol_wrapper_load_core_symbols(VkInstance instance) +{ + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyInstance", vkDestroyInstance)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEnumeratePhysicalDevices", vkEnumeratePhysicalDevices)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceFeatures", vkGetPhysicalDeviceFeatures)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceFormatProperties", vkGetPhysicalDeviceFormatProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceImageFormatProperties", vkGetPhysicalDeviceImageFormatProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceProperties", vkGetPhysicalDeviceProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceQueueFamilyProperties", vkGetPhysicalDeviceQueueFamilyProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceMemoryProperties", vkGetPhysicalDeviceMemoryProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetDeviceProcAddr", vkGetDeviceProcAddr)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateDevice", vkCreateDevice)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyDevice", vkDestroyDevice)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEnumerateDeviceExtensionProperties", vkEnumerateDeviceExtensionProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEnumerateDeviceLayerProperties", vkEnumerateDeviceLayerProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetDeviceQueue", vkGetDeviceQueue)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkQueueSubmit", vkQueueSubmit)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkQueueWaitIdle", vkQueueWaitIdle)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDeviceWaitIdle", vkDeviceWaitIdle)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkAllocateMemory", vkAllocateMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkFreeMemory", vkFreeMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkMapMemory", vkMapMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkUnmapMemory", vkUnmapMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkFlushMappedMemoryRanges", vkFlushMappedMemoryRanges)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkInvalidateMappedMemoryRanges", vkInvalidateMappedMemoryRanges)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetDeviceMemoryCommitment", vkGetDeviceMemoryCommitment)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkBindBufferMemory", vkBindBufferMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkBindImageMemory", vkBindImageMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetBufferMemoryRequirements", vkGetBufferMemoryRequirements)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetImageMemoryRequirements", vkGetImageMemoryRequirements)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetImageSparseMemoryRequirements", vkGetImageSparseMemoryRequirements)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceSparseImageFormatProperties", vkGetPhysicalDeviceSparseImageFormatProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkQueueBindSparse", vkQueueBindSparse)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateFence", vkCreateFence)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyFence", vkDestroyFence)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkResetFences", vkResetFences)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetFenceStatus", vkGetFenceStatus)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkWaitForFences", vkWaitForFences)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateSemaphore", vkCreateSemaphore)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroySemaphore", vkDestroySemaphore)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateEvent", vkCreateEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyEvent", vkDestroyEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetEventStatus", vkGetEventStatus)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkSetEvent", vkSetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkResetEvent", vkResetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateQueryPool", vkCreateQueryPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyQueryPool", vkDestroyQueryPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetQueryPoolResults", vkGetQueryPoolResults)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateBuffer", vkCreateBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyBuffer", vkDestroyBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateBufferView", vkCreateBufferView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyBufferView", vkDestroyBufferView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateImage", vkCreateImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyImage", vkDestroyImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetImageSubresourceLayout", vkGetImageSubresourceLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateImageView", vkCreateImageView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyImageView", vkDestroyImageView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateShaderModule", vkCreateShaderModule)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyShaderModule", vkDestroyShaderModule)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreatePipelineCache", vkCreatePipelineCache)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyPipelineCache", vkDestroyPipelineCache)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPipelineCacheData", vkGetPipelineCacheData)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkMergePipelineCaches", vkMergePipelineCaches)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateGraphicsPipelines", vkCreateGraphicsPipelines)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateComputePipelines", vkCreateComputePipelines)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyPipeline", vkDestroyPipeline)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreatePipelineLayout", vkCreatePipelineLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyPipelineLayout", vkDestroyPipelineLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateSampler", vkCreateSampler)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroySampler", vkDestroySampler)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateDescriptorSetLayout", vkCreateDescriptorSetLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyDescriptorSetLayout", vkDestroyDescriptorSetLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateDescriptorPool", vkCreateDescriptorPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyDescriptorPool", vkDestroyDescriptorPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkResetDescriptorPool", vkResetDescriptorPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkAllocateDescriptorSets", vkAllocateDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkFreeDescriptorSets", vkFreeDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkUpdateDescriptorSets", vkUpdateDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateFramebuffer", vkCreateFramebuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyFramebuffer", vkDestroyFramebuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateRenderPass", vkCreateRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyRenderPass", vkDestroyRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetRenderAreaGranularity", vkGetRenderAreaGranularity)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateCommandPool", vkCreateCommandPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyCommandPool", vkDestroyCommandPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkResetCommandPool", vkResetCommandPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkAllocateCommandBuffers", vkAllocateCommandBuffers)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkFreeCommandBuffers", vkFreeCommandBuffers)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkBeginCommandBuffer", vkBeginCommandBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEndCommandBuffer", vkEndCommandBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkResetCommandBuffer", vkResetCommandBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBindPipeline", vkCmdBindPipeline)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetViewport", vkCmdSetViewport)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetScissor", vkCmdSetScissor)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetLineWidth", vkCmdSetLineWidth)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetDepthBias", vkCmdSetDepthBias)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetBlendConstants", vkCmdSetBlendConstants)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetDepthBounds", vkCmdSetDepthBounds)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetStencilCompareMask", vkCmdSetStencilCompareMask)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetStencilWriteMask", vkCmdSetStencilWriteMask)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetStencilReference", vkCmdSetStencilReference)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBindDescriptorSets", vkCmdBindDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBindIndexBuffer", vkCmdBindIndexBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBindVertexBuffers", vkCmdBindVertexBuffers)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdDraw", vkCmdDraw)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdDrawIndexed", vkCmdDrawIndexed)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdDrawIndirect", vkCmdDrawIndirect)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdDrawIndexedIndirect", vkCmdDrawIndexedIndirect)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdDispatch", vkCmdDispatch)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdDispatchIndirect", vkCmdDispatchIndirect)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdCopyBuffer", vkCmdCopyBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdCopyImage", vkCmdCopyImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBlitImage", vkCmdBlitImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdCopyBufferToImage", vkCmdCopyBufferToImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdCopyImageToBuffer", vkCmdCopyImageToBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdUpdateBuffer", vkCmdUpdateBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdFillBuffer", vkCmdFillBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdClearColorImage", vkCmdClearColorImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdClearDepthStencilImage", vkCmdClearDepthStencilImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdClearAttachments", vkCmdClearAttachments)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdResolveImage", vkCmdResolveImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdSetEvent", vkCmdSetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdResetEvent", vkCmdResetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdWaitEvents", vkCmdWaitEvents)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdPipelineBarrier", vkCmdPipelineBarrier)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBeginQuery", vkCmdBeginQuery)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdEndQuery", vkCmdEndQuery)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdResetQueryPool", vkCmdResetQueryPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdWriteTimestamp", vkCmdWriteTimestamp)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdCopyQueryPoolResults", vkCmdCopyQueryPoolResults)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdPushConstants", vkCmdPushConstants)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdBeginRenderPass", vkCmdBeginRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdNextSubpass", vkCmdNextSubpass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdEndRenderPass", vkCmdEndRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCmdExecuteCommands", vkCmdExecuteCommands)) return VK_FALSE; + return VK_TRUE; +} + +VkBool32 vulkan_symbol_wrapper_load_core_instance_symbols(VkInstance instance) +{ + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkDestroyInstance", vkDestroyInstance)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEnumeratePhysicalDevices", vkEnumeratePhysicalDevices)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceFeatures", vkGetPhysicalDeviceFeatures)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceFormatProperties", vkGetPhysicalDeviceFormatProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceImageFormatProperties", vkGetPhysicalDeviceImageFormatProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceProperties", vkGetPhysicalDeviceProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceQueueFamilyProperties", vkGetPhysicalDeviceQueueFamilyProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceMemoryProperties", vkGetPhysicalDeviceMemoryProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetDeviceProcAddr", vkGetDeviceProcAddr)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkCreateDevice", vkCreateDevice)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEnumerateDeviceExtensionProperties", vkEnumerateDeviceExtensionProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkEnumerateDeviceLayerProperties", vkEnumerateDeviceLayerProperties)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_SYMBOL(instance, "vkGetPhysicalDeviceSparseImageFormatProperties", vkGetPhysicalDeviceSparseImageFormatProperties)) return VK_FALSE; + return VK_TRUE; +} + +VkBool32 vulkan_symbol_wrapper_load_core_device_symbols(VkDevice device) +{ + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyDevice", vkDestroyDevice)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetDeviceQueue", vkGetDeviceQueue)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkQueueSubmit", vkQueueSubmit)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkQueueWaitIdle", vkQueueWaitIdle)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDeviceWaitIdle", vkDeviceWaitIdle)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkAllocateMemory", vkAllocateMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkFreeMemory", vkFreeMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkMapMemory", vkMapMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkUnmapMemory", vkUnmapMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkFlushMappedMemoryRanges", vkFlushMappedMemoryRanges)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkInvalidateMappedMemoryRanges", vkInvalidateMappedMemoryRanges)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetDeviceMemoryCommitment", vkGetDeviceMemoryCommitment)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkBindBufferMemory", vkBindBufferMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkBindImageMemory", vkBindImageMemory)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetBufferMemoryRequirements", vkGetBufferMemoryRequirements)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetImageMemoryRequirements", vkGetImageMemoryRequirements)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetImageSparseMemoryRequirements", vkGetImageSparseMemoryRequirements)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkQueueBindSparse", vkQueueBindSparse)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateFence", vkCreateFence)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyFence", vkDestroyFence)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkResetFences", vkResetFences)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetFenceStatus", vkGetFenceStatus)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkWaitForFences", vkWaitForFences)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateSemaphore", vkCreateSemaphore)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroySemaphore", vkDestroySemaphore)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateEvent", vkCreateEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyEvent", vkDestroyEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetEventStatus", vkGetEventStatus)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkSetEvent", vkSetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkResetEvent", vkResetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateQueryPool", vkCreateQueryPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyQueryPool", vkDestroyQueryPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetQueryPoolResults", vkGetQueryPoolResults)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateBuffer", vkCreateBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyBuffer", vkDestroyBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateBufferView", vkCreateBufferView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyBufferView", vkDestroyBufferView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateImage", vkCreateImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyImage", vkDestroyImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetImageSubresourceLayout", vkGetImageSubresourceLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateImageView", vkCreateImageView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyImageView", vkDestroyImageView)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateShaderModule", vkCreateShaderModule)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyShaderModule", vkDestroyShaderModule)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreatePipelineCache", vkCreatePipelineCache)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyPipelineCache", vkDestroyPipelineCache)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetPipelineCacheData", vkGetPipelineCacheData)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkMergePipelineCaches", vkMergePipelineCaches)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateGraphicsPipelines", vkCreateGraphicsPipelines)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateComputePipelines", vkCreateComputePipelines)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyPipeline", vkDestroyPipeline)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreatePipelineLayout", vkCreatePipelineLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyPipelineLayout", vkDestroyPipelineLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateSampler", vkCreateSampler)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroySampler", vkDestroySampler)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateDescriptorSetLayout", vkCreateDescriptorSetLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyDescriptorSetLayout", vkDestroyDescriptorSetLayout)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateDescriptorPool", vkCreateDescriptorPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyDescriptorPool", vkDestroyDescriptorPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkResetDescriptorPool", vkResetDescriptorPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkAllocateDescriptorSets", vkAllocateDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkFreeDescriptorSets", vkFreeDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkUpdateDescriptorSets", vkUpdateDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateFramebuffer", vkCreateFramebuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyFramebuffer", vkDestroyFramebuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateRenderPass", vkCreateRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyRenderPass", vkDestroyRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkGetRenderAreaGranularity", vkGetRenderAreaGranularity)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCreateCommandPool", vkCreateCommandPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkDestroyCommandPool", vkDestroyCommandPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkResetCommandPool", vkResetCommandPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkAllocateCommandBuffers", vkAllocateCommandBuffers)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkFreeCommandBuffers", vkFreeCommandBuffers)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkBeginCommandBuffer", vkBeginCommandBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkEndCommandBuffer", vkEndCommandBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkResetCommandBuffer", vkResetCommandBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBindPipeline", vkCmdBindPipeline)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetViewport", vkCmdSetViewport)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetScissor", vkCmdSetScissor)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetLineWidth", vkCmdSetLineWidth)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetDepthBias", vkCmdSetDepthBias)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetBlendConstants", vkCmdSetBlendConstants)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetDepthBounds", vkCmdSetDepthBounds)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetStencilCompareMask", vkCmdSetStencilCompareMask)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetStencilWriteMask", vkCmdSetStencilWriteMask)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetStencilReference", vkCmdSetStencilReference)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBindDescriptorSets", vkCmdBindDescriptorSets)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBindIndexBuffer", vkCmdBindIndexBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBindVertexBuffers", vkCmdBindVertexBuffers)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdDraw", vkCmdDraw)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdDrawIndexed", vkCmdDrawIndexed)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdDrawIndirect", vkCmdDrawIndirect)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdDrawIndexedIndirect", vkCmdDrawIndexedIndirect)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdDispatch", vkCmdDispatch)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdDispatchIndirect", vkCmdDispatchIndirect)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdCopyBuffer", vkCmdCopyBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdCopyImage", vkCmdCopyImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBlitImage", vkCmdBlitImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdCopyBufferToImage", vkCmdCopyBufferToImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdCopyImageToBuffer", vkCmdCopyImageToBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdUpdateBuffer", vkCmdUpdateBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdFillBuffer", vkCmdFillBuffer)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdClearColorImage", vkCmdClearColorImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdClearDepthStencilImage", vkCmdClearDepthStencilImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdClearAttachments", vkCmdClearAttachments)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdResolveImage", vkCmdResolveImage)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdSetEvent", vkCmdSetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdResetEvent", vkCmdResetEvent)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdWaitEvents", vkCmdWaitEvents)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdPipelineBarrier", vkCmdPipelineBarrier)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBeginQuery", vkCmdBeginQuery)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdEndQuery", vkCmdEndQuery)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdResetQueryPool", vkCmdResetQueryPool)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdWriteTimestamp", vkCmdWriteTimestamp)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdCopyQueryPoolResults", vkCmdCopyQueryPoolResults)) + { +#if 0 + /* Don't return false here. Would cause MESA Intel Ivy Bridge drivers to not work at all. */ + return VK_FALSE; +#endif + } + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdPushConstants", vkCmdPushConstants)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdBeginRenderPass", vkCmdBeginRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdNextSubpass", vkCmdNextSubpass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdEndRenderPass", vkCmdEndRenderPass)) return VK_FALSE; + if (!VULKAN_SYMBOL_WRAPPER_LOAD_DEVICE_SYMBOL(device, "vkCmdExecuteCommands", vkCmdExecuteCommands)) return VK_FALSE; + return VK_TRUE; +}
View file
libretro-mame2003-0~git20200805.tar.xz/src/libretro-deps/libFLAC/stream_decoder.c -> libretro-mame2003-0~git20210529.tar.xz/src/libretro-deps/libFLAC/stream_decoder.c
Changed
@@ -3336,7 +3336,7 @@ if(decoder->private_->file == stdin) return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; -#ifdef __CELLOS_LV2__ +#ifdef __PS3__ else if(fseek(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) #else else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) @@ -3353,7 +3353,7 @@ if(decoder->private_->file == stdin) return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; -#ifdef __CELLOS_LV2__ +#ifdef __PS3__ else if((pos = ftell(decoder->private_->file)) < 0) #else else if((pos = ftello(decoder->private_->file)) < 0)
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/decocrpt.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/decocrpt.c
Changed
@@ -598,7 +598,7 @@ 4,7,2,2,1,3,4,4,1,7,0,2,5,4,7,3,7,6,1,5,6,0,7,4,1,1,5,2,2,6,7,2, }; -static void deco_decrypt(int mem_region,const UINT8 *xor_table,const UINT16 *address_table,const UINT8 *swap_table) +static void deco_decrypt(int mem_region,const UINT8 *xor_table,const UINT16 *address_table,const UINT8 *swap_table,int remap_only) { data16_t *rom = (data16_t *)memory_region(mem_region); int len = memory_region_length(mem_region)/2; @@ -622,7 +622,10 @@ int addr = (i & ~0x7ff) | address_table[i & 0x7ff]; int pat = swap_table[i & 0x7ff]; - rom[i] = BITSWAP16(buffer[addr] ^ xor_masks[xor_table[addr & 0x7ff]], + if (remap_only) + rom[i] = buffer[addr]; + else + rom[i] = BITSWAP16(buffer[addr] ^ xor_masks[xor_table[addr & 0x7ff]], swap_patterns[pat][0], swap_patterns[pat][1], swap_patterns[pat][2], @@ -647,16 +650,205 @@ #ifndef MSB_FIRST /* we work on 16-bit words but data is loaded as 8-bit, so swap bytes on LSB machines */ for (i = 0;i < len;i++) + { rom[i] = (rom[i] >> 8) | (rom[i] << 8); + } #endif } +static void decrypt(UINT32 *src, UINT32 *dst, int length) +{ + int a; + + for (a = 0; a < length/4; a++) + { + int addr, dword; + + addr = (a & 0xff0000) | 0x92c6; + + if (a & 0x0001) addr ^= 0xce4a; + if (a & 0x0002) addr ^= 0x4db2; + if (a & 0x0004) addr ^= 0xef60; + if (a & 0x0008) addr ^= 0x5737; + if (a & 0x0010) addr ^= 0x13dc; + if (a & 0x0020) addr ^= 0x4bd9; + if (a & 0x0040) addr ^= 0xa209; + if (a & 0x0080) addr ^= 0xd996; + if (a & 0x0100) addr ^= 0xa700; + if (a & 0x0200) addr ^= 0xeca0; + if (a & 0x0400) addr ^= 0x7529; + if (a & 0x0800) addr ^= 0x3100; + if (a & 0x1000) addr ^= 0x33b4; + if (a & 0x2000) addr ^= 0x6161; + if (a & 0x4000) addr ^= 0x1eef; + if (a & 0x8000) addr ^= 0xf5a5; + + dword = src[addr]; + + /* note that each of the following lines affects exactly two bits*/ + + if (a & 0x00004) dword ^= 0x04400000; + if (a & 0x00008) dword ^= 0x40000004; + if (a & 0x00010) dword ^= 0x00048000; + if (a & 0x00020) dword ^= 0x00000280; + if (a & 0x00040) dword ^= 0x00200040; + if (a & 0x00080) dword ^= 0x09000000; + if (a & 0x00100) dword ^= 0x00001100; + if (a & 0x00200) dword ^= 0x20002000; + if (a & 0x00400) dword ^= 0x00000022; + if (a & 0x00800) dword ^= 0x000a0000; + if (a & 0x01000) dword ^= 0x10004000; + if (a & 0x02000) dword ^= 0x00010400; + if (a & 0x04000) dword ^= 0x80000010; + if (a & 0x08000) dword ^= 0x00000009; + if (a & 0x10000) dword ^= 0x02100000; + if (a & 0x20000) dword ^= 0x00800800; + + switch (a & 3) + { + case 0: + dword = BITSWAP32( dword ^ 0xec63197a, + 1, 4, 7, 28, 22, 18, 20, 9, + 16, 10, 30, 2, 31, 24, 19, 29, + 6, 21, 23, 11, 12, 13, 5, 0, + 8, 26, 27, 15, 14, 17, 25, 3 ); + break; + + case 1: + dword = BITSWAP32( dword ^ 0x58a5a55f, + 14, 23, 28, 29, 6, 24, 10, 1, + 5, 16, 7, 2, 30, 8, 18, 3, + 31, 22, 25, 20, 17, 0, 19, 27, + 9, 12, 21, 15, 26, 13, 4, 11 ); + break; + + case 2: + dword = BITSWAP32( dword ^ 0xe3a65f16, + 19, 30, 21, 4, 2, 18, 15, 1, + 12, 25, 8, 0, 24, 20, 17, 23, + 22, 26, 28, 16, 9, 27, 6, 11, + 31, 10, 3, 13, 14, 7, 29, 5 ); + break; + + case 3: + dword = BITSWAP32( dword ^ 0x28d93783, + 30, 6, 15, 0, 31, 18, 26, 22, + 14, 23, 19, 17, 10, 8, 11, 20, + 1, 28, 2, 4, 9, 24, 25, 27, + 7, 21, 13, 29, 5, 3, 16, 12 ); + break; + } + + dst[a] = dword; + } +} + + + +static UINT16 decrypt2(UINT16 data, int address, int select_xor) +{ + static const UINT16 xors[16] = + { + 0xb52c,0x2458,0x139a,0xc998,0xce8e,0x5144,0x0429,0xaad4,0xa331,0x3645,0x69a3,0xac64,0x1a53,0x5083,0x4dea,0xd237 + }; + static const UINT8 bitswaps[16][16] = + { + { 12,8,13,11,14,10,15,9, 3,2,1,0,4,5,6,7 }, { 10,11,14,12,15,13,8,9, 6,7,5,3,0,4,2,1 }, + { 14,13,15,9,8,12,11,10, 7,4,1,5,6,0,3,2 }, { 15,14,8,9,10,11,13,12, 1,2,7,3,4,6,0,5 }, + { 10,9,13,14,15,8,12,11, 5,2,1,0,3,4,7,6 }, { 8,9,15,14,10,11,13,12, 0,6,5,4,1,2,3,7 }, + { 14,8,15,9,10,11,13,12, 4,5,3,0,2,7,6,1 }, { 13,11,12,10,15,9,14,8, 6,0,7,5,1,4,3,2 }, + { 12,11,13,10,9,8,14,15, 0,2,4,6,7,5,3,1 }, { 15,13,9,8,10,11,12,14, 2,1,0,7,6,5,4,3 }, + { 13,8,9,10,11,12,15,14, 6,0,1,2,3,7,4,5 }, { 12,11,10,8,9,13,14,15, 6,5,4,0,7,1,2,3 }, + { 12,15,8,13,9,11,14,10, 6,5,4,3,2,1,0,7 }, { 11,12,13,14,15,8,9,10, 4,5,7,1,6,3,2,0 }, + { 13,8,12,14,11,15,10,9, 7,6,5,4,3,2,1,0 }, { 15,14,13,12,11,10,9,8, 0,6,7,4,3,2,1,5 } + }; + int j, xorval; + const UINT8 *bs; + + /* calculate bitswap to use*/ + j = ((address ^ select_xor) & 0xf0) >> 4; + if (address & 0x20000) j ^= 4; + bs = bitswaps[j]; + + /* calculate xor to use*/ + j = (address ^ select_xor) & 0x0f; + if (address & 0x40000) j ^= 2; /* boogwing*/ + xorval = xors[j]; + + /* decrypt*/ + return xorval ^ BITSWAP16(data, + bs[0],bs[1],bs[2],bs[3],bs[4],bs[5],bs[6],bs[7], + bs[8],bs[9],bs[10],bs[11],bs[12],bs[13],bs[14],bs[15]); +} + + +void deco102_decrypt_cpu(int address_xor, int data_select_xor, int opcode_select_xor) +{ + int i; + UINT16 *rom = (UINT16 *)memory_region(REGION_CPU1); + int size = memory_region_length(REGION_CPU1); + UINT16 *opcodes = auto_malloc(size); + UINT16 *buf = (UINT16 *)malloc(size); + + memcpy(buf, rom, size); + memory_set_opcode_base(0,opcodes); + memory_set_encrypted_opcode_range(0,0,memory_region_length(REGION_CPU1)); + + for (i = 0; i < size / 2; i++) + { + int src; + + /* calculate address of encrypted word in ROM*/ + src = i & 0xf0000; + if (i & 0x0001) src ^= 0xbe0b; + if (i & 0x0002) src ^= 0x5699; + if (i & 0x0004) src ^= 0x1322; + if (i & 0x0008) src ^= 0x0004; + if (i & 0x0010) src ^= 0x08a0; + if (i & 0x0020) src ^= 0x0089; + if (i & 0x0040) src ^= 0x0408; + if (i & 0x0080) src ^= 0x1212; + if (i & 0x0100) src ^= 0x08e0; + if (i & 0x0200) src ^= 0x5499; + if (i & 0x0400) src ^= 0x9a8b; + if (i & 0x0800) src ^= 0x1222; + if (i & 0x1000) src ^= 0x1200; + if (i & 0x2000) src ^= 0x0008; + if (i & 0x4000) src ^= 0x1210; + if (i & 0x8000) src ^= 0x00e0; + src ^= address_xor; + + rom[i] = decrypt2(buf[src], i, data_select_xor); + opcodes[i] = decrypt2(buf[src], i, opcode_select_xor); + } + + free(buf); +} + + +void deco156_decrypt(void) +{ + UINT32 *rom = (UINT32 *)memory_region(REGION_CPU1); + int length = memory_region_length(REGION_CPU1); + UINT32 *buf = (UINT32*)malloc(length); + + memcpy(buf, rom, length); + decrypt(buf, rom, length); + free(buf); +} + void deco56_decrypt(int region) { - deco_decrypt(region,deco56_xor_table,deco56_address_table,deco56_swap_table); + deco_decrypt(region,deco56_xor_table,deco56_address_table,deco56_swap_table,0); } void deco74_decrypt(int region) { - deco_decrypt(region,deco74_xor_table,deco74_address_table,deco74_swap_table); + deco_decrypt(region,deco74_xor_table,deco74_address_table,deco74_swap_table,0); +} + +void deco56_remap_gfx(int region) +{ + /* Apply address remap, but not XOR/shift*/ + deco_decrypt(region,deco56_xor_table,deco56_address_table,deco56_swap_table, 1); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/eeprom.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/eeprom.c
Changed
@@ -1,6 +1,7 @@ #include "driver.h" #include "eeprom.h" #include "state.h" +#include "bootstrap.h" #define VERBOSE 0 @@ -19,17 +20,6 @@ static int locked; static int reset_delay; -static const unsigned char bubblem_bootstrap_nvram[] = { - 84, 65, 73, 84, 79, 3, 48, 49, 49, 48,224, 1, 17, 18, 48, 0, 0, 0, - 2, 4,255,247, 34, 18, 0, 0, 0, 0, 0, 0,108,231,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255, -}; - /* EEPROM_command_match: @@ -110,22 +100,7 @@ { EEPROM_init(&eeprom_interface_93C46); if (file) - EEPROM_load(file); - else if(strcasecmp(Machine->gamedrv->name, "bubblem") == 0) - { - log_cb(RETRO_LOG_INFO, "[MAME 2003] Generating bootstrap nvram for bubblem"); - /* - I couldn't get rungun to accept nvram loaded directly from a byte array in memory. - Therefore for now bubblem is handled the same way for expedience - since I am not trying the other way. --markwkidd - */ - file = mame_fopen(Machine->gamedrv->name, 0, FILETYPE_NVRAM, 1); - mame_fwrite(file, bubblem_bootstrap_nvram, sizeof(bubblem_bootstrap_nvram)); - mame_fclose(file); - - file = mame_fopen(Machine->gamedrv->name, 0, FILETYPE_NVRAM, 0); - EEPROM_load(file); - } + EEPROM_load(file); } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/harddriv_machine.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/harddriv_machine.c
Changed
@@ -56,7 +56,7 @@ data16_t *st68k_sloop_alt_base; data16_t *hdgsp_protection; -data16_t *stmsp_sync[2]; +data16_t *stmsp_sync[3]; data16_t *hdgsp_speedup_addr[2]; offs_t hdgsp_speedup_pc;
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/midtunit_machine.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/midtunit_machine.c
Changed
@@ -632,8 +632,8 @@ break; case SOUND_DCS: - dcs_reset_w(1); dcs_reset_w(0); + dcs_reset_w(1); break; } } @@ -695,7 +695,7 @@ case SOUND_DCS: //logerror("%08X:Sound write = %04X\n", activecpu_get_pc(), data); - dcs_reset_w(~data & 0x100); + dcs_reset_w(data & 0x100); dcs_data_w(data & 0xff); /* the games seem to check for $82 loops, so this should be just barely enough */ fake_sound_state = 128;
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/midwayic.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/midwayic.c
Changed
@@ -72,7 +72,7 @@ UINT8 irq_state; UINT16 sound_irq_state; UINT8 auto_ack; - + UINT16 fifo[FIFO_SIZE]; UINT16 fifo_in; UINT16 fifo_out; @@ -487,13 +487,13 @@ ioasic.shuffle_map = &shuffle_maps[shuffle][0]; ioasic.auto_ack = 0; ioasic.irq_callback = irq_callback; - + /* initialize the PIC */ midway_serial_pic2_init(upper, yearoffs); - + /* reset the chip */ midway_ioasic_reset(); - + /* configure the fifo */ if (ioasic.has_dcs) { @@ -501,7 +501,7 @@ dcs_set_io_callbacks(ioasic_output_full, ioasic_input_empty); } ioasic_fifo_reset_w(1); - + /* configure the CAGE IRQ */ if (ioasic.has_cage) cage_set_irq_handler(cage_irq_handler); @@ -530,7 +530,7 @@ UINT16 fifo_state = ioasic_fifo_status_r(); UINT16 irqbits = 0x2000; UINT8 new_state; - + irqbits |= ioasic.sound_irq_state; if (fifo_state & 8) irqbits |= 0x0008; @@ -538,7 +538,7 @@ irqbits |= 0x0001; ioasic.reg[IOASIC_INTSTAT] = irqbits; - + new_state = ((ioasic.reg[IOASIC_INTCTL] & 0x0001) != 0) && ((ioasic.reg[IOASIC_INTSTAT] & ioasic.reg[IOASIC_INTCTL] & 0x3ffe) != 0); if (new_state != ioasic.irq_state) { @@ -593,7 +593,7 @@ static UINT16 ioasic_fifo_r(void) { UINT16 result = 0; - + /* we can only read data if there's some to read! */ if (ioasic.fifo_bytes != 0) { @@ -604,7 +604,7 @@ if (LOG_FIFO && (ioasic.fifo_bytes < 4 || ioasic.fifo_bytes >= FIFO_SIZE - 4)) logerror("fifo_r(%04X): FIFO bytes = %d!\n", result, ioasic.fifo_bytes); - + /* if we just cleared the buffer, this may generate an IRQ on the master CPU */ /* because of the way the streaming code works, we need to make sure that the */ /* next status read indicates an empty buffer, even if we've timesliced and the */ @@ -628,14 +628,14 @@ static UINT16 ioasic_fifo_status_r(void) { UINT16 result = 0; - + if (ioasic.fifo_bytes == 0) result |= 0x08; if (ioasic.fifo_bytes >= FIFO_SIZE/2) result |= 0x10; if (ioasic.fifo_bytes >= FIFO_SIZE) result |= 0x20; - + /* kludge alert: if we're reading this from the DCS CPU itself, and we recently cleared */ /* the FIFO, and we're within 16 instructions of the read that cleared the FIFO, make */ /* sure the FIFO clear bit is set */ @@ -710,7 +710,7 @@ READ32_HANDLER( midway_ioasic_r ) { data32_t result; - + offset = ioasic.shuffle_active ? ioasic.shuffle_map[offset & 15] : offset; result = ioasic.reg[offset]; @@ -727,19 +727,19 @@ result |= 0x2000; } break; - + case IOASIC_PORT1: result = readinputport(1); break; - + case IOASIC_PORT2: result = readinputport(2); break; - + case IOASIC_PORT3: result = readinputport(3); break; - + case IOASIC_SOUNDSTAT: /* status from sound CPU */ result = 0; @@ -773,11 +773,11 @@ result = val = ~val; } break; - + case IOASIC_PICIN: result = midway_serial_pic2_r() | (midway_serial_pic2_status_r() << 8); break; - + default: break; } @@ -801,7 +801,7 @@ WRITE32_HANDLER( midway_ioasic_w ) { UINT32 oldreg, newreg; - + offset = ioasic.shuffle_active ? ioasic.shuffle_map[offset & 15] : offset; oldreg = ioasic.reg[offset]; COMBINE_DATA(&ioasic.reg[offset]); @@ -822,25 +822,25 @@ ioasic.reg[IOASIC_UNKNOWN4] = 0; /* bug in 10th Degree assumes this */ } break; - + case IOASIC_PORT2: case IOASIC_PORT3: /* ignore writes here if we're not shuffling yet */ if (!ioasic.shuffle_active) break; break; - + case IOASIC_DEBUGOUT: if (PRINTF_DEBUG) printf("%c", data & 0xff); break; - + case IOASIC_SOUNDCTL: /* sound reset? */ if (ioasic.has_dcs) { - dcs_reset_w(~newreg & 1); - + dcs_reset_w(newreg & 1); + } else if (ioasic.has_cage) { @@ -851,7 +851,7 @@ cage_control_w(3); } } - + /* FIFO reset? */ ioasic_fifo_reset_w(~newreg & 4); break; @@ -871,7 +871,7 @@ case IOASIC_PICOUT: midway_serial_pic2_w(newreg); break; - + case IOASIC_INTCTL: /* interrupt enables */ /* bit 0 = global interrupt enable */ @@ -929,5 +929,5 @@ /* everything else is byte-sized */ else - ide_controller32_0_w(ideoffs, data << shift, ~(0xff << shift));; + ide_controller32_0_w(ideoffs, data << shift, ~(0xff << shift)); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/midwunit_machine.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/midwunit_machine.c
Changed
@@ -122,7 +122,7 @@ logerror("%08X:Control W @ %05X = %04X\n", activecpu_get_pc(), offset, data); /* bit 4 reset sound CPU */ - dcs_reset_w(newword & 0x10); + dcs_reset_w(~newword & 0x10); /* bit 5 (active low) reset security chip */ midway_serial_pic_reset_w(newword & 0x20); @@ -170,6 +170,10 @@ WRITE16_HANDLER( midxunit_unknown_w ) { int offs = offset / 0x40000; + + if (offs == 1 && ACCESSING_LSB) + dcs_reset_w(~data & 2); + if (ACCESSING_LSB && offset % 0x40000 == 0) logerror("%08X:midxunit_unknown_w @ %d = %02X\n", activecpu_get_pc(), offs, data & 0xff); } @@ -410,6 +414,33 @@ /********************** Mortal Kombat 3 **********************/ +static UINT16 *umk3_palette; + +static WRITE16_HANDLER( umk3_palette_hack_w ) +{ + /* + UMK3 uses a circular buffer to hold pending palette changes; the buffer holds 17 entries + total, and the buffer is processed/cleared during the video interrupt. Most of the time, + 17 entries is enough. However, when characters are unlocked, or a number of characters are + being displayed, the circular buffer sometimes wraps, losing the first 17 palette changes. + + This bug manifests itself on a real PCB, but only rarely; whereas in MAME, it manifests + itself very frequently. This is due to the fact that the instruction timing for the TMS34010 + is optimistic and assumes that the instruction cache is always fully populated. Without + full cache level emulation of the chip, there is no hope of fixing this issue without a + hack. + + Thus, the hack. To slow down the CPU when it is adding palette entries to the list, we + install this write handler on the memory locations where the start/end circular buffer + pointers live. Each time they are written to, we penalize the main CPU a number of cycles. + Although not realistic, this is sufficient to reduce the frequency of incorrect colors + without significantly impacting the rest of the system. + */ + COMBINE_DATA(&umk3_palette[offset]); + activecpu_adjust_icount(-100); +/* printf("in=%04X%04X out=%04X%04X\n", umk3_palette[3], umk3_palette[2], umk3_palette[1], umk3_palette[0]); */ +} + static void init_mk3_common(void) { /* common init */ @@ -441,14 +472,22 @@ { init_mk3_common(); INSTALL_SPEEDUP_3(0x106a0e0, 0xff9696a0, 0x105dc10, 0x105dc30, 0x105dc50); + umk3_palette = install_mem_write16_handler(0, 0x0106a060, 0x0106a09f, umk3_palette_hack_w); } DRIVER_INIT( umk3r11 ) { init_mk3_common(); INSTALL_SPEEDUP_3(0x106a0e0, 0xff969680, 0x105dc10, 0x105dc30, 0x105dc50); + umk3_palette = install_mem_write16_handler(0, 0x0106a060, 0x0106a09f, umk3_palette_hack_w); } +DRIVER_INIT( umk3p ) +{ + init_mk3_common(); + INSTALL_SPEEDUP_3(0x106a0e0, 0xff9696a0, 0x105dc10, 0x105dc30, 0x105dc50); + umk3_palette = install_mem_write16_handler(0, 0x0106a060, 0x0106a09f, umk3_palette_hack_w); +} /********************** 2 On 2 Open Ice Challenge **********************/ @@ -614,8 +653,8 @@ int i; /* reset sound */ - dcs_reset_w(1); dcs_reset_w(0); + dcs_reset_w(1); /* reset I/O shuffling */ for (i = 0; i < 16; i++)
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/namcos1_machine.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/namcos1_machine.c
Changed
@@ -1279,7 +1279,7 @@ scanptr[7] = 0xfc; srcptr = scanptr + 8; - logerror ("faulty loop patched at %06x\n", scanptr-rombase+7); + log_cb(RETRO_LOG_WARN, LOGPRE "faulty loop patched at %l\n", scanptr-rombase+7); } else srcptr = scanptr + 1;
View file
libretro-mame2003-0~git20200805.tar.xz/src/machine/psx_machine.c -> libretro-mame2003-0~git20210529.tar.xz/src/machine/psx_machine.c
Changed
@@ -455,7 +455,7 @@ static void sio_interrupt( int n_port ) { - verboselog( 1, "sio_interrupt( %d ) %08x\n", n_port ); + verboselog( 1, "sio_interrupt( %d )\n", n_port ); m_p_n_sio_status[ n_port ] |= ( 1 << 9 ); psx_irq_set( 0x80 ); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/mame2003/frontend_list.h -> libretro-mame2003-0~git20210529.tar.xz/src/mame2003/frontend_list.h
Changed
@@ -9,2281 +9,2283 @@ int available; }; -#define NUMGAMES 2270 +#define NUMGAMES 2272 struct fe_driver fe_drivers[NUMGAMES] = { -{ "'88 Games" ,"88games" , "mame", 3, 0 } , -{ "'99 The Last War (alternate)" ,"99lstwra" , "mame", 3, 0 } , -{ "'99 The Last War" ,"99lstwar" , "mame", 3, 0 } , -{ "005" ,"005" , "mame", 1, 0 } , -{ "10 Yard Fight (Vs. version 11/05/84)" ,"vsyard" , "mame", 3, 0 } , -{ "10 Yard Fight (Vs. version, set 2)" ,"vsyard2" , "mame", 3, 0 } , -{ "10 Yard Fight" ,"yard" , "mame", 3, 0 } , -{ "1941 - Counter Attack (Japan)" ,"1941j" , "mame", 3, 0 } , -{ "1941 - Counter Attack (World)" ,"1941" , "mame", 3, 0 } , -{ "1942 (set 1)" ,"1942" , "mame", 5, 0 } , -{ "1942 (set 2)" ,"1942a" , "mame", 5, 0 } , -{ "1942 (set 3)" ,"1942b" , "mame", 5, 0 } , -{ "1943 - The Battle of Midway (Japan)" ,"1943j" , "mame", 3, 0 } , -{ "1943 - The Battle of Midway (US)" ,"1943" , "mame", 3, 0 } , -{ "1943 Kai" ,"1943kai" , "mame", 3, 0 } , -{ "2 On 2 Open Ice Challenge (rev 1.21)" ,"openice" , "mame", 3, 0 } , -{ "2020 Super Baseball (set 1)" ,"2020bb" , "neomame", 3, 0 } , -{ "2020 Super Baseball (set 2)" ,"2020bbh" , "neomame", 3, 0 } , -{ "3 Count Bout / Fire Suplex" ,"3countb" , "neomame", 3, 0 } , -{ "4 Player Bowling" ,"bowler" , "mame", 3, 0 } , -{ "4-D Warriors" ,"4dwarrio" , "mame", 1, 0 } , -{ "600" ,"600" , "mame", 3, 0 } , -{ "64th. Street - A Detective Story (Japan)" ,"64streej" , "mame", 3, 0 } , -{ "64th. Street - A Detective Story (World)" ,"64street" , "mame", 3, 0 } , -{ "720 Degrees (set 1)" ,"720" , "mame", 3, 0 } , -{ "720 Degrees (set 2)" ,"720b" , "mame", 3, 0 } , -{ "800 Fathoms" ,"800fath" , "mame", 3, 0 } , -{ "APB - All Points Bulletin (set 1)" ,"apb" , "mame", 3, 0 } , -{ "APB - All Points Bulletin (set 2)" ,"apb2" , "mame", 3, 0 } , -{ "ASO - Armored Scrum Object" ,"aso" , "mame", 3, 0 } , -{ "Act-Fancer Cybernetick Hyper Weapon (Japan revision 1)" ,"actfancj" , "mame", 3, 0 } , -{ "Act-Fancer Cybernetick Hyper Weapon (World revision 1)" ,"actfanc1" , "mame", 3, 0 } , -{ "Act-Fancer Cybernetick Hyper Weapon (World revision 2)" ,"actfancr" , "mame", 3, 0 } , -{ "Adventure Quiz 2 Hatena Hatena no Dai-Bouken (Japan)" ,"hatena" , "mame", 1, 0 } , -{ "Aero Fighters (Turbo Force hardware set 1)" ,"aerofgtb" , "mame", 1, 0 } , -{ "Aero Fighters (Turbo Force hardware set 2)" ,"aerofgtc" , "mame", 1, 0 } , -{ "Aero Fighters 2 / Sonic Wings 2" ,"sonicwi2" , "neomame", 1, 0 } , -{ "Aero Fighters 3 / Sonic Wings 3" ,"sonicwi3" , "neomame", 1, 0 } , -{ "Aero Fighters" ,"aerofgt" , "mame", 1, 0 } , -{ "Aeroboto" ,"aeroboto" , "mame", 3, 0 } , -{ "Aggressors of Dark Kombat / Tsuukai GANGAN Koushinkyoku" ,"aodk" , "neomame", 3, 0 } , -{ "Ah Eikou no Koshien (Japan)" ,"koshien" , "mame", 3, 0 } , -{ "Air Buster (Japan)" ,"airbustr" , "mame", 3, 0 } , -{ "Air Duel (Japan)" ,"airduel" , "mame", 1, 0 } , -{ "Air Wolf" ,"airwolf" , "mame", 3, 0 } , -{ "Ajax (Japan)" ,"ajaxj" , "mame", 3, 0 } , -{ "Ajax" ,"ajax" , "mame", 3, 0 } , -{ "Akuma-Jou Dracula (Japan)" ,"hcastlej" , "mame", 3, 0 } , -{ "Alcon" ,"alcon" , "mame", 3, 0 } , -{ "Ales no Tsubasa (Japan)" ,"lwingsjp" , "mame", 5, 0 } , -{ "Alex Kidd (set 1)" ,"alexkidd" , "mame", 3, 0 } , -{ "Alex Kidd (set 2)" ,"alexkida" , "mame", 3, 0 } , -{ "Ali Baba and 40 Thieves" ,"alibaba" , "mame", 3, 0 } , -{ "Alien Invasion Part II" ,"alieninv" , "mame", 3, 0 } , -{ "Alien Storm (2 Player)" ,"astorm2p" , "mame", 1, 0 } , -{ "Alien Storm (bootleg)" ,"astormbl" , "mame", 1, 0 } , -{ "Alien Storm" ,"astorm" , "mame", 1, 0 } , -{ "Alien Syndrome (Japan)" ,"aliensyj" , "mame", 1, 0 } , -{ "Alien Syndrome (set 1)" ,"aliensyn" , "mame", 1, 0 } , -{ "Alien Syndrome (set 2)" ,"aliensya" , "mame", 1, 0 } , -{ "Alien Syndrome (set 3)" ,"aliensyb" , "mame", 1, 0 } , -{ "Aliens (Japan)" ,"aliensj" , "mame", 3, 0 } , -{ "Aliens (US)" ,"aliensu" , "mame", 3, 0 } , -{ "Aliens (World set 1)" ,"aliens" , "mame", 3, 0 } , -{ "Aliens (World set 2)" ,"aliens2" , "mame", 3, 0 } , -{ "All American Football (rev B)" ,"aafbb" , "mame", 3, 0 } , -{ "All American Football (rev D, 2 Players)" ,"aafbd2p" , "mame", 3, 0 } , -{ "All American Football (rev E)" ,"aafb" , "mame", 3, 0 } , -{ "Alley Master" ,"alleymas" , "mame", 1, 0 } , -{ "Alpha Mission II / ASO II - Last Guardian" ,"alpham2" , "neomame", 3, 0 } , -{ "Alpine Ski (set 1)" ,"alpine" , "mame", 3, 0 } , -{ "Alpine Ski (set 2)" ,"alpinea" , "mame", 3, 0 } , -{ "Altered Beast (Version 1)" ,"altbeast" , "mame", 1, 0 } , -{ "Altered Beast (Version 2)" ,"altbeas2" , "mame", 1, 0 } , -{ "Amazing Maze" ,"maze" , "mame", 3, 0 } , -{ "Ambush" ,"ambush" , "mame", 3, 0 } , -{ "American Horseshoes (US)" ,"horshoes" , "mame", 3, 0 } , -{ "Amidar (Olympia)" ,"amidaro" , "mame", 3, 0 } , -{ "Amidar (Scramble hardware)" ,"amidars" , "mame", 3, 0 } , -{ "Amidar (Stern)" ,"amidaru" , "mame", 3, 0 } , -{ "Amidar" ,"amidar" , "mame", 3, 0 } , -{ "Amigo" ,"amigo" , "mame", 3, 0 } , -{ "Andro Dunos" ,"androdun" , "neomame", 3, 0 } , -{ "Anteater" ,"anteater" , "mame", 3, 0 } , -{ "Appoooh" ,"appoooh" , "mame", 3, 0 } , -{ "Arabian (Atari)" ,"arabiana" , "mame", 3, 0 } , -{ "Arabian" ,"arabian" , "mame", 3, 0 } , -{ "Arbalester" ,"arbalest" , "mame", 3, 0 } , -{ "Arcade Classics (prototype)" ,"arcadecl" , "mame", 3, 0 } , -{ "Arch Rivals (rev 2.0)" ,"archriv2" , "mame", 3, 0 } , -{ "Arch Rivals (rev 4.0)" ,"archrivl" , "mame", 3, 0 } , -{ "Area 88 (Japan)" ,"area88" , "mame", 3, 0 } , -{ "Argus" ,"argus" , "mame", 1, 0 } , -{ "Argus no Senshi (Japan)" ,"rygarj" , "mame", 3, 0 } , -{ "Ark Area" ,"arkarea" , "mame", 1, 0 } , -{ "Arkanoid (Game Corporation bootleg)" ,"arkangc" , "mame", 3, 0 } , -{ "Arkanoid (Japan)" ,"arknoidj" , "mame", 3, 0 } , -{ "Arkanoid (Japanese bootleg Set 2)" ,"arkbl2" , "mame", 3, 0 } , -{ "Arkanoid (Tayto bootleg, Japanese)" ,"arkatayt" , "mame", 3, 0 } , -{ "Arkanoid (US)" ,"arknoidu" , "mame", 3, 0 } , -{ "Arkanoid (World)" ,"arkanoid" , "mame", 3, 0 } , -{ "Arkanoid - Revenge of DOH (Japan)" ,"ark2jp" , "mame", 3, 0 } , -{ "Arkanoid - Revenge of DOH (US)" ,"ark2us" , "mame", 3, 0 } , -{ "Arkanoid - Revenge of DOH (World)" ,"arkanoi2" , "mame", 3, 0 } , -{ "Arm Wrestling" ,"armwrest" , "mame", 1, 0 } , -{ "Armed Formation" ,"armedf" , "mame", 3, 0 } , -{ "Armor Attack" ,"armora" , "mame", 3, 0 } , -{ "Armored Car (set 1)" ,"armorcar" , "mame", 3, 0 } , -{ "Armored Car (set 2)" ,"armorca2" , "mame", 3, 0 } , -{ "Art of Fighting / Ryuuko no Ken" ,"aof" , "neomame", 3, 0 } , -{ "Art of Fighting 2 / Ryuuko no Ken 2" ,"aof2" , "neomame", 3, 0 } , -{ "Art of Fighting 3 - The Path of the Warrior / Art of Fighting - Ryuuko no Ken Gaiden" ,"aof3" , "neomame", 3, 0 } , -{ "Ashura Blaster (Japan)" ,"ashura" , "mame", 3, 0 } , -{ "Ashura Blaster (US)" ,"ashurau" , "mame", 3, 0 } , -{ "Assault (Japan)" ,"assaultj" , "mame", 3, 0 } , -{ "Assault Plus (Japan)" ,"assaultp" , "mame", 3, 0 } , -{ "Assault" ,"assault" , "mame", 3, 0 } , -{ "Asteroids (bootleg on Lunar Lander hardware)" ,"asteroib" , "mame", 3, 0 } , -{ "Asteroids (rev 1)" ,"asteroi1" , "mame", 3, 0 } , -{ "Asteroids (rev 2)" ,"asteroid" , "mame", 3, 0 } , -{ "Asteroids Deluxe (rev 1)" ,"astdelu1" , "mame", 3, 0 } , -{ "Asteroids Deluxe (rev 2)" ,"astdelux" , "mame", 3, 0 } , -{ "Astro Blaster (version 1)" ,"astrob1" , "mame", 1, 0 } , -{ "Astro Blaster (version 2)" ,"astrob2" , "mame", 1, 0 } , -{ "Astro Blaster (version 3)" ,"astrob" , "mame", 1, 0 } , -{ "Astro Fighter (set 1)" ,"astrof" , "mame", 3, 0 } , -{ "Astro Fighter (set 2)" ,"astrof2" , "mame", 3, 0 } , -{ "Astro Fighter (set 3)" ,"astrof3" , "mame", 3, 0 } , -{ "Astro Invader" ,"astinvad" , "mame", 3, 0 } , -{ "Astyanax, The" ,"astyanax" , "mame", 3, 0 } , -{ "Atari Baseball (set 1)" ,"abaseb" , "mame", 3, 0 } , -{ "Atari Baseball (set 2)" ,"abaseb2" , "mame", 3, 0 } , -{ "Atari Football (4 players)" ,"atarifb4" , "mame", 3, 0 } , -{ "Atari Football (revision 1)" ,"atarifb1" , "mame", 3, 0 } , -{ "Atari Football (revision 2)" ,"atarifb" , "mame", 3, 0 } , -{ "Atari Soccer" ,"soccer" , "mame", 3, 0 } , -{ "Ataxx (Japan)" ,"ataxxj" , "mame", 1, 0 } , -{ "Ataxx (set 1)" ,"ataxx" , "mame", 1, 0 } , -{ "Ataxx (set 2)" ,"ataxxa" , "mame", 1, 0 } , -{ "Athena" ,"athena" , "mame", 3, 0 } , -{ "Atomic Point" ,"atomicp" , "mame", 3, 0 } , -{ "Aurail (set 1)" ,"aurail" , "mame", 1, 0 } , -{ "Aurail (set 2)" ,"auraila" , "mame", 1, 0 } , -{ "Avalanche" ,"avalnche" , "mame", 3, 0 } , -{ "Avengers (set 1)" ,"avengers" , "mame", 3, 0 } , -{ "Avengers (set 2)" ,"avenger2" , "mame", 3, 0 } , -{ "Avenging Spirit" ,"avspirit" , "mame", 3, 0 } , -{ "Aztarac" ,"aztarac" , "mame", 3, 0 } , -{ "Azurian Attack" ,"azurian" , "mame", 3, 0 } , -{ "Bad Dudes vs. Dragonninja (US)" ,"baddudes" , "mame", 3, 0 } , -{ "Bad Lands" ,"badlands" , "mame", 3, 0 } , -{ "Bagman (Stern set 1)" ,"bagmans" , "mame", 3, 0 } , -{ "Bagman (Stern set 2)" ,"bagmans2" , "mame", 3, 0 } , -{ "Bagman" ,"bagman" , "mame", 3, 0 } , -{ "Bakatonosama Mahjong Manyuki" ,"bakatono" , "neomame", 3, 0 } , -{ "Balloon Bomber" ,"ballbomb" , "mame", 3, 0 } , -{ "Baluba-louk no Densetsu" ,"baluba" , "mame", 1, 0 } , -{ "Bandido" ,"bandido" , "mame", 3, 0 } , -{ "Bank Panic" ,"bankp" , "mame", 3, 0 } , -{ "Baraduke" ,"baraduke" , "mame", 3, 0 } , -{ "Barrier" ,"barrier" , "mame", 3, 0 } , -{ "Baseball Stars 2" ,"bstars2" , "neomame", 3, 0 } , -{ "Baseball Stars Professional" ,"bstars" , "neomame", 3, 0 } , -{ "Baseball The Season II" ,"basebal2" , "mame", 1, 0 } , -{ "Basketball" ,"bsktball" , "mame", 3, 0 } , -{ "Batman" ,"batman" , "mame", 3, 0 } , -{ "Batsugun" ,"batsugun" , "mame", 1, 0 } , -{ "Batsugun Special Ver." ,"batugnsp" , "mame", 3, 0 } , -{ "Battlantis (Japan)" ,"battlntj" , "mame", 3, 0 } , -{ "Battlantis" ,"battlnts" , "mame", 3, 0 } , -{ "Battle Chopper" ,"bchopper" , "mame", 1, 0 } , -{ "Battle Field (Japan)" ,"btlfield" , "mame", 3, 0 } , -{ "Battle Flip Shot" ,"flipshot" , "neomame", 3, 0 } , -{ "Battle Lane Vol. 5 (set 1)" ,"battlane" , "mame", 3, 0 } , -{ "Battle Lane Vol. 5 (set 2)" ,"battlan2" , "mame", 3, 0 } , -{ "Battle Lane Vol. 5 (set 3)" ,"battlan3" , "mame", 3, 0 } , -{ "Battle Rangers (World)" ,"battlera" , "mame", 3, 0 } , -{ "Battle Zone (set 1)" ,"bzone" , "mame", 3, 0 } , -{ "Battle Zone (set 2)" ,"bzone2" , "mame", 3, 0 } , -{ "Battle of Atlantis (set 1)" ,"atlantis" , "mame", 3, 0 } , -{ "Battle of Atlantis (set 2)" ,"atlants2" , "mame", 3, 0 } , -{ "Battle-Road, The" ,"battroad" , "mame", 3, 0 } , -{ "Bay Route (bootleg set 1)" ,"bayrtbl1" , "mame", 3, 0 } , -{ "Bay Route (bootleg set 2)" ,"bayrtbl2" , "mame", 3, 0 } , -{ "Bay Route (set 1)" ,"bayroute" , "mame", 3, 0 } , -{ "Bay Route (set 2)" ,"bayrouta" , "mame", 3, 0 } , -{ "Beastie Feastie" ,"beastf" , "mame", 1, 0 } , -{ "Bells & Whistles" ,"blswhstl" , "mame", 3, 0 } , -{ "Beraboh Man (Japan)" ,"berabohm" , "mame", 3, 0 } , -{ "Berlin Wall, The (set 1)" ,"berlwall" , "mame", 3, 0 } , -{ "Berlin Wall, The (set 2)" ,"berlwalt" , "mame", 3, 0 } , -{ "Bermuda Triangle (Japan)" ,"bermudaj" , "mame", 3, 0 } , -{ "Bermuda Triangle (US early version)" ,"bermudaa" , "mame", 3, 0 } , -{ "Bermuda Triangle (US)" ,"bermudat" , "mame", 3, 0 } , -{ "Berzerk (set 1)" ,"berzerk" , "mame", 3, 0 } , -{ "Berzerk (set 2)" ,"berzerk1" , "mame", 3, 0 } , -{ "Big Karnak" ,"bigkarnk" , "mame", 3, 0 } , -{ "Big Pro Wrestling!, The" ,"bigprowr" , "mame", 3, 0 } , -{ "Big Striker" ,"bigstrik" , "mame", 3, 0 } , -{ "Billiards, The" ,"billiard" , "mame", 3, 0 } , -{ "Bio Attack" ,"bioatack" , "mame", 3, 0 } , -{ "Biomechanical Toy (unprotected)" ,"biomtoy" , "mame", 3, 0 } , -{ "Bionic Commando (US set 1)" ,"bionicc" , "mame", 3, 0 } , -{ "Bionic Commando (US set 2)" ,"bionicc2" , "mame", 3, 0 } , -{ "Birdie King 2" ,"bking2" , "mame", 3, 0 } , -{ "Black Dragon (bootleg)" ,"blkdrgnb" , "mame", 3, 0 } , -{ "Black Dragon" ,"blkdrgon" , "mame", 3, 0 } , -{ "Black Hole" ,"blkhole" , "mame", 3, 0 } , -{ "Black Tiger (bootleg)" ,"bktigerb" , "mame", 3, 0 } , -{ "Black Tiger" ,"blktiger" , "mame", 3, 0 } , -{ "Black Widow" ,"bwidow" , "mame", 3, 0 } , -{ "Blade Master (World)" ,"bmaster" , "mame", 3, 0 } , -{ "Blades of Steel (version E)" ,"bladstle" , "mame", 3, 0 } , -{ "Blades of Steel (version T)" ,"bladestl" , "mame", 3, 0 } , -{ "Blandia [Prototype]" ,"blandia" , "mame", 3, 0 } , -{ "Blast Off (Japan)" ,"blastoff" , "mame", 3, 0 } , -{ "Blasted" ,"blasted" , "mame", 3, 0 } , -{ "Blaster" ,"blaster" , "mame", 3, 0 } , -{ "Blasteroids (version 2)" ,"blstroi2" , "mame", 3, 0 } , -{ "Blasteroids (version 4)" ,"blstroid" , "mame", 3, 0 } , -{ "Blasteroids (with heads)" ,"blsthead" , "mame", 3, 0 } , -{ "Blasto" ,"blasto" , "mame", 3, 0 } , -{ "Blazer (Japan)" ,"blazer" , "mame", 3, 0 } , -{ "Blazing Star" ,"blazstar" , "neomame", 3, 0 } , -{ "Block (Game Corporation bootleg)" ,"arkbloc2" , "mame", 3, 0 } , -{ "Block Block (Japan)" ,"blockj" , "mame", 1, 0 } , -{ "Block Block (World)" ,"block" , "mame", 1, 0 } , -{ "Block Block (bootleg)" ,"blockbl" , "mame", 1, 0 } , -{ "Block Gal (bootleg)" ,"blckgalb" , "mame", 3, 0 } , -{ "Block Gal" ,"blockgal" , "mame", 3, 0 } , -{ "Block Hole" ,"blockhl" , "mame", 3, 0 } , -{ "Block Out (set 1)" ,"blockout" , "mame", 3, 0 } , -{ "Block Out (set 2)" ,"blckout2" , "mame", 3, 0 } , -{ "Blockade" ,"blockade" , "mame", 3, 0 } , -{ "Blocken (Japan)" ,"blocken" , "mame", 3, 0 } , -{ "Blood Bros." ,"bloodbro" , "mame", 1, 0 } , -{ "Bloody Wolf (US)" ,"bldwolf" , "mame", 3, 0 } , -{ "Blue Print (Jaleco)" ,"blueprnj" , "mame", 3, 0 } , -{ "Blue Print (Midway)" ,"blueprnt" , "mame", 3, 0 } , -{ "Blue Shark" ,"blueshrk" , "mame", 3, 0 } , -{ "Blue's Journey / Raguy" ,"bjourney" , "neomame", 3, 0 } , -{ "Bobble Bobble" ,"boblbobl" , "mame", 3, 0 } , -{ "Body Slam" ,"bodyslam" , "mame", 1, 0 } , -{ "Bogey Manor" ,"bogeyman" , "mame", 3, 0 } , -{ "Bomb Bee" ,"bombbee" , "mame", 3, 0 } , -{ "Bomb Jack (set 1)" ,"bombjack" , "mame", 3, 0 } , -{ "Bomb Jack (set 2)" ,"bombjac2" , "mame", 3, 0 } , -{ "Bombjack Twin" ,"bjtwin" , "mame", 3, 0 } , -{ "Boot Camp" ,"bootcamp" , "mame", 3, 0 } , -{ "Boot Hill" ,"boothill" , "mame", 3, 0 } , -{ "Bosconian (Midway, new version)" ,"boscomd" , "mame", 3, 0 } , -{ "Bosconian (Midway, old version)" ,"boscomdo" , "mame", 3, 0 } , -{ "Bosconian (new version)" ,"bosco" , "mame", 3, 0 } , -{ "Bosconian (old version)" ,"boscoo" , "mame", 3, 0 } , -{ "Bosconian (older version)" ,"boscoo2" , "mame", 3, 0 } , -{ "Bottom of the Ninth (version N)" ,"bottom9n" , "mame", 3, 0 } , -{ "Bottom of the Ninth (version T)" ,"bottom9" , "mame", 3, 0 } , -{ "Boulder Dash / Boulder Dash Part 2 (World)" ,"bouldash" , "mame", 3, 0 } , -{ "Bowl-O-Rama" ,"bowlrama" , "mame", 3, 0 } , -{ "Boxing Bugs" ,"boxingb" , "mame", 3, 0 } , -{ "Brain" ,"brain" , "mame", 3, 0 } , -{ "Break Thru (US)" ,"brkthru" , "mame", 3, 0 } , -{ "Breakers Revenge" ,"breakrev" , "neomame", 3, 0 } , -{ "Breakers" ,"breakers" , "neomame", 3, 0 } , -{ "Breywood (Japan revision 2)" ,"breywood" , "mame", 3, 0 } , -{ "Brix" ,"brix" , "mame", 3, 0 } , -{ "Brute Force" ,"brutforc" , "mame", 1, 0 } , -{ "Bubble Bobble (US with mode select)" ,"bublbobr" , "mame", 3, 0 } , -{ "Bubble Bobble (US)" ,"bubbobr1" , "mame", 3, 0 } , -{ "Bubble Bobble" ,"bublbobl" , "mame", 3, 0 } , -{ "Bubbles (Solid Red label)" ,"bubblesr" , "mame", 3, 0 } , -{ "Bubbles" ,"bubbles" , "mame", 3, 0 } , -{ "Bump 'n' Jump" ,"bnj" , "mame", 3, 0 } , -{ "Burger Time (Data East set 1)" ,"btime" , "mame", 3, 0 } , -{ "Burger Time (Data East set 2)" ,"btime2" , "mame", 3, 0 } , -{ "Burger Time (Midway)" ,"btimem" , "mame", 3, 0 } , -{ "Burnin' Rubber" ,"brubber" , "mame", 3, 0 } , -{ "Burning Fight (set 1)" ,"burningf" , "neomame", 3, 0 } , -{ "Burning Fight (set 2)" ,"burningh" , "neomame", 3, 0 } , -{ "Burning Force (Japan)" ,"burnforc" , "mame", 3, 0 } , -{ "Buster Bros (US)" ,"bbros" , "mame", 1, 0 } , -{ "Butasan (Japan)" ,"butasan" , "mame", 1, 0 } , -{ "Cabal (US set 1)" ,"cabal" , "mame", 3, 0 } , -{ "Cabal (US set 2)" ,"cabal2" , "mame", 3, 0 } , -{ "Cabal (bootleg)" ,"cabalbl" , "mame", 3, 0 } , -{ "Cachat (Japan)" ,"cachat" , "mame", 3, 0 } , -{ "Cadillacs Kyouryuu-Shinseiki (Japan)" ,"dinoj" , "mame", 1, 0 } , -{ "Cadillacs and Dinosaurs (World)" ,"dino" , "mame", 1, 0 } , -{ "Caliber 50" ,"calibr50" , "mame", 3, 0 } , -{ "Calipso" ,"calipso" , "mame", 3, 0 } , -{ "Camel Try (Japan)" ,"cameltry" , "mame", 3, 0 } , -{ "Camel Try (US)" ,"cameltru" , "mame", 3, 0 } , -{ "Canyon Bomber (prototype)" ,"canbprot" , "mame", 3, 0 } , -{ "Canyon Bomber" ,"canyon" , "mame", 3, 0 } , -{ "Capcom Baseball (Japan)" ,"cbasebal" , "mame", 1, 0 } , -{ "Capcom Bowling (set 1)" ,"capbowl" , "mame", 3, 0 } , -{ "Capcom Bowling (set 2)" ,"capbowl2" , "mame", 3, 0 } , -{ "Capcom World (Japan)" ,"cworld" , "mame", 1, 0 } , -{ "Capcom World 2 (Japan)" ,"cworld2j" , "mame", 3, 0 } , -{ "Captain Commando (Japan)" ,"captcomj" , "mame", 3, 0 } , -{ "Captain Commando (US)" ,"captcomu" , "mame", 3, 0 } , -{ "Captain Commando (World)" ,"captcomm" , "mame", 3, 0 } , -{ "Captain Silver (Japan)" ,"csilver" , "mame", 3, 0 } , -{ "Car Action" ,"caractn" , "mame", 3, 0 } , -{ "Carnival (cocktail)" ,"carnvckt" , "mame", 3, 0 } , -{ "Carnival (upright)" ,"carnival" , "mame", 3, 0 } , -{ "Carrier Air Wing (World)" ,"cawing" , "mame", 3, 0 } , -{ "Caveman Ninja (US)" ,"cninjau" , "mame", 3, 0 } , -{ "Caveman Ninja (World revision 0)" ,"cninja0" , "mame", 3, 0 } , -{ "Caveman Ninja (World revision 3)" ,"cninja" , "mame", 3, 0 } , -{ "Centipede (bootleg set 1)" ,"centipdb" , "mame", 3, 0 } , -{ "Centipede (bootleg set 2)" ,"centipb2" , "mame", 3, 0 } , -{ "Centipede (revision 2)" ,"centipd2" , "mame", 3, 0 } , -{ "Centipede (revision 3)" ,"centiped" , "mame", 3, 0 } , -{ "Cerberus" ,"cerberus" , "mame", 1, 0 } , -{ "Challenger" ,"challeng" , "mame", 3, 0 } , -{ "Champion Baseball (Japan)" ,"champbbj" , "mame", 3, 0 } , -{ "Champion Baseball II" ,"champbb2" , "mame", 3, 0 } , -{ "Champion Baseball" ,"champbas" , "mame", 3, 0 } , -{ "Champion Wrestler (Japan)" ,"champwrj" , "mame", 1, 0 } , -{ "Champion Wrestler (US)" ,"champwru" , "mame", 1, 0 } , -{ "Champion Wrestler (World)" ,"champwr" , "mame", 1, 0 } , -{ "Championship Sprint" ,"csprint" , "mame", 3, 0 } , -{ "Changes" ,"changes" , "mame", 3, 0 } , -{ "Checkman (Japan)" ,"checkmaj" , "mame", 3, 0 } , -{ "Checkman" ,"checkman" , "mame", 3, 0 } , -{ "Checkmate" ,"checkmat" , "mame", 3, 0 } , -{ "Cheeky Mouse" ,"cheekyms" , "mame", 3, 0 } , -{ "Chelnov - Atomic Runner (Japan)" ,"chelnovj" , "mame", 3, 0 } , -{ "Chelnov - Atomic Runner (US)" ,"chelnov" , "mame", 3, 0 } , -{ "Cheyenne (version 1.0)" ,"cheyenne" , "mame", 3, 0 } , -{ "Chibi Marukochan Deluxe Quiz" ,"marukodq" , "neomame", 3, 0 } , -{ "Chicken Shift" ,"cshift" , "mame", 3, 0 } , -{ "Chiki Chiki Boys (Japan)" ,"chikij" , "mame", 3, 0 } , -{ "Chiller (version 3.0)" ,"chiller" , "mame", 3, 0 } , -{ "Chimera Beast" ,"chimerab" , "mame", 3, 0 } , -{ "Choplifter (alternate)" ,"chplftb" , "mame", 5, 0 } , -{ "Choplifter (bootleg)" ,"chplftbl" , "mame", 5, 0 } , -{ "Choplifter" ,"chplft" , "mame", 5, 0 } , -{ "Chopper I" ,"chopper" , "mame", 3, 0 } , -{ "Chuka Taisen (Japan)" ,"chukatai" , "mame", 3, 0 } , -{ "Circus Charlie (Centuri)" ,"circuscc" , "mame", 3, 0 } , -{ "Circus Charlie (Centuri, earlier)" ,"circusce" , "mame", 3, 0 } , -{ "Circus Charlie (no level select)" ,"circusc2" , "mame", 3, 0 } , -{ "Circus Charlie" ,"circusc" , "mame", 3, 0 } , -{ "Circus" ,"circus" , "mame", 3, 0 } , -{ "Cisco Heat" ,"cischeat" , "mame", 3, 0 } , -{ "City Connection (set 1)" ,"citycon" , "mame", 3, 0 } , -{ "City Connection (set 2)" ,"citycona" , "mame", 3, 0 } , -{ "Clay Pigeon (version 2.0)" ,"claypign" , "mame", 3, 0 } , -{ "Cloak & Dagger" ,"cloak" , "mame", 3, 0 } , -{ "Cloud 9 (prototype)" ,"cloud9" , "mame", 3, 0 } , -{ "Clowns" ,"clowns" , "mame", 3, 0 } , -{ "Cobra-Command (Japan)" ,"cobracmj" , "mame", 3, 0 } , -{ "Cobra-Command (World revision 5)" ,"cobracom" , "mame", 3, 0 } , -{ "Colony 7 (set 1)" ,"colony7" , "mame", 3, 0 } , -{ "Colony 7 (set 2)" ,"colony7a" , "mame", 3, 0 } , -{ "Combat (version 3.0)" ,"combat" , "mame", 3, 0 } , -{ "Combat School (Japan trackball)" ,"combascj" , "mame", 3, 0 } , -{ "Combat School (bootleg)" ,"combascb" , "mame", 3, 0 } , -{ "Combat School (joystick)" ,"combasc" , "mame", 3, 0 } , -{ "Combat School (trackball)" ,"combasct" , "mame", 3, 0 } , -{ "Combatribes, The (US)" ,"ctribe" , "mame", 3, 0 } , -{ "Combatribes, The (bootleg)" ,"ctribeb" , "mame", 3, 0 } , -{ "Commando (Sega)" ,"commsega" , "mame", 3, 0 } , -{ "Commando (US)" ,"commandu" , "mame", 5, 0 } , -{ "Commando (World)" ,"commando" , "mame", 5, 0 } , -{ "Comotion" ,"comotion" , "mame", 3, 0 } , -{ "Congo Bongo" ,"congo" , "mame", 3, 0 } , -{ "Contra (Japan bootleg)" ,"contrajb" , "mame", 3, 0 } , -{ "Contra (Japan)" ,"contraj" , "mame", 3, 0 } , -{ "Contra (US bootleg)" ,"contrab" , "mame", 3, 0 } , -{ "Contra (US)" ,"contra" , "mame", 3, 0 } , -{ "Cook Race" ,"cookrace" , "mame", 3, 0 } , -{ "Coors Light Bowling" ,"clbowl" , "mame", 3, 0 } , -{ "Cop 01 (set 1)" ,"cop01" , "mame", 5, 0 } , -{ "Cop 01 (set 2)" ,"cop01a" , "mame", 5, 0 } , -{ "Cops'n Robbers" ,"copsnrob" , "mame", 3, 0 } , -{ "Cosmic Alien (older)" ,"cosmica2" , "mame", 3, 0 } , -{ "Cosmic Alien" ,"cosmica" , "mame", 3, 0 } , -{ "Cosmic Avenger" ,"cavenger" , "mame", 3, 0 } , -{ "Cosmic Chasm (set 1)" ,"cchasm" , "mame", 1, 0 } , -{ "Cosmic Chasm (set 2)" ,"cchasm1" , "mame", 1, 0 } , -{ "Cosmic Guerilla" ,"cosmicg" , "mame", 3, 0 } , -{ "Cosmic Monsters" ,"cosmicmo" , "mame", 3, 0 } , -{ "Cosmo Gang the Video (Japan)" ,"cosmognj" , "mame", 3, 0 } , -{ "Cosmo Gang the Video (US)" ,"cosmogng" , "mame", 3, 0 } , -{ "Cotocoto Cottong" ,"cottong" , "mame", 3, 0 } , -{ "Crackshot (version 2.0)" ,"cracksht" , "mame", 3, 0 } , -{ "Crash" ,"crash" , "mame", 3, 0 } , -{ "Crater Raider" ,"crater" , "mame", 5, 0 } , -{ "Crazy Balloon (set 1)" ,"crbaloon" , "mame", 3, 0 } , -{ "Crazy Balloon (set 2)" ,"crbalon2" , "mame", 3, 0 } , -{ "Crazy Blocks" ,"crazyblk" , "mame", 3, 0 } , -{ "Crazy Climber (Japan)" ,"cclimbrj" , "mame", 1, 0 } , -{ "Crazy Climber (US)" ,"cclimber" , "mame", 1, 0 } , -{ "Crazy Climber (bootleg set 1)" ,"ccboot" , "mame", 1, 0 } , -{ "Crazy Climber (bootleg set 2)" ,"ccboot2" , "mame", 1, 0 } , -{ "Crazy Climber 2 (Japan)" ,"cclimbr2" , "mame", 3, 0 } , -{ "Crazy Cop (Japan)" ,"crazycop" , "mame", 3, 0 } , -{ "Crazy Kong (Alca bootleg)" ,"ckongalc" , "mame", 3, 0 } , -{ "Crazy Kong (Jeutel bootleg)" ,"ckongjeu" , "mame", 3, 0 } , -{ "Crazy Kong (Orca bootleg)" ,"ckongo" , "mame", 3, 0 } , -{ "Crazy Kong (Scramble hardware)" ,"ckongs" , "mame", 3, 0 } , -{ "Crazy Kong (set 1)" ,"ckong" , "mame", 3, 0 } , -{ "Crazy Kong (set 2)" ,"ckonga" , "mame", 3, 0 } , -{ "Crime City (Japan)" ,"crimecj" , "mame", 3, 0 } , -{ "Crime City (US)" ,"crimecu" , "mame", 3, 0 } , -{ "Crime City (World)" ,"crimec" , "mame", 3, 0 } , -{ "Crime Fighters (Japan 2 Players)" ,"crimfgtj" , "mame", 3, 0 } , -{ "Crime Fighters (US 4 players)" ,"crimfght" , "mame", 3, 0 } , -{ "Crime Fighters (World 2 Players)" ,"crimfgt2" , "mame", 3, 0 } , -{ "Crime Fighters 2 (Japan)" ,"vendettj" , "mame", 3, 0 } , -{ "Crossbow (version 2.0)" ,"crossbow" , "mame", 3, 0 } , -{ "Crossed Swords" ,"crsword" , "neomame", 3, 0 } , -{ "Crude Buster (Japan)" ,"cbusterj" , "mame", 3, 0 } , -{ "Crude Buster (World FU version)" ,"cbusterw" , "mame", 3, 0 } , -{ "Crude Buster (World FX version)" ,"cbuster" , "mame", 3, 0 } , -{ "Cruisin" ,"cruisin" , "mame", 3, 0 } , -{ "Crush Roller (Kural - bootleg?)" ,"crush3" , "mame", 1, 0 } , -{ "Crush Roller (Kural Esco - bootleg?)" ,"crush2" , "mame", 1, 0 } , -{ "Crush Roller (Kural Samno)" ,"crush" , "mame", 1, 0 } , -{ "Crystal Castles (set 1)" ,"ccastles" , "mame", 3, 0 } , -{ "Crystal Castles (set 2)" ,"ccastle2" , "mame", 3, 0 } , -{ "Cuby Bop" ,"cubybop" , "mame", 3, 0 } , -{ "Cuebrick" ,"cuebrick" , "mame", 3, 0 } , -{ "Curve Ball" ,"curvebal" , "mame", 3, 0 } , -{ "Cutie Q" ,"cutieq" , "mame", 3, 0 } , -{ "Cybattler" ,"cybattlr" , "mame", 3, 0 } , -{ "Cyber-Lip" ,"cyberlip" , "neomame", 3, 0 } , -{ "Cyberball (Version 2)" ,"cyberba2" , "mame", 3, 0 } , -{ "Cyberball (Version 4)" ,"cyberbal" , "mame", 3, 0 } , -{ "Cyberball 2072 (2 player)" ,"cyberb2p" , "mame", 3, 0 } , -{ "D-Con" ,"dcon" , "mame", 1, 0 } , -{ "D-Day (Centuri)" ,"ddayc" , "mame", 3, 0 } , -{ "D-Day" ,"dday" , "mame", 3, 0 } , -{ "Dai Makai-Mura (Japan)" ,"ghoulsj" , "mame", 3, 0 } , -{ "Dai Ressya Goutou (Japan)" ,"dairesya" , "mame", 3, 0 } , -{ "Daiku no Gensan (Japan)" ,"dkgensan" , "mame", 1, 0 } , -{ "DakkoChan Jansoh" ,"dakkochn" , "mame", 3, 0 } , -{ "Dangar - Ufo Robo (12/1/1986)" ,"dangar" , "mame", 3, 0 } , -{ "Dangar - Ufo Robo (9/26/1986)" ,"dangar2" , "mame", 3, 0 } , -{ "Dangar - Ufo Robo (bootleg)" ,"dangarb" , "mame", 3, 0 } , -{ "Danger Zone" ,"dangerz" , "mame", 3, 0 } , -{ "Dangerous Seed (Japan)" ,"dangseed" , "mame", 3, 0 } , -{ "Dangun Feveron (Japan)" ,"dfeveron" , "mame", 3, 0 } , -{ "Danny Sullivan's Indy Heat" ,"indyheat" , "mame", 3, 0 } , -{ "Dark Adventure" ,"darkadv" , "mame", 3, 0 } , -{ "Dark Planet" ,"darkplnt" , "mame", 3, 0 } , -{ "Dark Seal (Japan)" ,"darkseaj" , "mame", 3, 0 } , -{ "Dark Seal (World revision 1)" ,"darksea1" , "mame", 3, 0 } , -{ "Dark Seal (World revision 3)" ,"darkseal" , "mame", 3, 0 } , -{ "Darwin 4078 (Japan)" ,"darwin" , "mame", 3, 0 } , -{ "Datsugoku - Prisoners of War (Japan)" ,"powj" , "mame", 3, 0 } , -{ "Datsun 280 Zzzap" ,"280zzzap" , "mame", 3, 0 } , -{ "Dead Connection (Japan)" ,"deadconj" , "mame", 3, 0 } , -{ "Dead Connection (World)" ,"deadconx" , "mame", 3, 0 } , -{ "Dead Eye" ,"deadeye" , "mame", 3, 0 } , -{ "Defence Command" ,"defence" , "mame", 3, 0 } , -{ "Defend the Terra Attack on the Red UFO (bootleg)" ,"redufo" , "mame", 3, 0 } , -{ "Defender (Green label)" ,"defendg" , "mame", 3, 0 } , -{ "Defender (Red label)" ,"defender" , "mame", 3, 0 } , -{ "Defender (White label)" ,"defendw" , "mame", 3, 0 } , -{ "Defense Command (set 1)" ,"defcmnd" , "mame", 3, 0 } , -{ "Demolition Derby (2-Player Mono Board Version)" ,"destderm" , "mame", 1, 0 } , -{ "Demolition Derby" ,"destderb" , "mame", 1, 0 } , -{ "Demon" ,"demon" , "mame", 3, 0 } , -{ "Demon's World / Horror Story" ,"demonwld" , "mame", 3, 0 } , -{ "Depthcharge" ,"depthch" , "mame", 3, 0 } , -{ "Desert Gun" ,"desertgu" , "mame", 3, 0 } , -{ "Destination Earth" ,"desterth" , "mame", 3, 0 } , -{ "Detana!! Twin Bee (Japan)" ,"detatwin" , "mame", 3, 0 } , -{ "Devastators (version V)" ,"devstor3" , "mame", 3, 0 } , -{ "Devastators (version X)" ,"devstor2" , "mame", 3, 0 } , -{ "Devastators (version Z)" ,"devstors" , "mame", 3, 0 } , -{ "Devil Fish (Galaxian hardware, bootleg?)" ,"devilfsg" , "mame", 3, 0 } , -{ "Devil Fish" ,"devilfsh" , "mame", 3, 0 } , -{ "Devil World" ,"devilw" , "mame", 3, 0 } , -{ "Devil Zone" ,"devzone" , "mame", 3, 0 } , -{ "Diamond Run" ,"diamond" , "mame", 3, 0 } , -{ "Dig Dug (Atari)" ,"digdugat" , "mame", 3, 0 } , -{ "Dig Dug (set 1)" ,"digdug" , "mame", 3, 0 } , -{ "Dig Dug (set 2)" ,"digdugb" , "mame", 3, 0 } , -{ "Dig Dug II (set 1)" ,"digdug2" , "mame", 3, 0 } , -{ "Dig Dug II (set 2)" ,"digdug2a" , "mame", 3, 0 } , -{ "Digger" ,"digger" , "mame", 3, 0 } , -{ "Dino Rex (Japan)" ,"dinorexj" , "mame", 3, 0 } , -{ "Dino Rex (US)" ,"dinorexu" , "mame", 3, 0 } , -{ "Dino Rex (World)" ,"dinorex" , "mame", 3, 0 } , -{ "Disco No.1" ,"disco" , "mame", 3, 0 } , -{ "Discs of Tron (Environmental)" ,"dotrone" , "mame", 5, 0 } , -{ "Discs of Tron (Upright)" ,"dotron" , "mame", 5, 0 } , -{ "Do! Run Run (Do's Castle hardware)" ,"dorunruc" , "mame", 1, 0 } , -{ "Do! Run Run (set 1)" ,"dorunrun" , "mame", 1, 0 } , -{ "Do! Run Run (set 2)" ,"dorunru2" , "mame", 1, 0 } , -{ "Dodonpachi (Japan)" ,"ddonpach" , "mame", 3, 0 } , -{ "Dog Fight" ,"dogfight" , "mame", 1, 0 } , -{ "Dog Patch" ,"dogpatch" , "mame", 3, 0 } , -{ "Dogou Souken" ,"dogosoke" , "mame", 3, 0 } , -{ "Dogyuun" ,"dogyuun" , "mame", 3, 0 } , -{ "Dokaben (Japan)" ,"dokaben" , "mame", 1, 0 } , -{ "Domino Man" ,"domino" , "mame", 5, 0 } , -{ "Dominos" ,"dominos" , "mame", 3, 0 } , -{ "Don Doko Don (Japan)" ,"dondokod" , "mame", 3, 0 } , -{ "Donkey Kong (Japan set 1)" ,"dkongjp" , "mame", 1, 0 } , -{ "Donkey Kong (Japan set 2)" ,"dkongjpo" , "mame", 1, 0 } , -{ "Donkey Kong (US)" ,"dkong" , "mame", 1, 0 } , -{ "Donkey Kong 3 (Japan)" ,"dkong3j" , "mame", 1, 0 } , -{ "Donkey Kong 3 (US)" ,"dkong3" , "mame", 1, 0 } , -{ "Donkey Kong Jr. (Original Japanese)" ,"dkngjrjp" , "mame", 1, 0 } , -{ "Donkey Kong Junior (Japan)" ,"dkjrjp" , "mame", 1, 0 } , -{ "Donkey Kong Junior (US)" ,"dkongjr" , "mame", 1, 0 } , -{ "Donkey Kong Junior (bootleg?)" ,"dkjrbl" , "mame", 1, 0 } , -{ "Dottori Kun (new version)" ,"dotrikun" , "mame", 1, 0 } , -{ "Dottori Kun (old version)" ,"dotriku2" , "mame", 1, 0 } , -{ "Double Dragon (Japan)" ,"ddragon" , "mame", 3, 0 } , -{ "Double Dragon (Neo-Geo)" ,"doubledr" , "neomame", 3, 0 } , -{ "Double Dragon (US)" ,"ddragonu" , "mame", 3, 0 } , -{ "Double Dragon (bootleg)" ,"ddragonb" , "mame", 3, 0 } , -{ "Double Dragon 3 - The Rosetta Stone (bootleg)" ,"ddrago3b" , "mame", 3, 0 } , -{ "Double Dragon 3 - The Rosetta Stone" ,"ddragon3" , "mame", 3, 0 } , -{ "Double Dragon II - The Revenge" ,"ddragon2" , "mame", 3, 0 } , -{ "Double Dribble" ,"ddribble" , "mame", 3, 0 } , -{ "Double Dynamites, The" ,"dbldyn" , "mame", 3, 0 } , -{ "Double Play" ,"dplay" , "mame", 3, 0 } , -{ "DownTown" ,"downtown" , "mame", 3, 0 } , -{ "Dr. Toppel's Tankentai (Japan)" ,"drtoppel" , "mame", 3, 0 } , -{ "Dragon Breed" ,"dbreed" , "mame", 1, 0 } , -{ "Dragon Buster" ,"drgnbstr" , "mame", 3, 0 } , -{ "Dragon Saber (Japan)" ,"dsaberj" , "mame", 3, 0 } , -{ "Dragon Saber" ,"dsaber" , "mame", 3, 0 } , -{ "Dragon Spirit (new version)" ,"dspirit" , "mame", 3, 0 } , -{ "Dragon Spirit (old version)" ,"dspirito" , "mame", 3, 0 } , -{ "Dragon Unit / Castle of Dragon" ,"drgnunit" , "mame", 3, 0 } , -{ "Dragonninja (Japan)" ,"drgninja" , "mame", 3, 0 } , -{ "Dream Shopper" ,"dremshpr" , "mame", 3, 0 } , -{ "Dream Soccer '94" ,"dsoccr94" , "mame", 3, 0 } , -{ "Drift Out (Japan)" ,"driftout" , "mame", 1, 0 } , -{ "Drive Out" ,"driveout" , "mame", 1, 0 } , -{ "Dump Matsumoto (Japan)" ,"dumpmtmt" , "mame", 1, 0 } , -{ "Dyger (set 1)" ,"dyger" , "mame", 3, 0 } , -{ "Dyger (set 2)" ,"dygera" , "mame", 3, 0 } , -{ "Dynamite Duke" ,"dynduke" , "mame", 3, 0 } , -{ "Dynamite Dux (bootleg)" ,"dduxbl" , "mame", 3, 0 } , -{ "E-Swat (bootleg)" ,"eswatbl" , "mame", 1, 0 } , -{ "E-Swat" ,"eswat" , "mame", 1, 0 } , -{ "ESP Ra.De. (Japan)" ,"esprade" , "mame", 3, 0 } , -{ "Eagle (set 1)" ,"eagle" , "mame", 3, 0 } , -{ "Eagle (set 2)" ,"eagle2" , "mame", 3, 0 } , -{ "Earth Defense Force" ,"edf" , "mame", 3, 0 } , -{ "Eggs" ,"eggs" , "mame", 3, 0 } , -{ "Eight Man" ,"eightman" , "neomame", 3, 0 } , -{ "Electric Yo-Yo, The (set 1)" ,"elecyoyo" , "mame", 3, 0 } , -{ "Electric Yo-Yo, The (set 2)" ,"elecyoy2" , "mame", 3, 0 } , -{ "Elevator Action (bootleg)" ,"elevatob" , "mame", 5, 0 } , -{ "Elevator Action" ,"elevator" , "mame", 5, 0 } , -{ "Eliminator (2 Players, set 1)" ,"elim2" , "mame", 1, 0 } , -{ "Eliminator (2 Players, set 2)" ,"elim2a" , "mame", 1, 0 } , -{ "Eliminator (4 Players)" ,"elim4" , "mame", 1, 0 } , -{ "Empire City: 1931 (Japan)" ,"empcityj" , "mame", 5, 0 } , -{ "Empire City: 1931 (bootleg?)" ,"empcity" , "mame", 5, 0 } , -{ "Empire Strikes Back, The" ,"esb" , "mame", 3, 0 } , -{ "End, The (Stern)" ,"theends" , "mame", 3, 0 } , -{ "End, The" ,"theend" , "mame", 3, 0 } , -{ "Enduro Racer (bootleg set 1)" ,"endurobl" , "mame", 3, 0 } , -{ "Enduro Racer (bootleg set 2)" ,"endurob2" , "mame", 3, 0 } , -{ "Enduro Racer" ,"enduror" , "mame", 3, 0 } , -{ "Escape from the Planet of the Robot Monsters (set 1)" ,"eprom" , "mame", 0, 0 } , -{ "Escape from the Planet of the Robot Monsters (set 2)" ,"eprom2" , "mame", 0, 0 } , -{ "Espial (Europe)" ,"espiale" , "mame", 3, 0 } , -{ "Espial (US?)" ,"espial" , "mame", 3, 0 } , -{ "Euro Champ '92 (World)" ,"euroch92" , "mame", 3, 0 } , -{ "Euro League" ,"wc90b" , "mame", 3, 0 } , -{ "Exciting Hour" ,"excthour" , "mame", 3, 0 } , -{ "Exciting Soccer (alternate music)" ,"exctscca" , "mame", 3, 0 } , -{ "Exciting Soccer (bootleg)" ,"exctsccb" , "mame", 3, 0 } , -{ "Exciting Soccer II" ,"exctscc2" , "mame", 3, 0 } , -{ "Exciting Soccer" ,"exctsccr" , "mame", 3, 0 } , -{ "Exed Exes" ,"exedexes" , "mame", 1, 0 } , -{ "Exerion (Taito)" ,"exeriont" , "mame", 3, 0 } , -{ "Exerion (bootleg)" ,"exerionb" , "mame", 3, 0 } , -{ "Exerion" ,"exerion" , "mame", 3, 0 } , -{ "Exerizer (Japan) (bootleg)" ,"exerizrb" , "mame", 3, 0 } , -{ "Exodus (bootleg?)" ,"exodus" , "mame", 3, 0 } , -{ "Express Raider (US)" ,"exprraid" , "mame", 3, 0 } , -{ "Extermination (US)" ,"extrmatn" , "mame", 3, 0 } , -{ "Exterminator" ,"exterm" , "mame", 3, 0 } , -{ "Extra Bases" ,"ebases" , "mame", 1, 0 } , -{ "Extra Innings" ,"einnings" , "mame", 3, 0 } , -{ "Eyes (Digitrex Techstar)" ,"eyes" , "mame", 3, 0 } , -{ "Eyes (Techstar Inc.)" ,"eyes2" , "mame", 3, 0 } , -{ "F-1 Dream (bootleg)" ,"f1dreamb" , "mame", 3, 0 } , -{ "F-1 Dream" ,"f1dream" , "mame", 3, 0 } , -{ "F1 Grand Prix Star" ,"f1gpstar" , "mame", 3, 0 } , -{ "Face Off (Japan)" ,"faceoff" , "mame", 3, 0 } , -{ "Fairyland Story, The" ,"flstory" , "mame", 3, 0 } , -{ "Fairyland Story, The (Japan)" ,"flstoryj" , "mame", 3, 0 } , -{ "Fantasy (Japan)" ,"fantasyj" , "mame", 3, 0 } , -{ "Fantasy (US)" ,"fantasy" , "mame", 3, 0 } , -{ "Fantasy Zone (Japan New Ver.)" ,"fantzone" , "mame", 3, 0 } , -{ "Fantasy Zone (Old Ver.)" ,"fantzono" , "mame", 3, 0 } , -{ "Fantazia" ,"fantazia" , "mame", 3, 0 } , -{ "Far West" ,"farwest" , "mame", 3, 0 } , -{ "Fast Freddie" ,"fastfred" , "mame", 3, 0 } , -{ "Fast Lane" ,"fastlane" , "mame", 3, 0 } , -{ "Faster, Harder, More Challenging Q*bert (prototype)" ,"sqbert" , "mame", 3, 0 } , -{ "Fatal Fury - King of Fighters / Garou Densetsu - shukumei no tatakai" ,"fatfury1" , "neomame", 3, 0 } , -{ "Fatal Fury 2 / Garou Densetsu 2 - arata-naru tatakai" ,"fatfury2" , "neomame", 3, 0 } , -{ "Fatal Fury 3 - Road to the Final Victory / Garou Densetsu 3 - haruka-naru tatakai" ,"fatfury3" , "neomame", 3, 0 } , -{ "Fatal Fury Special / Garou Densetsu Special" ,"fatfursp" , "neomame", 3, 0 } , -{ "Fax" ,"fax" , "mame", 3, 0 } , -{ "Fight Fever / Crystal Legacy" ,"fightfev" , "neomame", 3, 0 } , -{ "Fighting Fantasy (Japan)" ,"ffantasy" , "mame", 3, 0 } , -{ "Fighting Golf" ,"fitegolf" , "mame", 3, 0 } , -{ "Fighting Hawk (Japan)" ,"fhawk" , "mame", 3, 0 } , -{ "Fighting Soccer" ,"ftsoccer" , "mame", 5, 0 } , -{ "Final Blow (Japan)" ,"finalbj" , "mame", 3, 0 } , -{ "Final Blow (World)" ,"finalb" , "mame", 3, 0 } , -{ "Final Fight (Japan)" ,"ffightj" , "mame", 3, 0 } , -{ "Final Fight (US)" ,"ffightu" , "mame", 3, 0 } , -{ "Final Fight (World)" ,"ffight" , "mame", 3, 0 } , -{ "Final Round" ,"fround" , "mame", 3, 0 } , -{ "Final Star Force (US)" ,"fstarfrc" , "mame", 3, 0 } , -{ "Finalizer - Super Transformation (bootleg)" ,"finalizb" , "mame", 3, 0 } , -{ "Finalizer - Super Transformation" ,"finalizr" , "mame", 3, 0 } , -{ "Finest Hour (Japan)" ,"finehour" , "mame", 3, 0 } , -{ "Fire One" ,"fireone" , "mame", 3, 0 } , -{ "Fire Shark" ,"fireshrk" , "mame", 3, 0 } , -{ "Fire Trap (Japan bootleg)" ,"firetpbl" , "mame", 3, 0 } , -{ "Fire Trap" ,"firetrap" , "mame", 3, 0 } , -{ "Fire Truck" ,"firetrk" , "mame", 3, 0 } , -{ "Fitter" ,"fitter" , "mame", 3, 0 } , -{ "Flak Attack (Japan)" ,"flkatck" , "mame", 3, 0 } , -{ "Flash Gal" ,"flashgal" , "mame", 3, 0 } , -{ "Flash Point (bootleg)" ,"fpointbl" , "mame", 3, 0 } , -{ "Flash Point" ,"fpoint" , "mame", 3, 0 } , -{ "Flicky (set 1)" ,"flicky" , "mame", 5, 0 } , -{ "Flicky (set 2)" ,"flicky2" , "mame", 5, 0 } , -{ "Fly-Boy (bootleg)" ,"flyboyb" , "mame", 3, 0 } , -{ "Fly-Boy" ,"flyboy" , "mame", 3, 0 } , -{ "Flying Shark (World)" ,"fshark" , "mame", 3, 0 } , -{ "Flying Shark (bootleg)" ,"fsharkbt" , "mame", 3, 0 } , -{ "Food Fight" ,"foodf" , "mame", 3, 0 } , -{ "Football Champ (World)" ,"footchmp" , "mame", 3, 0 } , -{ "Football Frenzy" ,"fbfrenzy" , "neomame", 3, 0 } , -{ "Forgotten Worlds (US)" ,"forgottn" , "mame", 3, 0 } , -{ "Formation Z" ,"formatz" , "mame", 3, 0 } , -{ "Freeze" ,"freeze" , "mame", 3, 0 } , -{ "Frenzy" ,"frenzy" , "mame", 3, 0 } , -{ "Frisky Tom" ,"friskyt" , "mame", 3, 0 } , -{ "Frog" ,"froggers" , "mame", 3, 0 } , -{ "Frogger (Sega set 1)" ,"frogseg1" , "mame", 3, 0 } , -{ "Frogger (Sega set 2)" ,"frogseg2" , "mame", 3, 0 } , -{ "Frogger (modified Moon Cresta hardware)" ,"froggrmc" , "mame", 3, 0 } , -{ "Frogger" ,"frogger" , "mame", 3, 0 } , -{ "Frogs" ,"frogs" , "mame", 3, 0 } , -{ "Front Line" ,"frontlin" , "mame", 3, 0 } , -{ "Funky Bee" ,"funkybee" , "mame", 3, 0 } , -{ "Funky Fish" ,"fnkyfish" , "mame", 3, 0 } , -{ "Funny Mouse (bootleg?)" ,"suprmou2" , "mame", 3, 0 } , -{ "Future Spy" ,"futspy" , "mame", 1, 0 } , -{ "Galactic Warriors" ,"gwarrior" , "mame", 3, 0 } , -{ "Galaga '84" ,"galaga84" , "mame", 3, 0 } , -{ "Galaga '88 (Japan)" ,"galag88j" , "mame", 3, 0 } , -{ "Galaga '88 (set 1)" ,"galaga88" , "mame", 3, 0 } , -{ "Galaga '88 (set 2)" ,"galag88b" , "mame", 3, 0 } , -{ "Galaga (Midway)" ,"galagamw" , "mame", 3, 0 } , -{ "Galaga (Namco)" ,"galaga" , "mame", 3, 0 } , -{ "Galaga (bootleg)" ,"galagab2" , "mame", 3, 0 } , -{ "Galaga (fast shoot)" ,"galagads" , "mame", 3, 0 } , -{ "Galaga 3 (set 1)" ,"galaga3" , "mame", 3, 0 } , -{ "Galaga 3 (set 2)" ,"galaga3a" , "mame", 3, 0 } , -{ "Galaxian (Midway)" ,"galmidw" , "mame", 3, 0 } , -{ "Galaxian (Namco)" ,"galaxian" , "mame", 3, 0 } , -{ "Galaxian (bootleg)" ,"galaxb" , "mame", 3, 0 } , -{ "Galaxian Part 4" ,"galap4" , "mame", 3, 0 } , -{ "Galaxian Part X" ,"galapx" , "mame", 3, 0 } , -{ "Galaxian Turbo" ,"galturbo" , "mame", 3, 0 } , -{ "Galaxy Fight - Universal Warriors" ,"galaxyfg" , "neomame", 3, 0 } , -{ "Galaxy Rescue" ,"grescue" , "mame", 3, 0 } , -{ "Galaxy Wars" ,"galxwars" , "mame", 3, 0 } , -{ "Galivan - Cosmo Police (12/11/1985)" ,"galivan2" , "mame", 3, 0 } , -{ "Galivan - Cosmo Police (12/16/1985)" ,"galivan" , "mame", 3, 0 } , -{ "Gallag" ,"gallag" , "mame", 3, 0 } , -{ "Gallop - Armed police Unit (Japan)" ,"gallop" , "mame", 3, 0 } , -{ "Gals Panic" ,"galpanic" , "mame", 3, 0 } , -{ "Ganbare Ginkun" ,"ginkun" , "mame", 3, 0 } , -{ "Gang Busters" ,"gbusters" , "mame", 3, 0 } , -{ "Gang Wars (US)" ,"gangwars" , "mame", 3, 0 } , -{ "Gang Wars (bootleg)" ,"gangwarb" , "mame", 3, 0 } , -{ "Gaplus (set 1)" ,"gaplus" , "mame", 3, 0 } , -{ "Gaplus (set 2)" ,"gaplusa" , "mame", 3, 0 } , -{ "Gardia (bootleg)" ,"gardiab" , "mame", 1, 0 } , -{ "Gardia" ,"gardia" , "mame", 1, 0 } , -{ "Garuka (Japan)" ,"garuka" , "mame", 3, 0 } , -{ "Garyo Retsuden (Japan)" ,"garyoret" , "mame", 3, 0 } , -{ "Gate of Doom (US revision 1)" ,"gatedom1" , "mame", 3, 0 } , -{ "Gate of Doom (US revision 4)" ,"gatedoom" , "mame", 3, 0 } , -{ "Gauntlet (2 Players)" ,"gaunt2p" , "mame", 3, 0 } , -{ "Gauntlet (Intermediate Release 1)" ,"gauntir1" , "mame", 3, 0 } , -{ "Gauntlet (Intermediate Release 2)" ,"gauntir2" , "mame", 3, 0 } , -{ "Gauntlet II" ,"gaunt2" , "mame", 3, 0 } , -{ "Gauntlet" ,"gauntlet" , "mame", 3, 0 } , -{ "Gee Bee (Gremlin)" ,"geebeeg" , "mame", 3, 0 } , -{ "Gee Bee" ,"geebee" , "mame", 3, 0 } , -{ "Gemini Wing" ,"gemini" , "mame", 3, 0 } , -{ "Genpei ToumaDen" ,"genpeitd" , "mame", 3, 0 } , -{ "Genshi-Tou 1930's" ,"gensitou" , "mame", 3, 0 } , -{ "Get Star (Japan)" ,"getstarj" , "mame", 3, 0 } , -{ "Get Star (bootleg)" ,"getstarb" , "mame", 3, 0 } , -{ "Ghost Pilots" ,"gpilots" , "neomame", 3, 0 } , -{ "Ghosts'n Goblins (US)" ,"gngt" , "mame", 3, 0 } , -{ "Ghosts'n Goblins (World? set 1)" ,"gng" , "mame", 3, 0 } , -{ "Ghosts'n Goblins (World? set 2)" ,"gnga" , "mame", 3, 0 } , -{ "Ghouls'n Ghosts (US)" ,"ghoulsu" , "mame", 3, 0 } , -{ "Ghouls'n Ghosts (World)" ,"ghouls" , "mame", 3, 0 } , -{ "Ghox" ,"ghox" , "mame", 3, 0 } , -{ "Gimme A Break" ,"gimeabrk" , "mame", 3, 0 } , -{ "Ginga NinkyouDen" ,"ginganin" , "mame", 3, 0 } , -{ "Gingateikoku No Gyakushu" ,"gteikoku" , "mame", 3, 0 } , -{ "Gladiator (US)" ,"gladiatr" , "mame", 3, 0 } , -{ "Glob, The" ,"theglob" , "mame", 1, 0 } , -{ "Go Go Mr. Yamaguchi / Yuke Yuke Yamaguchi-kun" ,"yamagchi" , "mame", 3, 0 } , -{ "Goal! Goal! Goal!" ,"goalx3" , "neomame", 3, 0 } , -{ "Goalie Ghost" ,"gghost" , "mame", 3, 0 } , -{ "Goindol" ,"goindol" , "mame", 3, 0 } , -{ "Gold Medalist" ,"goldmedl" , "mame", 3, 0 } , -{ "Golden Axe (Version 1)" ,"goldnaxe" , "mame", 1, 0 } , -{ "Golden Axe (Version 1, Japan)" ,"goldnaxj" , "mame", 1, 0 } , -{ "Golden Axe (Version 2 317-0110)" ,"goldnaxb" , "mame", 1, 0 } , -{ "Golden Axe (Version 2 317-0122)" ,"goldnaxc" , "mame", 1, 0 } , -{ "Golden Axe (Version 2)" ,"goldnaxa" , "mame", 1, 0 } , -{ "Golden Axe (bootleg)" ,"goldnabl" , "mame", 1, 0 } , -{ "Gondomania (US)" ,"gondo" , "mame", 3, 0 } , -{ "Gorf (Program 1)" ,"gorfpgm1" , "mame", 1, 0 } , -{ "Gorf" ,"gorf" , "mame", 1, 0 } , -{ "Got-Ya (12/24/1981, prototype?)" ,"gotya" , "mame", 3, 0 } , -{ "Gradius II - Gofer no Yabou (Japan set 1)" ,"gradius2" , "mame", 3, 0 } , -{ "Gradius II - Gofer no Yabou (Japan set 2)" ,"grdius2a" , "mame", 3, 0 } , -{ "Gradius II - Gofer no Yabou (Japan set 3)" ,"grdius2b" , "mame", 3, 0 } , -{ "Gradius III (Asia)" ,"grdius3a" , "mame", 3, 0 } , -{ "Gradius III (Japan)" ,"gradius3" , "mame", 3, 0 } , -{ "Gradius" ,"gradius" , "mame", 3, 0 } , -{ "Gravitar (version 2)" ,"gravitr2" , "mame", 3, 0 } , -{ "Gravitar (version 3)" ,"gravitar" , "mame", 3, 0 } , -{ "Great 1000 Miles Rally (Evolution Model)" ,"gtmre" , "mame", 3, 0 } , -{ "Great 1000 Miles Rally" ,"gtmr" , "mame", 3, 0 } , -{ "Great Swordsman" ,"gsword" , "mame", 3, 0 } , -{ "Green Beret (bootleg)" ,"gberetb" , "mame", 3, 0 } , -{ "Green Beret" ,"gberet" , "mame", 3, 0 } , -{ "Gridiron Fight" ,"gridiron" , "mame", 3, 0 } , -{ "Grind Stormer (Korea)" ,"grindstm" , "mame", 3, 0 } , -{ "Grobda (New version)" ,"grobda" , "mame", 3, 0 } , -{ "Grobda (Old version set 1)" ,"grobda2" , "mame", 3, 0 } , -{ "Grobda (Old version set 2)" ,"grobda3" , "mame", 3, 0 } , -{ "Growl (US)" ,"growlu" , "mame", 3, 0 } , -{ "Growl (World)" ,"growl" , "mame", 3, 0 } , -{ "Gryzor" ,"gryzor" , "mame", 3, 0 } , -{ "Guardian" ,"getstar" , "mame", 3, 0 } , -{ "Guerrilla War (US)" ,"gwar" , "mame", 3, 0 } , -{ "Guerrilla War (Version 1)" ,"gwara" , "mame", 3, 0 } , -{ "Guerrilla War (bootleg)" ,"gwarb" , "mame", 3, 0 } , -{ "Guevara (Japan)" ,"gwarj" , "mame", 3, 0 } , -{ "Guided Missile" ,"gmissile" , "mame", 3, 0 } , -{ "Gun & Frontier (World)" ,"gunfront" , "mame", 3, 0 } , -{ "Gun Bird (Japan)" ,"gunbird" , "mame", 3, 0 } , -{ "Gun Dealer (set 1)" ,"gundealr" , "mame", 1, 0 } , -{ "Gun Dealer (set 2)" ,"gundeala" , "mame", 1, 0 } , -{ "Gun Fight" ,"gunfight" , "mame", 3, 0 } , -{ "Gun Frontier (Japan)" ,"gunfronj" , "mame", 3, 0 } , -{ "Gun Hohki (Japan)" ,"gunhohki" , "mame", 3, 0 } , -{ "Gun.Smoke (Japan)" ,"gunsmokj" , "mame", 3, 0 } , -{ "Gun.Smoke (US set 1)" ,"gunsmrom" , "mame", 3, 0 } , -{ "Gun.Smoke (US set 2)" ,"gunsmoka" , "mame", 3, 0 } , -{ "Gun.Smoke (World)" ,"gunsmoke" , "mame", 3, 0 } , -{ "Gunforce - Battle Fire Engulfed Terror Island (US)" ,"gunforcu" , "mame", 3, 0 } , -{ "Gunforce - Battle Fire Engulfed Terror Island (World)" ,"gunforce" , "mame", 3, 0 } , -{ "Gururin" ,"gururin" , "neomame", 3, 0 } , -{ "Guttang Gottong" ,"gutangtn" , "mame", 3, 0 } , -{ "Guzzler" ,"guzzler" , "mame", 3, 0 } , -{ "Gypsy Juggler" ,"gypsyjug" , "mame", 3, 0 } , -{ "Gyrodine" ,"gyrodine" , "mame", 3, 0 } , -{ "Gyruss (Centuri)" ,"gyrussce" , "mame", 3, 0 } , -{ "Gyruss (Konami)" ,"gyruss" , "mame", 3, 0 } , -{ "HAL21 (Japan)" ,"hal21j" , "mame", 3, 0 } , -{ "HAL21" ,"hal21" , "mame", 3, 0 } , -{ "Hachoo!" ,"hachoo" , "mame", 3, 0 } , -{ "Hammerin' Harry (US)" ,"hharryu" , "mame", 1, 0 } , -{ "Hammerin' Harry (World)" ,"hharry" , "mame", 1, 0 } , -{ "Hana Awase (Flower Matching)" ,"hanaawas" , "mame", 3, 0 } , -{ "Hang-On" ,"hangon" , "mame", 3, 0 } , -{ "Hangly-Man (set 1)" ,"hangly" , "mame", 3, 0 } , -{ "Hangly-Man (set 2)" ,"hangly2" , "mame", 3, 0 } , -{ "Hard Hat" ,"hardhat" , "mame", 3, 0 } , -{ "Hard Head" ,"hardhead" , "mame", 3, 0 } , -{ "Hard Head (Bootleg)" ,"hardhedb" , "mame", 3, 0 } , -{ "Hard Puncher (Japan)" ,"hpuncher" , "mame", 3, 0 } , -{ "Hat Trick Hero (Japan)" ,"hthero" , "mame", 3, 0 } , -{ "Hat Trick" ,"hattrick" , "mame", 3, 0 } , -{ "Hatris (Japan)" ,"hatris" , "mame", 1, 0 } , -{ "Haunted Castle (set 1)" ,"hcastle" , "mame", 3, 0 } , -{ "Haunted Castle (set 2)" ,"hcastlea" , "mame", 3, 0 } , -{ "Head On (1 player)" ,"headonb" , "mame", 3, 0 } , -{ "Head On (2 players)" ,"headon" , "mame", 3, 0 } , -{ "Head On 2" ,"headon2" , "mame", 3, 0 } , -{ "Heavy Barrel (US)" ,"hbarrel" , "mame", 3, 0 } , -{ "Heavy Barrel (World)" ,"hbarrelw" , "mame", 3, 0 } , -{ "Heavy Metal" ,"hvymetal" , "mame", 5, 0 } , -{ "Heavyweight Champ" ,"hwchamp" , "mame", 1, 0 } , -{ "Hebereke no Popoon (Japan)" ,"heberpop" , "mame", 3, 0 } , -{ "Heiankyo Alien" ,"heiankyo" , "mame", 3, 0 } , -{ "HeliFire (revision A)" ,"helifira" , "mame", 3, 0 } , -{ "HeliFire (revision B)" ,"helifire" , "mame", 3, 0 } , -{ "Hellfire" ,"hellfire" , "mame", 3, 0 } , -{ "Herbie at the Olympics (DK conversion)" ,"herbiedk" , "mame", 3, 0 } , -{ "Hexa" ,"hexa" , "mame", 3, 0 } , -{ "High Impact Football (rev LA3 12/27/90)" ,"hiimpact" , "mame", 3, 0 } , -{ "High Way Race" ,"hwrace" , "mame", 3, 0 } , -{ "Hippodrome (US)" ,"hippodrm" , "mame", 3, 0 } , -{ "Hishou Zame (Japan)" ,"hishouza" , "mame", 3, 0 } , -{ "Hit 'n Miss (version 2.0)" ,"hitnmis2" , "mame", 3, 0 } , -{ "Hit 'n Miss (version 3.0)" ,"hitnmiss" , "mame", 3, 0 } , -{ "Hit the Ice (US)" ,"hitice" , "mame", 3, 0 } , -{ "Hoccer (set 1)" ,"hoccer" , "mame", 3, 0 } , -{ "Hoccer (set 2)" ,"hoccer2" , "mame", 3, 0 } , -{ "Homo" ,"homo" , "mame", 3, 0 } , -{ "Hook (US)" ,"hooku" , "mame", 3, 0 } , -{ "Hook (World)" ,"hook" , "mame", 3, 0 } , -{ "Hopper Robo" ,"hopprobo" , "mame", 3, 0 } , -{ "Hopping Mappy" ,"hopmappy" , "mame", 3, 0 } , -{ "Hot Chase" ,"hotchase" , "mame", 3, 0 } , -{ "Hot Shocker" ,"hotshock" , "mame", 3, 0 } , -{ "Hunchback (Donkey Kong conversion)" ,"hunchbkd" , "mame", 3, 0 } , -{ "Hunchback (Scramble hardware)" ,"hunchbks" , "mame", 3, 0 } , -{ "Hustle" ,"hustle" , "mame", 3, 0 } , -{ "Hustler, The (Japan version J)" ,"thehustj" , "mame", 3, 0 } , -{ "Hustler, The (Japan version M)" ,"thehustl" , "mame", 3, 0 } , -{ "Hydra (prototype)" ,"hydrap" , "mame", 3, 0 } , -{ "Hydra" ,"hydra" , "mame", 3, 0 } , -{ "Hyper Olympic (bootleg)" ,"hyprolyb" , "mame", 3, 0 } , -{ "Hyper Olympic" ,"hyprolym" , "mame", 3, 0 } , -{ "Hyper Olympics '84" ,"hpolym84" , "mame", 3, 0 } , -{ "Hyper Sports Special (Japan)" ,"hypsptsp" , "mame", 3, 0 } , -{ "Hyper Sports" ,"hyperspt" , "mame", 3, 0 } , -{ "I'm Sorry (Japan)" ,"imsorryj" , "mame", 5, 0 } , -{ "I'm Sorry (US)" ,"imsorry" , "mame", 5, 0 } , -{ "I, Robot" ,"irobot" , "mame", 3, 0 } , -{ "Iga Ninjyutsuden (Japan)" ,"iganinju" , "mame", 0, 0 } , -{ "Ikari III - The Rescue" ,"ikari3" , "mame", 3, 0 } , -{ "Ikari Warriors (Japan bootleg)" ,"ikarijpb" , "mame", 3, 0 } , -{ "Ikari Warriors (Japan)" ,"ikarijp" , "mame", 3, 0 } , -{ "Ikari Warriors (US)" ,"ikari" , "mame", 3, 0 } , -{ "Image Fight (Japan)" ,"imgfight" , "mame", 1, 0 } , -{ "In The Hunt (US)" ,"inthuntu" , "mame", 3, 0 } , -{ "In The Hunt (World)" ,"inthunt" , "mame", 3, 0 } , -{ "Indiana Jones and the Temple of Doom (set 1)" ,"indytemp" , "mame", 0, 0 } , -{ "Indiana Jones and the Temple of Doom (set 2)" ,"indytem2" , "mame", 0, 0 } , -{ "Indiana Jones and the Temple of Doom (set 3)" ,"indytem3" , "mame", 0, 0 } , -{ "Indiana Jones and the Temple of Doom (set 4)" ,"indytem4" , "mame", 0, 0 } , -{ "Inferno" ,"inferno" , "mame", 3, 0 } , -{ "Insector (prototype)" ,"insector" , "mame", 3, 0 } , -{ "Insector X (World)" ,"insectx" , "mame", 1, 0 } , -{ "Intrepid (set 1)" ,"intrepid" , "mame", 3, 0 } , -{ "Intrepid (set 2)" ,"intrepi2" , "mame", 3, 0 } , -{ "Invader's Revenge (Dutchford)" ,"invrvnga" , "mame", 3, 0 } , -{ "Invader's Revenge" ,"invrvnge" , "mame", 3, 0 } , -{ "Invinco / Deep Scan" ,"invds" , "mame", 3, 0 } , -{ "Invinco / Head On 2" ,"invho2" , "mame", 3, 0 } , -{ "Invinco" ,"invinco" , "mame", 3, 0 } , -{ "Irem Skins Game, The (US set 1)" ,"skingame" , "mame", 3, 0 } , -{ "Irem Skins Game, The (US set 2)" ,"skingam2" , "mame", 3, 0 } , -{ "Iron Horse" ,"ironhors" , "mame", 3, 0 } , -{ "Ironman Stewart's Super Off-Road Track Pack" ,"offroadt" , "mame", 3, 0 } , -{ "Ironman Stewart's Super Off-Road" ,"offroad" , "mame", 3, 0 } , -{ "Irritating Maze / Ultra Denryu Iraira Bou, The" ,"irrmaze" , "neomame", 3, 0 } , -{ "Jack Rabbit (set 1)" ,"jackrabt" , "mame", 3, 0 } , -{ "Jack Rabbit (set 2)" ,"jackrab2" , "mame", 3, 0 } , -{ "Jack Rabbit (special)" ,"jackrabs" , "mame", 3, 0 } , -{ "Jack the Giantkiller (set 1)" ,"jack" , "mame", 3, 0 } , -{ "Jack the Giantkiller (set 2)" ,"jack2" , "mame", 3, 0 } , -{ "Jack the Giantkiller (set 3)" ,"jack3" , "mame", 3, 0 } , -{ "Jackal (World)" ,"jackal" , "mame", 3, 0 } , -{ "Jackson" ,"zaxxonb" , "mame", 1, 0 } , -{ "Jail Break" ,"jailbrek" , "mame", 3, 0 } , -{ "Jatre Specter" ,"jspecter" , "mame", 3, 0 } , -{ "Joe & Mac (Japan)" ,"joemac" , "mame", 3, 0 } , -{ "John Elway's Team Quarterback (set 2)" ,"teamqb2" , "mame", 3, 0 } , -{ "John Elway's Team Quarterback" ,"teamqb" , "mame", 3, 0 } , -{ "Journey" ,"journey" , "mame", 1, 0 } , -{ "Joust (Solid Red label)" ,"joustr" , "mame", 3, 0 } , -{ "Joust (White/Green label)" ,"joust" , "mame", 3, 0 } , -{ "Joust (White/Red label)" ,"joustwr" , "mame", 3, 0 } , -{ "Joust 2 - Survival of the Fittest (set 1)" ,"joust2" , "mame", 3, 0 } , -{ "Joyful Road (US)" ,"joyfulr" , "mame", 3, 0 } , -{ "Jr. Pac-Man" ,"jrpacman" , "mame", 3, 0 } , -{ "Jump Bug (bootleg)" ,"jumpbugb" , "mame", 3, 0 } , -{ "Jump Bug" ,"jumpbug" , "mame", 3, 0 } , -{ "Jump Coaster" ,"jumpcoas" , "mame", 3, 0 } , -{ "Jump Shot" ,"jumpshot" , "mame", 1, 0 } , -{ "Jumping Jack" ,"jjack" , "mame", 1, 0 } , -{ "Jumping" ,"jumping" , "mame", 3, 0 } , -{ "Jungle Hunt (US)" ,"jungleh" , "mame", 3, 0 } , -{ "Jungle King (Japan)" ,"junglek" , "mame", 3, 0 } , -{ "Jungle King (Japan, earlier)" ,"junglkj2" , "mame", 3, 0 } , -{ "Jungler (Stern)" ,"junglers" , "mame", 3, 0 } , -{ "Jungler" ,"jungler" , "mame", 3, 0 } , -{ "Juno First (Gottlieb)" ,"junofstg" , "mame", 3, 0 } , -{ "Juno First" ,"junofrst" , "mame", 3, 0 } , -{ "Jyanshin Densetsu - Quest of Jongmaster" ,"janshin" , "neomame", 3, 0 } , -{ "Jyuohki (Japan)" ,"jyuohki" , "mame", 1, 0 } , -{ "Kabuki Klash - Far East of Eden / Tengai Makyou Shinden - Far East of Eden" ,"kabukikl" , "neomame", 3, 0 } , -{ "Kageki (Japan)" ,"kagekij" , "mame", 3, 0 } , -{ "Kageki (US)" ,"kageki" , "mame", 3, 0 } , -{ "Kaiketsu Yanchamaru (Japan)" ,"yanchamr" , "mame", 3, 0 } , -{ "Kaitei Daisensou (Japan)" ,"kaiteids" , "mame", 3, 0 } , -{ "Kaitei Takara Sagashi (Namco)" ,"kaitein" , "mame", 3, 0 } , -{ "Kaitei Takara Sagashi" ,"kaitei" , "mame", 3, 0 } , -{ "Kamikaze" ,"kamikaze" , "mame", 3, 0 } , -{ "Kangaroo (Atari)" ,"kangaroa" , "mame", 3, 0 } , -{ "Kangaroo (bootleg)" ,"kangarob" , "mame", 3, 0 } , -{ "Kangaroo" ,"kangaroo" , "mame", 3, 0 } , -{ "Kaos" ,"kaos" , "mame", 3, 0 } , -{ "Karate Blazers (US)" ,"karatblu" , "mame", 1, 0 } , -{ "Karate Blazers (World?)" ,"karatblz" , "mame", 1, 0 } , -{ "Karate Champ (US VS version)" ,"kchampvs" , "mame", 3, 0 } , -{ "Karate Champ (US)" ,"kchamp" , "mame", 3, 0 } , -{ "Karate Dou (Japan)" ,"karatedo" , "mame", 3, 0 } , -{ "Karian Cross" ,"karianx" , "mame", 3, 0 } , -{ "Karnov (Japan)" ,"karnovj" , "mame", 3, 0 } , -{ "Karnov (US)" ,"karnov" , "mame", 3, 0 } , -{ "Karnov's Revenge / Fighter's History Dynamite" ,"karnovr" , "neomame", 3, 0 } , -{ "KiKi KaiKai" ,"kikikai" , "mame", 1, 0 } , -{ "Kick (cocktail)" ,"kicka" , "mame", 5, 0 } , -{ "Kick (upright)" ,"kick" , "mame", 5, 0 } , -{ "Kick Off (Japan)" ,"kickoff" , "mame", 3, 0 } , -{ "Kick Rider" ,"kickridr" , "mame", 1, 0 } , -{ "Kick Start Wheelie King" ,"kikstart" , "mame", 1, 0 } , -{ "Kick and Run" ,"kicknrun" , "mame", 1, 0 } , -{ "Kicker" ,"kicker" , "mame", 3, 0 } , -{ "Kid Niki - Radical Ninja (US)" ,"kidniki" , "mame", 3, 0 } , -{ "Killer Comet" ,"killcom" , "mame", 3, 0 } , -{ "King & Balloon (Japan)" ,"kingbalj" , "mame", 3, 0 } , -{ "King & Balloon (US)" ,"kingball" , "mame", 3, 0 } , -{ "King of Boxer (English)" ,"kingofb" , "mame", 3, 0 } , -{ "King of Dragons, The (Japan)" ,"kodj" , "mame", 3, 0 } , -{ "King of Dragons, The (World)" ,"kod" , "mame", 3, 0 } , -{ "King of Dragons, The (bootleg)" ,"kodb" , "mame", 3, 0 } , -{ "King of Fighters '94, The" ,"kof94" , "neomame", 3, 0 } , -{ "King of Fighters '95, The" ,"kof95" , "neomame", 3, 0 } , -{ "King of Fighters '96, The" ,"kof96" , "neomame", 3, 0 } , -{ "King of Fighters '97, The" ,"kof97" , "neomame", 3, 0 } , -{ "King of Fighters '98 - The Slugfest / King of Fighters '98 - dream match never ends, The" ,"kof98" , "neomame", 3, 0 } , -{ "King of the Monsters 2 - The Next Thing" ,"kotm2" , "neomame", 3, 0 } , -{ "King of the Monsters" ,"kotm" , "neomame", 3, 0 } , -{ "Kizuna Encounter - Super Tag Battle / Fu'un Super Tag Battle" ,"kizuna" , "neomame", 3, 0 } , -{ "Klax (Japan)" ,"klaxj" , "mame", 3, 0 } , -{ "Klax (set 1)" ,"klax" , "mame", 3, 0 } , -{ "Klax (set 2)" ,"klax2" , "mame", 3, 0 } , -{ "Klax (set 3)" ,"klax3" , "mame", 3, 0 } , -{ "Knights of the Round (Japan)" ,"knightsj" , "mame", 3, 0 } , -{ "Knights of the Round (World)" ,"knights" , "mame", 3, 0 } , -{ "Knock Out !!" ,"knockout" , "mame", 3, 0 } , -{ "Knuckle Bash" ,"kbash" , "mame", 3, 0 } , -{ "Knuckle Joe (set 1)" ,"kncljoe" , "mame", 3, 0 } , -{ "Knuckle Joe (set 2)" ,"kncljoea" , "mame", 3, 0 } , -{ "Kodure Ookami (Japan)" ,"kodure" , "mame", 3, 0 } , -{ "Koi no Hotrock (Japan)" ,"rockragj" , "mame", 3, 0 } , -{ "Konami '88" ,"konami88" , "mame", 3, 0 } , -{ "Konami GT" ,"konamigt" , "mame", 3, 0 } , -{ "Konami RF2 - Red Fighter" ,"rf2" , "mame", 3, 0 } , -{ "Koukuu Kihei Monogatari - The Legend of Air Cavalry" ,"legofair" , "mame", 3, 0 } , -{ "Kozmik Kroozr" ,"kroozr" , "mame", 1, 0 } , -{ "Kram (set 1)" ,"kram" , "mame", 3, 0 } , -{ "Kram (set 2)" ,"kram2" , "mame", 3, 0 } , -{ "Krull" ,"krull" , "mame", 3, 0 } , -{ "Kuhga - Operation Code 'Vapor Trail' (Japan revision 3)" ,"kuhga" , "mame", 3, 0 } , -{ "Kung Fu Master (Data East)" ,"kungfud" , "mame", 3, 0 } , -{ "Kung Fu Master (bootleg set 1)" ,"kungfub" , "mame", 3, 0 } , -{ "Kung Fu Master (bootleg set 2)" ,"kungfub2" , "mame", 3, 0 } , -{ "Kung Fu Master" ,"kungfum" , "mame", 3, 0 } , -{ "Kuri Kinton (World)" ,"kurikint" , "mame", 3, 0 } , -{ "Kuri Kinton (prototype?)" ,"kurikina" , "mame", 3, 0 } , -{ "Kyohkoh-Toppa (Japan)" ,"brkthruj" , "mame", 3, 0 } , -{ "Kyros" ,"kyros" , "mame", 3, 0 } , -{ "Kyukyoku Tiger (Japan)" ,"ktiger" , "mame", 3, 0 } , -{ "Kyuukai Douchuuki (Japan new version)" ,"kyukaidk" , "mame", 3, 0 } , -{ "Kyuukai Douchuuki (Japan old version)" ,"kyukaido" , "mame", 3, 0 } , -{ "Labyrinth Runner (Japan)" ,"labyrunr" , "mame", 3, 0 } , -{ "Lady Bug (bootleg)" ,"ladybugb" , "mame", 3, 0 } , -{ "Lady Bug" ,"ladybug" , "mame", 3, 0 } , -{ "Laguna Racer" ,"lagunar" , "mame", 3, 0 } , -{ "Land Sea Air Squad / Riku Kai Kuu Saizensen" ,"lsasquad" , "mame", 3, 0 } , -{ "Laser" ,"laser" , "mame", 3, 0 } , -{ "Lasso" ,"lasso" , "mame", 3, 0 } , -{ "Last Blade / Bakumatsu Roman - Gekkano Kenshi, The" ,"lastblad" , "neomame", 3, 0 } , -{ "Last Blade 2 / Bakumatsu Roman - Dai Ni Maku Gekkano Kenshi, The" ,"lastbld2" , "neomame", 3, 0 } , -{ "Last Duel (US set 1)" ,"lastduel" , "mame", 3, 0 } , -{ "Last Duel (US set 2)" ,"lstduela" , "mame", 3, 0 } , -{ "Last Duel (bootleg)" ,"lstduelb" , "mame", 3, 0 } , -{ "Last Mission (US revision 5)" ,"lastmss2" , "mame", 3, 0 } , -{ "Last Mission (US revision 6)" ,"lastmiss" , "mame", 3, 0 } , -{ "Last Resort" ,"lresort" , "neomame", 3, 0 } , -{ "Lazer Command" ,"lazercmd" , "mame", 3, 0 } , -{ "Le Bagnard" ,"bagnard" , "mame", 3, 0 } , -{ "League Bowling" ,"lbowling" , "neomame", 3, 0 } , -{ "Led Storm (US)" ,"ledstorm" , "mame", 3, 0 } , -{ "Legend of Hero Tonma" ,"loht" , "mame", 1, 0 } , -{ "Legend of Kage, The (bootleg set 1)" ,"lkageb" , "mame", 3, 0 } , -{ "Legend of Kage, The (bootleg set 2)" ,"lkageb2" , "mame", 3, 0 } , -{ "Legend of Kage, The (bootleg set 3)" ,"lkageb3" , "mame", 3, 0 } , -{ "Legend of Kage, The" ,"lkage" , "mame", 3, 0 } , -{ "Legend of Makai (World)" ,"lomakai" , "mame", 3, 0 } , -{ "Legend of Success Joe / Ashitano Joe Densetsu" ,"legendos" , "neomame", 3, 0 } , -{ "Legend of the Valkyrie (Japan)" ,"valkyrie" , "mame", 3, 0 } , -{ "Legendary Wings (US set 1)" ,"lwings" , "mame", 5, 0 } , -{ "Legendary Wings (US set 2)" ,"lwings2" , "mame", 5, 0 } , -{ "Leprechaun" ,"leprechn" , "mame", 3, 0 } , -{ "Lethal Thunder (World)" ,"lethalth" , "mame", 3, 0 } , -{ "Levers" ,"levers" , "mame", 3, 0 } , -{ "Liberator (set 1)" ,"liberatr" , "mame", 3, 0 } , -{ "Lifeforce (Japan)" ,"lifefrcj" , "mame", 3, 0 } , -{ "Lifeforce (US)" ,"lifefrce" , "mame", 3, 0 } , -{ "Lightning Fighters (US)" ,"lgtnfght" , "mame", 3, 0 } , -{ "Liquid Kids (US)" ,"liquidku" , "mame", 3, 0 } , -{ "Liquid Kids (World)" ,"liquidk" , "mame", 3, 0 } , -{ "Lizard Wizard" ,"lizwiz" , "mame", 3, 0 } , -{ "Lock'n'Chase" ,"lnc" , "mame", 3, 0 } , -{ "Loco-Motion" ,"locomotn" , "mame", 3, 0 } , -{ "Lode Runner (set 1)" ,"ldrun" , "mame", 3, 0 } , -{ "Lode Runner (set 2)" ,"ldruna" , "mame", 3, 0 } , -{ "Lode Runner II - The Bungeling Strikes Back" ,"ldrun2" , "mame", 3, 0 } , -{ "Lode Runner III - Majin No Fukkatsu" ,"ldrun3" , "mame", 3, 0 } , -{ "Lode Runner IV - Teikoku Karano Dasshutsu" ,"ldrun4" , "mame", 3, 0 } , -{ "Logic Pro" ,"logicpro" , "mame", 3, 0 } , -{ "Logic Pro 2 (Japan)" ,"logicpr2" , "mame", 3, 0 } , -{ "Looper" ,"looper" , "mame", 3, 0 } , -{ "Lord of King, The (Japan)" ,"lordofk" , "mame", 3, 0 } , -{ "Lost Tomb (easy)" ,"losttomb" , "mame", 3, 0 } , -{ "Lost Tomb (hard)" ,"losttmbh" , "mame", 3, 0 } , -{ "Lost Worlds (Japan)" ,"lostwrld" , "mame", 3, 0 } , -{ "Lot Lot" ,"lotlot" , "mame", 3, 0 } , -{ "Lunar Lander (rev 1)" ,"llander1" , "mame", 3, 0 } , -{ "Lunar Lander (rev 2)" ,"llander" , "mame", 3, 0 } , -{ "Lunar Rescue" ,"lrescue" , "mame", 3, 0 } , -{ "Lupin III" ,"lupin3" , "mame", 3, 0 } , -{ "M-4" ,"m4" , "mame", 3, 0 } , -{ "M.A.C.H. 3" ,"mach3" , "mame", 3, 0 } , -{ "M79 Ambush" ,"m79amb" , "mame", 3, 0 } , -{ "MX5000" ,"mx5000" , "mame", 3, 0 } , -{ "Macho Mouse" ,"machomou" , "mame", 3, 0 } , -{ "Mad Crasher" ,"madcrash" , "mame", 3, 0 } , -{ "Mad Gear (Japan)" ,"madgearj" , "mame", 3, 0 } , -{ "Mad Gear (US)" ,"madgear" , "mame", 3, 0 } , -{ "Mad Motor" ,"madmotor" , "mame", 3, 0 } , -{ "Mad Planets" ,"mplanets" , "mame", 3, 0 } , -{ "Magic Brush" ,"mbrush" , "mame", 3, 0 } , -{ "Magic Sword (Japan)" ,"mswordj" , "mame", 3, 0 } , -{ "Magic Sword - Heroic Fantasy (US)" ,"mswordu" , "mame", 3, 0 } , -{ "Magic Sword - Heroic Fantasy (World)" ,"msword" , "mame", 3, 0 } , -{ "Magical Drop II" ,"magdrop2" , "neomame", 3, 0 } , -{ "Magical Drop III" ,"magdrop3" , "neomame", 3, 0 } , -{ "Magical Spot II" ,"magspot2" , "mame", 3, 0 } , -{ "Magician Lord (set 1)" ,"maglord" , "neomame", 3, 0 } , -{ "Magician Lord (set 2)" ,"maglordh" , "neomame", 3, 0 } , -{ "Magix" ,"magix" , "mame", 3, 0 } , -{ "Mahjong Gakuen 2 Gakuen-chou no Fukushuu" ,"mgakuen2" , "mame", 1, 0 } , -{ "Mahjong Gakuen" ,"mgakuen" , "mame", 3, 0 } , -{ "Mahjong Kyoretsuden" ,"mahretsu" , "neomame", 3, 0 } , -{ "Mahjong Quest (Japan)" ,"mjnquest" , "mame", 3, 0 } , -{ "Mahjong Quest (No Nudity)" ,"mjnquesb" , "mame", 3, 0 } , -{ "Mahou Daisakusen (Japan)" ,"mahoudai" , "mame", 3, 0 } , -{ "Main Event, The (version F)" ,"mainevt2" , "mame", 3, 0 } , -{ "Main Event, The (version Y)" ,"mainevt" , "mame", 3, 0 } , -{ "Majestic Twelve - The Space Invaders Part IV (Japan)" ,"majest12" , "mame", 3, 0 } , -{ "Major Havoc (Return to Vax)" ,"mhavocrv" , "mame", 3, 0 } , -{ "Major Havoc (prototype)" ,"mhavocp" , "mame", 3, 0 } , -{ "Major Havoc (rev 2)" ,"mhavoc2" , "mame", 3, 0 } , -{ "Major Havoc (rev 3)" ,"mhavoc" , "mame", 3, 0 } , -{ "Major League" ,"mjleague" , "mame", 1, 0 } , -{ "Major Title (Japan)" ,"majtitle" , "mame", 1, 0 } , -{ "Major Title 2 (World)" ,"majtitl2" , "mame", 3, 0 } , -{ "Majuu no Ohkoku" ,"majuu" , "mame", 3, 0 } , -{ "Makai Densetsu (Japan)" ,"makaiden" , "mame", 3, 0 } , -{ "Makai-Mura (Revision C)" ,"makaimuc" , "mame", 3, 0 } , -{ "Makai-Mura (Revision G)" ,"makaimug" , "mame", 3, 0 } , -{ "Makai-Mura" ,"makaimur" , "mame", 3, 0 } , -{ "Make Trax" ,"maketrax" , "mame", 1, 0 } , -{ "Makyou Senshi (Japan)" ,"makyosen" , "mame", 3, 0 } , -{ "Mania Challenge (set 1)" ,"maniach" , "mame", 3, 0 } , -{ "Mania Challenge (set 2)" ,"maniach2" , "mame", 3, 0 } , -{ "Mappy (Japan)" ,"mappyjp" , "mame", 3, 0 } , -{ "Mappy (US)" ,"mappy" , "mame", 3, 0 } , -{ "Marble Madness (set 1)" ,"marble" , "mame", 3, 0 } , -{ "Marble Madness (set 2)" ,"marble2" , "mame", 3, 0 } , -{ "Marble Madness (set 3)" ,"marblea" , "mame", 3, 0 } , -{ "Marchen Maze (Japan)" ,"mmaze" , "mame", 3, 0 } , -{ "Marine Boy" ,"marineb" , "mame", 3, 0 } , -{ "Mariner" ,"mariner" , "mame", 3, 0 } , -{ "Mario Bros. (Japan)" ,"mariojp" , "mame", 3, 0 } , -{ "Mario Bros. (US)" ,"mario" , "mame", 3, 0 } , -{ "Mars" ,"mars" , "mame", 3, 0 } , -{ "Marvel Land (Japan)" ,"marvlanj" , "mame", 3, 0 } , -{ "Marvel Land (US)" ,"marvland" , "mame", 3, 0 } , -{ "Marvin's Maze" ,"marvins" , "mame", 3, 0 } , -{ "Masao" ,"masao" , "mame", 3, 0 } , -{ "Master of Weapon (World)" ,"masterw" , "mame", 3, 0 } , -{ "Mat Mania" ,"matmania" , "mame", 3, 0 } , -{ "Max RPM" ,"maxrpm" , "mame", 1, 0 } , -{ "Mayday (set 1)" ,"mayday" , "mame", 3, 0 } , -{ "Mayday (set 2)" ,"maydaya" , "mame", 3, 0 } , -{ "Mayhem 2002" ,"mayhem" , "mame", 3, 0 } , -{ "Meadows Lanes" ,"medlanes" , "mame", 3, 0 } , -{ "Mega Force" ,"megaforc" , "mame", 1, 0 } , -{ "Mega Man - The Power Battle (Asia)" ,"megaman" , "mame", 3, 0 } , -{ "Mega Twins (World)" ,"mtwins" , "mame", 3, 0 } , -{ "Mega Zone (Kosuka)" ,"megaznik" , "mame", 3, 0 } , -{ "Mega Zone" ,"megazone" , "mame", 3, 0 } , -{ "MegaTack" ,"megatack" , "mame", 3, 0 } , -{ "Meikyu Jima (Japan)" ,"kikcubic" , "mame", 1, 0 } , -{ "Meikyuu Hunter G (Japan)" ,"meikyuh" , "mame", 3, 0 } , -{ "Mercs (US)" ,"mercsu" , "mame", 3, 0 } , -{ "Mercs (World)" ,"mercs" , "mame", 3, 0 } , -{ "Mermaid" ,"mermaid" , "mame", 3, 0 } , -{ "Meta Fox" ,"metafox" , "mame", 3, 0 } , -{ "Metal Slug - Super Vehicle-001" ,"mslug" , "neomame", 3, 0 } , -{ "Metal Slug 2 - Super Vehicle-001/II" ,"mslug2" , "neomame", 3, 0 } , -{ "Meteoroids" ,"meteor" , "mame", 3, 0 } , -{ "Metro-Cross" ,"metrocrs" , "mame", 3, 0 } , -{ "Mexico 86" ,"mexico86" , "mame", 1, 0 } , -{ "Midnight Resistance (Japan)" ,"midresj" , "mame", 3, 0 } , -{ "Midnight Resistance (US)" ,"midresu" , "mame", 3, 0 } , -{ "Midnight Resistance (World)" ,"midres" , "mame", 3, 0 } , -{ "Mikie (High School Graffiti)" ,"mikiehs" , "mame", 3, 0 } , -{ "Mikie" ,"mikie" , "mame", 3, 0 } , -{ "Millipede" ,"milliped" , "mame", 3, 0 } , -{ "Minefield" ,"minefld" , "mame", 3, 0 } , -{ "Mini Golf (set 1)" ,"minigolf" , "mame", 3, 0 } , -{ "Mini Golf (set 2)" ,"minigol2" , "mame", 3, 0 } , -{ "Minivader" ,"minivadr" , "mame", 3, 0 } , -{ "Minky Monkey" ,"mmonkey" , "mame", 3, 0 } , -{ "Minnasanno Okagesamadesu" ,"minasan" , "neomame", 3, 0 } , -{ "Mirai Ninja (Japan)" ,"mirninja" , "mame", 3, 0 } , -{ "Missile Command (set 1)" ,"missile" , "mame", 3, 0 } , -{ "Missile Command (set 2)" ,"missile2" , "mame", 3, 0 } , -{ "Missing in Action (Japan)" ,"miaj" , "mame", 3, 0 } , -{ "Missing in Action (version S)" ,"mia2" , "mame", 3, 0 } , -{ "Missing in Action (version T)" ,"mia" , "mame", 3, 0 } , -{ "Mister Viking (Japan)" ,"mrvikinj" , "mame", 5, 0 } , -{ "Mister Viking" ,"mrviking" , "mame", 5, 0 } , -{ "Mizubaku Daibouken (Japan)" ,"mizubaku" , "mame", 3, 0 } , -{ "Moguchan" ,"moguchan" , "mame", 1, 0 } , -{ "Mole Attack" ,"mole" , "mame", 3, 0 } , -{ "Momoko 120%" ,"momoko" , "mame", 3, 0 } , -{ "Money Money" ,"monymony" , "mame", 3, 0 } , -{ "Money Puzzle Exchanger / Money Idol Exchanger" ,"miexchng" , "neomame", 3, 0 } , -{ "Monkey Donkey" ,"monkeyd" , "mame", 3, 0 } , -{ "Monster Bash" ,"monsterb" , "mame", 1, 0 } , -{ "Moon Alien Part 2 (older version)" ,"moonal2b" , "mame", 3, 0 } , -{ "Moon Alien Part 2" ,"moonal2" , "mame", 3, 0 } , -{ "Moon Base" ,"moonbase" , "mame", 3, 0 } , -{ "Moon Cresta (Gremlin)" ,"mooncrsg" , "mame", 3, 0 } , -{ "Moon Cresta (Nichibutsu)" ,"mooncrst" , "mame", 3, 0 } , -{ "Moon Cresta (bootleg on Galaxian hardware)" ,"mooncrgx" , "mame", 3, 0 } , -{ "Moon Cresta (bootleg set 1)" ,"mooncrsb" , "mame", 3, 0 } , -{ "Moon Cresta (bootleg set 2)" ,"mooncrs2" , "mame", 3, 0 } , -{ "Moon Patrol (Williams)" ,"mpatrolw" , "mame", 3, 0 } , -{ "Moon Patrol" ,"mpatrol" , "mame", 3, 0 } , -{ "Moon Quasar" ,"moonqsr" , "mame", 1, 0 } , -{ "Moon Ranger" ,"mranger" , "mame", 3, 0 } , -{ "Moon Walker (Set 1)" ,"moonwalk" , "mame", 1, 0 } , -{ "Moon Walker (Set 2)" ,"moonwlka" , "mame", 1, 0 } , -{ "Moon Walker (bootleg)" ,"moonwlkb" , "mame", 1, 0 } , -{ "Moon War II (set 1)" ,"moonwar2" , "mame", 3, 0 } , -{ "Moon War II (set 2)" ,"monwar2a" , "mame", 3, 0 } , -{ "Mortal Kombat (rev 1.0 08/08/92)" ,"mkla1" , "mame", 3, 0 } , -{ "Mortal Kombat (rev 2.0 08/18/92)" ,"mkla2" , "mame", 3, 0 } , -{ "Mortal Kombat (rev 3.0 08/31/92)" ,"mkla3" , "mame", 3, 0 } , -{ "Mortal Kombat (rev 4.0 09/28/92)" ,"mkla4" , "mame", 3, 0 } , -{ "Mortal Kombat (rev 5.0 T-Unit 03/19/93)" ,"mk" , "mame", 3, 0 } , -{ "Mortal Kombat 3 (rev 1.0)" ,"mk3r10" , "mame", 3, 0 } , -{ "Mortal Kombat 3 (rev 2.0)" ,"mk3r20" , "mame", 3, 0 } , -{ "Mortal Kombat 3 (rev 2.1)" ,"mk3" , "mame", 3, 0 } , -{ "Mortal Kombat II (rev L1.4)" ,"mk2r14" , "mame", 3, 0 } , -{ "Mortal Kombat II (rev L3.1)" ,"mk2" , "mame", 3, 0 } , -{ "Mortal Kombat II (rev L3.2 (European))" ,"mk2r32" , "mame", 3, 0 } , -{ "MotoRace USA" ,"motorace" , "mame", 3, 0 } , -{ "Motos" ,"motos" , "mame", 3, 0 } , -{ "Mouse Trap (version 3)" ,"mtrap3" , "mame", 3, 0 } , -{ "Mouse Trap (version 4)" ,"mtrap4" , "mame", 3, 0 } , -{ "Mouse Trap (version 5)" ,"mtrap" , "mame", 3, 0 } , -{ "Mr. Do vs. Unicorns" ,"douni" , "mame", 1, 0 } , -{ "Mr. Do! (Taito)" ,"mrdot" , "mame", 3, 0 } , -{ "Mr. Do! (Universal)" ,"mrdo" , "mame", 3, 0 } , -{ "Mr. Do! (Yukidaruma)" ,"mrdoy" , "mame", 3, 0 } , -{ "Mr. Do! (bugfixed)" ,"mrdofix" , "mame", 3, 0 } , -{ "Mr. Do's Castle (set 1)" ,"docastle" , "mame", 1, 0 } , -{ "Mr. Do's Castle (set 2)" ,"docastl2" , "mame", 1, 0 } , -{ "Mr. Do's Wild Ride" ,"dowild" , "mame", 1, 0 } , -{ "Mr. Du!" ,"mrdu" , "mame", 3, 0 } , -{ "Mr. Goemon (Japan)" ,"mrgoemon" , "mame", 3, 0 } , -{ "Mr. HELI no Dai-Bouken" ,"mrheli" , "mame", 1, 0 } , -{ "Mr. Jong (Japan)" ,"mrjong" , "mame", 3, 0 } , -{ "Mr. Lo!" ,"mrlo" , "mame", 3, 0 } , -{ "Mr. TNT" ,"mrtnt" , "mame", 3, 0 } , -{ "Ms. Pac-Man Plus" ,"mspacatk" , "mame", 3, 0 } , -{ "Ms. Pac-Man" ,"mspacman" , "mame", 3, 0 } , -{ "Munch Mobile (Japan)" ,"mnchmobl" , "mame", 3, 0 } , -{ "Muscle Bomber - The Body Explosion (Japan)" ,"mbomberj" , "mame", 1, 0 } , -{ "Muscle Bomber Duo - Heat Up Warriors (Japan)" ,"mbombrdj" , "mame", 1, 0 } , -{ "Muscle Bomber Duo - Ultimate Team Battle (World)" ,"mbombrd" , "mame", 1, 0 } , -{ "Mutant Night" ,"mnight" , "mame", 1, 0 } , -{ "Mutation Nation" ,"mutnat" , "neomame", 3, 0 } , -{ "My Hero (Korea)" ,"myherok" , "mame", 3, 0 } , -{ "My Hero (US)" ,"myhero" , "mame", 3, 0 } , -{ "Mysterious Stones" ,"mystston" , "mame", 3, 0 } , -{ "Mystic Marathon" ,"mysticm" , "mame", 3, 0 } , -{ "Mystic Riders (World)" ,"mysticri" , "mame", 3, 0 } , -{ "NAM-1975" ,"nam1975" , "neomame", 3, 0 } , -{ "NBA Jam (rev 2.00 02/10/93)" ,"nbajamr2" , "mame", 3, 0 } , -{ "NBA Jam (rev 3.01 04/07/93)" ,"nbajam" , "mame", 3, 0 } , -{ "NBA Jam TE (rev 1.0 01/17/94)" ,"nbajamt1" , "mame", 3, 0 } , -{ "NBA Jam TE (rev 2.0 01/28/94)" ,"nbajamt2" , "mame", 3, 0 } , -{ "NBA Jam TE (rev 3.0 03/04/94)" ,"nbajamt3" , "mame", 3, 0 } , -{ "NBA Jam TE (rev 4.0 03/23/94)" ,"nbajamte" , "mame", 3, 0 } , -{ "NBA Maximum Hangtime (rev 1.0)" ,"nbamaxht" , "mame", 3, 0 } , -{ "Name That Tune" ,"nametune" , "mame", 3, 0 } , -{ "Narc (rev 3.20)" ,"narc3" , "mame", 3, 0 } , -{ "Narc (rev 7.00)" ,"narc" , "mame", 3, 0 } , -{ "Nastar (World)" ,"nastar" , "mame", 3, 0 } , -{ "Nastar Warrior (US)" ,"nastarw" , "mame", 3, 0 } , -{ "Naughty Boy (Cinematronics)" ,"naughtyc" , "mame", 3, 0 } , -{ "Naughty Boy (bootleg)" ,"naughtya" , "mame", 3, 0 } , -{ "Naughty Boy" ,"naughtyb" , "mame", 3, 0 } , -{ "Navalone" ,"navalone" , "mame", 3, 0 } , -{ "Nebulous Bee" ,"nebulbee" , "mame", 3, 0 } , -{ "Nekketsu Kouha Kunio-kun (Japan bootleg)" ,"kuniokub" , "mame", 3, 0 } , -{ "Nekketsu Kouha Kunio-kun (Japan)" ,"kuniokun" , "mame", 3, 0 } , -{ "Nemesis (World?)" ,"nemesuk" , "mame", 3, 0 } , -{ "Nemesis (hacked?)" ,"nemesis" , "mame", 3, 0 } , -{ "Nemo (Japan)" ,"nemoj" , "mame", 3, 0 } , -{ "Nemo (World)" ,"nemo" , "mame", 3, 0 } , -{ "Neo Bomberman" ,"neobombe" , "neomame", 3, 0 } , -{ "Neo Drift Out - New Technology" ,"neodrift" , "neomame", 3, 0 } , -{ "Neo Mr. Do!" ,"neomrdo" , "neomame", 3, 0 } , -{ "Neo Turf Masters / Big Tournament Golf" ,"turfmast" , "neomame", 3, 0 } , -{ "Neo-Geo Cup '98 - The Road to the Victory" ,"neocup98" , "neomame", 3, 0 } , -{ "New Puck-X" ,"puckman" , "mame", 3, 0 } , -{ "New Rally X" ,"nrallyx" , "mame", 1, 0 } , -{ "New Sinbad 7" ,"newsin7" , "mame", 3, 0 } , -{ "NewZealand Story 2, The (World)" ,"tnzs2" , "mame", 1, 0 } , -{ "NewZealand Story, The (Japan)" ,"tnzs" , "mame", 1, 0 } , -{ "NewZealand Story, The (World, bootleg)" ,"tnzsb" , "mame", 1, 0 } , -{ "Nibbler (set 1)" ,"nibbler" , "mame", 3, 0 } , -{ "Nibbler (set 2)" ,"nibblera" , "mame", 3, 0 } , -{ "Night Driver" ,"nitedrvr" , "mame", 3, 0 } , -{ "Night Stocker" ,"nstocker" , "mame", 3, 0 } , -{ "Ninja Combat" ,"ncombat" , "neomame", 3, 0 } , -{ "Ninja Commando" ,"ncommand" , "neomame", 3, 0 } , -{ "Ninja Emaki (US)" ,"ninjemak" , "mame", 3, 0 } , -{ "Ninja Gaiden (World)" ,"gaiden" , "mame", 3, 0 } , -{ "Ninja Kid II (set 1)" ,"ninjakd2" , "mame", 1, 0 } , -{ "Ninja Kid II (set 2)" ,"ninjak2a" , "mame", 1, 0 } , -{ "Ninja Kid II (set 3)" ,"ninjak2b" , "mame", 1, 0 } , -{ "Ninja Kids (Japan)" ,"ninjakj" , "mame", 3, 0 } , -{ "Ninja Kids (World)" ,"ninjak" , "mame", 3, 0 } , -{ "Ninja Master's - haoh-ninpo-cho" ,"ninjamas" , "neomame", 3, 0 } , -{ "Ninja Princess (bootleg?)" ,"nprincsb" , "mame", 5, 0 } , -{ "Ninja Princess (not encrypted)" ,"nprincsu" , "mame", 5, 0 } , -{ "Ninja Princess" ,"nprinces" , "mame", 5, 0 } , -{ "Ninja Ryukenden (Japan)" ,"ryukendn" , "mame", 3, 0 } , -{ "Ninja Spirit" ,"nspirit" , "mame", 1, 0 } , -{ "No Man's Land (Gottlieb)" ,"nomnlndg" , "mame", 3, 0 } , -{ "No Man's Land" ,"nomnlnd" , "mame", 3, 0 } , -{ "Nova 2001 (Japan)" ,"nova2001" , "mame", 3, 0 } , -{ "Nova 2001 (US)" ,"nov2001u" , "mame", 3, 0 } , -{ "Nunchackun" ,"nunchaku" , "mame", 3, 0 } , -{ "Off the Wall (2-player cocktail)" ,"offtwalc" , "mame", 3, 0 } , -{ "Off the Wall (2/3-player upright)" ,"offtwall" , "mame", 3, 0 } , -{ "Off the Wall (Sente)" ,"otwalls" , "mame", 3, 0 } , -{ "Oh My God! (Japan)" ,"ohmygod" , "mame", 3, 0 } , -{ "Ohgon no Siro (Japan)" ,"ogonsiro" , "mame", 3, 0 } , -{ "Oli-Boo-Chu" ,"olibochu" , "mame", 1, 0 } , -{ "Omega Race" ,"omegrace" , "mame", 3, 0 } , -{ "Operation Ragnagard / Shin-Oh-Ken" ,"ragnagrd" , "neomame", 3, 0 } , -{ "Orbitron" ,"orbitron" , "mame", 3, 0 } , -{ "Ordyne (Japan)" ,"ordyne" , "mame", 3, 0 } , -{ "Out Run (set 1)" ,"outrun" , "mame", 1, 0 } , -{ "Out Run (set 2)" ,"outruna" , "mame", 1, 0 } , -{ "Out Run (set 3)" ,"outrunb" , "mame", 1, 0 } , -{ "Out Zone (bootleg)" ,"outzonep" , "mame", 3, 0 } , -{ "Out Zone" ,"outzone" , "mame", 3, 0 } , -{ "Over Top" ,"overtop" , "neomame", 3, 0 } , -{ "Ozma Wars" ,"ozmawars" , "mame", 3, 0 } , -{ "P-47 - The Freedom Fighter (Japan)" ,"p47j" , "mame", 3, 0 } , -{ "P-47 - The Phantom Fighter (World)" ,"p47" , "mame", 3, 0 } , -{ "P.O.W. - Prisoners of War (US)" ,"pow" , "mame", 3, 0 } , -{ "Pac & Pal (older)" ,"pacnpal2" , "mame", 3, 0 } , -{ "Pac & Pal" ,"pacnpal" , "mame", 3, 0 } , -{ "Pac-Gal" ,"pacgal" , "mame", 3, 0 } , -{ "Pac-Land (Midway)" ,"paclandm" , "mame", 3, 0 } , -{ "Pac-Land (set 1)" ,"pacland" , "mame", 3, 0 } , -{ "Pac-Land (set 2)" ,"pacland2" , "mame", 3, 0 } , -{ "Pac-Land (set 3)" ,"pacland3" , "mame", 3, 0 } , -{ "Pac-Man & Chomp Chomp" ,"pacnchmp" , "mame", 3, 0 } , -{ "Pac-Man (Hearts)" ,"pacheart" , "mame", 3, 0 } , -{ "Pac-Man (Midway)" ,"pacmanm" , "mame", 3, 0 } , -{ "Pac-Man (Midway, harder)" ,"pacmod" , "mame", 3, 0 } , -{ "Pac-Man (bootleg on Galaxian hardware)" ,"pacmanbl" , "mame", 3, 0 } , -{ "Pac-Man Plus" ,"pacplus" , "mame", 3, 0 } , -{ "Pac-Mania (Japan)" ,"pacmanij" , "mame", 3, 0 } , -{ "Pac-Mania" ,"pacmania" , "mame", 3, 0 } , -{ "Paint Roller" ,"paintrlr" , "mame", 1, 0 } , -{ "Palamedes (Japan)" ,"palamed" , "mame", 3, 0 } , -{ "Pandora's Palace" ,"pandoras" , "mame", 3, 0 } , -{ "Pang (World)" ,"pang" , "mame", 1, 0 } , -{ "Pang (bootleg)" ,"pangb" , "mame", 1, 0 } , -{ "Pang! 3 (Euro)" ,"pang3" , "mame", 3, 0 } , -{ "Pang! 3 (Japan)" ,"pang3j" , "mame", 3, 0 } , -{ "Panic Bomber" ,"panicbom" , "neomame", 3, 0 } , -{ "Paperboy" ,"paperboy" , "mame", 3, 0 } , -{ "Parodius DA! (Japan)" ,"parodius" , "mame", 3, 0 } , -{ "Passing Shot (2 Players) (bootleg)" ,"passshtb" , "mame", 1, 0 } , -{ "Passing Shot (2 Players)" ,"passsht" , "mame", 1, 0 } , -{ "Passing Shot (4 Players) (bootleg)" ,"passht4b" , "mame", 1, 0 } , -{ "Peek-a-Boo!" ,"peekaboo" , "mame", 3, 0 } , -{ "Pengo (set 1)" ,"pengo" , "mame", 1, 0 } , -{ "Pengo (set 2 not encrypted)" ,"pengo2u" , "mame", 3, 0 } , -{ "Pengo (set 2)" ,"pengo2" , "mame", 1, 0 } , -{ "Penguin-Kun Wars (Japan)" ,"pkunwarj" , "mame", 3, 0 } , -{ "Penguin-Kun Wars (US)" ,"pkunwar" , "mame", 3, 0 } , -{ "Penta" ,"penta" , "mame", 1, 0 } , -{ "Pepper II" ,"pepper2" , "mame", 3, 0 } , -{ "Percussor, The" ,"percuss" , "mame", 1, 0 } , -{ "Perfect Soldiers (Japan)" ,"psoldier" , "mame", 3, 0 } , -{ "Peter Pack-Rat" ,"peterpak" , "mame", 3, 0 } , -{ "Phantasm (Japan)" ,"phantasm" , "mame", 3, 0 } , -{ "Phantom II" ,"phantom2" , "mame", 3, 0 } , -{ "Phelios (Japan)" ,"phelios" , "mame", 3, 0 } , -{ "Phoenix (Amstar)" ,"phoenix" , "mame", 3, 0 } , -{ "Phoenix (Centuri)" ,"phoenixa" , "mame", 3, 0 } , -{ "Phoenix (IRECSA, G.G.I Corp)" ,"phoenixc" , "mame", 3, 0 } , -{ "Phoenix (T.P.N.)" ,"phoenix3" , "mame", 3, 0 } , -{ "Phoenix (Taito)" ,"phoenixt" , "mame", 3, 0 } , -{ "Phozon" ,"phozon" , "mame", 3, 0 } , -{ "Pickin'" ,"pickin" , "mame", 3, 0 } , -{ "Pig Newton (version A)" ,"pignewta" , "mame", 1, 0 } , -{ "Pig Newton (version C)" ,"pignewt" , "mame", 1, 0 } , -{ "Pigout (alternate)" ,"pigouta" , "mame", 3, 0 } , -{ "Pigout" ,"pigout" , "mame", 3, 0 } , -{ "Pigskin 621AD" ,"pigskin" , "mame", 3, 0 } , -{ "Pinball Action (set 1)" ,"pbaction" , "mame", 3, 0 } , -{ "Pinball Action (set 2)" ,"pbactio2" , "mame", 3, 0 } , -{ "Pinbo (Strike)" ,"pinbos" , "mame", 3, 0 } , -{ "Pinbo" ,"pinbo" , "mame", 3, 0 } , -{ "Ping Pong" ,"pingpong" , "mame", 3, 0 } , -{ "Pioneer Balloon" ,"pballoon" , "mame", 3, 0 } , -{ "Pipe Dream (Japan)" ,"pipedrm" , "mame", 3, 0 } , -{ "Pipi & Bibis / Whoopee (Japan)" ,"pipibibs" , "mame", 3, 0 } , -{ "Pipi & Bibis / Whoopee (Japan) [bootleg ?]" ,"pipibibi" , "mame", 3, 0 } , -{ "Piranha" ,"piranha" , "mame", 3, 0 } , -{ "Pirate Ship HigeMaru" ,"higemaru" , "mame", 1, 0 } , -{ "Pisces" ,"pisces" , "mame", 3, 0 } , -{ "Pistol Daimyo no Bouken (Japan)" ,"pistoldm" , "mame", 3, 0 } , -{ "Pit Fighter (version 3)" ,"pitfigh3" , "mame", 3, 0 } , -{ "Pit Fighter (version 4)" ,"pitfight" , "mame", 3, 0 } , -{ "Pit, The" ,"thepit" , "mame", 3, 0 } , -{ "Pitfall II (not encrypted)" ,"pitfallu" , "mame", 3, 0 } , -{ "Pitfall II" ,"pitfall2" , "mame", 5, 0 } , -{ "Play Girls" ,"plgirls" , "mame", 3, 0 } , -{ "Play Girls 2" ,"plgirls2" , "mame", 3, 0 } , -{ "Pleasure Goal / Futsal - 5 on 5 Mini Soccer" ,"pgoal" , "neomame", 3, 0 } , -{ "Pleiads (Centuri)" ,"pleiadce" , "mame", 3, 0 } , -{ "Pleiads (Tehkan)" ,"pleiads" , "mame", 3, 0 } , -{ "Pleiads (bootleg)" ,"pleiadbl" , "mame", 3, 0 } , -{ "Plotting (World)" ,"plotting" , "mame", 3, 0 } , -{ "Plump Pop (Japan)" ,"plumppop" , "mame", 3, 0 } , -{ "Plus Alpha" ,"plusalph" , "mame", 3, 0 } , -{ "Pnickies (Japan)" ,"pnickj" , "mame", 3, 0 } , -{ "Pocket Gal (Japan)" ,"pcktgal" , "mame", 3, 0 } , -{ "Pocket Gal (bootleg)" ,"pcktgalb" , "mame", 3, 0 } , -{ "Pocket Gal 2 (World?)" ,"pcktgal2" , "mame", 3, 0 } , -{ "Poker Ladies" ,"pkladies" , "mame", 1, 0 } , -{ "Polaris (set 1)" ,"polaris" , "mame", 3, 0 } , -{ "Polaris (set 2)" ,"polarisa" , "mame", 3, 0 } , -{ "Pole Position (Atari version 1)" ,"polepos1" , "mame", 3, 0 } , -{ "Pole Position (Atari version 2)" ,"poleposa" , "mame", 3, 0 } , -{ "Pole Position II (Atari bootleg 1)" ,"poleps2b" , "mame", 3, 0 } , -{ "Pole Position II (Atari bootleg 2)" ,"poleps2c" , "mame", 3, 0 } , -{ "Pole Position II (Atari)" ,"poleps2a" , "mame", 3, 0 } , -{ "Pole Position II" ,"polepos2" , "mame", 3, 0 } , -{ "Pole Position" ,"polepos" , "mame", 3, 0 } , -{ "Poly-Play" ,"polyplay" , "mame", 3, 0 } , -{ "Pomping World (Japan)" ,"pompingw" , "mame", 1, 0 } , -{ "Ponpoko (Venture Line)" ,"ponpokov" , "mame", 3, 0 } , -{ "Ponpoko" ,"ponpoko" , "mame", 3, 0 } , -{ "Pootan" ,"pootan" , "mame", 3, 0 } , -{ "Pooyan (Stern)" ,"pooyans" , "mame", 3, 0 } , -{ "Pooyan" ,"pooyan" , "mame", 3, 0 } , -{ "Pop 'n Bounce / Gapporin" ,"popbounc" , "neomame", 1, 0 } , -{ "Pop Flamer (set 1)" ,"popflame" , "mame", 3, 0 } , -{ "Pop Flamer (set 2)" ,"popflama" , "mame", 3, 0 } , -{ "Popeye (bootleg)" ,"popeyebl" , "mame", 3, 0 } , -{ "Popeye (set 1)" ,"popeye" , "mame", 3, 0 } , -{ "Popeye (set 2)" ,"popeye2" , "mame", 3, 0 } , -{ "Port Man" ,"portman" , "mame", 3, 0 } , -{ "Pot of Gold" ,"potogold" , "mame", 3, 0 } , -{ "Pound for Pound (US)" ,"poundfou" , "mame", 1, 0 } , -{ "Pound for Pound (World)" ,"poundfor" , "mame", 1, 0 } , -{ "Power Drive" ,"powerdrv" , "mame", 1, 0 } , -{ "Power Instinct (USA) [bootleg]" ,"powerins" , "mame", 3, 0 } , -{ "Power Spikes (Korea)" ,"pspikes" , "mame", 1, 0 } , -{ "Power Spikes II" ,"pspikes2" , "neomame", 1, 0 } , -{ "Power Surge" ,"psurge" , "mame", 3, 0 } , -{ "Prehistoric Isle in 1930 (US)" ,"prehislu" , "mame", 3, 0 } , -{ "Prehistoric Isle in 1930 (World)" ,"prehisle" , "mame", 3, 0 } , -{ "Psychic 5" ,"psychic5" , "mame", 5, 0 } , -{ "Psycho Soldier (Japan)" ,"psychosj" , "mame", 3, 0 } , -{ "Psycho Soldier (US)" ,"psychos" , "mame", 3, 0 } , -{ "Psycho-Nics Oscar (Japan revision 0)" ,"oscarj0" , "mame", 3, 0 } , -{ "Psycho-Nics Oscar (Japan revision 1)" ,"oscarj1" , "mame", 3, 0 } , -{ "Psycho-Nics Oscar (Japan revision 2)" ,"oscarj" , "mame", 3, 0 } , -{ "Psycho-Nics Oscar (US)" ,"oscar" , "mame", 3, 0 } , -{ "PuLiRuLa (Japan)" ,"pulirulj" , "mame", 3, 0 } , -{ "PuLiRuLa (World)" ,"pulirula" , "mame", 3, 0 } , -{ "PuckMan (Japan set 1)" ,"pacman" , "mame", 3, 0 } , -{ "PuckMan (Japan set 2)" ,"pacmanjp" , "mame", 3, 0 } , -{ "PuckMan (harder?)" ,"npacmod" , "mame", 3, 0 } , -{ "Pulsar" ,"pulsar" , "mame", 3, 0 } , -{ "Pulstar" ,"pulstar" , "neomame", 3, 0 } , -{ "Punch-Out!!" ,"punchout" , "mame", 1, 0 } , -{ "Punisher, The (Japan)" ,"punishrj" , "mame", 1, 0 } , -{ "Punisher, The (US)" ,"punishru" , "mame", 1, 0 } , -{ "Punisher, The (World)" ,"punisher" , "mame", 1, 0 } , -{ "Punk Shot (2 Players)" ,"punksht2" , "mame", 3, 0 } , -{ "Punk Shot (4 Players)" ,"punkshot" , "mame", 3, 0 } , -{ "Puzzle Bobble (Japan, B-System)" ,"puzbobb" , "mame", 3, 0 } , -{ "Puzzle Bobble / Bust-A-Move (Neo-Geo)" ,"pbobble" , "neomame", 3, 0 } , -{ "Puzzle Club (Japan prototype)" ,"puzlclub" , "mame", 3, 0 } , -{ "Puzzle De Pon R" ,"puzzldpr" , "neomame", 3, 0 } , -{ "Puzzle De Pon" ,"puzzledp" , "neomame", 3, 0 } , -{ "Puzzled / Joy Joy Kid" ,"joyjoy" , "neomame", 3, 0 } , -{ "Puzznic (Japan)" ,"puzznic" , "mame", 3, 0 } , -{ "Pyros (US)" ,"pyros" , "mame", 3, 0 } , -{ "Q*bert (Japan)" ,"qbertjp" , "mame", 3, 0 } , -{ "Q*bert (US)" ,"qbert" , "mame", 3, 0 } , -{ "Q*bert's Qubes" ,"qbertqub" , "mame", 3, 0 } , -{ "Qix (set 1)" ,"qix" , "mame", 3, 0 } , -{ "Qix (set 2)" ,"qixa" , "mame", 3, 0 } , -{ "Qix (set 3)" ,"qixb" , "mame", 3, 0 } , -{ "Qix II (Tournament)" ,"qix2" , "mame", 3, 0 } , -{ "Quantum (prototype)" ,"quantump" , "mame", 3, 0 } , -{ "Quantum (rev 1)" ,"quantum1" , "mame", 3, 0 } , -{ "Quantum (rev 2)" ,"quantum" , "mame", 3, 0 } , -{ "Quarterback (set 2)" ,"quartrba" , "mame", 3, 0 } , -{ "Quarterback" ,"quarterb" , "mame", 3, 0 } , -{ "Quartet (Japan)" ,"quartetj" , "mame", 3, 0 } , -{ "Quartet II" ,"quartet2" , "mame", 3, 0 } , -{ "Quartet" ,"quartet" , "mame", 3, 0 } , -{ "Quarth (Japan)" ,"quarth" , "mame", 3, 0 } , -{ "Quester (Japan)" ,"quester" , "mame", 3, 0 } , -{ "Quiz & Dragons (Japan)" ,"qadj" , "mame", 3, 0 } , -{ "Quiz & Dragons (US)" ,"qad" , "mame", 3, 0 } , -{ "Quiz Chikyu Bouei Gun (Japan)" ,"qzchikyu" , "mame", 3, 0 } , -{ "Quiz Crayon Shinchan (Japan)" ,"qcrayon" , "mame", 3, 0 } , -{ "Quiz Crayon Shinchan Orato Asobo (Japan)" ,"qcrayon2" , "mame", 3, 0 } , -{ "Quiz Daisousa Sen - The Last Count Down" ,"quizdais" , "neomame", 3, 0 } , -{ "Quiz HQ (Japan)" ,"quizhq" , "mame", 3, 0 } , -{ "Quiz Jinsei Gekijoh (Japan)" ,"qjinsei" , "mame", 3, 0 } , -{ "Quiz King of Fighters" ,"quizkof" , "neomame", 3, 0 } , -{ "Quiz Meintantei Neo Geo - Quiz Daisousa Sen Part 2" ,"quizdai2" , "neomame", 3, 0 } , -{ "Quiz Quest - Hime to Yuusha no Monogatari (Japan)" ,"qzquest" , "mame", 3, 0 } , -{ "Quiz Sangokushi (Japan)" ,"qsangoku" , "mame", 1, 0 } , -{ "Quiz Sekai wa SHOW by shobai (Japan)" ,"qzshowby" , "mame", 3, 0 } , -{ "Quiz Tonosama no Yabou (Japan)" ,"qtono1" , "mame", 1, 0 } , -{ "Quiz Tonosama no Yabou 2 Zenkoku-ban (Japan)" ,"qtono2" , "mame", 3, 0 } , -{ "Quiz Torimonochou (Japan)" ,"qtorimon" , "mame", 3, 0 } , -{ "Qwak (prototype)" ,"qwakprot" , "mame", 3, 0 } , -{ "R-Type (Japan prototype)" ,"rtypepj" , "mame", 1, 0 } , -{ "R-Type (Japan)" ,"rtype" , "mame", 1, 0 } , -{ "R-Type (US)" ,"rtypeu" , "mame", 1, 0 } , -{ "R-Type II (Japan)" ,"rtype2j" , "mame", 1, 0 } , -{ "R-Type II" ,"rtype2" , "mame", 1, 0 } , -{ "R-Type Leo (Japan)" ,"rtypeleo" , "mame", 3, 0 } , -{ "Rabbit Punch (US)" ,"rpunch" , "mame", 3, 0 } , -{ "Rabio Lepus (Japan)" ,"rabiolep" , "mame", 3, 0 } , -{ "Rack 'em Up" ,"rackemup" , "mame", 3, 0 } , -{ "Rad Action" ,"rdaction" , "mame", 3, 0 } , -{ "Radar Scope" ,"radarscp" , "mame", 1, 0 } , -{ "Radical Radial" ,"radrad" , "mame", 3, 0 } , -{ "Raiden (Alternate Hardware)" ,"raidena" , "mame", 1, 0 } , -{ "Raiden (Korea)" ,"raidenk" , "mame", 1, 0 } , -{ "Raiden" ,"raiden" , "mame", 1, 0 } , -{ "Raimais (Japan)" ,"raimais" , "mame", 5, 0 } , -{ "Rainbow Islands (Extra)" ,"rainbowe" , "mame", 1, 0 } , -{ "Rainbow Islands" ,"rainbow" , "mame", 3, 0 } , -{ "Rally Bike / Dash Yarou" ,"rallybik" , "mame", 3, 0 } , -{ "Rally X (Midway)" ,"rallyxm" , "mame", 1, 0 } , -{ "Rally X" ,"rallyx" , "mame", 1, 0 } , -{ "Rambo III (set 1, Europe)" ,"rambo3" , "mame", 3, 0 } , -{ "Rambo III (set 2, US)" ,"rambo3a" , "mame", 3, 0 } , -{ "Rampage (revision 2)" ,"rampage2" , "mame", 1, 0 } , -{ "Rampage (revision 3)" ,"rampage" , "mame", 1, 0 } , -{ "Rampage: World Tour (rev 1.1)" ,"rmpgwt11" , "mame", 3, 0 } , -{ "Rampage: World Tour (rev 1.3)" ,"rmpgwt" , "mame", 3, 0 } , -{ "Rampart (2-player Joystick)" ,"ramprt2p" , "mame", 3, 0 } , -{ "Rampart (3-player Trackball)" ,"rampart" , "mame", 3, 0 } , -{ "Rampart (Japan, 2-player Joystick)" ,"rampartj" , "mame", 3, 0 } , -{ "Rastan (US set 1)" ,"rastanu" , "mame", 3, 0 } , -{ "Rastan (US set 2)" ,"rastanu2" , "mame", 3, 0 } , -{ "Rastan (World)" ,"rastan" , "mame", 3, 0 } , -{ "Rastan Saga (Japan)" ,"rastsaga" , "mame", 3, 0 } , -{ "Rastan Saga 2 (Japan)" ,"rastsag2" , "mame", 3, 0 } , -{ "Razzmatazz" ,"razmataz" , "mame", 1, 0 } , -{ "Reactor" ,"reactor" , "mame", 3, 0 } , -{ "Real Bout Fatal Fury / Real Bout Garou Densetsu" ,"rbff1" , "neomame", 3, 0 } , -{ "Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - the newcomers" ,"rbff2" , "neomame", 3, 0 } , -{ "Real Bout Fatal Fury Special / Real Bout Garou Densetsu Special" ,"rbffspec" , "neomame", 3, 0 } , -{ "Real Ghostbusters, The (US 2 Players)" ,"ghostb" , "mame", 3, 0 } , -{ "Real Ghostbusters, The (US 3 Players)" ,"ghostb3" , "mame", 3, 0 } , -{ "Red Alert" ,"redalert" , "mame", 3, 0 } , -{ "Red Baron" ,"redbaron" , "mame", 3, 0 } , -{ "Redline Racer (2 players)" ,"redlin2p" , "mame", 3, 0 } , -{ "Regulus (not encrypted)" ,"regulusu" , "mame", 3, 0 } , -{ "Regulus" ,"regulus" , "mame", 5, 0 } , -{ "Relief Pitcher (set 1)" ,"relief" , "mame", 3, 0 } , -{ "Relief Pitcher (set 2)" ,"relief2" , "mame", 3, 0 } , -{ "Renegade (US)" ,"renegade" , "mame", 3, 0 } , -{ "Repulse" ,"repulse" , "mame", 3, 0 } , -{ "Rescue Raider (Stand-Alone)" ,"rescrdsa" , "mame", 1, 0 } , -{ "Rescue Raider" ,"rescraid" , "mame", 1, 0 } , -{ "Rescue" ,"rescue" , "mame", 3, 0 } , -{ "Return of Ishtar, The" ,"roishtar" , "mame", 3, 0 } , -{ "Return of the Invaders (bootleg set 1)" ,"retofin1" , "mame", 3, 0 } , -{ "Return of the Invaders (bootleg set 2)" ,"retofin2" , "mame", 3, 0 } , -{ "Return of the Invaders" ,"retofinv" , "mame", 3, 0 } , -{ "Return of the Jedi" ,"jedi" , "mame", 3, 0 } , -{ "Riding Hero" ,"ridhero" , "neomame", 3, 0 } , -{ "Ring King (set 1)" ,"ringking" , "mame", 3, 0 } , -{ "Ring King (set 2)" ,"ringkin2" , "mame", 3, 0 } , -{ "Ring King (set 3)" ,"ringkin3" , "mame", 3, 0 } , -{ "Ring no Ohja (Japan)" ,"ringohja" , "mame", 3, 0 } , -{ "Riot City" ,"riotcity" , "mame", 1, 0 } , -{ "Rip Cord" ,"ripcord" , "mame", 3, 0 } , -{ "Rip Off" ,"ripoff" , "mame", 3, 0 } , -{ "River Patrol (bootleg)" ,"rpatrolb" , "mame", 3, 0 } , -{ "Road Blasters" ,"roadblst" , "mame", 0, 0 } , -{ "Road Fighter (set 1)" ,"roadf" , "mame", 3, 0 } , -{ "Road Fighter (set 2)" ,"roadf2" , "mame", 3, 0 } , -{ "Road Runner" ,"roadrunn" , "mame", 3, 0 } , -{ "Robby Roto" ,"robby" , "mame", 1, 0 } , -{ "Robo Army" ,"roboarmy" , "neomame", 3, 0 } , -{ "Robocop (US revision 0)" ,"robocpu0" , "mame", 3, 0 } , -{ "Robocop (US revision 1)" ,"robocopu" , "mame", 3, 0 } , -{ "Robocop (World bootleg)" ,"robocopb" , "mame", 3, 0 } , -{ "Robocop (World revision 3)" ,"robocop" , "mame", 3, 0 } , -{ "Robot Bowl" ,"robotbwl" , "mame", 3, 0 } , -{ "Robotron (Solid Blue label)" ,"robotron" , "mame", 3, 0 } , -{ "Robotron (Yellow/Orange label)" ,"robotryo" , "mame", 3, 0 } , -{ "Roc'n Rope (Kosuka)" ,"rocnropk" , "mame", 3, 0 } , -{ "Roc'n Rope" ,"rocnrope" , "mame", 3, 0 } , -{ "Rock 'n Rage (World?)" ,"rockrage" , "mame", 3, 0 } , -{ "Rockman - The Power Battle (Japan)" ,"rockmanj" , "mame", 3, 0 } , -{ "RodLand (Japan)" ,"rodlandj" , "mame", 3, 0 } , -{ "RodLand (World)" ,"rodland" , "mame", 3, 0 } , -{ "Rollergames (Japan)" ,"rollergj" , "mame", 3, 0 } , -{ "Rollergames (US)" ,"rollerg" , "mame", 3, 0 } , -{ "Rolling Crash / Moon Base" ,"rollingc" , "mame", 3, 0 } , -{ "Rolling Thunder (new version)" ,"rthunder" , "mame", 3, 0 } , -{ "Rolling Thunder (old version)" ,"rthundro" , "mame", 3, 0 } , -{ "Rolling Thunder 2 (Japan)" ,"rthun2j" , "mame", 3, 0 } , -{ "Rolling Thunder 2" ,"rthun2" , "mame", 3, 0 } , -{ "Rompers (Japan old version)" ,"romperso" , "mame", 3, 0 } , -{ "Rompers (Japan)" ,"rompers" , "mame", 3, 0 } , -{ "Rough Ranger (v2.0, Sharp Image license)" ,"rranger" , "mame", 3, 0 } , -{ "Round-Up" ,"roundup" , "mame", 3, 0 } , -{ "Route 16 (bootleg)" ,"route16b" , "mame", 3, 0 } , -{ "Route 16" ,"route16" , "mame", 3, 0 } , -{ "Royal Mahjong" ,"royalmah" , "mame", 1, 0 } , -{ "Rug Rats" ,"rugrats" , "mame", 3, 0 } , -{ "Runark (Japan)" ,"runark" , "mame", 3, 0 } , -{ "Rush & Crash (Japan)" ,"rushcrsh" , "mame", 3, 0 } , -{ "Rush'n Attack" ,"rushatck" , "mame", 3, 0 } , -{ "Rygar (US set 1)" ,"rygar" , "mame", 3, 0 } , -{ "Rygar (US set 2)" ,"rygar2" , "mame", 3, 0 } , -{ "S.P.Y. - Special Project Y (US)" ,"spy" , "mame", 3, 0 } , -{ "S.R.D. Mission" ,"srdmissn" , "mame", 3, 0 } , -{ "SAR - Search And Rescue (US)" ,"sercharu" , "mame", 3, 0 } , -{ "SAR - Search And Rescue (World)" ,"searchar" , "mame", 3, 0 } , -{ "SDI - Strategic Defense Initiative (Japan)" ,"sdioj" , "mame", 3, 0 } , -{ "SDI - Strategic Defense Initiative" ,"sdi" , "mame", 3, 0 } , -{ "SOS" ,"sos" , "mame", 3, 0 } , -{ "SWAT" ,"swat" , "mame", 5, 0 } , -{ "Safari Rally" ,"safarir" , "mame", 3, 0 } , -{ "Safari" ,"safari" , "mame", 3, 0 } , -{ "Saigo no Nindou (Japan)" ,"nspiritj" , "mame", 1, 0 } , -{ "Saint Dragon" ,"stdragon" , "mame", 3, 0 } , -{ "Salamander" ,"salamand" , "mame", 3, 0 } , -{ "Same! Same! Same!" ,"samesame" , "mame", 3, 0 } , -{ "Samurai (Sega)" ,"samurai" , "mame", 3, 0 } , -{ "Samurai Nihon-ichi (set 1)" ,"tsamurai" , "mame", 3, 0 } , -{ "Samurai Nihon-ichi (set 2)" ,"tsamura2" , "mame", 3, 0 } , -{ "Samurai Shodown / Samurai Spirits" ,"samsho" , "neomame", 3, 0 } , -{ "Samurai Shodown II / Shin Samurai Spirits - Haohmaru jigokuhen" ,"samsho2" , "neomame", 3, 0 } , -{ "Samurai Shodown III / Samurai Spirits - Zankurou Musouken" ,"samsho3" , "neomame", 3, 0 } , -{ "Samurai Shodown IV - Amakusa's Revenge / Samurai Spirits - Amakusa Kourin" ,"samsho4" , "neomame", 3, 0 } , -{ "Sangokushi II (Asia)" ,"wofa" , "mame", 1, 0 } , -{ "Sarge" ,"sarge" , "mame", 1, 0 } , -{ "Sasuke vs. Commander" ,"sasuke" , "mame", 3, 0 } , -{ "Satan of Saturn" ,"satansat" , "mame", 3, 0 } , -{ "Satan's Hollow (set 1)" ,"shollow" , "mame", 5, 0 } , -{ "Satan's Hollow (set 2)" ,"shollow2" , "mame", 5, 0 } , -{ "Saturday Night Slam Masters (World)" ,"slammast" , "mame", 1, 0 } , -{ "Saturn" ,"saturn" , "mame", 3, 0 } , -{ "Sauro" ,"sauro" , "mame", 3, 0 } , -{ "Savage Bees" ,"savgbees" , "mame", 1, 0 } , -{ "Savage Reign / Fu'un Mokushiroku - kakutou sousei" ,"savagere" , "neomame", 3, 0 } , -{ "Scion (Cinematronics)" ,"scionc" , "mame", 3, 0 } , -{ "Scion" ,"scion" , "mame", 3, 0 } , -{ "Scramble (Stern)" ,"scrambls" , "mame", 3, 0 } , -{ "Scramble (bootleg on Galaxian hardware)" ,"scramblb" , "mame", 3, 0 } , -{ "Scramble" ,"scramble" , "mame", 3, 0 } , -{ "Scrambled Egg" ,"scregg" , "mame", 3, 0 } , -{ "Screw Loose (prototype)" ,"screwloo" , "mame", 3, 0 } , -{ "Sea Fighter Poseidon" ,"sfposeid" , "mame", 3, 0 } , -{ "Sea Wolf II" ,"seawolf2" , "mame", 3, 0 } , -{ "Sea Wolf" ,"seawolf" , "mame", 3, 0 } , -{ "Secret Agent (World)" ,"secretag" , "mame", 3, 0 } , -{ "Section Z (set 1)" ,"sectionz" , "mame", 5, 0 } , -{ "Section Z (set 2)" ,"sctionza" , "mame", 5, 0 } , -{ "Sector Zone" ,"sectrzon" , "mame", 3, 0 } , -{ "Sega Ninja (not encrypted)" ,"seganinu" , "mame", 5, 0 } , -{ "Sega Ninja" ,"seganinj" , "mame", 5, 0 } , -{ "Seicross" ,"seicross" , "mame", 3, 0 } , -{ "Seishun Scandal (Japan)" ,"myheroj" , "mame", 5, 0 } , -{ "Sengoku / Sengoku Denshou (set 1)" ,"sengoku" , "neomame", 3, 0 } , -{ "Sengoku / Sengoku Denshou (set 2)" ,"sengokh" , "neomame", 3, 0 } , -{ "Sengoku 2 / Sengoku Denshou 2" ,"sengoku2" , "neomame", 3, 0 } , -{ "Sengoku Ace (Japan)" ,"sngkace" , "mame", 3, 0 } , -{ "Senjo no Ookami II (Japan)" ,"mercsj" , "mame", 3, 0 } , -{ "Senjo no Ookami" ,"commandj" , "mame", 5, 0 } , -{ "Senjyo" ,"senjyo" , "mame", 1, 0 } , -{ "Sente Diagnostic Cartridge" ,"sentetst" , "mame", 3, 0 } , -{ "Shackled (US)" ,"shackled" , "mame", 3, 0 } , -{ "Shadow Dancer (Japan)" ,"shdancrj" , "mame", 1, 0 } , -{ "Shadow Dancer (US)" ,"shdancer" , "mame", 1, 0 } , -{ "Shadow Dancer (bootleg)" ,"shdancbl" , "mame", 1, 0 } , -{ "Shadow Land" ,"shadowld" , "mame", 3, 0 } , -{ "Shadow Warriors (US)" ,"shadoww" , "mame", 3, 0 } , -{ "Shanghai III (Japan)" ,"shangha3" , "mame", 3, 0 } , -{ "Shanghai" ,"shanghai" , "mame", 3, 0 } , -{ "Shao-Lin's Road" ,"shaolins" , "mame", 3, 0 } , -{ "Shark Attack" ,"sharkatt" , "mame", 3, 0 } , -{ "Sheriff" ,"sheriff" , "mame", 3, 0 } , -{ "Shinnyuushain Tooru-kun" ,"mikiej" , "mame", 3, 0 } , -{ "Shinobi (bootleg)" ,"shinobl" , "mame", 1, 0 } , -{ "Shinobi (set 1)" ,"shinobi" , "mame", 1, 0 } , -{ "Shinobi (set 2)" ,"shinobia" , "mame", 1, 0 } , -{ "Shinobi (set 3)" ,"shinobib" , "mame", 1, 0 } , -{ "Shippu Mahou Daisakusen (Japan)" ,"shippumd" , "mame", 3, 0 } , -{ "Shisensho - Joshiryo-Hen (Japan)" ,"shisen" , "mame", 1, 0 } , -{ "Shock Troopers - 2nd Squad" ,"shocktr2" , "neomame", 3, 0 } , -{ "Shock Troopers" ,"shocktro" , "neomame", 3, 0 } , -{ "Shoot Out (Japan)" ,"shootouj" , "mame", 3, 0 } , -{ "Shoot Out (Korean Bootleg)" ,"shootoub" , "mame", 3, 0 } , -{ "Shoot Out (US)" ,"shootout" , "mame", 3, 0 } , -{ "Shooting Master" ,"shtngmst" , "mame", 1, 0 } , -{ "Showdown (version 5.0)" ,"showdown" , "mame", 3, 0 } , -{ "Shuffleboard" ,"shuffle" , "mame", 3, 0 } , -{ "Shuuz (version 7.1)" ,"shuuz2" , "mame", 3, 0 } , -{ "Shuuz (version 8.0)" ,"shuuz" , "mame", 3, 0 } , -{ "Sichuan II (hack ?) (set 2)" ,"sichuana" , "mame", 1, 0 } , -{ "Sichuan II (hack?) (set 1)" ,"sichuan2" , "mame", 1, 0 } , -{ "Side Arms - Hyper Dyne (Japan)" ,"sidearjp" , "mame", 3, 0 } , -{ "Side Arms - Hyper Dyne (US)" ,"sidearmr" , "mame", 3, 0 } , -{ "Side Arms - Hyper Dyne (World)" ,"sidearms" , "mame", 3, 0 } , -{ "Side Pocket (Japan)" ,"sidepctj" , "mame", 3, 0 } , -{ "Side Pocket (World)" ,"sidepckt" , "mame", 3, 0 } , -{ "Side Pocket (bootleg)" ,"sidepctb" , "mame", 3, 0 } , -{ "Side Track" ,"sidetrac" , "mame", 3, 0 } , -{ "Silent Dragon (World)" ,"silentd" , "mame", 3, 0 } , -{ "Silkworm (set 1)" ,"silkworm" , "mame", 3, 0 } , -{ "Silkworm (set 2)" ,"silkwrm2" , "mame", 3, 0 } , -{ "Silver Land" ,"silvland" , "mame", 3, 0 } , -{ "Simpsons, The (2 Players Japan)" ,"simps2pj" , "mame", 3, 0 } , -{ "Simpsons, The (2 Players)" ,"simpsn2p" , "mame", 3, 0 } , -{ "Simpsons, The (4 Players)" ,"simpsons" , "mame", 3, 0 } , -{ "Sindbad Mystery" ,"sindbadm" , "mame", 5, 0 } , -{ "Sinistar (prototype version)" ,"sinista1" , "mame", 3, 0 } , -{ "Sinistar (revision 2)" ,"sinista2" , "mame", 3, 0 } , -{ "Sinistar (revision 3)" ,"sinistar" , "mame", 3, 0 } , -{ "Skull & Crossbones (set 1)" ,"skullxbo" , "mame", 3, 0 } , -{ "Skull & Crossbones (set 2)" ,"skullxb2" , "mame", 3, 0 } , -{ "Sky Adventure (US)" ,"skyadvnt" , "mame", 3, 0 } , -{ "Sky Chuter" ,"skychut" , "mame", 3, 0 } , -{ "Sky Diver" ,"skydiver" , "mame", 3, 0 } , -{ "Sky Fox" ,"skyfox" , "mame", 3, 0 } , -{ "Sky Kid Deluxe (set 1)" ,"skykiddx" , "mame", 3, 0 } , -{ "Sky Kid Deluxe (set 2)" ,"skykiddo" , "mame", 3, 0 } , -{ "Sky Kid" ,"skykid" , "mame", 3, 0 } , -{ "Sky Lancer" ,"skylancr" , "mame", 3, 0 } , -{ "Sky Shark (US)" ,"skyshark" , "mame", 3, 0 } , -{ "Sky Soldiers (US)" ,"skysoldr" , "mame", 3, 0 } , -{ "Sky Wolf (set 1)" ,"skywolf" , "mame", 3, 0 } , -{ "Sky Wolf (set 2)" ,"skywolf2" , "mame", 3, 0 } , -{ "Slap Fight (English bootleg)" ,"slapbtuk" , "mame", 3, 0 } , -{ "Slap Fight (Japan bootleg)" ,"slapbtjp" , "mame", 3, 0 } , -{ "Slap Fight" ,"slapfigh" , "mame", 3, 0 } , -{ "Sly Spy (US revision 2)" ,"slyspy2" , "mame", 3, 0 } , -{ "Sly Spy (US revision 3)" ,"slyspy" , "mame", 3, 0 } , -{ "Smash T.V. (rev 4.00)" ,"smashtv4" , "mame", 3, 0 } , -{ "Smash T.V. (rev 5.00)" ,"smashtv5" , "mame", 3, 0 } , -{ "Smash T.V. (rev 6.00)" ,"smashtv6" , "mame", 3, 0 } , -{ "Smash T.V. (rev 8.00)" ,"smashtv" , "mame", 3, 0 } , -{ "Snacks'n Jaxson" ,"snakjack" , "mame", 1, 0 } , -{ "Snake Pit" ,"snakepit" , "mame", 3, 0 } , -{ "Snap Jack" ,"snapjack" , "mame", 3, 0 } , -{ "Snow Bros. - Nick & Tom (Japan)" ,"snowbroj" , "mame", 3, 0 } , -{ "Snow Bros. - Nick & Tom (set 1)" ,"snowbros" , "mame", 3, 0 } , -{ "Snow Bros. - Nick & Tom (set 2)" ,"snowbroa" , "mame", 3, 0 } , -{ "Snow Bros. - Nick & Tom (set 3)" ,"snowbrob" , "mame", 3, 0 } , -{ "Snow Bros. 2 - With New Elves" ,"snowbro2" , "mame", 3, 0 } , -{ "Soccer Brawl" ,"socbrawl" , "neomame", 3, 0 } , -{ "Solar Fight" ,"solfight" , "mame", 3, 0 } , -{ "Solar Fox" ,"solarfox" , "mame", 5, 0 } , -{ "Solar Quest" ,"solarq" , "mame", 3, 0 } , -{ "Solar Warrior" ,"solarwar" , "mame", 3, 0 } , -{ "Soldam (Japan)" ,"soldamj" , "mame", 3, 0 } , -{ "Solitary Fighter (World)" ,"solfigtr" , "mame", 3, 0 } , -{ "Solomon's Key (Japan)" ,"solomon" , "mame", 3, 0 } , -{ "Son Son" ,"sonson" , "mame", 3, 0 } , -{ "Son of Phoenix" ,"sonofphx" , "mame", 3, 0 } , -{ "Sonic Wings (Japan)" ,"sonicwi" , "mame", 1, 0 } , -{ "Souko Ban Deluxe (Japan)" ,"soukobdx" , "mame", 3, 0 } , -{ "Space Attack (cocktail)" ,"sspacatc" , "mame", 3, 0 } , -{ "Space Attack (upright)" ,"sspaceat" , "mame", 3, 0 } , -{ "Space Attack (upright, older)" ,"sspacat2" , "mame", 3, 0 } , -{ "Space Attack II" ,"spaceatt" , "mame", 3, 0 } , -{ "Space Battle" ,"spacbatt" , "mame", 3, 0 } , -{ "Space Bird (bootleg)" ,"spacebrd" , "mame", 1, 0 } , -{ "Space Chaser (CV version)" ,"schasrcv" , "mame", 3, 0 } , -{ "Space Chaser" ,"schaser" , "mame", 3, 0 } , -{ "Space Demon" ,"spacedem" , "mame", 1, 0 } , -{ "Space Duel" ,"spacduel" , "mame", 3, 0 } , -{ "Space Dungeon" ,"sdungeon" , "mame", 3, 0 } , -{ "Space Encounters" ,"spcenctr" , "mame", 3, 0 } , -{ "Space Fever (black and white)" ,"sfeverbw" , "mame", 3, 0 } , -{ "Space Fever (color)" ,"spacefev" , "mame", 3, 0 } , -{ "Space Firebird (Gremlin)" ,"spacefbg" , "mame", 1, 0 } , -{ "Space Firebird (Nintendo)" ,"spacefb" , "mame", 1, 0 } , -{ "Space Firebird (bootleg)" ,"spacefbb" , "mame", 1, 0 } , -{ "Space Fury (revision A)" ,"spacfura" , "mame", 1, 0 } , -{ "Space Fury (revision C)" ,"spacfury" , "mame", 1, 0 } , -{ "Space Harrier" ,"sharrier" , "mame", 3, 0 } , -{ "Space Intruder" ,"spaceint" , "mame", 3, 0 } , -{ "Space Invaders (CV Version)" ,"sicv" , "mame", 3, 0 } , -{ "Space Invaders (Logitec)" ,"invaderl" , "mame", 3, 0 } , -{ "Space Invaders (SV Version 2)" ,"sisv2" , "mame", 3, 0 } , -{ "Space Invaders (SV Version)" ,"sisv" , "mame", 3, 0 } , -{ "Space Invaders (TV Version)" ,"sitv" , "mame", 3, 0 } , -{ "Space Invaders DX (Japan)" ,"spacedx" , "mame", 0, 0 } , -{ "Space Invaders Deluxe" ,"invaddlx" , "mame", 3, 0 } , -{ "Space Invaders Galactica" ,"galap1" , "mame", 3, 0 } , -{ "Space Invaders II (Midway, cocktail)" ,"invad2ct" , "mame", 3, 0 } , -{ "Space Invaders Part II (Taito)" ,"invadpt2" , "mame", 3, 0 } , -{ "Space Invaders" ,"invaders" , "mame", 3, 0 } , -{ "Space Invasion" ,"spaceinv" , "mame", 5, 0 } , -{ "Space King" ,"spceking" , "mame", 3, 0 } , -{ "Space Laser" ,"spclaser" , "mame", 3, 0 } , -{ "Space Odyssey" ,"spaceod" , "mame", 1, 0 } , -{ "Space Panic (German)" ,"panicger" , "mame", 1, 0 } , -{ "Space Panic (set 1)" ,"panic" , "mame", 1, 0 } , -{ "Space Panic (set 2)" ,"panica" , "mame", 1, 0 } , -{ "Space Phantoms" ,"spaceph" , "mame", 3, 0 } , -{ "Space Pilot" ,"spaceplt" , "mame", 3, 0 } , -{ "Space Seeker" ,"spaceskr" , "mame", 3, 0 } , -{ "Space Tactics" ,"stactics" , "mame", 3, 0 } , -{ "Space Trek (cocktail)" ,"sptrekct" , "mame", 3, 0 } , -{ "Space Trek (upright)" ,"spacetrk" , "mame", 3, 0 } , -{ "Space War (Leijac)" ,"spcewarl" , "mame", 3, 0 } , -{ "Space War (Sanritsu)" ,"spcewars" , "mame", 3, 0 } , -{ "Space War Part 3" ,"spacewr3" , "mame", 3, 0 } , -{ "Space Wars" ,"spacewar" , "mame", 3, 0 } , -{ "Space Zap" ,"spacezap" , "mame", 3, 0 } , -{ "Sparkz (prototype)" ,"sparkz" , "mame", 3, 0 } , -{ "Spartan X (Japan)" ,"spartanx" , "mame", 3, 0 } , -{ "Speak & Rescue" ,"speakres" , "mame", 3, 0 } , -{ "Spectar (revision 1?)" ,"spectar1" , "mame", 3, 0 } , -{ "Spectar (revision 3)" ,"spectar" , "mame", 3, 0 } , -{ "Speed Ball" ,"speedbal" , "mame", 3, 0 } , -{ "Speed Coin (prototype)" ,"spdcoin" , "mame", 3, 0 } , -{ "Speed Freak" ,"speedfrk" , "mame", 3, 0 } , -{ "Speed Rumbler, The (set 1)" ,"srumbler" , "mame", 3, 0 } , -{ "Speed Rumbler, The (set 2)" ,"srumblr2" , "mame", 3, 0 } , -{ "Spelunker II" ,"spelunk2" , "mame", 3, 0 } , -{ "Spelunker" ,"spelunkr" , "mame", 3, 0 } , -{ "Spiders (set 1)" ,"spiders" , "mame", 3, 0 } , -{ "Spiders (set 2)" ,"spiders2" , "mame", 3, 0 } , -{ "Spiker" ,"spiker" , "mame", 1, 0 } , -{ "Spinal Breakers (Japan)" ,"spinlbrj" , "mame", 3, 0 } , -{ "Spinal Breakers (US)" ,"spinlbru" , "mame", 3, 0 } , -{ "Spinal Breakers (World)" ,"spinlbrk" , "mame", 3, 0 } , -{ "Spinmaster / Miracle Adventure" ,"spinmast" , "neomame", 3, 0 } , -{ "Splash!" ,"splash" , "mame", 3, 0 } , -{ "Splat!" ,"splat" , "mame", 3, 0 } , -{ "Splatter House (Japan)" ,"splatter" , "mame", 3, 0 } , -{ "Springer" ,"springer" , "mame", 3, 0 } , -{ "Sprint 1" ,"sprint1" , "mame", 3, 0 } , -{ "Sprint 2" ,"sprint2" , "mame", 3, 0 } , -{ "Spy Hunter 2 (rev 1)" ,"spyhnt2a" , "mame", 3, 0 } , -{ "Spy Hunter 2 (rev 2)" ,"spyhunt2" , "mame", 3, 0 } , -{ "Spy Hunter" ,"spyhunt" , "mame", 1, 0 } , -{ "Stadium Hero (Japan)" ,"stadhero" , "mame", 3, 0 } , -{ "Stakes Winner / Stakes Winner - GI kinzen seihae no michi" ,"stakwin" , "neomame", 3, 0 } , -{ "Stakes Winner 2" ,"stakwin2" , "neomame", 3, 0 } , -{ "Star Castle (older)" ,"starcas1" , "mame", 3, 0 } , -{ "Star Castle (version 3)" ,"starcas" , "mame", 3, 0 } , -{ "Star Cruiser" ,"starcrus" , "mame", 3, 0 } , -{ "Star Fire" ,"starfire" , "mame", 3, 0 } , -{ "Star Force (encrypted)" ,"starfore" , "mame", 1, 0 } , -{ "Star Force" ,"starforc" , "mame", 1, 0 } , -{ "Star Hawk" ,"starhawk" , "mame", 3, 0 } , -{ "Star Jacker (Sega)" ,"starjack" , "mame", 3, 0 } , -{ "Star Jacker (Stern)" ,"starjacs" , "mame", 3, 0 } , -{ "Star Trek" ,"startrek" , "mame", 1, 0 } , -{ "Star Wars (rev 1)" ,"starwar1" , "mame", 3, 0 } , -{ "Star Wars (rev 2)" ,"starwars" , "mame", 3, 0 } , -{ "Star Wars" ,"starw" , "mame", 3, 0 } , -{ "Stargate" ,"stargate" , "mame", 3, 0 } , -{ "Stinger" ,"stinger" , "mame", 1, 0 } , -{ "Stocker" ,"stocker" , "mame", 3, 0 } , -{ "Stoneage" ,"stoneage" , "mame", 3, 0 } , -{ "Storming Party / Riku Kai Kuu Saizensen" ,"storming" , "mame", 3, 0 } , -{ "Strategy X (Stern)" ,"stratgys" , "mame", 3, 0 } , -{ "Strategy X" ,"stratgyx" , "mame", 3, 0 } , -{ "Stratovox (bootleg)" ,"stratvxb" , "mame", 3, 0 } , -{ "Stratovox" ,"stratvox" , "mame", 3, 0 } , -{ "Streaking" ,"streakng" , "mame", 3, 0 } , -{ "Street Fight (Germany)" ,"stfight" , "mame", 5, 0 } , -{ "Street Fighter (Japan)" ,"sf1jp" , "mame", 3, 0 } , -{ "Street Fighter (US)" ,"sf1us" , "mame", 3, 0 } , -{ "Street Fighter (World)" ,"sf1" , "mame", 3, 0 } , -{ "Street Fighter II - The World Warrior (Japan 910214)" ,"sf2jb" , "mame", 3, 0 } , -{ "Street Fighter II - The World Warrior (Japan 911210)" ,"sf2j" , "mame", 3, 0 } , -{ "Street Fighter II - The World Warrior (US 910206)" ,"sf2a" , "mame", 3, 0 } , -{ "Street Fighter II - The World Warrior (US 910214)" ,"sf2b" , "mame", 3, 0 } , -{ "Street Fighter II - The World Warrior (US 910228)" ,"sf2e" , "mame", 3, 0 } , -{ "Street Fighter II - The World Warrior (World 910214)" ,"sf2" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (Accelerator Pt.II)" ,"sf2accp2" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (Japan)" ,"sf2cej" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (Rainbow)" ,"sf2rb" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (Red Wave)" ,"sf2red" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (US rev A)" ,"sf2cea" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (US rev B)" ,"sf2ceb" , "mame", 3, 0 } , -{ "Street Fighter II' - Champion Edition (World)" ,"sf2ce" , "mame", 3, 0 } , -{ "Street Fighter II' - Hyper Fighting (US)" ,"sf2t" , "mame", 3, 0 } , -{ "Street Fighter II' Turbo - Hyper Fighting (Japan)" ,"sf2tj" , "mame", 3, 0 } , -{ "Street Football" ,"sfootbal" , "mame", 3, 0 } , -{ "Street Hoop / Street Slam / Dunk Dream" ,"strhoop" , "neomame", 3, 0 } , -{ "Street Smart (Japan version 1)" ,"streetsj" , "mame", 3, 0 } , -{ "Street Smart (US version 1)" ,"streets1" , "mame", 3, 0 } , -{ "Street Smart (US version 2)" ,"streetsm" , "mame", 3, 0 } , -{ "Strider (US)" ,"strider" , "mame", 3, 0 } , -{ "Strider Hiryu (Japan set 1)" ,"striderj" , "mame", 3, 0 } , -{ "Strider Hiryu (Japan set 2)" ,"stridrja" , "mame", 3, 0 } , -{ "Strike Force (rev 1 02/25/91)" ,"strkforc" , "mame", 3, 0 } , -{ "Strike Zone" ,"strkzone" , "mame", 1, 0 } , -{ "Subs" ,"subs" , "mame", 3, 0 } , -{ "Sundance" ,"sundance" , "mame", 3, 0 } , -{ "Sunset Riders (Asia 2 Players ver. ABD)" ,"ssrdrabd" , "mame", 3, 0 } , -{ "Sunset Riders (Japan 2 Players ver. JBD)" ,"ssrdrjbd" , "mame", 3, 0 } , -{ "Sunset Riders (US 2 Players ver. UBC)" ,"ssrdrubc" , "mame", 3, 0 } , -{ "Sunset Riders (US 4 Players ver. UAC)" ,"ssrdruac" , "mame", 3, 0 } , -{ "Sunset Riders (US 4 Players ver. UDA)" ,"ssrdruda" , "mame", 3, 0 } , -{ "Sunset Riders (World 2 Players ver. EBC)" ,"ssrdrebc" , "mame", 3, 0 } , -{ "Sunset Riders (World 2 Players ver. EBD)" ,"ssrdrebd" , "mame", 3, 0 } , -{ "Sunset Riders (World 4 Players ver. EAC)" ,"ssriders" , "mame", 3, 0 } , -{ "Super Bagman (Stern)" ,"sbagmans" , "mame", 3, 0 } , -{ "Super Bagman" ,"sbagman" , "mame", 3, 0 } , -{ "Super Baseball Double Play Home Run Derby" ,"dblplay" , "mame", 1, 0 } , -{ "Super Basketball" ,"sbasketb" , "mame", 3, 0 } , -{ "Super Bobble Bobble" ,"sboblbob" , "mame", 3, 0 } , -{ "Super Bond" ,"superbon" , "mame", 1, 0 } , -{ "Super Breakout" ,"sbrkout" , "mame", 3, 0 } , -{ "Super Burger Time (Japan)" ,"supbtimj" , "mame", 3, 0 } , -{ "Super Burger Time (World)" ,"supbtime" , "mame", 3, 0 } , -{ "Super Buster Bros (US)" ,"sbbros" , "mame", 1, 0 } , -{ "Super Casino" ,"sucasino" , "mame", 3, 0 } , -{ "Super Champion Baseball" ,"sbasebal" , "mame", 3, 0 } , -{ "Super Cobra (Stern)" ,"scobras" , "mame", 3, 0 } , -{ "Super Cobra (bootleg)" ,"scobrab" , "mame", 3, 0 } , -{ "Super Cobra" ,"scobra" , "mame", 3, 0 } , -{ "Super Contra (Japan)" ,"scontraj" , "mame", 3, 0 } , -{ "Super Contra" ,"scontra" , "mame", 3, 0 } , -{ "Super Dodge Ball / Kunio no Nekketsu Toukyuu Densetsu" ,"sdodgeb" , "neomame", 3, 0 } , -{ "Super Earth Invasion" ,"earthinv" , "mame", 3, 0 } , -{ "Super Formula (Japan)" ,"sformula" , "mame", 1, 0 } , -{ "Super Galaxians" ,"superg" , "mame", 3, 0 } , -{ "Super Hang-On (bootleg)" ,"shangonb" , "mame", 1, 0 } , -{ "Super Hang-On" ,"shangon" , "mame", 1, 0 } , -{ "Super High Impact (rev LA1 09/30/91)" ,"shimpact" , "mame", 3, 0 } , -{ "Super Invaders (EMAG)" ,"sinvemag" , "mame", 3, 0 } , -{ "Super Invaders (Zenitone-Microsec)" ,"sinvzen" , "mame", 3, 0 } , -{ "Super Invaders" ,"superinv" , "mame", 3, 0 } , -{ "Super Locomotive" ,"suprloco" , "mame", 5, 0 } , -{ "Super Marukin-Ban" ,"marukin" , "mame", 1, 0 } , -{ "Super Missile Attack" ,"suprmatk" , "mame", 3, 0 } , -{ "Super Moon Cresta" ,"smooncrs" , "mame", 3, 0 } , -{ "Super Mouse" ,"suprmous" , "mame", 3, 0 } , -{ "Super Pac-Man (Midway)" ,"superpcm" , "mame", 3, 0 } , -{ "Super Pac-Man" ,"superpac" , "mame", 3, 0 } , -{ "Super Pang (World)" ,"spang" , "mame", 1, 0 } , -{ "Super Pierrot (Japan)" ,"spiero" , "mame", 1, 0 } , -{ "Super Pool III (I-Vics)" ,"spool3i" , "mame", 3, 0 } , -{ "Super Pool III (World?)" ,"spool3" , "mame", 3, 0 } , -{ "Super Punch-Out!! (Japan)" ,"spnchotj" , "mame", 1, 0 } , -{ "Super Punch-Out!!" ,"spnchout" , "mame", 1, 0 } , -{ "Super Qix (bootleg)" ,"sqixbl" , "mame", 1, 0 } , -{ "Super Qix" ,"superqix" , "mame", 1, 0 } , -{ "Super Real Darwin (Japan)" ,"srdarwin" , "mame", 3, 0 } , -{ "Super Sidekicks / Tokuten Ou" ,"ssideki" , "neomame", 3, 0 } , -{ "Super Sidekicks 2 - The World Championship / Tokuten Ou 2 - real fight football" ,"ssideki2" , "neomame", 3, 0 } , -{ "Super Sidekicks 3 - The Next Glory / Tokuten Ou 3 - eikoue no michi" ,"ssideki3" , "neomame", 3, 0 } , -{ "Super Space Invaders '91 (World)" ,"ssi" , "mame", 3, 0 } , -{ "Super Sprint" ,"ssprint" , "mame", 3, 0 } , -{ "Super Spy, The" ,"superspy" , "neomame", 3, 0 } , -{ "Super Stingray" ,"sstingry" , "mame", 1, 0 } , -{ "Super Volley '91 (Japan)" ,"svolly91" , "mame", 1, 0 } , -{ "Super Volleyball (Japan)" ,"svolley" , "mame", 1, 0 } , -{ "Super Volleyball (Korea)" ,"svolleyk" , "mame", 1, 0 } , -{ "Super World Stadium '92 (Japan)" ,"sws92" , "mame", 3, 0 } , -{ "Super World Stadium '93 (Japan)" ,"sws93" , "mame", 3, 0 } , -{ "Super Xevious" ,"sxevious" , "mame", 3, 0 } , -{ "Super Zaxxon" ,"szaxxon" , "mame", 1, 0 } , -{ "Superman" ,"superman" , "mame", 3, 0 } , -{ "Surprise Attack (Japan)" ,"surpratk" , "mame", 3, 0 } , -{ "Swarm" ,"swarm" , "mame", 3, 0 } , -{ "Swimmer (set 1)" ,"swimmer" , "mame", 3, 0 } , -{ "Swimmer (set 2)" ,"swimmera" , "mame", 3, 0 } , -{ "Syougi No Tatsujin - Master of Syougi" ,"mosyougi" , "neomame", 3, 0 } , -{ "Syusse Oozumou (Japan)" ,"ssozumo" , "mame", 3, 0 } , -{ "T.T. Mahjong" ,"ttmahjng" , "mame", 3, 0 } , -{ "TNK III (US?)" ,"tnk3" , "mame", 3, 0 } , -{ "Tac/Scan" ,"tacscan" , "mame", 1, 0 } , -{ "Tag Team Wrestling" ,"tagteam" , "mame", 3, 0 } , -{ "Tail to Nose - Great Championship" ,"tail2nos" , "mame", 1, 0 } , -{ "Tailgunner" ,"tailg" , "mame", 3, 0 } , -{ "Taisen Karate Dou (Japan VS version)" ,"karatevs" , "mame", 5, 0 } , -{ "Takeda Shingen (Japan)" ,"tshingen" , "mame", 3, 0 } , -{ "Tank (Japan)" ,"tnk3j" , "mame", 3, 0 } , -{ "Tank Battalion" ,"tankbatt" , "mame", 3, 0 } , -{ "Tank Force (Japan)" ,"tankfrcj" , "mame", 3, 0 } , -{ "Tank Force (US)" ,"tankfrce" , "mame", 3, 0 } , -{ "Tapper (Budweiser)" ,"tapper" , "mame", 5, 0 } , -{ "Tapper (Root Beer)" ,"rbtapper" , "mame", 5, 0 } , -{ "Tapper (Suntory)" ,"sutapper" , "mame", 5, 0 } , -{ "Tapper (alternate)" ,"tappera" , "mame", 5, 0 } , -{ "Targ" ,"targ" , "mame", 3, 0 } , -{ "Tatakai no Banka (Japan)" ,"trojanj" , "mame", 5, 0 } , -{ "Tazz-Mania (Scramble hardware)" ,"tazmania" , "mame", 1, 0 } , -{ "Tazz-Mania (Strategy X hardware)" ,"tazmani2" , "mame", 1, 0 } , -{ "Tecmo Knight" ,"tknight" , "mame", 3, 0 } , -{ "Tecmo World Soccer '96" ,"tws96" , "neomame", 3, 0 } , -{ "TeddyBoy Blues" ,"teddybb" , "mame", 5, 0 } , -{ "Tee'd Off" ,"teedoff" , "mame", 3, 0 } , -{ "Teenage Mutant Hero Turtles (2 Players UK)" ,"tmht2p" , "mame", 3, 0 } , -{ "Teenage Mutant Hero Turtles (4 Players UK)" ,"tmht" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles (2 Players Japan)" ,"tmnt2pj" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles (2 Players Oceania)" ,"tmnt2po" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles (4 Players Japan)" ,"tmntj" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles (4 Players US)" ,"tmnt" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles - Turtles in Time (2 Players US)" ,"tmnt22p" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles - Turtles in Time (4 Players Asia)" ,"tmnt2a" , "mame", 3, 0 } , -{ "Teenage Mutant Ninja Turtles - Turtles in Time (4 Players US)" ,"tmnt2" , "mame", 3, 0 } , -{ "Tehkan World Cup" ,"tehkanwc" , "mame", 3, 0 } , -{ "Teki Paki" ,"tekipaki" , "mame", 3, 0 } , -{ "Tempest (rev 1)" ,"tempest1" , "mame", 3, 0 } , -{ "Tempest (rev 2)" ,"tempest2" , "mame", 3, 0 } , -{ "Tempest (rev 3)" ,"tempest" , "mame", 3, 0 } , -{ "Tempest Tubes" ,"temptube" , "mame", 3, 0 } , -{ "Tenchi wo Kurau (Japan)" ,"dwj" , "mame", 3, 0 } , -{ "Tenchi wo Kurau II - Sekiheki no Tatakai (Japan)" ,"wofj" , "mame", 1, 0 } , -{ "Terminator 2 - Judgment Day (rev LA3 03/27/92)" ,"term2" , "mame", 3, 0 } , -{ "Terra Cresta (YM2203)" ,"terracra" , "mame", 3, 0 } , -{ "Terra Cresta (YM3526 set 1)" ,"terracre" , "mame", 3, 0 } , -{ "Terra Cresta (YM3526 set 2)" ,"terracrb" , "mame", 3, 0 } , -{ "Terra Force (US)" ,"terrafu" , "mame", 3, 0 } , -{ "Terra Force" ,"terraf" , "mame", 3, 0 } , -{ "Tetris (Cocktail set 1)" ,"atetcktl" , "mame", 3, 0 } , -{ "Tetris (Cocktail set 2)" ,"atetckt2" , "mame", 3, 0 } , -{ "Tetris (Japan, B-System)" ,"tetrist" , "mame", 3, 0 } , -{ "Tetris (Sega Set 1)" ,"tetris" , "mame", 3, 0 } , -{ "Tetris (Sega Set 2)" ,"tetrisa" , "mame", 3, 0 } , -{ "Tetris (Sega bootleg)" ,"tetrisbl" , "mame", 3, 0 } , -{ "Tetris (bootleg)" ,"atetrisb" , "mame", 3, 0 } , -{ "Tetris (set 1)" ,"atetris" , "mame", 3, 0 } , -{ "Tetris (set 2)" ,"atetrisa" , "mame", 3, 0 } , -{ "Thrash Rally" ,"trally" , "neomame", 3, 0 } , -{ "Three Stooges" ,"3stooges" , "mame", 3, 0 } , -{ "Three Wonders (US)" ,"3wonders" , "mame", 3, 0 } , -{ "Thunder Blaster (Japan)" ,"thndblst" , "mame", 3, 0 } , -{ "Thunder Cross (Japan)" ,"thnderxj" , "mame", 3, 0 } , -{ "Thunder Cross II (Japan)" ,"thndrx2" , "mame", 3, 0 } , -{ "Thunder Cross" ,"thunderx" , "mame", 3, 0 } , -{ "Thunder Fox (Japan)" ,"thundfox" , "mame", 3, 0 } , -{ "ThunderJaws" ,"thunderj" , "mame", 0, 0 } , -{ "Thundercade / Twin Formation" ,"tndrcade" , "mame", 3, 0 } , -{ "Tiger Heli (Japan)" ,"tigerhj" , "mame", 3, 0 } , -{ "Tiger Heli (bootleg 1)" ,"tigerhb1" , "mame", 3, 0 } , -{ "Tiger Heli (bootleg 2)" ,"tigerhb2" , "mame", 3, 0 } , -{ "Tiger Heli (set 1)" ,"tigerh" , "mame", 3, 0 } , -{ "Tiger Heli (set 2)" ,"tigerh2" , "mame", 3, 0 } , -{ "Tiger Road (US)" ,"tigeroad" , "mame", 3, 0 } , -{ "Timber" ,"timber" , "mame", 5, 0 } , -{ "Time Pilot '84 (set 1)" ,"tp84" , "mame", 3, 0 } , -{ "Time Pilot '84 (set 2)" ,"tp84a" , "mame", 3, 0 } , -{ "Time Pilot (Centuri)" ,"timepltc" , "mame", 3, 0 } , -{ "Time Pilot" ,"timeplt" , "mame", 3, 0 } , -{ "Time Scanner" ,"timscanr" , "mame", 3, 0 } , -{ "Time Soldiers (US Rev 1)" ,"timesol1" , "mame", 3, 0 } , -{ "Time Soldiers (US Rev 3)" ,"timesold" , "mame", 3, 0 } , -{ "Time Tunnel" ,"timetunl" , "mame", 3, 0 } , -{ "Tin Star, The" ,"tinstar" , "mame", 3, 0 } , -{ "Tip Top" ,"tiptop" , "mame", 3, 0 } , -{ "Toggle" ,"toggle" , "mame", 3, 0 } , -{ "Toki (US)" ,"tokiu" , "mame", 3, 0 } , -{ "Toki (bootleg)" ,"tokib" , "mame", 3, 0 } , -{ "Toki (set 1)" ,"toki" , "mame", 3, 0 } , -{ "Toki (set 2)" ,"toki2" , "mame", 3, 0 } , -{ "Toki (set 3)" ,"toki3" , "mame", 3, 0 } , -{ "Toki no Senshi - Chrono Soldier" ,"tokisens" , "mame", 3, 0 } , -{ "Tokio / Scramble Formation (bootleg)" ,"tokiob" , "mame", 3, 0 } , -{ "Tokio / Scramble Formation" ,"tokio" , "mame", 3, 0 } , -{ "Tokushu Butai Jackal (Japan)" ,"jackalj" , "mame", 3, 0 } , -{ "Tokusyu Butai UAG (Japan)" ,"tndrcadj" , "mame", 3, 0 } , -{ "Tomahawk 777 (Revision 1)" ,"tomahawk" , "mame", 3, 0 } , -{ "Tomahawk 777 (Revision 5)" ,"tomahaw5" , "mame", 3, 0 } , -{ "Toobin' (Prototype)" ,"toobinp" , "mame", 3, 0 } , -{ "Toobin' (version 2)" ,"toobin2" , "mame", 3, 0 } , -{ "Toobin' (version 3)" ,"toobin" , "mame", 3, 0 } , -{ "Top Gunner (US)" ,"topgunr" , "mame", 3, 0 } , -{ "Top Gunner (bootleg)" ,"topgunbl" , "mame", 3, 0 } , -{ "Top Hunter - Roddy & Cathy" ,"tophuntr" , "neomame", 3, 0 } , -{ "Top Player's Golf" ,"tpgolf" , "neomame", 3, 0 } , -{ "Top Racer" ,"topracer" , "mame", 3, 0 } , -{ "Top Secret (Exidy) (version 1.0)" ,"topsecex" , "mame", 3, 0 } , -{ "Top Secret (Japan)" ,"topsecrt" , "mame", 3, 0 } , -{ "Tora eno Michi (Japan)" ,"toramich" , "mame", 1, 0 } , -{ "Tornado Baseball" ,"tornbase" , "mame", 3, 0 } , -{ "Toryumon" ,"toryumon" , "mame", 1, 0 } , -{ "Total Carnage (prototype, rev 1.0 01/25/92)" ,"totcarnp" , "mame", 3, 0 } , -{ "Total Carnage (rev LA1 03/10/92)" ,"totcarn" , "mame", 3, 0 } , -{ "TouchDown Fever (Japan)" ,"tdfeverj" , "mame", 3, 0 } , -{ "TouchDown Fever" ,"tdfever" , "mame", 3, 0 } , -{ "Tough Turf (Japan)" ,"tturf" , "mame", 3, 0 } , -{ "Tough Turf (US)" ,"tturfu" , "mame", 3, 0 } , -{ "Tough Turf (bootleg)" ,"tturfbl" , "mame", 3, 0 } , -{ "Tougyuu, The (Japan)" ,"bullfgtj" , "mame", 5, 0 } , -{ "Tournament Arkanoid (US)" ,"arkatour" , "mame", 3, 0 } , -{ "Tournament Cyberball 2072" ,"cyberbt" , "mame", 3, 0 } , -{ "Tower of Druaga (set 1)" ,"todruaga" , "mame", 3, 0 } , -{ "Tower of Druaga (set 2)" ,"todruagb" , "mame", 3, 0 } , -{ "Toypop" ,"toypop" , "mame", 3, 0 } , -{ "Track & Field (Centuri)" ,"trackflc" , "mame", 3, 0 } , -{ "Track & Field" ,"trackfld" , "mame", 3, 0 } , -{ "Tranquilizer Gun" ,"tranqgun" , "mame", 3, 0 } , -{ "Traverse USA / Zippy Race" ,"travrusa" , "mame", 3, 0 } , -{ "Treasure Hunt (Japan?)" ,"treahunt" , "mame", 1, 0 } , -{ "Tri-Sports" ,"trisport" , "mame", 3, 0 } , -{ "Trigon (Japan)" ,"trigon" , "mame", 3, 0 } , -{ "Trio The Punch - Never Forget Me... (Japan)" ,"triothep" , "mame", 3, 0 } , -{ "Triple Punch" ,"triplep" , "mame", 3, 0 } , -{ "Trivial Pursuit (All Star Sports Edition)" ,"triviasp" , "mame", 3, 0 } , -{ "Trivial Pursuit (Baby Boomer Edition)" ,"triviabb" , "mame", 3, 0 } , -{ "Trivial Pursuit (Genus I)" ,"triviag1" , "mame", 3, 0 } , -{ "Trivial Pursuit (Genus II)" ,"triviag2" , "mame", 3, 0 } , -{ "Trivial Pursuit (Young Players Edition)" ,"triviayp" , "mame", 3, 0 } , -{ "Trog (prototype, rev 4.00 07/27/90)" ,"trogp" , "mame", 3, 0 } , -{ "Trog (rev LA3 02/14/91)" ,"trog3" , "mame", 3, 0 } , -{ "Trog (rev LA4 03/11/91)" ,"trog" , "mame", 3, 0 } , -{ "Trojan (Romstar)" ,"trojanr" , "mame", 5, 0 } , -{ "Trojan (US)" ,"trojan" , "mame", 5, 0 } , -{ "Tron (set 1)" ,"tron" , "mame", 5, 0 } , -{ "Tron (set 2)" ,"tron2" , "mame", 5, 0 } , -{ "Tropical Angel" ,"troangel" , "mame", 3, 0 } , -{ "Truxton / Tatsujin" ,"truxton" , "mame", 3, 0 } , -{ "Truxton II / Tatsujin II / Tatsujin Oh (Japan)" ,"tatsujn2" , "mame", 3, 0 } , -{ "Tube-It" ,"tubeit" , "mame", 3, 0 } , -{ "Tumble Pop (Japan)" ,"tumblepj" , "mame", 3, 0 } , -{ "Tumble Pop (World)" ,"tumblep" , "mame", 3, 0 } , -{ "Tumble Pop (bootleg set 1)" ,"tumblepb" , "mame", 3, 0 } , -{ "Tumble Pop (bootleg set 2)" ,"tumblep2" , "mame", 3, 0 } , -{ "Turbo (encrypted set 1)" ,"turboa" , "mame", 3, 0 } , -{ "Turbo (encrypted set 2)" ,"turbob" , "mame", 3, 0 } , -{ "Turbo Force" ,"turbofrc" , "mame", 1, 0 } , -{ "Turbo Tag (Prototype)" ,"turbotag" , "mame", 1, 0 } , -{ "Turbo" ,"turbo" , "mame", 3, 0 } , -{ "Turkey Shoot" ,"tshoot" , "mame", 3, 0 } , -{ "Turpin" ,"turpin" , "mame", 3, 0 } , -{ "Turtle Ship" ,"turtship" , "mame", 3, 0 } , -{ "Turtles" ,"turtles" , "mame", 3, 0 } , -{ "Tutankham (Stern)" ,"tutankst" , "mame", 3, 0 } , -{ "Tutankham" ,"tutankhm" , "mame", 3, 0 } , -{ "Twin Cobra (US)" ,"twincobu" , "mame", 3, 0 } , -{ "Twin Cobra (World)" ,"twincobr" , "mame", 3, 0 } , -{ "Twin Eagle (Japan)" ,"twineagl" , "mame", 3, 0 } , -{ "TwinBee" ,"twinbee" , "mame", 3, 0 } , -{ "Twinkle Star Sprites" ,"twinspri" , "neomame", 3, 0 } , -{ "Two Crude (US)" ,"twocrude" , "mame", 3, 0 } , -{ "Two Tigers" ,"twotiger" , "mame", 5, 0 } , -{ "U.N. Squadron (US)" ,"unsquad" , "mame", 3, 0 } , -{ "U.S. Classic" ,"usclssic" , "mame", 0, 0 } , -{ "U.S. Navy (Japan)" ,"cawingj" , "mame", 3, 0 } , -{ "Ufo Senshi Yohko Chan" ,"ufosensi" , "mame", 1, 0 } , -{ "Ultimate 11 / Tokuten Ou - Honoo no Libero, The" ,"ssideki4" , "neomame", 3, 0 } , -{ "Ultimate Mortal Kombat 3 (rev 1.1)" ,"umk3r11" , "mame", 3, 0 } , -{ "Ultimate Mortal Kombat 3 (rev 1.2)" ,"umk3" , "mame", 3, 0 } , -{ "Ultraman (Japan)" ,"ultraman" , "mame", 3, 0 } , -{ "Undercover Cops (Japan)" ,"uccopsj" , "mame", 3, 0 } , -{ "Undercover Cops (World)" ,"uccops" , "mame", 3, 0 } , -{ "UniWar S" ,"uniwars" , "mame", 3, 0 } , -{ "Uo Poko (Japan)" ,"uopoko" , "mame", 3, 0 } , -{ "Up'n Down" ,"upndown" , "mame", 3, 0 } , -{ "Us vs. Them" ,"usvsthem" , "mame", 3, 0 } , -{ "V-Five (Japan)" ,"vfive" , "mame", 3, 0 } , -{ "Valtric" ,"valtric" , "mame", 1, 0 } , -{ "Van Van Car (Sanritsu)" ,"vanvans" , "mame", 3, 0 } , -{ "Van Van Car" ,"vanvan" , "mame", 3, 0 } , -{ "Vanguard (Centuri)" ,"vangrdce" , "mame", 3, 0 } , -{ "Vanguard (SNK)" ,"vanguard" , "mame", 3, 0 } , -{ "Vanguard II" ,"vangrd2" , "mame", 3, 0 } , -{ "Vapor Trail - Hyper Offence Formation (US)" ,"vaportru" , "mame", 3, 0 } , -{ "Vapor Trail - Hyper Offence Formation (World revision 1)" ,"vaportra" , "mame", 3, 0 } , -{ "Varth - Operation Thunderstorm (Japan)" ,"varthj" , "mame", 3, 0 } , -{ "Varth - Operation Thunderstorm (US)" ,"varthu" , "mame", 3, 0 } , -{ "Varth - Operation Thunderstorm (World)" ,"varth" , "mame", 3, 0 } , -{ "Vastar (set 1)" ,"vastar" , "mame", 3, 0 } , -{ "Vastar (set 2)" ,"vastar2" , "mame", 3, 0 } , -{ "Vendetta (Asia set 1)" ,"vendetta" , "mame", 3, 0 } , -{ "Vendetta (Asia set 2)" ,"vendett2" , "mame", 3, 0 } , -{ "Venture (version 4)" ,"venture4" , "mame", 3, 0 } , -{ "Venture (version 5 set 1)" ,"venture" , "mame", 3, 0 } , -{ "Venture (version 5 set 2)" ,"venture2" , "mame", 3, 0 } , -{ "Venus" ,"venus" , "mame", 3, 0 } , -{ "Victor Banana" ,"victorba" , "mame", 1, 0 } , -{ "Victory Road" ,"victroad" , "mame", 3, 0 } , -{ "Victory" ,"victory" , "mame", 1, 0 } , -{ "Video Hustler (bootleg)" ,"hustlerb" , "mame", 3, 0 } , -{ "Video Hustler" ,"hustler" , "mame", 3, 0 } , -{ "Viewpoint" ,"viewpoin" , "neomame", 3, 0 } , -{ "Vigilante (Japan)" ,"vigilntj" , "mame", 1, 0 } , -{ "Vigilante (US)" ,"vigilntu" , "mame", 1, 0 } , -{ "Vigilante (World)" ,"vigilant" , "mame", 1, 0 } , -{ "Vimana (Nova Apparate GMBH & Co)" ,"vimanan" , "mame", 3, 0 } , -{ "Vimana (set 1)" ,"vimana" , "mame", 3, 0 } , -{ "Vimana (set 2)" ,"vimana2" , "mame", 3, 0 } , -{ "Vindicators Part II" ,"vindctr2" , "mame", 3, 0 } , -{ "Vindicators" ,"vindictr" , "mame", 3, 0 } , -{ "Violence Fight (World)" ,"viofight" , "mame", 3, 0 } , -{ "Viper" ,"viper" , "mame", 3, 0 } , -{ "Voltage Fighter - Gowcaizer / Choujin Gakuen Gowcaizer" ,"gowcaizr" , "neomame", 3, 0 } , -{ "Vulcan Venture" ,"vulcan" , "mame", 3, 0 } , -{ "Vulgus (Japan?)" ,"vulgusj" , "mame", 5, 0 } , -{ "Vulgus (set 1)" ,"vulgus" , "mame", 5, 0 } , -{ "Vulgus (set 2)" ,"vulgus2" , "mame", 5, 0 } , -{ "WEC Le Mans 24" ,"wecleman" , "mame", 3, 0 } , -{ "WWF: Wrestlemania (rev 1.30)" ,"wwfmania" , "mame", 3, 0 } , -{ "Wacko" ,"wacko" , "mame", 5, 0 } , -{ "Waku Waku 7" ,"wakuwak7" , "neomame", 3, 0 } , -{ "Wanted" ,"wanted" , "mame", 3, 0 } , -{ "War of Aero - Project MEIOU" ,"wrofaero" , "mame", 3, 0 } , -{ "War of the Bugs" ,"warofbug" , "mame", 3, 0 } , -{ "War of the Worlds" ,"wotw" , "mame", 3, 0 } , -{ "Wardna no Mori (Japan)" ,"wardnerj" , "mame", 3, 0 } , -{ "Wardner (World)" ,"wardner" , "mame", 3, 0 } , -{ "Warlords" ,"warlord" , "mame", 3, 0 } , -{ "Warp & Warp" ,"warpwarp" , "mame", 3, 0 } , -{ "Warp Warp (Rock-ola set 1)" ,"warpwarr" , "mame", 3, 0 } , -{ "Warp Warp (Rock-ola set 2)" ,"warpwar2" , "mame", 3, 0 } , -{ "Warrior" ,"warrior" , "mame", 3, 0 } , -{ "Warriors of Fate (World)" ,"wof" , "mame", 1, 0 } , -{ "Water Ski" ,"waterski" , "mame", 1, 0 } , -{ "West Story" ,"weststry" , "mame", 0, 0 } , -{ "Western Express (World?)" ,"wexpress" , "mame", 3, 0 } , -{ "Western Express (bootleg)" ,"wexpresb" , "mame", 3, 0 } , -{ "Who Dunit (version 8.0)" ,"whodunit" , "mame", 3, 0 } , -{ "Whoopee (Japan) / Pipi & Bibis (World)" ,"whoopee" , "mame", 3, 0 } , -{ "Wild Fang" ,"wildfang" , "mame", 3, 0 } , -{ "Wild Western (set 1)" ,"wwestern" , "mame", 3, 0 } , -{ "Wild Western (set 2)" ,"wwester1" , "mame", 3, 0 } , -{ "Willow (Japan, English)" ,"willow" , "mame", 3, 0 } , -{ "Willow (Japan, Japanese)" ,"willowj" , "mame", 3, 0 } , -{ "Windjammers / Flying Power Disc" ,"wjammers" , "neomame", 3, 0 } , -{ "Wiping" ,"wiping" , "mame", 3, 0 } , -{ "Wise Guy" ,"wiseguy" , "mame", 1, 0 } , -{ "Wiz (Taito)" ,"wizt" , "mame", 3, 0 } , -{ "Wiz" ,"wiz" , "mame", 3, 0 } , -{ "Wizard of Wor" ,"wow" , "mame", 3, 0 } , -{ "Wonder 3 (Japan)" ,"wonder3" , "mame", 3, 0 } , -{ "Wonder Boy (not encrypted)" ,"wboyu" , "mame", 3, 0 } , -{ "Wonder Boy (set 1)" ,"wboy" , "mame", 5, 0 } , -{ "Wonder Boy (set 2)" ,"wboy2" , "mame", 5, 0 } , -{ "Wonder Boy (set 3)" ,"wboy3" , "mame", 5, 0 } , -{ "Wonder Boy (set 4 not encrypted)" ,"wboy4u" , "mame", 3, 0 } , -{ "Wonder Boy (set 4)" ,"wboy4" , "mame", 5, 0 } , -{ "Wonder Boy Deluxe" ,"wbdeluxe" , "mame", 3, 0 } , -{ "Wonder Boy III - Monster Lair (bootleg)" ,"wb3bl" , "mame", 3, 0 } , -{ "Wonder Boy III - Monster Lair (set 1)" ,"wb3" , "mame", 3, 0 } , -{ "Wonder Boy III - Monster Lair (set 2)" ,"wb3a" , "mame", 3, 0 } , -{ "Wonder Boy in Monster Land (Japan not encrypted)" ,"wbmlju" , "mame", 5, 0 } , -{ "Wonder Boy in Monster Land (Japan set 1)" ,"wbmlj" , "mame", 5, 0 } , -{ "Wonder Boy in Monster Land (Japan set 2)" ,"wbmlj2" , "mame", 5, 0 } , -{ "Wonder Boy in Monster Land" ,"wbml" , "mame", 5, 0 } , -{ "Wonder Momo" ,"wndrmomo" , "mame", 3, 0 } , -{ "World Court (Japan)" ,"wldcourt" , "mame", 3, 0 } , -{ "World Cup 90" ,"wc90" , "mame", 3, 0 } , -{ "World Heroes 2 Jet" ,"wh2j" , "neomame", 3, 0 } , -{ "World Heroes 2" ,"wh2" , "neomame", 3, 0 } , -{ "World Heroes Perfect" ,"whp" , "neomame", 3, 0 } , -{ "World Heroes" ,"wh1" , "neomame", 3, 0 } , -{ "World Series: The Season" ,"wseries" , "mame", 1, 0 } , -{ "World Soccer Finals" ,"wsf" , "mame", 3, 0 } , -{ "World Stadium '89 (Japan)" ,"ws89" , "mame", 3, 0 } , -{ "World Stadium '90 (Japan)" ,"ws90" , "mame", 3, 0 } , -{ "World Stadium (Japan)" ,"ws" , "mame", 3, 0 } , -{ "World Tennis" ,"wtennis" , "mame", 3, 0 } , -{ "World Wars (Japan)" ,"worldwar" , "mame", 3, 0 } , -{ "Wrestle War" ,"wrestwar" , "mame", 1, 0 } , -{ "X Multiply (Japan)" ,"xmultipl" , "mame", 1, 0 } , -{ "X-Men (2 Players Japan)" ,"xmen2pj" , "mame", 3, 0 } , -{ "X-Men (4 Players)" ,"xmen" , "mame", 3, 0 } , -{ "X-Men (6 Players)" ,"xmen6p" , "mame", 3, 0 } , -{ "Xain'd Sleena (bootleg)" ,"xsleenab" , "mame", 3, 0 } , -{ "Xain'd Sleena" ,"xsleena" , "mame", 3, 0 } , -{ "Xenophobe" ,"xenophob" , "mame", 3, 0 } , -{ "Xevios" ,"xevios" , "mame", 3, 0 } , -{ "Xevious (Atari)" ,"xeviousa" , "mame", 3, 0 } , -{ "Xevious (Namco)" ,"xevious" , "mame", 3, 0 } , -{ "Xybots" ,"xybots" , "mame", 3, 0 } , -{ "Yam! Yam!?" ,"yamyam" , "mame", 1, 0 } , -{ "Yamato (set 1)" ,"yamato" , "mame", 5, 0 } , -{ "Yamato (set 2)" ,"yamato2" , "mame", 5, 0 } , -{ "Yankee DO!" ,"yankeedo" , "mame", 3, 0 } , -{ "Yes/No Sinri Tokimeki Chart" ,"yesnoj" , "mame", 3, 0 } , -{ "Yie Ar Kung-Fu (set 1)" ,"yiear" , "mame", 3, 0 } , -{ "Yie Ar Kung-Fu (set 2)" ,"yiear2" , "mame", 3, 0 } , -{ "Yokai Douchuuki (Japan new version)" ,"youkaidk" , "mame", 3, 0 } , -{ "Yokai Douchuuki (Japan old version)" ,"yokaidko" , "mame", 3, 0 } , -{ "Yosaku To Donbee (bootleg)" ,"yosakdon" , "mame", 3, 0 } , -{ "Youma Ninpou Chou (Japan)" ,"youma" , "mame", 3, 0 } , -{ "Yuuyu no Quiz de GO!GO! (Japan)" ,"yuyugogo" , "mame", 1, 0 } , -{ "Zarzon" ,"zarzon" , "mame", 3, 0 } , -{ "Zaxxon (set 1)" ,"zaxxon" , "mame", 3, 0 } , -{ "Zaxxon (set 2)" ,"zaxxon2" , "mame", 3, 0 } , -{ "Zed Blade / Operation Ragnarok" ,"zedblade" , "neomame", 3, 0 } , -{ "Zektor" ,"zektor" , "mame", 1, 0 } , -{ "Zero Time" ,"zerotime" , "mame", 3, 0 } , -{ "Zero Wing" ,"zerowing" , "mame", 3, 0 } , -{ "Zero Zone" ,"zerozone" , "mame", 3, 0 } , -{ "Zig Zag (Dig Dug hardware)" ,"dzigzag" , "mame", 3, 0 } , -{ "Zig Zag (Galaxian hardware, set 1)" ,"zigzag" , "mame", 3, 0 } , -{ "Zig Zag (Galaxian hardware, set 2)" ,"zigzag2" , "mame", 3, 0 } , -{ "Zing Zing Zip" ,"zingzip" , "mame", 3, 0 } , -{ "Zoar" ,"zoar" , "mame", 3, 0 } , -{ "Zodiack" ,"zodiack" , "mame", 1, 0 } , -{ "Zoo Keeper (set 1)" ,"zookeep" , "mame", 3, 0 } , -{ "Zoo Keeper (set 2)" ,"zookeep2" , "mame", 3, 0 } , -{ "Zoo Keeper (set 3)" ,"zookeep3" , "mame", 3, 0 } , -{ "Zwackery" ,"zwackery" , "mame", 3, 0 } , -{ "Zzyzzyxx (set 1)" ,"zzyzzyxx" , "mame", 3, 0 } , -{ "Zzyzzyxx (set 2)" ,"zzyzzyx2" , "mame", 3, 0 } +{ "'88 Games" ,"88games" , "mame", 3, 0 } , +{ "'99 The Last War (alternate)" ,"99lstwra" , "mame", 3, 0 } , +{ "'99 The Last War" ,"99lstwar" , "mame", 3, 0 } , +{ "005" ,"005" , "mame", 1, 0 } , +{ "10 Yard Fight (Vs. version 11/05/84)" ,"vsyard" , "mame", 3, 0 } , +{ "10 Yard Fight (Vs. version, set 2)" ,"vsyard2" , "mame", 3, 0 } , +{ "10 Yard Fight" ,"yard" , "mame", 3, 0 } , +{ "1941 - Counter Attack (Japan)" ,"1941j" , "mame", 3, 0 } , +{ "1941 - Counter Attack (World)" ,"1941" , "mame", 3, 0 } , +{ "1942 (set 1)" ,"1942" , "mame", 5, 0 } , +{ "1942 (set 2)" ,"1942a" , "mame", 5, 0 } , +{ "1942 (set 3)" ,"1942b" , "mame", 5, 0 } , +{ "1943 - The Battle of Midway (Japan)" ,"1943j" , "mame", 3, 0 } , +{ "1943 - The Battle of Midway (US)" ,"1943" , "mame", 3, 0 } , +{ "1943 Kai" ,"1943kai" , "mame", 3, 0 } , +{ "2 On 2 Open Ice Challenge (rev 1.21)" ,"openice" , "mame", 3, 0 } , +{ "2020 Super Baseball (set 1)" ,"2020bb" , "neomame", 3, 0 } , +{ "2020 Super Baseball (set 2)" ,"2020bbh" , "neomame", 3, 0 } , +{ "3 Count Bout / Fire Suplex" ,"3countb" , "neomame", 3, 0 } , +{ "4 Player Bowling" ,"bowler" , "mame", 3, 0 } , +{ "4-D Warriors" ,"4dwarrio" , "mame", 1, 0 } , +{ "600" ,"600" , "mame", 3, 0 } , +{ "64th. Street - A Detective Story (Japan)" ,"64streej" , "mame", 3, 0 } , +{ "64th. Street - A Detective Story (World)" ,"64street" , "mame", 3, 0 } , +{ "720 Degrees (set 1)" ,"720" , "mame", 3, 0 } , +{ "720 Degrees (set 2)" ,"720b" , "mame", 3, 0 } , +{ "800 Fathoms" ,"800fath" , "mame", 3, 0 } , +{ "APB - All Points Bulletin (set 1)" ,"apb" , "mame", 3, 0 } , +{ "APB - All Points Bulletin (set 2)" ,"apb2" , "mame", 3, 0 } , +{ "ASO - Armored Scrum Object" ,"aso" , "mame", 3, 0 } , +{ "Act-Fancer Cybernetick Hyper Weapon (Japan revision 1)" ,"actfancj" , "mame", 3, 0 } , +{ "Act-Fancer Cybernetick Hyper Weapon (World revision 1)" ,"actfanc1" , "mame", 3, 0 } , +{ "Act-Fancer Cybernetick Hyper Weapon (World revision 2)" ,"actfancr" , "mame", 3, 0 } , +{ "Adventure Quiz 2 Hatena Hatena no Dai-Bouken (Japan)" ,"hatena" , "mame", 1, 0 } , +{ "Aero Fighters (Turbo Force hardware set 1)" ,"aerofgtb" , "mame", 1, 0 } , +{ "Aero Fighters (Turbo Force hardware set 2)" ,"aerofgtc" , "mame", 1, 0 } , +{ "Aero Fighters 2 / Sonic Wings 2" ,"sonicwi2" , "neomame", 1, 0 } , +{ "Aero Fighters 3 / Sonic Wings 3" ,"sonicwi3" , "neomame", 1, 0 } , +{ "Aero Fighters" ,"aerofgt" , "mame", 1, 0 } , +{ "Aeroboto" ,"aeroboto" , "mame", 3, 0 } , +{ "Aggressors of Dark Kombat / Tsuukai GANGAN Koushinkyoku" ,"aodk" , "neomame", 3, 0 } , +{ "Ah Eikou no Koshien (Japan)" ,"koshien" , "mame", 3, 0 } , +{ "Air Buster (Japan)" ,"airbustr" , "mame", 3, 0 } , +{ "Air Duel (Japan)" ,"airduel" , "mame", 1, 0 } , +{ "Air Wolf" ,"airwolf" , "mame", 3, 0 } , +{ "Ajax (Japan)" ,"ajaxj" , "mame", 3, 0 } , +{ "Ajax" ,"ajax" , "mame", 3, 0 } , +{ "Akuma-Jou Dracula (Japan)" ,"hcastlej" , "mame", 3, 0 } , +{ "Alcon" ,"alcon" , "mame", 3, 0 } , +{ "Ales no Tsubasa (Japan)" ,"lwingsjp" , "mame", 5, 0 } , +{ "Alex Kidd (set 1)" ,"alexkidd" , "mame", 3, 0 } , +{ "Alex Kidd (set 2)" ,"alexkida" , "mame", 3, 0 } , +{ "Ali Baba and 40 Thieves" ,"alibaba" , "mame", 3, 0 } , +{ "Alien Invasion Part II" ,"alieninv" , "mame", 3, 0 } , +{ "Alien Storm (2 Player)" ,"astorm2p" , "mame", 1, 0 } , +{ "Alien Storm (bootleg)" ,"astormbl" , "mame", 1, 0 } , +{ "Alien Storm" ,"astorm" , "mame", 1, 0 } , +{ "Alien Syndrome (Japan)" ,"aliensyj" , "mame", 1, 0 } , +{ "Alien Syndrome (set 1)" ,"aliensyn" , "mame", 1, 0 } , +{ "Alien Syndrome (set 2)" ,"aliensya" , "mame", 1, 0 } , +{ "Alien Syndrome (set 3)" ,"aliensyb" , "mame", 1, 0 } , +{ "Aliens (Japan)" ,"aliensj" , "mame", 3, 0 } , +{ "Aliens (US)" ,"aliensu" , "mame", 3, 0 } , +{ "Aliens (World set 1)" ,"aliens" , "mame", 3, 0 } , +{ "Aliens (World set 2)" ,"aliens2" , "mame", 3, 0 } , +{ "All American Football (rev B)" ,"aafbb" , "mame", 3, 0 } , +{ "All American Football (rev D, 2 Players)" ,"aafbd2p" , "mame", 3, 0 } , +{ "All American Football (rev E)" ,"aafb" , "mame", 3, 0 } , +{ "Alley Master" ,"alleymas" , "mame", 1, 0 } , +{ "Alpha Mission II / ASO II - Last Guardian" ,"alpham2" , "neomame", 3, 0 } , +{ "Alpine Ski (set 1)" ,"alpine" , "mame", 3, 0 } , +{ "Alpine Ski (set 2)" ,"alpinea" , "mame", 3, 0 } , +{ "Altered Beast (Version 1)" ,"altbeast" , "mame", 1, 0 } , +{ "Altered Beast (Version 2)" ,"altbeas2" , "mame", 1, 0 } , +{ "Amazing Maze" ,"maze" , "mame", 3, 0 } , +{ "Ambush" ,"ambush" , "mame", 3, 0 } , +{ "American Horseshoes (US)" ,"horshoes" , "mame", 3, 0 } , +{ "Amidar (Olympia)" ,"amidaro" , "mame", 3, 0 } , +{ "Amidar (Scramble hardware)" ,"amidars" , "mame", 3, 0 } , +{ "Amidar (Stern)" ,"amidaru" , "mame", 3, 0 } , +{ "Amidar" ,"amidar" , "mame", 3, 0 } , +{ "Amigo" ,"amigo" , "mame", 3, 0 } , +{ "Andro Dunos" ,"androdun" , "neomame", 3, 0 } , +{ "Anteater" ,"anteater" , "mame", 3, 0 } , +{ "Appoooh" ,"appoooh" , "mame", 3, 0 } , +{ "Arabian (Atari)" ,"arabiana" , "mame", 3, 0 } , +{ "Arabian" ,"arabian" , "mame", 3, 0 } , +{ "Arbalester" ,"arbalest" , "mame", 3, 0 } , +{ "Arcade Classics (prototype)" ,"arcadecl" , "mame", 3, 0 } , +{ "Arch Rivals (rev 2.0)" ,"archriv2" , "mame", 3, 0 } , +{ "Arch Rivals (rev 4.0)" ,"archrivl" , "mame", 3, 0 } , +{ "Area 88 (Japan)" ,"area88" , "mame", 3, 0 } , +{ "Argus" ,"argus" , "mame", 1, 0 } , +{ "Argus no Senshi (Japan)" ,"rygarj" , "mame", 3, 0 } , +{ "Ark Area" ,"arkarea" , "mame", 1, 0 } , +{ "Arkanoid (Game Corporation bootleg)" ,"arkangc" , "mame", 3, 0 } , +{ "Arkanoid (Japan)" ,"arknoidj" , "mame", 3, 0 } , +{ "Arkanoid (Japanese bootleg Set 2)" ,"arkbl2" , "mame", 3, 0 } , +{ "Arkanoid (Tayto bootleg, Japanese)" ,"arkatayt" , "mame", 3, 0 } , +{ "Arkanoid (US)" ,"arknoidu" , "mame", 3, 0 } , +{ "Arkanoid (World)" ,"arkanoid" , "mame", 3, 0 } , +{ "Arkanoid - Revenge of DOH (Japan)" ,"ark2jp" , "mame", 3, 0 } , +{ "Arkanoid - Revenge of DOH (US)" ,"ark2us" , "mame", 3, 0 } , +{ "Arkanoid - Revenge of DOH (World)" ,"arkanoi2" , "mame", 3, 0 } , +{ "Arm Wrestling" ,"armwrest" , "mame", 1, 0 } , +{ "Armed Formation" ,"armedf" , "mame", 3, 0 } , +{ "Armor Attack" ,"armora" , "mame", 3, 0 } , +{ "Armored Car (set 1)" ,"armorcar" , "mame", 3, 0 } , +{ "Armored Car (set 2)" ,"armorca2" , "mame", 3, 0 } , +{ "Art of Fighting / Ryuuko no Ken" ,"aof" , "neomame", 3, 0 } , +{ "Art of Fighting 2 / Ryuuko no Ken 2" ,"aof2" , "neomame", 3, 0 } , +{ "Art of Fighting 3 - The Path of the Warrior / Art of Fighting - Ryuuko no Ken Gaiden" ,"aof3" , "neomame", 3, 0 } , +{ "Ashura Blaster (Japan)" ,"ashura" , "mame", 3, 0 } , +{ "Ashura Blaster (US)" ,"ashurau" , "mame", 3, 0 } , +{ "Assault (Japan)" ,"assaultj" , "mame", 3, 0 } , +{ "Assault Plus (Japan)" ,"assaultp" , "mame", 3, 0 } , +{ "Assault" ,"assault" , "mame", 3, 0 } , +{ "Asteroids (bootleg on Lunar Lander hardware)" ,"asteroib" , "mame", 3, 0 } , +{ "Asteroids (rev 1)" ,"asteroi1" , "mame", 3, 0 } , +{ "Asteroids (rev 2)" ,"asteroid" , "mame", 3, 0 } , +{ "Asteroids Deluxe (rev 1)" ,"astdelu1" , "mame", 3, 0 } , +{ "Asteroids Deluxe (rev 2)" ,"astdelux" , "mame", 3, 0 } , +{ "Astro Blaster (version 1)" ,"astrob1" , "mame", 1, 0 } , +{ "Astro Blaster (version 2)" ,"astrob2" , "mame", 1, 0 } , +{ "Astro Blaster (version 3)" ,"astrob" , "mame", 1, 0 } , +{ "Astro Fighter (set 1)" ,"astrof" , "mame", 3, 0 } , +{ "Astro Fighter (set 2)" ,"astrof2" , "mame", 3, 0 } , +{ "Astro Fighter (set 3)" ,"astrof3" , "mame", 3, 0 } , +{ "Astro Invader" ,"astinvad" , "mame", 3, 0 } , +{ "Astyanax, The" ,"astyanax" , "mame", 3, 0 } , +{ "Atari Baseball (set 1)" ,"abaseb" , "mame", 3, 0 } , +{ "Atari Baseball (set 2)" ,"abaseb2" , "mame", 3, 0 } , +{ "Atari Football (4 players)" ,"atarifb4" , "mame", 3, 0 } , +{ "Atari Football (revision 1)" ,"atarifb1" , "mame", 3, 0 } , +{ "Atari Football (revision 2)" ,"atarifb" , "mame", 3, 0 } , +{ "Atari Soccer" ,"soccer" , "mame", 3, 0 } , +{ "Ataxx (Japan)" ,"ataxxj" , "mame", 1, 0 } , +{ "Ataxx (set 1)" ,"ataxx" , "mame", 1, 0 } , +{ "Ataxx (set 2)" ,"ataxxa" , "mame", 1, 0 } , +{ "Athena" ,"athena" , "mame", 3, 0 } , +{ "Atomic Point" ,"atomicp" , "mame", 3, 0 } , +{ "Aurail (set 1)" ,"aurail" , "mame", 1, 0 } , +{ "Aurail (set 2)" ,"auraila" , "mame", 1, 0 } , +{ "Avalanche" ,"avalnche" , "mame", 3, 0 } , +{ "Avengers (set 1)" ,"avengers" , "mame", 3, 0 } , +{ "Avengers (set 2)" ,"avenger2" , "mame", 3, 0 } , +{ "Avenging Spirit" ,"avspirit" , "mame", 3, 0 } , +{ "Aztarac" ,"aztarac" , "mame", 3, 0 } , +{ "Azurian Attack" ,"azurian" , "mame", 3, 0 } , +{ "Bad Dudes vs. Dragonninja (US)" ,"baddudes" , "mame", 3, 0 } , +{ "Bad Lands" ,"badlands" , "mame", 3, 0 } , +{ "Bagman (Stern set 1)" ,"bagmans" , "mame", 3, 0 } , +{ "Bagman (Stern set 2)" ,"bagmans2" , "mame", 3, 0 } , +{ "Bagman" ,"bagman" , "mame", 3, 0 } , +{ "Bakatonosama Mahjong Manyuki" ,"bakatono" , "neomame", 3, 0 } , +{ "Balloon Bomber" ,"ballbomb" , "mame", 3, 0 } , +{ "Baluba-louk no Densetsu" ,"baluba" , "mame", 1, 0 } , +{ "Bandido" ,"bandido" , "mame", 3, 0 } , +{ "Bank Panic" ,"bankp" , "mame", 3, 0 } , +{ "Baraduke" ,"baraduke" , "mame", 3, 0 } , +{ "Barrier" ,"barrier" , "mame", 3, 0 } , +{ "Baseball Stars 2" ,"bstars2" , "neomame", 3, 0 } , +{ "Baseball Stars Professional" ,"bstars" , "neomame", 3, 0 } , +{ "Baseball The Season II" ,"basebal2" , "mame", 1, 0 } , +{ "Basketball" ,"bsktball" , "mame", 3, 0 } , +{ "Batman" ,"batman" , "mame", 3, 0 } , +{ "Batsugun" ,"batsugun" , "mame", 1, 0 } , +{ "Batsugun Special Ver." ,"batugnsp" , "mame", 3, 0 } , +{ "Battlantis (Japan)" ,"battlntj" , "mame", 3, 0 } , +{ "Battlantis" ,"battlnts" , "mame", 3, 0 } , +{ "Battle Chopper" ,"bchopper" , "mame", 1, 0 } , +{ "Battle Field (Japan)" ,"btlfield" , "mame", 3, 0 } , +{ "Battle Flip Shot" ,"flipshot" , "neomame", 3, 0 } , +{ "Battle Lane Vol. 5 (set 1)" ,"battlane" , "mame", 3, 0 } , +{ "Battle Lane Vol. 5 (set 2)" ,"battlan2" , "mame", 3, 0 } , +{ "Battle Lane Vol. 5 (set 3)" ,"battlan3" , "mame", 3, 0 } , +{ "Battle Rangers (World)" ,"battlera" , "mame", 3, 0 } , +{ "Battle Zone (set 1)" ,"bzone" , "mame", 3, 0 } , +{ "Battle Zone (set 2)" ,"bzone2" , "mame", 3, 0 } , +{ "Battle of Atlantis (set 1)" ,"atlantis" , "mame", 3, 0 } , +{ "Battle of Atlantis (set 2)" ,"atlants2" , "mame", 3, 0 } , +{ "Battle-Road, The" ,"battroad" , "mame", 3, 0 } , +{ "Bay Route (bootleg set 1)" ,"bayrtbl1" , "mame", 3, 0 } , +{ "Bay Route (bootleg set 2)" ,"bayrtbl2" , "mame", 3, 0 } , +{ "Bay Route (set 1)" ,"bayroute" , "mame", 3, 0 } , +{ "Bay Route (set 2)" ,"bayrouta" , "mame", 3, 0 } , +{ "Beastie Feastie" ,"beastf" , "mame", 1, 0 } , +{ "Bells & Whistles" ,"blswhstl" , "mame", 3, 0 } , +{ "Beraboh Man (Japan)" ,"berabohm" , "mame", 3, 0 } , +{ "Berlin Wall, The (set 1)" ,"berlwall" , "mame", 3, 0 } , +{ "Berlin Wall, The (set 2)" ,"berlwalt" , "mame", 3, 0 } , +{ "Bermuda Triangle (Japan)" ,"bermudaj" , "mame", 3, 0 } , +{ "Bermuda Triangle (US early version)" ,"bermudaa" , "mame", 3, 0 } , +{ "Bermuda Triangle (US)" ,"bermudat" , "mame", 3, 0 } , +{ "Berzerk (set 1)" ,"berzerk" , "mame", 3, 0 } , +{ "Berzerk (set 2)" ,"berzerk1" , "mame", 3, 0 } , +{ "Big Karnak" ,"bigkarnk" , "mame", 3, 0 } , +{ "Big Pro Wrestling!, The" ,"bigprowr" , "mame", 3, 0 } , +{ "Big Striker" ,"bigstrik" , "mame", 3, 0 } , +{ "Billiards, The" ,"billiard" , "mame", 3, 0 } , +{ "Bio Attack" ,"bioatack" , "mame", 3, 0 } , +{ "Biomechanical Toy (unprotected)" ,"biomtoy" , "mame", 3, 0 } , +{ "Bionic Commando (US set 1)" ,"bionicc" , "mame", 3, 0 } , +{ "Bionic Commando (US set 2)" ,"bionicc2" , "mame", 3, 0 } , +{ "Birdie King 2" ,"bking2" , "mame", 3, 0 } , +{ "Black Dragon (bootleg)" ,"blkdrgnb" , "mame", 3, 0 } , +{ "Black Dragon" ,"blkdrgon" , "mame", 3, 0 } , +{ "Black Hole" ,"blkhole" , "mame", 3, 0 } , +{ "Black Tiger (bootleg)" ,"bktigerb" , "mame", 3, 0 } , +{ "Black Tiger" ,"blktiger" , "mame", 3, 0 } , +{ "Black Widow" ,"bwidow" , "mame", 3, 0 } , +{ "Blade Master (World)" ,"bmaster" , "mame", 3, 0 } , +{ "Blades of Steel (version E)" ,"bladstle" , "mame", 3, 0 } , +{ "Blades of Steel (version T)" ,"bladestl" , "mame", 3, 0 } , +{ "Blandia [Prototype]" ,"blandia" , "mame", 3, 0 } , +{ "Blast Off (Japan)" ,"blastoff" , "mame", 3, 0 } , +{ "Blasted" ,"blasted" , "mame", 3, 0 } , +{ "Blaster" ,"blaster" , "mame", 3, 0 } , +{ "Blasteroids (version 2)" ,"blstroi2" , "mame", 3, 0 } , +{ "Blasteroids (version 4)" ,"blstroid" , "mame", 3, 0 } , +{ "Blasteroids (with heads)" ,"blsthead" , "mame", 3, 0 } , +{ "Blasto" ,"blasto" , "mame", 3, 0 } , +{ "Blazer (Japan)" ,"blazer" , "mame", 3, 0 } , +{ "Blazing Star" ,"blazstar" , "neomame", 3, 0 } , +{ "Block (Game Corporation bootleg)" ,"arkbloc2" , "mame", 3, 0 } , +{ "Block Block (Japan)" ,"blockj" , "mame", 1, 0 } , +{ "Block Block (World)" ,"block" , "mame", 1, 0 } , +{ "Block Block (bootleg)" ,"blockbl" , "mame", 1, 0 } , +{ "Block Gal (bootleg)" ,"blckgalb" , "mame", 3, 0 } , +{ "Block Gal" ,"blockgal" , "mame", 3, 0 } , +{ "Block Hole" ,"blockhl" , "mame", 3, 0 } , +{ "Block Out (set 1)" ,"blockout" , "mame", 3, 0 } , +{ "Block Out (set 2)" ,"blckout2" , "mame", 3, 0 } , +{ "Blockade" ,"blockade" , "mame", 3, 0 } , +{ "Blocken (Japan)" ,"blocken" , "mame", 3, 0 } , +{ "Blood Bros." ,"bloodbro" , "mame", 1, 0 } , +{ "Bloody Wolf (US)" ,"bldwolf" , "mame", 3, 0 } , +{ "Blue Print (Jaleco)" ,"blueprnj" , "mame", 3, 0 } , +{ "Blue Print (Midway)" ,"blueprnt" , "mame", 3, 0 } , +{ "Blue Shark" ,"blueshrk" , "mame", 3, 0 } , +{ "Blue's Journey / Raguy" ,"bjourney" , "neomame", 3, 0 } , +{ "Bobble Bobble" ,"boblbobl" , "mame", 3, 0 } , +{ "Body Slam" ,"bodyslam" , "mame", 1, 0 } , +{ "Bogey Manor" ,"bogeyman" , "mame", 3, 0 } , +{ "Bomb Bee" ,"bombbee" , "mame", 3, 0 } , +{ "Bomb Jack (set 1)" ,"bombjack" , "mame", 3, 0 } , +{ "Bomb Jack (set 2)" ,"bombjac2" , "mame", 3, 0 } , +{ "Bombjack Twin" ,"bjtwin" , "mame", 3, 0 } , +{ "Boot Camp" ,"bootcamp" , "mame", 3, 0 } , +{ "Boot Hill" ,"boothill" , "mame", 3, 0 } , +{ "Bosconian (Midway, new version)" ,"boscomd" , "mame", 3, 0 } , +{ "Bosconian (Midway, old version)" ,"boscomdo" , "mame", 3, 0 } , +{ "Bosconian (new version)" ,"bosco" , "mame", 3, 0 } , +{ "Bosconian (old version)" ,"boscoo" , "mame", 3, 0 } , +{ "Bosconian (older version)" ,"boscoo2" , "mame", 3, 0 } , +{ "Bottom of the Ninth (version N)" ,"bottom9n" , "mame", 3, 0 } , +{ "Bottom of the Ninth (version T)" ,"bottom9" , "mame", 3, 0 } , +{ "Boulder Dash / Boulder Dash Part 2 (World)" ,"bouldash" , "mame", 3, 0 } , +{ "Bowl-O-Rama" ,"bowlrama" , "mame", 3, 0 } , +{ "Boxing Bugs" ,"boxingb" , "mame", 3, 0 } , +{ "Brain" ,"brain" , "mame", 3, 0 } , +{ "Break Thru (US)" ,"brkthru" , "mame", 3, 0 } , +{ "Breakers Revenge" ,"breakrev" , "neomame", 3, 0 } , +{ "Breakers" ,"breakers" , "neomame", 3, 0 } , +{ "Breywood (Japan revision 2)" ,"breywood" , "mame", 3, 0 } , +{ "Brix" ,"brix" , "mame", 3, 0 } , +{ "Brute Force" ,"brutforc" , "mame", 1, 0 } , +{ "Bubble Bobble (US with mode select)" ,"bublbobr" , "mame", 3, 0 } , +{ "Bubble Bobble (US)" ,"bubbobr1" , "mame", 3, 0 } , +{ "Bubble Bobble" ,"bublbobl" , "mame", 3, 0 } , +{ "Bubbles (Solid Red label)" ,"bubblesr" , "mame", 3, 0 } , +{ "Bubbles" ,"bubbles" , "mame", 3, 0 } , +{ "Bump 'n' Jump" ,"bnj" , "mame", 3, 0 } , +{ "Burger Time (Data East set 1)" ,"btime" , "mame", 3, 0 } , +{ "Burger Time (Data East set 2)" ,"btime2" , "mame", 3, 0 } , +{ "Burger Time (Midway)" ,"btimem" , "mame", 3, 0 } , +{ "Burnin' Rubber" ,"brubber" , "mame", 3, 0 } , +{ "Burning Fight (set 1)" ,"burningf" , "neomame", 3, 0 } , +{ "Burning Fight (set 2)" ,"burningh" , "neomame", 3, 0 } , +{ "Burning Force (Japan)" ,"burnforc" , "mame", 3, 0 } , +{ "Buster Bros (US)" ,"bbros" , "mame", 1, 0 } , +{ "Butasan (Japan)" ,"butasan" , "mame", 1, 0 } , +{ "Cabal (US set 1)" ,"cabal" , "mame", 3, 0 } , +{ "Cabal (US set 2)" ,"cabal2" , "mame", 3, 0 } , +{ "Cabal (bootleg)" ,"cabalbl" , "mame", 3, 0 } , +{ "Cachat (Japan)" ,"cachat" , "mame", 3, 0 } , +{ "Cadillacs Kyouryuu-Shinseiki (Japan)" ,"dinoj" , "mame", 1, 0 } , +{ "Cadillacs and Dinosaurs (World)" ,"dino" , "mame", 1, 0 } , +{ "Caliber 50" ,"calibr50" , "mame", 3, 0 } , +{ "Calipso" ,"calipso" , "mame", 3, 0 } , +{ "Camel Try (Japan)" ,"cameltry" , "mame", 3, 0 } , +{ "Camel Try (US)" ,"cameltru" , "mame", 3, 0 } , +{ "Canyon Bomber (prototype)" ,"canbprot" , "mame", 3, 0 } , +{ "Canyon Bomber" ,"canyon" , "mame", 3, 0 } , +{ "Capcom Baseball (Japan)" ,"cbasebal" , "mame", 1, 0 } , +{ "Capcom Bowling (set 1)" ,"capbowl" , "mame", 3, 0 } , +{ "Capcom Bowling (set 2)" ,"capbowl2" , "mame", 3, 0 } , +{ "Capcom World (Japan)" ,"cworld" , "mame", 1, 0 } , +{ "Capcom World 2 (Japan)" ,"cworld2j" , "mame", 3, 0 } , +{ "Captain Commando (Japan)" ,"captcomj" , "mame", 3, 0 } , +{ "Captain Commando (US)" ,"captcomu" , "mame", 3, 0 } , +{ "Captain Commando (World)" ,"captcomm" , "mame", 3, 0 } , +{ "Captain Silver (Japan)" ,"csilver" , "mame", 3, 0 } , +{ "Car Action" ,"caractn" , "mame", 3, 0 } , +{ "Carnival (cocktail)" ,"carnvckt" , "mame", 3, 0 } , +{ "Carnival (upright)" ,"carnival" , "mame", 3, 0 } , +{ "Carrier Air Wing (World)" ,"cawing" , "mame", 3, 0 } , +{ "Caveman Ninja (US)" ,"cninjau" , "mame", 3, 0 } , +{ "Caveman Ninja (World revision 0)" ,"cninja0" , "mame", 3, 0 } , +{ "Caveman Ninja (World revision 3)" ,"cninja" , "mame", 3, 0 } , +{ "Centipede (bootleg set 1)" ,"centipdb" , "mame", 3, 0 } , +{ "Centipede (bootleg set 2)" ,"centipb2" , "mame", 3, 0 } , +{ "Centipede (revision 2)" ,"centipd2" , "mame", 3, 0 } , +{ "Centipede (revision 3)" ,"centiped" , "mame", 3, 0 } , +{ "Cerberus" ,"cerberus" , "mame", 1, 0 } , +{ "Challenger" ,"challeng" , "mame", 3, 0 } , +{ "Champion Baseball (Japan)" ,"champbbj" , "mame", 3, 0 } , +{ "Champion Baseball II" ,"champbb2" , "mame", 3, 0 } , +{ "Champion Baseball" ,"champbas" , "mame", 3, 0 } , +{ "Champion Wrestler (Japan)" ,"champwrj" , "mame", 1, 0 } , +{ "Champion Wrestler (US)" ,"champwru" , "mame", 1, 0 } , +{ "Champion Wrestler (World)" ,"champwr" , "mame", 1, 0 } , +{ "Championship Sprint" ,"csprint" , "mame", 3, 0 } , +{ "Changes" ,"changes" , "mame", 3, 0 } , +{ "Checkman (Japan)" ,"checkmaj" , "mame", 3, 0 } , +{ "Checkman" ,"checkman" , "mame", 3, 0 } , +{ "Checkmate" ,"checkmat" , "mame", 3, 0 } , +{ "Cheeky Mouse" ,"cheekyms" , "mame", 3, 0 } , +{ "Chelnov - Atomic Runner (Japan)" ,"chelnovj" , "mame", 3, 0 } , +{ "Chelnov - Atomic Runner (US)" ,"chelnov" , "mame", 3, 0 } , +{ "Cheyenne (version 1.0)" ,"cheyenne" , "mame", 3, 0 } , +{ "Chibi Marukochan Deluxe Quiz" ,"marukodq" , "neomame", 3, 0 } , +{ "Chicken Shift" ,"cshift" , "mame", 3, 0 } , +{ "Chiki Chiki Boys (Japan)" ,"chikij" , "mame", 3, 0 } , +{ "Chiller (version 3.0)" ,"chiller" , "mame", 3, 0 } , +{ "Chimera Beast" ,"chimerab" , "mame", 3, 0 } , +{ "Choplifter (alternate)" ,"chplftb" , "mame", 5, 0 } , +{ "Choplifter (bootleg)" ,"chplftbl" , "mame", 5, 0 } , +{ "Choplifter" ,"chplft" , "mame", 5, 0 } , +{ "Chopper I" ,"chopper" , "mame", 3, 0 } , +{ "Chuka Taisen (Japan)" ,"chukatai" , "mame", 3, 0 } , +{ "Circus Charlie (Centuri)" ,"circuscc" , "mame", 3, 0 } , +{ "Circus Charlie (Centuri, earlier)" ,"circusce" , "mame", 3, 0 } , +{ "Circus Charlie (no level select)" ,"circusc2" , "mame", 3, 0 } , +{ "Circus Charlie" ,"circusc" , "mame", 3, 0 } , +{ "Circus" ,"circus" , "mame", 3, 0 } , +{ "Cisco Heat" ,"cischeat" , "mame", 3, 0 } , +{ "City Connection (set 1)" ,"citycon" , "mame", 3, 0 } , +{ "City Connection (set 2)" ,"citycona" , "mame", 3, 0 } , +{ "Clay Pigeon (version 2.0)" ,"claypign" , "mame", 3, 0 } , +{ "Cloak & Dagger" ,"cloak" , "mame", 3, 0 } , +{ "Cloud 9 (prototype)" ,"cloud9" , "mame", 3, 0 } , +{ "Clowns" ,"clowns" , "mame", 3, 0 } , +{ "Cobra-Command (Japan)" ,"cobracmj" , "mame", 3, 0 } , +{ "Cobra-Command (World revision 5)" ,"cobracom" , "mame", 3, 0 } , +{ "Colony 7 (set 1)" ,"colony7" , "mame", 3, 0 } , +{ "Colony 7 (set 2)" ,"colony7a" , "mame", 3, 0 } , +{ "Combat (version 3.0)" ,"combat" , "mame", 3, 0 } , +{ "Combat School (Japan trackball)" ,"combascj" , "mame", 3, 0 } , +{ "Combat School (bootleg)" ,"combascb" , "mame", 3, 0 } , +{ "Combat School (joystick)" ,"combasc" , "mame", 3, 0 } , +{ "Combat School (trackball)" ,"combasct" , "mame", 3, 0 } , +{ "Combatribes, The (US)" ,"ctribe" , "mame", 3, 0 } , +{ "Combatribes, The (bootleg)" ,"ctribeb" , "mame", 3, 0 } , +{ "Commando (Sega)" ,"commsega" , "mame", 3, 0 } , +{ "Commando (US)" ,"commandu" , "mame", 5, 0 } , +{ "Commando (World)" ,"commando" , "mame", 5, 0 } , +{ "Comotion" ,"comotion" , "mame", 3, 0 } , +{ "Congo Bongo" ,"congo" , "mame", 3, 0 } , +{ "Contra (Japan bootleg)" ,"contrajb" , "mame", 3, 0 } , +{ "Contra (Japan)" ,"contraj" , "mame", 3, 0 } , +{ "Contra (US bootleg)" ,"contrab" , "mame", 3, 0 } , +{ "Contra (US)" ,"contra" , "mame", 3, 0 } , +{ "Cook Race" ,"cookrace" , "mame", 3, 0 } , +{ "Coors Light Bowling" ,"clbowl" , "mame", 3, 0 } , +{ "Cop 01 (set 1)" ,"cop01" , "mame", 5, 0 } , +{ "Cop 01 (set 2)" ,"cop01a" , "mame", 5, 0 } , +{ "Cops'n Robbers" ,"copsnrob" , "mame", 3, 0 } , +{ "Cosmic Alien (older)" ,"cosmica2" , "mame", 3, 0 } , +{ "Cosmic Alien" ,"cosmica" , "mame", 3, 0 } , +{ "Cosmic Avenger" ,"cavenger" , "mame", 3, 0 } , +{ "Cosmic Chasm (set 1)" ,"cchasm" , "mame", 1, 0 } , +{ "Cosmic Chasm (set 2)" ,"cchasm1" , "mame", 1, 0 } , +{ "Cosmic Guerilla" ,"cosmicg" , "mame", 3, 0 } , +{ "Cosmic Monsters" ,"cosmicmo" , "mame", 3, 0 } , +{ "Cosmo Gang the Video (Japan)" ,"cosmognj" , "mame", 3, 0 } , +{ "Cosmo Gang the Video (US)" ,"cosmogng" , "mame", 3, 0 } , +{ "Cotocoto Cottong" ,"cottong" , "mame", 3, 0 } , +{ "Crackshot (version 2.0)" ,"cracksht" , "mame", 3, 0 } , +{ "Crash" ,"crash" , "mame", 3, 0 } , +{ "Crater Raider" ,"crater" , "mame", 5, 0 } , +{ "Crazy Balloon (set 1)" ,"crbaloon" , "mame", 3, 0 } , +{ "Crazy Balloon (set 2)" ,"crbalon2" , "mame", 3, 0 } , +{ "Crazy Blocks" ,"crazyblk" , "mame", 3, 0 } , +{ "Crazy Climber (Japan)" ,"cclimbrj" , "mame", 1, 0 } , +{ "Crazy Climber (US)" ,"cclimber" , "mame", 1, 0 } , +{ "Crazy Climber (bootleg set 1)" ,"ccboot" , "mame", 1, 0 } , +{ "Crazy Climber (bootleg set 2)" ,"ccboot2" , "mame", 1, 0 } , +{ "Crazy Climber 2 (Japan)" ,"cclimbr2" , "mame", 3, 0 } , +{ "Crazy Cop (Japan)" ,"crazycop" , "mame", 3, 0 } , +{ "Crazy Kong (Alca bootleg)" ,"ckongalc" , "mame", 3, 0 } , +{ "Crazy Kong (Jeutel bootleg)" ,"ckongjeu" , "mame", 3, 0 } , +{ "Crazy Kong (Orca bootleg)" ,"ckongo" , "mame", 3, 0 } , +{ "Crazy Kong (Scramble hardware)" ,"ckongs" , "mame", 3, 0 } , +{ "Crazy Kong (set 1)" ,"ckong" , "mame", 3, 0 } , +{ "Crazy Kong (set 2)" ,"ckonga" , "mame", 3, 0 } , +{ "Crime City (Japan)" ,"crimecj" , "mame", 3, 0 } , +{ "Crime City (US)" ,"crimecu" , "mame", 3, 0 } , +{ "Crime City (World)" ,"crimec" , "mame", 3, 0 } , +{ "Crime Fighters (Japan 2 Players)" ,"crimfgtj" , "mame", 3, 0 } , +{ "Crime Fighters (US 4 players)" ,"crimfght" , "mame", 3, 0 } , +{ "Crime Fighters (World 2 Players)" ,"crimfgt2" , "mame", 3, 0 } , +{ "Crime Fighters 2 (Japan)" ,"vendettj" , "mame", 3, 0 } , +{ "Crossbow (version 2.0)" ,"crossbow" , "mame", 3, 0 } , +{ "Crossed Swords" ,"crsword" , "neomame", 3, 0 } , +{ "Crude Buster (Japan)" ,"cbusterj" , "mame", 3, 0 } , +{ "Crude Buster (World FU version)" ,"cbusterw" , "mame", 3, 0 } , +{ "Crude Buster (World FX version)" ,"cbuster" , "mame", 3, 0 } , +{ "Cruisin" ,"cruisin" , "mame", 3, 0 } , +{ "Crush Roller (Kural - bootleg?)" ,"crush3" , "mame", 1, 0 } , +{ "Crush Roller (Kural Esco - bootleg?)" ,"crush2" , "mame", 1, 0 } , +{ "Crush Roller (Kural Samno)" ,"crush" , "mame", 1, 0 } , +{ "Crystal Castles (set 1)" ,"ccastles" , "mame", 3, 0 } , +{ "Crystal Castles (set 2)" ,"ccastle2" , "mame", 3, 0 } , +{ "Cuby Bop" ,"cubybop" , "mame", 3, 0 } , +{ "Cuebrick" ,"cuebrick" , "mame", 3, 0 } , +{ "Curve Ball" ,"curvebal" , "mame", 3, 0 } , +{ "Cutie Q" ,"cutieq" , "mame", 3, 0 } , +{ "Cybattler" ,"cybattlr" , "mame", 3, 0 } , +{ "Cyber-Lip" ,"cyberlip" , "neomame", 3, 0 } , +{ "Cyberball (Version 2)" ,"cyberba2" , "mame", 3, 0 } , +{ "Cyberball (Version 4)" ,"cyberbal" , "mame", 3, 0 } , +{ "Cyberball 2072 (2 player)" ,"cyberb2p" , "mame", 3, 0 } , +{ "D-Con" ,"dcon" , "mame", 1, 0 } , +{ "D-Day (Centuri)" ,"ddayc" , "mame", 3, 0 } , +{ "D-Day" ,"dday" , "mame", 3, 0 } , +{ "Dai Makai-Mura (Japan)" ,"ghoulsj" , "mame", 3, 0 } , +{ "Dai Ressya Goutou (Japan)" ,"dairesya" , "mame", 3, 0 } , +{ "Daiku no Gensan (Japan)" ,"dkgensan" , "mame", 1, 0 } , +{ "DakkoChan Jansoh" ,"dakkochn" , "mame", 3, 0 } , +{ "Dangar - Ufo Robo (12/1/1986)" ,"dangar" , "mame", 3, 0 } , +{ "Dangar - Ufo Robo (9/26/1986)" ,"dangar2" , "mame", 3, 0 } , +{ "Dangar - Ufo Robo (bootleg)" ,"dangarb" , "mame", 3, 0 } , +{ "Danger Zone" ,"dangerz" , "mame", 3, 0 } , +{ "Dangerous Seed (Japan)" ,"dangseed" , "mame", 3, 0 } , +{ "Dangun Feveron (Japan)" ,"dfeveron" , "mame", 3, 0 } , +{ "Danny Sullivan's Indy Heat" ,"indyheat" , "mame", 3, 0 } , +{ "Dark Adventure" ,"darkadv" , "mame", 3, 0 } , +{ "Dark Planet" ,"darkplnt" , "mame", 3, 0 } , +{ "Dark Seal (Japan)" ,"darkseaj" , "mame", 3, 0 } , +{ "Dark Seal (World revision 1)" ,"darksea1" , "mame", 3, 0 } , +{ "Dark Seal (World revision 3)" ,"darkseal" , "mame", 3, 0 } , +{ "Darwin 4078 (Japan)" ,"darwin" , "mame", 3, 0 } , +{ "Datsugoku - Prisoners of War (Japan)" ,"powj" , "mame", 3, 0 } , +{ "Datsun 280 Zzzap" ,"280zzzap" , "mame", 3, 0 } , +{ "Dead Connection (Japan)" ,"deadconj" , "mame", 3, 0 } , +{ "Dead Connection (World)" ,"deadconx" , "mame", 3, 0 } , +{ "Dead Eye" ,"deadeye" , "mame", 3, 0 } , +{ "Defence Command" ,"defence" , "mame", 3, 0 } , +{ "Defend the Terra Attack on the Red UFO (bootleg)" ,"redufo" , "mame", 3, 0 } , +{ "Defender (Green label)" ,"defendg" , "mame", 3, 0 } , +{ "Defender (Red label)" ,"defender" , "mame", 3, 0 } , +{ "Defender (White label)" ,"defendw" , "mame", 3, 0 } , +{ "Defense Command (set 1)" ,"defcmnd" , "mame", 3, 0 } , +{ "Demolition Derby (2-Player Mono Board Version)" ,"destderm" , "mame", 1, 0 } , +{ "Demolition Derby" ,"destderb" , "mame", 1, 0 } , +{ "Demon" ,"demon" , "mame", 3, 0 } , +{ "Demon's World / Horror Story" ,"demonwld" , "mame", 3, 0 } , +{ "Depthcharge" ,"depthch" , "mame", 3, 0 } , +{ "Desert Gun" ,"desertgu" , "mame", 3, 0 } , +{ "Destination Earth" ,"desterth" , "mame", 3, 0 } , +{ "Detana!! Twin Bee (Japan)" ,"detatwin" , "mame", 3, 0 } , +{ "Devastators (version V)" ,"devstor3" , "mame", 3, 0 } , +{ "Devastators (version X)" ,"devstor2" , "mame", 3, 0 } , +{ "Devastators (version Z)" ,"devstors" , "mame", 3, 0 } , +{ "Devil Fish (Galaxian hardware, bootleg?)" ,"devilfsg" , "mame", 3, 0 } , +{ "Devil Fish" ,"devilfsh" , "mame", 3, 0 } , +{ "Devil World" ,"devilw" , "mame", 3, 0 } , +{ "Devil Zone" ,"devzone" , "mame", 3, 0 } , +{ "Diamond Run" ,"diamond" , "mame", 3, 0 } , +{ "Dig Dug (Atari)" ,"digdugat" , "mame", 3, 0 } , +{ "Dig Dug (set 1)" ,"digdug" , "mame", 3, 0 } , +{ "Dig Dug (set 2)" ,"digdugb" , "mame", 3, 0 } , +{ "Dig Dug II (set 1)" ,"digdug2" , "mame", 3, 0 } , +{ "Dig Dug II (set 2)" ,"digdug2a" , "mame", 3, 0 } , +{ "Digger" ,"digger" , "mame", 3, 0 } , +{ "Dino Rex (Japan)" ,"dinorexj" , "mame", 3, 0 } , +{ "Dino Rex (US)" ,"dinorexu" , "mame", 3, 0 } , +{ "Dino Rex (World)" ,"dinorex" , "mame", 3, 0 } , +{ "Disco No.1" ,"disco" , "mame", 3, 0 } , +{ "Discs of Tron (Environmental)" ,"dotrone" , "mame", 5, 0 } , +{ "Discs of Tron (Upright)" ,"dotron" , "mame", 5, 0 } , +{ "Do! Run Run (Do's Castle hardware)" ,"dorunruc" , "mame", 1, 0 } , +{ "Do! Run Run (set 1)" ,"dorunrun" , "mame", 1, 0 } , +{ "Do! Run Run (set 2)" ,"dorunru2" , "mame", 1, 0 } , +{ "Dodonpachi (Japan)" ,"ddonpach" , "mame", 3, 0 } , +{ "Dog Fight" ,"dogfight" , "mame", 1, 0 } , +{ "Dog Patch" ,"dogpatch" , "mame", 3, 0 } , +{ "Dogou Souken" ,"dogosoke" , "mame", 3, 0 } , +{ "Dogyuun" ,"dogyuun" , "mame", 3, 0 } , +{ "Dokaben (Japan)" ,"dokaben" , "mame", 1, 0 } , +{ "Domino Man" ,"domino" , "mame", 5, 0 } , +{ "Dominos" ,"dominos" , "mame", 3, 0 } , +{ "Don Doko Don (Japan)" ,"dondokod" , "mame", 3, 0 } , +{ "Donkey Kong (Japan set 1)" ,"dkongjp" , "mame", 1, 0 } , +{ "Donkey Kong (Japan set 2)" ,"dkongjpo" , "mame", 1, 0 } , +{ "Donkey Kong (US)" ,"dkong" , "mame", 1, 0 } , +{ "Donkey Kong 3 (Japan)" ,"dkong3j" , "mame", 1, 0 } , +{ "Donkey Kong 3 (US)" ,"dkong3" , "mame", 1, 0 } , +{ "Donkey Kong Jr. (Original Japanese)" ,"dkngjrjp" , "mame", 1, 0 } , +{ "Donkey Kong Junior (Japan)" ,"dkjrjp" , "mame", 1, 0 } , +{ "Donkey Kong Junior (US)" ,"dkongjr" , "mame", 1, 0 } , +{ "Donkey Kong Junior (bootleg?)" ,"dkjrbl" , "mame", 1, 0 } , +{ "Dottori Kun (new version)" ,"dotrikun" , "mame", 1, 0 } , +{ "Dottori Kun (old version)" ,"dotriku2" , "mame", 1, 0 } , +{ "Double Dragon (Japan)" ,"ddragon" , "mame", 3, 0 } , +{ "Double Dragon (Neo-Geo)" ,"doubledr" , "neomame", 3, 0 } , +{ "Double Dragon (US)" ,"ddragonu" , "mame", 3, 0 } , +{ "Double Dragon (bootleg)" ,"ddragonb" , "mame", 3, 0 } , +{ "Double Dragon 3 - The Rosetta Stone (bootleg)" ,"ddrago3b" , "mame", 3, 0 } , +{ "Double Dragon 3 - The Rosetta Stone" ,"ddragon3" , "mame", 3, 0 } , +{ "Double Dragon II - The Revenge" ,"ddragon2" , "mame", 3, 0 } , +{ "Double Dribble" ,"ddribble" , "mame", 3, 0 } , +{ "Double Dynamites, The" ,"dbldyn" , "mame", 3, 0 } , +{ "Double Play" ,"dplay" , "mame", 3, 0 } , +{ "DownTown" ,"downtown" , "mame", 3, 0 } , +{ "Dr. Toppel's Tankentai (Japan)" ,"drtoppel" , "mame", 3, 0 } , +{ "Dragon Breed" ,"dbreed" , "mame", 1, 0 } , +{ "Dragon Buster" ,"drgnbstr" , "mame", 3, 0 } , +{ "Dragon Saber (Japan)" ,"dsaberj" , "mame", 3, 0 } , +{ "Dragon Saber" ,"dsaber" , "mame", 3, 0 } , +{ "Dragon Spirit (new version)" ,"dspirit" , "mame", 3, 0 } , +{ "Dragon Spirit (old version)" ,"dspirito" , "mame", 3, 0 } , +{ "Dragon Unit / Castle of Dragon" ,"drgnunit" , "mame", 3, 0 } , +{ "Dragonninja (Japan)" ,"drgninja" , "mame", 3, 0 } , +{ "Dream Shopper" ,"dremshpr" , "mame", 3, 0 } , +{ "Dream Soccer '94" ,"dsoccr94" , "mame", 3, 0 } , +{ "Drift Out (Japan)" ,"driftout" , "mame", 1, 0 } , +{ "Drive Out" ,"driveout" , "mame", 1, 0 } , +{ "Dump Matsumoto (Japan)" ,"dumpmtmt" , "mame", 1, 0 } , +{ "Dyger (set 1)" ,"dyger" , "mame", 3, 0 } , +{ "Dyger (set 2)" ,"dygera" , "mame", 3, 0 } , +{ "Dynamite Duke" ,"dynduke" , "mame", 3, 0 } , +{ "Dynamite Dux (bootleg)" ,"dduxbl" , "mame", 3, 0 } , +{ "E-Swat (bootleg)" ,"eswatbl" , "mame", 1, 0 } , +{ "E-Swat" ,"eswat" , "mame", 1, 0 } , +{ "ESP Ra.De. (Japan)" ,"esprade" , "mame", 3, 0 } , +{ "Eagle (set 1)" ,"eagle" , "mame", 3, 0 } , +{ "Eagle (set 2)" ,"eagle2" , "mame", 3, 0 } , +{ "Earth Defense Force" ,"edf" , "mame", 3, 0 } , +{ "Eggs" ,"eggs" , "mame", 3, 0 } , +{ "Eight Man" ,"eightman" , "neomame", 3, 0 } , +{ "Electric Yo-Yo, The (set 1)" ,"elecyoyo" , "mame", 3, 0 } , +{ "Electric Yo-Yo, The (set 2)" ,"elecyoy2" , "mame", 3, 0 } , +{ "Elevator Action (bootleg)" ,"elevatob" , "mame", 5, 0 } , +{ "Elevator Action" ,"elevator" , "mame", 5, 0 } , +{ "Eliminator (2 Players, set 1)" ,"elim2" , "mame", 1, 0 } , +{ "Eliminator (2 Players, set 2)" ,"elim2a" , "mame", 1, 0 } , +{ "Eliminator (4 Players)" ,"elim4" , "mame", 1, 0 } , +{ "Empire City: 1931 (Japan)" ,"empcityj" , "mame", 5, 0 } , +{ "Empire City: 1931 (bootleg?)" ,"empcity" , "mame", 5, 0 } , +{ "Empire Strikes Back, The" ,"esb" , "mame", 3, 0 } , +{ "End, The (Stern)" ,"theends" , "mame", 3, 0 } , +{ "End, The" ,"theend" , "mame", 3, 0 } , +{ "Enduro Racer (bootleg set 1)" ,"endurobl" , "mame", 3, 0 } , +{ "Enduro Racer (bootleg set 2)" ,"endurob2" , "mame", 3, 0 } , +{ "Enduro Racer" ,"enduror" , "mame", 3, 0 } , +{ "Escape from the Planet of the Robot Monsters (set 1)" ,"eprom" , "mame", 0, 0 } , +{ "Escape from the Planet of the Robot Monsters (set 2)" ,"eprom2" , "mame", 0, 0 } , +{ "Espial (Europe)" ,"espiale" , "mame", 3, 0 } , +{ "Espial (US?)" ,"espial" , "mame", 3, 0 } , +{ "Euro Champ '92 (World)" ,"euroch92" , "mame", 3, 0 } , +{ "Euro League" ,"wc90b" , "mame", 3, 0 } , +{ "Exciting Hour" ,"excthour" , "mame", 3, 0 } , +{ "Exciting Soccer (alternate music)" ,"exctscca" , "mame", 3, 0 } , +{ "Exciting Soccer (bootleg)" ,"exctsccb" , "mame", 3, 0 } , +{ "Exciting Soccer II" ,"exctscc2" , "mame", 3, 0 } , +{ "Exciting Soccer" ,"exctsccr" , "mame", 3, 0 } , +{ "Exed Exes" ,"exedexes" , "mame", 1, 0 } , +{ "Exerion (Taito)" ,"exeriont" , "mame", 3, 0 } , +{ "Exerion (bootleg)" ,"exerionb" , "mame", 3, 0 } , +{ "Exerion" ,"exerion" , "mame", 3, 0 } , +{ "Exerizer (Japan) (bootleg)" ,"exerizrb" , "mame", 3, 0 } , +{ "Exodus (bootleg?)" ,"exodus" , "mame", 3, 0 } , +{ "Express Raider (US)" ,"exprraid" , "mame", 3, 0 } , +{ "Extermination (US)" ,"extrmatn" , "mame", 3, 0 } , +{ "Exterminator" ,"exterm" , "mame", 3, 0 } , +{ "Extra Bases" ,"ebases" , "mame", 1, 0 } , +{ "Extra Innings" ,"einnings" , "mame", 3, 0 } , +{ "Eyes (Digitrex Techstar)" ,"eyes" , "mame", 3, 0 } , +{ "Eyes (Techstar Inc.)" ,"eyes2" , "mame", 3, 0 } , +{ "F-1 Dream (bootleg)" ,"f1dreamb" , "mame", 3, 0 } , +{ "F-1 Dream" ,"f1dream" , "mame", 3, 0 } , +{ "F1 Grand Prix Star" ,"f1gpstar" , "mame", 3, 0 } , +{ "Face Off (Japan)" ,"faceoff" , "mame", 3, 0 } , +{ "Fairyland Story, The" ,"flstory" , "mame", 3, 0 } , +{ "Fairyland Story, The (Japan)" ,"flstoryj" , "mame", 3, 0 } , +{ "Fantasy (Japan)" ,"fantasyj" , "mame", 3, 0 } , +{ "Fantasy (US)" ,"fantasy" , "mame", 3, 0 } , +{ "Fantasy Zone (Japan New Ver.)" ,"fantzone" , "mame", 3, 0 } , +{ "Fantasy Zone (Old Ver.)" ,"fantzono" , "mame", 3, 0 } , +{ "Fantazia" ,"fantazia" , "mame", 3, 0 } , +{ "Far West" ,"farwest" , "mame", 3, 0 } , +{ "Fast Freddie" ,"fastfred" , "mame", 3, 0 } , +{ "Fast Lane" ,"fastlane" , "mame", 3, 0 } , +{ "Faster, Harder, More Challenging Q*bert (prototype)" ,"sqbert" , "mame", 3, 0 } , +{ "Fatal Fury - King of Fighters / Garou Densetsu - shukumei no tatakai" ,"fatfury1" , "neomame", 3, 0 } , +{ "Fatal Fury 2 / Garou Densetsu 2 - arata-naru tatakai" ,"fatfury2" , "neomame", 3, 0 } , +{ "Fatal Fury 3 - Road to the Final Victory / Garou Densetsu 3 - haruka-naru tatakai" ,"fatfury3" , "neomame", 3, 0 } , +{ "Fatal Fury Special / Garou Densetsu Special" ,"fatfursp" , "neomame", 3, 0 } , +{ "Fax" ,"fax" , "mame", 3, 0 } , +{ "Fight Fever / Crystal Legacy" ,"fightfev" , "neomame", 3, 0 } , +{ "Fighting Fantasy (Japan)" ,"ffantasy" , "mame", 3, 0 } , +{ "Fighting Golf" ,"fitegolf" , "mame", 3, 0 } , +{ "Fighting Hawk (Japan)" ,"fhawk" , "mame", 3, 0 } , +{ "Fighting Soccer" ,"ftsoccer" , "mame", 5, 0 } , +{ "Final Blow (Japan)" ,"finalbj" , "mame", 3, 0 } , +{ "Final Blow (World)" ,"finalb" , "mame", 3, 0 } , +{ "Final Fight (Japan)" ,"ffightj" , "mame", 3, 0 } , +{ "Final Fight (US)" ,"ffightu" , "mame", 3, 0 } , +{ "Final Fight (World)" ,"ffight" , "mame", 3, 0 } , +{ "Final Round" ,"fround" , "mame", 3, 0 } , +{ "Final Star Force (US)" ,"fstarfrc" , "mame", 3, 0 } , +{ "Finalizer - Super Transformation (bootleg)" ,"finalizb" , "mame", 3, 0 } , +{ "Finalizer - Super Transformation" ,"finalizr" , "mame", 3, 0 } , +{ "Finest Hour (Japan)" ,"finehour" , "mame", 3, 0 } , +{ "Fire One" ,"fireone" , "mame", 3, 0 } , +{ "Fire Shark" ,"fireshrk" , "mame", 3, 0 } , +{ "Fire Trap (Japan bootleg)" ,"firetpbl" , "mame", 3, 0 } , +{ "Fire Trap" ,"firetrap" , "mame", 3, 0 } , +{ "Fire Truck" ,"firetrk" , "mame", 3, 0 } , +{ "Fitter" ,"fitter" , "mame", 3, 0 } , +{ "Flak Attack (Japan)" ,"flkatck" , "mame", 3, 0 } , +{ "Flash Gal" ,"flashgal" , "mame", 3, 0 } , +{ "Flash Point (bootleg)" ,"fpointbl" , "mame", 3, 0 } , +{ "Flash Point" ,"fpoint" , "mame", 3, 0 } , +{ "Flicky (set 1)" ,"flicky" , "mame", 5, 0 } , +{ "Flicky (set 2)" ,"flicky2" , "mame", 5, 0 } , +{ "Fly-Boy (bootleg)" ,"flyboyb" , "mame", 3, 0 } , +{ "Fly-Boy" ,"flyboy" , "mame", 3, 0 } , +{ "Flying Shark (World)" ,"fshark" , "mame", 3, 0 } , +{ "Flying Shark (bootleg)" ,"fsharkbt" , "mame", 3, 0 } , +{ "Food Fight" ,"foodf" , "mame", 3, 0 } , +{ "Football Champ (World)" ,"footchmp" , "mame", 3, 0 } , +{ "Football Frenzy" ,"fbfrenzy" , "neomame", 3, 0 } , +{ "Forgotten Worlds (US)" ,"forgottn" , "mame", 3, 0 } , +{ "Formation Z" ,"formatz" , "mame", 3, 0 } , +{ "Freeze" ,"freeze" , "mame", 3, 0 } , +{ "Frenzy" ,"frenzy" , "mame", 3, 0 } , +{ "Frisky Tom" ,"friskyt" , "mame", 3, 0 } , +{ "Frog" ,"froggers" , "mame", 3, 0 } , +{ "Frogger (Sega set 1)" ,"frogseg1" , "mame", 3, 0 } , +{ "Frogger (Sega set 2)" ,"frogseg2" , "mame", 3, 0 } , +{ "Frogger (modified Moon Cresta hardware)" ,"froggrmc" , "mame", 3, 0 } , +{ "Frogger" ,"frogger" , "mame", 3, 0 } , +{ "Frogs" ,"frogs" , "mame", 3, 0 } , +{ "Front Line" ,"frontlin" , "mame", 3, 0 } , +{ "Funky Bee" ,"funkybee" , "mame", 3, 0 } , +{ "Funky Fish" ,"fnkyfish" , "mame", 3, 0 } , +{ "Funny Mouse (bootleg?)" ,"suprmou2" , "mame", 3, 0 } , +{ "Future Spy" ,"futspy" , "mame", 1, 0 } , +{ "Galactic Warriors" ,"gwarrior" , "mame", 3, 0 } , +{ "Galaga '84" ,"galaga84" , "mame", 3, 0 } , +{ "Galaga '88 (Japan)" ,"galag88j" , "mame", 3, 0 } , +{ "Galaga '88 (set 1)" ,"galaga88" , "mame", 3, 0 } , +{ "Galaga '88 (set 2)" ,"galag88b" , "mame", 3, 0 } , +{ "Galaga (Midway)" ,"galagamw" , "mame", 3, 0 } , +{ "Galaga (Namco)" ,"galaga" , "mame", 3, 0 } , +{ "Galaga (bootleg)" ,"galagab2" , "mame", 3, 0 } , +{ "Galaga (fast shoot)" ,"galagads" , "mame", 3, 0 } , +{ "Galaga 3 (set 1)" ,"galaga3" , "mame", 3, 0 } , +{ "Galaga 3 (set 2)" ,"galaga3a" , "mame", 3, 0 } , +{ "Galaxian (Midway)" ,"galmidw" , "mame", 3, 0 } , +{ "Galaxian (Namco)" ,"galaxian" , "mame", 3, 0 } , +{ "Galaxian (bootleg)" ,"galaxb" , "mame", 3, 0 } , +{ "Galaxian Part 4" ,"galap4" , "mame", 3, 0 } , +{ "Galaxian Part X" ,"galapx" , "mame", 3, 0 } , +{ "Galaxian Turbo" ,"galturbo" , "mame", 3, 0 } , +{ "Galaxy Fight - Universal Warriors" ,"galaxyfg" , "neomame", 3, 0 } , +{ "Galaxy Rescue" ,"grescue" , "mame", 3, 0 } , +{ "Galaxy Wars" ,"galxwars" , "mame", 3, 0 } , +{ "Galivan - Cosmo Police (12/11/1985)" ,"galivan2" , "mame", 3, 0 } , +{ "Galivan - Cosmo Police (12/16/1985)" ,"galivan" , "mame", 3, 0 } , +{ "Gallag" ,"gallag" , "mame", 3, 0 } , +{ "Gallop - Armed police Unit (Japan)" ,"gallop" , "mame", 3, 0 } , +{ "Gals Panic" ,"galpanic" , "mame", 3, 0 } , +{ "Ganbare Ginkun" ,"ginkun" , "mame", 3, 0 } , +{ "Gang Busters" ,"gbusters" , "mame", 3, 0 } , +{ "Gang Wars (US)" ,"gangwars" , "mame", 3, 0 } , +{ "Gang Wars (bootleg)" ,"gangwarb" , "mame", 3, 0 } , +{ "Gaplus (set 1)" ,"gaplus" , "mame", 3, 0 } , +{ "Gaplus (set 2)" ,"gaplusa" , "mame", 3, 0 } , +{ "Gardia (bootleg)" ,"gardiab" , "mame", 1, 0 } , +{ "Gardia" ,"gardia" , "mame", 1, 0 } , +{ "Garuka (Japan)" ,"garuka" , "mame", 3, 0 } , +{ "Garyo Retsuden (Japan)" ,"garyoret" , "mame", 3, 0 } , +{ "Gate of Doom (US revision 1)" ,"gatedom1" , "mame", 3, 0 } , +{ "Gate of Doom (US revision 4)" ,"gatedoom" , "mame", 3, 0 } , +{ "Gauntlet (2 Players)" ,"gaunt2p" , "mame", 3, 0 } , +{ "Gauntlet (Intermediate Release 1)" ,"gauntir1" , "mame", 3, 0 } , +{ "Gauntlet (Intermediate Release 2)" ,"gauntir2" , "mame", 3, 0 } , +{ "Gauntlet II" ,"gaunt2" , "mame", 3, 0 } , +{ "Gauntlet" ,"gauntlet" , "mame", 3, 0 } , +{ "Gee Bee (Gremlin)" ,"geebeeg" , "mame", 3, 0 } , +{ "Gee Bee" ,"geebee" , "mame", 3, 0 } , +{ "Gemini Wing" ,"gemini" , "mame", 3, 0 } , +{ "Genpei ToumaDen" ,"genpeitd" , "mame", 3, 0 } , +{ "Genshi-Tou 1930's" ,"gensitou" , "mame", 3, 0 } , +{ "Get Star (Japan)" ,"getstarj" , "mame", 3, 0 } , +{ "Get Star (bootleg)" ,"getstarb" , "mame", 3, 0 } , +{ "Ghost Pilots" ,"gpilots" , "neomame", 3, 0 } , +{ "Ghosts'n Goblins (US)" ,"gngt" , "mame", 3, 0 } , +{ "Ghosts'n Goblins (World? set 1)" ,"gng" , "mame", 3, 0 } , +{ "Ghosts'n Goblins (World? set 2)" ,"gnga" , "mame", 3, 0 } , +{ "Ghouls'n Ghosts (US)" ,"ghoulsu" , "mame", 3, 0 } , +{ "Ghouls'n Ghosts (World)" ,"ghouls" , "mame", 3, 0 } , +{ "Ghox" ,"ghox" , "mame", 3, 0 } , +{ "Gimme A Break" ,"gimeabrk" , "mame", 3, 0 } , +{ "Ginga NinkyouDen" ,"ginganin" , "mame", 3, 0 } , +{ "Gingateikoku No Gyakushu" ,"gteikoku" , "mame", 3, 0 } , +{ "Gladiator (US)" ,"gladiatr" , "mame", 3, 0 } , +{ "Glob, The" ,"theglob" , "mame", 1, 0 } , +{ "Go Go Mr. Yamaguchi / Yuke Yuke Yamaguchi-kun" ,"yamagchi" , "mame", 3, 0 } , +{ "Goal! Goal! Goal!" ,"goalx3" , "neomame", 3, 0 } , +{ "Goalie Ghost" ,"gghost" , "mame", 3, 0 } , +{ "Goindol" ,"goindol" , "mame", 3, 0 } , +{ "Gold Medalist" ,"goldmedl" , "mame", 3, 0 } , +{ "Golden Axe (Version 1)" ,"goldnaxe" , "mame", 1, 0 } , +{ "Golden Axe (Version 1, Japan)" ,"goldnaxj" , "mame", 1, 0 } , +{ "Golden Axe (Version 2 317-0110)" ,"goldnaxb" , "mame", 1, 0 } , +{ "Golden Axe (Version 2 317-0122)" ,"goldnaxc" , "mame", 1, 0 } , +{ "Golden Axe (Version 2)" ,"goldnaxa" , "mame", 1, 0 } , +{ "Golden Axe (bootleg)" ,"goldnabl" , "mame", 1, 0 } , +{ "Gondomania (US)" ,"gondo" , "mame", 3, 0 } , +{ "Gorf (Program 1)" ,"gorfpgm1" , "mame", 1, 0 } , +{ "Gorf" ,"gorf" , "mame", 1, 0 } , +{ "Got-Ya (12/24/1981, prototype?)" ,"gotya" , "mame", 3, 0 } , +{ "Gradius II - Gofer no Yabou (Japan set 1)" ,"gradius2" , "mame", 3, 0 } , +{ "Gradius II - Gofer no Yabou (Japan set 2)" ,"grdius2a" , "mame", 3, 0 } , +{ "Gradius II - Gofer no Yabou (Japan set 3)" ,"grdius2b" , "mame", 3, 0 } , +{ "Gradius III (Asia)" ,"grdius3a" , "mame", 3, 0 } , +{ "Gradius III (Japan)" ,"gradius3" , "mame", 3, 0 } , +{ "Gradius" ,"gradius" , "mame", 3, 0 } , +{ "Gravitar (version 2)" ,"gravitr2" , "mame", 3, 0 } , +{ "Gravitar (version 3)" ,"gravitar" , "mame", 3, 0 } , +{ "Great 1000 Miles Rally (Evolution Model)" ,"gtmre" , "mame", 3, 0 } , +{ "Great 1000 Miles Rally" ,"gtmr" , "mame", 3, 0 } , +{ "Great Swordsman" ,"gsword" , "mame", 3, 0 } , +{ "Green Beret (bootleg)" ,"gberetb" , "mame", 3, 0 } , +{ "Green Beret" ,"gberet" , "mame", 3, 0 } , +{ "Gridiron Fight" ,"gridiron" , "mame", 3, 0 } , +{ "Grind Stormer (Korea)" ,"grindstm" , "mame", 3, 0 } , +{ "Grobda (New version)" ,"grobda" , "mame", 3, 0 } , +{ "Grobda (Old version set 1)" ,"grobda2" , "mame", 3, 0 } , +{ "Grobda (Old version set 2)" ,"grobda3" , "mame", 3, 0 } , +{ "Growl (US)" ,"growlu" , "mame", 3, 0 } , +{ "Growl (World)" ,"growl" , "mame", 3, 0 } , +{ "Gryzor" ,"gryzor" , "mame", 3, 0 } , +{ "Guardian (US)" ,"getstar" , "mame", 3, 0 } , +{ "Guerrilla War (US)" ,"gwar" , "mame", 3, 0 } , +{ "Guerrilla War (Version 1)" ,"gwara" , "mame", 3, 0 } , +{ "Guerrilla War (bootleg)" ,"gwarb" , "mame", 3, 0 } , +{ "Guevara (Japan)" ,"gwarj" , "mame", 3, 0 } , +{ "Guided Missile" ,"gmissile" , "mame", 3, 0 } , +{ "Gun & Frontier (World)" ,"gunfront" , "mame", 3, 0 } , +{ "Gun Bird (Japan)" ,"gunbird" , "mame", 3, 0 } , +{ "Gun Dealer (set 1)" ,"gundealr" , "mame", 1, 0 } , +{ "Gun Dealer (set 2)" ,"gundeala" , "mame", 1, 0 } , +{ "Gun Fight" ,"gunfight" , "mame", 3, 0 } , +{ "Gun Frontier (Japan)" ,"gunfronj" , "mame", 3, 0 } , +{ "Gun Hohki (Japan)" ,"gunhohki" , "mame", 3, 0 } , +{ "Gun.Smoke (Japan)" ,"gunsmokj" , "mame", 3, 0 } , +{ "Gun.Smoke (US set 1)" ,"gunsmrom" , "mame", 3, 0 } , +{ "Gun.Smoke (US set 2)" ,"gunsmoka" , "mame", 3, 0 } , +{ "Gun.Smoke (World)" ,"gunsmoke" , "mame", 3, 0 } , +{ "Gunforce - Battle Fire Engulfed Terror Island (US)" ,"gunforcu" , "mame", 3, 0 } , +{ "Gunforce - Battle Fire Engulfed Terror Island (World)" ,"gunforce" , "mame", 3, 0 } , +{ "Gururin" ,"gururin" , "neomame", 3, 0 } , +{ "Guttang Gottong" ,"gutangtn" , "mame", 3, 0 } , +{ "Guzzler" ,"guzzler" , "mame", 3, 0 } , +{ "Gypsy Juggler" ,"gypsyjug" , "mame", 3, 0 } , +{ "Gyrodine" ,"gyrodine" , "mame", 3, 0 } , +{ "Gyruss (Centuri)" ,"gyrussce" , "mame", 3, 0 } , +{ "Gyruss (Konami)" ,"gyruss" , "mame", 3, 0 } , +{ "HAL21 (Japan)" ,"hal21j" , "mame", 3, 0 } , +{ "HAL21" ,"hal21" , "mame", 3, 0 } , +{ "Hachoo!" ,"hachoo" , "mame", 3, 0 } , +{ "Hammerin' Harry (US)" ,"hharryu" , "mame", 1, 0 } , +{ "Hammerin' Harry (World)" ,"hharry" , "mame", 1, 0 } , +{ "Hana Awase (Flower Matching)" ,"hanaawas" , "mame", 3, 0 } , +{ "Hang-On" ,"hangon" , "mame", 3, 0 } , +{ "Hangly-Man (set 1)" ,"hangly" , "mame", 3, 0 } , +{ "Hangly-Man (set 2)" ,"hangly2" , "mame", 3, 0 } , +{ "Hard Hat" ,"hardhat" , "mame", 3, 0 } , +{ "Hard Head" ,"hardhead" , "mame", 3, 0 } , +{ "Hard Head (Bootleg)" ,"hardhedb" , "mame", 3, 0 } , +{ "Hard Puncher (Japan)" ,"hpuncher" , "mame", 3, 0 } , +{ "Hat Trick Hero (Japan)" ,"hthero" , "mame", 3, 0 } , +{ "Hat Trick" ,"hattrick" , "mame", 3, 0 } , +{ "Hatris (Japan)" ,"hatris" , "mame", 1, 0 } , +{ "Haunted Castle (set 1)" ,"hcastle" , "mame", 3, 0 } , +{ "Haunted Castle (set 2)" ,"hcastlea" , "mame", 3, 0 } , +{ "Head On (1 player)" ,"headonb" , "mame", 3, 0 } , +{ "Head On (2 players)" ,"headon" , "mame", 3, 0 } , +{ "Head On 2" ,"headon2" , "mame", 3, 0 } , +{ "Heavy Barrel (US)" ,"hbarrel" , "mame", 3, 0 } , +{ "Heavy Barrel (World)" ,"hbarrelw" , "mame", 3, 0 } , +{ "Heavy Metal" ,"hvymetal" , "mame", 5, 0 } , +{ "Heavyweight Champ" ,"hwchamp" , "mame", 1, 0 } , +{ "Hebereke no Popoon (Japan)" ,"heberpop" , "mame", 3, 0 } , +{ "Heiankyo Alien" ,"heiankyo" , "mame", 3, 0 } , +{ "HeliFire (revision A)" ,"helifira" , "mame", 3, 0 } , +{ "HeliFire (revision B)" ,"helifire" , "mame", 3, 0 } , +{ "Hellfire" ,"hellfire" , "mame", 3, 0 } , +{ "Herbie at the Olympics (DK conversion)" ,"herbiedk" , "mame", 3, 0 } , +{ "Hexa" ,"hexa" , "mame", 3, 0 } , +{ "High Impact Football (rev LA3 12/27/90)" ,"hiimpact" , "mame", 3, 0 } , +{ "High Way Race" ,"hwrace" , "mame", 3, 0 } , +{ "Hippodrome (US)" ,"hippodrm" , "mame", 3, 0 } , +{ "Hishou Zame (Japan)" ,"hishouza" , "mame", 3, 0 } , +{ "Hit 'n Miss (version 2.0)" ,"hitnmis2" , "mame", 3, 0 } , +{ "Hit 'n Miss (version 3.0)" ,"hitnmiss" , "mame", 3, 0 } , +{ "Hit the Ice (US)" ,"hitice" , "mame", 3, 0 } , +{ "Hoccer (set 1)" ,"hoccer" , "mame", 3, 0 } , +{ "Hoccer (set 2)" ,"hoccer2" , "mame", 3, 0 } , +{ "Homo" ,"homo" , "mame", 3, 0 } , +{ "Hook (US)" ,"hooku" , "mame", 3, 0 } , +{ "Hook (World)" ,"hook" , "mame", 3, 0 } , +{ "Hopper Robo" ,"hopprobo" , "mame", 3, 0 } , +{ "Hopping Mappy" ,"hopmappy" , "mame", 3, 0 } , +{ "Hot Chase" ,"hotchase" , "mame", 3, 0 } , +{ "Hot Shocker" ,"hotshock" , "mame", 3, 0 } , +{ "Hunchback (Donkey Kong conversion)" ,"hunchbkd" , "mame", 3, 0 } , +{ "Hunchback (Scramble hardware)" ,"hunchbks" , "mame", 3, 0 } , +{ "Hustle" ,"hustle" , "mame", 3, 0 } , +{ "Hustler, The (Japan version J)" ,"thehustj" , "mame", 3, 0 } , +{ "Hustler, The (Japan version M)" ,"thehustl" , "mame", 3, 0 } , +{ "Hydra (prototype)" ,"hydrap" , "mame", 3, 0 } , +{ "Hydra" ,"hydra" , "mame", 3, 0 } , +{ "Hyper Olympic (bootleg)" ,"hyprolyb" , "mame", 3, 0 } , +{ "Hyper Olympic" ,"hyprolym" , "mame", 3, 0 } , +{ "Hyper Olympics '84" ,"hpolym84" , "mame", 3, 0 } , +{ "Hyper Sports Special (Japan)" ,"hypsptsp" , "mame", 3, 0 } , +{ "Hyper Sports" ,"hyperspt" , "mame", 3, 0 } , +{ "I'm Sorry (Japan)" ,"imsorryj" , "mame", 5, 0 } , +{ "I'm Sorry (US)" ,"imsorry" , "mame", 5, 0 } , +{ "I, Robot" ,"irobot" , "mame", 3, 0 } , +{ "Iga Ninjyutsuden (Japan)" ,"iganinju" , "mame", 0, 0 } , +{ "Ikari III - The Rescue" ,"ikari3" , "mame", 3, 0 } , +{ "Ikari Warriors (Japan bootleg)" ,"ikarijpb" , "mame", 3, 0 } , +{ "Ikari Warriors (Japan)" ,"ikarijp" , "mame", 3, 0 } , +{ "Ikari Warriors (US)" ,"ikari" , "mame", 3, 0 } , +{ "Image Fight (Japan)" ,"imgfight" , "mame", 1, 0 } , +{ "In The Hunt (US)" ,"inthuntu" , "mame", 3, 0 } , +{ "In The Hunt (World)" ,"inthunt" , "mame", 3, 0 } , +{ "Indiana Jones and the Temple of Doom (set 1)" ,"indytemp" , "mame", 0, 0 } , +{ "Indiana Jones and the Temple of Doom (set 2)" ,"indytem2" , "mame", 0, 0 } , +{ "Indiana Jones and the Temple of Doom (set 3)" ,"indytem3" , "mame", 0, 0 } , +{ "Indiana Jones and the Temple of Doom (set 4)" ,"indytem4" , "mame", 0, 0 } , +{ "Inferno" ,"inferno" , "mame", 3, 0 } , +{ "Insector (prototype)" ,"insector" , "mame", 3, 0 } , +{ "Insector X (World)" ,"insectx" , "mame", 1, 0 } , +{ "Intrepid (set 1)" ,"intrepid" , "mame", 3, 0 } , +{ "Intrepid (set 2)" ,"intrepi2" , "mame", 3, 0 } , +{ "Invader's Revenge (Dutchford)" ,"invrvnga" , "mame", 3, 0 } , +{ "Invader's Revenge" ,"invrvnge" , "mame", 3, 0 } , +{ "Invinco / Deep Scan" ,"invds" , "mame", 3, 0 } , +{ "Invinco / Head On 2" ,"invho2" , "mame", 3, 0 } , +{ "Invinco" ,"invinco" , "mame", 3, 0 } , +{ "Irem Skins Game, The (US set 1)" ,"skingame" , "mame", 3, 0 } , +{ "Irem Skins Game, The (US set 2)" ,"skingam2" , "mame", 3, 0 } , +{ "Iron Horse" ,"ironhors" , "mame", 3, 0 } , +{ "Ironman Stewart's Super Off-Road Track Pack" ,"offroadt" , "mame", 3, 0 } , +{ "Ironman Stewart's Super Off-Road" ,"offroad" , "mame", 3, 0 } , +{ "Irritating Maze / Ultra Denryu Iraira Bou, The" ,"irrmaze" , "neomame", 3, 0 } , +{ "Jack Rabbit (set 1)" ,"jackrabt" , "mame", 3, 0 } , +{ "Jack Rabbit (set 2)" ,"jackrab2" , "mame", 3, 0 } , +{ "Jack Rabbit (special)" ,"jackrabs" , "mame", 3, 0 } , +{ "Jack the Giantkiller (set 1)" ,"jack" , "mame", 3, 0 } , +{ "Jack the Giantkiller (set 2)" ,"jack2" , "mame", 3, 0 } , +{ "Jack the Giantkiller (set 3)" ,"jack3" , "mame", 3, 0 } , +{ "Jackal (World)" ,"jackal" , "mame", 3, 0 } , +{ "Jackson" ,"zaxxonb" , "mame", 1, 0 } , +{ "Jail Break" ,"jailbrek" , "mame", 3, 0 } , +{ "Jatre Specter" ,"jspecter" , "mame", 3, 0 } , +{ "Joe & Mac (Japan)" ,"joemac" , "mame", 3, 0 } , +{ "John Elway's Team Quarterback (set 2)" ,"teamqb2" , "mame", 3, 0 } , +{ "John Elway's Team Quarterback" ,"teamqb" , "mame", 3, 0 } , +{ "Journey" ,"journey" , "mame", 1, 0 } , +{ "Joust (Solid Red label)" ,"joustr" , "mame", 3, 0 } , +{ "Joust (White/Green label)" ,"joust" , "mame", 3, 0 } , +{ "Joust (White/Red label)" ,"joustwr" , "mame", 3, 0 } , +{ "Joust 2 - Survival of the Fittest (set 1)" ,"joust2" , "mame", 3, 0 } , +{ "Joyful Road (US)" ,"joyfulr" , "mame", 3, 0 } , +{ "Jr. Pac-Man" ,"jrpacman" , "mame", 3, 0 } , +{ "Jump Bug (bootleg)" ,"jumpbugb" , "mame", 3, 0 } , +{ "Jump Bug" ,"jumpbug" , "mame", 3, 0 } , +{ "Jump Coaster" ,"jumpcoas" , "mame", 3, 0 } , +{ "Jump Shot" ,"jumpshot" , "mame", 1, 0 } , +{ "Jumping Jack" ,"jjack" , "mame", 1, 0 } , +{ "Jumping" ,"jumping" , "mame", 3, 0 } , +{ "Jungle Hunt (US)" ,"jungleh" , "mame", 3, 0 } , +{ "Jungle King (Japan)" ,"junglek" , "mame", 3, 0 } , +{ "Jungle King (Japan, earlier)" ,"junglkj2" , "mame", 3, 0 } , +{ "Jungler (Stern)" ,"junglers" , "mame", 3, 0 } , +{ "Jungler" ,"jungler" , "mame", 3, 0 } , +{ "Juno First (Gottlieb)" ,"junofstg" , "mame", 3, 0 } , +{ "Juno First" ,"junofrst" , "mame", 3, 0 } , +{ "Jyanshin Densetsu - Quest of Jongmaster" ,"janshin" , "neomame", 3, 0 } , +{ "Jyuohki (Japan)" ,"jyuohki" , "mame", 1, 0 } , +{ "Kabuki Klash - Far East of Eden / Tengai Makyou Shinden - Far East of Eden" ,"kabukikl" , "neomame", 3, 0 } , +{ "Kageki (Japan)" ,"kagekij" , "mame", 3, 0 } , +{ "Kageki (US)" ,"kageki" , "mame", 3, 0 } , +{ "Kaiketsu Yanchamaru (Japan)" ,"yanchamr" , "mame", 3, 0 } , +{ "Kaitei Daisensou (Japan)" ,"kaiteids" , "mame", 3, 0 } , +{ "Kaitei Takara Sagashi (Namco)" ,"kaitein" , "mame", 3, 0 } , +{ "Kaitei Takara Sagashi" ,"kaitei" , "mame", 3, 0 } , +{ "Kamikaze" ,"kamikaze" , "mame", 3, 0 } , +{ "Kangaroo (Atari)" ,"kangaroa" , "mame", 3, 0 } , +{ "Kangaroo (bootleg)" ,"kangarob" , "mame", 3, 0 } , +{ "Kangaroo" ,"kangaroo" , "mame", 3, 0 } , +{ "Kaos" ,"kaos" , "mame", 3, 0 } , +{ "Karate Blazers (US)" ,"karatblu" , "mame", 1, 0 } , +{ "Karate Blazers (World?)" ,"karatblz" , "mame", 1, 0 } , +{ "Karate Champ (US VS version)" ,"kchampvs" , "mame", 3, 0 } , +{ "Karate Champ (US)" ,"kchamp" , "mame", 3, 0 } , +{ "Karate Dou (Japan)" ,"karatedo" , "mame", 3, 0 } , +{ "Karian Cross" ,"karianx" , "mame", 3, 0 } , +{ "Karnov (Japan)" ,"karnovj" , "mame", 3, 0 } , +{ "Karnov (US)" ,"karnov" , "mame", 3, 0 } , +{ "Karnov's Revenge / Fighter's History Dynamite" ,"karnovr" , "neomame", 3, 0 } , +{ "KiKi KaiKai" ,"kikikai" , "mame", 1, 0 } , +{ "Kick (cocktail)" ,"kicka" , "mame", 5, 0 } , +{ "Kick (upright)" ,"kick" , "mame", 5, 0 } , +{ "Kick Off (Japan)" ,"kickoff" , "mame", 3, 0 } , +{ "Kick Rider" ,"kickridr" , "mame", 1, 0 } , +{ "Kick Start Wheelie King" ,"kikstart" , "mame", 1, 0 } , +{ "Kick and Run" ,"kicknrun" , "mame", 1, 0 } , +{ "Kicker" ,"kicker" , "mame", 3, 0 } , +{ "Kid Niki - Radical Ninja (US)" ,"kidniki" , "mame", 3, 0 } , +{ "Killer Comet" ,"killcom" , "mame", 3, 0 } , +{ "King & Balloon (Japan)" ,"kingbalj" , "mame", 3, 0 } , +{ "King & Balloon (US)" ,"kingball" , "mame", 3, 0 } , +{ "King of Boxer (English)" ,"kingofb" , "mame", 3, 0 } , +{ "King of Dragons, The (Japan)" ,"kodj" , "mame", 3, 0 } , +{ "King of Dragons, The (World)" ,"kod" , "mame", 3, 0 } , +{ "King of Dragons, The (bootleg)" ,"kodb" , "mame", 3, 0 } , +{ "King of Fighters '94, The" ,"kof94" , "neomame", 3, 0 } , +{ "King of Fighters '95, The" ,"kof95" , "neomame", 3, 0 } , +{ "King of Fighters '96, The" ,"kof96" , "neomame", 3, 0 } , +{ "King of Fighters '97, The" ,"kof97" , "neomame", 3, 0 } , +{ "King of Fighters '98 - The Slugfest / King of Fighters '98 - dream match never ends, The" ,"kof98" , "neomame", 3, 0 } , +{ "King of the Monsters 2 - The Next Thing" ,"kotm2" , "neomame", 3, 0 } , +{ "King of the Monsters" ,"kotm" , "neomame", 3, 0 } , +{ "Kizuna Encounter - Super Tag Battle / Fu'un Super Tag Battle" ,"kizuna" , "neomame", 3, 0 } , +{ "Klax (Japan)" ,"klaxj" , "mame", 3, 0 } , +{ "Klax (set 1)" ,"klax" , "mame", 3, 0 } , +{ "Klax (set 2)" ,"klax2" , "mame", 3, 0 } , +{ "Klax (set 3)" ,"klax3" , "mame", 3, 0 } , +{ "Knights of the Round (Japan)" ,"knightsj" , "mame", 3, 0 } , +{ "Knights of the Round (World)" ,"knights" , "mame", 3, 0 } , +{ "Knock Out !!" ,"knockout" , "mame", 3, 0 } , +{ "Knuckle Bash" ,"kbash" , "mame", 3, 0 } , +{ "Knuckle Joe (set 1)" ,"kncljoe" , "mame", 3, 0 } , +{ "Knuckle Joe (set 2)" ,"kncljoea" , "mame", 3, 0 } , +{ "Kodure Ookami (Japan)" ,"kodure" , "mame", 3, 0 } , +{ "Koi no Hotrock (Japan)" ,"rockragj" , "mame", 3, 0 } , +{ "Konami '88" ,"konami88" , "mame", 3, 0 } , +{ "Konami GT" ,"konamigt" , "mame", 3, 0 } , +{ "Konami RF2 - Red Fighter" ,"rf2" , "mame", 3, 0 } , +{ "Koukuu Kihei Monogatari - The Legend of Air Cavalry" ,"legofair" , "mame", 3, 0 } , +{ "Kozmik Kroozr" ,"kroozr" , "mame", 1, 0 } , +{ "Kram (set 1)" ,"kram" , "mame", 3, 0 } , +{ "Kram (set 2)" ,"kram2" , "mame", 3, 0 } , +{ "Krull" ,"krull" , "mame", 3, 0 } , +{ "Kuhga - Operation Code 'Vapor Trail' (Japan revision 3)" ,"kuhga" , "mame", 3, 0 } , +{ "Kung Fu Master (Data East)" ,"kungfud" , "mame", 3, 0 } , +{ "Kung Fu Master (bootleg set 1)" ,"kungfub" , "mame", 3, 0 } , +{ "Kung Fu Master (bootleg set 2)" ,"kungfub2" , "mame", 3, 0 } , +{ "Kung Fu Master" ,"kungfum" , "mame", 3, 0 } , +{ "Kuri Kinton (World)" ,"kurikint" , "mame", 3, 0 } , +{ "Kuri Kinton (prototype?)" ,"kurikina" , "mame", 3, 0 } , +{ "Kyohkoh-Toppa (Japan)" ,"brkthruj" , "mame", 3, 0 } , +{ "Kyros" ,"kyros" , "mame", 3, 0 } , +{ "Kyukyoku Tiger (Japan)" ,"ktiger" , "mame", 3, 0 } , +{ "Kyuukai Douchuuki (Japan new version)" ,"kyukaidk" , "mame", 3, 0 } , +{ "Kyuukai Douchuuki (Japan old version)" ,"kyukaido" , "mame", 3, 0 } , +{ "Labyrinth Runner (Japan)" ,"labyrunr" , "mame", 3, 0 } , +{ "Lady Bug (bootleg)" ,"ladybugb" , "mame", 3, 0 } , +{ "Lady Bug" ,"ladybug" , "mame", 3, 0 } , +{ "Laguna Racer" ,"lagunar" , "mame", 3, 0 } , +{ "Land Sea Air Squad / Riku Kai Kuu Saizensen" ,"lsasquad" , "mame", 3, 0 } , +{ "Laser" ,"laser" , "mame", 3, 0 } , +{ "Lasso" ,"lasso" , "mame", 3, 0 } , +{ "Last Blade / Bakumatsu Roman - Gekkano Kenshi, The" ,"lastblad" , "neomame", 3, 0 } , +{ "Last Blade 2 / Bakumatsu Roman - Dai Ni Maku Gekkano Kenshi, The" ,"lastbld2" , "neomame", 3, 0 } , +{ "Last Duel (US set 1)" ,"lastduel" , "mame", 3, 0 } , +{ "Last Duel (US set 2)" ,"lstduela" , "mame", 3, 0 } , +{ "Last Duel (bootleg)" ,"lstduelb" , "mame", 3, 0 } , +{ "Last Mission (US revision 5)" ,"lastmss2" , "mame", 3, 0 } , +{ "Last Mission (US revision 6)" ,"lastmiss" , "mame", 3, 0 } , +{ "Last Resort" ,"lresort" , "neomame", 3, 0 } , +{ "Lazer Command" ,"lazercmd" , "mame", 3, 0 } , +{ "Le Bagnard" ,"bagnard" , "mame", 3, 0 } , +{ "League Bowling" ,"lbowling" , "neomame", 3, 0 } , +{ "Led Storm (US)" ,"ledstorm" , "mame", 3, 0 } , +{ "Legend of Hero Tonma" ,"loht" , "mame", 1, 0 } , +{ "Legend of Kage, The (bootleg set 1)" ,"lkageb" , "mame", 3, 0 } , +{ "Legend of Kage, The (bootleg set 2)" ,"lkageb2" , "mame", 3, 0 } , +{ "Legend of Kage, The (bootleg set 3)" ,"lkageb3" , "mame", 3, 0 } , +{ "Legend of Kage, The" ,"lkage" , "mame", 3, 0 } , +{ "Legend of Makai (World)" ,"lomakai" , "mame", 3, 0 } , +{ "Legend of Success Joe / Ashitano Joe Densetsu" ,"legendos" , "neomame", 3, 0 } , +{ "Legend of the Valkyrie (Japan)" ,"valkyrie" , "mame", 3, 0 } , +{ "Legendary Wings (US set 1)" ,"lwings" , "mame", 5, 0 } , +{ "Legendary Wings (US set 2)" ,"lwings2" , "mame", 5, 0 } , +{ "Leprechaun" ,"leprechn" , "mame", 3, 0 } , +{ "Lethal Thunder (World)" ,"lethalth" , "mame", 3, 0 } , +{ "Levers" ,"levers" , "mame", 3, 0 } , +{ "Liberator (set 1)" ,"liberatr" , "mame", 3, 0 } , +{ "Lifeforce (Japan)" ,"lifefrcj" , "mame", 3, 0 } , +{ "Lifeforce (US)" ,"lifefrce" , "mame", 3, 0 } , +{ "Lightning Fighters (US)" ,"lgtnfght" , "mame", 3, 0 } , +{ "Liquid Kids (US)" ,"liquidku" , "mame", 3, 0 } , +{ "Liquid Kids (World)" ,"liquidk" , "mame", 3, 0 } , +{ "Lizard Wizard" ,"lizwiz" , "mame", 3, 0 } , +{ "Lock'n'Chase" ,"lnc" , "mame", 3, 0 } , +{ "Loco-Motion" ,"locomotn" , "mame", 3, 0 } , +{ "Lode Runner (set 1)" ,"ldrun" , "mame", 3, 0 } , +{ "Lode Runner (set 2)" ,"ldruna" , "mame", 3, 0 } , +{ "Lode Runner II - The Bungeling Strikes Back" ,"ldrun2" , "mame", 3, 0 } , +{ "Lode Runner III - Majin No Fukkatsu" ,"ldrun3" , "mame", 3, 0 } , +{ "Lode Runner IV - Teikoku Karano Dasshutsu" ,"ldrun4" , "mame", 3, 0 } , +{ "Logic Pro" ,"logicpro" , "mame", 3, 0 } , +{ "Logic Pro 2 (Japan)" ,"logicpr2" , "mame", 3, 0 } , +{ "Looper" ,"looper" , "mame", 3, 0 } , +{ "Lord of King, The (Japan)" ,"lordofk" , "mame", 3, 0 } , +{ "Lost Tomb (easy)" ,"losttomb" , "mame", 3, 0 } , +{ "Lost Tomb (hard)" ,"losttmbh" , "mame", 3, 0 } , +{ "Lost Worlds (Japan)" ,"lostwrld" , "mame", 3, 0 } , +{ "Lot Lot" ,"lotlot" , "mame", 3, 0 } , +{ "Lunar Lander (rev 1)" ,"llander1" , "mame", 3, 0 } , +{ "Lunar Lander (rev 2)" ,"llander" , "mame", 3, 0 } , +{ "Lunar Rescue" ,"lrescue" , "mame", 3, 0 } , +{ "Lupin III" ,"lupin3" , "mame", 3, 0 } , +{ "M-4" ,"m4" , "mame", 3, 0 } , +{ "M.A.C.H. 3" ,"mach3" , "mame", 3, 0 } , +{ "M79 Ambush" ,"m79amb" , "mame", 3, 0 } , +{ "MX5000" ,"mx5000" , "mame", 3, 0 } , +{ "Macho Mouse" ,"machomou" , "mame", 3, 0 } , +{ "Mad Crasher" ,"madcrash" , "mame", 3, 0 } , +{ "Mad Gear (Japan)" ,"madgearj" , "mame", 3, 0 } , +{ "Mad Gear (US)" ,"madgear" , "mame", 3, 0 } , +{ "Mad Motor" ,"madmotor" , "mame", 3, 0 } , +{ "Mad Planets" ,"mplanets" , "mame", 3, 0 } , +{ "Magic Brush" ,"mbrush" , "mame", 3, 0 } , +{ "Magic Sword (Japan)" ,"mswordj" , "mame", 3, 0 } , +{ "Magic Sword - Heroic Fantasy (US)" ,"mswordu" , "mame", 3, 0 } , +{ "Magic Sword - Heroic Fantasy (World)" ,"msword" , "mame", 3, 0 } , +{ "Magical Drop II" ,"magdrop2" , "neomame", 3, 0 } , +{ "Magical Drop III" ,"magdrop3" , "neomame", 3, 0 } , +{ "Magical Spot II" ,"magspot2" , "mame", 3, 0 } , +{ "Magician Lord (set 1)" ,"maglord" , "neomame", 3, 0 } , +{ "Magician Lord (set 2)" ,"maglordh" , "neomame", 3, 0 } , +{ "Magix" ,"magix" , "mame", 3, 0 } , +{ "Mahjong Gakuen 2 Gakuen-chou no Fukushuu" ,"mgakuen2" , "mame", 1, 0 } , +{ "Mahjong Gakuen" ,"mgakuen" , "mame", 3, 0 } , +{ "Mahjong Kyoretsuden" ,"mahretsu" , "neomame", 3, 0 } , +{ "Mahjong Quest (Japan)" ,"mjnquest" , "mame", 3, 0 } , +{ "Mahjong Quest (No Nudity)" ,"mjnquesb" , "mame", 3, 0 } , +{ "Mahou Daisakusen (Japan)" ,"mahoudai" , "mame", 3, 0 } , +{ "Main Event, The (version F)" ,"mainevt2" , "mame", 3, 0 } , +{ "Main Event, The (version Y)" ,"mainevt" , "mame", 3, 0 } , +{ "Majestic Twelve - The Space Invaders Part IV (Japan)" ,"majest12" , "mame", 3, 0 } , +{ "Major Havoc (Return to Vax)" ,"mhavocrv" , "mame", 3, 0 } , +{ "Major Havoc (prototype)" ,"mhavocp" , "mame", 3, 0 } , +{ "Major Havoc (rev 2)" ,"mhavoc2" , "mame", 3, 0 } , +{ "Major Havoc (rev 3)" ,"mhavoc" , "mame", 3, 0 } , +{ "Major League" ,"mjleague" , "mame", 1, 0 } , +{ "Major Title (Japan)" ,"majtitle" , "mame", 1, 0 } , +{ "Major Title 2 (World)" ,"majtitl2" , "mame", 3, 0 } , +{ "Majuu no Ohkoku" ,"majuu" , "mame", 3, 0 } , +{ "Makai Densetsu (Japan)" ,"makaiden" , "mame", 3, 0 } , +{ "Makai-Mura (Revision C)" ,"makaimuc" , "mame", 3, 0 } , +{ "Makai-Mura (Revision G)" ,"makaimug" , "mame", 3, 0 } , +{ "Makai-Mura" ,"makaimur" , "mame", 3, 0 } , +{ "Make Trax" ,"maketrax" , "mame", 1, 0 } , +{ "Makyou Senshi (Japan)" ,"makyosen" , "mame", 3, 0 } , +{ "Mania Challenge (set 1)" ,"maniach" , "mame", 3, 0 } , +{ "Mania Challenge (set 2)" ,"maniach2" , "mame", 3, 0 } , +{ "Mappy (Japan)" ,"mappyjp" , "mame", 3, 0 } , +{ "Mappy (US)" ,"mappy" , "mame", 3, 0 } , +{ "Marble Madness (set 1)" ,"marble" , "mame", 3, 0 } , +{ "Marble Madness (set 2)" ,"marble2" , "mame", 3, 0 } , +{ "Marble Madness (set 3)" ,"marblea" , "mame", 3, 0 } , +{ "Marchen Maze (Japan)" ,"mmaze" , "mame", 3, 0 } , +{ "Marine Boy" ,"marineb" , "mame", 3, 0 } , +{ "Mariner" ,"mariner" , "mame", 3, 0 } , +{ "Mario Bros. (Japan)" ,"mariojp" , "mame", 3, 0 } , +{ "Mario Bros. (US)" ,"mario" , "mame", 3, 0 } , +{ "Mars" ,"mars" , "mame", 3, 0 } , +{ "Marvel Land (Japan)" ,"marvlanj" , "mame", 3, 0 } , +{ "Marvel Land (US)" ,"marvland" , "mame", 3, 0 } , +{ "Marvin's Maze" ,"marvins" , "mame", 3, 0 } , +{ "Masao" ,"masao" , "mame", 3, 0 } , +{ "Master of Weapon (World)" ,"masterw" , "mame", 3, 0 } , +{ "Mat Mania" ,"matmania" , "mame", 3, 0 } , +{ "Max RPM" ,"maxrpm" , "mame", 1, 0 } , +{ "Mayday (set 1)" ,"mayday" , "mame", 3, 0 } , +{ "Mayday (set 2)" ,"maydaya" , "mame", 3, 0 } , +{ "Mayhem 2002" ,"mayhem" , "mame", 3, 0 } , +{ "Meadows Lanes" ,"medlanes" , "mame", 3, 0 } , +{ "Mega Force" ,"megaforc" , "mame", 1, 0 } , +{ "Mega Man - The Power Battle (Asia)" ,"megaman" , "mame", 3, 0 } , +{ "Mega Twins (World)" ,"mtwins" , "mame", 3, 0 } , +{ "Mega Zone (Kosuka)" ,"megaznik" , "mame", 3, 0 } , +{ "Mega Zone" ,"megazone" , "mame", 3, 0 } , +{ "MegaTack" ,"megatack" , "mame", 3, 0 } , +{ "Meikyu Jima (Japan)" ,"kikcubic" , "mame", 1, 0 } , +{ "Meikyuu Hunter G (Japan)" ,"meikyuh" , "mame", 3, 0 } , +{ "Mercs (US)" ,"mercsu" , "mame", 3, 0 } , +{ "Mercs (World)" ,"mercs" , "mame", 3, 0 } , +{ "Mermaid" ,"mermaid" , "mame", 3, 0 } , +{ "Meta Fox" ,"metafox" , "mame", 3, 0 } , +{ "Metal Slug - Super Vehicle-001" ,"mslug" , "neomame", 3, 0 } , +{ "Metal Slug 2 - Super Vehicle-001/II" ,"mslug2" , "neomame", 3, 0 } , +{ "Meteoroids" ,"meteor" , "mame", 3, 0 } , +{ "Metro-Cross" ,"metrocrs" , "mame", 3, 0 } , +{ "Mexico 86" ,"mexico86" , "mame", 1, 0 } , +{ "Midnight Resistance (Japan)" ,"midresj" , "mame", 3, 0 } , +{ "Midnight Resistance (US)" ,"midresu" , "mame", 3, 0 } , +{ "Midnight Resistance (World)" ,"midres" , "mame", 3, 0 } , +{ "Mikie (High School Graffiti)" ,"mikiehs" , "mame", 3, 0 } , +{ "Mikie" ,"mikie" , "mame", 3, 0 } , +{ "Millipede" ,"milliped" , "mame", 3, 0 } , +{ "Minefield" ,"minefld" , "mame", 3, 0 } , +{ "Mini Golf (set 1)" ,"minigolf" , "mame", 3, 0 } , +{ "Mini Golf (set 2)" ,"minigol2" , "mame", 3, 0 } , +{ "Minivader" ,"minivadr" , "mame", 3, 0 } , +{ "Minky Monkey" ,"mmonkey" , "mame", 3, 0 } , +{ "Minnasanno Okagesamadesu" ,"minasan" , "neomame", 3, 0 } , +{ "Mirai Ninja (Japan)" ,"mirninja" , "mame", 3, 0 } , +{ "Missile Command (set 1)" ,"missile" , "mame", 3, 0 } , +{ "Missile Command (set 2)" ,"missile2" , "mame", 3, 0 } , +{ "Missing in Action (Japan)" ,"miaj" , "mame", 3, 0 } , +{ "Missing in Action (version S)" ,"mia2" , "mame", 3, 0 } , +{ "Missing in Action (version T)" ,"mia" , "mame", 3, 0 } , +{ "Mister Viking (Japan)" ,"mrvikinj" , "mame", 5, 0 } , +{ "Mister Viking" ,"mrviking" , "mame", 5, 0 } , +{ "Mizubaku Daibouken (Japan)" ,"mizubaku" , "mame", 3, 0 } , +{ "Moguchan" ,"moguchan" , "mame", 1, 0 } , +{ "Mole Attack" ,"mole" , "mame", 3, 0 } , +{ "Momoko 120%" ,"momoko" , "mame", 3, 0 } , +{ "Money Money" ,"monymony" , "mame", 3, 0 } , +{ "Money Puzzle Exchanger / Money Idol Exchanger" ,"miexchng" , "neomame", 3, 0 } , +{ "Monkey Donkey" ,"monkeyd" , "mame", 3, 0 } , +{ "Monster Bash" ,"monsterb" , "mame", 1, 0 } , +{ "Moon Alien Part 2 (older version)" ,"moonal2b" , "mame", 3, 0 } , +{ "Moon Alien Part 2" ,"moonal2" , "mame", 3, 0 } , +{ "Moon Base" ,"moonbase" , "mame", 3, 0 } , +{ "Moon Cresta (Gremlin)" ,"mooncrsg" , "mame", 3, 0 } , +{ "Moon Cresta (Nichibutsu)" ,"mooncrst" , "mame", 3, 0 } , +{ "Moon Cresta (bootleg on Galaxian hardware)" ,"mooncrgx" , "mame", 3, 0 } , +{ "Moon Cresta (bootleg set 1)" ,"mooncrsb" , "mame", 3, 0 } , +{ "Moon Cresta (bootleg set 2)" ,"mooncrs2" , "mame", 3, 0 } , +{ "Moon Patrol (Williams)" ,"mpatrolw" , "mame", 3, 0 } , +{ "Moon Patrol" ,"mpatrol" , "mame", 3, 0 } , +{ "Moon Quasar" ,"moonqsr" , "mame", 1, 0 } , +{ "Moon Ranger" ,"mranger" , "mame", 3, 0 } , +{ "Moon Walker (Set 1)" ,"moonwalk" , "mame", 1, 0 } , +{ "Moon Walker (Set 2)" ,"moonwlka" , "mame", 1, 0 } , +{ "Moon Walker (bootleg)" ,"moonwlkb" , "mame", 1, 0 } , +{ "Moon War II (set 1)" ,"moonwar2" , "mame", 3, 0 } , +{ "Moon War II (set 2)" ,"monwar2a" , "mame", 3, 0 } , +{ "Mortal Kombat (rev 1.0 08/08/92)" ,"mkla1" , "mame", 3, 0 } , +{ "Mortal Kombat (rev 2.0 08/18/92)" ,"mkla2" , "mame", 3, 0 } , +{ "Mortal Kombat (rev 3.0 08/31/92)" ,"mkla3" , "mame", 3, 0 } , +{ "Mortal Kombat (rev 4.0 09/28/92)" ,"mkla4" , "mame", 3, 0 } , +{ "Mortal Kombat (rev 5.0 T-Unit 03/19/93)" ,"mk" , "mame", 3, 0 } , +{ "Mortal Kombat 3 (rev 1.0)" ,"mk3r10" , "mame", 3, 0 } , +{ "Mortal Kombat 3 (rev 2.0)" ,"mk3r20" , "mame", 3, 0 } , +{ "Mortal Kombat 3 (rev 2.1)" ,"mk3" , "mame", 3, 0 } , +{ "Mortal Kombat II (rev L1.4)" ,"mk2r14" , "mame", 3, 0 } , +{ "Mortal Kombat II (rev L3.1)" ,"mk2" , "mame", 3, 0 } , +{ "Mortal Kombat II (rev L3.2 (European))" ,"mk2r32" , "mame", 3, 0 } , +{ "Mortal Kombat II Plus" ,"mk2p" , "mame", 3, 0 } , +{ "MotoRace USA" ,"motorace" , "mame", 3, 0 } , +{ "Motos" ,"motos" , "mame", 3, 0 } , +{ "Mouse Trap (version 3)" ,"mtrap3" , "mame", 3, 0 } , +{ "Mouse Trap (version 4)" ,"mtrap4" , "mame", 3, 0 } , +{ "Mouse Trap (version 5)" ,"mtrap" , "mame", 3, 0 } , +{ "Mr. Do vs. Unicorns" ,"douni" , "mame", 1, 0 } , +{ "Mr. Do! (Taito)" ,"mrdot" , "mame", 3, 0 } , +{ "Mr. Do! (Universal)" ,"mrdo" , "mame", 3, 0 } , +{ "Mr. Do! (Yukidaruma)" ,"mrdoy" , "mame", 3, 0 } , +{ "Mr. Do! (bugfixed)" ,"mrdofix" , "mame", 3, 0 } , +{ "Mr. Do's Castle (set 1)" ,"docastle" , "mame", 1, 0 } , +{ "Mr. Do's Castle (set 2)" ,"docastl2" , "mame", 1, 0 } , +{ "Mr. Do's Wild Ride" ,"dowild" , "mame", 1, 0 } , +{ "Mr. Du!" ,"mrdu" , "mame", 3, 0 } , +{ "Mr. Goemon (Japan)" ,"mrgoemon" , "mame", 3, 0 } , +{ "Mr. HELI no Dai-Bouken" ,"mrheli" , "mame", 1, 0 } , +{ "Mr. Jong (Japan)" ,"mrjong" , "mame", 3, 0 } , +{ "Mr. Lo!" ,"mrlo" , "mame", 3, 0 } , +{ "Mr. TNT" ,"mrtnt" , "mame", 3, 0 } , +{ "Ms. Pac-Man Plus" ,"mspacatk" , "mame", 3, 0 } , +{ "Ms. Pac-Man" ,"mspacman" , "mame", 3, 0 } , +{ "Munch Mobile (Japan)" ,"mnchmobl" , "mame", 3, 0 } , +{ "Muscle Bomber - The Body Explosion (Japan)" ,"mbomberj" , "mame", 1, 0 } , +{ "Muscle Bomber Duo - Heat Up Warriors (Japan)" ,"mbombrdj" , "mame", 1, 0 } , +{ "Muscle Bomber Duo - Ultimate Team Battle (World)" ,"mbombrd" , "mame", 1, 0 } , +{ "Mutant Night" ,"mnight" , "mame", 1, 0 } , +{ "Mutation Nation" ,"mutnat" , "neomame", 3, 0 } , +{ "My Hero (Korea)" ,"myherok" , "mame", 3, 0 } , +{ "My Hero (US)" ,"myhero" , "mame", 3, 0 } , +{ "Mysterious Stones" ,"mystston" , "mame", 3, 0 } , +{ "Mystic Marathon" ,"mysticm" , "mame", 3, 0 } , +{ "Mystic Riders (World)" ,"mysticri" , "mame", 3, 0 } , +{ "NAM-1975" ,"nam1975" , "neomame", 3, 0 } , +{ "NBA Jam (rev 2.00 02/10/93)" ,"nbajamr2" , "mame", 3, 0 } , +{ "NBA Jam (rev 3.01 04/07/93)" ,"nbajam" , "mame", 3, 0 } , +{ "NBA Jam TE (rev 1.0 01/17/94)" ,"nbajamt1" , "mame", 3, 0 } , +{ "NBA Jam TE (rev 2.0 01/28/94)" ,"nbajamt2" , "mame", 3, 0 } , +{ "NBA Jam TE (rev 3.0 03/04/94)" ,"nbajamt3" , "mame", 3, 0 } , +{ "NBA Jam TE (rev 4.0 03/23/94)" ,"nbajamte" , "mame", 3, 0 } , +{ "NBA Maximum Hangtime (rev 1.0)" ,"nbamaxht" , "mame", 3, 0 } , +{ "Name That Tune" ,"nametune" , "mame", 3, 0 } , +{ "Narc (rev 3.20)" ,"narc3" , "mame", 3, 0 } , +{ "Narc (rev 7.00)" ,"narc" , "mame", 3, 0 } , +{ "Nastar (World)" ,"nastar" , "mame", 3, 0 } , +{ "Nastar Warrior (US)" ,"nastarw" , "mame", 3, 0 } , +{ "Naughty Boy (Cinematronics)" ,"naughtyc" , "mame", 3, 0 } , +{ "Naughty Boy (bootleg)" ,"naughtya" , "mame", 3, 0 } , +{ "Naughty Boy" ,"naughtyb" , "mame", 3, 0 } , +{ "Navalone" ,"navalone" , "mame", 3, 0 } , +{ "Nebulous Bee" ,"nebulbee" , "mame", 3, 0 } , +{ "Nekketsu Kouha Kunio-kun (Japan bootleg)" ,"kuniokub" , "mame", 3, 0 } , +{ "Nekketsu Kouha Kunio-kun (Japan)" ,"kuniokun" , "mame", 3, 0 } , +{ "Nemesis (World?)" ,"nemesuk" , "mame", 3, 0 } , +{ "Nemesis (hacked?)" ,"nemesis" , "mame", 3, 0 } , +{ "Nemo (Japan)" ,"nemoj" , "mame", 3, 0 } , +{ "Nemo (World)" ,"nemo" , "mame", 3, 0 } , +{ "Neo Bomberman" ,"neobombe" , "neomame", 3, 0 } , +{ "Neo Drift Out - New Technology" ,"neodrift" , "neomame", 3, 0 } , +{ "Neo Mr. Do!" ,"neomrdo" , "neomame", 3, 0 } , +{ "Neo Turf Masters / Big Tournament Golf" ,"turfmast" , "neomame", 3, 0 } , +{ "Neo-Geo Cup '98 - The Road to the Victory" ,"neocup98" , "neomame", 3, 0 } , +{ "New Puck-X" ,"puckman" , "mame", 3, 0 } , +{ "New Rally X" ,"nrallyx" , "mame", 1, 0 } , +{ "New Sinbad 7" ,"newsin7" , "mame", 3, 0 } , +{ "NewZealand Story 2, The (World)" ,"tnzs2" , "mame", 1, 0 } , +{ "NewZealand Story, The (Japan)" ,"tnzs" , "mame", 1, 0 } , +{ "NewZealand Story, The (World, bootleg)" ,"tnzsb" , "mame", 1, 0 } , +{ "Nibbler (set 1)" ,"nibbler" , "mame", 3, 0 } , +{ "Nibbler (set 2)" ,"nibblera" , "mame", 3, 0 } , +{ "Night Driver" ,"nitedrvr" , "mame", 3, 0 } , +{ "Night Stocker" ,"nstocker" , "mame", 3, 0 } , +{ "Ninja Combat" ,"ncombat" , "neomame", 3, 0 } , +{ "Ninja Commando" ,"ncommand" , "neomame", 3, 0 } , +{ "Ninja Emaki (US)" ,"ninjemak" , "mame", 3, 0 } , +{ "Ninja Gaiden (World)" ,"gaiden" , "mame", 3, 0 } , +{ "Ninja Kid II (set 1)" ,"ninjakd2" , "mame", 1, 0 } , +{ "Ninja Kid II (set 2)" ,"ninjak2a" , "mame", 1, 0 } , +{ "Ninja Kid II (set 3)" ,"ninjak2b" , "mame", 1, 0 } , +{ "Ninja Kids (Japan)" ,"ninjakj" , "mame", 3, 0 } , +{ "Ninja Kids (World)" ,"ninjak" , "mame", 3, 0 } , +{ "Ninja Master's - haoh-ninpo-cho" ,"ninjamas" , "neomame", 3, 0 } , +{ "Ninja Princess (bootleg?)" ,"nprincsb" , "mame", 5, 0 } , +{ "Ninja Princess (not encrypted)" ,"nprincsu" , "mame", 5, 0 } , +{ "Ninja Princess" ,"nprinces" , "mame", 5, 0 } , +{ "Ninja Ryukenden (Japan)" ,"ryukendn" , "mame", 3, 0 } , +{ "Ninja Spirit" ,"nspirit" , "mame", 1, 0 } , +{ "No Man's Land (Gottlieb)" ,"nomnlndg" , "mame", 3, 0 } , +{ "No Man's Land" ,"nomnlnd" , "mame", 3, 0 } , +{ "Nova 2001 (Japan)" ,"nova2001" , "mame", 3, 0 } , +{ "Nova 2001 (US)" ,"nov2001u" , "mame", 3, 0 } , +{ "Nunchackun" ,"nunchaku" , "mame", 3, 0 } , +{ "Off the Wall (2-player cocktail)" ,"offtwalc" , "mame", 3, 0 } , +{ "Off the Wall (2/3-player upright)" ,"offtwall" , "mame", 3, 0 } , +{ "Off the Wall (Sente)" ,"otwalls" , "mame", 3, 0 } , +{ "Oh My God! (Japan)" ,"ohmygod" , "mame", 3, 0 } , +{ "Ohgon no Siro (Japan)" ,"ogonsiro" , "mame", 3, 0 } , +{ "Oli-Boo-Chu" ,"olibochu" , "mame", 1, 0 } , +{ "Omega Race" ,"omegrace" , "mame", 3, 0 } , +{ "Operation Ragnagard / Shin-Oh-Ken" ,"ragnagrd" , "neomame", 3, 0 } , +{ "Orbitron" ,"orbitron" , "mame", 3, 0 } , +{ "Ordyne (Japan)" ,"ordyne" , "mame", 3, 0 } , +{ "Out Run (set 1)" ,"outrun" , "mame", 1, 0 } , +{ "Out Run (set 2)" ,"outruna" , "mame", 1, 0 } , +{ "Out Run (set 3)" ,"outrunb" , "mame", 1, 0 } , +{ "Out Zone (bootleg)" ,"outzonep" , "mame", 3, 0 } , +{ "Out Zone" ,"outzone" , "mame", 3, 0 } , +{ "Over Top" ,"overtop" , "neomame", 3, 0 } , +{ "Ozma Wars" ,"ozmawars" , "mame", 3, 0 } , +{ "P-47 - The Freedom Fighter (Japan)" ,"p47j" , "mame", 3, 0 } , +{ "P-47 - The Phantom Fighter (World)" ,"p47" , "mame", 3, 0 } , +{ "P.O.W. - Prisoners of War (US)" ,"pow" , "mame", 3, 0 } , +{ "Pac & Pal (older)" ,"pacnpal2" , "mame", 3, 0 } , +{ "Pac & Pal" ,"pacnpal" , "mame", 3, 0 } , +{ "Pac-Gal" ,"pacgal" , "mame", 3, 0 } , +{ "Pac-Land (Midway)" ,"paclandm" , "mame", 3, 0 } , +{ "Pac-Land (set 1)" ,"pacland" , "mame", 3, 0 } , +{ "Pac-Land (set 2)" ,"pacland2" , "mame", 3, 0 } , +{ "Pac-Land (set 3)" ,"pacland3" , "mame", 3, 0 } , +{ "Pac-Man & Chomp Chomp" ,"pacnchmp" , "mame", 3, 0 } , +{ "Pac-Man (Hearts)" ,"pacheart" , "mame", 3, 0 } , +{ "Pac-Man (Midway)" ,"pacmanm" , "mame", 3, 0 } , +{ "Pac-Man (Midway, harder)" ,"pacmod" , "mame", 3, 0 } , +{ "Pac-Man (bootleg on Galaxian hardware)" ,"pacmanbl" , "mame", 3, 0 } , +{ "Pac-Man Plus" ,"pacplus" , "mame", 3, 0 } , +{ "Pac-Mania (Japan)" ,"pacmanij" , "mame", 3, 0 } , +{ "Pac-Mania" ,"pacmania" , "mame", 3, 0 } , +{ "Paint Roller" ,"paintrlr" , "mame", 1, 0 } , +{ "Palamedes (Japan)" ,"palamed" , "mame", 3, 0 } , +{ "Pandora's Palace" ,"pandoras" , "mame", 3, 0 } , +{ "Pang (World)" ,"pang" , "mame", 1, 0 } , +{ "Pang (bootleg)" ,"pangb" , "mame", 1, 0 } , +{ "Pang! 3 (Euro)" ,"pang3" , "mame", 3, 0 } , +{ "Pang! 3 (Japan)" ,"pang3j" , "mame", 3, 0 } , +{ "Panic Bomber" ,"panicbom" , "neomame", 3, 0 } , +{ "Paperboy" ,"paperboy" , "mame", 3, 0 } , +{ "Parodius DA! (Japan)" ,"parodius" , "mame", 3, 0 } , +{ "Passing Shot (2 Players) (bootleg)" ,"passshtb" , "mame", 1, 0 } , +{ "Passing Shot (2 Players)" ,"passsht" , "mame", 1, 0 } , +{ "Passing Shot (4 Players) (bootleg)" ,"passht4b" , "mame", 1, 0 } , +{ "Peek-a-Boo!" ,"peekaboo" , "mame", 3, 0 } , +{ "Pengo (set 1)" ,"pengo" , "mame", 1, 0 } , +{ "Pengo (set 2 not encrypted)" ,"pengo2u" , "mame", 3, 0 } , +{ "Pengo (set 2)" ,"pengo2" , "mame", 1, 0 } , +{ "Penguin-Kun Wars (Japan)" ,"pkunwarj" , "mame", 3, 0 } , +{ "Penguin-Kun Wars (US)" ,"pkunwar" , "mame", 3, 0 } , +{ "Penta" ,"penta" , "mame", 1, 0 } , +{ "Pepper II" ,"pepper2" , "mame", 3, 0 } , +{ "Percussor, The" ,"percuss" , "mame", 1, 0 } , +{ "Perfect Soldiers (Japan)" ,"psoldier" , "mame", 3, 0 } , +{ "Peter Pack-Rat" ,"peterpak" , "mame", 3, 0 } , +{ "Phantasm (Japan)" ,"phantasm" , "mame", 3, 0 } , +{ "Phantom II" ,"phantom2" , "mame", 3, 0 } , +{ "Phelios (Japan)" ,"phelios" , "mame", 3, 0 } , +{ "Phoenix (Amstar)" ,"phoenix" , "mame", 3, 0 } , +{ "Phoenix (Centuri)" ,"phoenixa" , "mame", 3, 0 } , +{ "Phoenix (IRECSA, G.G.I Corp)" ,"phoenixc" , "mame", 3, 0 } , +{ "Phoenix (T.P.N.)" ,"phoenix3" , "mame", 3, 0 } , +{ "Phoenix (Taito)" ,"phoenixt" , "mame", 3, 0 } , +{ "Phozon" ,"phozon" , "mame", 3, 0 } , +{ "Pickin'" ,"pickin" , "mame", 3, 0 } , +{ "Pig Newton (version A)" ,"pignewta" , "mame", 1, 0 } , +{ "Pig Newton (version C)" ,"pignewt" , "mame", 1, 0 } , +{ "Pigout (alternate)" ,"pigouta" , "mame", 3, 0 } , +{ "Pigout" ,"pigout" , "mame", 3, 0 } , +{ "Pigskin 621AD" ,"pigskin" , "mame", 3, 0 } , +{ "Pinball Action (set 1)" ,"pbaction" , "mame", 3, 0 } , +{ "Pinball Action (set 2)" ,"pbactio2" , "mame", 3, 0 } , +{ "Pinbo (Strike)" ,"pinbos" , "mame", 3, 0 } , +{ "Pinbo" ,"pinbo" , "mame", 3, 0 } , +{ "Ping Pong" ,"pingpong" , "mame", 3, 0 } , +{ "Pioneer Balloon" ,"pballoon" , "mame", 3, 0 } , +{ "Pipe Dream (Japan)" ,"pipedrm" , "mame", 3, 0 } , +{ "Pipi & Bibis / Whoopee (Japan)" ,"pipibibs" , "mame", 3, 0 } , +{ "Pipi & Bibis / Whoopee (Japan) [bootleg ?]" ,"pipibibi" , "mame", 3, 0 } , +{ "Piranha" ,"piranha" , "mame", 3, 0 } , +{ "Pirate Ship HigeMaru" ,"higemaru" , "mame", 1, 0 } , +{ "Pisces" ,"pisces" , "mame", 3, 0 } , +{ "Pistol Daimyo no Bouken (Japan)" ,"pistoldm" , "mame", 3, 0 } , +{ "Pit Fighter (version 3)" ,"pitfigh3" , "mame", 3, 0 } , +{ "Pit Fighter (version 4)" ,"pitfight" , "mame", 3, 0 } , +{ "Pit, The" ,"thepit" , "mame", 3, 0 } , +{ "Pitfall II (not encrypted)" ,"pitfallu" , "mame", 3, 0 } , +{ "Pitfall II" ,"pitfall2" , "mame", 5, 0 } , +{ "Play Girls" ,"plgirls" , "mame", 3, 0 } , +{ "Play Girls 2" ,"plgirls2" , "mame", 3, 0 } , +{ "Pleasure Goal / Futsal - 5 on 5 Mini Soccer" ,"pgoal" , "neomame", 3, 0 } , +{ "Pleiads (Centuri)" ,"pleiadce" , "mame", 3, 0 } , +{ "Pleiads (Tehkan)" ,"pleiads" , "mame", 3, 0 } , +{ "Pleiads (bootleg)" ,"pleiadbl" , "mame", 3, 0 } , +{ "Plotting (World)" ,"plotting" , "mame", 3, 0 } , +{ "Plump Pop (Japan)" ,"plumppop" , "mame", 3, 0 } , +{ "Plus Alpha" ,"plusalph" , "mame", 3, 0 } , +{ "Pnickies (Japan)" ,"pnickj" , "mame", 3, 0 } , +{ "Pocket Gal (Japan)" ,"pcktgal" , "mame", 3, 0 } , +{ "Pocket Gal (bootleg)" ,"pcktgalb" , "mame", 3, 0 } , +{ "Pocket Gal 2 (World?)" ,"pcktgal2" , "mame", 3, 0 } , +{ "Poker Ladies" ,"pkladies" , "mame", 1, 0 } , +{ "Polaris (set 1)" ,"polaris" , "mame", 3, 0 } , +{ "Polaris (set 2)" ,"polarisa" , "mame", 3, 0 } , +{ "Pole Position (Atari version 1)" ,"polepos1" , "mame", 3, 0 } , +{ "Pole Position (Atari version 2)" ,"poleposa" , "mame", 3, 0 } , +{ "Pole Position II (Atari bootleg 1)" ,"poleps2b" , "mame", 3, 0 } , +{ "Pole Position II (Atari bootleg 2)" ,"poleps2c" , "mame", 3, 0 } , +{ "Pole Position II (Atari)" ,"poleps2a" , "mame", 3, 0 } , +{ "Pole Position II" ,"polepos2" , "mame", 3, 0 } , +{ "Pole Position" ,"polepos" , "mame", 3, 0 } , +{ "Poly-Play" ,"polyplay" , "mame", 3, 0 } , +{ "Pomping World (Japan)" ,"pompingw" , "mame", 1, 0 } , +{ "Ponpoko (Venture Line)" ,"ponpokov" , "mame", 3, 0 } , +{ "Ponpoko" ,"ponpoko" , "mame", 3, 0 } , +{ "Pootan" ,"pootan" , "mame", 3, 0 } , +{ "Pooyan (Stern)" ,"pooyans" , "mame", 3, 0 } , +{ "Pooyan" ,"pooyan" , "mame", 3, 0 } , +{ "Pop 'n Bounce / Gapporin" ,"popbounc" , "neomame", 1, 0 } , +{ "Pop Flamer (set 1)" ,"popflame" , "mame", 3, 0 } , +{ "Pop Flamer (set 2)" ,"popflama" , "mame", 3, 0 } , +{ "Popeye (bootleg)" ,"popeyebl" , "mame", 3, 0 } , +{ "Popeye (set 1)" ,"popeye" , "mame", 3, 0 } , +{ "Popeye (set 2)" ,"popeye2" , "mame", 3, 0 } , +{ "Port Man" ,"portman" , "mame", 3, 0 } , +{ "Pot of Gold" ,"potogold" , "mame", 3, 0 } , +{ "Pound for Pound (US)" ,"poundfou" , "mame", 1, 0 } , +{ "Pound for Pound (World)" ,"poundfor" , "mame", 1, 0 } , +{ "Power Drive" ,"powerdrv" , "mame", 1, 0 } , +{ "Power Instinct (USA) [bootleg]" ,"powerins" , "mame", 3, 0 } , +{ "Power Spikes (Korea)" ,"pspikes" , "mame", 1, 0 } , +{ "Power Spikes II" ,"pspikes2" , "neomame", 1, 0 } , +{ "Power Surge" ,"psurge" , "mame", 3, 0 } , +{ "Prehistoric Isle in 1930 (US)" ,"prehislu" , "mame", 3, 0 } , +{ "Prehistoric Isle in 1930 (World)" ,"prehisle" , "mame", 3, 0 } , +{ "Psychic 5" ,"psychic5" , "mame", 5, 0 } , +{ "Psycho Soldier (Japan)" ,"psychosj" , "mame", 3, 0 } , +{ "Psycho Soldier (US)" ,"psychos" , "mame", 3, 0 } , +{ "Psycho-Nics Oscar (Japan revision 0)" ,"oscarj0" , "mame", 3, 0 } , +{ "Psycho-Nics Oscar (Japan revision 1)" ,"oscarj1" , "mame", 3, 0 } , +{ "Psycho-Nics Oscar (Japan revision 2)" ,"oscarj" , "mame", 3, 0 } , +{ "Psycho-Nics Oscar (US)" ,"oscar" , "mame", 3, 0 } , +{ "PuLiRuLa (Japan)" ,"pulirulj" , "mame", 3, 0 } , +{ "PuLiRuLa (World)" ,"pulirula" , "mame", 3, 0 } , +{ "PuckMan (Japan set 1)" ,"pacman" , "mame", 3, 0 } , +{ "PuckMan (Japan set 2)" ,"pacmanjp" , "mame", 3, 0 } , +{ "PuckMan (harder?)" ,"npacmod" , "mame", 3, 0 } , +{ "Pulsar" ,"pulsar" , "mame", 3, 0 } , +{ "Pulstar" ,"pulstar" , "neomame", 3, 0 } , +{ "Punch-Out!!" ,"punchout" , "mame", 1, 0 } , +{ "Punisher, The (Japan)" ,"punishrj" , "mame", 1, 0 } , +{ "Punisher, The (US)" ,"punishru" , "mame", 1, 0 } , +{ "Punisher, The (World)" ,"punisher" , "mame", 1, 0 } , +{ "Punk Shot (2 Players)" ,"punksht2" , "mame", 3, 0 } , +{ "Punk Shot (4 Players)" ,"punkshot" , "mame", 3, 0 } , +{ "Puzzle Bobble (Japan, B-System)" ,"puzbobb" , "mame", 3, 0 } , +{ "Puzzle Bobble / Bust-A-Move (Neo-Geo)" ,"pbobble" , "neomame", 3, 0 } , +{ "Puzzle Club (Japan prototype)" ,"puzlclub" , "mame", 3, 0 } , +{ "Puzzle De Pon R" ,"puzzldpr" , "neomame", 3, 0 } , +{ "Puzzle De Pon" ,"puzzledp" , "neomame", 3, 0 } , +{ "Puzzled / Joy Joy Kid" ,"joyjoy" , "neomame", 3, 0 } , +{ "Puzznic (Japan)" ,"puzznic" , "mame", 3, 0 } , +{ "Pyros (US)" ,"pyros" , "mame", 3, 0 } , +{ "Q*bert (Japan)" ,"qbertjp" , "mame", 3, 0 } , +{ "Q*bert (US)" ,"qbert" , "mame", 3, 0 } , +{ "Q*bert's Qubes" ,"qbertqub" , "mame", 3, 0 } , +{ "Qix (set 1)" ,"qix" , "mame", 3, 0 } , +{ "Qix (set 2)" ,"qixa" , "mame", 3, 0 } , +{ "Qix (set 3)" ,"qixb" , "mame", 3, 0 } , +{ "Qix II (Tournament)" ,"qix2" , "mame", 3, 0 } , +{ "Quantum (prototype)" ,"quantump" , "mame", 3, 0 } , +{ "Quantum (rev 1)" ,"quantum1" , "mame", 3, 0 } , +{ "Quantum (rev 2)" ,"quantum" , "mame", 3, 0 } , +{ "Quarterback (set 2)" ,"quartrba" , "mame", 3, 0 } , +{ "Quarterback" ,"quarterb" , "mame", 3, 0 } , +{ "Quartet (Japan)" ,"quartetj" , "mame", 3, 0 } , +{ "Quartet II" ,"quartet2" , "mame", 3, 0 } , +{ "Quartet" ,"quartet" , "mame", 3, 0 } , +{ "Quarth (Japan)" ,"quarth" , "mame", 3, 0 } , +{ "Quester (Japan)" ,"quester" , "mame", 3, 0 } , +{ "Quiz & Dragons (Japan)" ,"qadj" , "mame", 3, 0 } , +{ "Quiz & Dragons (US)" ,"qad" , "mame", 3, 0 } , +{ "Quiz Chikyu Bouei Gun (Japan)" ,"qzchikyu" , "mame", 3, 0 } , +{ "Quiz Crayon Shinchan (Japan)" ,"qcrayon" , "mame", 3, 0 } , +{ "Quiz Crayon Shinchan Orato Asobo (Japan)" ,"qcrayon2" , "mame", 3, 0 } , +{ "Quiz Daisousa Sen - The Last Count Down" ,"quizdais" , "neomame", 3, 0 } , +{ "Quiz HQ (Japan)" ,"quizhq" , "mame", 3, 0 } , +{ "Quiz Jinsei Gekijoh (Japan)" ,"qjinsei" , "mame", 3, 0 } , +{ "Quiz King of Fighters" ,"quizkof" , "neomame", 3, 0 } , +{ "Quiz Meintantei Neo Geo - Quiz Daisousa Sen Part 2" ,"quizdai2" , "neomame", 3, 0 } , +{ "Quiz Quest - Hime to Yuusha no Monogatari (Japan)" ,"qzquest" , "mame", 3, 0 } , +{ "Quiz Sangokushi (Japan)" ,"qsangoku" , "mame", 1, 0 } , +{ "Quiz Sekai wa SHOW by shobai (Japan)" ,"qzshowby" , "mame", 3, 0 } , +{ "Quiz Tonosama no Yabou (Japan)" ,"qtono1" , "mame", 1, 0 } , +{ "Quiz Tonosama no Yabou 2 Zenkoku-ban (Japan)" ,"qtono2" , "mame", 3, 0 } , +{ "Quiz Torimonochou (Japan)" ,"qtorimon" , "mame", 3, 0 } , +{ "Qwak (prototype)" ,"qwakprot" , "mame", 3, 0 } , +{ "R-Type (Japan prototype)" ,"rtypepj" , "mame", 1, 0 } , +{ "R-Type (Japan)" ,"rtype" , "mame", 1, 0 } , +{ "R-Type (US)" ,"rtypeu" , "mame", 1, 0 } , +{ "R-Type II (Japan)" ,"rtype2j" , "mame", 1, 0 } , +{ "R-Type II" ,"rtype2" , "mame", 1, 0 } , +{ "R-Type Leo (Japan)" ,"rtypeleo" , "mame", 3, 0 } , +{ "Rabbit Punch (US)" ,"rpunch" , "mame", 3, 0 } , +{ "Rabio Lepus (Japan)" ,"rabiolep" , "mame", 3, 0 } , +{ "Rack 'em Up" ,"rackemup" , "mame", 3, 0 } , +{ "Rad Action" ,"rdaction" , "mame", 3, 0 } , +{ "Radar Scope" ,"radarscp" , "mame", 1, 0 } , +{ "Radical Radial" ,"radrad" , "mame", 3, 0 } , +{ "Raiden (Alternate Hardware)" ,"raidena" , "mame", 1, 0 } , +{ "Raiden (Korea)" ,"raidenk" , "mame", 1, 0 } , +{ "Raiden" ,"raiden" , "mame", 1, 0 } , +{ "Raimais (Japan)" ,"raimais" , "mame", 5, 0 } , +{ "Rainbow Islands (Extra)" ,"rainbowe" , "mame", 1, 0 } , +{ "Rainbow Islands" ,"rainbow" , "mame", 3, 0 } , +{ "Rally Bike / Dash Yarou" ,"rallybik" , "mame", 3, 0 } , +{ "Rally X (Midway)" ,"rallyxm" , "mame", 1, 0 } , +{ "Rally X" ,"rallyx" , "mame", 1, 0 } , +{ "Rambo III (set 1, Europe)" ,"rambo3" , "mame", 3, 0 } , +{ "Rambo III (set 2, US)" ,"rambo3a" , "mame", 3, 0 } , +{ "Rampage (revision 2)" ,"rampage2" , "mame", 1, 0 } , +{ "Rampage (revision 3)" ,"rampage" , "mame", 1, 0 } , +{ "Rampage: World Tour (rev 1.1)" ,"rmpgwt11" , "mame", 3, 0 } , +{ "Rampage: World Tour (rev 1.3)" ,"rmpgwt" , "mame", 3, 0 } , +{ "Rampart (2-player Joystick)" ,"ramprt2p" , "mame", 3, 0 } , +{ "Rampart (3-player Trackball)" ,"rampart" , "mame", 3, 0 } , +{ "Rampart (Japan, 2-player Joystick)" ,"rampartj" , "mame", 3, 0 } , +{ "Rastan (US set 1)" ,"rastanu" , "mame", 3, 0 } , +{ "Rastan (US set 2)" ,"rastanu2" , "mame", 3, 0 } , +{ "Rastan (World)" ,"rastan" , "mame", 3, 0 } , +{ "Rastan Saga (Japan)" ,"rastsaga" , "mame", 3, 0 } , +{ "Rastan Saga 2 (Japan)" ,"rastsag2" , "mame", 3, 0 } , +{ "Razzmatazz" ,"razmataz" , "mame", 1, 0 } , +{ "Reactor" ,"reactor" , "mame", 3, 0 } , +{ "Real Bout Fatal Fury / Real Bout Garou Densetsu" ,"rbff1" , "neomame", 3, 0 } , +{ "Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - the newcomers" ,"rbff2" , "neomame", 3, 0 } , +{ "Real Bout Fatal Fury Special / Real Bout Garou Densetsu Special" ,"rbffspec" , "neomame", 3, 0 } , +{ "Real Ghostbusters, The (US 2 Players)" ,"ghostb" , "mame", 3, 0 } , +{ "Real Ghostbusters, The (US 3 Players)" ,"ghostb3" , "mame", 3, 0 } , +{ "Red Alert" ,"redalert" , "mame", 3, 0 } , +{ "Red Baron" ,"redbaron" , "mame", 3, 0 } , +{ "Redline Racer (2 players)" ,"redlin2p" , "mame", 3, 0 } , +{ "Regulus (not encrypted)" ,"regulusu" , "mame", 3, 0 } , +{ "Regulus" ,"regulus" , "mame", 5, 0 } , +{ "Relief Pitcher (set 1)" ,"relief" , "mame", 3, 0 } , +{ "Relief Pitcher (set 2)" ,"relief2" , "mame", 3, 0 } , +{ "Renegade (US)" ,"renegade" , "mame", 3, 0 } , +{ "Repulse" ,"repulse" , "mame", 3, 0 } , +{ "Rescue Raider (Stand-Alone)" ,"rescrdsa" , "mame", 1, 0 } , +{ "Rescue Raider" ,"rescraid" , "mame", 1, 0 } , +{ "Rescue" ,"rescue" , "mame", 3, 0 } , +{ "Return of Ishtar, The" ,"roishtar" , "mame", 3, 0 } , +{ "Return of the Invaders (bootleg set 1)" ,"retofin1" , "mame", 3, 0 } , +{ "Return of the Invaders (bootleg set 2)" ,"retofin2" , "mame", 3, 0 } , +{ "Return of the Invaders" ,"retofinv" , "mame", 3, 0 } , +{ "Return of the Jedi" ,"jedi" , "mame", 3, 0 } , +{ "Riding Hero" ,"ridhero" , "neomame", 3, 0 } , +{ "Ring King (set 1)" ,"ringking" , "mame", 3, 0 } , +{ "Ring King (set 2)" ,"ringkin2" , "mame", 3, 0 } , +{ "Ring King (set 3)" ,"ringkin3" , "mame", 3, 0 } , +{ "Ring no Ohja (Japan)" ,"ringohja" , "mame", 3, 0 } , +{ "Riot City" ,"riotcity" , "mame", 1, 0 } , +{ "Rip Cord" ,"ripcord" , "mame", 3, 0 } , +{ "Rip Off" ,"ripoff" , "mame", 3, 0 } , +{ "River Patrol (bootleg)" ,"rpatrolb" , "mame", 3, 0 } , +{ "Road Blasters" ,"roadblst" , "mame", 0, 0 } , +{ "Road Fighter (set 1)" ,"roadf" , "mame", 3, 0 } , +{ "Road Fighter (set 2)" ,"roadf2" , "mame", 3, 0 } , +{ "Road Runner" ,"roadrunn" , "mame", 3, 0 } , +{ "Robby Roto" ,"robby" , "mame", 1, 0 } , +{ "Robo Army" ,"roboarmy" , "neomame", 3, 0 } , +{ "Robocop (US revision 0)" ,"robocpu0" , "mame", 3, 0 } , +{ "Robocop (US revision 1)" ,"robocopu" , "mame", 3, 0 } , +{ "Robocop (World bootleg)" ,"robocopb" , "mame", 3, 0 } , +{ "Robocop (World revision 3)" ,"robocop" , "mame", 3, 0 } , +{ "Robot Bowl" ,"robotbwl" , "mame", 3, 0 } , +{ "Robotron (Solid Blue label)" ,"robotron" , "mame", 3, 0 } , +{ "Robotron (Yellow/Orange label)" ,"robotryo" , "mame", 3, 0 } , +{ "Roc'n Rope (Kosuka)" ,"rocnropk" , "mame", 3, 0 } , +{ "Roc'n Rope" ,"rocnrope" , "mame", 3, 0 } , +{ "Rock 'n Rage (World?)" ,"rockrage" , "mame", 3, 0 } , +{ "Rockman - The Power Battle (Japan)" ,"rockmanj" , "mame", 3, 0 } , +{ "RodLand (Japan)" ,"rodlandj" , "mame", 3, 0 } , +{ "RodLand (World)" ,"rodland" , "mame", 3, 0 } , +{ "Rollergames (Japan)" ,"rollergj" , "mame", 3, 0 } , +{ "Rollergames (US)" ,"rollerg" , "mame", 3, 0 } , +{ "Rolling Crash / Moon Base" ,"rollingc" , "mame", 3, 0 } , +{ "Rolling Thunder (new version)" ,"rthunder" , "mame", 3, 0 } , +{ "Rolling Thunder (old version)" ,"rthundro" , "mame", 3, 0 } , +{ "Rolling Thunder 2 (Japan)" ,"rthun2j" , "mame", 3, 0 } , +{ "Rolling Thunder 2" ,"rthun2" , "mame", 3, 0 } , +{ "Rompers (Japan old version)" ,"romperso" , "mame", 3, 0 } , +{ "Rompers (Japan)" ,"rompers" , "mame", 3, 0 } , +{ "Rough Ranger (v2.0, Sharp Image license)" ,"rranger" , "mame", 3, 0 } , +{ "Round-Up" ,"roundup" , "mame", 3, 0 } , +{ "Route 16 (bootleg)" ,"route16b" , "mame", 3, 0 } , +{ "Route 16" ,"route16" , "mame", 3, 0 } , +{ "Royal Mahjong" ,"royalmah" , "mame", 1, 0 } , +{ "Rug Rats" ,"rugrats" , "mame", 3, 0 } , +{ "Runark (Japan)" ,"runark" , "mame", 3, 0 } , +{ "Rush & Crash (Japan)" ,"rushcrsh" , "mame", 3, 0 } , +{ "Rush'n Attack" ,"rushatck" , "mame", 3, 0 } , +{ "Rygar (US set 1)" ,"rygar" , "mame", 3, 0 } , +{ "Rygar (US set 2)" ,"rygar2" , "mame", 3, 0 } , +{ "S.P.Y. - Special Project Y (US)" ,"spy" , "mame", 3, 0 } , +{ "S.R.D. Mission" ,"srdmissn" , "mame", 3, 0 } , +{ "SAR - Search And Rescue (US)" ,"sercharu" , "mame", 3, 0 } , +{ "SAR - Search And Rescue (World)" ,"searchar" , "mame", 3, 0 } , +{ "SDI - Strategic Defense Initiative (Japan)" ,"sdioj" , "mame", 3, 0 } , +{ "SDI - Strategic Defense Initiative" ,"sdi" , "mame", 3, 0 } , +{ "SOS" ,"sos" , "mame", 3, 0 } , +{ "SWAT" ,"swat" , "mame", 5, 0 } , +{ "Safari Rally" ,"safarir" , "mame", 3, 0 } , +{ "Safari" ,"safari" , "mame", 3, 0 } , +{ "Saigo no Nindou (Japan)" ,"nspiritj" , "mame", 1, 0 } , +{ "Saint Dragon" ,"stdragon" , "mame", 3, 0 } , +{ "Salamander" ,"salamand" , "mame", 3, 0 } , +{ "Same! Same! Same!" ,"samesame" , "mame", 3, 0 } , +{ "Samurai (Sega)" ,"samurai" , "mame", 3, 0 } , +{ "Samurai Nihon-ichi (set 1)" ,"tsamurai" , "mame", 3, 0 } , +{ "Samurai Nihon-ichi (set 2)" ,"tsamura2" , "mame", 3, 0 } , +{ "Samurai Shodown / Samurai Spirits" ,"samsho" , "neomame", 3, 0 } , +{ "Samurai Shodown II / Shin Samurai Spirits - Haohmaru jigokuhen" ,"samsho2" , "neomame", 3, 0 } , +{ "Samurai Shodown III / Samurai Spirits - Zankurou Musouken" ,"samsho3" , "neomame", 3, 0 } , +{ "Samurai Shodown IV - Amakusa's Revenge / Samurai Spirits - Amakusa Kourin" ,"samsho4" , "neomame", 3, 0 } , +{ "Sangokushi II (Asia)" ,"wofa" , "mame", 1, 0 } , +{ "Sarge" ,"sarge" , "mame", 1, 0 } , +{ "Sasuke vs. Commander" ,"sasuke" , "mame", 3, 0 } , +{ "Satan of Saturn" ,"satansat" , "mame", 3, 0 } , +{ "Satan's Hollow (set 1)" ,"shollow" , "mame", 5, 0 } , +{ "Satan's Hollow (set 2)" ,"shollow2" , "mame", 5, 0 } , +{ "Saturday Night Slam Masters (World)" ,"slammast" , "mame", 1, 0 } , +{ "Saturn" ,"saturn" , "mame", 3, 0 } , +{ "Sauro" ,"sauro" , "mame", 3, 0 } , +{ "Savage Bees" ,"savgbees" , "mame", 1, 0 } , +{ "Savage Reign / Fu'un Mokushiroku - kakutou sousei" ,"savagere" , "neomame", 3, 0 } , +{ "Scion (Cinematronics)" ,"scionc" , "mame", 3, 0 } , +{ "Scion" ,"scion" , "mame", 3, 0 } , +{ "Scramble (Stern)" ,"scrambls" , "mame", 3, 0 } , +{ "Scramble (bootleg on Galaxian hardware)" ,"scramblb" , "mame", 3, 0 } , +{ "Scramble" ,"scramble" , "mame", 3, 0 } , +{ "Scrambled Egg" ,"scregg" , "mame", 3, 0 } , +{ "Screw Loose (prototype)" ,"screwloo" , "mame", 3, 0 } , +{ "Sea Fighter Poseidon" ,"sfposeid" , "mame", 3, 0 } , +{ "Sea Wolf II" ,"seawolf2" , "mame", 3, 0 } , +{ "Sea Wolf" ,"seawolf" , "mame", 3, 0 } , +{ "Secret Agent (World)" ,"secretag" , "mame", 3, 0 } , +{ "Section Z (set 1)" ,"sectionz" , "mame", 5, 0 } , +{ "Section Z (set 2)" ,"sctionza" , "mame", 5, 0 } , +{ "Sector Zone" ,"sectrzon" , "mame", 3, 0 } , +{ "Sega Ninja (not encrypted)" ,"seganinu" , "mame", 5, 0 } , +{ "Sega Ninja" ,"seganinj" , "mame", 5, 0 } , +{ "Seicross" ,"seicross" , "mame", 3, 0 } , +{ "Seishun Scandal (Japan)" ,"myheroj" , "mame", 5, 0 } , +{ "Sengoku / Sengoku Denshou (set 1)" ,"sengoku" , "neomame", 3, 0 } , +{ "Sengoku / Sengoku Denshou (set 2)" ,"sengokh" , "neomame", 3, 0 } , +{ "Sengoku 2 / Sengoku Denshou 2" ,"sengoku2" , "neomame", 3, 0 } , +{ "Sengoku Ace (Japan)" ,"sngkace" , "mame", 3, 0 } , +{ "Senjo no Ookami II (Japan)" ,"mercsj" , "mame", 3, 0 } , +{ "Senjo no Ookami" ,"commandj" , "mame", 5, 0 } , +{ "Senjyo" ,"senjyo" , "mame", 1, 0 } , +{ "Sente Diagnostic Cartridge" ,"sentetst" , "mame", 3, 0 } , +{ "Shackled (US)" ,"shackled" , "mame", 3, 0 } , +{ "Shadow Dancer (Japan)" ,"shdancrj" , "mame", 1, 0 } , +{ "Shadow Dancer (US)" ,"shdancer" , "mame", 1, 0 } , +{ "Shadow Dancer (bootleg)" ,"shdancbl" , "mame", 1, 0 } , +{ "Shadow Land" ,"shadowld" , "mame", 3, 0 } , +{ "Shadow Warriors (US)" ,"shadoww" , "mame", 3, 0 } , +{ "Shanghai III (Japan)" ,"shangha3" , "mame", 3, 0 } , +{ "Shanghai" ,"shanghai" , "mame", 3, 0 } , +{ "Shao-Lin's Road" ,"shaolins" , "mame", 3, 0 } , +{ "Shark Attack" ,"sharkatt" , "mame", 3, 0 } , +{ "Sheriff" ,"sheriff" , "mame", 3, 0 } , +{ "Shinnyuushain Tooru-kun" ,"mikiej" , "mame", 3, 0 } , +{ "Shinobi (bootleg)" ,"shinobl" , "mame", 1, 0 } , +{ "Shinobi (set 1)" ,"shinobi" , "mame", 1, 0 } , +{ "Shinobi (set 2)" ,"shinobia" , "mame", 1, 0 } , +{ "Shinobi (set 3)" ,"shinobib" , "mame", 1, 0 } , +{ "Shippu Mahou Daisakusen (Japan)" ,"shippumd" , "mame", 3, 0 } , +{ "Shisensho - Joshiryo-Hen (Japan)" ,"shisen" , "mame", 1, 0 } , +{ "Shock Troopers - 2nd Squad" ,"shocktr2" , "neomame", 3, 0 } , +{ "Shock Troopers" ,"shocktro" , "neomame", 3, 0 } , +{ "Shoot Out (Japan)" ,"shootouj" , "mame", 3, 0 } , +{ "Shoot Out (Korean Bootleg)" ,"shootoub" , "mame", 3, 0 } , +{ "Shoot Out (US)" ,"shootout" , "mame", 3, 0 } , +{ "Shooting Master" ,"shtngmst" , "mame", 1, 0 } , +{ "Showdown (version 5.0)" ,"showdown" , "mame", 3, 0 } , +{ "Shuffleboard" ,"shuffle" , "mame", 3, 0 } , +{ "Shuuz (version 7.1)" ,"shuuz2" , "mame", 3, 0 } , +{ "Shuuz (version 8.0)" ,"shuuz" , "mame", 3, 0 } , +{ "Sichuan II (hack ?) (set 2)" ,"sichuana" , "mame", 1, 0 } , +{ "Sichuan II (hack?) (set 1)" ,"sichuan2" , "mame", 1, 0 } , +{ "Side Arms - Hyper Dyne (Japan)" ,"sidearjp" , "mame", 3, 0 } , +{ "Side Arms - Hyper Dyne (US)" ,"sidearmr" , "mame", 3, 0 } , +{ "Side Arms - Hyper Dyne (World)" ,"sidearms" , "mame", 3, 0 } , +{ "Side Pocket (Japan)" ,"sidepctj" , "mame", 3, 0 } , +{ "Side Pocket (World)" ,"sidepckt" , "mame", 3, 0 } , +{ "Side Pocket (bootleg)" ,"sidepctb" , "mame", 3, 0 } , +{ "Side Track" ,"sidetrac" , "mame", 3, 0 } , +{ "Silent Dragon (World)" ,"silentd" , "mame", 3, 0 } , +{ "Silkworm (set 1)" ,"silkworm" , "mame", 3, 0 } , +{ "Silkworm (set 2)" ,"silkwrm2" , "mame", 3, 0 } , +{ "Silver Land" ,"silvland" , "mame", 3, 0 } , +{ "Simpsons, The (2 Players Japan)" ,"simps2pj" , "mame", 3, 0 } , +{ "Simpsons, The (2 Players)" ,"simpsn2p" , "mame", 3, 0 } , +{ "Simpsons, The (4 Players)" ,"simpsons" , "mame", 3, 0 } , +{ "Sindbad Mystery" ,"sindbadm" , "mame", 5, 0 } , +{ "Sinistar (prototype version)" ,"sinista1" , "mame", 3, 0 } , +{ "Sinistar (revision 2)" ,"sinista2" , "mame", 3, 0 } , +{ "Sinistar (revision 3)" ,"sinistar" , "mame", 3, 0 } , +{ "Skull & Crossbones (set 1)" ,"skullxbo" , "mame", 3, 0 } , +{ "Skull & Crossbones (set 2)" ,"skullxb2" , "mame", 3, 0 } , +{ "Sky Adventure (US)" ,"skyadvnt" , "mame", 3, 0 } , +{ "Sky Chuter" ,"skychut" , "mame", 3, 0 } , +{ "Sky Diver" ,"skydiver" , "mame", 3, 0 } , +{ "Sky Fox" ,"skyfox" , "mame", 3, 0 } , +{ "Sky Kid Deluxe (set 1)" ,"skykiddx" , "mame", 3, 0 } , +{ "Sky Kid Deluxe (set 2)" ,"skykiddo" , "mame", 3, 0 } , +{ "Sky Kid" ,"skykid" , "mame", 3, 0 } , +{ "Sky Lancer" ,"skylancr" , "mame", 3, 0 } , +{ "Sky Shark (US)" ,"skyshark" , "mame", 3, 0 } , +{ "Sky Soldiers (US)" ,"skysoldr" , "mame", 3, 0 } , +{ "Sky Wolf (set 1)" ,"skywolf" , "mame", 3, 0 } , +{ "Sky Wolf (set 2)" ,"skywolf2" , "mame", 3, 0 } , +{ "Slap Fight (English bootleg)" ,"slapbtuk" , "mame", 3, 0 } , +{ "Slap Fight (Japan bootleg)" ,"slapbtjp" , "mame", 3, 0 } , +{ "Slap Fight" ,"slapfigh" , "mame", 3, 0 } , +{ "Sly Spy (US revision 2)" ,"slyspy2" , "mame", 3, 0 } , +{ "Sly Spy (US revision 3)" ,"slyspy" , "mame", 3, 0 } , +{ "Smash T.V. (rev 4.00)" ,"smashtv4" , "mame", 3, 0 } , +{ "Smash T.V. (rev 5.00)" ,"smashtv5" , "mame", 3, 0 } , +{ "Smash T.V. (rev 6.00)" ,"smashtv6" , "mame", 3, 0 } , +{ "Smash T.V. (rev 8.00)" ,"smashtv" , "mame", 3, 0 } , +{ "Snacks'n Jaxson" ,"snakjack" , "mame", 1, 0 } , +{ "Snake Pit" ,"snakepit" , "mame", 3, 0 } , +{ "Snap Jack" ,"snapjack" , "mame", 3, 0 } , +{ "Snow Bros. - Nick & Tom (Japan)" ,"snowbroj" , "mame", 3, 0 } , +{ "Snow Bros. - Nick & Tom (set 1)" ,"snowbros" , "mame", 3, 0 } , +{ "Snow Bros. - Nick & Tom (set 2)" ,"snowbroa" , "mame", 3, 0 } , +{ "Snow Bros. - Nick & Tom (set 3)" ,"snowbrob" , "mame", 3, 0 } , +{ "Snow Bros. 2 - With New Elves" ,"snowbro2" , "mame", 3, 0 } , +{ "Soccer Brawl" ,"socbrawl" , "neomame", 3, 0 } , +{ "Solar Fight" ,"solfight" , "mame", 3, 0 } , +{ "Solar Fox" ,"solarfox" , "mame", 5, 0 } , +{ "Solar Quest" ,"solarq" , "mame", 3, 0 } , +{ "Solar Warrior" ,"solarwar" , "mame", 3, 0 } , +{ "Soldam (Japan)" ,"soldamj" , "mame", 3, 0 } , +{ "Solitary Fighter (World)" ,"solfigtr" , "mame", 3, 0 } , +{ "Solomon's Key (Japan)" ,"solomon" , "mame", 3, 0 } , +{ "Son Son" ,"sonson" , "mame", 3, 0 } , +{ "Son of Phoenix" ,"sonofphx" , "mame", 3, 0 } , +{ "Sonic Wings (Japan)" ,"sonicwi" , "mame", 1, 0 } , +{ "Souko Ban Deluxe (Japan)" ,"soukobdx" , "mame", 3, 0 } , +{ "Space Attack (cocktail)" ,"sspacatc" , "mame", 3, 0 } , +{ "Space Attack (upright)" ,"sspaceat" , "mame", 3, 0 } , +{ "Space Attack (upright, older)" ,"sspacat2" , "mame", 3, 0 } , +{ "Space Attack II" ,"spaceatt" , "mame", 3, 0 } , +{ "Space Battle" ,"spacbatt" , "mame", 3, 0 } , +{ "Space Bird (bootleg)" ,"spacebrd" , "mame", 1, 0 } , +{ "Space Chaser (CV version)" ,"schasrcv" , "mame", 3, 0 } , +{ "Space Chaser" ,"schaser" , "mame", 3, 0 } , +{ "Space Demon" ,"spacedem" , "mame", 1, 0 } , +{ "Space Duel" ,"spacduel" , "mame", 3, 0 } , +{ "Space Dungeon" ,"sdungeon" , "mame", 3, 0 } , +{ "Space Encounters" ,"spcenctr" , "mame", 3, 0 } , +{ "Space Fever (black and white)" ,"sfeverbw" , "mame", 3, 0 } , +{ "Space Fever (color)" ,"spacefev" , "mame", 3, 0 } , +{ "Space Firebird (Gremlin)" ,"spacefbg" , "mame", 1, 0 } , +{ "Space Firebird (Nintendo)" ,"spacefb" , "mame", 1, 0 } , +{ "Space Firebird (bootleg)" ,"spacefbb" , "mame", 1, 0 } , +{ "Space Fury (revision A)" ,"spacfura" , "mame", 1, 0 } , +{ "Space Fury (revision C)" ,"spacfury" , "mame", 1, 0 } , +{ "Space Harrier" ,"sharrier" , "mame", 3, 0 } , +{ "Space Intruder" ,"spaceint" , "mame", 3, 0 } , +{ "Space Invaders (CV Version)" ,"sicv" , "mame", 3, 0 } , +{ "Space Invaders (Logitec)" ,"invaderl" , "mame", 3, 0 } , +{ "Space Invaders (SV Version 2)" ,"sisv2" , "mame", 3, 0 } , +{ "Space Invaders (SV Version)" ,"sisv" , "mame", 3, 0 } , +{ "Space Invaders (TV Version)" ,"sitv" , "mame", 3, 0 } , +{ "Space Invaders DX (Japan)" ,"spacedx" , "mame", 0, 0 } , +{ "Space Invaders Deluxe" ,"invaddlx" , "mame", 3, 0 } , +{ "Space Invaders Galactica" ,"galap1" , "mame", 3, 0 } , +{ "Space Invaders II (Midway, cocktail)" ,"invad2ct" , "mame", 3, 0 } , +{ "Space Invaders Part II (Taito)" ,"invadpt2" , "mame", 3, 0 } , +{ "Space Invaders" ,"invaders" , "mame", 3, 0 } , +{ "Space Invasion" ,"spaceinv" , "mame", 5, 0 } , +{ "Space King" ,"spceking" , "mame", 3, 0 } , +{ "Space Laser" ,"spclaser" , "mame", 3, 0 } , +{ "Space Odyssey" ,"spaceod" , "mame", 1, 0 } , +{ "Space Panic (German)" ,"panicger" , "mame", 1, 0 } , +{ "Space Panic (set 1)" ,"panic" , "mame", 1, 0 } , +{ "Space Panic (set 2)" ,"panica" , "mame", 1, 0 } , +{ "Space Phantoms" ,"spaceph" , "mame", 3, 0 } , +{ "Space Pilot" ,"spaceplt" , "mame", 3, 0 } , +{ "Space Seeker" ,"spaceskr" , "mame", 3, 0 } , +{ "Space Tactics" ,"stactics" , "mame", 3, 0 } , +{ "Space Trek (cocktail)" ,"sptrekct" , "mame", 3, 0 } , +{ "Space Trek (upright)" ,"spacetrk" , "mame", 3, 0 } , +{ "Space War (Leijac)" ,"spcewarl" , "mame", 3, 0 } , +{ "Space War (Sanritsu)" ,"spcewars" , "mame", 3, 0 } , +{ "Space War Part 3" ,"spacewr3" , "mame", 3, 0 } , +{ "Space Wars" ,"spacewar" , "mame", 3, 0 } , +{ "Space Zap" ,"spacezap" , "mame", 3, 0 } , +{ "Sparkz (prototype)" ,"sparkz" , "mame", 3, 0 } , +{ "Spartan X (Japan)" ,"spartanx" , "mame", 3, 0 } , +{ "Speak & Rescue" ,"speakres" , "mame", 3, 0 } , +{ "Spectar (revision 1?)" ,"spectar1" , "mame", 3, 0 } , +{ "Spectar (revision 3)" ,"spectar" , "mame", 3, 0 } , +{ "Speed Ball" ,"speedbal" , "mame", 3, 0 } , +{ "Speed Coin (prototype)" ,"spdcoin" , "mame", 3, 0 } , +{ "Speed Freak" ,"speedfrk" , "mame", 3, 0 } , +{ "Speed Rumbler, The (set 1)" ,"srumbler" , "mame", 3, 0 } , +{ "Speed Rumbler, The (set 2)" ,"srumblr2" , "mame", 3, 0 } , +{ "Spelunker II" ,"spelunk2" , "mame", 3, 0 } , +{ "Spelunker" ,"spelunkr" , "mame", 3, 0 } , +{ "Spiders (set 1)" ,"spiders" , "mame", 3, 0 } , +{ "Spiders (set 2)" ,"spiders2" , "mame", 3, 0 } , +{ "Spiker" ,"spiker" , "mame", 1, 0 } , +{ "Spinal Breakers (Japan)" ,"spinlbrj" , "mame", 3, 0 } , +{ "Spinal Breakers (US)" ,"spinlbru" , "mame", 3, 0 } , +{ "Spinal Breakers (World)" ,"spinlbrk" , "mame", 3, 0 } , +{ "Spinmaster / Miracle Adventure" ,"spinmast" , "neomame", 3, 0 } , +{ "Splash!" ,"splash" , "mame", 3, 0 } , +{ "Splat!" ,"splat" , "mame", 3, 0 } , +{ "Splatter House (Japan)" ,"splatter" , "mame", 3, 0 } , +{ "Springer" ,"springer" , "mame", 3, 0 } , +{ "Sprint 1" ,"sprint1" , "mame", 3, 0 } , +{ "Sprint 2" ,"sprint2" , "mame", 3, 0 } , +{ "Spy Hunter 2 (rev 1)" ,"spyhnt2a" , "mame", 3, 0 } , +{ "Spy Hunter 2 (rev 2)" ,"spyhunt2" , "mame", 3, 0 } , +{ "Spy Hunter" ,"spyhunt" , "mame", 1, 0 } , +{ "Stadium Hero (Japan)" ,"stadhero" , "mame", 3, 0 } , +{ "Stakes Winner / Stakes Winner - GI kinzen seihae no michi" ,"stakwin" , "neomame", 3, 0 } , +{ "Stakes Winner 2" ,"stakwin2" , "neomame", 3, 0 } , +{ "Star Castle (older)" ,"starcas1" , "mame", 3, 0 } , +{ "Star Castle (version 3)" ,"starcas" , "mame", 3, 0 } , +{ "Star Cruiser" ,"starcrus" , "mame", 3, 0 } , +{ "Star Fire" ,"starfire" , "mame", 3, 0 } , +{ "Star Force (encrypted)" ,"starfore" , "mame", 1, 0 } , +{ "Star Force" ,"starforc" , "mame", 1, 0 } , +{ "Star Hawk" ,"starhawk" , "mame", 3, 0 } , +{ "Star Jacker (Sega)" ,"starjack" , "mame", 3, 0 } , +{ "Star Jacker (Stern)" ,"starjacs" , "mame", 3, 0 } , +{ "Star Trek" ,"startrek" , "mame", 1, 0 } , +{ "Star Wars (rev 1)" ,"starwar1" , "mame", 3, 0 } , +{ "Star Wars (rev 2)" ,"starwars" , "mame", 3, 0 } , +{ "Star Wars" ,"starw" , "mame", 3, 0 } , +{ "Stargate" ,"stargate" , "mame", 3, 0 } , +{ "Stinger" ,"stinger" , "mame", 1, 0 } , +{ "Stocker" ,"stocker" , "mame", 3, 0 } , +{ "Stoneage" ,"stoneage" , "mame", 3, 0 } , +{ "Storming Party / Riku Kai Kuu Saizensen" ,"storming" , "mame", 3, 0 } , +{ "Strategy X (Stern)" ,"stratgys" , "mame", 3, 0 } , +{ "Strategy X" ,"stratgyx" , "mame", 3, 0 } , +{ "Stratovox (bootleg)" ,"stratvxb" , "mame", 3, 0 } , +{ "Stratovox" ,"stratvox" , "mame", 3, 0 } , +{ "Streaking" ,"streakng" , "mame", 3, 0 } , +{ "Street Fight (Germany)" ,"stfight" , "mame", 5, 0 } , +{ "Street Fighter (Japan)" ,"sf1jp" , "mame", 3, 0 } , +{ "Street Fighter (US)" ,"sf1us" , "mame", 3, 0 } , +{ "Street Fighter (World)" ,"sf1" , "mame", 3, 0 } , +{ "Street Fighter II - The World Warrior (Japan 910214)" ,"sf2jb" , "mame", 3, 0 } , +{ "Street Fighter II - The World Warrior (Japan 911210)" ,"sf2j" , "mame", 3, 0 } , +{ "Street Fighter II - The World Warrior (US 910206)" ,"sf2a" , "mame", 3, 0 } , +{ "Street Fighter II - The World Warrior (US 910214)" ,"sf2b" , "mame", 3, 0 } , +{ "Street Fighter II - The World Warrior (US 910228)" ,"sf2e" , "mame", 3, 0 } , +{ "Street Fighter II - The World Warrior (World 910214)" ,"sf2" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (Accelerator Pt.II)" ,"sf2accp2" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (Japan)" ,"sf2cej" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (Rainbow)" ,"sf2rb" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (Red Wave)" ,"sf2red" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (US rev A)" ,"sf2cea" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (US rev B)" ,"sf2ceb" , "mame", 3, 0 } , +{ "Street Fighter II' - Champion Edition (World)" ,"sf2ce" , "mame", 3, 0 } , +{ "Street Fighter II' - Hyper Fighting (US)" ,"sf2t" , "mame", 3, 0 } , +{ "Street Fighter II' Turbo - Hyper Fighting (Japan)" ,"sf2tj" , "mame", 3, 0 } , +{ "Street Football" ,"sfootbal" , "mame", 3, 0 } , +{ "Street Hoop / Street Slam / Dunk Dream" ,"strhoop" , "neomame", 3, 0 } , +{ "Street Smart (Japan version 1)" ,"streetsj" , "mame", 3, 0 } , +{ "Street Smart (US version 1)" ,"streets1" , "mame", 3, 0 } , +{ "Street Smart (US version 2)" ,"streetsm" , "mame", 3, 0 } , +{ "Strider (US)" ,"strider" , "mame", 3, 0 } , +{ "Strider Hiryu (Japan set 1)" ,"striderj" , "mame", 3, 0 } , +{ "Strider Hiryu (Japan set 2)" ,"stridrja" , "mame", 3, 0 } , +{ "Strike Force (rev 1 02/25/91)" ,"strkforc" , "mame", 3, 0 } , +{ "Strike Zone" ,"strkzone" , "mame", 1, 0 } , +{ "Subs" ,"subs" , "mame", 3, 0 } , +{ "Sundance" ,"sundance" , "mame", 3, 0 } , +{ "Sunset Riders (Asia 2 Players ver. ABD)" ,"ssrdrabd" , "mame", 3, 0 } , +{ "Sunset Riders (Japan 2 Players ver. JBD)" ,"ssrdrjbd" , "mame", 3, 0 } , +{ "Sunset Riders (US 2 Players ver. UBC)" ,"ssrdrubc" , "mame", 3, 0 } , +{ "Sunset Riders (US 4 Players ver. UAC)" ,"ssrdruac" , "mame", 3, 0 } , +{ "Sunset Riders (US 4 Players ver. UDA)" ,"ssrdruda" , "mame", 3, 0 } , +{ "Sunset Riders (World 2 Players ver. EBC)" ,"ssrdrebc" , "mame", 3, 0 } , +{ "Sunset Riders (World 2 Players ver. EBD)" ,"ssrdrebd" , "mame", 3, 0 } , +{ "Sunset Riders (World 4 Players ver. EAC)" ,"ssriders" , "mame", 3, 0 } , +{ "Super Bagman (Stern)" ,"sbagmans" , "mame", 3, 0 } , +{ "Super Bagman" ,"sbagman" , "mame", 3, 0 } , +{ "Super Baseball Double Play Home Run Derby" ,"dblplay" , "mame", 1, 0 } , +{ "Super Basketball" ,"sbasketb" , "mame", 3, 0 } , +{ "Super Bobble Bobble" ,"sboblbob" , "mame", 3, 0 } , +{ "Super Bond" ,"superbon" , "mame", 1, 0 } , +{ "Super Breakout" ,"sbrkout" , "mame", 3, 0 } , +{ "Super Burger Time (Japan)" ,"supbtimj" , "mame", 3, 0 } , +{ "Super Burger Time (World)" ,"supbtime" , "mame", 3, 0 } , +{ "Super Buster Bros (US)" ,"sbbros" , "mame", 1, 0 } , +{ "Super Casino" ,"sucasino" , "mame", 3, 0 } , +{ "Super Champion Baseball" ,"sbasebal" , "mame", 3, 0 } , +{ "Super Cobra (Stern)" ,"scobras" , "mame", 3, 0 } , +{ "Super Cobra (bootleg)" ,"scobrab" , "mame", 3, 0 } , +{ "Super Cobra" ,"scobra" , "mame", 3, 0 } , +{ "Super Contra (Japan)" ,"scontraj" , "mame", 3, 0 } , +{ "Super Contra" ,"scontra" , "mame", 3, 0 } , +{ "Super Dodge Ball / Kunio no Nekketsu Toukyuu Densetsu" ,"sdodgeb" , "neomame", 3, 0 } , +{ "Super Earth Invasion" ,"earthinv" , "mame", 3, 0 } , +{ "Super Formula (Japan)" ,"sformula" , "mame", 1, 0 } , +{ "Super Galaxians" ,"superg" , "mame", 3, 0 } , +{ "Super Hang-On (bootleg)" ,"shangonb" , "mame", 1, 0 } , +{ "Super Hang-On" ,"shangon" , "mame", 1, 0 } , +{ "Super High Impact (rev LA1 09/30/91)" ,"shimpact" , "mame", 3, 0 } , +{ "Super Invaders (EMAG)" ,"sinvemag" , "mame", 3, 0 } , +{ "Super Invaders (Zenitone-Microsec)" ,"sinvzen" , "mame", 3, 0 } , +{ "Super Invaders" ,"superinv" , "mame", 3, 0 } , +{ "Super Locomotive" ,"suprloco" , "mame", 5, 0 } , +{ "Super Marukin-Ban" ,"marukin" , "mame", 1, 0 } , +{ "Super Missile Attack" ,"suprmatk" , "mame", 3, 0 } , +{ "Super Moon Cresta" ,"smooncrs" , "mame", 3, 0 } , +{ "Super Mouse" ,"suprmous" , "mame", 3, 0 } , +{ "Super Pac-Man (Midway)" ,"superpcm" , "mame", 3, 0 } , +{ "Super Pac-Man" ,"superpac" , "mame", 3, 0 } , +{ "Super Pang (World)" ,"spang" , "mame", 1, 0 } , +{ "Super Pierrot (Japan)" ,"spiero" , "mame", 1, 0 } , +{ "Super Pool III (I-Vics)" ,"spool3i" , "mame", 3, 0 } , +{ "Super Pool III (World?)" ,"spool3" , "mame", 3, 0 } , +{ "Super Punch-Out!! (Japan)" ,"spnchotj" , "mame", 1, 0 } , +{ "Super Punch-Out!!" ,"spnchout" , "mame", 1, 0 } , +{ "Super Qix (bootleg)" ,"sqixbl" , "mame", 1, 0 } , +{ "Super Qix" ,"superqix" , "mame", 1, 0 } , +{ "Super Real Darwin (Japan)" ,"srdarwin" , "mame", 3, 0 } , +{ "Super Sidekicks / Tokuten Ou" ,"ssideki" , "neomame", 3, 0 } , +{ "Super Sidekicks 2 - The World Championship / Tokuten Ou 2 - real fight football" ,"ssideki2" , "neomame", 3, 0 } , +{ "Super Sidekicks 3 - The Next Glory / Tokuten Ou 3 - eikoue no michi" ,"ssideki3" , "neomame", 3, 0 } , +{ "Super Space Invaders '91 (World)" ,"ssi" , "mame", 3, 0 } , +{ "Super Sprint" ,"ssprint" , "mame", 3, 0 } , +{ "Super Spy, The" ,"superspy" , "neomame", 3, 0 } , +{ "Super Stingray" ,"sstingry" , "mame", 1, 0 } , +{ "Super Volley '91 (Japan)" ,"svolly91" , "mame", 1, 0 } , +{ "Super Volleyball (Japan)" ,"svolley" , "mame", 1, 0 } , +{ "Super Volleyball (Korea)" ,"svolleyk" , "mame", 1, 0 } , +{ "Super World Stadium '92 (Japan)" ,"sws92" , "mame", 3, 0 } , +{ "Super World Stadium '93 (Japan)" ,"sws93" , "mame", 3, 0 } , +{ "Super Xevious" ,"sxevious" , "mame", 3, 0 } , +{ "Super Zaxxon" ,"szaxxon" , "mame", 1, 0 } , +{ "Superman" ,"superman" , "mame", 3, 0 } , +{ "Surprise Attack (Japan)" ,"surpratk" , "mame", 3, 0 } , +{ "Swarm" ,"swarm" , "mame", 3, 0 } , +{ "Swimmer (set 1)" ,"swimmer" , "mame", 3, 0 } , +{ "Swimmer (set 2)" ,"swimmera" , "mame", 3, 0 } , +{ "Syougi No Tatsujin - Master of Syougi" ,"mosyougi" , "neomame", 3, 0 } , +{ "Syusse Oozumou (Japan)" ,"ssozumo" , "mame", 3, 0 } , +{ "T.T. Mahjong" ,"ttmahjng" , "mame", 3, 0 } , +{ "TNK III (US?)" ,"tnk3" , "mame", 3, 0 } , +{ "Tac/Scan" ,"tacscan" , "mame", 1, 0 } , +{ "Tag Team Wrestling" ,"tagteam" , "mame", 3, 0 } , +{ "Tail to Nose - Great Championship" ,"tail2nos" , "mame", 1, 0 } , +{ "Tailgunner" ,"tailg" , "mame", 3, 0 } , +{ "Taisen Karate Dou (Japan VS version)" ,"karatevs" , "mame", 5, 0 } , +{ "Takeda Shingen (Japan)" ,"tshingen" , "mame", 3, 0 } , +{ "Tank (Japan)" ,"tnk3j" , "mame", 3, 0 } , +{ "Tank Battalion" ,"tankbatt" , "mame", 3, 0 } , +{ "Tank Force (Japan)" ,"tankfrcj" , "mame", 3, 0 } , +{ "Tank Force (US)" ,"tankfrce" , "mame", 3, 0 } , +{ "Tapper (Budweiser)" ,"tapper" , "mame", 5, 0 } , +{ "Tapper (Root Beer)" ,"rbtapper" , "mame", 5, 0 } , +{ "Tapper (Suntory)" ,"sutapper" , "mame", 5, 0 } , +{ "Tapper (alternate)" ,"tappera" , "mame", 5, 0 } , +{ "Targ" ,"targ" , "mame", 3, 0 } , +{ "Tatakai no Banka (Japan)" ,"trojanj" , "mame", 5, 0 } , +{ "Tazz-Mania (Scramble hardware)" ,"tazmania" , "mame", 1, 0 } , +{ "Tazz-Mania (Strategy X hardware)" ,"tazmani2" , "mame", 1, 0 } , +{ "Tecmo Knight" ,"tknight" , "mame", 3, 0 } , +{ "Tecmo World Soccer '96" ,"tws96" , "neomame", 3, 0 } , +{ "TeddyBoy Blues" ,"teddybb" , "mame", 5, 0 } , +{ "Tee'd Off" ,"teedoff" , "mame", 3, 0 } , +{ "Teenage Mutant Hero Turtles (2 Players UK)" ,"tmht2p" , "mame", 3, 0 } , +{ "Teenage Mutant Hero Turtles (4 Players UK)" ,"tmht" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles (2 Players Japan)" ,"tmnt2pj" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles (2 Players Oceania)" ,"tmnt2po" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles (4 Players Japan)" ,"tmntj" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles (4 Players US)" ,"tmnt" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles - Turtles in Time (2 Players US)" ,"tmnt22p" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles - Turtles in Time (4 Players Asia)" ,"tmnt2a" , "mame", 3, 0 } , +{ "Teenage Mutant Ninja Turtles - Turtles in Time (4 Players US)" ,"tmnt2" , "mame", 3, 0 } , +{ "Tehkan World Cup" ,"tehkanwc" , "mame", 3, 0 } , +{ "Teki Paki" ,"tekipaki" , "mame", 3, 0 } , +{ "Tempest (rev 1)" ,"tempest1" , "mame", 3, 0 } , +{ "Tempest (rev 2)" ,"tempest2" , "mame", 3, 0 } , +{ "Tempest (rev 3)" ,"tempest" , "mame", 3, 0 } , +{ "Tempest Tubes" ,"temptube" , "mame", 3, 0 } , +{ "Tenchi wo Kurau (Japan)" ,"dwj" , "mame", 3, 0 } , +{ "Tenchi wo Kurau II - Sekiheki no Tatakai (Japan)" ,"wofj" , "mame", 1, 0 } , +{ "Terminator 2 - Judgment Day (rev LA3 03/27/92)" ,"term2" , "mame", 3, 0 } , +{ "Terra Cresta (YM2203)" ,"terracra" , "mame", 3, 0 } , +{ "Terra Cresta (YM3526 set 1)" ,"terracre" , "mame", 3, 0 } , +{ "Terra Cresta (YM3526 set 2)" ,"terracrb" , "mame", 3, 0 } , +{ "Terra Force (US)" ,"terrafu" , "mame", 3, 0 } , +{ "Terra Force" ,"terraf" , "mame", 3, 0 } , +{ "Tetris (Cocktail set 1)" ,"atetcktl" , "mame", 3, 0 } , +{ "Tetris (Cocktail set 2)" ,"atetckt2" , "mame", 3, 0 } , +{ "Tetris (Japan, B-System)" ,"tetrist" , "mame", 3, 0 } , +{ "Tetris (Sega Set 1)" ,"tetris" , "mame", 3, 0 } , +{ "Tetris (Sega Set 2)" ,"tetrisa" , "mame", 3, 0 } , +{ "Tetris (Sega bootleg)" ,"tetrisbl" , "mame", 3, 0 } , +{ "Tetris (bootleg)" ,"atetrisb" , "mame", 3, 0 } , +{ "Tetris (set 1)" ,"atetris" , "mame", 3, 0 } , +{ "Tetris (set 2)" ,"atetrisa" , "mame", 3, 0 } , +{ "Thrash Rally" ,"trally" , "neomame", 3, 0 } , +{ "Three Stooges" ,"3stooges" , "mame", 3, 0 } , +{ "Three Wonders (US)" ,"3wonders" , "mame", 3, 0 } , +{ "Thunder Blaster (Japan)" ,"thndblst" , "mame", 3, 0 } , +{ "Thunder Cross (Japan)" ,"thnderxj" , "mame", 3, 0 } , +{ "Thunder Cross II (Japan)" ,"thndrx2" , "mame", 3, 0 } , +{ "Thunder Cross" ,"thunderx" , "mame", 3, 0 } , +{ "Thunder Fox (Japan)" ,"thundfox" , "mame", 3, 0 } , +{ "ThunderJaws" ,"thunderj" , "mame", 0, 0 } , +{ "Thundercade / Twin Formation" ,"tndrcade" , "mame", 3, 0 } , +{ "Tiger Heli (Japan)" ,"tigerhj" , "mame", 3, 0 } , +{ "Tiger Heli (bootleg 1)" ,"tigerhb1" , "mame", 3, 0 } , +{ "Tiger Heli (bootleg 2)" ,"tigerhb2" , "mame", 3, 0 } , +{ "Tiger Heli (set 1)" ,"tigerh" , "mame", 3, 0 } , +{ "Tiger Heli (set 2)" ,"tigerh2" , "mame", 3, 0 } , +{ "Tiger Road (US)" ,"tigeroad" , "mame", 3, 0 } , +{ "Timber" ,"timber" , "mame", 5, 0 } , +{ "Time Pilot '84 (set 1)" ,"tp84" , "mame", 3, 0 } , +{ "Time Pilot '84 (set 2)" ,"tp84a" , "mame", 3, 0 } , +{ "Time Pilot (Centuri)" ,"timepltc" , "mame", 3, 0 } , +{ "Time Pilot" ,"timeplt" , "mame", 3, 0 } , +{ "Time Scanner" ,"timscanr" , "mame", 3, 0 } , +{ "Time Soldiers (US Rev 1)" ,"timesol1" , "mame", 3, 0 } , +{ "Time Soldiers (US Rev 3)" ,"timesold" , "mame", 3, 0 } , +{ "Time Tunnel" ,"timetunl" , "mame", 3, 0 } , +{ "Tin Star, The" ,"tinstar" , "mame", 3, 0 } , +{ "Tip Top" ,"tiptop" , "mame", 3, 0 } , +{ "Toggle" ,"toggle" , "mame", 3, 0 } , +{ "Toki (US)" ,"tokiu" , "mame", 3, 0 } , +{ "Toki (bootleg)" ,"tokib" , "mame", 3, 0 } , +{ "Toki (set 1)" ,"toki" , "mame", 3, 0 } , +{ "Toki (set 2)" ,"toki2" , "mame", 3, 0 } , +{ "Toki (set 3)" ,"toki3" , "mame", 3, 0 } , +{ "Toki no Senshi - Chrono Soldier" ,"tokisens" , "mame", 3, 0 } , +{ "Tokio / Scramble Formation (bootleg)" ,"tokiob" , "mame", 3, 0 } , +{ "Tokio / Scramble Formation" ,"tokio" , "mame", 3, 0 } , +{ "Tokushu Butai Jackal (Japan)" ,"jackalj" , "mame", 3, 0 } , +{ "Tokusyu Butai UAG (Japan)" ,"tndrcadj" , "mame", 3, 0 } , +{ "Tomahawk 777 (Revision 1)" ,"tomahawk" , "mame", 3, 0 } , +{ "Tomahawk 777 (Revision 5)" ,"tomahaw5" , "mame", 3, 0 } , +{ "Toobin' (Prototype)" ,"toobinp" , "mame", 3, 0 } , +{ "Toobin' (version 2)" ,"toobin2" , "mame", 3, 0 } , +{ "Toobin' (version 3)" ,"toobin" , "mame", 3, 0 } , +{ "Top Gunner (US)" ,"topgunr" , "mame", 3, 0 } , +{ "Top Gunner (bootleg)" ,"topgunbl" , "mame", 3, 0 } , +{ "Top Hunter - Roddy & Cathy" ,"tophuntr" , "neomame", 3, 0 } , +{ "Top Player's Golf" ,"tpgolf" , "neomame", 3, 0 } , +{ "Top Racer" ,"topracer" , "mame", 3, 0 } , +{ "Top Secret (Exidy) (version 1.0)" ,"topsecex" , "mame", 3, 0 } , +{ "Top Secret (Japan)" ,"topsecrt" , "mame", 3, 0 } , +{ "Tora eno Michi (Japan)" ,"toramich" , "mame", 1, 0 } , +{ "Tornado Baseball" ,"tornbase" , "mame", 3, 0 } , +{ "Toryumon" ,"toryumon" , "mame", 1, 0 } , +{ "Total Carnage (prototype, rev 1.0 01/25/92)" ,"totcarnp" , "mame", 3, 0 } , +{ "Total Carnage (rev LA1 03/10/92)" ,"totcarn" , "mame", 3, 0 } , +{ "TouchDown Fever (Japan)" ,"tdfeverj" , "mame", 3, 0 } , +{ "TouchDown Fever" ,"tdfever" , "mame", 3, 0 } , +{ "Tough Turf (Japan)" ,"tturf" , "mame", 3, 0 } , +{ "Tough Turf (US)" ,"tturfu" , "mame", 3, 0 } , +{ "Tough Turf (bootleg)" ,"tturfbl" , "mame", 3, 0 } , +{ "Tougyuu, The (Japan)" ,"bullfgtj" , "mame", 5, 0 } , +{ "Tournament Arkanoid (US)" ,"arkatour" , "mame", 3, 0 } , +{ "Tournament Cyberball 2072" ,"cyberbt" , "mame", 3, 0 } , +{ "Tower of Druaga (set 1)" ,"todruaga" , "mame", 3, 0 } , +{ "Tower of Druaga (set 2)" ,"todruagb" , "mame", 3, 0 } , +{ "Toypop" ,"toypop" , "mame", 3, 0 } , +{ "Track & Field (Centuri)" ,"trackflc" , "mame", 3, 0 } , +{ "Track & Field" ,"trackfld" , "mame", 3, 0 } , +{ "Tranquilizer Gun" ,"tranqgun" , "mame", 3, 0 } , +{ "Traverse USA / Zippy Race" ,"travrusa" , "mame", 3, 0 } , +{ "Treasure Hunt (Japan?)" ,"treahunt" , "mame", 1, 0 } , +{ "Tri-Sports" ,"trisport" , "mame", 3, 0 } , +{ "Trigon (Japan)" ,"trigon" , "mame", 3, 0 } , +{ "Trio The Punch - Never Forget Me... (Japan)" ,"triothep" , "mame", 3, 0 } , +{ "Triple Punch" ,"triplep" , "mame", 3, 0 } , +{ "Trivial Pursuit (All Star Sports Edition)" ,"triviasp" , "mame", 3, 0 } , +{ "Trivial Pursuit (Baby Boomer Edition)" ,"triviabb" , "mame", 3, 0 } , +{ "Trivial Pursuit (Genus I)" ,"triviag1" , "mame", 3, 0 } , +{ "Trivial Pursuit (Genus II)" ,"triviag2" , "mame", 3, 0 } , +{ "Trivial Pursuit (Young Players Edition)" ,"triviayp" , "mame", 3, 0 } , +{ "Trog (prototype, rev 4.00 07/27/90)" ,"trogp" , "mame", 3, 0 } , +{ "Trog (rev LA3 02/14/91)" ,"trog3" , "mame", 3, 0 } , +{ "Trog (rev LA4 03/11/91)" ,"trog" , "mame", 3, 0 } , +{ "Trojan (Romstar)" ,"trojanr" , "mame", 5, 0 } , +{ "Trojan (US)" ,"trojan" , "mame", 5, 0 } , +{ "Tron (set 1)" ,"tron" , "mame", 5, 0 } , +{ "Tron (set 2)" ,"tron2" , "mame", 5, 0 } , +{ "Tropical Angel" ,"troangel" , "mame", 3, 0 } , +{ "Truxton / Tatsujin" ,"truxton" , "mame", 3, 0 } , +{ "Truxton II / Tatsujin II / Tatsujin Oh (Japan)" ,"tatsujn2" , "mame", 3, 0 } , +{ "Tube-It" ,"tubeit" , "mame", 3, 0 } , +{ "Tumble Pop (Japan)" ,"tumblepj" , "mame", 3, 0 } , +{ "Tumble Pop (World)" ,"tumblep" , "mame", 3, 0 } , +{ "Tumble Pop (bootleg set 1)" ,"tumblepb" , "mame", 3, 0 } , +{ "Tumble Pop (bootleg set 2)" ,"tumblep2" , "mame", 3, 0 } , +{ "Turbo (encrypted set 1)" ,"turboa" , "mame", 3, 0 } , +{ "Turbo (encrypted set 2)" ,"turbob" , "mame", 3, 0 } , +{ "Turbo Force" ,"turbofrc" , "mame", 1, 0 } , +{ "Turbo Tag (Prototype)" ,"turbotag" , "mame", 1, 0 } , +{ "Turbo" ,"turbo" , "mame", 3, 0 } , +{ "Turkey Shoot" ,"tshoot" , "mame", 3, 0 } , +{ "Turpin" ,"turpin" , "mame", 3, 0 } , +{ "Turtle Ship" ,"turtship" , "mame", 3, 0 } , +{ "Turtles" ,"turtles" , "mame", 3, 0 } , +{ "Tutankham (Stern)" ,"tutankst" , "mame", 3, 0 } , +{ "Tutankham" ,"tutankhm" , "mame", 3, 0 } , +{ "Twin Cobra (US)" ,"twincobu" , "mame", 3, 0 } , +{ "Twin Cobra (World)" ,"twincobr" , "mame", 3, 0 } , +{ "Twin Eagle (Japan)" ,"twineagl" , "mame", 3, 0 } , +{ "TwinBee" ,"twinbee" , "mame", 3, 0 } , +{ "Twinkle Star Sprites" ,"twinspri" , "neomame", 3, 0 } , +{ "Two Crude (US)" ,"twocrude" , "mame", 3, 0 } , +{ "Two Tigers" ,"twotiger" , "mame", 5, 0 } , +{ "U.N. Squadron (US)" ,"unsquad" , "mame", 3, 0 } , +{ "U.S. Classic" ,"usclssic" , "mame", 0, 0 } , +{ "U.S. Navy (Japan)" ,"cawingj" , "mame", 3, 0 } , +{ "Ufo Senshi Yohko Chan" ,"ufosensi" , "mame", 1, 0 } , +{ "Ultimate 11 / Tokuten Ou - Honoo no Libero, The" ,"ssideki4" , "neomame", 3, 0 } , +{ "Ultimate Mortal Kombat 3 (rev 1.1)" ,"umk3r11" , "mame", 3, 0 } , +{ "Ultimate Mortal Kombat 3 (rev 1.2)" ,"umk3" , "mame", 3, 0 } , +{ "Ultimate Mortal Kombat 3 Plus" ,"umk3p" , "mame", 3, 0 } , +{ "Ultraman (Japan)" ,"ultraman" , "mame", 3, 0 } , +{ "Undercover Cops (Japan)" ,"uccopsj" , "mame", 3, 0 } , +{ "Undercover Cops (World)" ,"uccops" , "mame", 3, 0 } , +{ "UniWar S" ,"uniwars" , "mame", 3, 0 } , +{ "Uo Poko (Japan)" ,"uopoko" , "mame", 3, 0 } , +{ "Up'n Down" ,"upndown" , "mame", 3, 0 } , +{ "Us vs. Them" ,"usvsthem" , "mame", 3, 0 } , +{ "V-Five (Japan)" ,"vfive" , "mame", 3, 0 } , +{ "Valtric" ,"valtric" , "mame", 1, 0 } , +{ "Van Van Car (Sanritsu)" ,"vanvans" , "mame", 3, 0 } , +{ "Van Van Car" ,"vanvan" , "mame", 3, 0 } , +{ "Vanguard (Centuri)" ,"vangrdce" , "mame", 3, 0 } , +{ "Vanguard (SNK)" ,"vanguard" , "mame", 3, 0 } , +{ "Vanguard II" ,"vangrd2" , "mame", 3, 0 } , +{ "Vapor Trail - Hyper Offence Formation (US)" ,"vaportru" , "mame", 3, 0 } , +{ "Vapor Trail - Hyper Offence Formation (World revision 1)" ,"vaportra" , "mame", 3, 0 } , +{ "Varth - Operation Thunderstorm (Japan)" ,"varthj" , "mame", 3, 0 } , +{ "Varth - Operation Thunderstorm (US)" ,"varthu" , "mame", 3, 0 } , +{ "Varth - Operation Thunderstorm (World)" ,"varth" , "mame", 3, 0 } , +{ "Vastar (set 1)" ,"vastar" , "mame", 3, 0 } , +{ "Vastar (set 2)" ,"vastar2" , "mame", 3, 0 } , +{ "Vendetta (Asia set 1)" ,"vendetta" , "mame", 3, 0 } , +{ "Vendetta (Asia set 2)" ,"vendett2" , "mame", 3, 0 } , +{ "Venture (version 4)" ,"venture4" , "mame", 3, 0 } , +{ "Venture (version 5 set 1)" ,"venture" , "mame", 3, 0 } , +{ "Venture (version 5 set 2)" ,"venture2" , "mame", 3, 0 } , +{ "Venus" ,"venus" , "mame", 3, 0 } , +{ "Victor Banana" ,"victorba" , "mame", 1, 0 } , +{ "Victory Road" ,"victroad" , "mame", 3, 0 } , +{ "Victory" ,"victory" , "mame", 1, 0 } , +{ "Video Hustler (bootleg)" ,"hustlerb" , "mame", 3, 0 } , +{ "Video Hustler" ,"hustler" , "mame", 3, 0 } , +{ "Viewpoint" ,"viewpoin" , "neomame", 3, 0 } , +{ "Vigilante (Japan)" ,"vigilntj" , "mame", 1, 0 } , +{ "Vigilante (US)" ,"vigilntu" , "mame", 1, 0 } , +{ "Vigilante (World)" ,"vigilant" , "mame", 1, 0 } , +{ "Vimana (Nova Apparate GMBH & Co)" ,"vimanan" , "mame", 3, 0 } , +{ "Vimana (set 1)" ,"vimana" , "mame", 3, 0 } , +{ "Vimana (set 2)" ,"vimana2" , "mame", 3, 0 } , +{ "Vindicators Part II" ,"vindctr2" , "mame", 3, 0 } , +{ "Vindicators" ,"vindictr" , "mame", 3, 0 } , +{ "Violence Fight (World)" ,"viofight" , "mame", 3, 0 } , +{ "Viper" ,"viper" , "mame", 3, 0 } , +{ "Voltage Fighter - Gowcaizer / Choujin Gakuen Gowcaizer" ,"gowcaizr" , "neomame", 3, 0 } , +{ "Vulcan Venture" ,"vulcan" , "mame", 3, 0 } , +{ "Vulgus (Japan?)" ,"vulgusj" , "mame", 5, 0 } , +{ "Vulgus (set 1)" ,"vulgus" , "mame", 5, 0 } , +{ "Vulgus (set 2)" ,"vulgus2" , "mame", 5, 0 } , +{ "WEC Le Mans 24" ,"wecleman" , "mame", 3, 0 } , +{ "WWF: Wrestlemania (rev 1.30)" ,"wwfmania" , "mame", 3, 0 } , +{ "Wacko" ,"wacko" , "mame", 5, 0 } , +{ "Waku Waku 7" ,"wakuwak7" , "neomame", 3, 0 } , +{ "Wanted" ,"wanted" , "mame", 3, 0 } , +{ "War of Aero - Project MEIOU" ,"wrofaero" , "mame", 3, 0 } , +{ "War of the Bugs" ,"warofbug" , "mame", 3, 0 } , +{ "War of the Worlds" ,"wotw" , "mame", 3, 0 } , +{ "Wardna no Mori (Japan)" ,"wardnerj" , "mame", 3, 0 } , +{ "Wardner (World)" ,"wardner" , "mame", 3, 0 } , +{ "Warlords" ,"warlord" , "mame", 3, 0 } , +{ "Warp & Warp" ,"warpwarp" , "mame", 3, 0 } , +{ "Warp Warp (Rock-ola set 1)" ,"warpwarr" , "mame", 3, 0 } , +{ "Warp Warp (Rock-ola set 2)" ,"warpwar2" , "mame", 3, 0 } , +{ "Warrior" ,"warrior" , "mame", 3, 0 } , +{ "Warriors of Fate (World)" ,"wof" , "mame", 1, 0 } , +{ "Water Ski" ,"waterski" , "mame", 1, 0 } , +{ "West Story" ,"weststry" , "mame", 0, 0 } , +{ "Western Express (World?)" ,"wexpress" , "mame", 3, 0 } , +{ "Western Express (bootleg)" ,"wexpresb" , "mame", 3, 0 } , +{ "Who Dunit (version 8.0)" ,"whodunit" , "mame", 3, 0 } , +{ "Whoopee (Japan) / Pipi & Bibis (World)" ,"whoopee" , "mame", 3, 0 } , +{ "Wild Fang" ,"wildfang" , "mame", 3, 0 } , +{ "Wild Western (set 1)" ,"wwestern" , "mame", 3, 0 } , +{ "Wild Western (set 2)" ,"wwester1" , "mame", 3, 0 } , +{ "Willow (Japan, English)" ,"willow" , "mame", 3, 0 } , +{ "Willow (Japan, Japanese)" ,"willowj" , "mame", 3, 0 } , +{ "Windjammers / Flying Power Disc" ,"wjammers" , "neomame", 3, 0 } , +{ "Wiping" ,"wiping" , "mame", 3, 0 } , +{ "Wise Guy" ,"wiseguy" , "mame", 1, 0 } , +{ "Wiz (Taito)" ,"wizt" , "mame", 3, 0 } , +{ "Wiz" ,"wiz" , "mame", 3, 0 } , +{ "Wizard of Wor" ,"wow" , "mame", 3, 0 } , +{ "Wonder 3 (Japan)" ,"wonder3" , "mame", 3, 0 } , +{ "Wonder Boy (not encrypted)" ,"wboyu" , "mame", 3, 0 } , +{ "Wonder Boy (set 1)" ,"wboy" , "mame", 5, 0 } , +{ "Wonder Boy (set 2)" ,"wboy2" , "mame", 5, 0 } , +{ "Wonder Boy (set 3)" ,"wboy3" , "mame", 5, 0 } , +{ "Wonder Boy (set 4 not encrypted)" ,"wboy4u" , "mame", 3, 0 } , +{ "Wonder Boy (set 4)" ,"wboy4" , "mame", 5, 0 } , +{ "Wonder Boy Deluxe" ,"wbdeluxe" , "mame", 3, 0 } , +{ "Wonder Boy III - Monster Lair (bootleg)" ,"wb3bl" , "mame", 3, 0 } , +{ "Wonder Boy III - Monster Lair (set 1)" ,"wb3" , "mame", 3, 0 } , +{ "Wonder Boy III - Monster Lair (set 2)" ,"wb3a" , "mame", 3, 0 } , +{ "Wonder Boy in Monster Land (Japan not encrypted)" ,"wbmlju" , "mame", 5, 0 } , +{ "Wonder Boy in Monster Land (Japan set 1)" ,"wbmlj" , "mame", 5, 0 } , +{ "Wonder Boy in Monster Land (Japan set 2)" ,"wbmlj2" , "mame", 5, 0 } , +{ "Wonder Boy in Monster Land" ,"wbml" , "mame", 5, 0 } , +{ "Wonder Momo" ,"wndrmomo" , "mame", 3, 0 } , +{ "World Court (Japan)" ,"wldcourt" , "mame", 3, 0 } , +{ "World Cup 90" ,"wc90" , "mame", 3, 0 } , +{ "World Heroes 2 Jet" ,"wh2j" , "neomame", 3, 0 } , +{ "World Heroes 2" ,"wh2" , "neomame", 3, 0 } , +{ "World Heroes Perfect" ,"whp" , "neomame", 3, 0 } , +{ "World Heroes" ,"wh1" , "neomame", 3, 0 } , +{ "World Series: The Season" ,"wseries" , "mame", 1, 0 } , +{ "World Soccer Finals" ,"wsf" , "mame", 3, 0 } , +{ "World Stadium '89 (Japan)" ,"ws89" , "mame", 3, 0 } , +{ "World Stadium '90 (Japan)" ,"ws90" , "mame", 3, 0 } , +{ "World Stadium (Japan)" ,"ws" , "mame", 3, 0 } , +{ "World Tennis" ,"wtennis" , "mame", 3, 0 } , +{ "World Wars (Japan)" ,"worldwar" , "mame", 3, 0 } , +{ "Wrestle War" ,"wrestwar" , "mame", 1, 0 } , +{ "X Multiply (Japan)" ,"xmultipl" , "mame", 1, 0 } , +{ "X-Men (2 Players Japan)" ,"xmen2pj" , "mame", 3, 0 } , +{ "X-Men (4 Players)" ,"xmen" , "mame", 3, 0 } , +{ "X-Men (6 Players Euro)" ,"xmen6p" , "mame", 3, 0 } , +{ "Xain'd Sleena (bootleg)" ,"xsleenab" , "mame", 3, 0 } , +{ "Xain'd Sleena" ,"xsleena" , "mame", 3, 0 } , +{ "Xenophobe" ,"xenophob" , "mame", 3, 0 } , +{ "Xevios" ,"xevios" , "mame", 3, 0 } , +{ "Xevious (Atari)" ,"xeviousa" , "mame", 3, 0 } , +{ "Xevious (Namco)" ,"xevious" , "mame", 3, 0 } , +{ "Xybots" ,"xybots" , "mame", 3, 0 } , +{ "Yam! Yam!?" ,"yamyam" , "mame", 1, 0 } , +{ "Yamato (set 1)" ,"yamato" , "mame", 5, 0 } , +{ "Yamato (set 2)" ,"yamato2" , "mame", 5, 0 } , +{ "Yankee DO!" ,"yankeedo" , "mame", 3, 0 } , +{ "Yes/No Sinri Tokimeki Chart" ,"yesnoj" , "mame", 3, 0 } , +{ "Yie Ar Kung-Fu (set 1)" ,"yiear" , "mame", 3, 0 } , +{ "Yie Ar Kung-Fu (set 2)" ,"yiear2" , "mame", 3, 0 } , +{ "Yokai Douchuuki (Japan new version)" ,"youkaidk" , "mame", 3, 0 } , +{ "Yokai Douchuuki (Japan old version)" ,"yokaidko" , "mame", 3, 0 } , +{ "Yosaku To Donbee (bootleg)" ,"yosakdon" , "mame", 3, 0 } , +{ "Youma Ninpou Chou (Japan)" ,"youma" , "mame", 3, 0 } , +{ "Yuuyu no Quiz de GO!GO! (Japan)" ,"yuyugogo" , "mame", 1, 0 } , +{ "Zarzon" ,"zarzon" , "mame", 3, 0 } , +{ "Zaxxon (set 1)" ,"zaxxon" , "mame", 3, 0 } , +{ "Zaxxon (set 2)" ,"zaxxon2" , "mame", 3, 0 } , +{ "Zed Blade / Operation Ragnarok" ,"zedblade" , "neomame", 3, 0 } , +{ "Zektor" ,"zektor" , "mame", 1, 0 } , +{ "Zero Time" ,"zerotime" , "mame", 3, 0 } , +{ "Zero Wing" ,"zerowing" , "mame", 3, 0 } , +{ "Zero Zone" ,"zerozone" , "mame", 3, 0 } , +{ "Zig Zag (Dig Dug hardware)" ,"dzigzag" , "mame", 3, 0 } , +{ "Zig Zag (Galaxian hardware, set 1)" ,"zigzag" , "mame", 3, 0 } , +{ "Zig Zag (Galaxian hardware, set 2)" ,"zigzag2" , "mame", 3, 0 } , +{ "Zing Zing Zip" ,"zingzip" , "mame", 3, 0 } , +{ "Zoar" ,"zoar" , "mame", 3, 0 } , +{ "Zodiack" ,"zodiack" , "mame", 1, 0 } , +{ "Zoo Keeper (set 1)" ,"zookeep" , "mame", 3, 0 } , +{ "Zoo Keeper (set 2)" ,"zookeep2" , "mame", 3, 0 } , +{ "Zoo Keeper (set 3)" ,"zookeep3" , "mame", 3, 0 } , +{ "Zwackery" ,"zwackery" , "mame", 3, 0 } , +{ "Zzyzzyxx (set 1)" ,"zzyzzyxx" , "mame", 3, 0 } , +{ "Zzyzzyxx (set 2)" ,"zzyzzyx2" , "mame", 3, 0 } }; -#endif \ No newline at end of file +#endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/mame2003/mame2003.c -> libretro-mame2003-0~git20210529.tar.xz/src/mame2003/mame2003.c
Changed
@@ -6,11 +6,13 @@ *********************************************************************/ +#include <stdio.h> #include <stdint.h> #include <string/stdstring.h> #include <libretro.h> #include <file/file_path.h> #include <math.h> +#include <string.h> #if (HAS_DRZ80 || HAS_CYCLONE) #include "frontend_list.h" @@ -508,15 +510,15 @@ char cfg_file_path[PATH_MAX_LENGTH]; char buffer[PATH_MAX_LENGTH]; osd_get_path(FILETYPE_CONFIG, buffer); - snprintf(cfg_file_path, PATH_MAX_LENGTH, "%s%s%s.cfg", buffer, path_default_slash(), options.romset_filename_noext); + sprintf(cfg_file_path, "%s%s%s.cfg", buffer, PATH_DEFAULT_SLASH(), options.romset_filename_noext); buffer[0] = '\0'; if(path_is_valid(cfg_file_path)) { if(!remove(cfg_file_path) == 0) - snprintf(buffer, PATH_MAX_LENGTH, "%s.cfg exists but cannot be deleted!\n", options.romset_filename_noext); + sprintf(buffer, "%s.cfg exists but cannot be deleted!\n", options.romset_filename_noext); else - snprintf(buffer, PATH_MAX_LENGTH, "%s.cfg exists but cannot be deleted!\n", options.romset_filename_noext); + sprintf(buffer, "%s.cfg exists but cannot be deleted!\n", options.romset_filename_noext); } log_cb(RETRO_LOG_INFO, LOGPRE "%s Reloading input maps.\n", buffer); usrintf_showmessage_secs(4, "%s Reloading input maps.", buffer); @@ -600,7 +602,7 @@ break; case OPT_VECTOR_FLICKER: - options.vector_flicker = (int)(2.55 * atof(var.value)); /* why 2.55? must be an old family recipe */ + options.vector_flicker = atof(var.value); break; case OPT_VECTOR_INTENSITY: @@ -696,7 +698,7 @@ if ( (Machine->drv->frames_per_second * 1000 < options.samplerate) || ( Machine->drv->frames_per_second < 60) ) { info->timing.sample_rate = Machine->drv->frames_per_second * 1000; - log_cb(RETRO_LOG_INFO, LOGPRE "Sample timing rate too high for framerate required dropping to %f", Machine->drv->frames_per_second * 1000); + log_cb(RETRO_LOG_INFO, LOGPRE "Sample timing rate too high for framerate required dropping to %f\n", Machine->drv->frames_per_second * 1000); } else @@ -765,9 +767,27 @@ { 0, 0, 0, 0, NULL } }; +static void remove_slash (char* temp) +{ + int i; + + for(i=0; temp[i] != '\0'; ++i); + + log_cb(RETRO_LOG_INFO, LOGPRE "Check for trailing slash in path: %s\n", temp); + + if( (temp[i-1] == '/' || temp[i-1] == '\\') && (i > 1) ) + { + temp[i-1] = 0; + log_cb(RETRO_LOG_INFO, LOGPRE "Removed a trailing slash in path: %s\n", temp); + } + else + log_cb(RETRO_LOG_INFO, LOGPRE "Trailing slash removal was not necessary for path given.\n"); +} + bool retro_load_game(const struct retro_game_info *game) { - int i, driverIndex = 0; + int i; + int driverIndex = 0; int port_index; char *driver_lookup = NULL; @@ -777,33 +797,32 @@ return false; } - log_cb(RETRO_LOG_INFO, LOGPRE "Content path: %s.\n", game->path); + log_cb(RETRO_LOG_INFO, LOGPRE "Full content path %s\n", game->path); if(!path_is_valid(game->path)) { log_cb(RETRO_LOG_ERROR, LOGPRE "Content path is not valid. Exiting!"); return false; } - - driver_lookup = strdup(path_basename(game->path)); + log_cb(RETRO_LOG_INFO, LOGPRE "Git Version %s\n",GIT_VERSION); + driver_lookup = auto_strdup(path_basename(game->path)); path_remove_extension(driver_lookup); - log_cb(RETRO_LOG_INFO, LOGPRE "Content lookup name: %s.\n", driver_lookup); + log_cb(RETRO_LOG_INFO, LOGPRE "Content lookup name: %s\n", driver_lookup); for (driverIndex = 0; driverIndex < total_drivers; driverIndex++) { const struct GameDriver *needle = drivers[driverIndex]; - if ((strcasecmp(driver_lookup, needle->description) == 0) - || (strcasecmp(driver_lookup, needle->name) == 0) ) + if ( strcasecmp(driver_lookup, needle->name) == 0 ) { - log_cb(RETRO_LOG_INFO, LOGPRE "Driver index counter: %d. Matched game driver: %s.\n", driverIndex, needle->name); + log_cb(RETRO_LOG_INFO, LOGPRE "Driver index counter: %d. Matched game driver: %s\n", driverIndex, needle->name); game_driver = needle; options.romset_filename_noext = driver_lookup; break; } if(driverIndex == total_drivers -2) // we could fix the total drives in drivers c but the it pointless its taken into account here { - log_cb(RETRO_LOG_ERROR, LOGPRE "Driver index counter: %d. Game driver not found for %s!\n", driverIndex, needle->name); + log_cb(RETRO_LOG_ERROR, LOGPRE "Driver index counter: %d. Game driver not found for %s!\n", driverIndex, driver_lookup); return false; } } @@ -845,7 +864,7 @@ default: break; } - + break; } } @@ -864,7 +883,7 @@ #endif { *type=CPU_CYCLONE; - log_cb(RETRO_LOG_INFO, LOGPRE "Replaced CPU_CYCLONE\n"); + log_cb(RETRO_LOG_INFO, LOGPRE "Replaced CPU_CYCLONE\n"); } if(!(*type)){ break; @@ -883,7 +902,7 @@ if (type==CPU_Z80) { *type=CPU_DRZ80; - log_cb(RETRO_LOG_INFO, LOGPRE "Replaced Z80\n"); + log_cb(RETRO_LOG_INFO, LOGPRE "Replaced Z80\n"); } } } @@ -897,7 +916,7 @@ if (type==CPU_Z80 && Machine->drv->cpu[i].cpu_flags&CPU_AUDIO_CPU) { *type=CPU_DRZ80; - log_cb(RETRO_LOG_INFO, LOGPRE "Replaced Z80 sound\n"); + log_cb(RETRO_LOG_INFO, LOGPRE "Replaced Z80 sound\n"); } } @@ -908,7 +927,7 @@ set_content_flags(); - options.libretro_content_path = strdup(game->path); + options.libretro_content_path = auto_strdup(game->path); path_basedir(options.libretro_content_path); /* Get system directory from frontend */ @@ -925,10 +944,15 @@ environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY,&options.libretro_save_path); if (options.libretro_save_path == NULL || options.libretro_save_path[0] == '\0') { - log_cb(RETRO_LOG_INFO, LOGPRE "libretro save path not set by frontent, using content path\n"); + log_cb(RETRO_LOG_INFO, LOGPRE "libretro save path not set by frontend, using content path\n"); options.libretro_save_path = options.libretro_content_path; } + /* Remove trailing slashes for specified systems */ + remove_slash(options.libretro_content_path); + remove_slash(options.libretro_system_path); + remove_slash(options.libretro_save_path); + log_cb(RETRO_LOG_INFO, LOGPRE "content path: %s\n", options.libretro_content_path); log_cb(RETRO_LOG_INFO, LOGPRE " system path: %s\n", options.libretro_system_path); log_cb(RETRO_LOG_INFO, LOGPRE " save path: %s\n", options.libretro_save_path); @@ -953,7 +977,17 @@ extern struct GameDriver driver_stvbios; const struct InputPortTiny *input = game_driver->input_ports; - extern const char* ost_drivers[]; + + /************ DRIVERS WITH ALTERNATE SOUNDTRACKS ************/ + for( i = 0; Machine->drv->sound[i].sound_type && i < MAX_SOUND; i++ ) + { + if (Machine->drv->sound[i].tag) + if (strcmp("OST Samples", Machine->drv->sound[i].tag) == 0) + { + options.content_flags[CONTENT_ALT_SOUND] = true; + log_cb(RETRO_LOG_INFO, LOGPRE "Content has an alternative audio option controlled via core option.\n"); + } + } /************ DRIVERS WITH MULTIPLE BIOS OPTIONS ************/ if (game_driver->clone_of == &driver_neogeo @@ -976,18 +1010,6 @@ log_cb(RETRO_LOG_INFO, LOGPRE "Content identified as \"Die Hard: Arcade\". BIOS will be set to \"us\".\n"); } - /************ DRIVERS WITH ALTERNATE SOUNDTRACKS ************/ - while(ost_drivers[i]) - { - if(strcmp(ost_drivers[i], game_driver->name) == 0) - { - options.content_flags[CONTENT_ALT_SOUND] = true; - log_cb(RETRO_LOG_INFO, LOGPRE "Content has an alternative audio option controlled via core option.\n"); - break; - } - i++; - } - /************ DRIVERS WITH VECTOR VIDEO DISPLAYS ************/ if(Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) {
View file
libretro-mame2003-0~git20200805.tar.xz/src/mame2003/mame2003.h -> libretro-mame2003-0~git20210529.tar.xz/src/mame2003/mame2003.h
Changed
@@ -14,16 +14,10 @@ */ #include <retro_inline.h> -#if defined(__CELLOS_LV2__) -#include <sys/fs_external.h> -#endif - #include <limits.h> #ifndef PATH_MAX_LENGTH -#if defined(__CELLOS_LV2__) -#define PATH_MAX_LENGTH CELL_FS_MAX_FS_PATH_LENGTH -#elif defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(ORBIS) +#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(ORBIS) || defined(__PS3__) #define PATH_MAX_LENGTH 512 #else #define PATH_MAX_LENGTH 4096
View file
libretro-mame2003-0~git20200805.tar.xz/src/mame2003/osd_cpu.h -> libretro-mame2003-0~git20210529.tar.xz/src/mame2003/osd_cpu.h
Changed
@@ -61,7 +61,7 @@ #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif #else -#if !defined(__CELLOS_LV2__) +#if !defined(__PS3__) #include <strings.h> #endif #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/palette.h -> libretro-mame2003-0~git20210529.tar.xz/src/palette.h
Changed
@@ -83,6 +83,7 @@ typedef UINT32 pen_t; typedef UINT32 rgb_t; +typedef UINT16 rgb15_t; @@ -251,6 +252,112 @@ void palette_init_black_and_white(UINT16 *colortable, const UINT8 *color_prom); void palette_init_RRRR_GGGG_BBBB(UINT16 *colortable, const UINT8 *color_prom); + + +/*************************************************************************** + static INLINE FUNCTIONS +***************************************************************************/ + +/*------------------------------------------------- + rgb_to_rgb15 - convert an RGB triplet to + a 15-bit OSD-specified RGB value +-------------------------------------------------*/ + +static INLINE rgb15_t rgb_to_rgb15(rgb_t rgb) +{ + return ((RGB_RED(rgb) >> 3) << 10) | ((RGB_GREEN(rgb) >> 3) << 5) | ((RGB_BLUE(rgb) >> 3) << 0); +} + + +/*------------------------------------------------- + rgb_clamp - clamp an RGB component to 0-255 +-------------------------------------------------*/ + +static INLINE UINT8 rgb_clamp(INT32 value) +{ + if (value < 0) + return 0; + if (value > 255) + return 255; + return value; +} + + +/*------------------------------------------------- + pal1bit - convert a 1-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal1bit(UINT8 bits) +{ + return (bits & 1) ? 0xff : 0x00; +} + + +/*------------------------------------------------- + pal2bit - convert a 2-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal2bit(UINT8 bits) +{ + bits &= 3; + return (bits << 6) | (bits << 4) | (bits << 2) | bits; +} + + +/*------------------------------------------------- + pal3bit - convert a 3-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal3bit(UINT8 bits) +{ + bits &= 7; + return (bits << 5) | (bits << 2) | (bits >> 1); +} + + +/*------------------------------------------------- + pal4bit - convert a 4-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal4bit(UINT8 bits) +{ + bits &= 0xf; + return (bits << 4) | bits; +} + + +/*------------------------------------------------- + pal5bit - convert a 5-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal5bit(UINT8 bits) +{ + bits &= 0x1f; + return (bits << 3) | (bits >> 2); +} + + +/*------------------------------------------------- + pal6bit - convert a 6-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal6bit(UINT8 bits) +{ + bits &= 0x3f; + return (bits << 2) | (bits >> 4); +} + + +/*------------------------------------------------- + pal7bit - convert a 7-bit value to 8 bits +-------------------------------------------------*/ + +static INLINE UINT8 pal7bit(UINT8 bits) +{ + bits &= 0x7f; + return (bits << 1) | (bits >> 6); +} + #ifdef __cplusplus } #endif
View file
libretro-mame2003-0~git20200805.tar.xz/src/sndhrdw/dcs.c -> libretro-mame2003-0~git20210529.tar.xz/src/sndhrdw/dcs.c
Changed
@@ -647,8 +647,8 @@ void dcs_reset_w(int state) { - /* going high halts the CPU */ - if (state) + /* going low halts the CPU */ + if (!state) { #if 0 logerror("%08x: DCS reset = %d\n", activecpu_get_pc(), state); @@ -659,7 +659,7 @@ cpu_set_reset_line(dcs_cpunum, ASSERT_LINE); } - /* going low resets and reactivates the CPU */ + /* going high resets and reactivates the CPU */ else cpu_set_reset_line(dcs_cpunum, CLEAR_LINE); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/sound/dac.h -> libretro-mame2003-0~git20210529.tar.xz/src/sound/dac.h
Changed
@@ -5,7 +5,7 @@ extern "C" { #endif -#define MAX_DAC 4 +#define MAX_DAC 8 struct DACinterface {
View file
libretro-mame2003-0~git20200805.tar.xz/src/sound/k051649.c -> libretro-mame2003-0~git20210529.tar.xz/src/sound/k051649.c
Changed
@@ -142,7 +142,7 @@ } /* reset all the voices */ - for (i=0; i>5; i++) { + for (i=0; i<5; i++) { voice[i].frequency = 0; voice[i].volume = 0; voice[i].counter = 0;
View file
libretro-mame2003-0~git20200805.tar.xz/src/sound/streams.c -> libretro-mame2003-0~git20210529.tar.xz/src/sound/streams.c
Changed
@@ -67,7 +67,7 @@ Req = (R1*(R2+R3))/(R1+R2+R3); - K = 0x10000 * exp(-1 / (Req * C) / sample_rate); + K = 0x10000 * (1 - (exp(-1 / (Req * C) / sample_rate))); buf[0] = buf[0] + (memory[channel] - buf[0]) * K / 0x10000;
View file
libretro-mame2003-0~git20200805.tar.xz/src/usrintrf.c -> libretro-mame2003-0~git20210529.tar.xz/src/usrintrf.c
Changed
@@ -3082,7 +3082,7 @@ menu_item[menu_total] = ui_getstring (UI_memorycard); menu_action[menu_total++] = UI_MEMCARD; } -#if !defined(WIIU) && !defined(GEKKO) && !defined(__CELLOS_LV2__) && !defined(__SWITCH__) && !defined(PSP) && !defined(VITA) && !defined(__GCW0__) && !defined(__EMSCRIPTEN__) && !defined(_XBOX) +#if !defined(WIIU) && !defined(GEKKO) && !defined(__SWITCH__) && !defined(PSP) && !defined(VITA) && !defined(__GCW0__) && !defined(__EMSCRIPTEN__) && !defined(_XBOX) /* don't offer to generate_xml_dat on consoles where it can't be used */ menu_item[menu_total] = ui_getstring (UI_generate_xml_dat); menu_action[menu_total++] = UI_GENERATE_XML_DAT;
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/ambush_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/ambush_vidhrdw.c
Changed
@@ -76,7 +76,7 @@ col = colorram[((sy & 0x1c) << 3) + sx]; - if ((col & 0x10) != priority) continue; + if (priority & ~col) continue; scroll = ~ambush_scrollram[sx]; @@ -107,7 +107,7 @@ fillbitmap(bitmap,Machine->pens[0],&Machine->visible_area); - /* Draw the background priority characters */ + /* Draw the characters */ draw_chars(bitmap, 0x00); @@ -176,6 +176,6 @@ } - /* Draw the foreground priority characters */ + /* Draw the foreground priority characters over the sprites */ draw_chars(bitmap, 0x10); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/armedf_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/armedf_vidhrdw.c
Changed
@@ -37,7 +37,7 @@ return (col&0x1f)*32+row+0x400*(col/32); default: - return 32*(31-row)+(col&0x1f)+0x400*(col/32); + return 32*(31-row)+(col&0x1f)+0x800*(col/32); } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/cheekyms_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/cheekyms_vidhrdw.c
Changed
@@ -12,9 +12,8 @@ #include "vidhrdw/generic.h" -static int redraw_man = 0; static int man_scroll = -1; -static data8_t sprites[0x20]; +static UINT8 sprites[0x20]; static int char_palette = 0; @@ -22,44 +21,21 @@ { int i,j,bit,r,g,b; - for (i = 0; i < 3; i++) + for (i = 0; i < 6; i++) { - const unsigned char* color_prom_save = color_prom; - - /* lower nibble */ - for (j = 0;j < Machine->drv->total_colors/6;j++) - { - /* red component */ - bit = (color_prom[0] >> 0) & 0x01; - r = 0xff * bit; - /* green component */ - bit = (color_prom[0] >> 1) & 0x01; - g = 0xff * bit; - /* blue component */ - bit = (color_prom[0] >> 2) & 0x01; - b = 0xff * bit; - - palette_set_color(((i*2)*Machine->drv->total_colors/6)+j,r,g,b); - color_prom++; - } - - color_prom = color_prom_save; - - /* upper nibble */ - for (j = 0;j < Machine->drv->total_colors/6;j++) + for (j = 0;j < 0x20;j++) { /* red component */ - bit = (color_prom[0] >> 4) & 0x01; + bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+0)) & 0x01; r = 0xff * bit; /* green component */ - bit = (color_prom[0] >> 5) & 0x01; + bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+1)) & 0x01; g = 0xff * bit; /* blue component */ - bit = (color_prom[0] >> 6) & 0x01; + bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+2)) & 0x01; b = 0xff * bit; - palette_set_color(((i*2+1)*Machine->drv->total_colors/6)+j,r,g,b); - color_prom++; + palette_set_color((i*0x20)+j, r,g,b); } } } @@ -73,37 +49,27 @@ WRITE_HANDLER( cheekyms_port_40_w ) { - static int last_dac = -1; - - /* The lower bits probably trigger sound samples */ - - if (last_dac != (data & 0x80)) - { - last_dac = data & 0x80; - - DAC_data_w(0, last_dac ? 0x80 : 0); - } + DAC_data_w(0, BIT(data, 7) << 7); /* tune */ + DAC_data_w(1, BIT(data, 6) << 6); /* mouse eating cheese */ + DAC_data_w(2, BIT(data, 5) << 5); /* hammer */ + DAC_data_w(3, BIT(data, 4) << 4); /* mouse died */ + DAC_data_w(4, BIT(data, 3) << 3); /* mystery died */ + DAC_data_w(5, BIT(data, 2) << 2); /* mouse appears */ + DAC_data_w(6, BIT(data, 1) << 1); /* mystery appears */ } WRITE_HANDLER( cheekyms_port_80_w ) { - int new_man_scroll; - /* Bits 0-1 Sound enables, not sure which bit is which */ /* Bit 2 is interrupt enable */ interrupt_enable_w(offset, data & 0x04); /* Bit 3-5 Man scroll amount */ - new_man_scroll = (data >> 3) & 0x07; - if (man_scroll != new_man_scroll) - { - man_scroll = new_man_scroll; - redraw_man = 1; - } + man_scroll = (data >> 3) & 0x07; - /* Bit 6 is palette select (Selects either 0 = PROM M8, 1 = PROM M9) */ + /* Bit 6 is palette select (Selects either 0 = PROM M9, 1 = PROM M8) */ set_vh_global_attribute(&char_palette, (data >> 2) & 0x10); /* Bit 7 is screen flip */ @@ -112,28 +78,15 @@ -/*************************************************************************** - - Draw the game screen in the given mame_bitmap. - Do NOT call osd_update_display() from this function, it will be called by - the main emulation engine. - -***************************************************************************/ VIDEO_UPDATE( cheekyms ) { int offs; - if (get_vh_global_attribute_changed()) - { - memset(dirtybuffer, 1, videoram_size); - } - - - fillbitmap(bitmap,Machine->pens[0],&Machine->visible_area); + fillbitmap(bitmap,Machine->pens[0],cliprect); /* Draw the sprites first, because they're supposed to appear below - the characters */ + the characters */ for (offs = 0; offs < sizeof(sprites)/sizeof(sprites[0]); offs += 4) { int v1, sx, sy, col, code; @@ -141,7 +94,7 @@ v1 = sprites[offs + 0]; sy = sprites[offs + 1]; sx = 256 - sprites[offs + 2]; - col = (sprites[offs + 3] & 0x07); + col = (~sprites[offs + 3] & 0x07); if (!(sprites[offs + 3] & 0x08)) continue; @@ -155,10 +108,11 @@ } drawgfx(bitmap,Machine->gfx[1], - code,col, + code, + col, 0,0, sx,sy, - &Machine->visible_area,TRANSPARENCY_PEN,0); + cliprect,TRANSPARENCY_PEN,0); } else { @@ -167,57 +121,56 @@ col, 0,0, sx,sy, - &Machine->visible_area,TRANSPARENCY_PEN,0); + cliprect,TRANSPARENCY_PEN,0); drawgfx(bitmap,Machine->gfx[1], code + 0x21, col, 0,0, sx + 8*(v1 & 2),sy + 8*(~v1 & 2), - &Machine->visible_area,TRANSPARENCY_PEN,0); + cliprect,TRANSPARENCY_PEN,0); } } - /* for every character in the Video RAM, check if it has been modified */ - /* since last time and update it accordingly. */ + for (offs = videoram_size - 1;offs >= 0;offs--) { - int sx,sy,man_area; + int sx,sy,man_area,color; sx = offs % 32; sy = offs / 32; - if (flip_screen) + + man_area = ((sy >= 6) && (sy <= 26) && (sx >= 8) && (sx <= 12)); + + if (sx >= 30) { - man_area = ((sy >= 5) && (sy <= 25) && (sx >= 8) && (sx <= 12)); + if (sy < 12) + color = 0x15; + else if (sy < 20) + color = 0x16; + else + color = 0x14; } else { - man_area = ((sy >= 6) && (sy <= 26) && (sx >= 8) && (sx <= 12)); + color = ((sx >> 1) & 0x0f) + char_palette; + if (sy == 4 || sy == 27) + color = 0xc + char_palette; } - if (dirtybuffer[offs] || - (redraw_man && man_area)) + if (flip_screen) { - dirtybuffer[offs] = 0; - - if (flip_screen) - { - sx = 31 - sx; - sy = 31 - sy; - } - - drawgfx(tmpbitmap,Machine->gfx[0], - videoram[offs], - 0 + char_palette, - flip_screen,flip_screen, - 8*sx, 8*sy - (man_area ? man_scroll : 0), - &Machine->visible_area,TRANSPARENCY_NONE,0); + sx = 31 - sx; + sy = 31 - sy; } - } - redraw_man = 0; + drawgfx(bitmap,Machine->gfx[0], + videoram[offs], + color, + flip_screen,flip_screen, + 8*sx, 8*sy - (man_area ? man_scroll : 0), + cliprect,TRANSPARENCY_PEN,0); + } - /* copy the temporary bitmap to the screen over the sprites */ - copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->visible_area,TRANSPARENCY_PEN,Machine->pens[4*char_palette]); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/dassault_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/dassault_vidhrdw.c
Changed
@@ -134,7 +134,7 @@ colour, fx,fy, x,y + mult * multi, - &Machine->visible_area,trans,0,pmask,1<<bank); + &Machine->visible_area,trans,0,pmask,1<<bank,0); multi--; }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/deco16ic.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/deco16ic.c
Changed
@@ -1,141 +1,141 @@ /******************************************************************************** - Data East video emulation & information by Bryan McPhail, mish@tendril.co.uk (c) 2000-2003 Bryan McPhail - Please send me any additions to the table below. - - - Game Mask Rom CPU Sprites Playfields IO/Protection Other - ============================================================================================== - Vapor Trail/Kuhga MAA 59 MXC-06 55, 55 - Crude Buster/Two Crude MAB 59 52 55, 55 - Dark Seal/Gate Of Doom MAC 59 52 55, 55 - Edward Randy MAD 59 52 55, 55 60 - Super Burger Time MAE 59 52 55 - Mutant Fighter/Death Brade MAF 59 52 55, 56 66 - Caveman Ninja/Joe & Mac MAG 59 52 55, 55 104 - Robocop 2 MAH 59 52 55, 55 75 - Desert Assault/Thunderzone MAJ 59,59 52,52 55, 55 - China Town MAK 59 52 55 - Rogha/Wolf Fang MAM 59 52,52,71,71 55, 56 104 113 - Captain America MAN 101 52,71 56, 56 75 - Tumblepop MAP 59 52 56 - Dragon Gun MAR 101 ? 74, 74 146 113,186,187 - Wizard Fire/Dark Seal 2 MAS 59 52,52,71,71 74, 74 104 113 - Funky Jet MAT 59 52 74 146 - Nitro Ball MAV 59 52,52,71,71 56, 74 146 113 - Diet GoGo MAY 102 52,71 141 104 113 - Pocket Gal DX MAZ 102 52,71 56 104 153 - Boogie Wings MBD 102 52,52,71,71 141, 141 104 113,99,200 -1 Double Wings MBE 102 52 141 104 - Fighter's History MBF 101 52,153 56,74 [Scratched] 200, 153, 170 - Heavy Smash MBG 156 52 141 153*3 - Night Slashers MBH 156 52,52,52,153,153,153 74, 141 104 99,200 - Locked N Loaded MBM 101 ? 74,74 146 113,186,187 - Joe & Mac Return MBN 156 52 141 223,223 -2 Charlie Ninja MBR 156 52 141 223,223 - World Cup Volleyball 95 MBX 156 52 141 ? - Backfire! MBZ 156 52,52,153,153 141,141 ? 223 -2* Ganbare Gonta MCB 156 52 141 223,223 - Chain Reaction/Magical Drop MCC 156 52 141 223,223 - Dunk Dream 95 MCE 156 [MLC] [MLC] -2 Osman/Cannon Dancer MCF 156 52 141 223,223 - Avengers In Galactic Storm MCG SH2 [MLC] [MLC] - Stadium Hero 96 MCM 156 [MLC] [MLC] 146 - - Sotsugyo Shousho 59 52 74 146? - Lemmings --- 59 52,52,71,71 None 75 - Tattoo Assassins --- 101 52,52,71,71 141, 141? ? 99, ? + Data East video emulation & information by Bryan McPhail, mish@tendril.co.uk (c) 2000-2005 Bryan McPhail + Please send me any additions to the table below. + + + Game Mask Rom CPU Sprites Playfields IO/Protection Other + ============================================================================================== + Vapor Trail/Kuhga MAA 59 MXC-06 55, 55 + Crude Buster/Two Crude MAB 59 52 55, 55 + Dark Seal/Gate Of Doom MAC 59 52 55, 55 + Edward Randy MAD 59 52 55, 55 60 + Super Burger Time MAE 59 52 55 + Mutant Fighter/Death Brade MAF 59 52 55, 56 66 + Caveman Ninja/Joe & Mac MAG 59 52 55, 55 104 + Robocop 2 MAH 59 52 55, 55 75 + Desert Assault/Thunderzone MAJ 59,59 52,52 55, 55 + China Town MAK 59 52 55 + Rogha/Wolf Fang MAM 59 52,52,71,71 55, 56 104 113 + Captain America MAN 101 52,71 56, 56 75 + Tumblepop MAP 59 52 56 + Dragon Gun MAR 101 ? 74, 74 146 113,186,187 + Wizard Fire/Dark Seal 2 MAS 59 52,52,71,71 74, 74 104 113 + Funky Jet MAT 59 52 74 146 + Nitro Ball MAV 59 52,52,71,71 56, 74 146 113 + Diet GoGo MAY 102 52,71 141 104 113 + Pocket Gal DX MAZ 102 52,71 56 104 153 + Boogie Wings MBD 102 52,52,71,71 141, 141 104 113,99,200 +1 Double Wings MBE 102 52 141 104 + Fighter's History MBF 101 52,153 56,74 [Scratched] 200, 153, 170 + Heavy Smash MBG 156 52 141 153*3 + Night Slashers MBH 156 52,52,52,153,153,153 74, 141 104 99,200 + Locked N Loaded MBM 101 ? 74,74 146 113,186,187 + Joe & Mac Return MBN 156 52 141 223,223 +2 Charlie Ninja MBR 156 52 141 223,223 + World Cup Volleyball 95 MBX 156 52 141 ? + Backfire! MBZ 156 52,52,153,153 141,141 ? 223 +2* Ganbare Gonta MCB 156 52 141 223,223 + Chain Reaction/Magical Drop MCC 156 52 141 223,223 + Dunk Dream 95 MCE 156 [MLC] [MLC] +2 Osman/Cannon Dancer MCF 156 52 141 223,223 + Avengers In Galactic Storm MCG SH2 [MLC] [MLC] + Stadium Hero 96 MCM 156 [MLC] [MLC] 146 + + Sotsugyo Shousho 59 52 74 146? + Lemmings --- 59 52,52,71,71 None 75 + Tattoo Assassins --- 101 52,52,71,71 141, 141? ? 99, ? Note 1: Mitchell game on DECO PCB board number DEC-22V0 (S-NK-3220) Note 2: Mitchell games on DECO PCB board number MT5601-0 Note *: Ganbare! Gonta!! 2 / Lady Killer Part 2 - Party Time - Custom chip 59 = 68000 cpu - Custom chip 101 = Arm6 cpu - Custom chip 113 = Alpha blending - Custom chip 99 = 'Ace' chip (Special alpha blending?) - Custom chip 156 = Encrypted ARM cpu (unconfirmed) - Custom chip 102 = Encrypted 68000 cpu (unconfirmed) - - Custom chip 55 provides two playfields of 4bpp tiles, with optional - rowscroll and column scroll. Some games use two of these to give - 4 playfields. Palette banking, tile banking and priority are outside - the scope of this chip, and usually differ between games. Some games - combine the 4bpp output of each playfield to give an effective 8bpp - display. - - Custom chip 56 is the same as 55 but with on-chip decryption, so - encrypted roms can be used. - - Custom chip 74 is the same as 56 but with different decryption tables. - - Custom chip 141 appears to be the same as 56. - - Custom chip 55/56/74/141 control register layout: - - Word 0: - Mask 0x0080: Flip screen - Mask 0x007f: ? Possibly a bit to set transparent pen 0 on/off - Word 2: - Mask 0xffff: Playfield 2 X scroll - Word 4: - Mask 0xffff: Playfield 2 Y scroll - Word 6: - Mask 0xffff: Playfield 1 X scroll - Word 8: - Mask 0xffff: Playfield 1 Y scroll - Word 0xa: - Mask 0x8000: Playfield 1 enable - Mask 0x7800: Playfield 1 rowscroll style - Mask 0x0700: Playfield 1 colscroll style - - Mask 0x0080: Playfield 2 enable - Mask 0x0078: Playfield 2 rowscroll style - Mask 0x0007: Playfield 2 colscroll style - Word 0xc: - Mask 0x8000: Playfield 1 is 8*8 tiles else 16*16 - Mask 0x4000: Playfield 1 rowscroll enabled - Mask 0x2000: Playfield 1 colscroll enabled - Mask 0x1800: Seemingly unused - Mask 0x0400: Use alternate palette bank (unimplemented/unused by any game) - Mask 0x0200: Y flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) - Mask 0x0100: X flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) - - Mask 0x0080: Playfield 2 is 8*8 tiles else 16*16 - Mask 0x0040: Playfield 2 rowscroll enabled - Mask 0x0020: Playfield 2 colscroll enabled - Mask 0x0018: Seemingly unused - Mask 0x0004: Use alternate palette bank (unimplemented/unused by any game) - Mask 0x0002: Y flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) - Mask 0x0001: X flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) - - Word 0xe: - Mask 0xff00: Playfield 1 gfx rom banking (Usually different hookup per game) - Mask 0x00ff: Playfield 2 gfx rom banking + Custom chip 59 = 68000 cpu + Custom chip 101 = Arm6 cpu + Custom chip 113 = Alpha blending + Custom chip 99 = 'Ace' chip (Special alpha blending?) + Custom chip 156 = Encrypted ARM cpu + Custom chip 102 = Encrypted 68000 cpu + + Custom chip 55 provides two playfields of 4bpp tiles, with optional + rowscroll and column scroll. Some games use two of these to give + 4 playfields. Palette banking, tile banking and priority are outside + the scope of this chip, and usually differ between games. Some games + combine the 4bpp output of each playfield to give an effective 8bpp + display. + + Custom chip 56 is the same as 55 but with on-chip decryption, so + encrypted roms can be used. + + Custom chip 74 is the same as 56 but with different decryption tables. + + Custom chip 141 is same as 56, but can output up to 8BPP per layer. + + Custom chip 55/56/74/141 control register layout: + + Word 0: + Mask 0x0080: Flip screen + Mask 0x007f: ? Possibly a bit to set transparent pen 0 on/off + Word 2: + Mask 0xffff: Playfield 2 X scroll + Word 4: + Mask 0xffff: Playfield 2 Y scroll + Word 6: + Mask 0xffff: Playfield 1 X scroll + Word 8: + Mask 0xffff: Playfield 1 Y scroll + Word 0xa: + Mask 0x8000: Playfield 1 enable + Mask 0x7800: Playfield 1 rowscroll style + Mask 0x0700: Playfield 1 colscroll style + + Mask 0x0080: Playfield 2 enable + Mask 0x0078: Playfield 2 rowscroll style + Mask 0x0007: Playfield 2 colscroll style + Word 0xc: + Mask 0x8000: Playfield 1 is 8*8 tiles else 16*16 + Mask 0x4000: Playfield 1 rowscroll enabled + Mask 0x2000: Playfield 1 colscroll enabled + Mask 0x1800: Seemingly unused + Mask 0x0400: Use alternate palette bank (unimplemented/unused by any game) + Mask 0x0200: Y flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) + Mask 0x0100: X flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) + + Mask 0x0080: Playfield 2 is 8*8 tiles else 16*16 + Mask 0x0040: Playfield 2 rowscroll enabled + Mask 0x0020: Playfield 2 colscroll enabled + Mask 0x0018: Seemingly unused + Mask 0x0004: Use alternate palette bank (unimplemented/unused by any game) + Mask 0x0002: Y flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) + Mask 0x0001: X flip tiles with top bit of palette code set (palette becomes 3 bits for this tile) + + Word 0xe: + Mask 0xff00: Playfield 1 gfx rom banking (Usually different hookup per game) + Mask 0x00ff: Playfield 2 gfx rom banking Colscroll style: - 0 8 pixel columns across bitmap - 1 16 pixel columns across bitmap - 2 32 - 3 64 - 4 128 - 5 256 - 6 512 - 7 1024 (Effectively 0 as 1024 is the width of the bitmap) + 0 8 pixel columns across bitmap + 1 16 pixel columns across bitmap + 2 32 + 3 64 + 4 128 + 5 256 + 6 512 + 7 1024 (Effectively 0 as 1024 is the width of the bitmap) Rowscroll style: - 0 512 rows down bitmap in 16x16 tile mode, 256 rows in 8x8 mode - 1 256 rows in 16x16, 128 in 8x8 - 2 128 / 64 - 3 64 / 32 - 4 32 / 16 - 5 16 / 8 - 6 8 / 4 - 7 4 / 2 - 8 2 / 1 - 9-15 Untested on hardware, no known games set this anyway. Assumed invalid (no rowscroll) - - Column and rowscroll can both be applied at once. (Not implemented yet) + 0 512 rows down bitmap in 16x16 tile mode, 256 rows in 8x8 mode + 1 256 rows in 16x16, 128 in 8x8 + 2 128 / 64 + 3 64 / 32 + 4 32 / 16 + 5 16 / 8 + 6 8 / 4 + 7 4 / 2 + 8 2 / 1 + 9-15 Untested on hardware, no known games set this anyway. Assumed invalid (no rowscroll) + + Column and rowscroll can both be applied at once. (Not implemented yet) ***************************************************************************/ @@ -147,12 +147,17 @@ data16_t *deco16_pf1_rowscroll,*deco16_pf2_rowscroll; data16_t *deco16_pf3_rowscroll,*deco16_pf4_rowscroll; +static const data16_t *pf1_rowscroll_ptr, *pf2_rowscroll_ptr; +static const data16_t *pf3_rowscroll_ptr, *pf4_rowscroll_ptr; + data16_t *deco16_pf12_control,*deco16_pf34_control; data16_t deco16_priority; data16_t *deco16_raster_display_list; int deco16_raster_display_position; +static int use_custom_pf1, use_custom_pf2, use_custom_pf3, use_custom_pf4; + static struct tilemap *pf1_tilemap_16x16,*pf2_tilemap_16x16,*pf3_tilemap_16x16,*pf4_tilemap_16x16; static struct tilemap *pf1_tilemap_8x8,*pf2_tilemap_8x8; @@ -162,11 +167,15 @@ static int deco16_pf1_bank,deco16_pf2_bank,deco16_pf3_bank,deco16_pf4_bank; static int deco16_pf12_16x16_gfx_bank,deco16_pf34_16x16_gfx_bank,deco16_pf12_8x8_gfx_bank; static int deco16_pf1_colourmask,deco16_pf2_colourmask,deco16_pf3_colourmask,deco16_pf4_colourmask; -static int deco16_pf1_colour_bank,deco16_pf2_colour_bank,deco16_pf3_colour_bank,deco16_pf4_colour_bank; +int deco16_pf1_colour_bank,deco16_pf2_colour_bank,deco16_pf3_colour_bank,deco16_pf4_colour_bank; +static int deco16_pf1_trans_mask,deco16_pf2_trans_mask,deco16_pf3_trans_mask,deco16_pf4_trans_mask; static int (*deco16_bank_callback_1)(const int bank); static int (*deco16_bank_callback_2)(const int bank); static int (*deco16_bank_callback_3)(const int bank); static int (*deco16_bank_callback_4)(const int bank); +static void custom_tilemap_draw(struct mame_bitmap *bitmap,struct tilemap *tilemap0_8x8,struct tilemap *tilemap0_16x16, + struct tilemap *tilemap1_8x8,struct tilemap *tilemap1_16x16, const data16_t *rowscroll_ptr,const data16_t scrollx, + const data16_t scrolly,const data16_t control0, const data16_t control1,int combine_mask,int combine_shift,int trans_mask,int flags,UINT32 priority); /******************************************************************************/ @@ -414,6 +423,16 @@ } } +void deco16_set_tilemap_transparency_mask(int tilemap, int mask) +{ + switch (tilemap) { + case 0: deco16_pf1_trans_mask=mask; break; + case 1: deco16_pf2_trans_mask=mask; break; + case 2: deco16_pf3_trans_mask=mask; break; + case 3: deco16_pf4_trans_mask=mask; break; + } +} + void deco16_pf12_set_gfxbank(int small, int big) { static int last_small=-1, last_big=-1; @@ -534,6 +553,11 @@ deco16_bank_callback_3=0; deco16_bank_callback_4=0; + deco16_pf1_trans_mask=0xf; + deco16_pf2_trans_mask=0xf; + deco16_pf3_trans_mask=0xf; + deco16_pf4_trans_mask=0xf; + deco16_pf1_colourmask=deco16_pf2_colourmask=0xf; deco16_pf1_bank=deco16_pf2_bank=deco16_pf3_bank=deco16_pf4_bank=0; deco16_pf4_colour_bank=deco16_pf2_colour_bank=16; @@ -582,6 +606,11 @@ deco16_bank_callback_3=0; deco16_bank_callback_4=0; + deco16_pf1_trans_mask=0xf; + deco16_pf2_trans_mask=0xf; + deco16_pf3_trans_mask=0xf; + deco16_pf4_trans_mask=0xf; + deco16_pf1_colourmask=deco16_pf2_colourmask=0xf; deco16_pf3_colourmask=deco16_pf4_colourmask=0xf; deco16_pf1_bank=deco16_pf2_bank=deco16_pf3_bank=deco16_pf4_bank=0; @@ -607,7 +636,7 @@ /*****************************************************************************************/ -static void deco16_pf_update( +static int deco16_pf_update( struct tilemap *tilemap_8x8, struct tilemap *tilemap_16x16, const data16_t *rowscroll_ptr, @@ -616,7 +645,7 @@ const data16_t control0, const data16_t control1) { - int rows, cols, offs; + int rows, cols, offs, use_custom=0; /* Toggle between 8x8 and 16x16 modes (and master enable bit) */ if (control1&0x80) { @@ -669,8 +698,10 @@ else if (rowscroll_ptr && (control1&0x60)==0x20) { /* Column scroll */ /* Column scroll ranges from 8 pixel columns to 512 pixel columns */ + int mask=(0x40 >> (control0&7))-1; + if (mask==-1) mask=0; cols=(8<<(control0&7))&0x3ff; - if (!cols) cols=1; + if (!cols) cols=1024; cols=1024 / cols; if (tilemap_16x16) { @@ -678,9 +709,8 @@ tilemap_set_scroll_rows(tilemap_16x16,1); tilemap_set_scrollx(tilemap_16x16,0,scrollx ); - /* This calculation looks suspicious, but is definitely correct for CNinja and Robocop 2 */ for (offs=0 ; offs < cols;offs++) - tilemap_set_scrolly( tilemap_16x16,(offs+(cols/2))%cols, scrolly + rowscroll_ptr[offs+0x200] ); + tilemap_set_scrolly( tilemap_16x16, offs, scrolly + rowscroll_ptr[(offs&mask)+0x200] ); } if (tilemap_8x8) { @@ -689,12 +719,13 @@ tilemap_set_scrollx(tilemap_8x8,0,scrollx ); for (offs=0 ; offs < cols;offs++) - tilemap_set_scrolly( tilemap_8x8,offs, scrolly + rowscroll_ptr[offs+0x200] ); + tilemap_set_scrolly( tilemap_8x8,offs, scrolly + rowscroll_ptr[(offs&mask)+0x200] ); } } else if (control1&0x60) { + /* Simultaneous row & column scroll requested - use custom renderer */ + use_custom=1; - usrintf_showmessage("Deco16: Row/Col scroll todo"); if (tilemap_16x16) { tilemap_set_scroll_rows(tilemap_16x16,1); tilemap_set_scroll_cols(tilemap_16x16,1); @@ -725,6 +756,8 @@ tilemap_set_scrolly( tilemap_8x8,0, scrolly ); } } + + return use_custom; } void deco16_pf12_update(const data16_t *rowscroll_1_ptr, const data16_t *rowscroll_2_ptr) @@ -732,8 +765,10 @@ int bank1, bank2; /* Update scrolling and tilemap enable */ - deco16_pf_update(pf2_tilemap_8x8,pf2_tilemap_16x16,rowscroll_2_ptr,deco16_pf12_control[3], deco16_pf12_control[4], deco16_pf12_control[5]>>8, deco16_pf12_control[6]>>8); - deco16_pf_update(pf1_tilemap_8x8,pf1_tilemap_16x16,rowscroll_1_ptr,deco16_pf12_control[1], deco16_pf12_control[2], deco16_pf12_control[5]&0xff, deco16_pf12_control[6]&0xff); + pf1_rowscroll_ptr=rowscroll_1_ptr; + pf2_rowscroll_ptr=rowscroll_2_ptr; + use_custom_pf2=deco16_pf_update(pf2_tilemap_8x8,pf2_tilemap_16x16,rowscroll_2_ptr,deco16_pf12_control[3], deco16_pf12_control[4], deco16_pf12_control[5]>>8, deco16_pf12_control[6]>>8); + use_custom_pf1=deco16_pf_update(pf1_tilemap_8x8,pf1_tilemap_16x16,rowscroll_1_ptr,deco16_pf12_control[1], deco16_pf12_control[2], deco16_pf12_control[5]&0xff, deco16_pf12_control[6]&0xff); /* Update banking and global flip state */ if (deco16_bank_callback_1) { @@ -761,8 +796,12 @@ { int bank1, bank2; - deco16_pf_update(0,pf4_tilemap_16x16,rowscroll_2_ptr,deco16_pf34_control[3], deco16_pf34_control[4], deco16_pf34_control[5]>>8, deco16_pf34_control[6]>>8); - deco16_pf_update(0,pf3_tilemap_16x16,rowscroll_1_ptr,deco16_pf34_control[1], deco16_pf34_control[2], deco16_pf34_control[5]&0xff, deco16_pf34_control[6]&0xff); + /* Update scrolling and tilemap enable */ + pf3_rowscroll_ptr=rowscroll_1_ptr; + pf4_rowscroll_ptr=rowscroll_2_ptr; + use_custom_pf4=deco16_pf_update(0,pf4_tilemap_16x16,rowscroll_2_ptr,deco16_pf34_control[3], deco16_pf34_control[4], deco16_pf34_control[5]>>8, deco16_pf34_control[6]>>8); + use_custom_pf3=deco16_pf_update(0,pf3_tilemap_16x16,rowscroll_1_ptr,deco16_pf34_control[1], deco16_pf34_control[2], deco16_pf34_control[5]&0xff, deco16_pf34_control[6]&0xff); + /* Update banking and global flip state */ if (deco16_bank_callback_3) { @@ -829,7 +868,7 @@ /* A special pdrawgfx z-buffered sprite renderer that is needed to properly draw multiple sprite sources with alpha */ void deco16_pdrawgfx(struct mame_bitmap *dest,const struct GfxElement *gfx, unsigned int code,unsigned int color,int flipx,int flipy,int sx,int sy, - const struct rectangle *clip,int transparency,int transparent_color,UINT32 pri_mask,UINT32 sprite_mask) + const struct rectangle *clip,int transparency,int transparent_color,UINT32 pri_mask,UINT32 sprite_mask,UINT8 write_pri) { int ox,oy,cx,cy; int x_index,y_index,x,y; @@ -872,7 +911,8 @@ destb[x] = alpha_blend32(destb[x], pal[c]); else destb[x] = pal[c]; - pri[x] |= pri_mask; + if (write_pri) + pri[x] |= pri_mask; } spri[x]|=sprite_mask; } @@ -888,8 +928,6 @@ /*****************************************************************************************/ -#define tilemap_draw_rowcol tilemap_draw - void deco16_tilemap_1_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority) { if (pf1_tilemap_8x8) tilemap_draw(bitmap,cliprect,pf1_tilemap_8x8,flags,priority); @@ -898,16 +936,110 @@ void deco16_tilemap_2_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority) { - if (pf2_tilemap_8x8) tilemap_draw(bitmap,cliprect,pf2_tilemap_8x8,flags,priority); - if (pf2_tilemap_16x16) tilemap_draw(bitmap,cliprect,pf2_tilemap_16x16,flags,priority); + if (use_custom_pf2) + { + custom_tilemap_draw(bitmap,pf2_tilemap_8x8,pf2_tilemap_16x16,pf2_tilemap_8x8,pf2_tilemap_16x16,pf2_rowscroll_ptr,deco16_pf12_control[3], deco16_pf12_control[4], deco16_pf12_control[5]>>8, deco16_pf12_control[6]>>8, 0, 0, deco16_pf2_trans_mask, flags, priority); + } + else + { + if (pf2_tilemap_8x8) tilemap_draw(bitmap,cliprect,pf2_tilemap_8x8,flags,priority); + if (pf2_tilemap_16x16) tilemap_draw(bitmap,cliprect,pf2_tilemap_16x16,flags,priority); + } } void deco16_tilemap_3_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority) { - if (pf3_tilemap_16x16) tilemap_draw(bitmap,cliprect,pf3_tilemap_16x16,flags,priority); + if (use_custom_pf3) custom_tilemap_draw(bitmap,0,pf3_tilemap_16x16,0,0,pf3_rowscroll_ptr,deco16_pf34_control[1], deco16_pf34_control[2], deco16_pf34_control[5]&0xff, deco16_pf34_control[6]&0xff, 0, 0, deco16_pf3_trans_mask, flags, priority); + else if (pf3_tilemap_16x16) tilemap_draw(bitmap,cliprect,pf3_tilemap_16x16,flags,priority); } void deco16_tilemap_4_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority) { - if (pf4_tilemap_16x16) tilemap_draw(bitmap,cliprect,pf4_tilemap_16x16,flags,priority); + if (use_custom_pf4) custom_tilemap_draw(bitmap,0,pf4_tilemap_16x16,0,0,pf4_rowscroll_ptr,deco16_pf34_control[3], deco16_pf34_control[4], deco16_pf34_control[5]>>8, deco16_pf34_control[6]>>8, 0, 0, deco16_pf4_trans_mask, flags, priority); + else if (pf4_tilemap_16x16) tilemap_draw(bitmap,cliprect,pf4_tilemap_16x16,flags,priority); +} + +/*****************************************************************************************/ + +// Combines the output of two 4BPP tilemaps into an 8BPP tilemap +void deco16_tilemap_34_combine_draw(struct mame_bitmap *bitmap, const struct rectangle *cliprect, int flags, UINT32 priority) +{ + custom_tilemap_draw(bitmap,0,pf3_tilemap_16x16,0,pf4_tilemap_16x16,pf3_rowscroll_ptr,deco16_pf34_control[1], deco16_pf34_control[2], deco16_pf34_control[5]&0xff, deco16_pf34_control[6]&0xff, 0xf, 4, 0xff, flags, priority); +} + +/*****************************************************************************************/ + +/* + Consider this the 'reference rasterizer' for the 56/74/141 tilemap chips - it implements + simultaneous row & column scroll which the Mame tilemap core cannot do. It also + implements combining the 4BPP output of two tilemaps into 8BPP output. This function + is automatically called when the tilemap is in a state the cannot be properly rendered + by the Mame core. +*/ + +static void custom_tilemap_draw( + struct mame_bitmap *bitmap, + struct tilemap *tilemap0_8x8, + struct tilemap *tilemap0_16x16, + struct tilemap *tilemap1_8x8, + struct tilemap *tilemap1_16x16, + const data16_t *rowscroll_ptr, + const data16_t scrollx, + const data16_t scrolly, + const data16_t control0, + const data16_t control1, + int combine_mask, + int combine_shift, + int trans_mask, + int flags, + UINT32 priority) +{ + const struct mame_bitmap *src_bitmap0 = (control1&0x80) ? tilemap_get_pixmap(tilemap0_8x8) : tilemap_get_pixmap(tilemap0_16x16); + const struct mame_bitmap *src_bitmap1 = (control1&0x80) ? tilemap_get_pixmap(tilemap1_8x8) : tilemap_get_pixmap(tilemap1_16x16); + + int width_mask, height_mask, x, y, p; + int column_offset, src_x=0, src_y=0; + int row_type=1 << ((control0>>3)&0xf); + int col_type=8 << (control0&7); + + if (!src_bitmap0) + return; + + // Playfield disable + if (!(control0&0x80)) + return; + + width_mask=src_bitmap0->width - 1; + height_mask=src_bitmap0->height - 1; + src_y=scrolly + 8; + + for (y=8; y<248; y++) { + if (rowscroll_ptr && (control1&0x40)) + src_x=scrollx + rowscroll_ptr[src_y / row_type]; + else + src_x=scrollx; + + for (x=0; x<320; x++) { + if (rowscroll_ptr && (control1&0x20)) + column_offset=rowscroll_ptr[0x200 + ((src_x&0x1ff) / col_type)]; + else + column_offset=0; + + p=(((UINT16*)src_bitmap0->line[(src_y + column_offset)&height_mask])[src_x]); + if (src_bitmap1) + p|=(((((UINT16*)src_bitmap1->line[(src_y + column_offset)&height_mask])[src_x]))&combine_mask)<<combine_shift; + + src_x=(src_x+1)&width_mask; + if ((flags&TILEMAP_IGNORE_TRANSPARENCY) || (p&trans_mask)) + { + plot_pixel(bitmap, x, y, Machine->pens[p]); + if (priority_bitmap) + { + UINT8 *pri = priority_bitmap->line[y]; + pri[x]|=priority; + } + } + } + src_y=(src_y+1)&height_mask; + } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/deco32_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/deco32_vidhrdw.c
Changed
@@ -8,6 +8,8 @@ data32_t *deco32_pf1_rowscroll,*deco32_pf2_rowscroll,*deco32_pf3_rowscroll,*deco32_pf4_rowscroll; data32_t *dragngun_sprite_layout_0_ram, *dragngun_sprite_layout_1_ram; data32_t *dragngun_sprite_lookup_0_ram, *dragngun_sprite_lookup_1_ram; +data32_t *deco32_ace_ram; +static int deco32_ace_ram_dirty, has_ace_ram; static data8_t *dirty_palette; static struct tilemap *pf1_tilemap,*pf1a_tilemap,*pf2_tilemap,*pf3_tilemap,*pf4_tilemap; @@ -20,6 +22,9 @@ int deco32_raster_display_position; data16_t *deco32_raster_display_list; +static struct mame_bitmap *sprite0_mix_bitmap, *sprite1_mix_bitmap, *tilemap_alpha_bitmap; + + /******************************************************************************/ WRITE32_HANDLER( deco32_pf1_data_w ) @@ -80,6 +85,79 @@ memset(spriteram32,0,0x2000); } +WRITE32_HANDLER( deco32_ace_ram_w ) +{ + /* Some notes pieced together from Tattoo Assassins info: + + Bytes 0 to 0x58 - object alpha control? + Bytes 0x5c to 0x7c - tilemap alpha control + + 0 = opaque, 0x10 = 50% transparent, 0x20 = fully transparent + + Byte 0x00: ACEO000P0 + P8 + 1P0 + 1P8 + O010C1 + o010C8 + ?? + + Hardware fade registers: + + Byte 0x80: fadeptred + Byte 0x84: fadeptgreen + Byte 0x88: fadeptblue + Byte 0x8c: fadestred + Byte 0x90: fadestgreen + Byte 0x94: fadestblue + Byte 0x98: fadetype + + The 'ST' value lerps between the 'PT' value and the palette entries. So, if PT==0, + then ST ranging from 0 to 255 will cause a fade to black (when ST==255 the palette + becomes zero). + + 'fadetype' - 1100 for multiplicative fade, 1000 for additive + */ + if (offset>=(0x80/4) && (data!=deco32_ace_ram[offset])) + deco32_ace_ram_dirty=1; + + COMBINE_DATA(&deco32_ace_ram[offset]); +} + + +static void updateAceRam(void) +{ + int r,g,b,i; + UINT8 fadeptr=deco32_ace_ram[0x20]; + UINT8 fadeptg=deco32_ace_ram[0x21]; + UINT8 fadeptb=deco32_ace_ram[0x22]; + UINT8 fadepsr=deco32_ace_ram[0x23]; + UINT8 fadepsg=deco32_ace_ram[0x24]; + UINT8 fadepsb=deco32_ace_ram[0x25]; +/* UINT8 mode=deco32_ace_ram[0x26];*/ + + deco32_ace_ram_dirty=0; + + for (i=0; i<2048; i++) + { + /* Lerp palette entry to 'fadept' according to 'fadeps' */ + b = (paletteram32[i] >>16) & 0xff; + g = (paletteram32[i] >> 8) & 0xff; + r = (paletteram32[i] >> 0) & 0xff; + + if (i>255) /* Screenshots seem to suggest ACE fades do not affect playfield 1 palette (0-255) */ + { + /* Yeah, this should really be fixed point, I know */ + b = (UINT8)((float)b + (((float)fadeptb - (float)b) * (float)fadepsb/255.0f)); + g = (UINT8)((float)g + (((float)fadeptg - (float)g) * (float)fadepsg/255.0f)); + r = (UINT8)((float)r + (((float)fadeptr - (float)r) * (float)fadepsr/255.0f)); + } + + palette_set_color(i,r,g,b); + } +} + + /******************************************************************************/ /* Later games have double buffered paletteram - the real palette ram is @@ -154,7 +232,7 @@ sprite = spritedata[offs+3] & 0xffff; if (sy==0x00000108 && !sprite) - continue; //fix!!!!! + continue; /*fix!!!!!*/ if (spritedata[offs+2]&0x20) prival=0; @@ -209,6 +287,186 @@ } } + +static void fghthist_draw_sprites(struct mame_bitmap *bitmap, const data32_t *spritedata, int gfxbank, int mask, int colourmask) +{ + int offs; + + for (offs = 0x400 - 4; offs >= 0; offs -=4) + { + int x,y,sprite,colour,multi,fx,fy,inc,flash,mult,pri=0; + + sprite = spritedata[offs+1] & 0xffff; + + y = spritedata[offs]; + flash=y&0x1000; + if (flash && (cpu_getcurrentframe() & 1)) continue; + + x = spritedata[offs+2]; + colour = (x >>9) & colourmask; + + if ((y&0x8000)) + pri=1; + else + pri=4; + + fx = y & 0x2000; + fy = y & 0x4000; + multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ + + x = x & 0x01ff; + y = y & 0x01ff; + if (x >= 320) x -= 512; + if (y >= 256) y -= 512; + + sprite &= ~multi; + if (fy) + inc = -1; + else + { + sprite += multi; + inc = 1; + } + + mult=+16; + + if (fx) fx=0; else fx=1; + if (fy) fy=0; else fy=1; + + while (multi >= 0) + { + deco16_pdrawgfx(bitmap,Machine->gfx[gfxbank], + sprite - multi * inc, + colour, + fx,fy, + x,y + mult * multi, + &Machine->visible_area,TRANSPARENCY_PEN,0,pri,1<<gfxbank,1); + + /*deco16_pdrawgfx(*/ + /* bitmap,cliprect,machine->gfx[gfxbank],*/ + /* sprite - multi * inc,*/ + /* colour,*/ + /* fx,fy,*/ + /* x,y + mult * multi,*/ + /* 0,pri,1<<gfxbank, 1, alpha);*/ + + multi--; + } + } +} + +static void deco32_draw_sprite(struct mame_bitmap *dest,const struct rectangle *clip,const struct GfxElement *gfx, + UINT32 code,UINT32 priority,int flipx,int flipy,int sx,int sy) +{ +/* priority = (priority >> 8) & 0x1f;*/ +/* const pen_t *pal = &gfx->colortable[gfx->color_granularity * (priority % gfx->total_colors)];*/ + const UINT8 *code_base = gfx->gfxdata + (((code % gfx->total_elements) * gfx->height) * gfx->line_modulo); + int ox,oy,cx,cy; + int x_index,y_index,x,y; + + /* check bounds */ + ox = sx; + oy = sy; + + if (sx>319 || sy>247 || sx<-15 || sy<-7) + return; + + if (sy<0) sy=0; + if (sx<0) sx=0; + if (sx>319) cx=319; + else cx=ox+16; + + cy=(sy-oy); + + if (flipy) y_index=15-cy; else y_index=cy; + + for( y=0; y<16-cy; y++ ) + { + const UINT8 *source = code_base + y_index * gfx->line_modulo; + /*UINT16 *destb = BITMAP_ADDR16(dest, sy, 0);*/ + UINT16 *destb = (UINT16 *)dest->line[sy]; + + if (flipx) { source+=15-(sx-ox); x_index=-1; } else { x_index=1; source+=(sx-ox); } + + for (x=sx; x<cx; x++) + { + int c = *source; + if( c ) + destb[x] = c | priority; + + source+=x_index; + } + + sy++; + if (sy>247) + return; + if (flipy) y_index--; else y_index++; + } +} + + +static void nslasher_draw_sprites(struct mame_bitmap *bitmap, const data32_t *spritedata, int gfxbank) +{ + int offs; + + /* Draw sprites back to front saving priority & alpha data per pixel for later mixing*/ + for (offs = 0; offs<0x400; offs+=4) + { + int x,y,sprite,colour,multi,fx,fy,inc,flash,mult; /*,pri=0,spri=0;*/ + /*int trans;*/ + + sprite = spritedata[offs+1] & 0xffff; + + y = spritedata[offs]; + flash=y&0x1000; + if (flash && (cpu_getcurrentframe() & 1)) continue; + + /*trans=TRANSPARENCY_PEN;*/ + x = spritedata[offs+2]; + + /* Prepare colour, priority and alpha info*/ + colour = (x>>9) & 0x7f; + if (y&0x8000) + colour|=0x80; + colour<<=8; + + fx = y & 0x2000; + fy = y & 0x4000; + multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ + + x = x & 0x01ff; + y = y & 0x01ff; + if (x >= 320) x -= 512; + if (y >= 256) y -= 512; + + sprite &= ~multi; + if (fy) + inc = -1; + else + { + sprite += multi; + inc = 1; + } + + mult=+16; + + if (fx) fx=0; else fx=1; + if (fy) fy=0; else fy=1; + + while (multi >= 0) + { + deco32_draw_sprite(bitmap,&Machine->visible_area,Machine->gfx[gfxbank], + sprite - multi * inc, + colour, + fx,fy, + x,y + mult * multi); + + multi--; + } + } +} + + static void tattass_drawsprites(struct mame_bitmap *bitmap, const data32_t *spritedata, int gfxbank, int mask) { int offs; @@ -265,7 +523,7 @@ inc = 1; } - mult=+16;//todo + mult=+16;/*todo*/ if (fx) fx=0; else fx=1; if (fy) fy=0; else fy=1; @@ -277,7 +535,7 @@ colour, fx,fy, x,y + mult * multi, - &Machine->visible_area,trans,0,pri,1<<gfxbank); + &Machine->visible_area,trans,0,pri,1<<gfxbank,1); multi--; } @@ -322,8 +580,8 @@ const pen_t *pal = &gfx->colortable[gfx->color_granularity * (color % gfx->total_colors)]; /* ASG 980209 */ int source_base = (code % gfx->total_elements) * gfx->height; -// int sprite_screen_height = (scaley*gfx->height+0x8000)>>16; -// int sprite_screen_width = (scalex*gfx->width+0x8000)>>16; +/* int sprite_screen_height = (scaley*gfx->height+0x8000)>>16;*/ +/* int sprite_screen_width = (scalex*gfx->width+0x8000)>>16;*/ if (sprite_screen_width && sprite_screen_height) { @@ -554,9 +812,9 @@ continue; if (spritedata[offs+0]&0x400) - layout_ram = dragngun_sprite_layout_1_ram + ((spritedata[offs+0]&0x1ff)*4); //CHECK! + layout_ram = dragngun_sprite_layout_1_ram + ((spritedata[offs+0]&0x1ff)*4); /*CHECK!*/ else - layout_ram = dragngun_sprite_layout_0_ram + ((spritedata[offs+0]&0x1ff)*4); //1ff in drag gun code?? + layout_ram = dragngun_sprite_layout_0_ram + ((spritedata[offs+0]&0x1ff)*4); /*1ff in drag gun code??*/ h = (layout_ram[1]>>0)&0xf; w = (layout_ram[1]>>4)&0xf; if (!h || !w) @@ -581,7 +839,7 @@ fx = spritedata[offs+4]&0x8000; fy = spritedata[offs+5]&0x8000; -// if (spritedata[offs+0]&0x400) +/* if (spritedata[offs+0]&0x400)*/ if (layout_ram[0]&0x2000) lookup_ram = dragngun_sprite_lookup_1_ram + (layout_ram[0]&0x1fff); else @@ -801,7 +1059,7 @@ return 0; } -VIDEO_START( fghthist ) //unused +VIDEO_START( fghthist ) /*unused*/ { pf1_tilemap = tilemap_create(get_pf1_tile_info, tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8,64,32); pf2_tilemap = tilemap_create(get_pf2_tile_info, deco16_scan_rows,TILEMAP_TRANSPARENT,16,16,64,32); @@ -900,6 +1158,35 @@ return 0; } + +VIDEO_START( nslasher ) +{ + pf1_tilemap = tilemap_create(get_pf1_tile_info, tilemap_scan_rows, TILEMAP_TRANSPARENT, 8, 8,64,32); + pf2_tilemap = tilemap_create(get_pf2_tile_info, deco16_scan_rows, TILEMAP_TRANSPARENT, 16,16,64,32); + pf3_tilemap = tilemap_create(get_pf3_tile_info, deco16_scan_rows, TILEMAP_TRANSPARENT, 16,16,64,32); + pf4_tilemap = tilemap_create(get_pf4_tile_info, deco16_scan_rows, TILEMAP_OPAQUE, 16,16,64,32); + pf1a_tilemap =0; + dirty_palette = auto_malloc(4096); + + sprite0_mix_bitmap = auto_bitmap_alloc_depth( Machine->scrbitmap->width, Machine->scrbitmap->height, -16 ); + sprite1_mix_bitmap = auto_bitmap_alloc_depth( Machine->scrbitmap->width, Machine->scrbitmap->height, -16 ); + tilemap_alpha_bitmap=auto_bitmap_alloc_depth( Machine->scrbitmap->width, Machine->scrbitmap->height, -16 ); + + tilemap_set_transparent_pen(pf1_tilemap,0); + tilemap_set_transparent_pen(pf2_tilemap,0); + tilemap_set_transparent_pen(pf3_tilemap,0); + memset(dirty_palette,0,4096); + + deco32_raster_display_list=0; + deco32_pf2_colourbank=16; + deco32_pf4_colourbank=16; + + has_ace_ram=1; /* iq_132*/ + + return 0; +} + + /******************************************************************************/ VIDEO_EOF( captaven ) @@ -985,7 +1272,7 @@ const data16_t width_mask=0x3ff; const data16_t height_mask=0x1ff; const data16_t y_src=deco32_pf34_control[2]; -// const data32_t *rows=deco32_pf3_rowscroll; +/* const data32_t *rows=deco32_pf3_rowscroll;*/ const data16_t *bitmap0_y; const data16_t *bitmap1_y; @@ -1022,7 +1309,7 @@ /* Colscroll - not fully supported yet! */ if (control1&0x20 && coldata) { sy+=coldata[0]; - //usrintf_showmessage("%08x",coldata[0]); + /*usrintf_showmessage("%08x",coldata[0]);*/ } /* Rowscroll enable */ @@ -1073,8 +1360,8 @@ deco32_setup_scroll(pf3_tilemap, 512,(deco32_pf34_control[5]>>0)&0xff,(deco32_pf34_control[6]>>0)&0xff,deco32_pf34_control[4],deco32_pf34_control[3],deco32_pf3_rowscroll,deco32_pf3_rowscroll+0x200); /* PF1 & PF2 only have enough roms for 1 bank */ - deco32_pf1_bank=0;//(deco32_pf12_control[7]>> 4)&0xf; - deco32_pf2_bank=0;//(deco32_pf12_control[7]>>12)&0xf; + deco32_pf1_bank=0;/*(deco32_pf12_control[7]>> 4)&0xf;*/ + deco32_pf2_bank=0;/*(deco32_pf12_control[7]>>12)&0xf;*/ deco32_pf3_bank=(deco32_pf34_control[7]>> 4)&0xf; if (deco32_pf34_control[7]&0x0020) deco32_pf3_bank=0x4000; else deco32_pf3_bank=0; @@ -1233,10 +1520,10 @@ deco32_setup_scroll(pf4_tilemap, 512,(deco32_pf34_control[5]>>8)&0xff,(deco32_pf34_control[6]>>8)&0xff,deco32_pf34_control[4],deco32_pf34_control[3],deco32_pf4_rowscroll,deco32_pf4_rowscroll+0x200); /* Enable registers - pf3/4 enable is not set on the 'fire' stage - hardware bug? Maybe enable isn't hooked up */ -// tilemap_set_enable(pf1_tilemap, deco32_pf12_control[5]&0x0080); -// tilemap_set_enable(pf2_tilemap, deco32_pf12_control[5]&0x8000); -// tilemap_set_enable(pf3_tilemap, deco32_pf34_control[5]&0x0080); -// tilemap_set_enable(pf4_tilemap, deco32_pf34_control[5]&0x8000); +/* tilemap_set_enable(pf1_tilemap, deco32_pf12_control[5]&0x0080);*/ +/* tilemap_set_enable(pf2_tilemap, deco32_pf12_control[5]&0x8000);*/ +/* tilemap_set_enable(pf3_tilemap, deco32_pf34_control[5]&0x0080);*/ +/* tilemap_set_enable(pf4_tilemap, deco32_pf34_control[5]&0x8000);*/ deco16_clear_sprite_priority_bitmap(); fillbitmap(priority_bitmap,0,cliprect); @@ -1275,7 +1562,7 @@ tilemap_mark_all_tiles_dirty(pf4_tilemap); deco32_pf2_bank=((deco32_pf12_control[7]>>12)&0x3)<<12; - deco32_pf3_bank=((deco32_pf34_control[7]>> 5)&0x3)<<12; //WRONG WRONG WRONG check masks + deco32_pf3_bank=((deco32_pf34_control[7]>> 5)&0x3)<<12; /*WRONG WRONG WRONG check masks*/ deco32_pf4_bank=((deco32_pf34_control[7]>>12)&0x3)<<12; deco32_pf1_flip=(deco32_pf12_control[6]>>0)&0x3; deco32_pf2_flip=(deco32_pf12_control[6]>>8)&0x3; @@ -1295,15 +1582,246 @@ deco32_setup_scroll(pf4_tilemap, 512,(deco32_pf34_control[5]>>8)&0xff,(deco32_pf34_control[6]>>8)&0xff,deco32_pf34_control[4],deco32_pf34_control[3],deco32_pf4_rowscroll,deco32_pf4_rowscroll+0x200); /* Draw screen */ + deco16_clear_sprite_priority_bitmap(); + fillbitmap(priority_bitmap,0,cliprect); + fillbitmap(bitmap,Machine->pens[0x000],cliprect); /* Palette index not confirmed*/ + tilemap_draw(bitmap,cliprect,pf4_tilemap,0,0); + if(deco32_pri&1) + { + tilemap_draw(bitmap,cliprect,pf2_tilemap,0,0); + tilemap_draw(bitmap,cliprect,pf3_tilemap,0,2); + } + else + { + tilemap_draw(bitmap,cliprect,pf3_tilemap,0,0); + tilemap_draw(bitmap,cliprect,pf2_tilemap,0,2); + } + fghthist_draw_sprites(bitmap,buffered_spriteram32,3,0, 0xf); + tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); + +/* print_debug_info();*/ +} + + + + + + + + +static void mixDualAlphaSprites( struct mame_bitmap *bitmap, const struct rectangle *clip, const struct GfxElement *gfx0, const struct GfxElement *gfx1, int mixAlphaTilemap) +{ + const pen_t *pens = Machine->pens; + const pen_t *pal0 = &pens[1024]; /* gfx0->color_base -> 3*/ + const pen_t *pal1 = &pens[1536]; /* gfx1->color_base -> 4*/ + const pen_t *pal2 = &pens[(deco32_pri&1) ? 0 : 512]; /* Machine->gfx[(deco32_pri&1) ? 1 : 2]->color_base -> 0 - 512*/ + int x,y; + + /* Mix sprites into main bitmap, based on priority & alpha */ + for (y=8; y<248; y++) { + UINT8* tilemapPri=priority_bitmap->line[y]; /*BITMAP_ADDR8(machine->priority_bitmap, y, 0);*/ + UINT16* sprite0=(UINT16*)sprite0_mix_bitmap->line[y]; /*BITMAP_ADDR16(sprite0_mix_bitmap, y, 0);*/ + UINT16* sprite1=(UINT16*)sprite1_mix_bitmap->line[y]; /*BITMAP_ADDR16(sprite1_mix_bitmap, y, 0);*/ + UINT32* destLine=(UINT32 *)bitmap->line[y];/*BITMAP_ADDR32(bitmap, y, 0);*/ + UINT16* alphaTilemap=(UINT16*)tilemap_alpha_bitmap->line[y]; /*BITMAP_ADDR16(tilemap_alpha_bitmap, y, 0);*/ + + for (x=0; x<320; x++) { + UINT16 priColAlphaPal0=sprite0[x]; + UINT16 priColAlphaPal1=sprite1[x]; + UINT16 pri0=(priColAlphaPal0&0x6000)>>13; + UINT16 pri1=(priColAlphaPal1&0x6000)>>13; + UINT16 col0=((priColAlphaPal0&0x1f00)>>8) % gfx0->total_colors; + UINT16 col1=((priColAlphaPal1&0x0f00)>>8) % gfx1->total_colors; + UINT16 alpha1=priColAlphaPal1&0x8000; + + /* Apply sprite bitmap 0 according to priority rules*/ + if ((priColAlphaPal0&0xff)!=0) + { + /* + Sprite 0 priority rules: + + 0 = Sprite above all layers + 1 = Sprite under top playfield + 2 = Sprite under top two playfields + 3 = Sprite under all playfields + */ + if ((pri0&0x3)==0 || (pri0&0x3)==1 || ((pri0&0x3)==2 && mixAlphaTilemap)) /* Spri0 on top of everything, or under alpha playfield*/ + { + destLine[x]=pal0[(priColAlphaPal0&0xff) + (gfx0->color_granularity * col0)]; + } + else if ((pri0&0x3)==2) /* Spri0 under top playfield*/ + { + if (tilemapPri[x]<4) + destLine[x]=pal0[(priColAlphaPal0&0xff) + (gfx0->color_granularity * col0)]; + } + else /* Spri0 under top & middle playfields*/ + { + if (tilemapPri[x]<2) + destLine[x]=pal0[(priColAlphaPal0&0xff) + (gfx0->color_granularity * col0)]; + } + } + + /* Apply sprite bitmap 1 according to priority rules*/ + if ((priColAlphaPal1&0xff)!=0) + { + /* Apply alpha for this pixel based on Ace setting*/ + if (alpha1) + { + /* + Alpha rules: + + Pri 0 - Over all tilemaps, but under sprite 0 pri 0, pri 1, pri 2 + Pri 1 - + Pri 2 - + Pri 3 - + */ + + /* Alpha values are tied to ACE ram... */ + /*int alpha=((deco32_ace_ram[0x0 + (((priColAlphaPal1&0xf0)>>4)/2)]) * 8)-1;*/ + /*if (alpha<0)*/ + /* alpha=0;*/ + + /* I don't really understand how object ACE ram is really hooked up, + the only obvious place in Night Slashers is the stagecoach in level 2 */ + + if (pri1==0 && (((priColAlphaPal0&0xff)==0 || ((pri0&0x3)!=0 && (pri0&0x3)!=1 && (pri0&0x3)!=2)))) + { + if ((deco32_pri&1)==0 || ((deco32_pri&1)==1 && tilemapPri[x]<4) || ((deco32_pri&1)==1 && mixAlphaTilemap)) + destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)], 0x80); + } + else if (pri1==1 && ((priColAlphaPal0&0xff)==0 || ((pri0&0x3)!=0 && (pri0&0x3)!=1 && (pri0&0x3)!=2))) + destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)], 0x80); + else if (pri1==2)/* TOdo*/ + destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)], 0x80); + else if (pri1==3)/* TOdo*/ + destLine[x]=alpha_blend_r32(destLine[x], pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)], 0x80); + } + else + { + /* + Non alpha rules: + + Pri 0 - Under sprite 0 pri 0, over all tilemaps + */ + if (pri1==0 && ((priColAlphaPal0&0xff)==0 || ((pri0&0x3)!=0))) + destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)]; + else if (pri1==1) /* todo*/ + destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)]; + else if (pri1==2) /* todo*/ + destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)]; + else if (pri1==3) /* todo*/ + destLine[x]=pal1[(priColAlphaPal1&0xff) + (gfx1->color_granularity * col1)]; + } + } + + /* Optionally mix in alpha tilemap */ + if (mixAlphaTilemap) + { + UINT16 p=alphaTilemap[x]; + if (p&0xf) + { + /* Alpha tilemap under top two sprite 0 priorities */ + if (((priColAlphaPal0&0xff)==0 || (pri0&0x3)==2 || (pri0&0x3)==3) + && ((priColAlphaPal1&0xff)==0 || (pri1&0x3)==2 || (pri1&0x3)==3 || alpha1)) + { + /* Alpha values are tied to ACE ram */ + int alpha=((deco32_ace_ram[0x17 + (((p&0xf0)>>4)/2)]) * 8)-1; + if (alpha<0) + alpha=0; + + destLine[x]=alpha_blend_r32(destLine[x], pal2[p], 255-alpha); + } + } + } + } + } +} + +VIDEO_UPDATE( nslasher ) +{ + int alphaTilemap=0; + + /* Dirty tilemaps if any globals change */ + if (deco32_pf1_flip!=((deco32_pf12_control[6]>>0)&0x3)) + tilemap_mark_all_tiles_dirty(pf1_tilemap); + if (deco32_pf2_flip!=((deco32_pf12_control[6]>>8)&0x3)) + tilemap_mark_all_tiles_dirty(pf2_tilemap); + if ((((deco32_pf12_control[7]>>12)&0x7)<<12)!=deco32_pf2_bank || deco32_pf2_flip!=((deco32_pf12_control[6]>>8)&0x3)) + tilemap_mark_all_tiles_dirty(pf2_tilemap); + if ((((deco32_pf34_control[7]>> 4)&0x3)<<12)!=deco32_pf3_bank || deco32_pf3_flip!=((deco32_pf34_control[6]>>0)&0x3)) + tilemap_mark_all_tiles_dirty(pf3_tilemap); + if ((((deco32_pf34_control[7]>>12)&0x3)<<12)!=deco32_pf4_bank || deco32_pf4_flip!=((deco32_pf34_control[6]>>8)&0x3)) + tilemap_mark_all_tiles_dirty(pf4_tilemap); + + deco32_pf2_bank=((deco32_pf12_control[7]>>12)&0x3)<<12; + deco32_pf3_bank=((deco32_pf34_control[7]>> 4)&0x3)<<12; + deco32_pf4_bank=((deco32_pf34_control[7]>>12)&0x3)<<12; + deco32_pf1_flip=(deco32_pf12_control[6]>>0)&0x3; + deco32_pf2_flip=(deco32_pf12_control[6]>>8)&0x3; + deco32_pf3_flip=(deco32_pf34_control[6]>>0)&0x3; + deco32_pf4_flip=(deco32_pf34_control[6]>>8)&0x3; + + /* Setup scroll registers */ + deco32_setup_scroll(pf1_tilemap, 256,(deco32_pf12_control[5]>>0)&0xff,(deco32_pf12_control[6]>>0)&0xff,deco32_pf12_control[2],deco32_pf12_control[1],deco32_pf1_rowscroll,deco32_pf1_rowscroll+0x200); + deco32_setup_scroll(pf2_tilemap, 512,(deco32_pf12_control[5]>>8)&0xff,(deco32_pf12_control[6]>>8)&0xff,deco32_pf12_control[4],deco32_pf12_control[3],deco32_pf2_rowscroll,deco32_pf2_rowscroll+0x200); + deco32_setup_scroll(pf3_tilemap, 512,(deco32_pf34_control[5]>>0)&0xff,(deco32_pf34_control[6]>>0)&0xff,deco32_pf34_control[2],deco32_pf34_control[1],deco32_pf3_rowscroll,deco32_pf3_rowscroll+0x200); + deco32_setup_scroll(pf4_tilemap, 512,(deco32_pf34_control[5]>>8)&0xff,(deco32_pf34_control[6]>>8)&0xff,deco32_pf34_control[4],deco32_pf34_control[3],deco32_pf4_rowscroll,deco32_pf4_rowscroll+0x200); + + /* Enable registers */ + tilemap_set_enable(pf1_tilemap, deco32_pf12_control[5]&0x0080); + tilemap_set_enable(pf2_tilemap, deco32_pf12_control[5]&0x8000); + tilemap_set_enable(pf3_tilemap, deco32_pf34_control[5]&0x0080); + tilemap_set_enable(pf4_tilemap, deco32_pf34_control[5]&0x8000); + + /* This is not a conclusive test for deciding if tilemap needs alpha blending */ + if (deco32_ace_ram[0x17]!=0x0 && deco32_pri) + alphaTilemap=1; + + if (deco32_ace_ram_dirty) + updateAceRam(); + + fillbitmap(sprite0_mix_bitmap,0,cliprect); + fillbitmap(sprite1_mix_bitmap,0,cliprect); + fillbitmap(priority_bitmap,0,cliprect); if ((deco32_pf34_control[5]&0x8000)==0) - fillbitmap(bitmap,Machine->pens[0x200],cliprect); //TODO - pf4 palette entry 0 is shown + fillbitmap(priority_bitmap,Machine->pens[0x200],cliprect); + + /* Draw sprites to temporary bitmaps, saving alpha & priority info for later mixing */ + nslasher_draw_sprites(sprite0_mix_bitmap,buffered_spriteram32,3); + nslasher_draw_sprites(sprite1_mix_bitmap,buffered_spriteram32_2,4); + + /* Render alpha-blended tilemap to seperate buffer for proper mixing */ + fillbitmap(tilemap_alpha_bitmap,0,cliprect); + + /* Draw playfields & sprites */ + if (deco32_pri&2) + { + combined_tilemap_draw(bitmap); + tilemap_draw(bitmap,cliprect,pf2_tilemap,0,4); + } else + { tilemap_draw(bitmap,cliprect,pf4_tilemap,0,1); -if (!keyboard_pressed(KEYCODE_Q)) tilemap_draw(bitmap,cliprect,pf3_tilemap,0,2); -if (!keyboard_pressed(KEYCODE_W)) tilemap_draw(bitmap,cliprect,pf2_tilemap,0,16); -if (!keyboard_pressed(KEYCODE_E)) tattass_drawsprites(bitmap,buffered_spriteram32,3,0); -if (!keyboard_pressed(KEYCODE_R)) tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); + if (deco32_pri&1) + { + tilemap_draw(bitmap,cliprect,pf2_tilemap,0,2); + if (alphaTilemap) + tilemap_draw(tilemap_alpha_bitmap,cliprect,pf3_tilemap,0,4); + else + tilemap_draw(bitmap,cliprect,pf3_tilemap,0,4); + } + else + { + tilemap_draw(bitmap,cliprect,pf3_tilemap,0,2); + if (alphaTilemap) + tilemap_draw(tilemap_alpha_bitmap,cliprect,pf2_tilemap,0,4); + else + tilemap_draw(bitmap,cliprect,pf2_tilemap,0,4); + } + } -// print_debug_info(); + mixDualAlphaSprites(bitmap, cliprect, Machine->gfx[3], Machine->gfx[4], alphaTilemap); + + tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/diverboy_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/diverboy_vidhrdw.c
Changed
@@ -14,11 +14,11 @@ static void diverboy_drawsprites( struct mame_bitmap *bitmap, const struct rectangle *cliprect ) { data16_t *source = diverboy_spriteram; - data16_t *finish = source + diverboy_spriteram_size/2; + data16_t *finish = source + (diverboy_spriteram_size/2); while (source < finish) { - int xpos,ypos,number,colr,bank,flash; + INT16 xpos,ypos,number,colr,bank,flash; ypos = source[4]; xpos = source[0]; @@ -48,6 +48,6 @@ VIDEO_UPDATE(diverboy) { -// fillbitmap(bitmap,get_black_pen(),cliprect); +/* fillbitmap(bitmap,get_black_pen(),cliprect);*/ diverboy_drawsprites(bitmap,cliprect); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/galaxian_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/galaxian_vidhrdw.c
Changed
@@ -91,16 +91,17 @@ int x,y,color; }; static struct star stars[STAR_COUNT]; +static int stars_colors_start; int galaxian_stars_on; static int stars_scrollpos; static int stars_blink_state; static void *stars_blink_timer; static void *stars_scroll_timer; static int timer_adjusted; - void galaxian_init_stars(void); + void galaxian_init_stars(int colors_offset); static void (*draw_stars)(struct mame_bitmap *); /* function to call to draw the star layer */ static void noop_draw_stars(struct mame_bitmap *bitmap); -static void galaxian_draw_stars(struct mame_bitmap *bitmap); + void galaxian_draw_stars(struct mame_bitmap *bitmap); void scramble_draw_stars(struct mame_bitmap *bitmap); static void rescue_draw_stars(struct mame_bitmap *bitmap); static void mariner_draw_stars(struct mame_bitmap *bitmap); @@ -194,7 +195,7 @@ } - galaxian_init_stars(); + galaxian_init_stars(STARS_COLOR_BASE); /* bullets - yellow and white */ @@ -815,7 +816,7 @@ code |= (bank << 4); // color |= ((galaxian_attributesram[(x << 1) | 1] & 0x40) >> 2); - SET_TILE_INFO(0,code,color,0) + SET_TILE_INFO(0, code, color, 0) } VIDEO_START( drivfrcg ) @@ -1450,7 +1451,7 @@ /* star drawing functions */ -void galaxian_init_stars(void) +void galaxian_init_stars(int colors_offset) { int i; int total_stars; @@ -1463,6 +1464,7 @@ stars_blink_timer = timer_alloc(stars_blink_callback); stars_scroll_timer = timer_alloc(stars_scroll_callback); timer_adjusted = 0; + stars_colors_start = colors_offset; for (i = 0;i < 64;i++) @@ -1477,7 +1479,7 @@ g = map[bits]; bits = (i >> 4) & 0x03; b = map[bits]; - palette_set_color(STARS_COLOR_BASE+i,r,g,b); + palette_set_color(colors_offset+i,r,g,b); } @@ -1517,7 +1519,7 @@ if (total_stars != STAR_COUNT) { - logerror("total_stars = %d, STAR_COUNT = %d\n",total_stars,STAR_COUNT); + log_cb(RETRO_LOG_DEBUG, LOGPRE "total_stars = %d, STAR_COUNT = %d\n",total_stars,STAR_COUNT); exit(1); } } @@ -1540,14 +1542,14 @@ y = 255 - y; } - plot_pixel(bitmap, x, y, Machine->pens[STARS_COLOR_BASE + color]); + plot_pixel(bitmap, x, y, Machine->pens[stars_colors_start + color]); } static void noop_draw_stars(struct mame_bitmap *bitmap) { } -static void galaxian_draw_stars(struct mame_bitmap *bitmap) +void galaxian_draw_stars(struct mame_bitmap *bitmap) { int offs;
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/lsasquad_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/lsasquad_vidhrdw.c
Changed
@@ -30,8 +30,8 @@ if (flip_screen) sy = 248 - sy; sy &= 0xff; - attr = videoram[base + 2*y + 1]; - code = videoram[base + 2*y] + ((attr & 0x0f) << 8); + attr = videoram[(base + 2*y + 1) & 0x1fff]; + code = videoram[(base + 2*y) & 0x1fff] + ((attr & 0x0f) << 8); color = attr >> 4; drawgfx(bitmap,Machine->gfx[0],
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/midtunit_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/midtunit_vidhrdw.c
Changed
@@ -306,20 +306,8 @@ WRITE16_HANDLER( midtunit_paletteram_w ) { - int newword, r, g, b; - COMBINE_DATA(&paletteram16[offset]); - newword = paletteram16[offset]; - - r = (newword >> 10) & 0x1f; - g = (newword >> 5) & 0x1f; - b = (newword ) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/midvunit_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/midvunit_vidhrdw.c
Changed
@@ -1131,20 +1131,8 @@ WRITE32_HANDLER( midvunit_paletteram_w ) { - int newword, r, g, b; - COMBINE_DATA(&paletteram32[offset]); - newword = paletteram32[offset]; - - r = (newword >> 10) & 0x1f; - g = (newword >> 5) & 0x1f; - b = (newword ) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/midyunit_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/midyunit_vidhrdw.c
Changed
@@ -298,20 +298,8 @@ WRITE16_HANDLER( midyunit_paletteram_w ) { - int newword, r, g, b; - COMBINE_DATA(&paletteram16[offset]); - newword = paletteram16[offset]; - - r = (newword >> 10) & 0x1f; - g = (newword >> 5) & 0x1f; - b = (newword ) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset & palette_mask, r, g, b); + palette_set_color(offset & palette_mask, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/popeye_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/popeye_vidhrdw.c
Changed
@@ -261,7 +261,7 @@ static void get_fg_tile_info(int tile_index) { int code = videoram[tile_index]; - int color = colorram[tile_index]; + int color = colorram[tile_index] & 0x0f; SET_TILE_INFO(0, code, color, 0) } @@ -308,7 +308,7 @@ return 0; } -static void popeye_draw_background(struct mame_bitmap *bitmap) +static void popeye_draw_background(struct mame_bitmap *bitmap, const struct rectangle *cliprect) { int offs; static int lastflip = 0; @@ -325,7 +325,7 @@ if (popeye_background_pos[1] == 0) /* no background */ { - fillbitmap(bitmap,Machine->pens[0],&Machine->visible_area); + fillbitmap(bitmap,Machine->pens[0],cliprect); } else { @@ -343,11 +343,11 @@ scrolly = -scrolly; } - copyscrollbitmap(bitmap,tmpbitmap2,1,&scrollx,1,&scrolly,&Machine->visible_area,TRANSPARENCY_NONE,0); + copyscrollbitmap(bitmap,tmpbitmap2,1,&scrollx,1,&scrolly,cliprect,TRANSPARENCY_NONE,0); } } -static void popeye_draw_sprites(struct mame_bitmap *bitmap) +static void popeye_draw_sprites(struct mame_bitmap *bitmap, const struct rectangle *cliprect) { int offs; @@ -396,13 +396,13 @@ color, flipx,flipy, sx,sy, - &Machine->visible_area,TRANSPARENCY_PEN,0); + cliprect,TRANSPARENCY_PEN,0); } } VIDEO_UPDATE( popeye ) { - popeye_draw_background(bitmap); - popeye_draw_sprites(bitmap); - tilemap_draw(bitmap, &Machine->visible_area, fg_tilemap, 0, 0); + popeye_draw_background(bitmap, cliprect); + popeye_draw_sprites(bitmap, cliprect); + tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/res_net.h -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/res_net.h
Changed
@@ -47,6 +47,8 @@ int count_2, const int * resistances_2, double * weights_2, int pulldown_2, int pullup_2, int count_3, const int * resistances_3, double * weights_3, int pulldown_3, int pullup_3 ); +#define combine_8_weights(tab,w0,w1,w2,w3,w4,w5,w6,w7) ((int)((tab[0]*w0 + tab[1]*w1 + tab[2]*w2 + tab[3]*w3 + tab[4]*w4 + tab[5]*w5 + tab[6]*w6 + tab[7]*w7) + 0.5)) +#define combine_7_weights(tab,w0,w1,w2,w3,w4,w5,w6) ((int)((tab[0]*w0 + tab[1]*w1 + tab[2]*w2 + tab[3]*w3 + tab[4]*w4 + tab[5]*w5 + tab[6]*w6) + 0.5)) #define combine_6_weights(tab,w0,w1,w2,w3,w4,w5) ((int)((tab[0]*w0 + tab[1]*w1 + tab[2]*w2 + tab[3]*w3 + tab[4]*w4 + tab[5]*w5) + 0.5)) #define combine_5_weights(tab,w0,w1,w2,w3,w4) ((int)((tab[0]*w0 + tab[1]*w1 + tab[2]*w2 + tab[3]*w3 + tab[4]*w4) + 0.5)) #define combine_4_weights(tab,w0,w1,w2,w3) ((int)((tab[0]*w0 + tab[1]*w1 + tab[2]*w2 + tab[3]*w3) + 0.5)) @@ -58,6 +60,18 @@ /* this should be moved to one of the core files */ #define MAX_NETS 3 +#define MAX_RES_PER_NET 18 +#define old_MAX_RES_PER_NET 32 + + +/* for the open collector outputs PROMs */ + +static double compute_resistor_net_outputs( + int minval, int maxval, double scaler, + int count_1, const int * resistances_1, double * outputs_1, int pulldown_1, int pullup_1, + int count_2, const int * resistances_2, double * outputs_2, int pulldown_2, int pullup_2, + int count_3, const int * resistances_3, double * outputs_3, int pulldown_3, int pullup_3 ); + static double compute_resistor_weights( int minval, int maxval, double scaler, @@ -68,10 +82,10 @@ int networks_no; - int rescount[MAX_NETS]; - double r[MAX_NETS][32]; /* resistances */ - double w[MAX_NETS][32]; /* calulated weights */ - double ws[MAX_NETS][32]; /* calulated, scaled weights */ + int rescount[MAX_NETS]; /* number of resistors in each of the nets */ + double r[MAX_NETS][old_MAX_RES_PER_NET]; /* resistances */ + double w[MAX_NETS][old_MAX_RES_PER_NET]; /* calulated weights */ + double ws[MAX_NETS][old_MAX_RES_PER_NET]; /* calulated, scaled weights */ int r_pd[MAX_NETS]; /* pulldown resistances */ int r_pu[MAX_NETS]; /* pullup resistances */ @@ -116,6 +130,15 @@ break; } + /* parameters validity check */ + if (count > old_MAX_RES_PER_NET) + { + logerror(" ERROR: res_net.h: compute_resistor_weights(): too many resistors in net #%i. The maximum allowed is %i, the number requested was: %i\n",n, old_MAX_RES_PER_NET, count); + /* quit */ + return (0.0); + } + + if (count > 0) { rescount[networks_no] = count; @@ -129,10 +152,10 @@ networks_no++; } } - if (networks_no<1) + if (networks_no < 1) { /* error - no networks to anaylse */ - logerror("compute_resistor_weights: ERROR - no input data\n"); + logerror(" ERROR: res_net.h: compute_resistor_weights(): no input data\n"); return (0.0); } @@ -142,7 +165,7 @@ double R0, R1, Vout, dst; /* of n resistors */ - for (n=0; n<rescount[i]; n++) + for(n = 0; n < rescount[i]; n++) { R0 = ( r_pd[i] == 0 ) ? 1.0/1e12 : 1.0/r_pd[i]; R1 = ( r_pu[i] == 0 ) ? 1.0/1e12 : 1.0/r_pu[i]; @@ -174,7 +197,7 @@ /* calculate maximum outputs for all given networks */ j = 0; max = 0.0; - for( i = j; i < networks_no; i++ ) + for( i = 0; i < networks_no; i++ ) { double sum = 0.0; @@ -192,13 +215,13 @@ if (scaler < 0.0) /* use autoscale ? */ - /* calculate the output scaler according to the network with greatest output */ + /* calculate the output scaler according to the network with the greatest output */ scale = ((double)maxval) / max_out[j]; else /* use scaler provided on entry */ scale = scaler; /* calculate scaled output and fill the output table(s)*/ - for(i=0; i<networks_no;i++) + for(i = 0; i < networks_no;i++) { for (n = 0; n < rescount[i]; n++) { @@ -209,10 +232,10 @@ /* debug code */ #ifdef MAME_DEBUG - logerror("compute_resistor_networks: scaler = %15.10f\n",scale); + logerror("compute_resistor_weights(): scaler = %15.10f\n",scale); logerror("min val :%i max val:%i Total number of networks :%i\n", minval, maxval, networks_no ); - for(i=0; i<networks_no;i++) + for(i = 0; i < networks_no;i++) { double sum = 0.0; @@ -236,5 +259,212 @@ } -#endif /*_res_net_h_*/ +static double compute_resistor_net_outputs( + int minval, int maxval, double scaler, + int count_1, const int * resistances_1, double * outputs_1, int pulldown_1, int pullup_1, + int count_2, const int * resistances_2, double * outputs_2, int pulldown_2, int pullup_2, + int count_3, const int * resistances_3, double * outputs_3, int pulldown_3, int pullup_3 ) +{ + + int networks_no; + + int rescount[MAX_NETS]; /* number of resistors in each of the nets */ + double r[MAX_NETS][MAX_RES_PER_NET]; /* resistances */ + double *o; /* calulated outputs */ + double *os; /* calulated, scaled outputss */ + int r_pd[MAX_NETS]; /* pulldown resistances */ + int r_pu[MAX_NETS]; /* pullup resistances */ + + double max_out[MAX_NETS]; + double min_out[MAX_NETS]; + double * out[MAX_NETS]; + + int i,j,n; + double scale; + double min; + double max; + + /* parse input parameters */ + + o = (double *) malloc( sizeof(double) * (1<<MAX_RES_PER_NET) * MAX_NETS); + os = (double *) malloc( sizeof(double) * (1<<MAX_RES_PER_NET) * MAX_NETS); + + networks_no = 0; + for (n = 0; n < MAX_NETS; n++) + { + int count, pd, pu; + const int * resistances; + double * weights; + + switch(n){ + case 0: + count = count_1; + resistances = resistances_1; + weights = outputs_1; + pd = pulldown_1; + pu = pullup_1; + break; + case 1: + count = count_2; + resistances = resistances_2; + weights = outputs_2; + pd = pulldown_2; + pu = pullup_2; + break; + case 2: + default: + count = count_3; + resistances = resistances_3; + weights = outputs_3; + pd = pulldown_3; + pu = pullup_3; + break; + } + + /* parameters validity check */ + if (count > MAX_RES_PER_NET) + { + logerror(" ERROR: res_net.h: compute_resistor_net_outputs(): too many resistors in net #%i. The maximum allowed is %i, the number requested was: %i\n",n, MAX_RES_PER_NET, count); + /* quit */ + free(o); + free(os); + return (0.0); + } + + if (count > 0) + { + rescount[networks_no] = count; + for (i=0; i < count; i++) + { + r[networks_no][i] = 1.0 * resistances[i]; + } + out[networks_no] = weights; + r_pd[networks_no] = pd; + r_pu[networks_no] = pu; + networks_no++; + } + } + + if (networks_no<1) + { + /* error - no networks to anaylse */ + logerror(" ERROR: res_net.h: compute_resistor_net_outputs(): no input data\n"); + free(o); + free(os); + return (0.0); + } + + /* calculate outputs for all given networks */ + for( i = 0; i < networks_no; i++ ) + { + double R0, R1, Vout, dst; + + /* of n resistors, generating 1<<n possible outputs */ + for(n = 0; n < (1<<rescount[i]); n++) + { + R0 = ( r_pd[i] == 0 ) ? 1.0/1e12 : 1.0/r_pd[i]; + R1 = ( r_pu[i] == 0 ) ? 1.0/1e12 : 1.0/r_pu[i]; + + for( j = 0; j < rescount[i]; j++ ) + { + if( (n & (1<<j)) == 0 )/* only when this resistance in the network connected to GND */ + if (r[i][j] != 0.0) + R0 += 1.0/r[i][j]; + } + + /* now determine the voltage */ + R0 = 1.0/R0; + R1 = 1.0/R1; + Vout = (maxval - minval) * R0 / (R1 + R0) + minval; + + /* and convert it to a destination value */ + dst = (Vout < minval) ? minval : (Vout > maxval) ? maxval : Vout; + + o[i*(1<<MAX_RES_PER_NET)+n] = dst; + } + } + + /* calculate minimum outputs for all given networks */ + j = 0; + min = maxval; + max = minval; + for( i = 0; i < networks_no; i++ ) + { + double val = 0.0; + double max_tmp = minval; + double min_tmp = maxval; + + for (n = 0; n < (1<<rescount[i]); n++) + { + if (min_tmp > o[i*(1<<MAX_RES_PER_NET)+n]) + min_tmp = o[i*(1<<MAX_RES_PER_NET)+n]; + if (max_tmp < o[i*(1<<MAX_RES_PER_NET)+n]) + max_tmp = o[i*(1<<MAX_RES_PER_NET)+n]; + } + + max_out[i] = max_tmp; /* maximum output */ + min_out[i] = min_tmp; /* minimum output */ + + val = min_out[i]; /* minimum output of this network */ + if (min > val) + { + min = val; + } + val = max_out[i]; /* maximum output of this network */ + if (max < val) + { + max = val; + } + } + + + if (scaler < 0.0) /* use autoscale ? */ + /* calculate the output scaler according to the network with the smallest output */ + scale = ((double)maxval) / (max-min); + else /* use scaler provided on entry */ + scale = scaler; + + /* calculate scaled output and fill the output table(s) */ + for(i = 0; i < networks_no; i++) + { + for (n = 0; n < (1<<rescount[i]); n++) + { + os[i*(1<<MAX_RES_PER_NET)+n] = (o[i*(1<<MAX_RES_PER_NET)+n] - min) * scale; /* scale the result */ + (out[i])[n] = os[i*(1<<MAX_RES_PER_NET)+n]; /* fill the output table */ + } + } + +/* debug code */ +#ifdef MAME_DEBUG + logerror("compute_resistor_net_outputs(): scaler = %15.10f\n",scale); + logerror("min val :%i max val:%i Total number of networks :%i\n", minval, maxval, networks_no ); + + for(i = 0; i < networks_no;i++) + { + logerror(" Network no.%i=> resistances: %i", i, rescount[i] ); + if (r_pu[i] != 0) + logerror(", pullup resistor: %i Ohms",r_pu[i]); + if (r_pd[i] != 0) + logerror(", pulldown resistor: %i Ohms",r_pd[i]); + logerror("\n maximum output of this network:%10.5f", max_out[i] ); + logerror("\n minimum output of this network:%10.5f\n", min_out[i] ); + for (n = 0; n < rescount[i]; n++) + { + logerror(" res %2i:%9.1f Ohms\n", n, r[i][n]); + } + for (n = 0; n < (1<<rescount[i]); n++) + { + logerror(" combination %2i out=%10.5f (scaled = %15.10f)\n", n, o[i*(1<<MAX_RES_PER_NET)+n], os[i*(1<<MAX_RES_PER_NET)+n] ); + } + } +#endif +/* debug end */ + + free(o); + free(os); + return (scale); + +} + +#endif /*_res_net_h_*/
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/rohga_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/rohga_vidhrdw.c
Changed
@@ -412,7 +412,7 @@ colour, fx,fy, sx + x_mult * (w-x),sy + y_mult * (h-y), - &Machine->visible_area,trans,0,tilemap_pri,sprite_pri); + &Machine->visible_area,trans,0,tilemap_pri,sprite_pri,0); } }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/speedspn_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/speedspn_vidhrdw.c
Changed
@@ -47,14 +47,14 @@ WRITE_HANDLER(speedspn_banked_vidram_change) { -// logerror("VidRam Bank: %04x\n", data); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "VidRam Bank: %04x\n", data);*/ speedspn_bank_vidram = data & 1; speedspn_bank_vidram *= 0x1000; } WRITE_HANDLER(speedspn_global_display_w) { -// logerror("Global display: %u\n", data); +/* log_cb(RETRO_LOG_DEBUG, LOGPRE "Global display: %u\n", data);*/ speedspn_display_disable = data & 1; } @@ -73,6 +73,8 @@ int ypos = source[3]; int color; + if (!attr && xpos) break; /* end of sprite list marker? */ + if (attr&0x10) xpos +=0x100; xpos = 0x1f8-xpos; @@ -107,7 +109,7 @@ fclose(f); } #endif - tilemap_set_scrollx(speedspn_tilemap,0, 0x100); // verify + tilemap_set_scrollx(speedspn_tilemap,0, 0x100); /* verify*/ tilemap_draw(bitmap,cliprect,speedspn_tilemap,0,0); speedspn_drawsprites(bitmap,cliprect); }
View file
libretro-mame2003-0~git20200805.tar.xz/src/vidhrdw/system16_vidhrdw.c -> libretro-mame2003-0~git20210529.tar.xz/src/vidhrdw/system16_vidhrdw.c
Changed
@@ -10,7 +10,6 @@ - many registers are suspiciously plucked from working RAM - several games have nvram according to the self test, but we aren't yet saving it - many games suffer from sys16_refreshenable register not being mapped -- hangon road isn't displayed(!) emulation bug? - road-rendering routines need to be cleaned up or at least better described - logical sprite height computation isn't quite right - garbage pixels are drawn - screen orientation support for sprite drawing @@ -847,6 +846,9 @@ 40,28 ); num_sprites = 128*2; /* only 128 for most games; aburner uses 256 */ + + if(!strcmp(Machine->gamedrv->name, "hangon")) + num_sprites = 128; if( background && foreground && text_layer ){ /* initialize all entries to black - needed for Golden Axe*/
View file
libretro-mame2003-0~git20200805.tar.xz/tools/bin2c/bin2c.c -> libretro-mame2003-0~git20210529.tar.xz/tools/bin2c/bin2c.c
Changed
@@ -3,15 +3,6 @@ * defines a string with the file name of the source of data, and an * unsigned character array containing the binary data. * - * For example, if the source file is dl.lua, the generated file - * contains: - * - * static const char dl_lua_source[] = "dl.lua"; - * - * static const unsigned char dl_lua_bytes[] = { - * ... - * }; - * * A useful GNUMakefile rule follows. * * %.h: %.lua @@ -19,28 +10,9 @@ * bin2c -o $@ -n $*.lua $*.luo * rm $*.luo * - * John D. Ramsdell - * Copyright (C) 2006 The MITRE Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * This version was modified from the original for use in mame2003-plus then ported to mame2003. * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * Original version credited by John D. Ramsdell - Copyright (C) 2006 The MITRE Corporation. */ #include <stddef.h> @@ -97,7 +69,7 @@ putchar('_'); for (;;) { ch = *++name; - if (!ch) + if (!ch || ch == 0x2e) /* return if no value or reached file extension */ return; if (isalnum(ch)) /* Print underscore when */ putchar(ch); /* part of identifier is */ @@ -112,19 +84,16 @@ int file_length = 0; int col = COLUMNS; - /*printf("const char "); - emit_name(name); - printf("_source[] = \"%s\";\n\n", name);*/ - printf("const unsigned char "); + printf("const struct bin2cFILE "); emit_name(name); - printf("_bytes[] = {"); + printf("_bootstrap = {"); + printf("\n ?,\n {"); for (;;) { int ch = getchar(); if (ch == EOF) { - printf("\n};\n\n"); - printf("const unsigned int "); + printf("\n }\n};"); emit_name(name); - printf("_length = %i;", file_length); + printf("_length = %i", file_length); return 0; } if (col >= COLUMNS) { @@ -188,4 +157,4 @@ } return emit(name ? name : input); -} \ No newline at end of file +}
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.